From e7ee2e594a48fc67e93d3f10e2af10f2c074e89c Mon Sep 17 00:00:00 2001 From: Joeri Verdeyen Date: Thu, 2 Nov 2017 16:02:38 +0100 Subject: [PATCH 0001/1142] Add Command processor and Command creator --- .../Symfony/Creator/JobCommandCreator.php | 66 +++++++++++++++++++ .../Symfony/Processor/RunCommandProcessor.php | 44 +++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 pkg/enqueue/Symfony/Creator/JobCommandCreator.php create mode 100644 pkg/enqueue/Symfony/Processor/RunCommandProcessor.php diff --git a/pkg/enqueue/Symfony/Creator/JobCommandCreator.php b/pkg/enqueue/Symfony/Creator/JobCommandCreator.php new file mode 100644 index 000000000..2003795c9 --- /dev/null +++ b/pkg/enqueue/Symfony/Creator/JobCommandCreator.php @@ -0,0 +1,66 @@ +producer = $producer; + $this->env = $env; + } + + /** + * @param $command + * @param mixed $args + * + * @return \Enqueue\Rpc\Promise|null + */ + public function scheduleCommand($command, $args = []) + { + $argumentString = $this->createArgumentString($args); + + return $this->producer->sendCommand('run_command', sprintf('%s %s', $command, $argumentString)); + } + + /** + * @param array $arguments + * + * @return string + */ + public function createArgumentString(array $arguments) + { + $optionList = []; + + foreach ($arguments as $key => $value) { + if (!is_int($key)) { + $optionList[] = sprintf('--%s=%s', $key, $value); + continue; + } + + $optionList[] = sprintf('%s', $value); + } + + $optionList[] = sprintf('--env=%s', $this->env); + + return implode(' ', $optionList); + } +} diff --git a/pkg/enqueue/Symfony/Processor/RunCommandProcessor.php b/pkg/enqueue/Symfony/Processor/RunCommandProcessor.php new file mode 100644 index 000000000..0fb70a5f6 --- /dev/null +++ b/pkg/enqueue/Symfony/Processor/RunCommandProcessor.php @@ -0,0 +1,44 @@ +projectDir = $projectDir; + } + + public function process(PsrMessage $message, PsrContext $context) + { + $commandline = $message->getBody(); + + $process = new Process('./bin/console '.$commandline, $this->projectDir); + + try { + $process->mustRun(); + + return Result::ACK; + } catch (ProcessFailedException $e) { + return Result::reject(sprintf('The process failed with exception: "%s" in %s at %s', $e->getMessage(), $e->getFile(), $e->getLine())); + } + } + + public static function getSubscribedCommand() + { + return 'run_command'; + } +} From 1d9323d8ad7e851f1a7c042ee13eebc46f373cca Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 30 Nov 2017 18:08:52 +0200 Subject: [PATCH 0002/1142] [dbal] Store UUIDs as binary data. Improves performance --- pkg/dbal/DbalContext.php | 9 ++++++--- pkg/dbal/DbalProducer.php | 11 ++++------- pkg/dbal/composer.json | 3 ++- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 0570a4463..d472e2ff1 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -170,12 +170,15 @@ public function createDataBaseTable() return; } + $table = new Table($this->getTableName()); + if ($this->getDbalConnection()->getDatabasePlatform()->hasNativeGuidType()) { - throw new \LogicException('The platform does not support UUIDs natively'); + $table->addColumn('id', 'guid'); + } else { + $table->addColumn('id', 'binary', ['length' => 16]); } - $table = new Table($this->getTableName()); - $table->addColumn('id', 'guid'); + $table->addColumn('human_id', 'string', ['length' => 36]); $table->addColumn('published_at', 'bigint'); $table->addColumn('body', 'text', ['notnull' => false]); $table->addColumn('headers', 'text', ['notnull' => false]); diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index c8f58bc20..6da886d13 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -10,6 +10,7 @@ use Interop\Queue\PsrDestination; use Interop\Queue\PsrMessage; use Interop\Queue\PsrProducer; +use Ramsey\Uuid\Uuid; class DbalProducer implements PsrProducer { @@ -74,15 +75,11 @@ public function send(PsrDestination $destination, PsrMessage $message) )); } - $sql = 'SELECT '.$this->context->getDbalConnection()->getDatabasePlatform()->getGuidExpression(); - $uuid = $this->context->getDbalConnection()->query($sql)->fetchColumn(0); - - if (empty($uuid)) { - throw new \LogicException('The generated uuid is empty'); - } + $uuid = Uuid::uuid4(); $dbalMessage = [ - 'id' => $uuid, + 'id' => $uuid->getBytes(), + 'human_id' => $uuid->toString(), 'published_at' => (int) microtime(true) * 10000, 'body' => $body, 'headers' => JSON::encode($message->getHeaders()), diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 15197f7f4..a37e646a2 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -8,7 +8,8 @@ "require": { "php": ">=5.6", "queue-interop/queue-interop": "^0.6@dev", - "doctrine/dbal": "~2.5" + "doctrine/dbal": "~2.5", + "ramsey/uuid": "^3" }, "require-dev": { "phpunit/phpunit": "~5.4.0", From 3a80860dd54c9e69e0aa84c2457955dff2c189a1 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 30 Nov 2017 18:14:14 +0200 Subject: [PATCH 0003/1142] [dbal] use Type::XXX consts. --- pkg/dbal/DbalConsumer.php | 2 +- pkg/dbal/DbalContext.php | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/pkg/dbal/DbalConsumer.php b/pkg/dbal/DbalConsumer.php index f898e567f..6721b53b3 100644 --- a/pkg/dbal/DbalConsumer.php +++ b/pkg/dbal/DbalConsumer.php @@ -178,7 +178,7 @@ protected function receiveMessage() // remove message $affectedRows = $this->dbal->delete($this->context->getTableName(), ['id' => $dbalMessage['id']], [ - 'id' => Type::INTEGER, + 'id' => Type::BINARY, ]); if (1 !== $affectedRows) { diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index d472e2ff1..41e35f86f 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -4,6 +4,7 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Schema\Table; +use Doctrine\DBAL\Types\Type; use Interop\Queue\InvalidDestinationException; use Interop\Queue\PsrContext; use Interop\Queue\PsrDestination; @@ -175,19 +176,19 @@ public function createDataBaseTable() if ($this->getDbalConnection()->getDatabasePlatform()->hasNativeGuidType()) { $table->addColumn('id', 'guid'); } else { - $table->addColumn('id', 'binary', ['length' => 16]); + $table->addColumn('id', Type::BINARY, ['length' => 16]); } - $table->addColumn('human_id', 'string', ['length' => 36]); - $table->addColumn('published_at', 'bigint'); - $table->addColumn('body', 'text', ['notnull' => false]); - $table->addColumn('headers', 'text', ['notnull' => false]); - $table->addColumn('properties', 'text', ['notnull' => false]); - $table->addColumn('redelivered', 'boolean', ['notnull' => false]); - $table->addColumn('queue', 'string'); - $table->addColumn('priority', 'smallint'); - $table->addColumn('delayed_until', 'integer', ['notnull' => false]); - $table->addColumn('time_to_live', 'integer', ['notnull' => false]); + $table->addColumn('human_id', Type::STRING, ['length' => 36]); + $table->addColumn('published_at', Type::BIGINT); + $table->addColumn('body', Type::TEXT, ['notnull' => false]); + $table->addColumn('headers', Type::TEXT, ['notnull' => false]); + $table->addColumn('properties', Type::TEXT, ['notnull' => false]); + $table->addColumn('redelivered', Type::BOOLEAN, ['notnull' => false]); + $table->addColumn('queue', Type::STRING); + $table->addColumn('priority', Type::SMALLINT); + $table->addColumn('delayed_until', Type::INTEGER, ['notnull' => false]); + $table->addColumn('time_to_live', Type::INTEGER, ['notnull' => false]); $table->setPrimaryKey(['id']); $table->addIndex(['published_at']); From 7802b20151683d9c29c49dca79e1f4912d64081d Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 1 Dec 2017 09:50:33 +0200 Subject: [PATCH 0004/1142] [dbal] store string if dbal supports guid natively. --- pkg/dbal/DbalProducer.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index 6da886d13..e9929a722 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -75,10 +75,11 @@ public function send(PsrDestination $destination, PsrMessage $message) )); } + $hasNativeGuid = $this->context->getDbalConnection()->getDatabasePlatform()->hasNativeGuidType(); $uuid = Uuid::uuid4(); $dbalMessage = [ - 'id' => $uuid->getBytes(), + 'id' => $hasNativeGuid ? $uuid->toString() : $uuid->getBytes(), 'human_id' => $uuid->toString(), 'published_at' => (int) microtime(true) * 10000, 'body' => $body, From c01955c010d2101c6337b1b2bdb8b3d40064a12f Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 4 Dec 2017 11:38:22 +0200 Subject: [PATCH 0005/1142] use uuid1 plus time ordered codec. --- pkg/dbal/DbalContext.php | 7 +------ pkg/dbal/DbalProducer.php | 13 ++++++++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 41e35f86f..a81ef2272 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -173,12 +173,7 @@ public function createDataBaseTable() $table = new Table($this->getTableName()); - if ($this->getDbalConnection()->getDatabasePlatform()->hasNativeGuidType()) { - $table->addColumn('id', 'guid'); - } else { - $table->addColumn('id', Type::BINARY, ['length' => 16]); - } - + $table->addColumn('id', Type::BINARY, ['length' => 16, 'fixed' => true]); $table->addColumn('human_id', Type::STRING, ['length' => 36]); $table->addColumn('published_at', Type::BIGINT); $table->addColumn('body', Type::TEXT, ['notnull' => false]); diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index e9929a722..89612775b 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -10,7 +10,9 @@ use Interop\Queue\PsrDestination; use Interop\Queue\PsrMessage; use Interop\Queue\PsrProducer; +use Ramsey\Uuid\Codec\OrderedTimeCodec; use Ramsey\Uuid\Uuid; +use Ramsey\Uuid\UuidFactory; class DbalProducer implements PsrProducer { @@ -34,12 +36,18 @@ class DbalProducer implements PsrProducer */ private $context; + /** + * @var OrderedTimeCodec + */ + private $uuidCodec; + /** * @param DbalContext $context */ public function __construct(DbalContext $context) { $this->context = $context; + $this->uuidCodec = new OrderedTimeCodec((new UuidFactory())->getUuidBuilder()); } /** @@ -75,11 +83,10 @@ public function send(PsrDestination $destination, PsrMessage $message) )); } - $hasNativeGuid = $this->context->getDbalConnection()->getDatabasePlatform()->hasNativeGuidType(); - $uuid = Uuid::uuid4(); + $uuid = Uuid::uuid1(); $dbalMessage = [ - 'id' => $hasNativeGuid ? $uuid->toString() : $uuid->getBytes(), + 'id' => $this->uuidCodec->encodeBinary($uuid), 'human_id' => $uuid->toString(), 'published_at' => (int) microtime(true) * 10000, 'body' => $body, From bf6095dd3d917fe494bfd29c18f266d91612e9bf Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 4 Dec 2017 15:02:38 +0200 Subject: [PATCH 0006/1142] fix --- pkg/dbal/DbalConnectionFactory.php | 7 ++++++- pkg/dbal/DbalContext.php | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/dbal/DbalConnectionFactory.php b/pkg/dbal/DbalConnectionFactory.php index 55164213c..75b86929e 100644 --- a/pkg/dbal/DbalConnectionFactory.php +++ b/pkg/dbal/DbalConnectionFactory.php @@ -45,7 +45,12 @@ public function __construct($config = 'mysql:') throw new \LogicException('The config must be either an array of options, a DSN string or null'); } - $this->config = $config; + $this->config = array_replace_recursive([ + 'connection' => [], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, + ], $config); } /** diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index a81ef2272..682d11c26 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -193,4 +193,16 @@ public function createDataBaseTable() $sm->createTable($table); } + + /** + * @param DbalDestination $queue + */ + public function purgeQueue(DbalDestination $queue) + { + $this->getDbalConnection()->delete( + $this->getTableName(), + ['queue' => $queue->getQueueName()], + ['queue' => Type::STRING] + ); + } } From aedee501b89dc158f547f2fea47c97fa11921522 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 17 Jan 2018 09:57:24 +0200 Subject: [PATCH 0007/1142] 0.9 --- pkg/amqp-bunny/composer.json | 10 ++++---- pkg/amqp-ext/composer.json | 11 ++++---- pkg/amqp-lib/composer.json | 10 ++++---- pkg/amqp-tools/composer.json | 6 ++--- pkg/async-event-dispatcher/composer.json | 10 ++++---- pkg/dbal/composer.json | 8 +++--- pkg/enqueue-bundle/composer.json | 30 +++++++++++----------- pkg/enqueue/composer.json | 32 ++++++++++++------------ pkg/fs/composer.json | 8 +++--- pkg/gearman/composer.json | 8 +++--- pkg/gps/composer.json | 6 ++--- pkg/job-queue/composer.json | 8 +++--- pkg/null/composer.json | 6 ++--- pkg/pheanstalk/composer.json | 8 +++--- pkg/rdkafka/composer.json | 8 +++--- pkg/redis/composer.json | 8 +++--- pkg/simple-client/composer.json | 12 ++++----- pkg/sqs/composer.json | 6 ++--- pkg/stomp/composer.json | 8 +++--- pkg/test/composer.json | 2 +- 20 files changed, 102 insertions(+), 103 deletions(-) diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index a7f5086dd..af91fd036 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -10,13 +10,13 @@ "queue-interop/amqp-interop": "^0.7@dev", "bunny/bunny": "^0.2.4", - "enqueue/amqp-tools": "^0.8.4@dev" + "enqueue/amqp-tools": "^0.9@dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -40,7 +40,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 1b80a9cec..455229ef2 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -8,15 +8,14 @@ "require": { "php": ">=5.6", "ext-amqp": "^1.9.3", - "queue-interop/amqp-interop": "^0.7@dev", - "enqueue/amqp-tools": "^0.8.4@dev" + "enqueue/amqp-tools": "^0.9@dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "empi89/php-amqp-stubs": "*@dev", "symfony/dependency-injection": "^2.8|^3|^4", @@ -41,7 +40,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 99b10d2e2..700422eb2 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -10,13 +10,13 @@ "php-amqplib/php-amqplib": "^2.7@dev", "queue-interop/queue-interop": "^0.6@dev", "queue-interop/amqp-interop": "^0.7@dev", - "enqueue/amqp-tools": "^0.8.5@dev" + "enqueue/amqp-tools": "^0.9@dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -40,7 +40,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index be14fcac6..019c93e22 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -12,8 +12,8 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/null": "^0.8@dev" + "enqueue/test": "^0.9@dev", + "enqueue/null": "^0.9@dev" }, "support": { "email": "opensource@forma-pro.com", @@ -31,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index 007e8698d..2d1294f63 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": ">=5.6", - "enqueue/enqueue": "^0.8@dev", + "enqueue/enqueue": "^0.9@dev", "symfony/event-dispatcher": "^2.8|^3|^4" }, "require-dev": { @@ -16,9 +16,9 @@ "symfony/config": "^2.8|^3|^4", "symfony/http-kernel": "^2.8|^3|^4", "symfony/filesystem": "^2.8|^3|^4", - "enqueue/null": "^0.8@dev", - "enqueue/fs": "^0.8@dev", - "enqueue/test": "^0.8@dev" + "enqueue/null": "^0.9@dev", + "enqueue/fs": "^0.9@dev", + "enqueue/test": "^0.9@dev" }, "support": { "email": "opensource@forma-pro.com", @@ -38,7 +38,7 @@ }, "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index acffe3e1b..518c3a1e5 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -12,9 +12,9 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.4@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -38,7 +38,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 11d7d220d..b83a0b571 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -8,9 +8,9 @@ "require": { "php": ">=5.6", "symfony/framework-bundle": "^2.8|^3|^4", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", - "enqueue/async-event-dispatcher": "^0.8@dev" + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", + "enqueue/async-event-dispatcher": "^0.9@dev" }, "support": { "email": "opensource@forma-pro.com", @@ -21,18 +21,18 @@ }, "require-dev": { "phpunit/phpunit": "~5.5", - "enqueue/stomp": "^0.8@dev", - "enqueue/amqp-ext": "^0.8@dev", + "enqueue/stomp": "^0.9@dev", + "enqueue/amqp-ext": "^0.9@dev", + "enqueue/amqp-lib": "^0.9@dev", + "enqueue/amqp-bunny": "^0.9@dev", + "enqueue/job-queue": "^0.9@dev", + "enqueue/fs": "^0.9@dev", + "enqueue/redis": "^0.9@dev", + "enqueue/dbal": "^0.9@dev", + "enqueue/sqs": "^0.9@dev", + "enqueue/gps": "^0.9@dev", + "enqueue/test": "^0.9@dev", "php-amqplib/php-amqplib": "^2.7@dev", - "enqueue/amqp-lib": "^0.8@dev", - "enqueue/amqp-bunny": "^0.8@dev", - "enqueue/job-queue": "^0.8@dev", - "enqueue/fs": "^0.8@dev", - "enqueue/redis": "^0.8@dev", - "enqueue/dbal": "^0.8@dev", - "enqueue/sqs": "^0.8@dev", - "enqueue/gps": "^0.8@dev", - "enqueue/test": "^0.8@dev", "doctrine/doctrine-bundle": "~1.2", "symfony/monolog-bundle": "^2.8|^3|^4", "symfony/browser-kit": "^2.8|^3|^4", @@ -46,7 +46,7 @@ }, "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 180d59480..09346d597 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -8,7 +8,7 @@ "require": { "php": ">=5.6", "queue-interop/queue-interop": "^0.6@dev", - "enqueue/null": "^0.8@dev", + "enqueue/null": "^0.9@dev", "ramsey/uuid": "^2|^3.5", "psr/log": "^1" }, @@ -19,20 +19,20 @@ "symfony/config": "^2.8|^3|^4", "symfony/event-dispatcher": "^2.8|^3|^4", "symfony/http-kernel": "^2.8|^3|^4", - "enqueue/amqp-ext": "^0.8@dev", - "enqueue/amqp-lib": "^0.8@dev", - "enqueue/amqp-bunny": "^0.8@dev", - "enqueue/pheanstalk": "^0.8@dev", - "enqueue/gearman": "^0.8@dev", - "enqueue/rdkafka": "^0.8@dev", - "enqueue/dbal": "^0.8@dev", - "enqueue/fs": "^0.8@dev", - "enqueue/gps": "^0.8@dev", - "enqueue/redis": "^0.8@dev", - "enqueue/sqs": "^0.8@dev", - "enqueue/stomp": "^0.8@dev", - "enqueue/test": "^0.8@dev", - "enqueue/simple-client": "^0.8@dev", + "enqueue/amqp-ext": "^0.9@dev", + "enqueue/amqp-lib": "^0.9@dev", + "enqueue/amqp-bunny": "^0.9@dev", + "enqueue/pheanstalk": "^0.9@dev", + "enqueue/gearman": "^0.9@dev", + "enqueue/rdkafka": "^0.9@dev", + "enqueue/dbal": "^0.9@dev", + "enqueue/fs": "^0.9@dev", + "enqueue/gps": "^0.9@dev", + "enqueue/redis": "^0.9@dev", + "enqueue/sqs": "^0.9@dev", + "enqueue/stomp": "^0.9@dev", + "enqueue/test": "^0.9@dev", + "enqueue/simple-client": "^0.9@dev", "empi89/php-amqp-stubs": "*@dev" }, "suggest": { @@ -63,7 +63,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 962bc057e..78b731a81 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -13,9 +13,9 @@ }, "require-dev": { "phpunit/phpunit": "~5.5", - "enqueue/enqueue": "^0.7", - "enqueue/null": "^0.7", - "enqueue/test": "^0.7", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", + "enqueue/test": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4", @@ -37,7 +37,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index c4a72a279..8870d575f 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -12,9 +12,9 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -38,7 +38,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 74a0a2554..4667ad142 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -12,8 +12,8 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -37,7 +37,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 8b60053a4..7b62c67d1 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -8,13 +8,13 @@ "require": { "php": ">=5.6", "symfony/framework-bundle": "^2.8|^3|^4", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "doctrine/orm": "~2.4" }, "require-dev": { "phpunit/phpunit": "~5.5", - "enqueue/test": "^0.8@dev", + "enqueue/test": "^0.9@dev", "doctrine/doctrine-bundle": "~1.2", "symfony/browser-kit": "^2.8|^3|^4", "symfony/expression-language": "^2.8|^3|^4" @@ -35,7 +35,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/null/composer.json b/pkg/null/composer.json index 94c956abe..228bd8f03 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -11,8 +11,8 @@ }, "require-dev": { "phpunit/phpunit": "~5.5", - "enqueue/enqueue": "^0.8@dev", - "enqueue/test": "^0.8@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/test": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -33,7 +33,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index c772985fe..9cd66ee8b 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -12,9 +12,9 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -38,7 +38,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 026c3d67e..54df114ca 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -12,9 +12,9 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "kwn/php-rdkafka-stubs": "^1.0.2" }, @@ -48,7 +48,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 061b917b1..ecb22cb81 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -12,9 +12,9 @@ "require-dev": { "phpunit/phpunit": "~5.4.0", "predis/predis": "^1.1", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -40,7 +40,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index a25a00a59..5623c2b12 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -7,17 +7,17 @@ "license": "MIT", "require": { "php": ">=5.6", - "enqueue/enqueue": "^0.8@dev", + "enqueue/enqueue": "^0.9@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4", "symfony/console": "^2.8|^3|^4" }, "require-dev": { "phpunit/phpunit": "~5.5", - "enqueue/test": "^0.8@dev", - "enqueue/amqp-ext": "^0.8@dev", - "enqueue/fs": "^0.8@dev", - "enqueue/null": "^0.8@dev" + "enqueue/test": "^0.9@dev", + "enqueue/amqp-ext": "^0.9@dev", + "enqueue/fs": "^0.9@dev", + "enqueue/null": "^0.9@dev" }, "support": { "email": "opensource@forma-pro.com", @@ -35,7 +35,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index b205aaed0..4c39da0f3 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -12,8 +12,8 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -37,7 +37,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 9aba059fc..c6bc7e04e 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -15,9 +15,9 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "^0.8@dev", - "enqueue/enqueue": "^0.8@dev", - "enqueue/null": "^0.8@dev", + "enqueue/test": "^0.9@dev", + "enqueue/enqueue": "^0.9@dev", + "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4" @@ -41,7 +41,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } diff --git a/pkg/test/composer.json b/pkg/test/composer.json index 3ce4390db..de315b3fc 100644 --- a/pkg/test/composer.json +++ b/pkg/test/composer.json @@ -15,7 +15,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } } } From 95973d3f36e77d8303054cc68ebc6974fbf2bdb2 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 17 Jan 2018 17:04:41 +0200 Subject: [PATCH 0008/1142] fix tests. --- .../Tests/DbalConnectionFactoryConfigTest.php | 35 ++++++++++++++----- pkg/dbal/Tests/DbalConnectionFactoryTest.php | 28 --------------- 2 files changed, 27 insertions(+), 36 deletions(-) diff --git a/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php b/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php index eeaf31c34..ac86685ce 100644 --- a/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php +++ b/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php @@ -47,7 +47,8 @@ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { $factory = new DbalConnectionFactory($config); - $this->assertAttributeEquals($expectedConfig, 'config', $factory); + $actualConfig = $this->readAttribute($factory, 'config'); + $this->assertSame($expectedConfig, $actualConfig); } public static function provideConfigs() @@ -55,56 +56,74 @@ public static function provideConfigs() yield [ null, [ - 'lazy' => true, 'connection' => [ 'url' => 'mysql://root@localhost', ], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, ], ]; yield [ 'mysql:', [ - 'lazy' => true, 'connection' => [ 'url' => 'mysql://root@localhost', ], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, ], ]; yield [ 'pgsql:', [ - 'lazy' => true, 'connection' => [ 'url' => 'pgsql://root@localhost', ], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, ], ]; yield [ 'mysql://user:pass@host:10000/db', [ - 'lazy' => true, 'connection' => [ 'url' => 'mysql://user:pass@host:10000/db', ], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, ], ]; yield [ [], [ - 'lazy' => true, 'connection' => [ 'url' => 'mysql://root@localhost', ], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, ], ]; yield [ - ['table_name' => 'a_queue_table', 'connection' => ['foo' => 'fooVal', 'bar' => 'barVal']], - ['table_name' => 'a_queue_table', 'connection' => ['foo' => 'fooVal', 'bar' => 'barVal']], + [ + 'connection' => ['foo' => 'fooVal', 'bar' => 'barVal'], + 'table_name' => 'a_queue_table', + ], + [ + 'connection' => ['foo' => 'fooVal', 'bar' => 'barVal'], + 'table_name' => 'a_queue_table', + 'polling_interval' => 1000, + 'lazy' => true, + ], ]; } } diff --git a/pkg/dbal/Tests/DbalConnectionFactoryTest.php b/pkg/dbal/Tests/DbalConnectionFactoryTest.php index 987401287..3391e14c9 100644 --- a/pkg/dbal/Tests/DbalConnectionFactoryTest.php +++ b/pkg/dbal/Tests/DbalConnectionFactoryTest.php @@ -2,7 +2,6 @@ namespace Enqueue\Dbal\Tests; -use Doctrine\DBAL\Connection; use Enqueue\Dbal\DbalConnectionFactory; use Enqueue\Dbal\DbalContext; use Enqueue\Test\ClassExtensionTrait; @@ -17,33 +16,6 @@ public function testShouldImplementConnectionFactoryInterface() $this->assertClassImplements(PsrConnectionFactory::class, DbalConnectionFactory::class); } - public function testCouldBeConstructedWithEmptyConfiguration() - { - $factory = new DbalConnectionFactory(); - - $this->assertAttributeEquals([ - 'lazy' => true, - 'connection' => ['url' => 'mysql://root@localhost'], - ], 'config', $factory); - } - - public function testCouldBeConstructedWithCustomConfiguration() - { - $factory = new DbalConnectionFactory([ - 'connection' => [ - 'dbname' => 'theDbName', - ], - 'lazy' => false, - ]); - - $this->assertAttributeEquals([ - 'lazy' => false, - 'connection' => [ - 'dbname' => 'theDbName', - ], - ], 'config', $factory); - } - public function testShouldCreateLazyContext() { $factory = new DbalConnectionFactory(['lazy' => true]); From d8e4dacb1392685e3228f98633260e6364853e85 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 18 Jan 2018 13:49:16 +0200 Subject: [PATCH 0009/1142] [consumption] Make QueueConsumer final --- pkg/enqueue/Consumption/QueueConsumer.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 49d0d0660..6f39c0159 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -15,7 +15,7 @@ use Interop\Queue\PsrQueue; use Psr\Log\NullLogger; -class QueueConsumer +final class QueueConsumer { /** * @var PsrContext @@ -268,7 +268,7 @@ public function consume(ExtensionInterface $runtimeExtension = null) * * @return bool */ - protected function doConsume(ExtensionInterface $extension, Context $context) + private function doConsume(ExtensionInterface $extension, Context $context) { $processor = $context->getPsrProcessor(); $consumer = $context->getPsrConsumer(); @@ -334,7 +334,7 @@ protected function doConsume(ExtensionInterface $extension, Context $context) * * @throws \Exception */ - protected function onInterruptionByException(ExtensionInterface $extension, Context $context) + private function onInterruptionByException(ExtensionInterface $extension, Context $context) { $logger = $context->getLogger(); $logger->error(sprintf('Consuming interrupted by exception')); From 91ae4cc1d0a16ac5856d5687e12e649ecf43be42 Mon Sep 17 00:00:00 2001 From: f7h Date: Mon, 22 Jan 2018 20:00:32 +0100 Subject: [PATCH 0010/1142] [dbal] Consumer never fetches messages ordered by published time --- pkg/dbal/DbalContext.php | 2 +- pkg/dbal/DbalMessage.php | 2 +- pkg/dbal/Tests/DbalContextTest.php | 2 +- pkg/dbal/Tests/DbalMessageTest.php | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index d7d462aa1..b531bb4b5 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -178,7 +178,7 @@ public function createDataBaseTable() $table->addColumn('properties', 'text', ['notnull' => false]); $table->addColumn('redelivered', 'boolean', ['notnull' => false]); $table->addColumn('queue', 'string'); - $table->addColumn('priority', 'smallint'); + $table->addColumn('priority', 'smallint', ['notnull' => false]); $table->addColumn('delayed_until', 'integer', ['notnull' => false]); $table->addColumn('time_to_live', 'integer', ['notnull' => false]); diff --git a/pkg/dbal/DbalMessage.php b/pkg/dbal/DbalMessage.php index 979a53657..24f3b2b49 100644 --- a/pkg/dbal/DbalMessage.php +++ b/pkg/dbal/DbalMessage.php @@ -52,7 +52,7 @@ public function __construct($body = '', array $properties = [], array $headers = $this->properties = $properties; $this->headers = $headers; $this->redelivered = false; - $this->priority = 0; + $this->priority = null; $this->deliveryDelay = null; } diff --git a/pkg/dbal/Tests/DbalContextTest.php b/pkg/dbal/Tests/DbalContextTest.php index 746a4f83d..fc24249e7 100644 --- a/pkg/dbal/Tests/DbalContextTest.php +++ b/pkg/dbal/Tests/DbalContextTest.php @@ -59,7 +59,7 @@ public function testShouldCreateMessage() $this->assertEquals('body', $message->getBody()); $this->assertEquals(['pkey' => 'pval'], $message->getProperties()); $this->assertEquals(['hkey' => 'hval'], $message->getHeaders()); - $this->assertSame(0, $message->getPriority()); + $this->assertNull($message->getPriority()); $this->assertFalse($message->isRedelivered()); } diff --git a/pkg/dbal/Tests/DbalMessageTest.php b/pkg/dbal/Tests/DbalMessageTest.php index c0af060d5..537ab99fd 100644 --- a/pkg/dbal/Tests/DbalMessageTest.php +++ b/pkg/dbal/Tests/DbalMessageTest.php @@ -27,11 +27,11 @@ public function testCouldBeConstructedWithOptionalArguments() $this->assertSame(['fooHeader' => 'fooHeaderVal'], $message->getHeaders()); } - public function testShouldSetPriorityToZeroInConstructor() + public function testShouldSetPriorityToNullInConstructor() { $message = new DbalMessage(); - $this->assertSame(0, $message->getPriority()); + $this->assertNull($message->getPriority()); } public function testShouldSetDelayToNullInConstructor() From c008a8a16e44300f6fdfae78678a47a493a928ed Mon Sep 17 00:00:00 2001 From: Joshua Welsh Date: Wed, 24 Jan 2018 10:11:11 +0000 Subject: [PATCH 0011/1142] [gearman] add support for PHP 7 --- pkg/gearman/.travis.yml | 16 +++++++++++++++- pkg/gearman/composer.json | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/pkg/gearman/.travis.yml b/pkg/gearman/.travis.yml index b1a480247..5816715e6 100644 --- a/pkg/gearman/.travis.yml +++ b/pkg/gearman/.travis.yml @@ -5,6 +5,9 @@ language: php php: - '5.6' + - '7.0' + - '7.1' + - '7.2' cache: directories: @@ -13,7 +16,18 @@ cache: install: - sudo apt-get update - sudo apt-get install libgearman-dev -y --no-install-recommends --no-install-suggests - - pecl install gearman + - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then export GEARMAN_PACKAGE=gearman-1.1.0; fi + - if [[ "$TRAVIS_PHP_VERSION" != "5.6" ]]; then export GEARMAN_PACKAGE=gearman-2.0.3; fi + - curl -L -O https://github.com/wcgallego/pecl-gearman/archive/$GEARMAN_PACKAGE.tar.gz + - tar zxvf $GEARMAN_PACKAGE.tar.gz + - pushd pecl-gearman-$GEARMAN_PACKAGE + - phpize + - ./configure + - make + - make install + - echo 'extension=gearman.so' > gearman.ini + - phpenv config-add gearman.ini + - popd - composer self-update - composer install --prefer-source diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index 8870d575f..6a9af8f68 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": ">=5.6", - "ext-gearman": "^1.1", + "ext-gearman": "^1.1 || ^2.0", "queue-interop/queue-interop": "^0.6@dev" }, "require-dev": { From 1ffadaec07f9179b4db10c27175ec82f215c6aa1 Mon Sep 17 00:00:00 2001 From: Frank Giesecke Date: Thu, 1 Feb 2018 10:48:49 +0100 Subject: [PATCH 0012/1142] Authentication support added --- pkg/redis/PhpRedis.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/redis/PhpRedis.php b/pkg/redis/PhpRedis.php index 71ead40d4..c05bf9e12 100644 --- a/pkg/redis/PhpRedis.php +++ b/pkg/redis/PhpRedis.php @@ -82,6 +82,14 @@ public function connect() ); } + if (array_key_exists('pass', $this->config)) { + $this->config['auth'] = $this->config['pass']; + } + + if (array_key_exists('auth', $this->config)) { + $this->redis->auth($this->config['auth']); + } + $this->redis->select($this->config['database']); } From 639bab75a9efaccc103f74cfa0a25e635f769ee6 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 10 Mar 2018 19:40:28 +0200 Subject: [PATCH 0013/1142] [symfony] Async commands. --- docs/bundle/async_commands.md | 63 +++++++++++ pkg/async-command/.gitignore | 6 + pkg/async-command/.travis.yml | 21 ++++ pkg/async-command/Commands.php | 8 ++ .../AsyncCommandExtension.php | 20 ++++ pkg/async-command/LICENSE | 19 ++++ pkg/async-command/README.md | 28 +++++ .../Resources/config/services.yml | 8 ++ pkg/async-command/RunCommand.php | 105 ++++++++++++++++++ pkg/async-command/RunCommandProcessor.php | 50 +++++++++ pkg/async-command/RunCommandResult.php | 85 ++++++++++++++ pkg/async-command/composer.json | 44 ++++++++ .../DependencyInjection/Configuration.php | 4 + .../DependencyInjection/EnqueueExtension.php | 10 ++ .../Symfony/Creator/JobCommandCreator.php | 66 ----------- .../Symfony/Processor/RunCommandProcessor.php | 44 -------- 16 files changed, 471 insertions(+), 110 deletions(-) create mode 100644 docs/bundle/async_commands.md create mode 100644 pkg/async-command/.gitignore create mode 100644 pkg/async-command/.travis.yml create mode 100644 pkg/async-command/Commands.php create mode 100644 pkg/async-command/DependencyInjection/AsyncCommandExtension.php create mode 100644 pkg/async-command/LICENSE create mode 100644 pkg/async-command/README.md create mode 100644 pkg/async-command/Resources/config/services.yml create mode 100644 pkg/async-command/RunCommand.php create mode 100644 pkg/async-command/RunCommandProcessor.php create mode 100644 pkg/async-command/RunCommandResult.php create mode 100644 pkg/async-command/composer.json delete mode 100644 pkg/enqueue/Symfony/Creator/JobCommandCreator.php delete mode 100644 pkg/enqueue/Symfony/Processor/RunCommandProcessor.php diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md new file mode 100644 index 000000000..81f08f054 --- /dev/null +++ b/docs/bundle/async_commands.md @@ -0,0 +1,63 @@ +# Async commands + +## Installation + +```bash +$ composer require enqueue/async-command:^0.8 +``` + +## Configuration + +```yaml +# config/packages/enqueue_async_commands.yaml + +enqueue: + async_commands: true +``` + +## Usage + +```php +get(ProducerInterface::class); + +$producer->sendCommand(Commands::RUN_COMMAND, new RunCommand('debug:container')); +``` + +optionally you can get a command execution result: + +```php +get(ProducerInterface::class); + +$promise = $producer->sendCommand(Commands::RUN_COMMAND, new RunCommand('debug:container'), true); + +// do other stuff. + +if ($replyMessage = $promise->receive(5000)) { + $result = RunCommandResult::jsonUnserialize($replyMessage->getBody()); + + echo $result->getOutput(); +} +``` + +[back to index](../index.md) diff --git a/pkg/async-command/.gitignore b/pkg/async-command/.gitignore new file mode 100644 index 000000000..c19bea911 --- /dev/null +++ b/pkg/async-command/.gitignore @@ -0,0 +1,6 @@ +*~ +/composer.lock +/composer.phar +/phpunit.xml +/vendor/ +/.idea/ \ No newline at end of file diff --git a/pkg/async-command/.travis.yml b/pkg/async-command/.travis.yml new file mode 100644 index 000000000..b9cf57fc9 --- /dev/null +++ b/pkg/async-command/.travis.yml @@ -0,0 +1,21 @@ +sudo: false + +git: + depth: 10 + +language: php + +php: + - '5.6' + - '7.0' + +cache: + directories: + - $HOME/.composer/cache + +install: + - composer self-update + - composer install --prefer-source + +script: + - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/async-command/Commands.php b/pkg/async-command/Commands.php new file mode 100644 index 000000000..0d751accd --- /dev/null +++ b/pkg/async-command/Commands.php @@ -0,0 +1,8 @@ +load('services.yml'); + } +} diff --git a/pkg/async-command/LICENSE b/pkg/async-command/LICENSE new file mode 100644 index 000000000..bd25f8e13 --- /dev/null +++ b/pkg/async-command/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018 Max Kotliar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/pkg/async-command/README.md b/pkg/async-command/README.md new file mode 100644 index 000000000..17a910394 --- /dev/null +++ b/pkg/async-command/README.md @@ -0,0 +1,28 @@ +# Symfony Async Command. + +[![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) +[![Build Status](https://travis-ci.org/php-enqueue/async-command.png?branch=master)](https://travis-ci.org/php-enqueue/async-command) +[![Total Downloads](https://poser.pugx.org/enqueue/async-command/d/total.png)](https://packagist.org/packages/enqueue/async-command) +[![Latest Stable Version](https://poser.pugx.org/enqueue/async-command/version.png)](https://packagist.org/packages/enqueue/async-command) + +It contains an extension to Symfony's [Console](https://symfony.com/doc/current/components/console.html) component. +It allows to execute Symfony's command async by sending the request to message queue. + +## Resources + +* [Site](https://enqueue.forma-pro.com/) +* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Questions](https://gitter.im/php-enqueue/Lobby) +* [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) + +## Developed by Forma-Pro + +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. + +If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com + +## License + +It is released under the [MIT License](LICENSE). diff --git a/pkg/async-command/Resources/config/services.yml b/pkg/async-command/Resources/config/services.yml new file mode 100644 index 000000000..97355cb00 --- /dev/null +++ b/pkg/async-command/Resources/config/services.yml @@ -0,0 +1,8 @@ +services: + enqueue.async_command.run_command_processor: + class: 'Enqueue\AsyncCommand\RunCommandProcessor' + public: public + arguments: + - '%kernel.root_dir%/..' + tags: + - { name: 'enqueue.client.processor' } diff --git a/pkg/async-command/RunCommand.php b/pkg/async-command/RunCommand.php new file mode 100644 index 000000000..b5959167c --- /dev/null +++ b/pkg/async-command/RunCommand.php @@ -0,0 +1,105 @@ +command = $command; + $this->arguments = $arguments; + $this->options = $options; + } + + /** + * @return string + */ + public function getCommandLine() + { + $optionsString = ''; + foreach ($this->options as $name => $value) { + $optionsString .= " $name=$value"; + } + $optionsString = trim($optionsString); + + $argumentsString = ''; + foreach ($this->arguments as $value) { + $argumentsString .= " $value"; + } + $argumentsString = trim($argumentsString); + + return trim($this->command.' '.$argumentsString.' '.$optionsString); + } + + /** + * @return string + */ + public function getCommand(): string + { + return $this->command; + } + + /** + * @return string[] + */ + public function getArguments(): array + { + return $this->arguments; + } + + /** + * @return string[] + */ + public function getOptions(): array + { + return $this->options; + } + + public function jsonSerialize() + { + return [ + 'command' => $this->command, + 'arguments' => $this->arguments, + 'options' => $this->options, + ]; + } + + /** + * @param string $json + * + * @return self + */ + public static function jsonUnserialize($json) + { + $data = json_decode($json, true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf( + 'The malformed json given. Error %s and message %s', + json_last_error(), + json_last_error_msg() + )); + } + + return new self($data['command'], $data['arguments'], $data['options']); + } +} diff --git a/pkg/async-command/RunCommandProcessor.php b/pkg/async-command/RunCommandProcessor.php new file mode 100644 index 000000000..035282480 --- /dev/null +++ b/pkg/async-command/RunCommandProcessor.php @@ -0,0 +1,50 @@ +projectDir = $projectDir; + } + + public function process(PsrMessage $message, PsrContext $context) + { + $command = RunCommand::jsonUnserialize($message->getBody()); + + $phpBin = (new PhpExecutableFinder())->find(); + $consoleBin = file_exists($this->projectDir.'/bin/console') ? './bin/console' : './app/console'; + + $process = new Process($phpBin.' '.$consoleBin.' '.$command->getCommandLine(), $this->projectDir); + + $process->run(); + + $result = new RunCommandResult($process->getExitCode(), $process->getOutput(), $process->getErrorOutput()); + + return Result::reply($context->createMessage(json_encode($result))); + } + + public static function getSubscribedCommand() + { + return [ + 'processorName' => Commands::RUN_COMMAND, + 'queueName' => Commands::RUN_COMMAND, + 'queueNameHardcoded' => true, + 'exclusive' => true, + ]; + } +} diff --git a/pkg/async-command/RunCommandResult.php b/pkg/async-command/RunCommandResult.php new file mode 100644 index 000000000..ce35a0332 --- /dev/null +++ b/pkg/async-command/RunCommandResult.php @@ -0,0 +1,85 @@ +exitCode = $exitCode; + $this->output = $output; + $this->errorOutput = $errorOutput; + } + + /** + * @return int + */ + public function getExitCode(): int + { + return $this->exitCode; + } + + /** + * @return string + */ + public function getOutput(): string + { + return $this->output; + } + + /** + * @return string + */ + public function getErrorOutput(): string + { + return $this->errorOutput; + } + + public function jsonSerialize() + { + return [ + 'exitCode' => $this->exitCode, + 'output' => $this->output, + 'errorOutput' => $this->errorOutput, + ]; + } + + /** + * @param string $json + * + * @return self + */ + public static function jsonUnserialize($json) + { + $data = json_decode($json, true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf( + 'The malformed json given. Error %s and message %s', + json_last_error(), + json_last_error_msg() + )); + } + + return new self($data['exitCode'], $data['output'], $data['errorOutput']); + } +} diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json new file mode 100644 index 000000000..37ee38af7 --- /dev/null +++ b/pkg/async-command/composer.json @@ -0,0 +1,44 @@ +{ + "name": "enqueue/async-command", + "type": "library", + "description": "Symfony async command", + "keywords": ["messaging", "queue", "async command", "console", "cli"], + "homepage": "https://enqueue.forma-pro.com/", + "license": "MIT", + "require": { + "php": ">=5.6", + "enqueue/enqueue": "^0.8@dev", + "symfony/console": "^2.8|^3|^4" + }, + "require-dev": { + "phpunit/phpunit": "~5.5", + "symfony/dependency-injection": "^2.8|^3|^4", + "symfony/config": "^2.8|^3|^4", + "symfony/http-kernel": "^2.8|^3|^4", + "symfony/filesystem": "^2.8|^3|^4", + "enqueue/null": "^0.8@dev", + "enqueue/fs": "^0.8@dev", + "enqueue/test": "^0.8@dev" + }, + "support": { + "email": "opensource@forma-pro.com", + "issues": "https://github.com/php-enqueue/enqueue-dev/issues", + "forum": "https://gitter.im/php-enqueue/Lobby", + "source": "https://github.com/php-enqueue/enqueue-dev", + "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" + }, + "suggest": { + "symfony/dependency-injection": "^2.8|^3|^4 If you'd like to use async event dispatcher container extension." + }, + "autoload": { + "psr-4": { "Enqueue\\AsyncCommand\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "0.8.x-dev" + } + } +} diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 1db513e64..b051b6b76 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -72,6 +72,10 @@ public function getConfigTreeBuilder() ->addDefaultsIfNotSet() ->canBeEnabled() ->end() + ->arrayNode('async_commands') + ->addDefaultsIfNotSet() + ->canBeEnabled() + ->end() ->arrayNode('extensions')->addDefaultsIfNotSet()->children() ->booleanNode('doctrine_ping_connection_extension')->defaultFalse()->end() ->booleanNode('doctrine_clear_identity_map_extension')->defaultFalse()->end() diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 17c6d41d3..e06972282 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -2,6 +2,7 @@ namespace Enqueue\Bundle\DependencyInjection; +use Enqueue\AsyncCommand\DependencyInjection\AsyncCommandExtension; use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncEventDispatcherExtension; use Enqueue\Client\Producer; use Enqueue\Client\TraceableProducer; @@ -150,6 +151,15 @@ public function load(array $configs, ContainerBuilder $container) ]], $container); } + if ($config['async_commands']['enabled']) { + if (false == class_exists(AsyncCommandExtension::class)) { + throw new \LogicException('The "enqueue/async-command" package has to be installed.'); + } + + $extension = new AsyncCommandExtension(); + $extension->load([[]], $container); + } + if ($config['extensions']['doctrine_ping_connection_extension']) { $loader->load('extensions/doctrine_ping_connection_extension.yml'); } diff --git a/pkg/enqueue/Symfony/Creator/JobCommandCreator.php b/pkg/enqueue/Symfony/Creator/JobCommandCreator.php deleted file mode 100644 index 2003795c9..000000000 --- a/pkg/enqueue/Symfony/Creator/JobCommandCreator.php +++ /dev/null @@ -1,66 +0,0 @@ -producer = $producer; - $this->env = $env; - } - - /** - * @param $command - * @param mixed $args - * - * @return \Enqueue\Rpc\Promise|null - */ - public function scheduleCommand($command, $args = []) - { - $argumentString = $this->createArgumentString($args); - - return $this->producer->sendCommand('run_command', sprintf('%s %s', $command, $argumentString)); - } - - /** - * @param array $arguments - * - * @return string - */ - public function createArgumentString(array $arguments) - { - $optionList = []; - - foreach ($arguments as $key => $value) { - if (!is_int($key)) { - $optionList[] = sprintf('--%s=%s', $key, $value); - continue; - } - - $optionList[] = sprintf('%s', $value); - } - - $optionList[] = sprintf('--env=%s', $this->env); - - return implode(' ', $optionList); - } -} diff --git a/pkg/enqueue/Symfony/Processor/RunCommandProcessor.php b/pkg/enqueue/Symfony/Processor/RunCommandProcessor.php deleted file mode 100644 index 0fb70a5f6..000000000 --- a/pkg/enqueue/Symfony/Processor/RunCommandProcessor.php +++ /dev/null @@ -1,44 +0,0 @@ -projectDir = $projectDir; - } - - public function process(PsrMessage $message, PsrContext $context) - { - $commandline = $message->getBody(); - - $process = new Process('./bin/console '.$commandline, $this->projectDir); - - try { - $process->mustRun(); - - return Result::ACK; - } catch (ProcessFailedException $e) { - return Result::reject(sprintf('The process failed with exception: "%s" in %s at %s', $e->getMessage(), $e->getFile(), $e->getLine())); - } - } - - public static function getSubscribedCommand() - { - return 'run_command'; - } -} From ff43a41cee09ad81a86f14f488225de4031f55d9 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 10 Mar 2018 20:48:39 +0200 Subject: [PATCH 0014/1142] require async command package. --- composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/composer.json b/composer.json index 35777310d..4281aac30 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,7 @@ "enqueue/simple-client": "*@dev", "enqueue/test": "*@dev", "enqueue/async-event-dispatcher": "*@dev", + "enqueue/async-command": "*@dev", "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", "queue-interop/amqp-interop": "^0.7@dev", "queue-interop/queue-spec": "^0.5.4@dev", @@ -143,6 +144,10 @@ { "type": "path", "url": "pkg/async-event-dispatcher" + }, + { + "type": "path", + "url": "pkg/async-command" } ] } From f9b32609fceaefbefb7d1b5297dbab9850d6de43 Mon Sep 17 00:00:00 2001 From: Michael Sheakoski Date: Sat, 3 Mar 2018 17:03:17 -0500 Subject: [PATCH 0015/1142] Convert between Message::$expire and DbalMessage::$timeToLive Fixes a condition which results in the "enqueue" table having a null value for "time_to_live" even though it was set on the Message object prior to sending the event/command. --- pkg/dbal/Client/DbalDriver.php | 3 +++ pkg/dbal/Tests/Client/DbalDriverTest.php | 24 ++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/Client/DbalDriver.php b/pkg/dbal/Client/DbalDriver.php index d5fd9a5a2..2f98b2978 100644 --- a/pkg/dbal/Client/DbalDriver.php +++ b/pkg/dbal/Client/DbalDriver.php @@ -72,6 +72,7 @@ public function createTransportMessage(Message $message) $transportMessage->setMessageId($message->getMessageId()); $transportMessage->setTimestamp($message->getTimestamp()); $transportMessage->setDeliveryDelay($message->getDelay()); + $transportMessage->setTimeToLive($message->getExpire()); $transportMessage->setReplyTo($message->getReplyTo()); $transportMessage->setCorrelationId($message->getCorrelationId()); if (array_key_exists($message->getPriority(), self::$priorityMap)) { @@ -97,6 +98,8 @@ public function createClientMessage(PsrMessage $message) $clientMessage->setContentType($message->getHeader('content_type')); $clientMessage->setMessageId($message->getMessageId()); $clientMessage->setTimestamp($message->getTimestamp()); + $timeToLive = $message->getTimeToLive(); + $clientMessage->setExpire((null === $timeToLive) ? null : (int) round($timeToLive)); $clientMessage->setDelay($message->getDeliveryDelay()); $clientMessage->setReplyTo($message->getReplyTo()); $clientMessage->setCorrelationId($message->getCorrelationId()); diff --git a/pkg/dbal/Tests/Client/DbalDriverTest.php b/pkg/dbal/Tests/Client/DbalDriverTest.php index 6c8de2016..dbdcaa2d8 100644 --- a/pkg/dbal/Tests/Client/DbalDriverTest.php +++ b/pkg/dbal/Tests/Client/DbalDriverTest.php @@ -94,6 +94,7 @@ public function testShouldConvertTransportMessageToClientMessage() $transportMessage->setTimestamp(1000); $transportMessage->setPriority(2); $transportMessage->setDeliveryDelay(12345); + $transportMessage->setTimeToLive(67890); $driver = new DbalDriver( $this->createPsrContextMock(), @@ -118,11 +119,29 @@ public function testShouldConvertTransportMessageToClientMessage() $this->assertSame('ContentType', $clientMessage->getContentType()); $this->assertSame(1000, $clientMessage->getTimestamp()); $this->assertSame(12345, $clientMessage->getDelay()); - - $this->assertNull($clientMessage->getExpire()); + $this->assertSame(67890, $clientMessage->getExpire()); $this->assertSame(MessagePriority::NORMAL, $clientMessage->getPriority()); } + public function testShouldRoundTransportMessageTimeToLiveToNearestIntegerWhenConvertingToClientMessage() + { + $driver = new DbalDriver( + $this->createPsrContextMock(), + $this->createDummyConfig(), + $this->createDummyQueueMetaRegistry() + ); + + $transportMessage = new DbalMessage(); + + $transportMessage->setTimeToLive(1.4); + $clientMessage = $driver->createClientMessage($transportMessage); + $this->assertSame(1, $clientMessage->getExpire()); + + $transportMessage->setTimeToLive(1.5); + $clientMessage = $driver->createClientMessage($transportMessage); + $this->assertSame(2, $clientMessage->getExpire()); + } + public function testShouldConvertClientMessageToTransportMessage() { $clientMessage = new Message(); @@ -163,6 +182,7 @@ public function testShouldConvertClientMessageToTransportMessage() $this->assertSame([ 'key' => 'val', ], $transportMessage->getProperties()); + $this->assertSame(123, $transportMessage->getTimeToLive()); $this->assertSame('MessageId', $transportMessage->getMessageId()); $this->assertSame(1000, $transportMessage->getTimestamp()); } From a0373408bdbf339b7e68d4998c0ae4f773257713 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 5 Apr 2018 10:25:20 +0300 Subject: [PATCH 0016/1142] Drop PHP5 support, Require Queue Interop with PHP7 features. --- pkg/amqp-bunny/composer.json | 5 ++--- pkg/amqp-ext/composer.json | 4 ++-- pkg/amqp-lib/composer.json | 5 ++--- pkg/amqp-tools/composer.json | 5 ++--- pkg/async-event-dispatcher/composer.json | 2 +- pkg/dbal/composer.json | 4 ++-- pkg/enqueue-bundle/composer.json | 2 +- pkg/enqueue/composer.json | 4 ++-- pkg/fs/composer.json | 4 ++-- pkg/gearman/composer.json | 4 ++-- pkg/gps/composer.json | 4 ++-- pkg/job-queue/composer.json | 2 +- pkg/null/composer.json | 4 ++-- pkg/pheanstalk/composer.json | 4 ++-- pkg/rdkafka/composer.json | 4 ++-- pkg/redis/composer.json | 4 ++-- pkg/simple-client/composer.json | 2 +- pkg/sqs/composer.json | 4 ++-- pkg/stomp/composer.json | 4 ++-- 19 files changed, 34 insertions(+), 37 deletions(-) diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index af91fd036..67176bddf 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -6,9 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - - "queue-interop/amqp-interop": "^0.7@dev", + "php": "^7.1.3", + "queue-interop/amqp-interop": "^0.8@dev", "bunny/bunny": "^0.2.4", "enqueue/amqp-tools": "^0.9@dev" }, diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 455229ef2..788465614 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -6,9 +6,9 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "ext-amqp": "^1.9.3", - "queue-interop/amqp-interop": "^0.7@dev", + "queue-interop/amqp-interop": "^0.8@dev", "enqueue/amqp-tools": "^0.9@dev" }, "require-dev": { diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 2b920e1e1..c8a077ea9 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -6,10 +6,9 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "php-amqplib/php-amqplib": "^2.7@dev", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", - "queue-interop/amqp-interop": "^0.7@dev", + "queue-interop/amqp-interop": "^0.8@dev", "enqueue/amqp-tools": "^0.9@dev" }, "require-dev": { diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index 7a6c9d107..dcf624a07 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -6,9 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", - "queue-interop/amqp-interop": "^0.7@dev" + "php": "^7.1.3", + "queue-interop/amqp-interop": "^0.8@dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index 2d1294f63..b91fb81ca 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "enqueue/enqueue": "^0.9@dev", "symfony/event-dispatcher": "^2.8|^3|^4" }, diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 8b0fb2178..851fe382c 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", + "php": "^7.1.3", + "queue-interop/queue-interop": "^0.7@dev", "doctrine/dbal": "~2.5", "ramsey/uuid": "^3" }, diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index b83a0b571..2690da725 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "symfony/framework-bundle": "^2.8|^3|^4", "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 353c9a9a9..83b015b13 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", + "php": "^7.1.3", + "queue-interop/queue-interop": "^0.7@dev", "enqueue/null": "^0.9@dev", "ramsey/uuid": "^2|^3.5", "psr/log": "^1" diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index f45fe97d0..a2a5cbe0f 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - "queue-interop/queue-interop": "^0.6|^1.0.0-alpha1", + "php": "^7.1.3", + "queue-interop/queue-interop": "^0.7@dev", "symfony/filesystem": "^2.8|^3|^4", "makasim/temp-file": "^0.2@stable" }, diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index c446d9665..761a9537f 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -6,9 +6,9 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "ext-gearman": "^1.1 || ^2.0", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1" + "queue-interop/queue-interop": "^0.7@dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index d3de68c4b..0c1dcfcaa 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", + "php": "^7.1.3", + "queue-interop/queue-interop": "^0.7@dev", "google/cloud-pubsub": "^0.6.1" }, "require-dev": { diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index bccd7b280..a6f234f5f 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "doctrine/orm": "~2.4" diff --git a/pkg/null/composer.json b/pkg/null/composer.json index 2b285dbd5..33c8fff77 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1" + "php": "^7.1.3", + "queue-interop/queue-interop": "^0.7@dev" }, "require-dev": { "phpunit/phpunit": "~5.5", diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index dcb22821a..35812ed7e 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -6,9 +6,9 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "pda/pheanstalk": "^3", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1" + "queue-interop/queue-interop": "^0.7@dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 5a4926ba4..997d8d0e5 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -6,9 +6,9 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "ext-rdkafka": "^3.0.3", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1" + "queue-interop/queue-interop": "^0.7@dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index fe7b026a6..924d84475 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1" + "php": "^7.1.3", + "queue-interop/queue-interop": "^0.7@dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 5623c2b12..7e844ebe3 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "enqueue/enqueue": "^0.9@dev", "symfony/dependency-injection": "^2.8|^3|^4", "symfony/config": "^2.8|^3|^4", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index 103c02642..0e5e580eb 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", + "php": "^7.1.3", + "queue-interop/queue-interop": "^0.7@dev", "aws/aws-sdk-php": "~3.26" }, "require-dev": { diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 5c1b5efb0..f40bb10d5 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -6,9 +6,9 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=5.6", + "php": "^7.1.3", "stomp-php/stomp-php": "^4", - "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", + "queue-interop/queue-interop": "^0.7@dev", "php-http/guzzle6-adapter": "^1.1", "php-http/client-common": "^1.7@dev", "richardfullmer/rabbitmq-management-api": "^2.0" From 60d6fa56417a7dd15bba967ce86bddc5803d3ec1 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 5 Apr 2018 10:30:01 +0300 Subject: [PATCH 0017/1142] Drop Symfony 2.x support, set Symfony 3.4 minimum supported version. --- .travis.yml | 31 ++++++------------------ pkg/amqp-bunny/composer.json | 4 +-- pkg/amqp-ext/composer.json | 4 +-- pkg/amqp-lib/composer.json | 6 ++--- pkg/async-event-dispatcher/composer.json | 10 ++++---- pkg/dbal/composer.json | 4 +-- pkg/enqueue-bundle/composer.json | 10 ++++---- pkg/enqueue/composer.json | 14 +++++------ pkg/fs/composer.json | 8 +++--- pkg/gearman/composer.json | 4 +-- pkg/gps/composer.json | 4 +-- pkg/job-queue/composer.json | 6 ++--- pkg/null/composer.json | 4 +-- pkg/pheanstalk/composer.json | 4 +-- pkg/redis/composer.json | 4 +-- pkg/simple-client/composer.json | 6 ++--- pkg/sqs/composer.json | 4 +-- pkg/stomp/composer.json | 4 +-- 18 files changed, 58 insertions(+), 73 deletions(-) diff --git a/.travis.yml b/.travis.yml index 633ddc8be..f33e06ee9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,42 +7,27 @@ language: php matrix: include: - - php: 5.6 - env: SYMFONY_VERSION=2.8.* UNIT_TESTS=true - php: 7.1 - env: SYMFONY_VERSION=3.0.* PHPSTAN=true + env: SYMFONY_VERSION=3.4.* PHPSTAN=true - php: 7.1 - env: SYMFONY_VERSION=3.0.* PHP_CS_FIXER=true - - php: 7.0 - env: SYMFONY_VERSION=2.8.* UNIT_TESTS=true - - php: 5.6 - env: SYMFONY_VERSION=3.0.* UNIT_TESTS=true - - php: 7.0 - env: SYMFONY_VERSION=3.0.* UNIT_TESTS=true - - php: 7.1 - env: SYMFONY_VERSION=4.0.* UNIT_TESTS=true + env: SYMFONY_VERSION=3.4.* PHP_CS_FIXER=true - php: 7.1 env: SYMFONY_VERSION=3.4.* UNIT_TESTS=true - - php: 7.2 - services: docker - env: SYMFONY_VERSION=2.8.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - - php: 7.1 - services: docker - env: SYMFONY_VERSION=3.0.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - php: 7.1 - services: docker - env: SYMFONY_VERSION=3.2.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true + env: SYMFONY_VERSION=4.0.* UNIT_TESTS=true + - php: 7.2 + env: SYMFONY_VERSION=4.0.* UNIT_TESTS=true - php: 7.1 services: docker - env: SYMFONY_VERSION=3.3.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true + env: SYMFONY_VERSION=3.4.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - php: 7.1 services: docker env: SYMFONY_VERSION=4.0.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - php: 7.1 services: docker - env: SYMFONY_VERSION=3.3.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true + env: SYMFONY_VERSION=3.4.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true allow_failures: - - env: SYMFONY_VERSION=3.3.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true + - env: SYMFONY_VERSION=3.4.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true cache: directories: diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 67176bddf..2e03cfac4 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -17,8 +17,8 @@ "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 788465614..dce104835 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -18,8 +18,8 @@ "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", "empi89/php-amqp-stubs": "*@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index c8a077ea9..aa05811de 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "php-amqplib/php-amqplib": "^2.7@dev", + "php-amqplib/php-amqplib": "^2.7", "queue-interop/amqp-interop": "^0.8@dev", "enqueue/amqp-tools": "^0.9@dev" }, @@ -17,8 +17,8 @@ "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index b91fb81ca..b71e7e30c 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -8,14 +8,14 @@ "require": { "php": "^7.1.3", "enqueue/enqueue": "^0.9@dev", - "symfony/event-dispatcher": "^2.8|^3|^4" + "symfony/event-dispatcher": "^3.4|^4" }, "require-dev": { "phpunit/phpunit": "~5.5", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4", - "symfony/http-kernel": "^2.8|^3|^4", - "symfony/filesystem": "^2.8|^3|^4", + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4", + "symfony/http-kernel": "^3.4|^4", + "symfony/filesystem": "^3.4|^4", "enqueue/null": "^0.9@dev", "enqueue/fs": "^0.9@dev", "enqueue/test": "^0.9@dev" diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 851fe382c..d81a0a4b1 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -17,8 +17,8 @@ "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.5@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 2690da725..1410341a2 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "symfony/framework-bundle": "^2.8|^3|^4", + "symfony/framework-bundle": "^3.4|^4", "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "enqueue/async-event-dispatcher": "^0.9@dev" @@ -32,11 +32,11 @@ "enqueue/sqs": "^0.9@dev", "enqueue/gps": "^0.9@dev", "enqueue/test": "^0.9@dev", - "php-amqplib/php-amqplib": "^2.7@dev", + "php-amqplib/php-amqplib": "^2.7", "doctrine/doctrine-bundle": "~1.2", - "symfony/monolog-bundle": "^2.8|^3|^4", - "symfony/browser-kit": "^2.8|^3|^4", - "symfony/expression-language": "^2.8|^3|^4" + "symfony/monolog-bundle": "^3.4|^4", + "symfony/browser-kit": "^3.4|^4", + "symfony/expression-language": "^3.4|^4" }, "autoload": { "psr-4": { "Enqueue\\Bundle\\": "" }, diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 83b015b13..11f9def1b 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -14,11 +14,11 @@ }, "require-dev": { "phpunit/phpunit": "~5.5", - "symfony/console": "^2.8|^3|^4", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4", - "symfony/event-dispatcher": "^2.8|^3|^4", - "symfony/http-kernel": "^2.8|^3|^4", + "symfony/console": "^3.4|^4", + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4", + "symfony/event-dispatcher": "^3.4|^4", + "symfony/http-kernel": "^3.4|^4", "enqueue/amqp-ext": "^0.9@dev", "enqueue/amqp-lib": "^0.9@dev", "enqueue/amqp-bunny": "^0.9@dev", @@ -37,8 +37,8 @@ }, "suggest": { "symfony/console": "^2.8|^3|^4 If you want to use li commands", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4", + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4", "enqueue/amqp-ext": "AMQP transport (based on php extension)", "enqueue/stomp": "STOMP transport", "enqueue/fs": "Filesystem transport", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index a2a5cbe0f..8536d822f 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/queue-interop": "^0.7@dev", - "symfony/filesystem": "^2.8|^3|^4", + "symfony/filesystem": "^3.4|^4", "makasim/temp-file": "^0.2@stable" }, "require-dev": { @@ -17,9 +17,9 @@ "enqueue/null": "^0.9@dev", "enqueue/test": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4", - "symfony/phpunit-bridge": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4", + "symfony/phpunit-bridge": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index 761a9537f..c5c1ed5d3 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -16,8 +16,8 @@ "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 0c1dcfcaa..04d7be4e9 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -15,8 +15,8 @@ "enqueue/test": "^0.9@dev", "enqueue/enqueue": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index a6f234f5f..74ba7a24b 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -15,9 +15,9 @@ "phpunit/phpunit": "~5.5", "enqueue/test": "^0.9@dev", "doctrine/doctrine-bundle": "~1.2", - "symfony/browser-kit": "^2.8|^3|^4", - "symfony/expression-language": "^2.8|^3|^4", - "symfony/framework-bundle": "^2.8|^3|^4" + "symfony/browser-kit": "^3.4|^4", + "symfony/expression-language": "^3.4|^4", + "symfony/framework-bundle": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/null/composer.json b/pkg/null/composer.json index 33c8fff77..34a378351 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -14,8 +14,8 @@ "enqueue/enqueue": "^0.9@dev", "enqueue/test": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index 35812ed7e..5d1851730 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -16,8 +16,8 @@ "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 924d84475..a7dc2944e 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -16,8 +16,8 @@ "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 7e844ebe3..e900bb9b3 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -8,9 +8,9 @@ "require": { "php": "^7.1.3", "enqueue/enqueue": "^0.9@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4", - "symfony/console": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4", + "symfony/console": "^3.4|^4" }, "require-dev": { "phpunit/phpunit": "~5.5", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index 0e5e580eb..97d8d46d1 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -15,8 +15,8 @@ "enqueue/test": "^0.9@dev", "enqueue/enqueue": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index f40bb10d5..7181e485c 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -19,8 +19,8 @@ "enqueue/enqueue": "^0.9@dev", "enqueue/null": "^0.9@dev", "queue-interop/queue-spec": "^0.5.3@dev", - "symfony/dependency-injection": "^2.8|^3|^4", - "symfony/config": "^2.8|^3|^4" + "symfony/dependency-injection": "^3.4|^4", + "symfony/config": "^3.4|^4" }, "support": { "email": "opensource@forma-pro.com", From eb0209be81915f8d4348bc66fdf83130337f4103 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 19 Apr 2018 09:01:48 +0300 Subject: [PATCH 0018/1142] add async command to split script. --- bin/subtree-split | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/subtree-split b/bin/subtree-split index 2c3dd8261..f54f35148 100755 --- a/bin/subtree-split +++ b/bin/subtree-split @@ -63,6 +63,7 @@ remote enqueue-bundle git@github.com:php-enqueue/enqueue-bundle.git remote job-queue git@github.com:php-enqueue/job-queue.git remote test git@github.com:php-enqueue/test.git remote async-event-dispatcher git@github.com:php-enqueue/async-event-dispatcher.git +remote async-command git@github.com:php-enqueue/async-command.git split 'pkg/enqueue' enqueue split 'pkg/simple-client' simple-client @@ -83,4 +84,6 @@ split 'pkg/gps' gps split 'pkg/enqueue-bundle' enqueue-bundle split 'pkg/job-queue' job-queue split 'pkg/test' test -split 'pkg/async-event-dispatcher' async-event-dispatcher \ No newline at end of file +split 'pkg/async-event-dispatcher' async-event-dispatcher +split 'pkg/async-command' async-command + From 37b2631ab05aeb8852625145b63de5cc05be831b Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 28 Apr 2018 11:54:56 +0300 Subject: [PATCH 0019/1142] fix priority test. --- bin/run-fun-test.sh | 2 +- pkg/dbal/DbalConsumer.php | 2 +- pkg/dbal/DbalProducer.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/run-fun-test.sh b/bin/run-fun-test.sh index b8150ac54..626741366 100755 --- a/bin/run-fun-test.sh +++ b/bin/run-fun-test.sh @@ -3,4 +3,4 @@ set -x set -e -COMPOSE_PROJECT_NAME=mqdev docker-compose run --workdir="/mqdev" --rm dev ./bin/test "$@" \ No newline at end of file +docker-compose run --workdir="/mqdev" --rm dev ./bin/test "$@" \ No newline at end of file diff --git a/pkg/dbal/DbalConsumer.php b/pkg/dbal/DbalConsumer.php index 202897d63..bee61185c 100644 --- a/pkg/dbal/DbalConsumer.php +++ b/pkg/dbal/DbalConsumer.php @@ -213,8 +213,8 @@ private function fetchPrioritizedMessage($now) ->andWhere('queue = :queue') ->andWhere('priority IS NOT NULL') ->andWhere('(delayed_until IS NULL OR delayed_until <= :delayedUntil)') - ->addOrderBy('priority', 'desc') ->addOrderBy('published_at', 'asc') + ->addOrderBy('priority', 'desc') ->setMaxResults(1) ; diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index bdd200f58..3d5c72bd4 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -63,7 +63,7 @@ public function send(PsrDestination $destination, PsrMessage $message) InvalidDestinationException::assertDestinationInstanceOf($destination, DbalDestination::class); InvalidMessageException::assertMessageInstanceOf($message, DbalMessage::class); - if (null !== $this->priority && 0 === $message->getPriority()) { + if (null !== $this->priority && null === $message->getPriority()) { $message->setPriority($this->priority); } if (null !== $this->deliveryDelay && null === $message->getDeliveryDelay()) { From 402344ccccbcbc5f394b13b67363bbd6abc7ef92 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 28 Apr 2018 12:21:20 +0300 Subject: [PATCH 0020/1142] force 0.9.x pkgs --- .travis.yml | 1 + bin/symlink-pkgs-to-vendor.sh | 26 +++++++++++++++++++++++ composer.json | 40 +++++++++++++++++------------------ 3 files changed, 47 insertions(+), 20 deletions(-) create mode 100755 bin/symlink-pkgs-to-vendor.sh diff --git a/.travis.yml b/.travis.yml index f33e06ee9..2ba36939d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,6 +38,7 @@ install: - echo "memory_limit=2048M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - composer require symfony/symfony:${SYMFONY_VERSION} --no-update - composer install + - ./bin/symlink-pkgs-to-vendor.sh - if [ "$PREPARE_CONTAINER" = true ]; then docker --version; fi - if [ "$PREPARE_CONTAINER" = true ]; then docker-compose --version; fi - if [ "$PREPARE_CONTAINER" = true ]; then bin/dev -b; fi diff --git a/bin/symlink-pkgs-to-vendor.sh b/bin/symlink-pkgs-to-vendor.sh new file mode 100755 index 000000000..3a460b5b7 --- /dev/null +++ b/bin/symlink-pkgs-to-vendor.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +set -x +set -e + +rm -rf vendor/enqueue/* +ln -s ../../pkg/amqp-bunny vendor/enqueue +ln -s ../../pkg/amqp-ext vendor/enqueue +ln -s ../../pkg/amqp-lib vendor/enqueue +ln -s ../../pkg/amqp-tools vendor/enqueue +ln -s ../../pkg/async-event-dispatcher vendor/enqueue +ln -s ../../pkg/dbal vendor/enqueue +ln -s ../../pkg/enqueue vendor/enqueue +ln -s ../../pkg/enqueue-bundle vendor/enqueue +ln -s ../../pkg/fs vendor/enqueue +ln -s ../../pkg/gearman vendor/enqueue +ln -s ../../pkg/gps vendor/enqueue +ln -s ../../pkg/job-queue vendor/enqueue +ln -s ../../pkg/null vendor/enqueue +ln -s ../../pkg/pheanstalk vendor/enqueue +ln -s ../../pkg/rdkafka vendor/enqueue +ln -s ../../pkg/redis vendor/enqueue +ln -s ../../pkg/simple-client vendor/enqueue +ln -s ../../pkg/sqs vendor/enqueue +ln -s ../../pkg/stomp vendor/enqueue +ln -s ../../pkg/test vendor/enqueue diff --git a/composer.json b/composer.json index 35777310d..8c38b226b 100644 --- a/composer.json +++ b/composer.json @@ -5,28 +5,28 @@ "homepage": "https://enqueue.forma-pro.com/", "require": { "php": ">=5.6", - "enqueue/enqueue": "*@dev", - "enqueue/stomp": "*@dev", - "enqueue/amqp-ext": "*@dev", - "enqueue/amqp-lib": "*@dev", - "enqueue/amqp-bunny": "*@dev", - "enqueue/amqp-tools": "*@dev", + "enqueue/enqueue": "0.9.x-dev", + "enqueue/stomp": "0.9.x-dev", + "enqueue/amqp-ext": "0.9.x-dev", + "enqueue/amqp-lib": "0.9.x-dev", + "enqueue/amqp-bunny": "0.9.x-dev", + "enqueue/amqp-tools": "0.9.x-dev", "php-amqplib/php-amqplib": "^2.7@dev", - "enqueue/redis": "*@dev", - "enqueue/fs": "*@dev", - "enqueue/null": "*@dev", - "enqueue/dbal": "*@dev", - "enqueue/sqs": "*@dev", - "enqueue/pheanstalk": "*@dev", - "enqueue/gearman": "*@dev", - "enqueue/rdkafka": "*@dev", + "enqueue/redis": "0.9.x-dev", + "enqueue/fs": "0.9.x-dev", + "enqueue/null": "0.9.x-dev", + "enqueue/dbal": "0.9.x-dev", + "enqueue/sqs": "0.9.x-dev", + "enqueue/pheanstalk": "0.9.x-dev", + "enqueue/gearman": "0.9.x-dev", + "enqueue/rdkafka": "0.9.x-dev", "kwn/php-rdkafka-stubs": "^1.0.2", - "enqueue/gps": "*@dev", - "enqueue/enqueue-bundle": "*@dev", - "enqueue/job-queue": "*@dev", - "enqueue/simple-client": "*@dev", - "enqueue/test": "*@dev", - "enqueue/async-event-dispatcher": "*@dev", + "enqueue/gps": "0.9.x-dev", + "enqueue/enqueue-bundle": "0.9.x-dev", + "enqueue/job-queue": "0.9.x-dev", + "enqueue/simple-client": "0.9.x-dev", + "enqueue/test": "0.9.x-dev", + "enqueue/async-event-dispatcher": "0.9.x-dev", "queue-interop/queue-interop": "^0.6@dev|^1.0.0-alpha1", "queue-interop/amqp-interop": "^0.7@dev", "queue-interop/queue-spec": "^0.5.4@dev", From adc9860e4bdab6a91804a7d753c4707b19463e88 Mon Sep 17 00:00:00 2001 From: Slaven Bacelic Date: Tue, 10 Apr 2018 16:25:15 +0200 Subject: [PATCH 0021/1142] [bundle] Make TraceableProducer service public So it can be used with Symfony ^4 --- pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 17c6d41d3..7197d8522 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -109,6 +109,7 @@ public function load(array $configs, ContainerBuilder $container) if ($config['client']['traceable_producer']) { $container->register(TraceableProducer::class, TraceableProducer::class) ->setDecoratedService(Producer::class) + ->setPublic(true) ->addArgument(new Reference(sprintf('%s.inner', TraceableProducer::class))) ; } From 3d0202971988a8030c33d2b5711f45db4fb84d30 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Fri, 13 Apr 2018 19:52:17 +0300 Subject: [PATCH 0022/1142] Update doc block. return value should be "self" --- pkg/enqueue/Consumption/Result.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue/Consumption/Result.php b/pkg/enqueue/Consumption/Result.php index 6be4d511e..ff11721bb 100644 --- a/pkg/enqueue/Consumption/Result.php +++ b/pkg/enqueue/Consumption/Result.php @@ -90,7 +90,7 @@ public function setReply(PsrMessage $reply = null) /** * @param string $reason * - * @return Result + * @return self */ public static function ack($reason = '') { @@ -100,7 +100,7 @@ public static function ack($reason = '') /** * @param string $reason * - * @return Result + * @return self */ public static function reject($reason) { @@ -110,7 +110,7 @@ public static function reject($reason) /** * @param string $reason * - * @return Result + * @return self */ public static function requeue($reason = '') { @@ -122,7 +122,7 @@ public static function requeue($reason = '') * @param string $status * @param string|null $reason * - * @return Result + * @return self */ public static function reply(PsrMessage $replyMessage, $status = self::ACK, $reason = null) { From 44fb78c3f1a436333b40212b5bdb27f78ae12e0c Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 13 Apr 2018 19:55:21 +0300 Subject: [PATCH 0023/1142] Release 0.8.25 --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2eaaff221..35ec16474 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## [0.8.25](https://github.com/php-enqueue/enqueue-dev/tree/0.8.25) (2018-04-13) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.24...0.8.25) + +- gearmand queue library can't not use for php7 [\#270](https://github.com/php-enqueue/enqueue-dev/issues/270) +- \[bundle\] Make TraceableProducer service public [\#422](https://github.com/php-enqueue/enqueue-dev/pull/422) ([sbacelic](https://github.com/sbacelic)) + +- Why no packagist support [\#424](https://github.com/php-enqueue/enqueue-dev/issues/424) +- \[DbalDriver\] does not convert Message::$expire to DbalMessage::$timeToLive [\#391](https://github.com/php-enqueue/enqueue-dev/issues/391) + +- \[skip ci\] Update doc block. return value should be "self" [\#425](https://github.com/php-enqueue/enqueue-dev/pull/425) ([makasim](https://github.com/makasim)) +- Fix a tiny little typo in documentation [\#416](https://github.com/php-enqueue/enqueue-dev/pull/416) ([bobey](https://github.com/bobey)) + ## [0.8.24](https://github.com/php-enqueue/enqueue-dev/tree/0.8.24) (2018-03-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.23...0.8.24) From 4c9aaa02c2480dc95bcef83663674397b2e4bf8f Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Fri, 13 Apr 2018 20:05:57 +0300 Subject: [PATCH 0024/1142] Update Result.php --- pkg/enqueue/Consumption/Result.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue/Consumption/Result.php b/pkg/enqueue/Consumption/Result.php index ff11721bb..b78f997f4 100644 --- a/pkg/enqueue/Consumption/Result.php +++ b/pkg/enqueue/Consumption/Result.php @@ -90,7 +90,7 @@ public function setReply(PsrMessage $reply = null) /** * @param string $reason * - * @return self + * @return static */ public static function ack($reason = '') { @@ -100,7 +100,7 @@ public static function ack($reason = '') /** * @param string $reason * - * @return self + * @return static */ public static function reject($reason) { @@ -110,7 +110,7 @@ public static function reject($reason) /** * @param string $reason * - * @return self + * @return static */ public static function requeue($reason = '') { @@ -122,7 +122,7 @@ public static function requeue($reason = '') * @param string $status * @param string|null $reason * - * @return self + * @return static */ public static function reply(PsrMessage $replyMessage, $status = self::ACK, $reason = null) { From 15f8232ffc9080abfd270c650642630249e72f33 Mon Sep 17 00:00:00 2001 From: Konstantin Myakshin Date: Mon, 16 Apr 2018 23:12:53 +0300 Subject: [PATCH 0025/1142] Fix namespace in doc --- docs/magento2/quick_tour.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/magento2/quick_tour.md b/docs/magento2/quick_tour.md index f52312148..c6ced2be2 100644 --- a/docs/magento2/quick_tour.md +++ b/docs/magento2/quick_tour.md @@ -33,7 +33,7 @@ To send a message you have to take enqueue helper and call `send` method. create('Enqueue\Enqueue\Model\EnqueueManager'); +$enqueueManager = $objectManager->create('Enqueue\Magento2\Model\EnqueueManager'); $enqueueManager->sendEvent('a_topic', 'aMessage'); // or a command with a possible reply @@ -97,4 +97,4 @@ and run message consume command: $ php bin/magento enqueue:consume -vvv --setup-broker ``` -[back to index](../index.md#magento2) \ No newline at end of file +[back to index](../index.md#magento2) From d3ac065eb88bec5a7b54fad4826585efcc39fe94 Mon Sep 17 00:00:00 2001 From: Arjan van den Bos Date: Thu, 19 Apr 2018 00:53:57 +0200 Subject: [PATCH 0026/1142] Allow to enable SSL, depend the uri scheme on that. Backwards compatible. --- docs/bundle/config_reference.md | 3 +++ pkg/stomp/StompConnectionFactory.php | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index b4da026db..f9c8d4cc6 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -21,6 +21,9 @@ enqueue: connection_timeout: 1 buffer_size: 1000 lazy: true + + # Should be true if you want to use secure connections. False by default + ssl_on: false rabbitmq_stomp: host: localhost port: 61613 diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index 1f82a7b8a..7cee14971 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -28,6 +28,7 @@ class StompConnectionFactory implements PsrConnectionFactory * 'connection_timeout' => 1, * 'sync' => false, * 'lazy' => true, + * 'ssl_on' => false, * ]. * * or @@ -75,7 +76,8 @@ private function establishConnection() if (false == $this->stomp) { $config = $this->config; - $uri = 'tcp://'.$config['host'].':'.$config['port']; + $scheme = ($config['ssl_on'] === true) ? 'ssl' : 'tcp'; + $uri = $scheme . '://' . $config['host'] . ':' . $config['port']; $connection = new Connection($uri, $config['connection_timeout']); $this->stomp = new BufferedStompClient($connection, $config['buffer_size']); @@ -134,6 +136,7 @@ private function defaultConfig() 'connection_timeout' => 1, 'sync' => false, 'lazy' => true, + 'ssl_on' => false, ]; } } From 4ff510a1df37309b5526f9f03b91831f516bb1dc Mon Sep 17 00:00:00 2001 From: Arjan van den Bos Date: Thu, 19 Apr 2018 01:02:43 +0200 Subject: [PATCH 0027/1142] Added ssl_on to configuration builder --- pkg/stomp/Symfony/StompTransportFactory.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/stomp/Symfony/StompTransportFactory.php b/pkg/stomp/Symfony/StompTransportFactory.php index 235752cdd..4b2587b8a 100644 --- a/pkg/stomp/Symfony/StompTransportFactory.php +++ b/pkg/stomp/Symfony/StompTransportFactory.php @@ -43,6 +43,7 @@ public function addConfiguration(ArrayNodeDefinition $builder) ->integerNode('connection_timeout')->min(1)->defaultValue(1)->end() ->integerNode('buffer_size')->min(1)->defaultValue(1000)->end() ->booleanNode('lazy')->defaultTrue()->end() + ->booleanNode('ssl_on')->defaultFalse()->end() ; } From 1bb5bc4d68be94651bba545f3bc01f84bf8edf4e Mon Sep 17 00:00:00 2001 From: Arjan van den Bos Date: Thu, 19 Apr 2018 01:15:54 +0200 Subject: [PATCH 0028/1142] Fixed coding style --- pkg/stomp/StompConnectionFactory.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index 7cee14971..275ad14fa 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -76,8 +76,8 @@ private function establishConnection() if (false == $this->stomp) { $config = $this->config; - $scheme = ($config['ssl_on'] === true) ? 'ssl' : 'tcp'; - $uri = $scheme . '://' . $config['host'] . ':' . $config['port']; + $scheme = (true === $config['ssl_on']) ? 'ssl' : 'tcp'; + $uri = $scheme.'://'.$config['host'].':'.$config['port']; $connection = new Connection($uri, $config['connection_timeout']); $this->stomp = new BufferedStompClient($connection, $config['buffer_size']); From dd455fa87efe2bccadb57cd7af493389930775f9 Mon Sep 17 00:00:00 2001 From: Arjan van den Bos Date: Thu, 19 Apr 2018 01:28:19 +0200 Subject: [PATCH 0029/1142] Fixed tests --- pkg/stomp/Tests/StompConnectionFactoryConfigTest.php | 5 +++++ .../Tests/Symfony/RabbitMqStompTransportFactoryTest.php | 1 + pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php | 1 + 3 files changed, 7 insertions(+) diff --git a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php index 61f8d0515..ebc64b583 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php @@ -64,6 +64,7 @@ public static function provideConfigs() 'connection_timeout' => 1, 'sync' => false, 'lazy' => true, + 'ssl_on' => false ], ]; @@ -79,6 +80,7 @@ public static function provideConfigs() 'connection_timeout' => 1, 'sync' => false, 'lazy' => true, + 'ssl_on' => false ], ]; @@ -94,6 +96,7 @@ public static function provideConfigs() 'connection_timeout' => 1, 'sync' => false, 'lazy' => true, + 'ssl_on' => false ], ]; @@ -110,6 +113,7 @@ public static function provideConfigs() 'sync' => true, 'lazy' => false, 'foo' => 'bar', + 'ssl_on' => false ], ]; @@ -126,6 +130,7 @@ public static function provideConfigs() 'sync' => false, 'lazy' => true, 'foo' => 'bar', + 'ssl_on' => false ], ]; } diff --git a/pkg/stomp/Tests/Symfony/RabbitMqStompTransportFactoryTest.php b/pkg/stomp/Tests/Symfony/RabbitMqStompTransportFactoryTest.php index d45a291e9..4d3317037 100644 --- a/pkg/stomp/Tests/Symfony/RabbitMqStompTransportFactoryTest.php +++ b/pkg/stomp/Tests/Symfony/RabbitMqStompTransportFactoryTest.php @@ -59,6 +59,7 @@ public function testShouldAllowAddConfiguration() 'management_plugin_installed' => false, 'management_plugin_port' => 15672, 'lazy' => true, + 'ssl_on' => false ], $config); } diff --git a/pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php b/pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php index fb4c1bb85..086143e28 100644 --- a/pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php +++ b/pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php @@ -55,6 +55,7 @@ public function testShouldAllowAddConfiguration() 'connection_timeout' => 1, 'buffer_size' => 1000, 'lazy' => true, + 'ssl_on' => false ], $config); } From a88287db286b766c983ca4bddb1286804c5bd487 Mon Sep 17 00:00:00 2001 From: Arjan van den Bos Date: Thu, 19 Apr 2018 01:34:51 +0200 Subject: [PATCH 0030/1142] Style fixes --- pkg/stomp/Tests/StompConnectionFactoryConfigTest.php | 10 +++++----- .../Symfony/RabbitMqStompTransportFactoryTest.php | 2 +- pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php index ebc64b583..579479484 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php @@ -64,7 +64,7 @@ public static function provideConfigs() 'connection_timeout' => 1, 'sync' => false, 'lazy' => true, - 'ssl_on' => false + 'ssl_on' => false, ], ]; @@ -80,7 +80,7 @@ public static function provideConfigs() 'connection_timeout' => 1, 'sync' => false, 'lazy' => true, - 'ssl_on' => false + 'ssl_on' => false, ], ]; @@ -96,7 +96,7 @@ public static function provideConfigs() 'connection_timeout' => 1, 'sync' => false, 'lazy' => true, - 'ssl_on' => false + 'ssl_on' => false, ], ]; @@ -113,7 +113,7 @@ public static function provideConfigs() 'sync' => true, 'lazy' => false, 'foo' => 'bar', - 'ssl_on' => false + 'ssl_on' => false, ], ]; @@ -130,7 +130,7 @@ public static function provideConfigs() 'sync' => false, 'lazy' => true, 'foo' => 'bar', - 'ssl_on' => false + 'ssl_on' => false, ], ]; } diff --git a/pkg/stomp/Tests/Symfony/RabbitMqStompTransportFactoryTest.php b/pkg/stomp/Tests/Symfony/RabbitMqStompTransportFactoryTest.php index 4d3317037..9fbdb6bed 100644 --- a/pkg/stomp/Tests/Symfony/RabbitMqStompTransportFactoryTest.php +++ b/pkg/stomp/Tests/Symfony/RabbitMqStompTransportFactoryTest.php @@ -59,7 +59,7 @@ public function testShouldAllowAddConfiguration() 'management_plugin_installed' => false, 'management_plugin_port' => 15672, 'lazy' => true, - 'ssl_on' => false + 'ssl_on' => false, ], $config); } diff --git a/pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php b/pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php index 086143e28..5591c00c0 100644 --- a/pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php +++ b/pkg/stomp/Tests/Symfony/StompTransportFactoryTest.php @@ -55,7 +55,7 @@ public function testShouldAllowAddConfiguration() 'connection_timeout' => 1, 'buffer_size' => 1000, 'lazy' => true, - 'ssl_on' => false + 'ssl_on' => false, ], $config); } From 59bd1454a2477873749b9a00a3e2f78195337e1b Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 19 Apr 2018 08:55:59 +0300 Subject: [PATCH 0031/1142] Release 0.8.26 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35ec16474..2913c58aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## [0.8.26](https://github.com/php-enqueue/enqueue-dev/tree/0.8.26) (2018-04-19) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.25...0.8.26) + +- Allow to enable SSL in StompConnectionFactory [\#427](https://github.com/php-enqueue/enqueue-dev/pull/427) ([arjanvdbos](https://github.com/arjanvdbos)) +- Fix namespace in doc [\#426](https://github.com/php-enqueue/enqueue-dev/pull/426) ([Koc](https://github.com/Koc)) + ## [0.8.25](https://github.com/php-enqueue/enqueue-dev/tree/0.8.25) (2018-04-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.24...0.8.25) From adb635914417a6615536650190ce9e5e289cfc56 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Fri, 20 Apr 2018 08:30:25 +0300 Subject: [PATCH 0032/1142] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0a915c762..59b0ae68e 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ Features: [![Build Status](https://travis-ci.org/php-enqueue/null.png?branch=master)](https://travis-ci.org/php-enqueue/null) [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) + * [the others are comming](https://github.com/php-enqueue/enqueue-dev/issues/284) * [Symfony bundle](docs/bundle/quick_tour.md) * [Magento1 extension](docs/magento/quick_tour.md) * [Magento2 module](docs/magento2/quick_tour.md) From b0de4ea7073dc69c724c5f556f0afc1a0ef1ffc8 Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 10 May 2018 16:40:23 +0200 Subject: [PATCH 0033/1142] [bundle] Fix panel rendering when message body is an object --- .../Resources/views/Profiler/panel.html.twig | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/pkg/enqueue-bundle/Resources/views/Profiler/panel.html.twig b/pkg/enqueue-bundle/Resources/views/Profiler/panel.html.twig index 4d8056826..fd6eafa30 100644 --- a/pkg/enqueue-bundle/Resources/views/Profiler/panel.html.twig +++ b/pkg/enqueue-bundle/Resources/views/Profiler/panel.html.twig @@ -45,20 +45,21 @@ {{ loop.index }} {{ sentMessage.topic|default(null) }} {{ sentMessage.command|default(null) }} - - {% endset %} {% set text %}
Sent messages - {{ collector.sentMessages|length }} + {{ collector.count }}
{% endset %} @@ -20,54 +20,63 @@ {% endblock %} {% block menu %} - + {{ include('@Enqueue/Icon/icon.svg') }} Message Queue {% endblock %} {% block panel %} + {% if collector.count > 0 %}

Sent messages

- {% if collector.sentMessages|length > 0 %} - - - - - - - - - - - - {% for sentMessage in collector.sentMessages %} - - - - - - - {% endfor %} - + {% for clientName, sentMessages in collector.sentMessages %} + {% if sentMessages|length > 0 %} +

Client: {{ clientName }}

+
#TopicCommandMessagePriority
{{ loop.index }}{{ sentMessage.topic|default(null) }}{{ sentMessage.command|default(null) }} - {{ collector.prettyPrintPriority(sentMessage.priority) }} -
+ + + + + + + + + + + + {% for sentMessage in sentMessages %} + + + + + + + + {% endfor %} + -
#TopicCommandMessagePriorityTime
{{ loop.index }}{{ sentMessage.topic|default(null) }}{{ sentMessage.command|default(null) }} + {{ collector.prettyPrintPriority(sentMessage.priority) }} + + {{ sentMessage.sentAt|date('i:s.v') }} +
+ + {% endif %} + {% endfor %} {% else %}

No messages were sent.

diff --git a/pkg/enqueue/Client/TraceableProducer.php b/pkg/enqueue/Client/TraceableProducer.php index 86ff9f8c6..59b0c7b01 100644 --- a/pkg/enqueue/Client/TraceableProducer.php +++ b/pkg/enqueue/Client/TraceableProducer.php @@ -85,6 +85,7 @@ private function collectTrace(string $topic = null, string $command = null, $mes 'timestamp' => null, 'contentType' => null, 'messageId' => null, + 'sentAt' => (new \DateTime())->format('Y-m-d H:i:s.u'), ]; if ($message instanceof Message) { diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php index b50efa545..9a2392d54 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php @@ -107,6 +107,7 @@ public function build(ContainerBuilder $container, array $config, bool $default ; $container->register($this->format('producer'), Producer::class) + ->setPublic(true) ->addArgument($this->reference('driver')) ->addArgument($this->reference('rpc_factory')) ->addArgument($this->reference('client_extensions')) diff --git a/pkg/enqueue/Symfony/MissingComponentFactory.php b/pkg/enqueue/Symfony/MissingComponentFactory.php new file mode 100644 index 000000000..94fcb8339 --- /dev/null +++ b/pkg/enqueue/Symfony/MissingComponentFactory.php @@ -0,0 +1,42 @@ +info($message) + ->beforeNormalization() + ->always(function () { + return []; + }) + ->end() + ->validate() + ->always(function () use ($message) { + throw new \InvalidArgumentException($message); + }) + ->end() + ; + + return $node; + } +} From bc0071dfe822790e7b130d206daaae0098efcb33 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Wed, 14 Nov 2018 15:16:24 +0200 Subject: [PATCH 0406/1142] multi client configuration --- .../DependencyInjection/EnqueueExtension.php | 39 ++++++++++--------- .../Profiler/MessageQueueCollectorTest.php | 2 +- .../Tests/Client/TraceableProducerTest.php | 24 +++++++++--- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 30c4697eb..5108e912c 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -86,11 +86,25 @@ public function load(array $configs, ContainerBuilder $container): void } } + $defaultClient = null; + if (in_array($defaultName, $clientNames, true)) { + $defaultClient = $defaultName; + } + $container->setParameter('enqueue.transports', $transportNames); $container->setParameter('enqueue.clients', $clientNames); + $container->setParameter('enqueue.default_transport', $defaultName); + + if ($defaultClient) { + $container->setParameter('enqueue.default_client', $defaultClient); + } + + if ($defaultClient) { + $this->setupAutowiringForDefaultClientsProcessors($container, $defaultClient); + } + $this->loadMessageQueueCollector($config, $container); - $this->setupAutowiringForProcessors($config, $container); $this->loadAsyncCommands($config, $container); // extensions @@ -167,31 +181,18 @@ private function registerJobQueueDoctrineEntityMapping(ContainerBuilder $contain } } - private function setupAutowiringForProcessors(array $config, ContainerBuilder $container) + private function setupAutowiringForDefaultClientsProcessors(ContainerBuilder $container, string $defaultClient) { - $configNames = []; - foreach ($config as $name => $modules) { - if (isset($modules['client'])) { - $configNames[] = $name; - } - } - - if (false == $configNames) { - return; - } - - $topicSubscriber = $container->registerForAutoconfiguration(TopicSubscriberInterface::class) + $container->registerForAutoconfiguration(TopicSubscriberInterface::class) ->setPublic(true) + ->addTag('enqueue.topic_subscriber', ['client' => $defaultClient]) ; - $commandSubscriber = $container->registerForAutoconfiguration(CommandSubscriberInterface::class) + $container->registerForAutoconfiguration(CommandSubscriberInterface::class) ->setPublic(true) + ->addTag('enqueue.command_subscriber', ['client' => $defaultClient]) ; - foreach ($configNames as $configName) { - $topicSubscriber->addTag('enqueue.topic_subscriber', ['client' => $configName]); - $commandSubscriber->addTag('enqueue.command_subscriber', ['client' => $configName]); - } } private function loadDoctrinePingConnectionExtension(array $config, ContainerBuilder $container): void diff --git a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php index d8bfa0996..4ad12f718 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php @@ -58,7 +58,7 @@ public function testShouldReturnSentMessageArrayTakenFromTraceableProducers() $collector->collect(new Request(), new Response()); - $this->assertEquals( + $this->assertArraySubset( [ 'foo' => [ [ diff --git a/pkg/enqueue/Tests/Client/TraceableProducerTest.php b/pkg/enqueue/Tests/Client/TraceableProducerTest.php index 82364cacc..f58413df0 100644 --- a/pkg/enqueue/Tests/Client/TraceableProducerTest.php +++ b/pkg/enqueue/Tests/Client/TraceableProducerTest.php @@ -45,7 +45,7 @@ public function testShouldCollectInfoIfStringGivenAsEventMessage() $producer->sendEvent('aFooTopic', 'aFooBody'); - $this->assertSame([ + $this->assertArraySubset([ [ 'topic' => 'aFooTopic', 'command' => null, @@ -60,6 +60,8 @@ public function testShouldCollectInfoIfStringGivenAsEventMessage() 'messageId' => null, ], ], $producer->getTraces()); + + $this->assertArrayHasKey('sentAt', $producer->getTraces()[0]); } public function testShouldCollectInfoIfArrayGivenAsEventMessage() @@ -68,7 +70,7 @@ public function testShouldCollectInfoIfArrayGivenAsEventMessage() $producer->sendEvent('aFooTopic', ['foo' => 'fooVal', 'bar' => 'barVal']); - $this->assertSame([ + $this->assertArraySubset([ [ 'topic' => 'aFooTopic', 'command' => null, @@ -83,6 +85,8 @@ public function testShouldCollectInfoIfArrayGivenAsEventMessage() 'messageId' => null, ], ], $producer->getTraces()); + + $this->assertArrayHasKey('sentAt', $producer->getTraces()[0]); } public function testShouldCollectInfoIfEventMessageObjectGivenAsMessage() @@ -102,7 +106,7 @@ public function testShouldCollectInfoIfEventMessageObjectGivenAsMessage() $producer->sendEvent('aFooTopic', $message); - $this->assertSame([ + $this->assertArraySubset([ [ 'topic' => 'aFooTopic', 'command' => null, @@ -117,6 +121,8 @@ public function testShouldCollectInfoIfEventMessageObjectGivenAsMessage() 'messageId' => 'theMessageId', ], ], $producer->getTraces()); + + $this->assertArrayHasKey('sentAt', $producer->getTraces()[0]); } public function testShouldNotStoreAnythingIfInternalEventMessageProducerThrowsException() @@ -162,7 +168,7 @@ public function testShouldCollectInfoIfStringGivenAsCommandMessage() $producer->sendCommand('aFooCommand', 'aFooBody'); - $this->assertSame([ + $this->assertArraySubset([ [ 'topic' => null, 'command' => 'aFooCommand', @@ -177,6 +183,8 @@ public function testShouldCollectInfoIfStringGivenAsCommandMessage() 'messageId' => null, ], ], $producer->getTraces()); + + $this->assertArrayHasKey('sentAt', $producer->getTraces()[0]); } public function testShouldCollectInfoIfArrayGivenAsCommandMessage() @@ -185,7 +193,7 @@ public function testShouldCollectInfoIfArrayGivenAsCommandMessage() $producer->sendCommand('aFooCommand', ['foo' => 'fooVal', 'bar' => 'barVal']); - $this->assertSame([ + $this->assertArraySubset([ [ 'topic' => null, 'command' => 'aFooCommand', @@ -200,6 +208,8 @@ public function testShouldCollectInfoIfArrayGivenAsCommandMessage() 'messageId' => null, ], ], $producer->getTraces()); + + $this->assertArrayHasKey('sentAt', $producer->getTraces()[0]); } public function testShouldCollectInfoIfCommandMessageObjectGivenAsMessage() @@ -219,7 +229,7 @@ public function testShouldCollectInfoIfCommandMessageObjectGivenAsMessage() $producer->sendCommand('aFooCommand', $message); - $this->assertSame([ + $this->assertArraySubset([ [ 'topic' => null, 'command' => 'aFooCommand', @@ -234,6 +244,8 @@ public function testShouldCollectInfoIfCommandMessageObjectGivenAsMessage() 'messageId' => 'theMessageId', ], ], $producer->getTraces()); + + $this->assertArrayHasKey('sentAt', $producer->getTraces()[0]); } public function testShouldNotStoreAnythingIfInternalCommandMessageProducerThrowsException() From 3e4d486e217860235bcc721be2f7522ff1727e07 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 09:49:48 +0200 Subject: [PATCH 0407/1142] multi client configuration --- .../DependencyInjection/EnqueueExtension.php | 2 +- .../Resources/config/services.yml | 5 ++++ pkg/enqueue/Symfony/Client/ConsumeCommand.php | 13 +++++++-- pkg/enqueue/Symfony/Client/ProduceCommand.php | 14 +++++++--- pkg/enqueue/Symfony/Client/RoutesCommand.php | 14 +++++++--- .../Symfony/Client/SetupBrokerCommand.php | 14 +++++++--- .../ConfigurableConsumeCommand.php | 13 +++++++-- .../Tests/Client/TraceableProducerTest.php | 2 +- .../Symfony/Client/ConsumeCommandTest.php | 28 +++++++++---------- .../Symfony/Client/ProduceCommandTest.php | 22 +++++++-------- .../Symfony/Client/RoutesCommandTest.php | 28 +++++++++---------- .../Symfony/Client/SetupBrokerCommandTest.php | 16 +++++------ .../ConfigurableConsumeCommandTest.php | 20 ++++++------- 13 files changed, 114 insertions(+), 77 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 5108e912c..fec801b17 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -320,7 +320,7 @@ private function loadMessageQueueCollector(array $config, ContainerBuilder $cont $service = $container->register('enqueue.profiler.message_queue_collector', MessageQueueCollector::class); $service->addTag('data_collector', [ 'template' => '@Enqueue/Profiler/panel.html.twig', - 'id' => 'enqueue.message_queue' + 'id' => 'enqueue.message_queue', ]); foreach ($configNames as $configName) { diff --git a/pkg/enqueue-bundle/Resources/config/services.yml b/pkg/enqueue-bundle/Resources/config/services.yml index d63a4e89f..a207569c0 100644 --- a/pkg/enqueue-bundle/Resources/config/services.yml +++ b/pkg/enqueue-bundle/Resources/config/services.yml @@ -9,6 +9,7 @@ services: class: 'Enqueue\Symfony\Consumption\ConfigurableConsumeCommand' arguments: - '@enqueue.locator' + - '%enqueue.default_transport%' - 'enqueue.transport.%s.queue_consumer' - 'enqueue.transport.%s.processor_registry' tags: @@ -18,6 +19,7 @@ services: class: 'Enqueue\Symfony\Client\ConsumeCommand' arguments: - '@enqueue.locator' + - '%enqueue.default_client%' - 'enqueue.client.%s.queue_consumer' - 'enqueue.client.%s.driver' - 'enqueue.client.%s.delegate_processor' @@ -28,6 +30,7 @@ services: class: 'Enqueue\Symfony\Client\ProduceCommand' arguments: - '@enqueue.locator' + - '%enqueue.default_client%' - 'enqueue.client.%s.producer' tags: - { name: 'console.command' } @@ -36,6 +39,7 @@ services: class: 'Enqueue\Symfony\Client\SetupBrokerCommand' arguments: - '@enqueue.locator' + - '%enqueue.default_client%' - 'enqueue.client.%s.driver' tags: - { name: 'console.command' } @@ -44,6 +48,7 @@ services: class: 'Enqueue\Symfony\Client\RoutesCommand' arguments: - '@enqueue.locator' + - '%enqueue.default_client%' - 'enqueue.client.%s.driver' tags: - { name: 'console.command' } diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index cc1e46cf9..e6b25fc4f 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -34,6 +34,11 @@ class ConsumeCommand extends Command */ private $container; + /** + * @var string + */ + private $defaultClient; + /** * @var string */ @@ -51,16 +56,18 @@ class ConsumeCommand extends Command public function __construct( ContainerInterface $container, + string $defaultClient, string $queueConsumerIdPattern = 'enqueue.client.%s.queue_consumer', string $driverIdPattern = 'enqueue.client.%s.driver', string $processorIdPatter = 'enqueue.client.%s.delegate_processor' ) { - parent::__construct(self::$defaultName); - $this->container = $container; + $this->defaultClient = $defaultClient; $this->queueConsumerIdPattern = $queueConsumerIdPattern; $this->driverIdPattern = $driverIdPattern; $this->processorIdPattern = $processorIdPatter; + + parent::__construct(self::$defaultName); } protected function configure(): void @@ -77,7 +84,7 @@ protected function configure(): void 'It select an appropriate message processor based on a message headers') ->addArgument('client-queue-names', InputArgument::IS_ARRAY, 'Queues to consume messages from') ->addOption('skip', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL, 'Queues to skip consumption of messages from', []) - ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', 'default') + ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', $this->defaultClient) ; } diff --git a/pkg/enqueue/Symfony/Client/ProduceCommand.php b/pkg/enqueue/Symfony/Client/ProduceCommand.php index 302b344c7..61be6a87d 100644 --- a/pkg/enqueue/Symfony/Client/ProduceCommand.php +++ b/pkg/enqueue/Symfony/Client/ProduceCommand.php @@ -20,17 +20,23 @@ class ProduceCommand extends Command */ private $container; + /** + * @var string + */ + private $defaultClient; + /** * @var string */ private $producerIdPattern; - public function __construct(ContainerInterface $container, string $producerIdPattern = 'enqueue.client.%s.producer') + public function __construct(ContainerInterface $container, string $defaultClient, string $producerIdPattern = 'enqueue.client.%s.producer') { - parent::__construct(static::$defaultName); - $this->container = $container; + $this->defaultClient = $defaultClient; $this->producerIdPattern = $producerIdPattern; + + parent::__construct(static::$defaultName); } protected function configure(): void @@ -38,7 +44,7 @@ protected function configure(): void $this ->setDescription('Sends an event to the topic') ->addArgument('message', InputArgument::REQUIRED, 'A message') - ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', 'default') + ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', $this->defaultClient) ->addOption('topic', null, InputOption::VALUE_OPTIONAL, 'The topic to send a message to') ->addOption('command', null, InputOption::VALUE_OPTIONAL, 'The command to send a message to') ; diff --git a/pkg/enqueue/Symfony/Client/RoutesCommand.php b/pkg/enqueue/Symfony/Client/RoutesCommand.php index 82bcacf19..04d404d85 100644 --- a/pkg/enqueue/Symfony/Client/RoutesCommand.php +++ b/pkg/enqueue/Symfony/Client/RoutesCommand.php @@ -22,6 +22,11 @@ class RoutesCommand extends Command */ private $container; + /** + * @var string + */ + private $defaultClient; + /** * @var string */ @@ -32,12 +37,13 @@ class RoutesCommand extends Command */ private $driver; - public function __construct(ContainerInterface $container, string $driverIdPatter = 'enqueue.client.%s.driver') + public function __construct(ContainerInterface $container, string $defaultClient, string $driverIdPatter = 'enqueue.client.%s.driver') { - parent::__construct(static::$defaultName); - $this->container = $container; + $this->defaultClient = $defaultClient; $this->driverIdPatter = $driverIdPatter; + + parent::__construct(static::$defaultName); } protected function configure(): void @@ -46,7 +52,7 @@ protected function configure(): void ->setAliases(['debug:enqueue:routes']) ->setDescription('A command lists all registered routes.') ->addOption('show-route-options', null, InputOption::VALUE_NONE, 'Adds ability to hide options.') - ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', 'default') + ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', $this->defaultClient) ; $this->driver = null; diff --git a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php index 4a4f322ec..72215a8ba 100644 --- a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php +++ b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php @@ -20,17 +20,23 @@ class SetupBrokerCommand extends Command */ private $container; + /** + * @var string + */ + private $defaultClient; + /** * @var string */ private $driverIdPattern; - public function __construct(ContainerInterface $container, string $driverIdPattern = 'enqueue.client.%s.driver') + public function __construct(ContainerInterface $container, string $defaultClient, string $driverIdPattern = 'enqueue.client.%s.driver') { - parent::__construct(static::$defaultName); - $this->container = $container; + $this->defaultClient = $defaultClient; $this->driverIdPattern = $driverIdPattern; + + parent::__construct(static::$defaultName); } protected function configure(): void @@ -38,7 +44,7 @@ protected function configure(): void $this ->setAliases(['enq:sb']) ->setDescription('Setup broker. Configure the broker, creates queues, topics and so on.') - ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', 'default') + ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', $this->defaultClient) ; } diff --git a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php index 68ae6dae2..9c47134a0 100644 --- a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php @@ -27,6 +27,11 @@ class ConfigurableConsumeCommand extends Command */ private $container; + /** + * @var string + */ + private $defaultTransport; + /** * @var string */ @@ -39,14 +44,16 @@ class ConfigurableConsumeCommand extends Command public function __construct( ContainerInterface $container, + string $defaultTransport, string $queueConsumerIdPattern = 'enqueue.transport.%s.queue_consumer', string $processorRegistryIdPattern = 'enqueue.transport.%s.processor_registry' ) { - parent::__construct(static::$defaultName); - $this->container = $container; + $this->defaultTransport = $defaultTransport; $this->queueConsumerIdPattern = $queueConsumerIdPattern; $this->processorRegistryIdPattern = $processorRegistryIdPattern; + + parent::__construct(static::$defaultName); } protected function configure(): void @@ -61,7 +68,7 @@ protected function configure(): void 'and a message processor service') ->addArgument('processor', InputArgument::REQUIRED, 'A message processor.') ->addArgument('queues', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'A queue to consume from', []) - ->addOption('transport', 't', InputOption::VALUE_OPTIONAL, 'The transport to consume messages from.', 'default') + ->addOption('transport', 't', InputOption::VALUE_OPTIONAL, 'The transport to consume messages from.', $this->defaultTransport) ; } diff --git a/pkg/enqueue/Tests/Client/TraceableProducerTest.php b/pkg/enqueue/Tests/Client/TraceableProducerTest.php index f58413df0..b25b7c18b 100644 --- a/pkg/enqueue/Tests/Client/TraceableProducerTest.php +++ b/pkg/enqueue/Tests/Client/TraceableProducerTest.php @@ -60,7 +60,7 @@ public function testShouldCollectInfoIfStringGivenAsEventMessage() 'messageId' => null, ], ], $producer->getTraces()); - + $this->assertArrayHasKey('sentAt', $producer->getTraces()[0]); } diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 3b6feb662..9a45d424d 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -34,19 +34,19 @@ public function testShouldNotBeFinal() public function testCouldBeConstructedWithRequiredAttributes() { - new ConsumeCommand($this->createMock(ContainerInterface::class)); + new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); } public function testShouldHaveCommandName() { - $command = new ConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $this->assertEquals('enqueue:consume', $command->getName()); } public function testShouldHaveExpectedOptions() { - $command = new ConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $options = $command->getDefinition()->getOptions(); @@ -64,7 +64,7 @@ public function testShouldHaveExpectedOptions() public function testShouldHaveExpectedAttributes() { - $command = new ConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $arguments = $command->getDefinition()->getArguments(); @@ -104,7 +104,7 @@ public function testShouldBindDefaultQueueOnly() 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([]); @@ -164,7 +164,7 @@ public function testShouldUseRequestedClient() 'enqueue.client.foo.queue_consumer' => $fooConsumer, 'enqueue.client.foo.driver' => $fooDriver, 'enqueue.client.foo.delegate_processor' => $fooProcessor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -198,7 +198,7 @@ public function testThrowIfNotDefinedClientRequested() 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -243,7 +243,7 @@ public function testShouldBindDefaultQueueIfRouteUseDifferentQueue() 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([]); @@ -295,7 +295,7 @@ public function testShouldBindCustomExecuteConsumptionAndUseCustomClientDestinat 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([]); @@ -336,7 +336,7 @@ public function testShouldBindUserProvidedQueues() 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -378,7 +378,7 @@ public function testShouldBindNotPrefixedQueue() 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -434,7 +434,7 @@ public function testShouldBindQueuesOnlyOnce() 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([]); @@ -475,7 +475,7 @@ public function testShouldNotBindExternalRoutes() 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([]); @@ -528,7 +528,7 @@ public function testShouldSkipQueueConsumptionAndUseCustomClientDestinationName( 'enqueue.client.default.queue_consumer' => $consumer, 'enqueue.client.default.driver' => $driver, 'enqueue.client.default.delegate_processor' => $processor, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ diff --git a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php index 321b4eebd..8e9b750a3 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php @@ -27,19 +27,19 @@ public function testShouldNotBeFinal() public function testCouldBeConstructedWithContainerAsFirstArgument() { - new ProduceCommand($this->createMock(ContainerInterface::class)); + new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); } public function testShouldHaveCommandName() { - $command = new ProduceCommand($this->createMock(ContainerInterface::class)); + $command = new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); $this->assertEquals('enqueue:produce', $command->getName()); } public function testShouldHaveExpectedOptions() { - $command = new ProduceCommand($this->createMock(ContainerInterface::class)); + $command = new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); $options = $command->getDefinition()->getOptions(); $this->assertCount(3, $options); @@ -50,7 +50,7 @@ public function testShouldHaveExpectedOptions() public function testShouldHaveExpectedAttributes() { - $command = new ProduceCommand($this->createMock(ContainerInterface::class)); + $command = new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); $arguments = $command->getDefinition()->getArguments(); $this->assertCount(1, $arguments); @@ -72,7 +72,7 @@ public function testThrowIfNeitherTopicNorCommandOptionsAreSet() $command = new ProduceCommand(new Container([ 'enqueue.client.default.producer' => $producerMock, - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -97,7 +97,7 @@ public function testThrowIfBothTopicAndCommandOptionsAreSet() $command = new ProduceCommand(new Container([ 'enqueue.client.default.producer' => $producerMock, - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -125,7 +125,7 @@ public function testShouldSendEventToDefaultTransport() $command = new ProduceCommand(new Container([ 'enqueue.client.default.producer' => $producerMock, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -149,7 +149,7 @@ public function testShouldSendCommandToDefaultTransport() $command = new ProduceCommand(new Container([ 'enqueue.client.default.producer' => $producerMock, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -184,7 +184,7 @@ public function testShouldSendEventToFooTransport() $command = new ProduceCommand(new Container([ 'enqueue.client.default.producer' => $defaultProducerMock, 'enqueue.client.foo.producer' => $fooProducerMock, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -220,7 +220,7 @@ public function testShouldSendCommandToFooTransport() $command = new ProduceCommand(new Container([ 'enqueue.client.default.producer' => $defaultProducerMock, 'enqueue.client.foo.producer' => $fooProducerMock, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -244,7 +244,7 @@ public function testThrowIfClientNotFound() $command = new ProduceCommand(new Container([ 'enqueue.client.default.producer' => $defaultProducerMock, - ])); + ]), 'default'); $tester = new CommandTester($command); diff --git a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php index daab37e1c..0ed73ef1e 100644 --- a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php @@ -30,26 +30,26 @@ public function testShouldNotBeFinal() public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() { - new RoutesCommand($this->createMock(ContainerInterface::class)); + new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); } public function testShouldHaveCommandName() { - $command = new RoutesCommand($this->createMock(ContainerInterface::class)); + $command = new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); $this->assertEquals('enqueue:routes', $command->getName()); } public function testShouldHaveCommandAliases() { - $command = new RoutesCommand($this->createMock(ContainerInterface::class)); + $command = new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); $this->assertEquals(['debug:enqueue:routes'], $command->getAliases()); } public function testShouldHaveExpectedOptions() { - $command = new RoutesCommand($this->createMock(ContainerInterface::class)); + $command = new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); $options = $command->getDefinition()->getOptions(); $this->assertCount(2, $options); @@ -60,7 +60,7 @@ public function testShouldHaveExpectedOptions() public function testShouldHaveExpectedAttributes() { - $command = new RoutesCommand($this->createMock(ContainerInterface::class)); + $command = new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); $arguments = $command->getDefinition()->getArguments(); $this->assertCount(0, $arguments); @@ -72,7 +72,7 @@ public function testShouldOutputEmptyRouteCollection() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $this->createDriverStub(Config::create(), $routeCollection), - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -109,7 +109,7 @@ public function testShouldUseFooDriver() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $defaultDriverMock, 'enqueue.client.foo.driver' => $fooDriverMock, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -134,7 +134,7 @@ public function testThrowIfClientNotFound() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $defaultDriverMock, - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -154,7 +154,7 @@ public function testShouldOutputTopicRouteInfo() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $this->createDriverStub(Config::create(), $routeCollection), - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -184,7 +184,7 @@ public function testShouldOutputCommandRouteInfo() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $this->createDriverStub(Config::create(), $routeCollection), - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -214,7 +214,7 @@ public function testShouldCorrectlyOutputPrefixedCustomQueue() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $this->createDriverStub(Config::create(), $routeCollection), - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -245,7 +245,7 @@ public function testShouldCorrectlyOutputNotPrefixedCustomQueue() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $this->createDriverStub(Config::create(), $routeCollection), - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -275,7 +275,7 @@ public function testShouldCorrectlyOutputExternalRoute() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $this->createDriverStub(Config::create(), $routeCollection), - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -305,7 +305,7 @@ public function testShouldOutputRouteOptions() $command = new RoutesCommand(new Container([ 'enqueue.client.default.driver' => $this->createDriverStub(Config::create(), $routeCollection), - ])); + ]), 'default'); $tester = new CommandTester($command); diff --git a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php index b81daf2b3..4bbaf5534 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php @@ -27,26 +27,26 @@ public function testShouldNotBeFinal() public function testCouldBeConstructedWithContainerAsFirstArgument() { - new SetupBrokerCommand($this->createMock(ContainerInterface::class)); + new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); } public function testShouldHaveCommandName() { - $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class)); + $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); $this->assertEquals('enqueue:setup-broker', $command->getName()); } public function testShouldHaveCommandAliases() { - $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class)); + $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); $this->assertEquals(['enq:sb'], $command->getAliases()); } public function testShouldHaveExpectedOptions() { - $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class)); + $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); $options = $command->getDefinition()->getOptions(); @@ -56,7 +56,7 @@ public function testShouldHaveExpectedOptions() public function testShouldHaveExpectedAttributes() { - $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class)); + $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); $arguments = $command->getDefinition()->getArguments(); @@ -73,7 +73,7 @@ public function testShouldCallDriverSetupBrokerMethod() $command = new SetupBrokerCommand(new Container([ 'enqueue.client.default.driver' => $driver, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([]); @@ -98,7 +98,7 @@ public function testShouldCallRequestedClientDriverSetupBrokerMethod() $command = new SetupBrokerCommand(new Container([ 'enqueue.client.default.driver' => $defaultDriver, 'enqueue.client.foo.driver' => $fooDriver, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -118,7 +118,7 @@ public function testShouldThrowIfClientNotFound() $command = new SetupBrokerCommand(new Container([ 'enqueue.client.default.driver' => $defaultDriver, - ])); + ]), 'default'); $tester = new CommandTester($command); diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index b402960ac..4586849de 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -34,19 +34,19 @@ public function testShouldNotBeFinal() public function testCouldBeConstructedWithRequiredAttributes() { - new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class)); + new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class), 'default'); } public function testShouldHaveCommandName() { - $command = new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $this->assertEquals('enqueue:transport:consume', $command->getName()); } public function testShouldHaveExpectedOptions() { - $command = new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $options = $command->getDefinition()->getOptions(); @@ -62,7 +62,7 @@ public function testShouldHaveExpectedOptions() public function testShouldHaveExpectedAttributes() { - $command = new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $arguments = $command->getDefinition()->getArguments(); @@ -88,7 +88,7 @@ public function testThrowIfNeitherQueueOptionNorProcessorImplementsQueueSubscrib $command = new ConfigurableConsumeCommand(new Container([ 'enqueue.transport.default.queue_consumer' => $consumer, 'enqueue.transport.default.processor_registry' => new ArrayProcessorRegistry(['aProcessor' => $processor]), - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -118,7 +118,7 @@ public function testShouldExecuteConsumptionWithExplicitlySetQueue() $command = new ConfigurableConsumeCommand(new Container([ 'enqueue.transport.default.queue_consumer' => $consumer, 'enqueue.transport.default.processor_registry' => new ArrayProcessorRegistry(['processor-service' => $processor]), - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -144,7 +144,7 @@ public function testThrowIfTransportNotDefined() $command = new ConfigurableConsumeCommand(new Container([ 'enqueue.transport.default.queue_consumer' => $consumer, 'enqueue.transport.default.processor_registry' => new ArrayProcessorRegistry(['processor-service' => $processor]), - ])); + ]), 'default'); $tester = new CommandTester($command); @@ -181,7 +181,7 @@ public function testShouldExecuteConsumptionWithSeveralCustomQueues() $command = new ConfigurableConsumeCommand(new Container([ 'enqueue.transport.default.queue_consumer' => $consumer, 'enqueue.transport.default.processor_registry' => new ArrayProcessorRegistry(['processor-service' => $processor]), - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -223,7 +223,7 @@ public static function getSubscribedQueues() $command = new ConfigurableConsumeCommand(new Container([ 'enqueue.transport.default.queue_consumer' => $consumer, 'enqueue.transport.default.processor_registry' => new ArrayProcessorRegistry(['processor-service' => $processor]), - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ @@ -263,7 +263,7 @@ public function testShouldExecuteConsumptionWithCustomTransportExplicitlySetQueu 'enqueue.transport.foo.processor_registry' => new ArrayProcessorRegistry(['processor-service' => $processor]), 'enqueue.transport.bar.queue_consumer' => $barConsumer, 'enqueue.transport.bar.processor_registry' => new ArrayProcessorRegistry(['processor-service' => $processor]), - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([ From 6a84f65cbfe991f73570b1812da251ee3aae6a6c Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 09:59:55 +0200 Subject: [PATCH 0408/1142] multi client configuration --- .../Symfony/Consumption/ConsumeCommand.php | 17 +++++++++-------- .../Symfony/Consumption/ConsumeCommandTest.php | 14 +++++++------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index 632a7de17..e65acc314 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -27,19 +27,20 @@ class ConsumeCommand extends Command /** * @var string */ - private $queueConsumerIdPattern; + private $defaultTransport; /** - * [name => QueueConsumerInterface]. - * - * @param QueueConsumerInterface[] + * @var string */ - public function __construct(ContainerInterface $container, string $queueConsumerIdPattern = 'enqueue.transport.%s.queue_consumer') - { - parent::__construct(static::$defaultName); + private $queueConsumerIdPattern; + public function __construct(ContainerInterface $container, string $defaultTransport, string $queueConsumerIdPattern = 'enqueue.transport.%s.queue_consumer') + { $this->container = $container; + $this->defaultTransport = $defaultTransport; $this->queueConsumerIdPattern = $queueConsumerIdPattern; + + parent::__construct(static::$defaultName); } protected function configure(): void @@ -49,7 +50,7 @@ protected function configure(): void $this->configureLoggerExtension(); $this - ->addOption('transport', 't', InputOption::VALUE_OPTIONAL, 'The transport to consume messages from.', 'default') + ->addOption('transport', 't', InputOption::VALUE_OPTIONAL, 'The transport to consume messages from.', $this->defaultTransport) ->setDescription('A worker that consumes message from a broker. '. 'To use this broker you have to configure queue consumer before adding to the command') ; diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index a8ead2d8e..6396568cb 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -28,19 +28,19 @@ public function testShouldNotBeFinal() public function testCouldBeConstructedWithRequiredAttributes() { - new ConsumeCommand($this->createMock(ContainerInterface::class)); + new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); } public function testShouldHaveCommandName() { - $command = new ConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $this->assertEquals('enqueue:transport:consume', $command->getName()); } public function testShouldHaveExpectedOptions() { - $command = new ConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $options = $command->getDefinition()->getOptions(); @@ -56,7 +56,7 @@ public function testShouldHaveExpectedOptions() public function testShouldHaveExpectedAttributes() { - $command = new ConsumeCommand($this->createMock(ContainerInterface::class)); + $command = new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); $arguments = $command->getDefinition()->getArguments(); @@ -74,7 +74,7 @@ public function testShouldExecuteDefaultConsumption() $command = new ConsumeCommand(new Container([ 'enqueue.transport.default.queue_consumer' => $consumer, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute([]); @@ -98,7 +98,7 @@ public function testShouldExecuteCustomConsumption() $command = new ConsumeCommand(new Container([ 'enqueue.transport.default.queue_consumer' => $defaultConsumer, 'enqueue.transport.custom.queue_consumer' => $customConsumer, - ])); + ]), 'default'); $tester = new CommandTester($command); $tester->execute(['--transport' => 'custom']); @@ -114,7 +114,7 @@ public function testThrowIfNotDefinedTransportRequested() $command = new ConsumeCommand(new Container([ 'enqueue.transport.default.queue_consumer' => $defaultConsumer, - ])); + ]), 'default'); $tester = new CommandTester($command); From 39bcab2532bde5d5d459b213c63503e5e1b51135 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 10:04:21 +0200 Subject: [PATCH 0409/1142] multi client configuration --- pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index fec801b17..81c356688 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -192,7 +192,6 @@ private function setupAutowiringForDefaultClientsProcessors(ContainerBuilder $co ->setPublic(true) ->addTag('enqueue.command_subscriber', ['client' => $defaultClient]) ; - } private function loadDoctrinePingConnectionExtension(array $config, ContainerBuilder $container): void From a4f5524d8d4bdb75de9735a3a1436936e229e330 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 10:19:24 +0200 Subject: [PATCH 0410/1142] multi client configuration --- .../DependencyInjection/Configuration.php | 26 ------ .../DependencyInjection/ConfigurationTest.php | 80 +++---------------- 2 files changed, 10 insertions(+), 96 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 4569500ae..260a50e9e 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -24,32 +24,6 @@ public function getConfigTreeBuilder(): TreeBuilder { $tb = new TreeBuilder(); $rootNode = $tb->root('enqueue'); - $rootNode - ->beforeNormalization() - ->always(function ($value) { - if (empty($value)) { - return [ - 'default' => [ - 'transport' => [ - 'dsn' => 'null:', - ], - ], - ]; - } - - if (is_string($value)) { - return [ - 'default' => [ - 'transport' => [ - 'dsn' => $value, - ], - ], - ]; - } - - return $value; - }) - ; $rootNode ->requiresAtLeastOneElement() diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index baff83925..1b95fb6f2 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -28,48 +28,6 @@ public function testCouldBeConstructedWithDebugAsArgument() new Configuration(true); } - public function testShouldProcessNullAsDefaultNullTransport() - { - $configuration = new Configuration(true); - - $processor = new Processor(); - $config = $processor->processConfiguration($configuration, [null]); - - $this->assertConfigEquals([ - 'default' => [ - 'transport' => ['dsn' => 'null:'], - ], - ], $config); - } - - public function testShouldProcessStringAsDefaultDsnTransport() - { - $configuration = new Configuration(true); - - $processor = new Processor(); - $config = $processor->processConfiguration($configuration, ['foo://bar?option=val']); - - $this->assertConfigEquals([ - 'default' => [ - 'transport' => ['dsn' => 'foo://bar?option=val'], - ], - ], $config); - } - - public function testShouldProcessEmptyArrayAsDefaultNullTransport() - { - $configuration = new Configuration(true); - - $processor = new Processor(); - $config = $processor->processConfiguration($configuration, [[]]); - - $this->assertConfigEquals([ - 'default' => [ - 'transport' => ['dsn' => 'null:'], - ], - ], $config); - } - public function testShouldProcessSeveralTransports() { $configuration = new Configuration(true); @@ -118,32 +76,6 @@ public function testTransportFactoryShouldValidateEachTransportAccordingToItsRul ]); } - public function testShouldUseDefaultConfigurationIfNothingIsConfiguredAtAll() - { - $configuration = new Configuration(true); - - $processor = new Processor(); - $config = $processor->processConfiguration($configuration, [[]]); - - $this->assertEquals([ - 'default' => [ - 'transport' => ['dsn' => 'null:'], - 'consumption' => [ - 'receive_timeout' => 10000, - ], -// 'job' => false, -// 'async_events' => ['enabled' => false], - 'async_commands' => ['enabled' => false], - 'extensions' => [ - 'doctrine_ping_connection_extension' => false, - 'doctrine_clear_identity_map_extension' => false, - 'signal_extension' => function_exists('pcntl_signal_dispatch'), - 'reply_extension' => true, - ], - ], - ], $config); - } - public function testShouldSetDefaultConfigurationForClient() { $configuration = new Configuration(true); @@ -264,7 +196,11 @@ public function testDoctrinePingConnectionExtensionShouldBeDisabledByDefault() $configuration = new Configuration(true); $processor = new Processor(); - $config = $processor->processConfiguration($configuration, [[]]); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => null, + ] + ]]); $this->assertArraySubset([ 'default' => [ @@ -303,7 +239,11 @@ public function testDoctrineClearIdentityMapExtensionShouldBeDisabledByDefault() $configuration = new Configuration(true); $processor = new Processor(); - $config = $processor->processConfiguration($configuration, [[]]); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => null, + ] + ]]); $this->assertArraySubset([ 'default' => [ From cec8fb35924dfeff911a751ae67cd845305f0901 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 10:27:20 +0200 Subject: [PATCH 0411/1142] multi client configuration --- .../DependencyInjection/EnqueueExtensionTest.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index bb1918b01..9fd7c2e98 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -41,7 +41,11 @@ public function testShouldRegisterConnectionFactory() $extension = new EnqueueExtension(); - $extension->load([[]], $container); + $extension->load([[ + 'default' => [ + 'transport' => null, + ], + ]], $container); self::assertTrue($container->hasDefinition('enqueue.transport.default.connection_factory')); self::assertNotEmpty($container->getDefinition('enqueue.transport.default.connection_factory')->getFactory()); @@ -53,7 +57,11 @@ public function testShouldRegisterContext() $extension = new EnqueueExtension(); - $extension->load([[]], $container); + $extension->load([[ + 'default' => [ + 'transport' => null, + ], + ]], $container); self::assertTrue($container->hasDefinition('enqueue.transport.default.context')); self::assertNotEmpty($container->getDefinition('enqueue.transport.default.context')->getFactory()); From 8b44199988e8cdc694984b90fd07823d6614fb39 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 10:34:25 +0200 Subject: [PATCH 0412/1142] multi client configuration --- .../Tests/Unit/DependencyInjection/ConfigurationTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index 1b95fb6f2..b735bda14 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -199,7 +199,7 @@ public function testDoctrinePingConnectionExtensionShouldBeDisabledByDefault() $config = $processor->processConfiguration($configuration, [[ 'default' => [ 'transport' => null, - ] + ], ]]); $this->assertArraySubset([ @@ -242,7 +242,7 @@ public function testDoctrineClearIdentityMapExtensionShouldBeDisabledByDefault() $config = $processor->processConfiguration($configuration, [[ 'default' => [ 'transport' => null, - ] + ], ]]); $this->assertArraySubset([ From 135193093896ff0b7b1f7b31b6a89923496fb22b Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 11:17:23 +0200 Subject: [PATCH 0413/1142] multi client configuration --- docs/bundle/async_commands.md | 3 +- docs/bundle/async_events.md | 9 ++-- docs/bundle/config_reference.md | 74 +++++++++++++++---------------- docs/bundle/debugging.md | 5 ++- docs/bundle/functional_testing.md | 10 +++-- docs/bundle/job_queue.md | 7 +-- docs/bundle/quick_tour.md | 5 ++- 7 files changed, 59 insertions(+), 54 deletions(-) diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md index 51f60532d..21299911c 100644 --- a/docs/bundle/async_commands.md +++ b/docs/bundle/async_commands.md @@ -21,7 +21,8 @@ $ composer require enqueue/async-command:0.9.x-dev # config/packages/enqueue_async_commands.yaml enqueue: - async_commands: true + default: + async_commands: true ``` ## Usage diff --git a/docs/bundle/async_events.md b/docs/bundle/async_events.md index e70f41d7f..7c20381bc 100644 --- a/docs/bundle/async_events.md +++ b/docs/bundle/async_events.md @@ -31,10 +31,11 @@ If you already [installed the bundle](quick_tour.md#install), then enable `async # app/config/config.yml enqueue: - async_events: - enabled: true - # if you'd like to send send messages onTerminate use spool_producer (it further reduces response time): - # spool_producer: true + default: + async_events: + enabled: true + # if you'd like to send send messages onTerminate use spool_producer (it further reduces response time): + # spool_producer: true ``` ## Usage diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index 346372c77..9118a8f9c 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -14,44 +14,42 @@ You can get this info by running `./bin/console config:dump-reference enqueue` c ```yaml # Default configuration for extension with alias: "enqueue" enqueue: - - # The transport option could accept a string DSN, an array with DSN key, or null. It accept extra options. To find out what option you can set, look at connection factory constructor docblock. - transport: - - # The broker DSN. These schemes are supported: "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb", to use these "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb" you have to install a package. - dsn: ~ # Required - - # The connection factory class should implement "Interop\Queue\ConnectionFactory" interface - connection_factory_class: ~ - - # The factory class should implement "Enqueue\ConnectionFactoryFactoryInterface" interface - factory_service: ~ - - # The factory service should be a class that implements "Enqueue\ConnectionFactoryFactoryInterface" interface - factory_class: ~ - client: - traceable_producer: true - prefix: enqueue - app_name: app - router_topic: default - router_queue: default - router_processor: Enqueue\Client\RouterProcessor - default_processor_queue: default - redelivered_delay_time: 0 - consumption: - - # the time in milliseconds queue consumer waits for a message (100 ms by default) - receive_timeout: 100 - job: false - async_events: - enabled: false - async_commands: - enabled: false - extensions: - doctrine_ping_connection_extension: false - doctrine_clear_identity_map_extension: false - signal_extension: true - reply_extension: true + # Configuration name + default: + # The transport option could accept a string DSN, an array with DSN key, or null. It accept extra options. To find out what option you can set, look at connection factory constructor docblock. + transport: + + # The broker DSN. These schemes are supported: "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb", to use these "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb" you have to install a package. + dsn: ~ # Required + + # The connection factory class should implement "Interop\Queue\ConnectionFactory" interface + connection_factory_class: ~ + + # The factory class should implement "Enqueue\ConnectionFactoryFactoryInterface" interface + factory_service: ~ + + # The factory service should be a class that implements "Enqueue\ConnectionFactoryFactoryInterface" interface + factory_class: ~ + client: + traceable_producer: true + prefix: enqueue + app_name: app + router_topic: default + router_queue: default + router_processor: Enqueue\Client\RouterProcessor + default_processor_queue: default + redelivered_delay_time: 0 + consumption: + + # the time in milliseconds queue consumer waits for a message (100 ms by default) + receive_timeout: 100 + async_commands: + enabled: false + extensions: + doctrine_ping_connection_extension: false + doctrine_clear_identity_map_extension: false + signal_extension: true + reply_extension: true ``` [back to index](../index.md) diff --git a/docs/bundle/debugging.md b/docs/bundle/debugging.md index f11c1e599..4dd16f05e 100644 --- a/docs/bundle/debugging.md +++ b/docs/bundle/debugging.md @@ -21,8 +21,9 @@ To enable profiler # app/config/config_dev.yml enqueue: - client: - traceable_producer: true + default: + client: + traceable_producer: true ``` Now suppose you have this code in an action: diff --git a/docs/bundle/functional_testing.md b/docs/bundle/functional_testing.md index d19153c5d..6afa4f4c9 100644 --- a/docs/bundle/functional_testing.md +++ b/docs/bundle/functional_testing.md @@ -27,8 +27,9 @@ Here's how you can configure it. # app/config/config_test.yml enqueue: - transport: 'null:' - client: ~ + default: + transport: 'null:' + client: ~ ``` ## Traceable message producer @@ -40,8 +41,9 @@ There is a solution for that. You have to enable traceable message producer in t # app/config/config_test.yml enqueue: - client: - traceable_producer: true + default: + client: + traceable_producer: true ``` If you did so, you can use its methods `getTraces`, `getTopicTraces` or `clearTraces`. Here's an example: diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index ffa3dc30c..f33df1d8d 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -57,9 +57,10 @@ class AppKernel extends Kernel # app/config/config.yml enqueue: - # plus basic bundle configuration - - job: true + default: + # plus basic bundle configuration + + job: true doctrine: # plus basic bundle configuration diff --git a/docs/bundle/quick_tour.md b/docs/bundle/quick_tour.md index 321c88e38..17496102b 100644 --- a/docs/bundle/quick_tour.md +++ b/docs/bundle/quick_tour.md @@ -57,8 +57,9 @@ First, you have to configure a transport layer and set one to be default. # app/config/config.yml enqueue: - transport: "amqp:" - client: ~ + default: + transport: "amqp:" + client: ~ ``` Once you configured everything you can start producing messages: From 18a3f67ff5d1a6d56690a450b52045828b960849 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 15 Nov 2018 13:48:03 +0200 Subject: [PATCH 0414/1142] add moniotoring to sub tree split. --- bin/subtree-split | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/subtree-split b/bin/subtree-split index f7d63eb34..c52f15a8e 100755 --- a/bin/subtree-split +++ b/bin/subtree-split @@ -67,6 +67,7 @@ remote async-command git@github.com:php-enqueue/async-command.git remote mongodb git@github.com:php-enqueue/mongodb.git remote dsn git@github.com:php-enqueue/dsn.git remote wamp git@github.com:php-enqueue/wamp.git +remote monitoring git@github.com:php-enqueue/monitoring.git split 'pkg/enqueue' enqueue split 'pkg/simple-client' simple-client @@ -92,3 +93,4 @@ split 'pkg/async-command' async-command split 'pkg/mongodb' mongodb split 'pkg/dsn' dsn split 'pkg/wamp' wamp +split 'pkg/monitoring' monitoring From 2fd6cc207ab46851335bc6d76965e7354f0009f8 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 15 Nov 2018 13:48:34 +0200 Subject: [PATCH 0415/1142] [doc][skip ci] Update EnqueuBundle config reference --- docs/bundle/config_reference.md | 40 ++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index 9118a8f9c..579bc72b6 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -14,35 +14,49 @@ You can get this info by running `./bin/console config:dump-reference enqueue` c ```yaml # Default configuration for extension with alias: "enqueue" enqueue: - # Configuration name - default: + + # Prototype + key: + # The transport option could accept a string DSN, an array with DSN key, or null. It accept extra options. To find out what option you can set, look at connection factory constructor docblock. - transport: - - # The broker DSN. These schemes are supported: "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb", to use these "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb" you have to install a package. + transport: # Required + + # The MQ broker DSN. These schemes are supported: "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb", "wamp", "ws", to use these "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb", "wamp", "ws" you have to install a package. dsn: ~ # Required - + # The connection factory class should implement "Interop\Queue\ConnectionFactory" interface connection_factory_class: ~ - + # The factory class should implement "Enqueue\ConnectionFactoryFactoryInterface" interface factory_service: ~ - + # The factory service should be a class that implements "Enqueue\ConnectionFactoryFactoryInterface" interface factory_class: ~ + consumption: + + # the time in milliseconds queue consumer waits for a message (100 ms by default) + receive_timeout: 10000 client: traceable_producer: true prefix: enqueue app_name: app router_topic: default router_queue: default - router_processor: Enqueue\Client\RouterProcessor + router_processor: null default_processor_queue: default redelivered_delay_time: 0 - consumption: - - # the time in milliseconds queue consumer waits for a message (100 ms by default) - receive_timeout: 100 + + # The "monitoring" option could accept a string DSN, an array with DSN key, or null. It accept extra options. To find out what option you can set, look at stats storage constructor doc block. + monitoring: + + # The stats storage DSN. These schemes are supported: "wamp", "ws", "influxdb". + dsn: ~ # Required + + # The factory class should implement "Enqueue\Monitoring\StatsStorageFactory" interface + storage_factory_service: ~ + + # The factory service should be a class that implements "Enqueue\Monitoring\StatsStorageFactory" interface + storage_factory_class: ~ async_commands: enabled: false extensions: From d5c497ca67dd7ada52f51a2c1d82cc879ee29a69 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 14:04:34 +0200 Subject: [PATCH 0416/1142] multi client configuration --- docs/bundle/config_reference.md | 1 + .../DependencyInjection/Configuration.php | 15 +++++++- .../DependencyInjection/EnqueueExtension.php | 21 +++++++----- pkg/enqueue-bundle/Resources/config/job.yml | 6 ++-- .../CalculateRootJobStatusProcessorTest.php | 2 -- .../Job/DependentJobServiceTest.php | 2 -- .../Tests/Functional/Job/JobRunnerTest.php | 2 -- .../Tests/Functional/Job/JobStorageTest.php | 2 -- .../DependencyInjection/ConfigurationTest.php | 22 +++++++----- .../EnqueueExtensionTest.php | 34 ++++++++++++++----- 10 files changed, 70 insertions(+), 37 deletions(-) diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index 9118a8f9c..8011a0621 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -43,6 +43,7 @@ enqueue: # the time in milliseconds queue consumer waits for a message (100 ms by default) receive_timeout: 100 + job: false async_commands: enabled: false extensions: diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 260a50e9e..58475b12d 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -3,6 +3,7 @@ namespace Enqueue\Bundle\DependencyInjection; use Enqueue\AsyncCommand\RunCommandProcessor; +use Enqueue\JobQueue\Job; use Enqueue\Monitoring\Symfony\DependencyInjection\MonitoringFactory; use Enqueue\Symfony\Client\DependencyInjection\ClientFactory; use Enqueue\Symfony\DependencyInjection\TransportFactory; @@ -35,6 +36,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->append(ClientFactory::getConfiguration($this->debug)) ->append($this->getMonitoringConfiguration()) ->append($this->getAsyncCommandsConfiguration()) + ->append($this->getJobConfiguration()) ->arrayNode('extensions')->addDefaultsIfNotSet()->children() ->booleanNode('doctrine_ping_connection_extension')->defaultFalse()->end() ->booleanNode('doctrine_clear_identity_map_extension')->defaultFalse()->end() @@ -46,7 +48,6 @@ public function getConfigTreeBuilder(): TreeBuilder ; // $rootNode->children() -// ->booleanNode('job')->defaultFalse()->end() // ->arrayNode('async_events') // ->addDefaultsIfNotSet() // ->canBeEnabled() @@ -76,4 +77,16 @@ private function getAsyncCommandsConfiguration(): ArrayNodeDefinition ->canBeEnabled() ; } + + private function getJobConfiguration(): ArrayNodeDefinition + { + if (false === class_exists(Job::class)) { + return MissingComponentFactory::getConfiguration('job', ['enqueue/job-queue']); + } + + return (new ArrayNodeDefinition('job')) + ->addDefaultsIfNotSet() + ->canBeEnabled() + ; + } } diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 81c356688..f3a45e128 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -84,6 +84,19 @@ public function load(array $configs, ContainerBuilder $container): void $monitoringFactory->buildClientExtension($container, $configs['monitoring']); } } + + // job-queue + if (false == empty($configs['job']['enabled'])) { + if (false === isset($configs['client'])) { + throw new \LogicException('Client is required for job-queue.'); + } + + if ($name !== $defaultName) { + throw new \LogicException('Job-queue supports only default configuration.'); + } + + $loader->load('job.yml'); + } } $defaultClient = null; @@ -113,14 +126,6 @@ public function load(array $configs, ContainerBuilder $container): void $this->loadSignalExtension($config, $container); $this->loadReplyExtension($config, $container); -// if ($config['job']) { -// if (!class_exists(Job::class)) { -// throw new \LogicException('Seems "enqueue/job-queue" is not installed. Please fix this issue.'); -// } -// -// $loader->load('job.yml'); -// } -// // if ($config['async_events']['enabled']) { // if (false == class_exists(AsyncEventDispatcherExtension::class)) { // throw new \LogicException('The "enqueue/async-event-dispatcher" package has to be installed.'); diff --git a/pkg/enqueue-bundle/Resources/config/job.yml b/pkg/enqueue-bundle/Resources/config/job.yml index 2f55f3f70..0a368aebc 100644 --- a/pkg/enqueue-bundle/Resources/config/job.yml +++ b/pkg/enqueue-bundle/Resources/config/job.yml @@ -20,7 +20,7 @@ services: public: true arguments: - '@Enqueue\JobQueue\Doctrine\JobStorage' - - '@enqueue.client.default.producer' + - '@Enqueue\Client\ProducerInterface' # Deprecated. To be removed in 0.10. enqueue.job.processor: @@ -55,7 +55,7 @@ services: arguments: - '@Enqueue\JobQueue\Doctrine\JobStorage' - '@Enqueue\JobQueue\CalculateRootJobStatusService' - - '@enqueue.client.default.producer' + - '@Enqueue\Client\ProducerInterface' - '@logger' tags: - { name: 'enqueue.command_subscriber', client: 'default' } @@ -70,7 +70,7 @@ services: public: true arguments: - '@Enqueue\JobQueue\Doctrine\JobStorage' - - '@enqueue.client.default.producer' + - '@Enqueue\Client\ProducerInterface' - '@logger' tags: - { name: 'enqueue.topic_subscriber', client: 'default' } diff --git a/pkg/enqueue-bundle/Tests/Functional/Job/CalculateRootJobStatusProcessorTest.php b/pkg/enqueue-bundle/Tests/Functional/Job/CalculateRootJobStatusProcessorTest.php index 0749b8354..01346ad8c 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Job/CalculateRootJobStatusProcessorTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Job/CalculateRootJobStatusProcessorTest.php @@ -12,8 +12,6 @@ class CalculateRootJobStatusProcessorTest extends WebTestCase { public function testCouldBeConstructedByContainer() { - $this->markTestSkipped('Configuration for jobs is not yet ready'); - $instance = static::$container->get(CalculateRootJobStatusProcessor::class); $this->assertInstanceOf(CalculateRootJobStatusProcessor::class, $instance); diff --git a/pkg/enqueue-bundle/Tests/Functional/Job/DependentJobServiceTest.php b/pkg/enqueue-bundle/Tests/Functional/Job/DependentJobServiceTest.php index adee418ec..1aec06410 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Job/DependentJobServiceTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Job/DependentJobServiceTest.php @@ -12,8 +12,6 @@ class DependentJobServiceTest extends WebTestCase { public function testCouldBeConstructedByContainer() { - $this->markTestSkipped('Configuration for jobs is not yet ready'); - $instance = static::$container->get(DependentJobService::class); $this->assertInstanceOf(DependentJobService::class, $instance); diff --git a/pkg/enqueue-bundle/Tests/Functional/Job/JobRunnerTest.php b/pkg/enqueue-bundle/Tests/Functional/Job/JobRunnerTest.php index c27b48218..4aa647f77 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Job/JobRunnerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Job/JobRunnerTest.php @@ -12,8 +12,6 @@ class JobRunnerTest extends WebTestCase { public function testCouldBeConstructedByContainer() { - $this->markTestSkipped('Configuration for jobs is not yet ready'); - $instance = static::$container->get(JobRunner::class); $this->assertInstanceOf(JobRunner::class, $instance); diff --git a/pkg/enqueue-bundle/Tests/Functional/Job/JobStorageTest.php b/pkg/enqueue-bundle/Tests/Functional/Job/JobStorageTest.php index 4d4a83316..650326ad8 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Job/JobStorageTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Job/JobStorageTest.php @@ -12,8 +12,6 @@ class JobStorageTest extends WebTestCase { public function testCouldGetJobStorageAsServiceFromContainer() { - $this->markTestSkipped('Configuration for jobs is not yet ready'); - $instance = static::$container->get(JobStorage::class); $this->assertInstanceOf(JobStorage::class, $instance); diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index b735bda14..1522b49e1 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -160,34 +160,38 @@ public function testShouldThrowExceptionIfDefaultProcessorQueueIsEmpty() public function testJobShouldBeDisabledByDefault() { - $this->markTestSkipped('Configuration for jobs is not yet ready'); - $configuration = new Configuration(true); $processor = new Processor(); $config = $processor->processConfiguration($configuration, [[ - 'transport' => [], + 'default' => [ + 'transport' => [], + ], ]]); $this->assertArraySubset([ - 'job' => false, + 'default' => [ + 'job' => false, + ], ], $config); } public function testCouldEnableJob() { - $this->markTestSkipped('Configuration for jobs is not yet ready'); - $configuration = new Configuration(true); $processor = new Processor(); $config = $processor->processConfiguration($configuration, [[ - 'transport' => [], - 'job' => true, + 'default' => [ + 'transport' => [], + 'job' => true, + ], ]]); $this->assertArraySubset([ - 'job' => true, + 'default' => [ + 'job' => true, + ], ], $config); } diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index 9fd7c2e98..b17d6a949 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -255,31 +255,49 @@ public function testShouldNotLoadDelayRedeliveredMessageExtensionIfRedeliveredDe public function testShouldLoadJobServicesIfEnabled() { - $this->markTestSkipped('Configuration for jobs is not yet ready'); - $container = $this->getContainerBuilder(true); $extension = new EnqueueExtension(); $extension->load([[ - 'transport' => [], - 'job' => true, + 'default' => [ + 'transport' => [], + 'client' => null, + 'job' => true, + ], ]], $container); self::assertTrue($container->hasDefinition(JobRunner::class)); } - public function testShouldNotLoadJobServicesIfDisabled() + public function testShouldThrowExceptionIfClientIsNotEnabledOnJobLoad() { - $this->markTestSkipped('Configuration for jobs is not yet ready'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Client is required for job-queue.'); + + $container = $this->getContainerBuilder(true); + + $extension = new EnqueueExtension(); + + $extension->load([[ + 'default' => [ + 'transport' => [], + 'job' => true, + ], + ]], $container); + } + public function testShouldNotLoadJobServicesIfDisabled() + { $container = $this->getContainerBuilder(true); $extension = new EnqueueExtension(); $extension->load([[ - 'transport' => [], - 'job' => false, + 'default' => [ + 'transport' => [], + 'job' => false, + ], ]], $container); self::assertFalse($container->hasDefinition(JobRunner::class)); From 0afd9ca5e3a250ab7d613e033130e3c58b814387 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 14:21:48 +0200 Subject: [PATCH 0417/1142] multi client configuration --- .../Tests/Unit/DependencyInjection/ConfigurationTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index 1522b49e1..d1ce8bd87 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -171,7 +171,9 @@ public function testJobShouldBeDisabledByDefault() $this->assertArraySubset([ 'default' => [ - 'job' => false, + 'job' => [ + 'enabled' => false, + ], ], ], $config); } From 431ed594c931b13a3454acd9caf480ce467c3a37 Mon Sep 17 00:00:00 2001 From: Frank Giesecke Date: Thu, 15 Nov 2018 13:27:15 +0100 Subject: [PATCH 0418/1142] Fix wrong exceptions in transports The `setPriority` method have to throw a PriorityNotSupportedException if the feature is not supported. --- pkg/gearman/GearmanProducer.php | 3 ++- pkg/pheanstalk/PheanstalkProducer.php | 3 ++- pkg/rdkafka/RdKafkaProducer.php | 3 ++- pkg/redis/RedisProducer.php | 3 ++- pkg/stomp/StompProducer.php | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pkg/gearman/GearmanProducer.php b/pkg/gearman/GearmanProducer.php index 83eaef3ae..c297e71b2 100644 --- a/pkg/gearman/GearmanProducer.php +++ b/pkg/gearman/GearmanProducer.php @@ -7,6 +7,7 @@ use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; +use Interop\Queue\Exception\PriorityNotSupportedException; use Interop\Queue\Message; use Interop\Queue\Producer; @@ -59,7 +60,7 @@ public function setPriority(int $priority = null): Producer return $this; } - throw new \LogicException('Not implemented'); + throw PriorityNotSupportedException::providerDoestNotSupportIt(); } public function getPriority(): ?int diff --git a/pkg/pheanstalk/PheanstalkProducer.php b/pkg/pheanstalk/PheanstalkProducer.php index e0d538043..05722dad9 100644 --- a/pkg/pheanstalk/PheanstalkProducer.php +++ b/pkg/pheanstalk/PheanstalkProducer.php @@ -7,6 +7,7 @@ use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; +use Interop\Queue\Exception\PriorityNotSupportedException; use Interop\Queue\Message; use Interop\Queue\Producer; use Pheanstalk\Pheanstalk; @@ -75,7 +76,7 @@ public function setPriority(int $priority = null): Producer return $this; } - throw new \LogicException('Not implemented'); + throw PriorityNotSupportedException::providerDoestNotSupportIt(); } public function getPriority(): ?int diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index feb40c46b..3f6d1923f 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -7,6 +7,7 @@ use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; +use Interop\Queue\Exception\PriorityNotSupportedException; use Interop\Queue\Message; use Interop\Queue\Producer; use RdKafka\Producer as VendorProducer; @@ -70,7 +71,7 @@ public function setPriority(int $priority = null): Producer return $this; } - throw new \LogicException('Not implemented'); + throw PriorityNotSupportedException::providerDoestNotSupportIt(); } public function getPriority(): ?int diff --git a/pkg/redis/RedisProducer.php b/pkg/redis/RedisProducer.php index 69b028cb1..3721ed20a 100644 --- a/pkg/redis/RedisProducer.php +++ b/pkg/redis/RedisProducer.php @@ -7,6 +7,7 @@ use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; +use Interop\Queue\Exception\PriorityNotSupportedException; use Interop\Queue\Message; use Interop\Queue\Producer; use Ramsey\Uuid\Uuid; @@ -94,7 +95,7 @@ public function setPriority(int $priority = null): Producer return $this; } - throw new \LogicException('Not implemented'); + throw PriorityNotSupportedException::providerDoestNotSupportIt(); } public function getPriority(): ?int diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index 31e03f301..c275bd6a3 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -7,6 +7,7 @@ use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; +use Interop\Queue\Exception\PriorityNotSupportedException; use Interop\Queue\Message; use Interop\Queue\Producer; use Stomp\Client; @@ -64,7 +65,7 @@ public function setPriority(int $priority = null): Producer return $this; } - throw new \LogicException('Not implemented'); + throw PriorityNotSupportedException::providerDoestNotSupportIt(); } public function getPriority(): ?int From 15e9260630598ffdd10990e0df5db653d3b68d42 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 15:10:29 +0200 Subject: [PATCH 0419/1142] multi client configuration --- pkg/enqueue-bundle/Tests/Functional/App/config/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 8a99208cb..433fa289d 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -27,7 +27,7 @@ enqueue: client: traceable_producer: true async_commands: true -# job: true + job: true # async_commands: true services: From 0842340e53d74c8192e9c50a495dfb0b7b3fc09e Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 15:54:49 +0200 Subject: [PATCH 0420/1142] multi client configuration --- .../DependencyInjection/Configuration.php | 21 +++++++++----- .../DependencyInjection/EnqueueExtension.php | 29 ++++++++++--------- .../Tests/Functional/App/config/config.yml | 2 +- .../Functional/Events/AsyncListenerTest.php | 2 -- .../Functional/Events/AsyncProcessorTest.php | 2 -- .../Functional/Events/AsyncSubscriberTest.php | 2 -- .../DependencyInjection/ConfigurationTest.php | 4 --- .../DependencyInjection/ClientFactory.php | 14 ++++++--- .../DependencyInjection/TransportFactory.php | 16 ++++++---- 9 files changed, 51 insertions(+), 41 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 58475b12d..526afb4b0 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -3,6 +3,7 @@ namespace Enqueue\Bundle\DependencyInjection; use Enqueue\AsyncCommand\RunCommandProcessor; +use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncEventDispatcherExtension; use Enqueue\JobQueue\Job; use Enqueue\Monitoring\Symfony\DependencyInjection\MonitoringFactory; use Enqueue\Symfony\Client\DependencyInjection\ClientFactory; @@ -37,6 +38,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->append($this->getMonitoringConfiguration()) ->append($this->getAsyncCommandsConfiguration()) ->append($this->getJobConfiguration()) + ->append($this->getAsyncEventsConfiguration()) ->arrayNode('extensions')->addDefaultsIfNotSet()->children() ->booleanNode('doctrine_ping_connection_extension')->defaultFalse()->end() ->booleanNode('doctrine_clear_identity_map_extension')->defaultFalse()->end() @@ -47,13 +49,6 @@ public function getConfigTreeBuilder(): TreeBuilder ->end() ; -// $rootNode->children() -// ->arrayNode('async_events') -// ->addDefaultsIfNotSet() -// ->canBeEnabled() -// ->end() -// ; - return $tb; } @@ -89,4 +84,16 @@ private function getJobConfiguration(): ArrayNodeDefinition ->canBeEnabled() ; } + + private function getAsyncEventsConfiguration(): ArrayNodeDefinition + { + if (false == class_exists(AsyncEventDispatcherExtension::class)) { + return MissingComponentFactory::getConfiguration('async_events', ['enqueue/async-event-dispatcher']); + } + + return (new ArrayNodeDefinition('job')) + ->addDefaultsIfNotSet() + ->canBeEnabled() + ; + } } diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index f3a45e128..b7c4e424f 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -53,7 +53,7 @@ public function load(array $configs, ContainerBuilder $container): void // transport & consumption $transportNames[] = $name; - $transportFactory = (new TransportFactory($name)); + $transportFactory = (new TransportFactory($name, $defaultName === $name)); $transportFactory->buildConnectionFactory($container, $configs['transport']); $transportFactory->buildContext($container, []); $transportFactory->buildQueueConsumer($container, $configs['consumption']); @@ -68,8 +68,8 @@ public function load(array $configs, ContainerBuilder $container): void $clientConfig['transport'] = $configs['transport']; $clientConfig['consumption'] = $configs['consumption']; - $clientFactory = new ClientFactory($name); - $clientFactory->build($container, $clientConfig, $defaultName === $name); + $clientFactory = new ClientFactory($name, $defaultName === $name); + $clientFactory->build($container, $clientConfig); $clientFactory->createDriver($container, $configs['transport']); $clientFactory->createFlushSpoolProducerListener($container); } @@ -97,6 +97,18 @@ public function load(array $configs, ContainerBuilder $container): void $loader->load('job.yml'); } + + // async events + if (false == empty($config['async_events']['enabled'])) { + if ($name !== $defaultName) { + throw new \LogicException('Async events supports only default configuration.'); + } + + $extension = new AsyncEventDispatcherExtension(); + $extension->load([[ + 'context_service' => 'enqueue.transport.default.context', + ]], $container); + } } $defaultClient = null; @@ -125,17 +137,6 @@ public function load(array $configs, ContainerBuilder $container): void $this->loadDoctrineClearIdentityMapExtension($config, $container); $this->loadSignalExtension($config, $container); $this->loadReplyExtension($config, $container); - -// if ($config['async_events']['enabled']) { -// if (false == class_exists(AsyncEventDispatcherExtension::class)) { -// throw new \LogicException('The "enqueue/async-event-dispatcher" package has to be installed.'); -// } -// -// $extension = new AsyncEventDispatcherExtension(); -// $extension->load([[ -// 'context_service' => 'enqueue.transport.default.context', -// ]], $container); -// } } public function getConfiguration(array $config, ContainerBuilder $container): Configuration diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 433fa289d..72d279ac5 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -28,7 +28,7 @@ enqueue: traceable_producer: true async_commands: true job: true -# async_commands: true + async_commands: true services: test_enqueue.client.default.traceable_producer: diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php index 8436181b1..6e952ab28 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php @@ -18,8 +18,6 @@ class AsyncListenerTest extends WebTestCase { public function setUp() { - $this->markTestSkipped('Configuration for async_events is not yet ready'); - parent::setUp(); /** @var AsyncListener $asyncListener */ diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php index 75ed3ad73..101e5ecec 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php @@ -20,8 +20,6 @@ class AsyncProcessorTest extends WebTestCase { public function setUp() { - $this->markTestSkipped('Configuration for async_events is not yet ready'); - parent::setUp(); /** @var AsyncListener $asyncListener */ diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php index 081da0734..6e00eafca 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php @@ -18,8 +18,6 @@ class AsyncSubscriberTest extends WebTestCase { public function setUp() { - $this->markTestSkipped('Configuration for async_events is not yet ready'); - parent::setUp(); /** @var AsyncListener $asyncListener */ diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index d1ce8bd87..0662813a7 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -373,8 +373,6 @@ public function testReplyExtensionCouldBeDisabled() public function testShouldDisableAsyncEventsByDefault() { - $this->markTestSkipped('Configuration for async_events is not yet ready'); - $configuration = new Configuration(true); $processor = new Processor(); @@ -391,8 +389,6 @@ public function testShouldDisableAsyncEventsByDefault() public function testShouldAllowEnableAsyncEvents() { - $this->markTestSkipped('Configuration for async_events is not yet ready'); - $configuration = new Configuration(true); $processor = new Processor(); diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php index 9a2392d54..47d8e8ee5 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php @@ -41,13 +41,19 @@ final class ClientFactory */ private $name; - public function __construct(string $name) + /** + * @var bool + */ + private $default; + + public function __construct(string $name, bool $default = false) { if (empty($name)) { throw new \InvalidArgumentException('The name could not be empty.'); } $this->name = $name; + $this->default = $default; } public static function getConfiguration(bool $debug, string $name = 'client'): NodeDefinition @@ -69,7 +75,7 @@ public static function getConfiguration(bool $debug, string $name = 'client'): N return $builder; } - public function build(ContainerBuilder $container, array $config, bool $default = false): void + public function build(ContainerBuilder $container, array $config): void { $container->register($this->format('context'), Context::class) ->setFactory([$this->reference('driver'), 'getContext']) @@ -176,7 +182,7 @@ public function build(ContainerBuilder $container, array $config, bool $default ->addTag('enqueue.consumption_extension', ['priority' => 10, 'client' => $this->name]) ; - $container->getDefinition('enqueue.client.default.delay_redelivered_message_extension') + $container->getDefinition($this->format('delay_redelivered_message_extension')) ->replaceArgument(1, $config['redelivered_delay_time']) ; } @@ -192,7 +198,7 @@ public function build(ContainerBuilder $container, array $config, bool $default ])); } - if ($default) { + if ($this->default) { $container->setAlias(ProducerInterface::class, $this->format('producer')); $container->setAlias(SpoolProducer::class, $this->format('spool_producer')); } diff --git a/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php b/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php index 5d98d3f8d..eb9454b3a 100644 --- a/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php +++ b/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php @@ -32,13 +32,19 @@ final class TransportFactory */ private $name; - public function __construct(string $name) + /** + * @var bool + */ + private $default; + + public function __construct(string $name, bool $default = false) { if (empty($name)) { throw new \InvalidArgumentException('The name could not be empty.'); } $this->name = $name; + $this->default = $default; } public static function getConfiguration(string $name = 'transport'): NodeDefinition @@ -149,7 +155,7 @@ public function buildConnectionFactory(ContainerBuilder $container, array $confi ; } - if ('default' === $this->name) { + if ($this->default) { $container->setAlias(ConnectionFactory::class, $this->format('connection_factory')); } } @@ -167,7 +173,7 @@ public function buildContext(ContainerBuilder $container, array $config): void $this->addServiceToLocator($container, 'context'); - if ('default' === $this->name) { + if ($this->default) { $container->setAlias(Context::class, $this->format('context')); } } @@ -201,7 +207,7 @@ public function buildQueueConsumer(ContainerBuilder $container, array $config): $this->addServiceToLocator($container, 'queue_consumer'); $this->addServiceToLocator($container, 'processor_registry'); - if ('default' === $this->name) { + if ($this->default) { $container->setAlias(QueueConsumerInterface::class, $this->format('queue_consumer')); } } @@ -220,7 +226,7 @@ public function buildRpcClient(ContainerBuilder $container, array $config): void ->addArgument(new Reference($this->format('rpc_factory'))) ; - if ('default' === $this->name) { + if ($this->default) { $container->setAlias(RpcClient::class, $this->format('rpc_client')); } } From 134b603fa655ac376e06b115f836586ccd25f284 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 17:25:22 +0200 Subject: [PATCH 0421/1142] multi client configuration --- .../DependencyInjection/Configuration.php | 2 +- .../DependencyInjection/ConfigurationTest.php | 36 ++++++++++++------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 526afb4b0..d7b3ba3a1 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -91,7 +91,7 @@ private function getAsyncEventsConfiguration(): ArrayNodeDefinition return MissingComponentFactory::getConfiguration('async_events', ['enqueue/async-event-dispatcher']); } - return (new ArrayNodeDefinition('job')) + return (new ArrayNodeDefinition('async_events')) ->addDefaultsIfNotSet() ->canBeEnabled() ; diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index 0662813a7..0c41fdcb3 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -377,12 +377,16 @@ public function testShouldDisableAsyncEventsByDefault() $processor = new Processor(); $config = $processor->processConfiguration($configuration, [[ - 'transport' => [], + 'default' => [ + 'transport' => [], + ], ]]); $this->assertArraySubset([ - 'async_events' => [ - 'enabled' => false, + 'default' => [ + 'async_events' => [ + 'enabled' => false, + ], ], ], $config); } @@ -394,26 +398,34 @@ public function testShouldAllowEnableAsyncEvents() $processor = new Processor(); $config = $processor->processConfiguration($configuration, [[ - 'transport' => [], - 'async_events' => true, + 'default' => [ + 'transport' => [], + 'async_events' => true, + ], ]]); $this->assertArraySubset([ - 'async_events' => [ - 'enabled' => true, + 'default' => [ + 'async_events' => [ + 'enabled' => true, + ], ], ], $config); $config = $processor->processConfiguration($configuration, [[ - 'transport' => [], - 'async_events' => [ - 'enabled' => true, + 'default' => [ + 'transport' => [], + 'async_events' => [ + 'enabled' => true, + ], ], ]]); $this->assertArraySubset([ - 'async_events' => [ - 'enabled' => true, + 'default' => [ + 'async_events' => [ + 'enabled' => true, + ], ], ], $config); } From 2a7d75a59bd6e0415001bb42a507b2f59f29b7d8 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 18:09:10 +0200 Subject: [PATCH 0422/1142] multi client configuration --- pkg/enqueue-bundle/Tests/Functional/App/config/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 72d279ac5..55499e13b 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -26,8 +26,8 @@ enqueue: transport: 'null:' client: traceable_producer: true - async_commands: true job: true + async_events: true async_commands: true services: From 1db3a2e48810913ac593c581ae9222bc33f0c4c2 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Thu, 15 Nov 2018 19:21:00 +0200 Subject: [PATCH 0423/1142] multi client configuration --- .../DependencyInjection/EnqueueExtension.php | 37 ++++++++++--------- .../Tests/Functional/App/config/config.yml | 8 ++-- .../Tests/Functional/RoutesCommandTest.php | 7 +--- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index b7c4e424f..043039fa9 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -16,6 +16,7 @@ use Enqueue\Symfony\Client\DependencyInjection\ClientFactory; use Enqueue\Symfony\DependencyInjection\TransportFactory; use Enqueue\Symfony\DiUtils; +use Interop\Queue\Context; use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -35,7 +36,7 @@ public function load(array $configs, ContainerBuilder $container): void // find default configuration $defaultName = null; - foreach ($config as $name => $configs) { + foreach ($config as $name => $modules) { // set first as default if (null === $defaultName) { $defaultName = $name; @@ -49,45 +50,45 @@ public function load(array $configs, ContainerBuilder $container): void $transportNames = []; $clientNames = []; - foreach ($config as $name => $configs) { + foreach ($config as $name => $modules) { // transport & consumption $transportNames[] = $name; $transportFactory = (new TransportFactory($name, $defaultName === $name)); - $transportFactory->buildConnectionFactory($container, $configs['transport']); + $transportFactory->buildConnectionFactory($container, $modules['transport']); $transportFactory->buildContext($container, []); - $transportFactory->buildQueueConsumer($container, $configs['consumption']); + $transportFactory->buildQueueConsumer($container, $modules['consumption']); $transportFactory->buildRpcClient($container, []); // client - if (isset($configs['client'])) { + if (isset($modules['client'])) { $clientNames[] = $name; - $clientConfig = $configs['client']; + $clientConfig = $modules['client']; // todo - $clientConfig['transport'] = $configs['transport']; - $clientConfig['consumption'] = $configs['consumption']; + $clientConfig['transport'] = $modules['transport']; + $clientConfig['consumption'] = $modules['consumption']; $clientFactory = new ClientFactory($name, $defaultName === $name); $clientFactory->build($container, $clientConfig); - $clientFactory->createDriver($container, $configs['transport']); + $clientFactory->createDriver($container, $modules['transport']); $clientFactory->createFlushSpoolProducerListener($container); } // monitoring - if (isset($configs['monitoring'])) { + if (isset($modules['monitoring'])) { $monitoringFactory = new MonitoringFactory($name); - $monitoringFactory->buildStorage($container, $configs['monitoring']); - $monitoringFactory->buildConsumerExtension($container, $configs['monitoring']); + $monitoringFactory->buildStorage($container, $modules['monitoring']); + $monitoringFactory->buildConsumerExtension($container, $modules['monitoring']); - if (isset($configs['client'])) { - $monitoringFactory->buildClientExtension($container, $configs['monitoring']); + if (isset($modules['client'])) { + $monitoringFactory->buildClientExtension($container, $modules['monitoring']); } } // job-queue - if (false == empty($configs['job']['enabled'])) { - if (false === isset($configs['client'])) { + if (false == empty($modules['job']['enabled'])) { + if (false === isset($modules['client'])) { throw new \LogicException('Client is required for job-queue.'); } @@ -99,14 +100,14 @@ public function load(array $configs, ContainerBuilder $container): void } // async events - if (false == empty($config['async_events']['enabled'])) { + if (false == empty($modules['async_events']['enabled'])) { if ($name !== $defaultName) { throw new \LogicException('Async events supports only default configuration.'); } $extension = new AsyncEventDispatcherExtension(); $extension->load([[ - 'context_service' => 'enqueue.transport.default.context', + 'context_service' => Context::class, ]], $container); } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 55499e13b..718990333 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -115,7 +115,7 @@ services: - {name: 'enqueue.event_transformer', eventName: 'test_async_subscriber', transformerName: 'test_async' } # overwrite async listener with one based on client producer. so we can use traceable producer. -# enqueue.events.async_listener: -# class: 'Enqueue\Bundle\Tests\Functional\App\AsyncListener' -# public: true -# arguments: ['@enqueue.client.default.producer', '@enqueue.events.registry'] \ No newline at end of file + enqueue.events.async_listener: + class: 'Enqueue\Bundle\Tests\Functional\App\AsyncListener' + public: true + arguments: ['@enqueue.client.default.producer', '@enqueue.events.registry'] \ No newline at end of file diff --git a/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php b/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php index 914d771e7..afefe6482 100644 --- a/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php @@ -26,16 +26,13 @@ public function testShouldDisplayRegisteredTopics() $tester->execute([]); $expected = <<<'OUTPUT' -| topic | theTopic | default (prefixed) | test_topic_subscriber_processor | (hidden) | +| topic | theTopic | default (prefixed) | test_topic_subscriber_processor | (hidden) | OUTPUT; $this->assertSame(0, $tester->getStatusCode()); $this->assertContains($expected, $tester->getDisplay()); } - /** - * @group testit - */ public function testShouldDisplayCommands() { /** @var RoutesCommand $command */ @@ -45,7 +42,7 @@ public function testShouldDisplayCommands() $tester->execute([]); $expected = <<<'OUTPUT' -| command | theCommand | default (prefixed) | test_command_subscriber_processor | (hidden) | +| command | theCommand | default (prefixed) | test_command_subscriber_processor | (hidden) | OUTPUT; $this->assertSame(0, $tester->getStatusCode()); From 8bdc8dfc25e7021568df5c374d67b6be9fbb11f6 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Thu, 15 Nov 2018 19:27:23 +0200 Subject: [PATCH 0424/1142] fix monitoring tests. --- pkg/monitoring/composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index b917ea094..11a4b70db 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -13,7 +13,10 @@ }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev" + "enqueue/test": "0.9.x-dev", + "influxdb/influxdb-php": "^1.14", + "thruway/client": "^0.5", + "thruway/pawl-transport": "^0.5" }, "suggest": { "thruway/client": "Client for Thruway and the WAMP (Web Application Messaging Protocol).", From c30bf3d3ea51d6b803a9a7020b22ed2579960d06 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Thu, 15 Nov 2018 21:13:26 +0200 Subject: [PATCH 0425/1142] Update monitoring.md --- docs/monitoring.md | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/docs/monitoring.md b/docs/monitoring.md index 1a93568d3..6e1dd4414 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -9,8 +9,8 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Monitoring. -Enqueue provides a tool for monitoring your queues. -With it, you can control how many messages were sent, how many processed successful or failed. +Enqueue provides a tool for monitoring message queues. +With it, you can control how many messages were sent, how many processed successfuly or failed. How many consumers are working, their up time, processed messages stats, memory usage and system load. The tool could be integrated with virtually any analytics and monitoring platform. There are several integration: @@ -21,6 +21,8 @@ We are working on a JS\WAMP based real-time UI tool, for more information please ![Grafana Monitoring](images/grafana_monitoring.jpg) +[contact us](opensource@forma-pro.com) if need a Grafana template such as on the picture. + * [Installation](#installation) * [Track sent messages](#track-sent-messages) * [Track consumed message](#track-consumed-message) @@ -267,30 +269,17 @@ There are available options: You have to register some services in order to incorporate monitoring facilities into your Symfony application. ```yaml -services: - Enqueue\Monitoring\GenericStatsStorageFactory: ~ - - Enqueue\Monitoring\StatsStorage: - factory: ['@Enqueue\Monitoring\GenericStatsStorageFactory', 'create'] - arguments: ['influxdb://127.0.0.1:8086?db=foo'] - - Enqueue\Monitoring\ConsumerMonitoringExtension: - arguments: - - '@Enqueue\Monitoring\StatsStorage' - tags: - # if you want to monitor transport consumer - - { name: 'enqueue.transport.consumption_extension', transport: 'default' } - - # if you want to monitor client consumer - - { name: 'enqueue.consumption_extension', client: 'default' } - - # if you want to monitor sent messages - Enqueue\Monitoring\ClientMonitoringExtension: - arguments: - - '@Enqueue\Monitoring\StatsStorage' - - '@logger' - tags: - - { name: 'enqueue.client_extension', client: 'default' } +# config/packages/enqueue.yaml + +enqueue: + default: + transport: 'amqp://guest:guest@bar:5672/%2f' + monitoring: 'influxdb://127.0.0.1:8086?db=foo' + + another: + transport: 'amqp://guest:guest@foo:5672/%2f' + monitoring: 'wamp://127.0.0.1:9090?topic=stats' + client: ~ ``` -[back to index](index.md) \ No newline at end of file +[back to index](index.md) From 16a521833d7c2aafe9be35e3a16d1ee5cf396d80 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Fri, 16 Nov 2018 13:52:04 +0200 Subject: [PATCH 0426/1142] multi client configuration --- composer.json | 6 +- pkg/amqp-bunny/composer.json | 6 +- pkg/amqp-ext/composer.json | 6 +- pkg/amqp-lib/composer.json | 4 +- pkg/amqp-tools/composer.json | 4 +- pkg/async-command/composer.json | 2 +- .../DependencyInjection/AsyncEventsPass.php | 6 +- pkg/async-event-dispatcher/composer.json | 2 +- pkg/dbal/composer.json | 4 +- .../DependencyInjection/EnqueueExtension.php | 2 +- pkg/enqueue-bundle/composer.json | 4 +- .../AnalyzeRouteCollectionPass.php | 15 +- .../BuildClientExtensionsPass.php | 20 +-- .../BuildCommandSubscriberRoutesPass.php | 19 +-- .../BuildConsumptionExtensionsPass.php | 19 +-- .../BuildProcessorRegistryPass.php | 20 +-- .../BuildProcessorRoutesPass.php | 19 +-- .../BuildTopicSubscriberRoutesPass.php | 19 +-- .../DependencyInjection/ClientFactory.php | 146 ++++++++++-------- .../FormatClientNameTrait.php | 30 ---- .../BuildConsumptionExtensionsPass.php | 19 +-- .../BuildProcessorRegistryPass.php | 19 +-- .../FormatTransportNameTrait.php | 30 ---- .../DependencyInjection/TransportFactory.php | 78 ++++++---- pkg/enqueue/Symfony/DiUtils.php | 26 +++- pkg/enqueue/composer.json | 4 +- pkg/fs/composer.json | 4 +- pkg/gearman/composer.json | 4 +- pkg/gps/composer.json | 4 +- pkg/job-queue/composer.json | 2 +- pkg/mongodb/composer.json | 4 +- .../DependencyInjection/MonitoringFactory.php | 4 +- pkg/null/composer.json | 4 +- pkg/pheanstalk/composer.json | 4 +- pkg/rdkafka/composer.json | 4 +- pkg/redis/composer.json | 4 +- pkg/simple-client/composer.json | 4 +- pkg/sqs/composer.json | 4 +- pkg/stomp/composer.json | 4 +- pkg/wamp/composer.json | 4 +- 40 files changed, 255 insertions(+), 328 deletions(-) delete mode 100644 pkg/enqueue/Symfony/Client/DependencyInjection/FormatClientNameTrait.php delete mode 100644 pkg/enqueue/Symfony/DependencyInjection/FormatTransportNameTrait.php diff --git a/composer.json b/composer.json index 46e7369bc..6489f3737 100644 --- a/composer.json +++ b/composer.json @@ -11,8 +11,8 @@ "ext-mongodb": "^1.3", "ext-rdkafka": "^3.0.3", - "queue-interop/amqp-interop": "0.8.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/amqp-interop": "^0.8", + "queue-interop/queue-interop": "^0.7", "bunny/bunny": "^0.2.4|^0.3|^0.4", "php-amqplib/php-amqplib": "^2.7", "doctrine/dbal": "~2.5", @@ -38,7 +38,7 @@ "require-dev": { "phpunit/phpunit": "^5.5", "phpstan/phpstan": "^0.10", - "queue-interop/queue-spec": "0.6.x-dev", + "queue-interop/queue-spec": "^0.6", "symfony/browser-kit": "4.0.*", "symfony/config": "4.0.*", "symfony/process": "4.0.*", diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 1097717c9..7bda3946e 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -7,8 +7,8 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/amqp-interop": "0.8.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/amqp-interop": "^0.8", + "queue-interop/queue-interop": "^0.7", "bunny/bunny": "^0.2.4|^0.3|^0.4", "enqueue/amqp-tools": "0.9.x-dev" }, @@ -16,7 +16,7 @@ "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 20c384e7f..5bedd525c 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -8,15 +8,15 @@ "require": { "php": "^7.1.3", "ext-amqp": "^1.9.3", - "queue-interop/amqp-interop": "0.8.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/amqp-interop": "^0.8", + "queue-interop/queue-interop": "^0.7", "enqueue/amqp-tools": "0.9.x-dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev", + "queue-interop/queue-spec": "^0.6", "empi89/php-amqp-stubs": "*@dev" }, "support": { diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 470713c92..17b145a03 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -8,14 +8,14 @@ "require": { "php": "^7.1.3", "php-amqplib/php-amqplib": "^2.7", - "queue-interop/amqp-interop": "0.8.x-dev", + "queue-interop/amqp-interop": "^0.8", "enqueue/amqp-tools": "0.9.x-dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index b250dbf8c..f0c70aa7f 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -7,8 +7,8 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/amqp-interop": "0.8.x-dev", - "queue-interop/queue-interop": "0.7.x-dev" + "queue-interop/amqp-interop": "^0.8", + "queue-interop/queue-interop": "^0.7" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index f56c0bf06..8e44fe39b 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -8,7 +8,7 @@ "require": { "php": ">=7.1", "enqueue/enqueue": "0.9.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "symfony/console": "^3.4|^4", "symfony/process": "^3.4|^4" }, diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php index 702d23ac7..5371eb869 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php @@ -19,6 +19,8 @@ public function process(ContainerBuilder $container): void return; } + $defaultClient = $container->getParameter('enqueue.default_client'); + $registeredToEvent = []; foreach ($container->findTaggedServiceIds('kernel.event_listener') as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { @@ -44,7 +46,7 @@ public function process(ContainerBuilder $container): void $container->getDefinition('enqueue.events.async_processor') ->addTag('enqueue.processor', [ 'topic' => 'event.'.$event, - 'client' => 'default', + 'client' => $defaultClient, ]) ; @@ -78,7 +80,7 @@ public function process(ContainerBuilder $container): void $container->getDefinition('enqueue.events.async_processor') ->addTag('enqueue.processor', [ 'topicName' => 'event.'.$event, - 'client' => 'default', + 'client' => $defaultClient, ]) ; diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index 1d005f0ba..2c9d253e8 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "enqueue/enqueue": "0.9.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "symfony/event-dispatcher": "^3.4|^4" }, "require-dev": { diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 5feb5dc99..a39b5c622 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "doctrine/dbal": "~2.5", "ramsey/uuid": "^3" }, @@ -15,7 +15,7 @@ "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 043039fa9..b5ae10ab9 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -43,7 +43,7 @@ public function load(array $configs, ContainerBuilder $container): void } // or with name 'default' - if ('default' === $name) { + if (DiUtils::DEFAULT_CONFIG === $name) { $defaultName = $name; } } diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index efe06b027..4ca94b6ef 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -8,8 +8,8 @@ "require": { "php": "^7.1.3", "symfony/framework-bundle": "^3.4|^4", - "queue-interop/amqp-interop": "0.8.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/amqp-interop": "^0.8", + "queue-interop/queue-interop": "^0.7", "enqueue/enqueue": "0.9.x-dev", "enqueue/null": "0.9.x-dev" }, diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPass.php index 2613bcc3c..c541f4179 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPass.php @@ -3,15 +3,12 @@ namespace Enqueue\Symfony\Client\DependencyInjection; use Enqueue\Client\RouteCollection; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; final class AnalyzeRouteCollectionPass implements CompilerPassInterface { - use FormatClientNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.clients')) { @@ -21,8 +18,9 @@ public function process(ContainerBuilder $container): void $names = $container->getParameter('enqueue.clients'); foreach ($names as $name) { - $this->name = $name; - $routeCollectionId = $this->format('route_collection'); + $diUtils = DiUtils::create(ClientFactory::MODULE, $name); + + $routeCollectionId = $diUtils->format('route_collection'); if (false == $container->hasDefinition($routeCollectionId)) { throw new \LogicException(sprintf('Service "%s" not found', $routeCollectionId)); } @@ -36,11 +34,6 @@ public function process(ContainerBuilder $container): void } } - protected function getName(): string - { - return $this->name; - } - private function exclusiveCommandsCouldNotBeRunOnDefaultQueue(RouteCollection $collection): void { foreach ($collection->all() as $route) { diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildClientExtensionsPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildClientExtensionsPass.php index 3f97093d8..5ad45fd90 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildClientExtensionsPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildClientExtensionsPass.php @@ -2,16 +2,13 @@ namespace Enqueue\Symfony\Client\DependencyInjection; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; final class BuildClientExtensionsPass implements CompilerPassInterface { - use FormatClientNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.clients')) { @@ -19,10 +16,12 @@ public function process(ContainerBuilder $container): void } $names = $container->getParameter('enqueue.clients'); + $defaultName = $container->getParameter('enqueue.default_client'); foreach ($names as $name) { - $this->name = $name; - $extensionsId = $this->format('client_extensions'); + $diUtils = DiUtils::create(ClientFactory::MODULE, $name); + + $extensionsId = $diUtils->format('client_extensions'); if (false == $container->hasDefinition($extensionsId)) { throw new \LogicException(sprintf('Service "%s" not found', $extensionsId)); } @@ -35,9 +34,9 @@ public function process(ContainerBuilder $container): void $groupByPriority = []; foreach ($tags as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { - $client = $tagAttribute['client'] ?? 'default'; + $client = $tagAttribute['client'] ?? $defaultName; - if ($client !== $this->name && 'all' !== $client) { + if ($client !== $name && 'all' !== $client) { continue; } @@ -61,9 +60,4 @@ public function process(ContainerBuilder $container): void )); } } - - protected function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php index 6cc9934b0..cee1343f5 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php @@ -5,15 +5,12 @@ use Enqueue\Client\CommandSubscriberInterface; use Enqueue\Client\Route; use Enqueue\Client\RouteCollection; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; final class BuildCommandSubscriberRoutesPass implements CompilerPassInterface { - use FormatClientNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.clients')) { @@ -21,10 +18,11 @@ public function process(ContainerBuilder $container): void } $names = $container->getParameter('enqueue.clients'); + $defaultName = $container->getParameter('enqueue.default_client'); foreach ($names as $name) { - $this->name = $name; - $routeCollectionId = sprintf('enqueue.client.%s.route_collection', $this->name); + $diUtils = DiUtils::create(ClientFactory::MODULE, $name); + $routeCollectionId = $diUtils->format('route_collection'); if (false == $container->hasDefinition($routeCollectionId)) { throw new \LogicException(sprintf('Service "%s" not found', $routeCollectionId)); } @@ -47,9 +45,9 @@ public function process(ContainerBuilder $container): void } foreach ($tagAttributes as $tagAttribute) { - $client = $tagAttribute['client'] ?? 'default'; + $client = $tagAttribute['client'] ?? $defaultName; - if ($client !== $this->name && 'all' !== $client) { + if ($client !== $name && 'all' !== $client) { continue; } @@ -103,9 +101,4 @@ public function process(ContainerBuilder $container): void )); } } - - protected function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPass.php index d05f6f09e..c1f1ce970 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPass.php @@ -2,16 +2,13 @@ namespace Enqueue\Symfony\Client\DependencyInjection; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; final class BuildConsumptionExtensionsPass implements CompilerPassInterface { - use FormatClientNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.clients')) { @@ -19,11 +16,12 @@ public function process(ContainerBuilder $container): void } $names = $container->getParameter('enqueue.clients'); + $defaultName = $container->getParameter('enqueue.default_client'); foreach ($names as $name) { - $this->name = $name; + $diUtils = DiUtils::create(ClientFactory::MODULE, $name); - $extensionsId = $this->format('consumption_extensions'); + $extensionsId = $diUtils->format('consumption_extensions'); if (false == $container->hasDefinition($extensionsId)) { throw new \LogicException(sprintf('Service "%s" not found', $extensionsId)); } @@ -36,9 +34,9 @@ public function process(ContainerBuilder $container): void $groupByPriority = []; foreach ($tags as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { - $client = $tagAttribute['client'] ?? 'default'; + $client = $tagAttribute['client'] ?? $defaultName; - if ($client !== $this->name && 'all' !== $client) { + if ($client !== $name && 'all' !== $client) { continue; } @@ -62,9 +60,4 @@ public function process(ContainerBuilder $container): void )); } } - - protected function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildProcessorRegistryPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildProcessorRegistryPass.php index cdf40a832..3759dd209 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildProcessorRegistryPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildProcessorRegistryPass.php @@ -3,6 +3,7 @@ namespace Enqueue\Symfony\Client\DependencyInjection; use Enqueue\Client\RouteCollection; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -10,10 +11,6 @@ final class BuildProcessorRegistryPass implements CompilerPassInterface { - use FormatClientNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.clients')) { @@ -23,19 +20,19 @@ public function process(ContainerBuilder $container): void $names = $container->getParameter('enqueue.clients'); foreach ($names as $name) { - $this->name = $name; + $diUtils = DiUtils::create(ClientFactory::MODULE, $name); - $processorRegistryId = $this->format('processor_registry'); + $processorRegistryId = $diUtils->format('processor_registry'); if (false == $container->hasDefinition($processorRegistryId)) { throw new \LogicException(sprintf('Service "%s" not found', $processorRegistryId)); } - $routeCollectionId = $this->format('route_collection'); + $routeCollectionId = $diUtils->format('route_collection'); if (false == $container->hasDefinition($routeCollectionId)) { throw new \LogicException(sprintf('Service "%s" not found', $routeCollectionId)); } - $routerProcessorId = $this->format('router_processor'); + $routerProcessorId = $diUtils->format('router_processor'); if (false == $container->hasDefinition($routerProcessorId)) { throw new \LogicException(sprintf('Service "%s" not found', $routerProcessorId)); } @@ -51,15 +48,10 @@ public function process(ContainerBuilder $container): void $map[$route->getProcessor()] = new Reference($processorServiceId); } - $map[$this->parameter('router_processor')] = new Reference($routerProcessorId); + $map[$diUtils->parameter('router_processor')] = new Reference($routerProcessorId); $registry = $container->getDefinition($processorRegistryId); $registry->setArgument(0, ServiceLocatorTagPass::register($container, $map, $processorRegistryId)); } } - - private function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildProcessorRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildProcessorRoutesPass.php index c89f37427..e88cb1f83 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildProcessorRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildProcessorRoutesPass.php @@ -4,15 +4,12 @@ use Enqueue\Client\Route; use Enqueue\Client\RouteCollection; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; final class BuildProcessorRoutesPass implements CompilerPassInterface { - use FormatClientNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.clients')) { @@ -20,10 +17,11 @@ public function process(ContainerBuilder $container): void } $names = $container->getParameter('enqueue.clients'); + $defaultName = $container->getParameter('enqueue.default_client'); foreach ($names as $name) { - $this->name = $name; - $routeCollectionId = $this->format('route_collection'); + $diUtils = DiUtils::create(ClientFactory::MODULE, $name); + $routeCollectionId = $diUtils->format('route_collection'); if (false == $container->hasDefinition($routeCollectionId)) { throw new \LogicException(sprintf('Service "%s" not found', $routeCollectionId)); } @@ -32,9 +30,9 @@ public function process(ContainerBuilder $container): void $routeCollection = new RouteCollection([]); foreach ($container->findTaggedServiceIds($tag) as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { - $client = $tagAttribute['client'] ?? 'default'; + $client = $tagAttribute['client'] ?? $defaultName; - if ($client !== $this->name && 'all' !== $client) { + if ($client !== $name && 'all' !== $client) { continue; } @@ -76,9 +74,4 @@ public function process(ContainerBuilder $container): void )); } } - - protected function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php index f1b9ecc1c..3414d4918 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php @@ -5,15 +5,12 @@ use Enqueue\Client\Route; use Enqueue\Client\RouteCollection; use Enqueue\Client\TopicSubscriberInterface; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; final class BuildTopicSubscriberRoutesPass implements CompilerPassInterface { - use FormatClientNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.clients')) { @@ -21,10 +18,11 @@ public function process(ContainerBuilder $container): void } $names = $container->getParameter('enqueue.clients'); + $defaultName = $container->getParameter('enqueue.default_client'); foreach ($names as $name) { - $this->name = $name; - $routeCollectionId = $this->format('route_collection'); + $diUtils = DiUtils::create(ClientFactory::MODULE, $name); + $routeCollectionId = $diUtils->format('route_collection'); if (false == $container->hasDefinition($routeCollectionId)) { throw new \LogicException(sprintf('Service "%s" not found', $routeCollectionId)); } @@ -47,9 +45,9 @@ public function process(ContainerBuilder $container): void } foreach ($tagAttributes as $tagAttribute) { - $client = $tagAttribute['client'] ?? 'default'; + $client = $tagAttribute['client'] ?? $defaultName; - if ($client !== $this->name && 'all' !== $client) { + if ($client !== $name && 'all' !== $client) { continue; } @@ -99,9 +97,4 @@ public function process(ContainerBuilder $container): void )); } } - - protected function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php index 47d8e8ee5..0acf659f7 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php @@ -22,6 +22,8 @@ use Enqueue\Rpc\RpcFactory; use Enqueue\Symfony\Client\FlushSpoolProducerListener; use Enqueue\Symfony\ContainerProcessorRegistry; +use Enqueue\Symfony\DependencyInjection\TransportFactory; +use Enqueue\Symfony\DiUtils; use Interop\Queue\Context; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\NodeDefinition; @@ -34,17 +36,17 @@ */ final class ClientFactory { - use FormatClientNameTrait; + public const MODULE = 'client'; /** - * @var string + * @var bool */ - private $name; + private $default; /** - * @var bool + * @var DiUtils */ - private $default; + private $diUtils; public function __construct(string $name, bool $default = false) { @@ -52,8 +54,8 @@ public function __construct(string $name, bool $default = false) throw new \InvalidArgumentException('The name could not be empty.'); } - $this->name = $name; $this->default = $default; + $this->diUtils = DiUtils::create(self::MODULE, $name); } public static function getConfiguration(bool $debug, string $name = 'client'): NodeDefinition @@ -77,21 +79,21 @@ public static function getConfiguration(bool $debug, string $name = 'client'): N public function build(ContainerBuilder $container, array $config): void { - $container->register($this->format('context'), Context::class) - ->setFactory([$this->reference('driver'), 'getContext']) + $container->register($this->diUtils->format('context'), Context::class) + ->setFactory([$this->diUtils->reference('driver'), 'getContext']) ; - $container->register($this->format('driver_factory'), DriverFactory::class) - ->addArgument($this->reference('config')) - ->addArgument($this->reference('route_collection')) + $container->register($this->diUtils->format('driver_factory'), DriverFactory::class) + ->addArgument($this->diUtils->reference('config')) + ->addArgument($this->diUtils->reference('route_collection')) ; $routerProcessor = empty($config['router_processor']) - ? $this->format('router_processor') + ? $this->diUtils->format('router_processor') : $config['router_processor'] ; - $container->register($this->format('config'), Config::class) + $container->register($this->diUtils->format('config'), Config::class) ->setArguments([ $config['prefix'], $config['app_name'], @@ -103,86 +105,86 @@ public function build(ContainerBuilder $container, array $config): void $config['transport'], ]); - $container->setParameter($this->format('router_processor'), $routerProcessor); - $container->setParameter($this->format('router_queue_name'), $config['router_queue']); - $container->setParameter($this->format('default_queue_name'), $config['default_processor_queue']); + $container->setParameter($this->diUtils->format('router_processor'), $routerProcessor); + $container->setParameter($this->diUtils->format('router_queue_name'), $config['router_queue']); + $container->setParameter($this->diUtils->format('default_queue_name'), $config['default_processor_queue']); - $container->register($this->format('route_collection'), RouteCollection::class) + $container->register($this->diUtils->format('route_collection'), RouteCollection::class) ->addArgument([]) ->setFactory([RouteCollection::class, 'fromArray']) ; - $container->register($this->format('producer'), Producer::class) + $container->register($this->diUtils->format('producer'), Producer::class) ->setPublic(true) - ->addArgument($this->reference('driver')) - ->addArgument($this->reference('rpc_factory')) - ->addArgument($this->reference('client_extensions')) + ->addArgument($this->diUtils->reference('driver')) + ->addArgument($this->diUtils->reference('rpc_factory')) + ->addArgument($this->diUtils->reference('client_extensions')) ; - $container->register($this->format('spool_producer'), SpoolProducer::class) - ->addArgument($this->reference('producer')) + $container->register($this->diUtils->format('spool_producer'), SpoolProducer::class) + ->addArgument($this->diUtils->reference('producer')) ; - $container->register($this->format('client_extensions'), ChainExtension::class) + $container->register($this->diUtils->format('client_extensions'), ChainExtension::class) ->addArgument([]) ; - $container->register($this->format('rpc_factory'), RpcFactory::class) - ->addArgument($this->reference('context')) + $container->register($this->diUtils->format('rpc_factory'), RpcFactory::class) + ->addArgument($this->diUtils->reference('context')) ; - $container->register($this->format('router_processor'), RouterProcessor::class) - ->addArgument($this->reference('driver')) + $container->register($this->diUtils->format('router_processor'), RouterProcessor::class) + ->addArgument($this->diUtils->reference('driver')) ; - $container->register($this->format('processor_registry'), ContainerProcessorRegistry::class); + $container->register($this->diUtils->format('processor_registry'), ContainerProcessorRegistry::class); - $container->register($this->format('delegate_processor'), DelegateProcessor::class) - ->addArgument($this->reference('processor_registry')) + $container->register($this->diUtils->format('delegate_processor'), DelegateProcessor::class) + ->addArgument($this->diUtils->reference('processor_registry')) ; - $container->register($this->format('set_router_properties_extension'), SetRouterPropertiesExtension::class) - ->addArgument($this->reference('driver')) - ->addTag('enqueue.consumption_extension', ['priority' => 100, 'client' => $this->name]) + $container->register($this->diUtils->format('set_router_properties_extension'), SetRouterPropertiesExtension::class) + ->addArgument($this->diUtils->reference('driver')) + ->addTag('enqueue.consumption_extension', ['priority' => 100, 'client' => $this->diUtils->getConfigName()]) ; - $container->register($this->format('queue_consumer'), QueueConsumer::class) - ->addArgument($this->reference('context')) - ->addArgument($this->reference('consumption_extensions')) + $container->register($this->diUtils->format('queue_consumer'), QueueConsumer::class) + ->addArgument($this->diUtils->reference('context')) + ->addArgument($this->diUtils->reference('consumption_extensions')) ->addArgument([]) - ->addArgument($this->reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE)) + ->addArgument($this->diUtils->reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE)) ->addArgument($config['consumption']['receive_timeout']) ; - $container->register($this->format('consumption_extensions'), ConsumptionChainExtension::class) + $container->register($this->diUtils->format('consumption_extensions'), ConsumptionChainExtension::class) ->addArgument([]) ; - $container->register($this->format('flush_spool_producer_extension'), FlushSpoolProducerExtension::class) - ->addArgument($this->reference('spool_producer')) - ->addTag('enqueue.consumption.extension', ['priority' => -100, 'client' => $this->name]) + $container->register($this->diUtils->format('flush_spool_producer_extension'), FlushSpoolProducerExtension::class) + ->addArgument($this->diUtils->reference('spool_producer')) + ->addTag('enqueue.consumption.extension', ['priority' => -100, 'client' => $this->diUtils->getConfigName()]) ; - $container->register($this->format('exclusive_command_extension'), ExclusiveCommandExtension::class) - ->addArgument($this->reference('driver')) - ->addTag('enqueue.consumption.extension', ['priority' => 100, 'client' => $this->name]) + $container->register($this->diUtils->format('exclusive_command_extension'), ExclusiveCommandExtension::class) + ->addArgument($this->diUtils->reference('driver')) + ->addTag('enqueue.consumption.extension', ['priority' => 100, 'client' => $this->diUtils->getConfigName()]) ; if ($config['traceable_producer']) { - $container->register($this->format('traceable_producer'), TraceableProducer::class) - ->setDecoratedService($this->format('producer')) - ->addArgument($this->reference('traceable_producer.inner')) + $container->register($this->diUtils->format('traceable_producer'), TraceableProducer::class) + ->setDecoratedService($this->diUtils->format('producer')) + ->addArgument($this->diUtils->reference('traceable_producer.inner')) ; } if ($config['redelivered_delay_time']) { - $container->register($this->format('delay_redelivered_message_extension'), DelayRedeliveredMessageExtension::class) - ->addArgument($this->reference('driver')) + $container->register($this->diUtils->format('delay_redelivered_message_extension'), DelayRedeliveredMessageExtension::class) + ->addArgument($this->diUtils->reference('driver')) ->addArgument($config['redelivered_delay_time']) - ->addTag('enqueue.consumption_extension', ['priority' => 10, 'client' => $this->name]) + ->addTag('enqueue.consumption_extension', ['priority' => 10, 'client' => $this->diUtils->getConfigName()]) ; - $container->getDefinition($this->format('delay_redelivered_message_extension')) + $container->getDefinition($this->diUtils->format('delay_redelivered_message_extension')) ->replaceArgument(1, $config['redelivered_delay_time']) ; } @@ -191,24 +193,29 @@ public function build(ContainerBuilder $container, array $config): void if ($container->hasDefinition($locatorId)) { $locator = $container->getDefinition($locatorId); $locator->replaceArgument(0, array_replace($locator->getArgument(0), [ - $this->format('queue_consumer') => $this->reference('queue_consumer'), - $this->format('driver') => $this->reference('driver'), - $this->format('delegate_processor') => $this->reference('delegate_processor'), - $this->format('producer') => $this->reference('producer'), + $this->diUtils->format('queue_consumer') => $this->diUtils->reference('queue_consumer'), + $this->diUtils->format('driver') => $this->diUtils->reference('driver'), + $this->diUtils->format('delegate_processor') => $this->diUtils->reference('delegate_processor'), + $this->diUtils->format('producer') => $this->diUtils->reference('producer'), ])); } if ($this->default) { - $container->setAlias(ProducerInterface::class, $this->format('producer')); - $container->setAlias(SpoolProducer::class, $this->format('spool_producer')); + $container->setAlias(ProducerInterface::class, $this->diUtils->format('producer')); + $container->setAlias(SpoolProducer::class, $this->diUtils->format('spool_producer')); + + if (DiUtils::DEFAULT_CONFIG !== $this->diUtils->getConfigName()) { + $container->setAlias($this->diUtils->formatDefault('producer'), $this->diUtils->format('producer')); + $container->setAlias($this->diUtils->formatDefault('spool_producer'), $this->diUtils->format('spool_producer')); + } } } public function createDriver(ContainerBuilder $container, array $config): string { - $factoryId = sprintf('enqueue.transport.%s.connection_factory', $this->getName()); - $driverId = sprintf('enqueue.client.%s.driver', $this->getName()); - $driverFactoryId = sprintf('enqueue.client.%s.driver_factory', $this->getName()); + $factoryId = DiUtils::create(TransportFactory::MODULE, $this->diUtils->getConfigName())->format('connection_factory'); + $driverId = $this->diUtils->format('driver'); + $driverFactoryId = $this->diUtils->format('driver_factory'); $container->register($driverId, DriverInterface::class) ->setFactory([new Reference($driverFactoryId), 'create']) @@ -217,19 +224,22 @@ public function createDriver(ContainerBuilder $container, array $config): string ->addArgument($config) ; + if ($this->default) { + $container->setAlias(DriverInterface::class, $driverId); + + if (DiUtils::DEFAULT_CONFIG !== $this->diUtils->getConfigName()) { + $container->setAlias($this->diUtils->formatDefault('driver'), $driverId); + } + } + return $driverId; } public function createFlushSpoolProducerListener(ContainerBuilder $container): void { - $container->register($this->format('flush_spool_producer_listener'), FlushSpoolProducerListener::class) - ->addArgument($this->reference('spool_producer')) + $container->register($this->diUtils->format('flush_spool_producer_listener'), FlushSpoolProducerListener::class) + ->addArgument($this->diUtils->reference('spool_producer')) ->addTag('kernel.event_subscriber') ; } - - public function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/FormatClientNameTrait.php b/pkg/enqueue/Symfony/Client/DependencyInjection/FormatClientNameTrait.php deleted file mode 100644 index 41dace8bb..000000000 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/FormatClientNameTrait.php +++ /dev/null @@ -1,30 +0,0 @@ -format($serviceName), $invalidBehavior); - } - - private function parameter(string $serviceName): string - { - $fullName = $this->format($serviceName); - - return "%$fullName%"; - } - - private function format(string $serviceName): string - { - $pattern = 'enqueue.client.%s.'.$serviceName; - - return sprintf($pattern, $this->getName()); - } -} diff --git a/pkg/enqueue/Symfony/DependencyInjection/BuildConsumptionExtensionsPass.php b/pkg/enqueue/Symfony/DependencyInjection/BuildConsumptionExtensionsPass.php index 857ddf278..352682b19 100644 --- a/pkg/enqueue/Symfony/DependencyInjection/BuildConsumptionExtensionsPass.php +++ b/pkg/enqueue/Symfony/DependencyInjection/BuildConsumptionExtensionsPass.php @@ -2,16 +2,13 @@ namespace Enqueue\Symfony\DependencyInjection; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; final class BuildConsumptionExtensionsPass implements CompilerPassInterface { - use FormatTransportNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.transports')) { @@ -19,11 +16,12 @@ public function process(ContainerBuilder $container): void } $names = $container->getParameter('enqueue.transports'); + $defaultName = $container->getParameter('enqueue.default_transport'); foreach ($names as $name) { - $this->name = $name; + $diUtils = DiUtils::create(TransportFactory::MODULE, $name); - $extensionsId = $this->format('consumption_extensions'); + $extensionsId = $diUtils->format('consumption_extensions'); if (false == $container->hasDefinition($extensionsId)) { throw new \LogicException(sprintf('Service "%s" not found', $extensionsId)); } @@ -33,9 +31,9 @@ public function process(ContainerBuilder $container): void $groupByPriority = []; foreach ($tags as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { - $transport = $tagAttribute['transport'] ?? 'default'; + $transport = $tagAttribute['transport'] ?? $defaultName; - if ($transport !== $this->name && 'all' !== $transport) { + if ($transport !== $name && 'all' !== $transport) { continue; } @@ -59,9 +57,4 @@ public function process(ContainerBuilder $container): void )); } } - - protected function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/DependencyInjection/BuildProcessorRegistryPass.php b/pkg/enqueue/Symfony/DependencyInjection/BuildProcessorRegistryPass.php index c9b7f8b3a..cc6e04270 100644 --- a/pkg/enqueue/Symfony/DependencyInjection/BuildProcessorRegistryPass.php +++ b/pkg/enqueue/Symfony/DependencyInjection/BuildProcessorRegistryPass.php @@ -2,6 +2,7 @@ namespace Enqueue\Symfony\DependencyInjection; +use Enqueue\Symfony\DiUtils; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -9,10 +10,6 @@ final class BuildProcessorRegistryPass implements CompilerPassInterface { - use FormatTransportNameTrait; - - protected $name; - public function process(ContainerBuilder $container): void { if (false == $container->hasParameter('enqueue.transports')) { @@ -20,11 +17,12 @@ public function process(ContainerBuilder $container): void } $names = $container->getParameter('enqueue.transports'); + $defaultName = $container->getParameter('enqueue.default_transport'); foreach ($names as $name) { - $this->name = $name; + $diUtils = DiUtils::create(TransportFactory::MODULE, $name); - $processorRegistryId = $this->format('processor_registry'); + $processorRegistryId = $diUtils->format('processor_registry'); if (false == $container->hasDefinition($processorRegistryId)) { throw new \LogicException(sprintf('Service "%s" not found', $processorRegistryId)); } @@ -33,9 +31,9 @@ public function process(ContainerBuilder $container): void $map = []; foreach ($container->findTaggedServiceIds($tag) as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { - $transport = $tagAttribute['transport'] ?? 'default'; + $transport = $tagAttribute['transport'] ?? $defaultName; - if ($transport !== $this->name && 'all' !== $transport) { + if ($transport !== $name && 'all' !== $transport) { continue; } @@ -49,9 +47,4 @@ public function process(ContainerBuilder $container): void $registry->setArgument(0, ServiceLocatorTagPass::register($container, $map, $processorRegistryId)); } } - - protected function getName(): string - { - return $this->name; - } } diff --git a/pkg/enqueue/Symfony/DependencyInjection/FormatTransportNameTrait.php b/pkg/enqueue/Symfony/DependencyInjection/FormatTransportNameTrait.php deleted file mode 100644 index dd0fdd7bc..000000000 --- a/pkg/enqueue/Symfony/DependencyInjection/FormatTransportNameTrait.php +++ /dev/null @@ -1,30 +0,0 @@ -format($serviceName), $invalidBehavior); - } - - private function parameter(string $serviceName): string - { - $fullName = $this->format($serviceName); - - return "%$fullName%"; - } - - private function format(string $serviceName): string - { - $pattern = 'enqueue.transport.%s.'.$serviceName; - - return sprintf($pattern, $this->getName()); - } -} diff --git a/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php b/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php index eb9454b3a..5cc1a6507 100644 --- a/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php +++ b/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php @@ -12,6 +12,7 @@ use Enqueue\Rpc\RpcClient; use Enqueue\Rpc\RpcFactory; use Enqueue\Symfony\ContainerProcessorRegistry; +use Enqueue\Symfony\DiUtils; use Interop\Queue\ConnectionFactory; use Interop\Queue\Context; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; @@ -25,17 +26,17 @@ */ final class TransportFactory { - use FormatTransportNameTrait; + public const MODULE = 'transport'; /** - * @var string + * @var bool */ - private $name; + private $default; /** - * @var bool + * @var DiUtils */ - private $default; + private $diUtils; public function __construct(string $name, bool $default = false) { @@ -43,8 +44,8 @@ public function __construct(string $name, bool $default = false) throw new \InvalidArgumentException('The name could not be empty.'); } - $this->name = $name; $this->default = $default; + $this->diUtils = DiUtils::create(self::MODULE, $name); } public static function getConfiguration(string $name = 'transport'): NodeDefinition @@ -123,16 +124,11 @@ public static function getQueueConsumerConfiguration(string $name = 'consumption return $builder; } - public function getName(): string - { - return $this->name; - } - public function buildConnectionFactory(ContainerBuilder $container, array $config): void { - $factoryId = $this->format('connection_factory'); + $factoryId = $this->diUtils->format('connection_factory'); - $factoryFactoryId = $this->format('connection_factory_factory'); + $factoryFactoryId = $this->diUtils->format('connection_factory_factory'); $container->register($factoryFactoryId, $config['factory_class'] ?? ConnectionFactoryFactory::class); $factoryFactoryService = new Reference( @@ -156,16 +152,20 @@ public function buildConnectionFactory(ContainerBuilder $container, array $confi } if ($this->default) { - $container->setAlias(ConnectionFactory::class, $this->format('connection_factory')); + $container->setAlias(ConnectionFactory::class, $factoryId); + + if (DiUtils::DEFAULT_CONFIG !== $this->diUtils->getConfigName()) { + $container->setAlias($this->diUtils->formatDefault('connection_factory'), $factoryId); + } } } public function buildContext(ContainerBuilder $container, array $config): void { - $factoryId = $this->format('connection_factory'); + $factoryId = $this->diUtils->format('connection_factory'); $this->assertServiceExists($container, $factoryId); - $contextId = $this->format('context'); + $contextId = $this->diUtils->format('context'); $container->register($contextId, Context::class) ->setFactory([new Reference($factoryId), 'createContext']) @@ -174,60 +174,72 @@ public function buildContext(ContainerBuilder $container, array $config): void $this->addServiceToLocator($container, 'context'); if ($this->default) { - $container->setAlias(Context::class, $this->format('context')); + $container->setAlias(Context::class, $contextId); + + if (DiUtils::DEFAULT_CONFIG !== $this->diUtils->getConfigName()) { + $container->setAlias($this->diUtils->formatDefault('context'), $contextId); + } } } public function buildQueueConsumer(ContainerBuilder $container, array $config): void { - $contextId = $this->format('context'); + $contextId = $this->diUtils->format('context'); $this->assertServiceExists($container, $contextId); - $container->setParameter($this->format('receive_timeout'), $config['receive_timeout'] ?? 10000); + $container->setParameter($this->diUtils->format('receive_timeout'), $config['receive_timeout'] ?? 10000); - $logExtensionId = $this->format('log_extension'); + $logExtensionId = $this->diUtils->format('log_extension'); $container->register($logExtensionId, LogExtension::class) - ->addTag('enqueue.transport.consumption_extension', ['transport' => $this->name, 'priority' => -100]) + ->addTag('enqueue.transport.consumption_extension', ['transport' => $this->diUtils->getConfigName(), 'priority' => -100]) ; - $container->register($this->format('consumption_extensions'), ChainExtension::class) + $container->register($this->diUtils->format('consumption_extensions'), ChainExtension::class) ->addArgument([]) ; - $container->register($this->format('queue_consumer'), QueueConsumer::class) + $container->register($this->diUtils->format('queue_consumer'), QueueConsumer::class) ->addArgument(new Reference($contextId)) - ->addArgument(new Reference($this->format('consumption_extensions'))) + ->addArgument(new Reference($this->diUtils->format('consumption_extensions'))) ->addArgument([]) ->addArgument(new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE)) - ->addArgument($this->parameter('receive_timeout')) + ->addArgument($this->diUtils->parameter('receive_timeout')) ; - $container->register($this->format('processor_registry'), ContainerProcessorRegistry::class); + $container->register($this->diUtils->format('processor_registry'), ContainerProcessorRegistry::class); $this->addServiceToLocator($container, 'queue_consumer'); $this->addServiceToLocator($container, 'processor_registry'); if ($this->default) { - $container->setAlias(QueueConsumerInterface::class, $this->format('queue_consumer')); + $container->setAlias(QueueConsumerInterface::class, $this->diUtils->format('queue_consumer')); + + if (DiUtils::DEFAULT_CONFIG !== $this->diUtils->getConfigName()) { + $container->setAlias($this->diUtils->formatDefault('queue_consumer'), $this->diUtils->format('queue_consumer')); + } } } public function buildRpcClient(ContainerBuilder $container, array $config): void { - $contextId = $this->format('context'); + $contextId = $this->diUtils->format('context'); $this->assertServiceExists($container, $contextId); - $container->register($this->format('rpc_factory'), RpcFactory::class) + $container->register($this->diUtils->format('rpc_factory'), RpcFactory::class) ->addArgument(new Reference($contextId)) ; - $container->register($this->format('rpc_client'), RpcClient::class) + $container->register($this->diUtils->format('rpc_client'), RpcClient::class) ->addArgument(new Reference($contextId)) - ->addArgument(new Reference($this->format('rpc_factory'))) + ->addArgument(new Reference($this->diUtils->format('rpc_factory'))) ; if ($this->default) { - $container->setAlias(RpcClient::class, $this->format('rpc_client')); + $container->setAlias(RpcClient::class, $this->diUtils->format('rpc_client')); + + if (DiUtils::DEFAULT_CONFIG !== $this->diUtils->getConfigName()) { + $container->setAlias($this->diUtils->formatDefault('rpc_client'), $this->diUtils->format('rpc_client')); + } } } @@ -246,7 +258,7 @@ private function addServiceToLocator(ContainerBuilder $container, string $servic $locator = $container->getDefinition($locatorId); $map = $locator->getArgument(0); - $map[$this->format($serviceName)] = $this->reference($serviceName); + $map[$this->diUtils->format($serviceName)] = $this->diUtils->reference($serviceName); $locator->replaceArgument(0, $map); } diff --git a/pkg/enqueue/Symfony/DiUtils.php b/pkg/enqueue/Symfony/DiUtils.php index 678104312..335ff04b9 100644 --- a/pkg/enqueue/Symfony/DiUtils.php +++ b/pkg/enqueue/Symfony/DiUtils.php @@ -7,6 +7,8 @@ class DiUtils { + public const DEFAULT_CONFIG = 'default'; + /** * @var string */ @@ -43,6 +45,11 @@ public function reference(string $serviceName, $invalidBehavior = ContainerInter return new Reference($this->format($serviceName), $invalidBehavior); } + public function referenceDefault(string $serviceName, $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE): Reference + { + return new Reference($this->formatDefault($serviceName), $invalidBehavior); + } + public function parameter(string $serviceName): string { $fullName = $this->format($serviceName); @@ -50,8 +57,25 @@ public function parameter(string $serviceName): string return "%$fullName%"; } + public function parameterDefault(string $serviceName): string + { + $fullName = $this->formatDefault($serviceName); + + return "%$fullName%"; + } + public function format(string $serviceName): string { - return sprintf('enqueue.%s.%s.%s', $this->moduleName, $this->configName, $serviceName); + return $this->doFormat($this->moduleName, $this->configName, $serviceName); + } + + public function formatDefault(string $serviceName): string + { + return $this->doFormat($this->moduleName, self::DEFAULT_CONFIG, $serviceName); + } + + private function doFormat(string $moduleName, string $configName, string $serviceName): string + { + return sprintf('enqueue.%s.%s.%s', $moduleName, $configName, $serviceName); } } diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index fc42d772b..31b2159fd 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -7,8 +7,8 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/amqp-interop": "0.8.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/amqp-interop": "^0.8", + "queue-interop/queue-interop": "^0.7", "enqueue/null": "0.9.x-dev", "enqueue/dsn": "0.9.x-dev", "ramsey/uuid": "^2|^3.5", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 13d3df8a7..cb7cd4732 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "enqueue/dsn": "0.9.x-dev", "symfony/filesystem": "^3.4|^4", "makasim/temp-file": "^0.2@stable" @@ -16,7 +16,7 @@ "phpunit/phpunit": "~5.5", "enqueue/null": "0.9.x-dev", "enqueue/test": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev", + "queue-interop/queue-spec": "^0.6", "symfony/dependency-injection": "^3.4|^4" }, "support": { diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index 52750af3d..e23162405 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -8,13 +8,13 @@ "require": { "php": "^7.1.3", "ext-gearman": "^2.0", - "queue-interop/queue-interop": "0.7.x-dev" + "queue-interop/queue-interop": "^0.7" }, "require-dev": { "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index aede85d7f..bb37b07e3 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -7,14 +7,14 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "google/cloud-pubsub": "^1.0", "enqueue/dsn": "0.9.x-dev" }, "require-dev": { "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 7ea67465e..54efca4a4 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "enqueue/enqueue": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "doctrine/orm": "~2.4" }, "require-dev": { diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index 11bd5ae24..b3afedb03 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -11,13 +11,13 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "mongodb/mongodb": "^1.2", "ext-mongodb": "^1.3" }, "require-dev": { "phpunit/phpunit": "~5.4.0", - "queue-interop/queue-spec": "0.6.x-dev", + "queue-interop/queue-spec": "^0.6", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev" }, diff --git a/pkg/monitoring/Symfony/DependencyInjection/MonitoringFactory.php b/pkg/monitoring/Symfony/DependencyInjection/MonitoringFactory.php index 201bfa569..f32946d77 100644 --- a/pkg/monitoring/Symfony/DependencyInjection/MonitoringFactory.php +++ b/pkg/monitoring/Symfony/DependencyInjection/MonitoringFactory.php @@ -18,6 +18,8 @@ */ final class MonitoringFactory { + public const MODULE = 'monitoring'; + /** * @var DiUtils */ @@ -29,7 +31,7 @@ public function __construct(string $name) throw new \InvalidArgumentException('The name could not be empty.'); } - $this->diUtils = DiUtils::create('monitoring', $name); + $this->diUtils = DiUtils::create(self::MODULE, $name); } public static function getConfiguration(string $name = 'monitoring'): ArrayNodeDefinition diff --git a/pkg/null/composer.json b/pkg/null/composer.json index e17435633..cb900e1cd 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -7,12 +7,12 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "0.7.x-dev" + "queue-interop/queue-interop": "^0.7" }, "require-dev": { "phpunit/phpunit": "~5.5", "enqueue/test": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index dcf5408c8..38ea2ee80 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -8,13 +8,13 @@ "require": { "php": "^7.1.3", "pda/pheanstalk": "^3", - "queue-interop/queue-interop": "0.7.x-dev" + "queue-interop/queue-interop": "^0.7" }, "require-dev": { "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 18374e108..9ec0d2f20 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -8,13 +8,13 @@ "require": { "php": "^7.1.3", "ext-rdkafka": "^3.0.3", - "queue-interop/queue-interop": "0.7.x-dev" + "queue-interop/queue-interop": "^0.7" }, "require-dev": { "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev", + "queue-interop/queue-spec": "^0.6", "kwn/php-rdkafka-stubs": "^1.0.2" }, "support": { diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 73b2236a3..41931ffa8 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "enqueue/dsn": "0.9.x-dev", "ramsey/uuid": "^3" }, @@ -16,7 +16,7 @@ "predis/predis": "^1.1", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 4f6c07a55..e204c0586 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -8,8 +8,8 @@ "require": { "php": "^7.1.3", "enqueue/enqueue": "0.9.x-dev", - "queue-interop/amqp-interop": "0.8.x-dev", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/amqp-interop": "^0.8", + "queue-interop/queue-interop": "^0.7", "symfony/config": "^3.4|^4" }, "require-dev": { diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index eac171369..c6c4d07fe 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -7,14 +7,14 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "enqueue/dsn": "0.9.x-dev", "aws/aws-sdk-php": "~3.26" }, "require-dev": { "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 28e73f1ee..ba79e4c2f 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "enqueue/dsn": "0.9.x-dev", "stomp-php/stomp-php": "^4", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "php-http/guzzle6-adapter": "^1.1", "php-http/client-common": "^1.7@dev", "richardfullmer/rabbitmq-management-api": "^2.0" @@ -18,7 +18,7 @@ "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index edb1bcc86..62a48c735 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "0.7.x-dev", + "queue-interop/queue-interop": "^0.7", "enqueue/dsn": "0.9.x-dev", "thruway/pawl-transport": "^0.5.0", "voryx/thruway": "^0.5.3" @@ -16,7 +16,7 @@ "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-spec": "0.6.x-dev" + "queue-interop/queue-spec": "^0.6" }, "support": { "email": "opensource@forma-pro.com", From ea0a50c940615ce777ec29434f046c814f13f62f Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Fri, 16 Nov 2018 14:59:34 +0200 Subject: [PATCH 0427/1142] multi client configuration --- .../BuildClientExtensionsPassTest.php | 30 +++++++----- .../BuildCommandSubscriberRoutesPassTest.php | 48 ++++++++++++------- .../BuildConsumptionExtensionsPassTest.php | 48 +++++++++++-------- .../BuildProcessorRoutesPassTest.php | 42 +++++++++------- .../BuildTopicSubscriberRoutesPassTest.php | 47 +++++++++++------- .../DependencyInjection/ClientFactoryTest.php | 7 --- .../BuildConsumptionExtensionsPassTest.php | 48 +++++++++++-------- .../BuildProcessorRegistryPassTest.php | 19 +++++--- .../TransportFactoryTest.php | 7 --- 9 files changed, 170 insertions(+), 126 deletions(-) diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php index e1c8bdcf4..af69293d1 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php @@ -43,6 +43,7 @@ public function testThrowsIfNoClientExtensionsServiceFoundForConfiguredTransport { $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo', 'bar']); + $container->setParameter('enqueue.default_client', 'foo'); $pass = new BuildClientExtensionsPass(); @@ -58,6 +59,7 @@ public function testShouldRegisterClientExtension() $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['aName']); + $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.aName.client_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) @@ -84,6 +86,7 @@ public function testShouldIgnoreOtherClientExtensions() $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['aName']); + $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.aName.client_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) @@ -109,6 +112,7 @@ public function testShouldAddExtensionIfClientAll() $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['aName']); + $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.aName.client_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) @@ -133,8 +137,9 @@ public function testShouldTreatTagsWithoutClientAsDefaultClient() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.client_extensions', $extensions); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.client_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) ->addTag('enqueue.client_extension') @@ -156,11 +161,12 @@ public function testShouldTreatTagsWithoutClientAsDefaultClient() public function testShouldOrderExtensionsByPriority() { $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); $extensions = new Definition(); $extensions->addArgument([]); - $container->setDefinition('enqueue.client.default.client_extensions', $extensions); + $container->setDefinition('enqueue.client.foo.client_extensions', $extensions); $extension = new Definition(); $extension->addTag('enqueue.client_extension', ['priority' => 6]); @@ -188,11 +194,12 @@ public function testShouldOrderExtensionsByPriority() public function testShouldAssumePriorityZeroIfPriorityIsNotSet() { $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); $extensions = new Definition(); $extensions->addArgument([]); - $container->setDefinition('enqueue.client.default.client_extensions', $extensions); + $container->setDefinition('enqueue.client.foo.client_extensions', $extensions); $extension = new Definition(); $extension->addTag('enqueue.client_extension'); @@ -226,8 +233,9 @@ public function testShouldMergeWithAddedPreviously() ]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['aName']); - $container->setDefinition('enqueue.client.aName.client_extensions', $extensions); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.client_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) ->addTag('enqueue.client_extension') @@ -240,10 +248,7 @@ public function testShouldMergeWithAddedPreviously() $pass->process($container); $this->assertInternalType('array', $extensions->getArgument(0)); - $this->assertEquals([ - 'aBarExtension' => 'aBarServiceIdAddedPreviously', - 'aOloloExtension' => 'aOloloServiceIdAddedPreviously', - ], $extensions->getArgument(0)); + $this->assertCount(4, $extensions->getArgument(0)); } public function testShouldRegisterProcessorWithMatchedNameToCorrespondingExtensions() @@ -256,6 +261,7 @@ public function testShouldRegisterProcessorWithMatchedNameToCorrespondingExtensi $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo', 'bar']); + $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.client_extensions', $fooExtensions); $container->setDefinition('enqueue.client.bar.client_extensions', $barExtensions); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php index e077a768c..603f0fb0d 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php @@ -47,6 +47,7 @@ public function testThrowsIfNoRouteCollectionServiceFoundForConfiguredTransport( { $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo', 'bar']); + $container->setParameter('enqueue.default_client', 'baz'); $pass = new BuildCommandSubscriberRoutesPass(); @@ -59,6 +60,7 @@ public function testThrowIfTaggedProcessorIsBuiltByFactory() { $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['aName']); + $container->setParameter('enqueue.default_client', 'foo'); $container->register('enqueue.client.aName.route_collection', RouteCollection::class) ->addArgument([]) ; @@ -81,6 +83,7 @@ public function testShouldRegisterProcessorWithMatchedName() $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($this->createCommandSubscriberProcessor())) ->addTag('enqueue.command_subscriber', ['client' => 'foo']) @@ -103,8 +106,9 @@ public function testShouldRegisterProcessorWithoutNameToDefaultClient() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($this->createCommandSubscriberProcessor())) ->addTag('enqueue.command_subscriber') ; @@ -126,8 +130,9 @@ public function testShouldRegisterProcessorIfClientNameEqualsAll() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($this->createCommandSubscriberProcessor())) ->addTag('enqueue.command_subscriber', ['client' => 'all']) ; @@ -151,8 +156,9 @@ public function testShouldRegisterProcessorIfCommandsIsString() $processor = $this->createCommandSubscriberProcessor('fooCommand'); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.command_subscriber') ; @@ -184,8 +190,9 @@ public function testThrowIfCommandSubscriberReturnsNothing() $processor = $this->createCommandSubscriberProcessor(null); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.command_subscriber') ; @@ -205,8 +212,9 @@ public function testShouldRegisterProcessorIfCommandsAreStrings() $processor = $this->createCommandSubscriberProcessor(['fooCommand', 'barCommand']); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.command_subscriber') ; @@ -248,8 +256,9 @@ public function testShouldRegisterProcessorIfParamSingleCommandArray() ]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.command_subscriber') ; @@ -286,8 +295,9 @@ public function testShouldRegisterProcessorIfCommandsAreParamArrays() ]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.command_subscriber') ; @@ -327,8 +337,9 @@ public function testThrowIfCommandSubscriberParamsInvalid() $processor = $this->createCommandSubscriberProcessor(['fooBar', true]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.command_subscriber') ; @@ -351,8 +362,9 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() $processor = $this->createCommandSubscriberProcessor(['fooCommand']); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.command_subscriber') ; diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php index d3936fedd..db991e982 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php @@ -43,6 +43,7 @@ public function testThrowsIfNoConsumptionExtensionsServiceFoundForConfiguredTran { $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo', 'bar']); + $container->setParameter('enqueue.default_client', 'baz'); $pass = new BuildConsumptionExtensionsPass(); @@ -57,14 +58,15 @@ public function testShouldRegisterClientExtension() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['aName']); - $container->setDefinition('enqueue.client.aName.consumption_extensions', $extensions); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) - ->addTag('enqueue.consumption_extension', ['client' => 'aName']) + ->addTag('enqueue.consumption_extension', ['client' => 'foo']) ; $container->register('aBarExtension', ExtensionInterface::class) - ->addTag('enqueue.consumption_extension', ['client' => 'aName']) + ->addTag('enqueue.consumption_extension', ['client' => 'foo']) ; $pass = new BuildConsumptionExtensionsPass(); @@ -83,11 +85,12 @@ public function testShouldIgnoreOtherClientExtensions() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['aName']); - $container->setDefinition('enqueue.client.aName.consumption_extensions', $extensions); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) - ->addTag('enqueue.consumption_extension', ['client' => 'aName']) + ->addTag('enqueue.consumption_extension', ['client' => 'foo']) ; $container->register('aBarExtension', ExtensionInterface::class) ->addTag('enqueue.consumption_extension', ['client' => 'anotherName']) @@ -108,8 +111,9 @@ public function testShouldAddExtensionIfClientAll() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['aName']); - $container->setDefinition('enqueue.client.aName.consumption_extensions', $extensions); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) ->addTag('enqueue.consumption_extension', ['client' => 'all']) @@ -133,8 +137,9 @@ public function testShouldTreatTagsWithoutClientAsDefaultClient() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.consumption_extensions', $extensions); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) ->addTag('enqueue.consumption_extension') @@ -156,11 +161,12 @@ public function testShouldTreatTagsWithoutClientAsDefaultClient() public function testShouldOrderExtensionsByPriority() { $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); $extensions = new Definition(); $extensions->addArgument([]); - $container->setDefinition('enqueue.client.default.consumption_extensions', $extensions); + $container->setDefinition('enqueue.client.foo.consumption_extensions', $extensions); $extension = new Definition(); $extension->addTag('enqueue.consumption_extension', ['priority' => 6]); @@ -188,11 +194,12 @@ public function testShouldOrderExtensionsByPriority() public function testShouldAssumePriorityZeroIfPriorityIsNotSet() { $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); $extensions = new Definition(); $extensions->addArgument([]); - $container->setDefinition('enqueue.client.default.consumption_extensions', $extensions); + $container->setDefinition('enqueue.client.foo.consumption_extensions', $extensions); $extension = new Definition(); $extension->addTag('enqueue.consumption_extension'); @@ -226,8 +233,9 @@ public function testShouldMergeWithAddedPreviously() ]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['aName']); - $container->setDefinition('enqueue.client.aName.consumption_extensions', $extensions); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) ->addTag('enqueue.consumption_extension') @@ -240,10 +248,7 @@ public function testShouldMergeWithAddedPreviously() $pass->process($container); $this->assertInternalType('array', $extensions->getArgument(0)); - $this->assertEquals([ - 'aBarExtension' => 'aBarServiceIdAddedPreviously', - 'aOloloExtension' => 'aOloloServiceIdAddedPreviously', - ], $extensions->getArgument(0)); + $this->assertCount(4, $extensions->getArgument(0)); } public function testShouldRegisterProcessorWithMatchedNameToCorrespondingExtensions() @@ -256,6 +261,7 @@ public function testShouldRegisterProcessorWithMatchedNameToCorrespondingExtensi $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo', 'bar']); + $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.consumption_extensions', $fooExtensions); $container->setDefinition('enqueue.client.bar.consumption_extensions', $barExtensions); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php index e671f7a8b..74553e6eb 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php @@ -43,6 +43,7 @@ public function testThrowsIfNoRouteCollectionServiceFoundForConfiguredTransport( { $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo', 'bar']); + $container->setParameter('enqueue.default_client', 'baz'); $pass = new BuildProcessorRoutesPass(); @@ -57,8 +58,9 @@ public function testThrowIfBothTopicAndCommandAttributesAreSet() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', ['topic' => 'foo', 'command' => 'bar']) ; @@ -76,8 +78,9 @@ public function testThrowIfNeitherTopicNorCommandAttributesAreSet() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', []) ; @@ -96,6 +99,7 @@ public function testShouldRegisterProcessorWithMatchedName() $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'bar'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', ['client' => 'foo', 'topic' => 'foo']) @@ -118,8 +122,9 @@ public function testShouldRegisterProcessorWithoutNameToDefaultClient() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', ['topic' => 'foo']) ; @@ -141,8 +146,9 @@ public function testShouldRegisterProcessorIfClientNameEqualsAll() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', ['client' => 'all', 'topic' => 'foo']) ; @@ -164,8 +170,9 @@ public function testShouldRegisterAsTopicProcessor() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', ['topic' => 'aTopic']) ; @@ -195,8 +202,9 @@ public function testShouldRegisterAsCommandProcessor() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', ['command' => 'aCommand']) ; @@ -226,8 +234,9 @@ public function testShouldRegisterWithCustomProcessorName() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', ['command' => 'aCommand', 'processor' => 'customProcessorName']) ; @@ -260,8 +269,9 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() ]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.processor', ['command' => 'fooCommand']) ; diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php index 25033f0c8..72f5b2152 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php @@ -47,6 +47,7 @@ public function testThrowsIfNoRouteCollectionServiceFoundForConfiguredTransport( { $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo', 'bar']); + $container->setParameter('enqueue.default_client', 'baz'); $pass = new BuildTopicSubscriberRoutesPass(); @@ -58,8 +59,9 @@ public function testThrowsIfNoRouteCollectionServiceFoundForConfiguredTransport( public function testThrowIfTaggedProcessorIsBuiltByFactory() { $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['aName']); - $container->register('enqueue.client.aName.route_collection', RouteCollection::class) + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->register('enqueue.client.foo.route_collection', RouteCollection::class) ->addArgument([]) ; $container->register('aProcessor', Processor::class) @@ -81,6 +83,7 @@ public function testShouldRegisterProcessorWithMatchedName() $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'bar'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($this->createTopicSubscriberProcessor())) ->addTag('enqueue.topic_subscriber', ['client' => 'foo']) @@ -103,8 +106,9 @@ public function testShouldRegisterProcessorWithoutNameToDefaultClient() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($this->createTopicSubscriberProcessor())) ->addTag('enqueue.topic_subscriber') ; @@ -126,8 +130,9 @@ public function testShouldRegisterProcessorIfClientNameEqualsAll() $routeCollection->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($this->createTopicSubscriberProcessor())) ->addTag('enqueue.topic_subscriber', ['client' => 'all']) ; @@ -151,8 +156,9 @@ public function testShouldRegisterProcessorIfTopicsIsString() $processor = $this->createTopicSubscriberProcessor('fooTopic'); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.topic_subscriber') ; @@ -184,8 +190,9 @@ public function testThrowIfTopicSubscriberReturnsNothing() $processor = $this->createTopicSubscriberProcessor(null); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.topic_subscriber') ; @@ -205,8 +212,9 @@ public function testShouldRegisterProcessorIfTopicsAreStrings() $processor = $this->createTopicSubscriberProcessor(['fooTopic', 'barTopic']); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.topic_subscriber') ; @@ -247,8 +255,9 @@ public function testShouldRegisterProcessorIfTopicsAreParamArrays() ]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.topic_subscriber') ; @@ -288,8 +297,9 @@ public function testThrowIfTopicSubscriberParamsInvalid() $processor = $this->createTopicSubscriberProcessor(['fooBar', true]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.topic_subscriber') ; @@ -312,8 +322,9 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() $processor = $this->createTopicSubscriberProcessor(['fooTopic']); $container = new ContainerBuilder(); - $container->setParameter('enqueue.clients', ['default']); - $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->setParameter('enqueue.clients', ['foo']); + $container->setParameter('enqueue.default_client', 'foo'); + $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.topic_subscriber') ; diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/ClientFactoryTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/ClientFactoryTest.php index b87245469..cac1805ce 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/ClientFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/ClientFactoryTest.php @@ -17,13 +17,6 @@ public function testShouldBeFinal() $this->assertClassFinal(ClientFactory::class); } - public function testShouldAllowGetNameSetInConstructor() - { - $transport = new ClientFactory('aName'); - - $this->assertEquals('aName', $transport->getName()); - } - public function testThrowIfEmptyNameGivenOnConstruction() { $this->expectException(\InvalidArgumentException::class); diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php index e44272dff..b26b4481f 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php @@ -43,6 +43,7 @@ public function testThrowsIfNoConsumptionExtensionsServiceFoundForConfiguredTran { $container = new ContainerBuilder(); $container->setParameter('enqueue.transports', ['foo', 'bar']); + $container->setParameter('enqueue.default_transport', 'foo'); $pass = new BuildConsumptionExtensionsPass(); @@ -57,14 +58,15 @@ public function testShouldRegisterTransportExtension() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['aName']); - $container->setDefinition('enqueue.transport.aName.consumption_extensions', $extensions); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); + $container->setDefinition('enqueue.transport.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) - ->addTag('enqueue.transport.consumption_extension', ['transport' => 'aName']) + ->addTag('enqueue.transport.consumption_extension', ['transport' => 'foo']) ; $container->register('aBarExtension', ExtensionInterface::class) - ->addTag('enqueue.transport.consumption_extension', ['transport' => 'aName']) + ->addTag('enqueue.transport.consumption_extension', ['transport' => 'foo']) ; $pass = new BuildConsumptionExtensionsPass(); @@ -83,11 +85,12 @@ public function testShouldIgnoreOtherTransportExtensions() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['aName']); - $container->setDefinition('enqueue.transport.aName.consumption_extensions', $extensions); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); + $container->setDefinition('enqueue.transport.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) - ->addTag('enqueue.transport.consumption_extension', ['transport' => 'aName']) + ->addTag('enqueue.transport.consumption_extension', ['transport' => 'foo']) ; $container->register('aBarExtension', ExtensionInterface::class) ->addTag('enqueue.transport.consumption_extension', ['transport' => 'anotherName']) @@ -108,8 +111,9 @@ public function testShouldAddExtensionIfTransportAll() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['aName']); - $container->setDefinition('enqueue.transport.aName.consumption_extensions', $extensions); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); + $container->setDefinition('enqueue.transport.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) ->addTag('enqueue.transport.consumption_extension', ['transport' => 'all']) @@ -133,8 +137,9 @@ public function testShouldTreatTagsWithoutTransportAsDefaultTransport() $extensions->addArgument([]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['default']); - $container->setDefinition('enqueue.transport.default.consumption_extensions', $extensions); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); + $container->setDefinition('enqueue.transport.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) ->addTag('enqueue.transport.consumption_extension') @@ -156,11 +161,12 @@ public function testShouldTreatTagsWithoutTransportAsDefaultTransport() public function testShouldOrderExtensionsByPriority() { $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['default']); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); $extensions = new Definition(); $extensions->addArgument([]); - $container->setDefinition('enqueue.transport.default.consumption_extensions', $extensions); + $container->setDefinition('enqueue.transport.foo.consumption_extensions', $extensions); $extension = new Definition(); $extension->addTag('enqueue.transport.consumption_extension', ['priority' => 6]); @@ -188,11 +194,12 @@ public function testShouldOrderExtensionsByPriority() public function testShouldAssumePriorityZeroIfPriorityIsNotSet() { $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['default']); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); $extensions = new Definition(); $extensions->addArgument([]); - $container->setDefinition('enqueue.transport.default.consumption_extensions', $extensions); + $container->setDefinition('enqueue.transport.foo.consumption_extensions', $extensions); $extension = new Definition(); $extension->addTag('enqueue.transport.consumption_extension'); @@ -226,8 +233,9 @@ public function testShouldMergeWithAddedPreviously() ]); $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['aName']); - $container->setDefinition('enqueue.transport.aName.consumption_extensions', $extensions); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); + $container->setDefinition('enqueue.transport.foo.consumption_extensions', $extensions); $container->register('aFooExtension', ExtensionInterface::class) ->addTag('enqueue.transport.consumption_extension') @@ -240,10 +248,7 @@ public function testShouldMergeWithAddedPreviously() $pass->process($container); $this->assertInternalType('array', $extensions->getArgument(0)); - $this->assertEquals([ - 'aBarExtension' => 'aBarServiceIdAddedPreviously', - 'aOloloExtension' => 'aOloloServiceIdAddedPreviously', - ], $extensions->getArgument(0)); + $this->assertCount(4, $extensions->getArgument(0)); } public function testShouldRegisterProcessorWithMatchedNameToCorrespondingRegistries() @@ -256,6 +261,7 @@ public function testShouldRegisterProcessorWithMatchedNameToCorrespondingRegistr $container = new ContainerBuilder(); $container->setParameter('enqueue.transports', ['foo', 'bar']); + $container->setParameter('enqueue.default_transport', 'foo'); $container->setDefinition('enqueue.transport.foo.consumption_extensions', $fooExtensions); $container->setDefinition('enqueue.transport.bar.consumption_extensions', $barExtensions); diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php index e9b9c7d71..bb6eae286 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -44,6 +44,8 @@ public function testThrowsIfNoRegistryServiceFoundForConfiguredTransport() { $container = new ContainerBuilder(); $container->setParameter('enqueue.transports', ['foo', 'bar']); + $container->setParameter('enqueue.default_transport', 'baz'); + $pass = new BuildProcessorRegistryPass(); @@ -59,6 +61,7 @@ public function testShouldRegisterProcessorWithMatchedName() $container = new ContainerBuilder(); $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); $container->setDefinition('enqueue.transport.foo.processor_registry', $registry); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.transport.processor', ['transport' => 'foo']) @@ -88,6 +91,7 @@ public function testShouldRegisterProcessorWithMatchedNameToCorrespondingRegistr $container = new ContainerBuilder(); $container->setParameter('enqueue.transports', ['foo', 'bar']); + $container->setParameter('enqueue.default_transport', 'foo'); $container->setDefinition('enqueue.transport.foo.processor_registry', $fooRegistry); $container->setDefinition('enqueue.transport.bar.processor_registry', $barRegistry); $container->register('aFooProcessor', 'aProcessorClass') @@ -118,8 +122,9 @@ public function testShouldRegisterProcessorWithoutNameToDefaultTransport() $registry->addArgument(null); $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['default']); - $container->setDefinition('enqueue.transport.default.processor_registry', $registry); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); + $container->setDefinition('enqueue.transport.foo.processor_registry', $registry); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.transport.processor', []) ; @@ -144,8 +149,9 @@ public function testShouldRegisterProcessorIfTransportNameEqualsAll() $registry->addArgument(null); $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['default']); - $container->setDefinition('enqueue.transport.default.processor_registry', $registry); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); + $container->setDefinition('enqueue.transport.foo.processor_registry', $registry); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.transport.processor', ['transport' => 'all']) ; @@ -170,8 +176,9 @@ public function testShouldRegisterWithCustomProcessorName() $registry->addArgument(null); $container = new ContainerBuilder(); - $container->setParameter('enqueue.transports', ['default']); - $container->setDefinition('enqueue.transport.default.processor_registry', $registry); + $container->setParameter('enqueue.transports', ['foo']); + $container->setParameter('enqueue.default_transport', 'foo'); + $container->setDefinition('enqueue.transport.foo.processor_registry', $registry); $container->register('aFooProcessor', 'aProcessorClass') ->addTag('enqueue.transport.processor', ['processor' => 'customProcessorName']) ; diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php index 7e021ca03..6cc02b697 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php @@ -27,13 +27,6 @@ public function testShouldBeFinal() $this->assertClassFinal(TransportFactory::class); } - public function testShouldAllowGetNameSetInConstructor() - { - $transport = new TransportFactory('aName'); - - $this->assertEquals('aName', $transport->getName()); - } - public function testThrowIfEmptyNameGivenOnConstruction() { $this->expectException(\InvalidArgumentException::class); From a781b3c3e258676b5f91bc8fe07057732fe86a5e Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Fri, 16 Nov 2018 15:08:54 +0200 Subject: [PATCH 0428/1142] multi client configuration --- .../DependencyInjection/BuildProcessorRegistryPassTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php index bb6eae286..d122e044c 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -46,7 +46,6 @@ public function testThrowsIfNoRegistryServiceFoundForConfiguredTransport() $container->setParameter('enqueue.transports', ['foo', 'bar']); $container->setParameter('enqueue.default_transport', 'baz'); - $pass = new BuildProcessorRegistryPass(); $this->expectException(\LogicException::class); From 0f3096e8622275178c5d75fa3a4e6a4432910e9f Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Fri, 16 Nov 2018 16:22:12 +0200 Subject: [PATCH 0429/1142] multi client configuration --- pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index bb3cacb53..fe84c2e20 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -69,7 +69,7 @@ public function testThrowErrorIfServiceDoesNotImplementProcessorReturnType() $registry = new ContainerProcessorRegistry($containerMock); $this->expectException(\TypeError::class); - $this->expectExceptionMessage('Return value of Enqueue\Symfony\ContainerProcessorRegistry::get() must implement interface Interop\Queue\Processor, instance of stdClass returned'); + $this->expectExceptionMessage('Return value of Enqueue\Symfony\ContainerProcessorRegistry::get() must implement interface Interop\Queue\PsrProcessor, instance of stdClass returned'); $registry->get('processor-name'); } From db7c6bd342f4ac113476f18a2744ec07ffe3eab5 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 16 Nov 2018 16:28:07 +0200 Subject: [PATCH 0430/1142] [dbal] handle gracefully concurancy issues. --- pkg/dbal/DbalConsumerHelperTrait.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index e9c5252db..810eeb66f 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -5,6 +5,7 @@ namespace Enqueue\Dbal; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Exception\DeadlockException; use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Types\Type; use Ramsey\Uuid\Uuid; @@ -73,8 +74,9 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->fetch() ; + // the message has been removed by a 3rd party, such as truncate operation. if (false == $deliveredMessage) { - throw new \LogicException('There must be a message at all times at this stage but there is no a message.'); + continue; } if ($deliveredMessage['redelivered'] || empty($deliveredMessage['time_to_live']) || $deliveredMessage['time_to_live'] > time()) { @@ -105,9 +107,13 @@ protected function redeliverMessages(): void ->setParameter('redelivered', true, Type::BOOLEAN) ; - $update->execute(); + try { + $update->execute(); - $this->redeliverMessagesLastExecutedAt = microtime(true); + $this->redeliverMessagesLastExecutedAt = microtime(true); + } catch (DeadlockException $e) { + // maybe next time we'll get more luck + } } protected function removeExpiredMessages(): void @@ -127,7 +133,11 @@ protected function removeExpiredMessages(): void ->setParameter(':now', time(), Type::BIGINT) ; - $delete->execute(); + try { + $delete->execute(); + } catch (DeadlockException $e) { + // maybe next time we'll get more luck + } $this->removeExpiredMessagesLastExecutedAt = microtime(true); } From b617dea433a031bd33345ed54e06ff6939e71e1d Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 16 Nov 2018 17:40:03 +0200 Subject: [PATCH 0431/1142] [bundle] Add BC for topic\command subscribers. --- .../Client/TopicSubscriberInterface.php | 18 ++++++-- .../BuildCommandSubscriberRoutesPass.php | 35 ++++++++++++++ .../BuildTopicSubscriberRoutesPass.php | 31 +++++++++++++ .../BuildCommandSubscriberRoutesPassTest.php | 42 +++++++++++++++++ .../BuildTopicSubscriberRoutesPassTest.php | 46 +++++++++++++++++++ 5 files changed, 169 insertions(+), 3 deletions(-) diff --git a/pkg/enqueue/Client/TopicSubscriberInterface.php b/pkg/enqueue/Client/TopicSubscriberInterface.php index 634a7ace2..849a7827f 100644 --- a/pkg/enqueue/Client/TopicSubscriberInterface.php +++ b/pkg/enqueue/Client/TopicSubscriberInterface.php @@ -15,10 +15,22 @@ interface TopicSubscriberInterface * * or * - * ['aTopicName' => [ - * 'processor' => 'processor', + * [ + * [ + * 'topic' => 'aTopicName', + * 'processor' => 'fooProcessor', * 'queue' => 'a_client_queue_name', - * ]] + * + * 'aCustomOption' => 'aVal', + * ], + * [ + * 'topic' => 'anotherTopicName', + * 'processor' => 'barProcessor', + * 'queue' => 'a_client_queue_name', + * + * 'aCustomOption' => 'aVal', + * ], + * ] * * Note: If you set prefix_queue to true then the queue is used as is and therefor the driver is not used to prepare a transport queue name. * It is possible to pass other options, they could be accessible on a route instance through options. diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php index cee1343f5..1527e51d8 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php @@ -66,6 +66,41 @@ public function process(ContainerBuilder $container): void throw new \LogicException('Command subscriber configuration is invalid. Should be an array or string.'); } + // 0.8 command subscriber + if (isset($commands['processorName'])) { + @trigger_error('The command subscriber 0.8 syntax is deprecated since Enqueue 0.9.', E_USER_DEPRECATED); + + $source = $commands['processorName']; + $processor = $params['processorName'] ?? $serviceId; + + $options = $commands; + unset( + $options['processorName'], + $options['queueName'], + $options['queueNameHardcoded'], + $options['exclusive'], + $options['topic'], + $options['source'], + $options['source_type'], + $options['processor'], + $options['options'] + ); + + $options['processor_service_id'] = $serviceId; + + if (isset($commands['queueName'])) { + $options['queue'] = $commands['queueName']; + } + + if (isset($commands['queueNameHardcoded']) && $commands['queueNameHardcoded']) { + $options['prefix_queue'] = false; + } + + $routeCollection->add(new Route($source, Route::COMMAND, $processor, $options)); + + continue; + } + if (isset($commands['command'])) { $commands = [$commands]; } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php index 3414d4918..518851150 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php @@ -69,6 +69,37 @@ public function process(ContainerBuilder $container): void foreach ($topics as $key => $params) { if (is_string($params)) { $routeCollection->add(new Route($params, Route::TOPIC, $serviceId, ['processor_service_id' => $serviceId])); + + // 0.8 topic subscriber + } elseif (is_array($params) && is_string($key)) { + @trigger_error('The topic subscriber 0.8 syntax is deprecated since Enqueue 0.9.', E_USER_DEPRECATED); + + $source = $key; + $processor = $params['processorName'] ?? $serviceId; + + $options = $params; + unset( + $options['processorName'], + $options['queueName'], + $options['queueNameHardcoded'], + $options['topic'], + $options['source'], + $options['source_type'], + $options['processor'], + $options['options'] + ); + + $options['processor_service_id'] = $serviceId; + + if (isset($params['queueName'])) { + $options['queue'] = $params['queueName']; + } + + if (isset($params['queueNameHardcoded']) && $params['queueNameHardcoded']) { + $options['prefix_queue'] = false; + } + + $routeCollection->add(new Route($source, Route::TOPIC, $processor, $options)); } elseif (is_array($params)) { $source = $params['topic'] ?? null; $processor = $params['processor'] ?? $serviceId; diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php index 603f0fb0d..5d53c7bad 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php @@ -398,6 +398,48 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() ); } + public function testShouldRegister08CommandProcessor() + { + $routeCollection = new Definition(RouteCollection::class); + $routeCollection->addArgument([]); + + $processor = $this->createCommandSubscriberProcessor([ + 'processorName' => 'fooCommand', + 'queueName' => 'a_client_queue_name', + 'queueNameHardcoded' => true, + 'exclusive' => true, + 'anOption' => 'aFooVal', + ]); + + $container = new ContainerBuilder(); + $container->setParameter('enqueue.clients', ['default']); + $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->register('aFooProcessor', get_class($processor)) + ->addTag('enqueue.command_subscriber') + ; + + $pass = new BuildCommandSubscriberRoutesPass(); + $pass->process($container); + + $this->assertInternalType('array', $routeCollection->getArgument(0)); + $this->assertCount(1, $routeCollection->getArgument(0)); + + $this->assertEquals( + [ + [ + 'source' => 'fooCommand', + 'source_type' => 'enqueue.client.command_route', + 'processor' => 'aFooProcessor', + 'processor_service_id' => 'aFooProcessor', + 'anOption' => 'aFooVal', + 'queue' => 'a_client_queue_name', + 'prefix_queue' => false, + ], + ], + $routeCollection->getArgument(0) + ); + } + private function createCommandSubscriberProcessor($commandSubscriberReturns = ['aCommand']) { $processor = new class() implements Processor, CommandSubscriberInterface { diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php index 72f5b2152..ecdab5fd7 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php @@ -358,6 +358,52 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() ); } + public function testShouldRegister08TopicSubscriber() + { + $routeCollection = new Definition(RouteCollection::class); + $routeCollection->addArgument([]); + + $processor = $this->createTopicSubscriberProcessor([ + 'fooTopic' => ['processorName' => 'aCustomFooProcessorName', 'queueName' => 'fooQueue', 'queueNameHardcoded' => true, 'anOption' => 'aFooVal'], + 'barTopic' => ['processorName' => 'aCustomBarProcessorName', 'anOption' => 'aBarVal'], + ]); + + $container = new ContainerBuilder(); + $container->setParameter('enqueue.clients', ['default']); + $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); + $container->register('aFooProcessor', get_class($processor)) + ->addTag('enqueue.topic_subscriber') + ; + + $pass = new BuildTopicSubscriberRoutesPass(); + $pass->process($container); + + $this->assertInternalType('array', $routeCollection->getArgument(0)); + $this->assertCount(2, $routeCollection->getArgument(0)); + + $this->assertEquals( + [ + [ + 'source' => 'fooTopic', + 'source_type' => 'enqueue.client.topic_route', + 'processor' => 'aCustomFooProcessorName', + 'processor_service_id' => 'aFooProcessor', + 'anOption' => 'aFooVal', + 'queue' => 'fooQueue', + 'prefix_queue' => false, + ], + [ + 'source' => 'barTopic', + 'source_type' => 'enqueue.client.topic_route', + 'processor' => 'aCustomBarProcessorName', + 'processor_service_id' => 'aFooProcessor', + 'anOption' => 'aBarVal', + ], + ], + $routeCollection->getArgument(0) + ); + } + private function createTopicSubscriberProcessor($topicSubscriberReturns = ['aTopic']) { $processor = new class() implements Processor, TopicSubscriberInterface { From 53962b936e80dfadc01c7f606167e6da25a084f5 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 16 Nov 2018 20:00:31 +0200 Subject: [PATCH 0432/1142] fix tests. --- .../DependencyInjection/BuildCommandSubscriberRoutesPassTest.php | 1 + .../DependencyInjection/BuildTopicSubscriberRoutesPassTest.php | 1 + 2 files changed, 2 insertions(+) diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php index 5d53c7bad..346c0cbdb 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php @@ -413,6 +413,7 @@ public function testShouldRegister08CommandProcessor() $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['default']); + $container->setParameter('enqueue.default_client', 'default'); $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.command_subscriber') diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php index ecdab5fd7..65b64dcc8 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php @@ -370,6 +370,7 @@ public function testShouldRegister08TopicSubscriber() $container = new ContainerBuilder(); $container->setParameter('enqueue.clients', ['default']); + $container->setParameter('enqueue.default_client', 'default'); $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); $container->register('aFooProcessor', get_class($processor)) ->addTag('enqueue.topic_subscriber') From 301522f241087fe2d42080da7fe23aa04b382f33 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 16 Nov 2018 20:05:50 +0200 Subject: [PATCH 0433/1142] [dbal] Use RetryableException, wrap fetchMessage exception to it too. --- composer.json | 2 +- pkg/dbal/DbalConsumerHelperTrait.php | 58 ++++++++++++++-------------- pkg/dbal/composer.json | 2 +- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/composer.json b/composer.json index 6489f3737..ff9db427d 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "queue-interop/queue-interop": "^0.7", "bunny/bunny": "^0.2.4|^0.3|^0.4", "php-amqplib/php-amqplib": "^2.7", - "doctrine/dbal": "~2.5", + "doctrine/dbal": "^2.6", "ramsey/uuid": "^2|^3.5", "psr/log": "^1", "psr/container": "^1", diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 810eeb66f..1e6e9c579 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -5,7 +5,7 @@ namespace Enqueue\Dbal; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Exception\DeadlockException; +use Doctrine\DBAL\Exception\RetryableException; use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Types\Type; use Ramsey\Uuid\Uuid; @@ -54,34 +54,36 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ; while (microtime(true) < $endAt) { - $result = $select->execute()->fetch(); - if (empty($result)) { - return null; - } - - $update - ->setParameter('messageId', $result['id'], Type::GUID) - ; - - if ($update->execute()) { - $deliveredMessage = $this->getConnection()->createQueryBuilder() - ->select('*') - ->from($this->getContext()->getTableName()) - ->andWhere('delivery_id = :deliveryId') - ->setParameter('deliveryId', $deliveryId->getBytes(), Type::GUID) - ->setMaxResults(1) - ->execute() - ->fetch() - ; - - // the message has been removed by a 3rd party, such as truncate operation. - if (false == $deliveredMessage) { - continue; + try { + $result = $select->execute()->fetch(); + if (empty($result)) { + return null; } - if ($deliveredMessage['redelivered'] || empty($deliveredMessage['time_to_live']) || $deliveredMessage['time_to_live'] > time()) { - return $this->getContext()->convertMessage($deliveredMessage); + $update + ->setParameter('messageId', $result['id'], Type::GUID); + + if ($update->execute()) { + $deliveredMessage = $this->getConnection()->createQueryBuilder() + ->select('*') + ->from($this->getContext()->getTableName()) + ->andWhere('delivery_id = :deliveryId') + ->setParameter('deliveryId', $deliveryId->getBytes(), Type::GUID) + ->setMaxResults(1) + ->execute() + ->fetch(); + + // the message has been removed by a 3rd party, such as truncate operation. + if (false === $deliveredMessage) { + continue; + } + + if ($deliveredMessage['redelivered'] || empty($deliveredMessage['time_to_live']) || $deliveredMessage['time_to_live'] > time()) { + return $this->getContext()->convertMessage($deliveredMessage); + } } + } catch (RetryableException $e) { + // maybe next time we'll get more luck } } @@ -111,7 +113,7 @@ protected function redeliverMessages(): void $update->execute(); $this->redeliverMessagesLastExecutedAt = microtime(true); - } catch (DeadlockException $e) { + } catch (RetryableException $e) { // maybe next time we'll get more luck } } @@ -135,7 +137,7 @@ protected function removeExpiredMessages(): void try { $delete->execute(); - } catch (DeadlockException $e) { + } catch (RetryableException $e) { // maybe next time we'll get more luck } diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index a39b5c622..b48985714 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/queue-interop": "^0.7", - "doctrine/dbal": "~2.5", + "doctrine/dbal": "^2.6", "ramsey/uuid": "^3" }, "require-dev": { From 0d571878d6b814425dfa71022aeac0c97be36b55 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 17 Nov 2018 16:22:43 +0200 Subject: [PATCH 0434/1142] [dsn] Cluster DSN --- docs/dsn.md | 56 +++- pkg/amqp-tools/ConnectionConfig.php | 14 +- pkg/dsn/Dsn.php | 245 ++++++++++-------- pkg/dsn/QueryBag.php | 103 ++++++++ pkg/dsn/Tests/DsnTest.php | 236 ++++++++++++++--- pkg/enqueue/Client/DriverFactory.php | 2 +- pkg/enqueue/ConnectionFactoryFactory.php | 2 +- pkg/fs/FsConnectionFactory.php | 6 +- pkg/gps/GpsConnectionFactory.php | 12 +- pkg/monitoring/GenericStatsStorageFactory.php | 2 +- pkg/monitoring/InfluxDbStorage.php | 10 +- pkg/monitoring/WampStorage.php | 8 +- pkg/redis/RedisConnectionFactory.php | 4 +- pkg/sqs/SqsConnectionFactory.php | 16 +- pkg/stomp/StompConnectionFactory.php | 6 +- pkg/test/RabbitManagementExtensionTrait.php | 4 +- pkg/wamp/WampConnectionFactory.php | 6 +- 17 files changed, 532 insertions(+), 200 deletions(-) create mode 100644 pkg/dsn/QueryBag.php diff --git a/docs/dsn.md b/docs/dsn.md index 30c08d6a4..6fc571f43 100644 --- a/docs/dsn.md +++ b/docs/dsn.md @@ -27,7 +27,7 @@ Basic usage: use Enqueue\Dsn\Dsn; -$dsn = new Dsn('mysql+pdo://user:password@localhost:3306/database?connection_timeout=123'); +$dsn = Dsn::parseFirst('mysql+pdo://user:password@localhost:3306/database?connection_timeout=123'); $dsn->getSchemeProtocol(); // 'mysql' $dsn->getScheme(); // 'mysql+pdo' @@ -39,8 +39,30 @@ $dsn->getPort(); // 3306 $dsn->getQueryString(); // 'connection_timeout=123' $dsn->getQuery(); // ['connection_timeout' => '123'] -$dsn->getQueryParameter('connection_timeout'); // '123' -$dsn->getInt('connection_timeout'); // 123 +$dsn->getString('connection_timeout'); // '123' +$dsn->getDecimal('connection_timeout'); // 123 +``` + +Parse Cluster DSN: + +```php +getUser(); // 'user' +$dsns[0]->getPassword(); // 'password' +$dsns[0]->getHost(); // 'foo' +$dsns[0]->getPort(); // 3306 + +$dsns[1]->getUser(); // 'user' +$dsns[1]->getPassword(); // 'password' +$dsns[1]->getHost(); // 'bar' +$dsns[1]->getPort(); // 5678 ``` Some parts could be omitted: @@ -49,7 +71,7 @@ Some parts could be omitted: getSchemeProtocol(); // 'sqs' $dsn->getScheme(); // 'sqs' @@ -59,8 +81,24 @@ $dsn->getPassword(); // null $dsn->getHost(); // null $dsn->getPort(); // null -$dsn->getQueryParameter('key'); // 'aKey' -$dsn->getQueryParameter('secret'); // 'aSecret' +$dsn->getString('key'); // 'aKey' +$dsn->getString('secret'); // 'aSecret' +``` + +Get typed query params: + +```php +getDecimal('decimal'); // 12 +$dsn->getOctal('decimal'); // 0666 +$dsn->getFloat('float'); // 1.2 +$dsn->getBool('bool'); // true +$dsn->getArray('array')->getString(0); // val +$dsn->getArray('array')->toArray(); // [val] ``` Throws exception if DSN not valid: @@ -69,7 +107,7 @@ Throws exception if DSN not valid: getInt('connection_timeout'); // throws exception here +$dsn->getDecimal('connection_timeout'); // throws exception here ``` [back to index](index.md) \ No newline at end of file diff --git a/pkg/amqp-tools/ConnectionConfig.php b/pkg/amqp-tools/ConnectionConfig.php index 9ed59670a..c54eb179c 100644 --- a/pkg/amqp-tools/ConnectionConfig.php +++ b/pkg/amqp-tools/ConnectionConfig.php @@ -379,7 +379,7 @@ public function getConfig() */ private function parseDsn($dsn) { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); $supportedSchemes = $this->supportedSchemes; if (false == in_array($dsn->getSchemeProtocol(), $supportedSchemes, true)) { @@ -410,14 +410,14 @@ private function parseDsn($dsn) 'persisted' => $dsn->getBool('persisted'), 'lazy' => $dsn->getBool('lazy'), 'qos_global' => $dsn->getBool('qos_global'), - 'qos_prefetch_size' => $dsn->getInt('qos_prefetch_size'), - 'qos_prefetch_count' => $dsn->getInt('qos_prefetch_count'), + 'qos_prefetch_size' => $dsn->getDecimal('qos_prefetch_size'), + 'qos_prefetch_count' => $dsn->getDecimal('qos_prefetch_count'), 'ssl_on' => $sslOn, 'ssl_verify' => $dsn->getBool('ssl_verify'), - 'ssl_cacert' => $dsn->getQueryParameter('ssl_cacert'), - 'ssl_cert' => $dsn->getQueryParameter('ssl_cert'), - 'ssl_key' => $dsn->getQueryParameter('ssl_key'), - 'ssl_passphrase' => $dsn->getQueryParameter('ssl_passphrase'), + 'ssl_cacert' => $dsn->getString('ssl_cacert'), + 'ssl_cert' => $dsn->getString('ssl_cert'), + 'ssl_key' => $dsn->getString('ssl_key'), + 'ssl_passphrase' => $dsn->getString('ssl_passphrase'), ]), function ($value) { return null !== $value; }); return array_map(function ($value) { diff --git a/pkg/dsn/Dsn.php b/pkg/dsn/Dsn.php index 81828e7d1..221e74bd2 100644 --- a/pkg/dsn/Dsn.php +++ b/pkg/dsn/Dsn.php @@ -9,12 +9,17 @@ class Dsn /** * @var string */ - private $dsn; + private $scheme; /** * @var string */ - private $scheme; + private $schemeProtocol; + + /** + * @var string[] + */ + private $schemeExtensions; /** * @var string|null @@ -47,37 +52,43 @@ class Dsn private $queryString; /** - * @var array - */ - private $query; - - /** - * @var string + * @var QueryBag */ - private $schemeProtocol; - - /** - * @var string[] - */ - private $schemeExtensions; - - public function __construct(string $dsn) - { - $this->dsn = $dsn; - $this->query = []; - - $this->parse($dsn); - } - - public function __toString(): string - { - return $this->dsn; + private $queryBag; + + public function __construct( + string $scheme, + string $schemeProtocol, + array $schemeExtensions, + ?string $user, + ?string $password, + ?string $host, + ?int $port, + ?string $path, + ?string $queryString, + array $query + ) { + $this->scheme = $scheme; + $this->schemeProtocol = $schemeProtocol; + $this->schemeExtensions = $schemeExtensions; + $this->user = $user; + $this->password = $password; + $this->host = $host; + $this->port = $port; + $this->path = $path; + $this->queryString = $queryString; + $this->queryBag = new QueryBag($query); } - public function getDsn(): string - { - return $this->dsn; - } +// public function __toString(): string +// { +// return $this->dsn; +// } +// +// public function getDsn(): string +// { +// return $this->dsn; +// } public function getScheme(): string { @@ -99,33 +110,21 @@ public function hasSchemeExtension(string $extension): bool return in_array($extension, $this->schemeExtensions, true); } - /** - * @return null|string - */ public function getUser(): ?string { return $this->user; } - /** - * @return null|string - */ public function getPassword(): ?string { return $this->password; } - /** - * @return null|string - */ public function getHost(): ?string { return $this->host; } - /** - * @return int|null - */ public function getPort(): ?int { return $this->port; @@ -141,74 +140,44 @@ public function getQueryString(): ?string return $this->queryString; } - public function getQuery(): array + public function getQueryBag(): QueryBag { - return $this->query; + return $this->queryBag; } - public function getQueryParameter(string $name, string $default = null): ?string + public function getQuery(): array { - return array_key_exists($name, $this->query) ? $this->query[$name] : $default; + return $this->queryBag->toArray(); } - public function getInt(string $name, int $default = null): ?int + public function getString(string $name, string $default = null): ?string { - $value = $this->getQueryParameter($name); - if (null === $value) { - return $default; - } - - if (false == preg_match('/^[\+\-]?[0-9]*$/', $value)) { - throw InvalidQueryParameterTypeException::create($name, 'integer'); - } + return $this->queryBag->getString($name, $default); + } - return (int) $value; + public function getDecimal(string $name, int $default = null): ?int + { + return $this->queryBag->getDecimal($name, $default); } public function getOctal(string $name, int $default = null): ?int { - $value = $this->getQueryParameter($name); - if (null === $value) { - return $default; - } - - if (false == preg_match('/^0[\+\-]?[0-7]*$/', $value)) { - throw InvalidQueryParameterTypeException::create($name, 'integer'); - } - - return intval($value, 8); + return $this->queryBag->getOctal($name, $default); } public function getFloat(string $name, float $default = null): ?float { - $value = $this->getQueryParameter($name); - if (null === $value) { - return $default; - } - - if (false == is_numeric($value)) { - throw InvalidQueryParameterTypeException::create($name, 'float'); - } - - return (float) $value; + return $this->queryBag->getFloat($name, $default); } public function getBool(string $name, bool $default = null): ?bool { - $value = $this->getQueryParameter($name); - if (null === $value) { - return $default; - } - - if (in_array($value, ['', '0', 'false'], true)) { - return false; - } - - if (in_array($value, ['1', 'true'], true)) { - return true; - } + return $this->queryBag->getBool($name, $default); + } - throw InvalidQueryParameterTypeException::create($name, 'bool'); + public function getArray(string $name, bool $default = null): QueryBag + { + return $this->queryBag->getArray($name, $default); } public function toArray() @@ -223,11 +192,21 @@ public function toArray() 'port' => $this->port, 'path' => $this->path, 'queryString' => $this->queryString, - 'query' => $this->query, + 'query' => $this->queryBag->toArray(), ]; } - private function parse(string $dsn): void + public static function parseFirst(string $dsn): ?self + { + return self::parse($dsn)[0]; + } + + /** + * @param string $dsn + * + * @return Dsn[] + */ + public static function parse(string $dsn): array { if (false === strpos($dsn, ':')) { throw new \LogicException(sprintf('The DSN is invalid. It does not have scheme separator ":".')); @@ -241,43 +220,87 @@ private function parse(string $dsn): void } $schemeParts = explode('+', $scheme); - $this->scheme = $scheme; - $this->schemeProtocol = $schemeParts[0]; + $schemeProtocol = $schemeParts[0]; unset($schemeParts[0]); - $this->schemeExtensions = array_values($schemeParts); + $schemeExtensions = array_values($schemeParts); - if ($host = parse_url(http://github.com/$dsn,%20PHP_URL_HOST)) { - $this->host = $host; - } + $user = parse_url(http://github.com/$dsn,%20PHP_URL_USER) ?: null; + $password = parse_url(http://github.com/$dsn,%20PHP_URL_PASS) ?: null; - if ($port = parse_url(http://github.com/$dsn,%20PHP_URL_PORT)) { - $this->port = (int) $port; + $path = parse_url(http://github.com/$dsn,%20PHP_URL_PATH) ?: null; + if ($path) { + $path = rawurldecode($path); } - if ($user = parse_url(http://github.com/$dsn,%20PHP_URL_USER)) { - $this->user = $user; + $query = []; + $queryString = parse_url(http://github.com/$dsn,%20PHP_URL_QUERY) ?: null; + if (is_string($queryString)) { + $query = self::httpParseQuery($queryString, '&', PHP_QUERY_RFC3986); } - - if ($password = parse_url(http://github.com/$dsn,%20PHP_URL_PASS)) { - $this->password = $password; + $hostsPorts = ''; + if (0 === strpos($dsnWithoutScheme, '//')) { + $dsnWithoutScheme = substr($dsnWithoutScheme, 2); + $dsnWithoutUserPassword = explode('@', $dsnWithoutScheme, 2); + $dsnWithoutUserPassword = 2 === count($dsnWithoutUserPassword) ? + $dsnWithoutUserPassword[1] : + $dsnWithoutUserPassword[0] + ; + + list($hostsPorts) = explode('#', $dsnWithoutUserPassword, 2); + list($hostsPorts) = explode('?', $hostsPorts, 2); + list($hostsPorts) = explode('/', $hostsPorts, 2); + } else { + return [ + new self( + $scheme, + $schemeProtocol, + $schemeExtensions, + null, + null, + null, + null, + $path, + $queryString, + $query + ), + ]; } - if ($path = parse_url(http://github.com/$dsn,%20PHP_URL_PATH)) { - $this->path = rawurldecode($path); - } + $dsns = []; + $hostParts = explode(',', $hostsPorts); + foreach ($hostParts as $key => $hostPart) { + unset($hostParts[$key]); + + $parts = explode(':', $hostPart, 2); + $host = $parts[0]; - if ($queryString = parse_url(http://github.com/$dsn,%20PHP_URL_QUERY)) { - $this->queryString = $queryString; + $port = null; + if (isset($parts[1])) { + $port = (int) $parts[1]; + } - $this->query = $this->httpParseQuery($queryString, '&', PHP_QUERY_RFC3986); + $dsns[] = new self( + $scheme, + $schemeProtocol, + $schemeExtensions, + $user, + $password, + $host, + $port, + $path, + $queryString, + $query + ); } + + return $dsns; } /** * based on http://php.net/manual/en/function.parse-str.php#119484 with some slight modifications. */ - private function httpParseQuery(string $queryString, string $argSeparator = '&', int $decType = PHP_QUERY_RFC1738): array + private static function httpParseQuery(string $queryString, string $argSeparator = '&', int $decType = PHP_QUERY_RFC1738): array { $result = []; $parts = explode($argSeparator, $queryString); diff --git a/pkg/dsn/QueryBag.php b/pkg/dsn/QueryBag.php new file mode 100644 index 000000000..6dc88442c --- /dev/null +++ b/pkg/dsn/QueryBag.php @@ -0,0 +1,103 @@ +query = $query; + } + + public function toArray(): array + { + return $this->query; + } + + public function getString(string $name, string $default = null): ?string + { + return array_key_exists($name, $this->query) ? $this->query[$name] : $default; + } + + public function getDecimal(string $name, int $default = null): ?int + { + $value = $this->getString($name); + if (null === $value) { + return $default; + } + + if (false == preg_match('/^[\+\-]?[0-9]*$/', $value)) { + throw InvalidQueryParameterTypeException::create($name, 'decimal'); + } + + return (int) $value; + } + + public function getOctal(string $name, int $default = null): ?int + { + $value = $this->getString($name); + if (null === $value) { + return $default; + } + + if (false == preg_match('/^0[\+\-]?[0-7]*$/', $value)) { + throw InvalidQueryParameterTypeException::create($name, 'octal'); + } + + return intval($value, 8); + } + + public function getFloat(string $name, float $default = null): ?float + { + $value = $this->getString($name); + if (null === $value) { + return $default; + } + + if (false == is_numeric($value)) { + throw InvalidQueryParameterTypeException::create($name, 'float'); + } + + return (float) $value; + } + + public function getBool(string $name, bool $default = null): ?bool + { + $value = $this->getString($name); + if (null === $value) { + return $default; + } + + if (in_array($value, ['', '0', 'false'], true)) { + return false; + } + + if (in_array($value, ['1', 'true'], true)) { + return true; + } + + throw InvalidQueryParameterTypeException::create($name, 'bool'); + } + + public function getArray(string $name, bool $default = null): ?self + { + if (false == array_key_exists($name, $this->query)) { + return $default; + } + + $value = $this->query[$name]; + + if (is_array($value)) { + return new self($value); + } + + throw InvalidQueryParameterTypeException::create($name, 'array'); + } +} diff --git a/pkg/dsn/Tests/DsnTest.php b/pkg/dsn/Tests/DsnTest.php index a81cdcfd1..7c92a4ad2 100644 --- a/pkg/dsn/Tests/DsnTest.php +++ b/pkg/dsn/Tests/DsnTest.php @@ -10,21 +10,21 @@ class DsnTest extends TestCase { public function testCouldBeConstructedWithDsnAsFirstArgument() { - new Dsn('foo://localhost:1234'); + Dsn::parseFirst('foo://localhost:1234'); } public function testThrowsIfSchemePartIsMissing() { $this->expectException(\LogicException::class); $this->expectExceptionMessage('The DSN is invalid. It does not have scheme separator ":".'); - new Dsn('foobar'); + Dsn::parseFirst('foobar'); } public function testThrowsIfSchemeContainsIllegalSymbols() { $this->expectException(\LogicException::class); $this->expectExceptionMessage('The DSN is invalid. Scheme contains illegal symbols.'); - new Dsn('foo_&%&^bar://localhost'); + Dsn::parseFirst('foo_&%&^bar://localhost'); } /** @@ -32,7 +32,7 @@ public function testThrowsIfSchemeContainsIllegalSymbols() */ public function testShouldParseSchemeCorrectly(string $dsn, string $expectedScheme, string $expectedSchemeProtocol, array $expectedSchemeExtensions) { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); $this->assertSame($expectedScheme, $dsn->getScheme()); $this->assertSame($expectedSchemeProtocol, $dsn->getSchemeProtocol()); @@ -41,49 +41,49 @@ public function testShouldParseSchemeCorrectly(string $dsn, string $expectedSche public function testShouldParseUser() { - $dsn = new Dsn('amqp+ext://theUser:thePass@theHost:1267/thePath'); + $dsn = Dsn::parseFirst('amqp+ext://theUser:thePass@theHost:1267/thePath'); $this->assertSame('theUser', $dsn->getUser()); } public function testShouldParsePassword() { - $dsn = new Dsn('amqp+ext://theUser:thePass@theHost:1267/thePath'); + $dsn = Dsn::parseFirst('amqp+ext://theUser:thePass@theHost:1267/thePath'); $this->assertSame('thePass', $dsn->getPassword()); } public function testShouldParseHost() { - $dsn = new Dsn('amqp+ext://theUser:thePass@theHost:1267/thePath'); + $dsn = Dsn::parseFirst('amqp+ext://theUser:thePass@theHost:1267/thePath'); $this->assertSame('theHost', $dsn->getHost()); } public function testShouldParsePort() { - $dsn = new Dsn('amqp+ext://theUser:thePass@theHost:1267/thePath'); + $dsn = Dsn::parseFirst('amqp+ext://theUser:thePass@theHost:1267/thePath'); $this->assertSame(1267, $dsn->getPort()); } public function testShouldParsePath() { - $dsn = new Dsn('amqp+ext://theUser:thePass@theHost:1267/thePath'); + $dsn = Dsn::parseFirst('amqp+ext://theUser:thePass@theHost:1267/thePath'); $this->assertSame('/thePath', $dsn->getPath()); } public function testShouldUrlDecodedPath() { - $dsn = new Dsn('amqp+ext://theUser:thePass@theHost:1267/%2f'); + $dsn = Dsn::parseFirst('amqp+ext://theUser:thePass@theHost:1267/%2f'); $this->assertSame('//', $dsn->getPath()); } public function testShouldParseQuery() { - $dsn = new Dsn('amqp+ext://theUser:thePass@theHost:1267/thePath?foo=fooVal&bar=bar%2fVal'); + $dsn = Dsn::parseFirst('amqp+ext://theUser:thePass@theHost:1267/thePath?foo=fooVal&bar=bar%2fVal'); $this->assertSame('foo=fooVal&bar=bar%2fVal', $dsn->getQueryString()); $this->assertSame(['foo' => 'fooVal', 'bar' => 'bar/Val'], $dsn->getQuery()); @@ -91,7 +91,7 @@ public function testShouldParseQuery() public function testShouldParseQueryShouldPreservePlusSymbol() { - $dsn = new Dsn('amqp+ext://theUser:thePass@theHost:1267/thePath?foo=fooVal&bar=bar+Val'); + $dsn = Dsn::parseFirst('amqp+ext://theUser:thePass@theHost:1267/thePath?foo=fooVal&bar=bar+Val'); $this->assertSame('foo=fooVal&bar=bar+Val', $dsn->getQueryString()); $this->assertSame(['foo' => 'fooVal', 'bar' => 'bar+Val'], $dsn->getQuery()); @@ -102,9 +102,9 @@ public function testShouldParseQueryShouldPreservePlusSymbol() */ public function testShouldParseQueryParameterAsInt(string $parameter, int $expected) { - $dsn = new Dsn('foo:?aName='.$parameter); + $dsn = Dsn::parseFirst('foo:?aName='.$parameter); - $this->assertSame($expected, $dsn->getInt('aName')); + $this->assertSame($expected, $dsn->getDecimal('aName')); } /** @@ -112,68 +112,77 @@ public function testShouldParseQueryParameterAsInt(string $parameter, int $expec */ public function testShouldParseQueryParameterAsOctalInt(string $parameter, int $expected) { - $dsn = new Dsn('foo:?aName='.$parameter); + $dsn = Dsn::parseFirst('foo:?aName='.$parameter); $this->assertSame($expected, $dsn->getOctal('aName')); } public function testShouldReturnDefaultIntIfNotSet() { - $dsn = new Dsn('foo:'); + $dsn = Dsn::parseFirst('foo:'); - $this->assertNull($dsn->getInt('aName')); - $this->assertSame(123, $dsn->getInt('aName', 123)); + $this->assertNull($dsn->getDecimal('aName')); + $this->assertSame(123, $dsn->getDecimal('aName', 123)); } - public function testThrowIfQueryParameterNotInt() + public function testThrowIfQueryParameterNotDecimal() { - $dsn = new Dsn('foo:?aName=notInt'); + $dsn = Dsn::parseFirst('foo:?aName=notInt'); $this->expectException(InvalidQueryParameterTypeException::class); - $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "integer"'); - $dsn->getInt('aName'); + $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "decimal"'); + $dsn->getDecimal('aName'); } public function testThrowIfQueryParameterNotOctalButString() { - $dsn = new Dsn('foo:?aName=notInt'); + $dsn = Dsn::parseFirst('foo:?aName=notInt'); $this->expectException(InvalidQueryParameterTypeException::class); - $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "integer"'); + $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "octal"'); $dsn->getOctal('aName'); } public function testThrowIfQueryParameterNotOctalButDecimal() { - $dsn = new Dsn('foo:?aName=123'); + $dsn = Dsn::parseFirst('foo:?aName=123'); $this->expectException(InvalidQueryParameterTypeException::class); - $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "integer"'); + $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "octal"'); $dsn->getOctal('aName'); } public function testThrowIfQueryParameterInvalidOctal() { - $dsn = new Dsn('foo:?aName=0128'); + $dsn = Dsn::parseFirst('foo:?aName=0128'); $this->expectException(InvalidQueryParameterTypeException::class); - $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "integer"'); + $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "octal"'); $dsn->getOctal('aName'); } + public function testThrowIfQueryParameterInvalidArray() + { + $dsn = Dsn::parseFirst('foo:?aName=foo'); + + $this->expectException(InvalidQueryParameterTypeException::class); + $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "array"'); + $dsn->getArray('aName'); + } + /** * @dataProvider provideFloatQueryParameters */ public function testShouldParseQueryParameterAsFloat(string $parameter, float $expected) { - $dsn = new Dsn('foo:?aName='.$parameter); + $dsn = Dsn::parseFirst('foo:?aName='.$parameter); $this->assertSame($expected, $dsn->getFloat('aName')); } public function testShouldReturnDefaultFloatIfNotSet() { - $dsn = new Dsn('foo:'); + $dsn = Dsn::parseFirst('foo:'); $this->assertNull($dsn->getFloat('aName')); $this->assertSame(123., $dsn->getFloat('aName', 123.)); @@ -181,7 +190,7 @@ public function testShouldReturnDefaultFloatIfNotSet() public function testThrowIfQueryParameterNotFloat() { - $dsn = new Dsn('foo:?aName=notFloat'); + $dsn = Dsn::parseFirst('foo:?aName=notFloat'); $this->expectException(InvalidQueryParameterTypeException::class); $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "float"'); @@ -193,14 +202,24 @@ public function testThrowIfQueryParameterNotFloat() */ public function testShouldParseQueryParameterAsBoolean(string $parameter, bool $expected) { - $dsn = new Dsn('foo:?aName='.$parameter); + $dsn = Dsn::parseFirst('foo:?aName='.$parameter); $this->assertSame($expected, $dsn->getBool('aName')); } + /** + * @dataProvider provideArrayQueryParameters + */ + public function testShouldParseQueryParameterAsArray(string $query, array $expected) + { + $dsn = Dsn::parseFirst('foo:?'.$query); + + $this->assertSame($expected, $dsn->getArray('aName')->toArray()); + } + public function testShouldReturnDefaultBoolIfNotSet() { - $dsn = new Dsn('foo:'); + $dsn = Dsn::parseFirst('foo:'); $this->assertNull($dsn->getBool('aName')); $this->assertTrue($dsn->getBool('aName', true)); @@ -208,13 +227,151 @@ public function testShouldReturnDefaultBoolIfNotSet() public function testThrowIfQueryParameterNotBool() { - $dsn = new Dsn('foo:?aName=notBool'); + $dsn = Dsn::parseFirst('foo:?aName=notBool'); $this->expectException(InvalidQueryParameterTypeException::class); $this->expectExceptionMessage('The query parameter "aName" has invalid type. It must be "bool"'); $dsn->getBool('aName'); } + public function testShouldParseMultipleDsnsWithUsernameAndPassword() + { + $dsns = Dsn::parse('foo://user:pass@foo,bar'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(2, $dsns); + + $this->assertSame('user', $dsns[0]->getUser()); + $this->assertSame('pass', $dsns[0]->getPassword()); + $this->assertSame('foo', $dsns[0]->getHost()); + + $this->assertSame('user', $dsns[1]->getUser()); + $this->assertSame('pass', $dsns[1]->getPassword()); + $this->assertSame('bar', $dsns[1]->getHost()); + } + + public function testShouldParseMultipleDsnsWithPorts() + { + $dsns = Dsn::parse('foo://foo:123,bar:567'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(2, $dsns); + + $this->assertSame('foo', $dsns[0]->getHost()); + $this->assertSame(123, $dsns[0]->getPort()); + + $this->assertSame('bar', $dsns[1]->getHost()); + $this->assertSame(567, $dsns[1]->getPort()); + } + + public function testShouldParseMultipleDsnsWhenFirstHasPort() + { + $dsns = Dsn::parse('foo://foo:123,bar'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(2, $dsns); + + $this->assertSame('foo', $dsns[0]->getHost()); + $this->assertSame(123, $dsns[0]->getPort()); + + $this->assertSame('bar', $dsns[1]->getHost()); + $this->assertNull($dsns[1]->getPort()); + } + + public function testShouldParseMultipleDsnsWhenLastHasPort() + { + $dsns = Dsn::parse('foo://foo,bar:567'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(2, $dsns); + + $this->assertSame('foo', $dsns[0]->getHost()); + $this->assertNull($dsns[0]->getPort()); + + $this->assertSame('bar', $dsns[1]->getHost()); + $this->assertSame(567, $dsns[1]->getPort()); + } + + public function testShouldParseMultipleDsnsWithPath() + { + $dsns = Dsn::parse('foo://foo:123,bar:567/foo/bar'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(2, $dsns); + + $this->assertSame('foo', $dsns[0]->getHost()); + $this->assertSame(123, $dsns[0]->getPort()); + + $this->assertSame('bar', $dsns[1]->getHost()); + $this->assertSame(567, $dsns[1]->getPort()); + } + + public function testShouldParseMultipleDsnsWithQuery() + { + $dsns = Dsn::parse('foo://foo:123,bar:567?foo=val'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(2, $dsns); + + $this->assertSame('foo', $dsns[0]->getHost()); + $this->assertSame(123, $dsns[0]->getPort()); + + $this->assertSame('bar', $dsns[1]->getHost()); + $this->assertSame(567, $dsns[1]->getPort()); + } + + public function testShouldParseMultipleDsnsWithQueryAndPath() + { + $dsns = Dsn::parse('foo://foo:123,bar:567/foo?foo=val'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(2, $dsns); + + $this->assertSame('foo', $dsns[0]->getHost()); + $this->assertSame(123, $dsns[0]->getPort()); + + $this->assertSame('bar', $dsns[1]->getHost()); + $this->assertSame(567, $dsns[1]->getPort()); + } + + public function testShouldParseMultipleDsnsIfOnlyColonProvided() + { + $dsns = Dsn::parse(':'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(1, $dsns); + + $this->assertNull($dsns[0]->getHost()); + $this->assertNull($dsns[0]->getPort()); + } + + public function testShouldParseMultipleDsnsWithOnlyScheme() + { + $dsns = Dsn::parse('foo:'); + + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(1, $dsns); + + $this->assertSame('foo', $dsns[0]->getScheme()); + $this->assertNull($dsns[0]->getHost()); + $this->assertNull($dsns[0]->getPort()); + } + + public function testShouldParseExpectedNumberOfMultipleDsns() + { + $dsns = Dsn::parse('foo://foo'); + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(1, $dsns); + + $dsns = Dsn::parse('foo://foo,bar'); + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(2, $dsns); + + $dsns = Dsn::parse('foo://foo,bar,baz'); + $this->assertContainsOnly(Dsn::class, $dsns); + $this->assertCount(3, $dsns); + } + public static function provideSchemes() { yield [':', '', '', []]; @@ -273,4 +430,15 @@ public static function provideBooleanQueryParameters() yield ['false', false]; } + + public static function provideArrayQueryParameters() + { + yield ['aName[0]=val', ['val']]; + + yield ['aName[key]=val', ['key' => 'val']]; + + yield ['aName[0]=fooVal&aName[1]=barVal', ['fooVal', 'barVal']]; + + yield ['aName[foo]=fooVal&aName[bar]=barVal', ['foo' => 'fooVal', 'bar' => 'barVal']]; + } } diff --git a/pkg/enqueue/Client/DriverFactory.php b/pkg/enqueue/Client/DriverFactory.php index 36534d58c..60fda51da 100644 --- a/pkg/enqueue/Client/DriverFactory.php +++ b/pkg/enqueue/Client/DriverFactory.php @@ -30,7 +30,7 @@ public function __construct(Config $config, RouteCollection $routeCollection) public function create(ConnectionFactory $factory, string $dsn, array $config): DriverInterface { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); if ($driverInfo = $this->findDriverInfo($dsn, Resources::getAvailableDrivers())) { $driverClass = $driverInfo['driverClass']; diff --git a/pkg/enqueue/ConnectionFactoryFactory.php b/pkg/enqueue/ConnectionFactoryFactory.php index 48c7f3d7f..d89c671e7 100644 --- a/pkg/enqueue/ConnectionFactoryFactory.php +++ b/pkg/enqueue/ConnectionFactoryFactory.php @@ -21,7 +21,7 @@ public function create($config): ConnectionFactory throw new \InvalidArgumentException('The config must have dsn key set.'); } - $dsn = new Dsn($config['dsn']); + $dsn = Dsn::parseFirst($config['dsn']); if ($factoryClass = $this->findFactoryClass($dsn, Resources::getAvailableConnections())) { return new $factoryClass(1 === count($config) ? $config['dsn'] : $config); diff --git a/pkg/fs/FsConnectionFactory.php b/pkg/fs/FsConnectionFactory.php index 829014e38..ad13e9eb6 100644 --- a/pkg/fs/FsConnectionFactory.php +++ b/pkg/fs/FsConnectionFactory.php @@ -70,7 +70,7 @@ public function createContext(): Context private function parseDsn(string $dsn): array { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); $supportedSchemes = ['file']; if (false == in_array($dsn->getSchemeProtocol(), $supportedSchemes, true)) { @@ -83,9 +83,9 @@ private function parseDsn(string $dsn): array return array_filter(array_replace($dsn->getQuery(), [ 'path' => $dsn->getPath(), - 'pre_fetch_count' => $dsn->getInt('pre_fetch_count'), + 'pre_fetch_count' => $dsn->getDecimal('pre_fetch_count'), 'chmod' => $dsn->getOctal('chmod'), - 'polling_interval' => $dsn->getInt('polling_interval'), + 'polling_interval' => $dsn->getDecimal('polling_interval'), ]), function ($value) { return null !== $value; }); } diff --git a/pkg/gps/GpsConnectionFactory.php b/pkg/gps/GpsConnectionFactory.php index bc4a0a52a..c15854763 100644 --- a/pkg/gps/GpsConnectionFactory.php +++ b/pkg/gps/GpsConnectionFactory.php @@ -85,7 +85,7 @@ public function createContext(): Context private function parseDsn(string $dsn): array { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); if ('gps' !== $dsn->getSchemeProtocol()) { throw new \LogicException(sprintf( @@ -94,14 +94,14 @@ private function parseDsn(string $dsn): array )); } - $emulatorHost = $dsn->getQueryParameter('emulatorHost'); + $emulatorHost = $dsn->getString('emulatorHost'); $hasEmulator = $emulatorHost ? true : null; return array_filter(array_replace($dsn->getQuery(), [ - 'projectId' => $dsn->getQueryParameter('projectId'), - 'keyFilePath' => $dsn->getQueryParameter('keyFilePath'), - 'retries' => $dsn->getInt('retries'), - 'scopes' => $dsn->getQueryParameter('scopes'), + 'projectId' => $dsn->getString('projectId'), + 'keyFilePath' => $dsn->getString('keyFilePath'), + 'retries' => $dsn->getDecimal('retries'), + 'scopes' => $dsn->getString('scopes'), 'emulatorHost' => $emulatorHost, 'hasEmulator' => $hasEmulator, 'lazy' => $dsn->getBool('lazy'), diff --git a/pkg/monitoring/GenericStatsStorageFactory.php b/pkg/monitoring/GenericStatsStorageFactory.php index f4a257c66..3fc94a4a6 100644 --- a/pkg/monitoring/GenericStatsStorageFactory.php +++ b/pkg/monitoring/GenericStatsStorageFactory.php @@ -22,7 +22,7 @@ public function create($config): StatsStorage throw new \InvalidArgumentException('The config must have dsn key set.'); } - $dsn = new Dsn($config['dsn']); + $dsn = Dsn::parseFirst($config['dsn']); if ($storageClass = $this->findStorageClass($dsn, Resources::getKnownStorages())) { return new $storageClass(1 === count($config) ? $config['dsn'] : $config); diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index e3be8ff58..7d25e1c57 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -182,7 +182,7 @@ private function getDb(): Database private function parseDsn(string $dsn): array { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); if (false === in_array($dsn->getSchemeProtocol(), ['influxdb'], true)) { throw new \LogicException(sprintf( @@ -196,10 +196,10 @@ private function parseDsn(string $dsn): array 'port' => $dsn->getPort(), 'user' => $dsn->getUser(), 'password' => $dsn->getPassword(), - 'db' => $dsn->getQueryParameter('db'), - 'measurementSentMessages' => $dsn->getQueryParameter('measurementSentMessages'), - 'measurementConsumedMessages' => $dsn->getQueryParameter('measurementConsumedMessages'), - 'measurementConsumers' => $dsn->getQueryParameter('measurementConsumers'), + 'db' => $dsn->getString('db'), + 'measurementSentMessages' => $dsn->getString('measurementSentMessages'), + 'measurementConsumedMessages' => $dsn->getString('measurementConsumedMessages'), + 'measurementConsumers' => $dsn->getString('measurementConsumers'), ]), function ($value) { return null !== $value; }); } } diff --git a/pkg/monitoring/WampStorage.php b/pkg/monitoring/WampStorage.php index 79cf78cb7..44623d4e5 100644 --- a/pkg/monitoring/WampStorage.php +++ b/pkg/monitoring/WampStorage.php @@ -192,7 +192,7 @@ private function createClient(): Client private function parseDsn(string $dsn): array { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); if (false === in_array($dsn->getSchemeProtocol(), ['wamp', 'ws'], true)) { throw new \LogicException(sprintf( @@ -204,10 +204,10 @@ private function parseDsn(string $dsn): array return array_filter(array_replace($dsn->getQuery(), [ 'host' => $dsn->getHost(), 'port' => $dsn->getPort(), - 'topic' => $dsn->getQueryParameter('topic'), - 'max_retries' => $dsn->getInt('max_retries'), + 'topic' => $dsn->getString('topic'), + 'max_retries' => $dsn->getDecimal('max_retries'), 'initial_retry_delay' => $dsn->getFloat('initial_retry_delay'), - 'max_retry_delay' => $dsn->getInt('max_retry_delay'), + 'max_retry_delay' => $dsn->getDecimal('max_retry_delay'), 'retry_delay_growth' => $dsn->getFloat('retry_delay_growth'), ]), function ($value) { return null !== $value; }); } diff --git a/pkg/redis/RedisConnectionFactory.php b/pkg/redis/RedisConnectionFactory.php index eee9d4851..ce56657cb 100644 --- a/pkg/redis/RedisConnectionFactory.php +++ b/pkg/redis/RedisConnectionFactory.php @@ -110,7 +110,7 @@ private function createRedis(): Redis private function parseDsn(string $dsn): array { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); $supportedSchemes = ['redis', 'rediss', 'tcp', 'tls', 'unix']; if (false == in_array($dsn->getSchemeProtocol(), $supportedSchemes, true)) { @@ -121,7 +121,7 @@ private function parseDsn(string $dsn): array )); } - $database = $dsn->getInt('database'); + $database = $dsn->getDecimal('database'); // try use path as database name if not set. if (null === $database && 'unix' !== $dsn->getSchemeProtocol() && null !== $dsn->getPath()) { diff --git a/pkg/sqs/SqsConnectionFactory.php b/pkg/sqs/SqsConnectionFactory.php index 50dad89c2..5f626c368 100644 --- a/pkg/sqs/SqsConnectionFactory.php +++ b/pkg/sqs/SqsConnectionFactory.php @@ -114,7 +114,7 @@ private function establishConnection(): SqsClient private function parseDsn(string $dsn): array { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); if ('sqs' !== $dsn->getSchemeProtocol()) { throw new \LogicException(sprintf( @@ -124,14 +124,14 @@ private function parseDsn(string $dsn): array } return array_filter(array_replace($dsn->getQuery(), [ - 'key' => $dsn->getQueryParameter('key'), - 'secret' => $dsn->getQueryParameter('secret'), - 'token' => $dsn->getQueryParameter('token'), - 'region' => $dsn->getQueryParameter('region'), - 'retries' => $dsn->getInt('retries'), - 'version' => $dsn->getQueryParameter('version'), + 'key' => $dsn->getString('key'), + 'secret' => $dsn->getString('secret'), + 'token' => $dsn->getString('token'), + 'region' => $dsn->getString('region'), + 'retries' => $dsn->getDecimal('retries'), + 'version' => $dsn->getString('version'), 'lazy' => $dsn->getBool('lazy'), - 'endpoint' => $dsn->getQueryParameter('endpoint'), + 'endpoint' => $dsn->getString('endpoint'), ]), function ($value) { return null !== $value; }); } diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index 329d3fa95..b5d517c60 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -97,7 +97,7 @@ private function establishConnection(): BufferedStompClient private function parseDsn(string $dsn): array { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); if ('stomp' !== $dsn->getSchemeProtocol()) { throw new \LogicException(sprintf('The given DSN "%s" is not supported. Must start with "stomp:".', $dsn)); @@ -109,8 +109,8 @@ private function parseDsn(string $dsn): array 'login' => $dsn->getUser(), 'password' => $dsn->getPassword(), 'vhost' => null !== $dsn->getPath() ? ltrim($dsn->getPath(), '/') : null, - 'buffer_size' => $dsn->getInt('buffer_size'), - 'connection_timeout' => $dsn->getInt('connection_timeout'), + 'buffer_size' => $dsn->getDecimal('buffer_size'), + 'connection_timeout' => $dsn->getDecimal('connection_timeout'), 'sync' => $dsn->getBool('sync'), 'lazy' => $dsn->getBool('lazy'), 'ssl_on' => $dsn->getBool('ssl_on'), diff --git a/pkg/test/RabbitManagementExtensionTrait.php b/pkg/test/RabbitManagementExtensionTrait.php index 0940874ab..82bdd072c 100644 --- a/pkg/test/RabbitManagementExtensionTrait.php +++ b/pkg/test/RabbitManagementExtensionTrait.php @@ -11,7 +11,7 @@ trait RabbitManagementExtensionTrait */ private function removeQueue($queueName) { - $dsn = new Dsn(getenv('RABBITMQ_AMQP_DSN')); + $dsn = Dsn::parseFirst(getenv('RABBITMQ_AMQP_DSN')); $url = sprintf( 'http://%s:15672/api/queues/%s/%s', @@ -45,7 +45,7 @@ private function removeQueue($queueName) */ private function removeExchange($exchangeName) { - $dsn = new Dsn(getenv('RABBITMQ_AMQP_DSN')); + $dsn = Dsn::parseFirst(getenv('RABBITMQ_AMQP_DSN')); $url = sprintf( 'http://%s:15672/api/exchanges/%s/%s', diff --git a/pkg/wamp/WampConnectionFactory.php b/pkg/wamp/WampConnectionFactory.php index 38b625fcd..3ba29f60a 100644 --- a/pkg/wamp/WampConnectionFactory.php +++ b/pkg/wamp/WampConnectionFactory.php @@ -85,7 +85,7 @@ private function establishConnection(): Client private function parseDsn(string $dsn): array { - $dsn = new Dsn($dsn); + $dsn = Dsn::parseFirst($dsn); if (false === in_array($dsn->getSchemeProtocol(), ['wamp', 'ws'], true)) { throw new \LogicException(sprintf( @@ -97,9 +97,9 @@ private function parseDsn(string $dsn): array return array_filter(array_replace($dsn->getQuery(), [ 'host' => $dsn->getHost(), 'port' => $dsn->getPort(), - 'max_retries' => $dsn->getInt('max_retries'), + 'max_retries' => $dsn->getDecimal('max_retries'), 'initial_retry_delay' => $dsn->getFloat('initial_retry_delay'), - 'max_retry_delay' => $dsn->getInt('max_retry_delay'), + 'max_retry_delay' => $dsn->getDecimal('max_retry_delay'), 'retry_delay_growth' => $dsn->getFloat('retry_delay_growth'), ]), function ($value) { return null !== $value; }); } From 728bf1c4ec0c7247db24e81fbb153f352012716e Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 17 Nov 2018 16:32:42 +0200 Subject: [PATCH 0435/1142] always return query bag on getArray. --- docs/dsn.md | 3 ++- pkg/dsn/Dsn.php | 2 +- pkg/dsn/QueryBag.php | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/dsn.md b/docs/dsn.md index 6fc571f43..701208a02 100644 --- a/docs/dsn.md +++ b/docs/dsn.md @@ -91,13 +91,14 @@ Get typed query params: getDecimal('decimal'); // 12 $dsn->getOctal('decimal'); // 0666 $dsn->getFloat('float'); // 1.2 $dsn->getBool('bool'); // true $dsn->getArray('array')->getString(0); // val +$dsn->getArray('array')->getDecimal(1); // 123 $dsn->getArray('array')->toArray(); // [val] ``` diff --git a/pkg/dsn/Dsn.php b/pkg/dsn/Dsn.php index 221e74bd2..afc67095a 100644 --- a/pkg/dsn/Dsn.php +++ b/pkg/dsn/Dsn.php @@ -175,7 +175,7 @@ public function getBool(string $name, bool $default = null): ?bool return $this->queryBag->getBool($name, $default); } - public function getArray(string $name, bool $default = null): QueryBag + public function getArray(string $name, array $default = []): QueryBag { return $this->queryBag->getArray($name, $default); } diff --git a/pkg/dsn/QueryBag.php b/pkg/dsn/QueryBag.php index 6dc88442c..53d82b8ed 100644 --- a/pkg/dsn/QueryBag.php +++ b/pkg/dsn/QueryBag.php @@ -86,10 +86,10 @@ public function getBool(string $name, bool $default = null): ?bool throw InvalidQueryParameterTypeException::create($name, 'bool'); } - public function getArray(string $name, bool $default = null): ?self + public function getArray(string $name, array $default = []): self { if (false == array_key_exists($name, $this->query)) { - return $default; + return new self($default); } $value = $this->query[$name]; From 1af223d831cd55b9fb15fc18dd77b14437181266 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 17 Nov 2018 16:44:41 +0200 Subject: [PATCH 0436/1142] fix --- pkg/dsn/Dsn.php | 4 +++- pkg/dsn/Tests/DsnTest.php | 10 ++++++++++ pkg/stomp/StompConnectionFactory.php | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/pkg/dsn/Dsn.php b/pkg/dsn/Dsn.php index afc67095a..c7bba9e0a 100644 --- a/pkg/dsn/Dsn.php +++ b/pkg/dsn/Dsn.php @@ -250,7 +250,9 @@ public static function parse(string $dsn): array list($hostsPorts) = explode('#', $dsnWithoutUserPassword, 2); list($hostsPorts) = explode('?', $hostsPorts, 2); list($hostsPorts) = explode('/', $hostsPorts, 2); - } else { + } + + if (empty($hostsPorts)) { return [ new self( $scheme, diff --git a/pkg/dsn/Tests/DsnTest.php b/pkg/dsn/Tests/DsnTest.php index 7c92a4ad2..72b97488f 100644 --- a/pkg/dsn/Tests/DsnTest.php +++ b/pkg/dsn/Tests/DsnTest.php @@ -180,6 +180,16 @@ public function testShouldParseQueryParameterAsFloat(string $parameter, float $e $this->assertSame($expected, $dsn->getFloat('aName')); } + public function testShouldParseDSNWithoutAuthorityPart() + { + $dsn = Dsn::parseFirst('foo:///foo'); + + $this->assertNull($dsn->getUser()); + $this->assertNull($dsn->getPassword()); + $this->assertNull($dsn->getHost()); + $this->assertNull($dsn->getPort()); + } + public function testShouldReturnDefaultFloatIfNotSet() { $dsn = Dsn::parseFirst('foo:'); diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index b5d517c60..c88716308 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -100,7 +100,7 @@ private function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if ('stomp' !== $dsn->getSchemeProtocol()) { - throw new \LogicException(sprintf('The given DSN "%s" is not supported. Must start with "stomp:".', $dsn)); + throw new \LogicException(sprintf('The given DSN is not supported. Must start with "stomp:".')); } return array_filter(array_replace($dsn->getQuery(), [ From 9c8a399a03d1b3d2a4ddb2db915b0866d6588612 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 19 Nov 2018 11:45:42 +0200 Subject: [PATCH 0437/1142] remove unrelated changes. --- .../Tests/Functional/Events/AsyncListenerTest.php | 4 ++-- .../Tests/Functional/Events/AsyncProcessorTest.php | 9 +++------ .../Tests/Functional/Events/AsyncSubscriberTest.php | 8 ++------ pkg/enqueue/Client/Producer.php | 6 ------ 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php index 87b406e15..ae0cf7e97 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php @@ -20,9 +20,9 @@ protected function tearDown() { parent::tearDown(); -//<<<<<<< HEAD + //<<<<<<< HEAD // static::$container = null; -//======= + //======= /** @var AsyncListener $asyncListener */ $asyncListener = static::$container->get('enqueue.events.async_listener'); diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php index cf21d8689..101e5ecec 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Bundle\Tests\Functional\Events; +use Enqueue\AsyncEventDispatcher\AsyncListener; use Enqueue\AsyncEventDispatcher\AsyncProcessor; use Enqueue\Bundle\Tests\Functional\App\TestAsyncListener; use Enqueue\Bundle\Tests\Functional\App\TestAsyncSubscriber; @@ -17,20 +18,16 @@ */ class AsyncProcessorTest extends WebTestCase { - protected function tearDown() + public function setUp() { - parent::tearDown(); + parent::setUp(); -//<<<<<<< HEAD -// static::$container = null; -//======= /** @var AsyncListener $asyncListener */ $asyncListener = static::$container->get('enqueue.events.async_listener'); $asyncListener->resetSyncMode(); static::$container->get('test_async_subscriber')->calls = []; static::$container->get('test_async_listener')->calls = []; -//>>>>>>> origin/master } public function testCouldBeGetFromContainerAsService() diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php index d347d1fdb..6e00eafca 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php @@ -16,20 +16,16 @@ */ class AsyncSubscriberTest extends WebTestCase { - protected function tearDown() + public function setUp() { - parent::tearDown(); + parent::setUp(); -//<<<<<<< HEAD -// static::$container = null; -//======= /** @var AsyncListener $asyncListener */ $asyncListener = static::$container->get('enqueue.events.async_listener'); $asyncListener->resetSyncMode(); static::$container->get('test_async_subscriber')->calls = []; static::$container->get('test_async_listener')->calls = []; -//>>>>>>> origin/master } public function testShouldNotCallRealSubscriberIfMarkedAsAsync() diff --git a/pkg/enqueue/Client/Producer.php b/pkg/enqueue/Client/Producer.php index 3d73cd8cf..6ea612b8c 100644 --- a/pkg/enqueue/Client/Producer.php +++ b/pkg/enqueue/Client/Producer.php @@ -9,12 +9,6 @@ final class Producer implements ProducerInterface { - /** - * compatibility with 0.9x. - */ - const TOPIC_09X = 'enqueue.topic'; - const COMMAND_09X = 'enqueue.command'; - /** * @var DriverInterface */ From 79b5cf5b569a428b1e64eca8bb806e4ce838b021 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 19 Nov 2018 11:48:10 +0200 Subject: [PATCH 0438/1142] remove unrelated changes. --- .../Tests/Functional/Events/AsyncListenerTest.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php index ae0cf7e97..6e952ab28 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php @@ -16,13 +16,10 @@ */ class AsyncListenerTest extends WebTestCase { - protected function tearDown() + public function setUp() { - parent::tearDown(); + parent::setUp(); - //<<<<<<< HEAD -// static::$container = null; - //======= /** @var AsyncListener $asyncListener */ $asyncListener = static::$container->get('enqueue.events.async_listener'); From 84bd4578afcc545fe00b5d3762f40c508e0e1926 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 20 Nov 2018 13:19:22 +0200 Subject: [PATCH 0439/1142] fix tests. --- pkg/stomp/Tests/StompConnectionFactoryConfigTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php index 16a481bb2..e8705a010 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php @@ -24,7 +24,7 @@ public function testThrowNeitherArrayStringNorNullGivenAsConfig() public function testThrowIfSchemeIsNotStomp() { $this->expectException(\LogicException::class); - $this->expectExceptionMessage('The given DSN "http://example.com/" is not supported. Must start with "stomp:".'); + $this->expectExceptionMessage('The given DSN is not supported. Must start with "stomp:".'); new StompConnectionFactory('http://example.com/'); } From e7f64aeed8833c5bd0302b1591436f0337435de7 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 21 Nov 2018 13:55:20 +0200 Subject: [PATCH 0440/1142] Rework DriverFactory, add separator option to Client Config. --- docs/bundle/config_reference.md | 2 +- docs/laravel/quick_tour.md | 2 +- .../Tests/Functional/App/CustomAppKernel.php | 2 +- .../DependencyInjection/ConfigurationTest.php | 59 +++++++++++++++++- pkg/enqueue/Client/Config.php | 49 +++++++++++---- pkg/enqueue/Client/DriverFactory.php | 30 ++++------ pkg/enqueue/Client/DriverFactoryInterface.php | 2 +- .../DependencyInjection/ClientFactory.php | 26 ++++---- pkg/enqueue/Tests/Client/ConfigTest.php | 60 +++++++++++++++---- .../SetRouterPropertiesExtensionTest.php | 2 +- .../Client/Driver/GenericDriverTestsTrait.php | 8 +++ .../Client/Driver/RabbitMqStompDriverTest.php | 7 +++ .../Tests/Client/DriverFactoryTest.php | 35 +++++++---- .../Tests/Client/ProducerSendCommandTest.php | 5 +- .../Tests/Client/ProducerSendEventTest.php | 5 +- .../DependencyInjection/ClientFactoryTest.php | 4 +- pkg/simple-client/SimpleClient.php | 50 +++++++++------- .../Tests/Functional/SimpleClientTest.php | 6 +- .../Tests/Functional/WampConsumerTest.php | 3 + 19 files changed, 259 insertions(+), 98 deletions(-) diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index e12be7b4a..45d6f8218 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -43,8 +43,8 @@ enqueue: router_topic: default router_queue: default router_processor: null - default_processor_queue: default redelivered_delay_time: 0 + default_queue: default # The "monitoring" option could accept a string DSN, an array with DSN key, or null. It accept extra options. To find out what option you can set, look at stats storage constructor doc block. monitoring: diff --git a/docs/laravel/quick_tour.md b/docs/laravel/quick_tour.md index 5b83a4498..970a06e29 100644 --- a/docs/laravel/quick_tour.md +++ b/docs/laravel/quick_tour.md @@ -66,7 +66,7 @@ return [ 'client' => [ 'router_topic' => 'default', 'router_queue' => 'default', - 'default_processor_queue' => 'default', + 'default_queue' => 'default', ], ], ]; diff --git a/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php b/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php index 59015f88a..2f272bf1b 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php @@ -22,7 +22,7 @@ class CustomAppKernel extends Kernel 'app_name' => '', 'router_topic' => 'test', 'router_queue' => 'test', - 'default_processor_queue' => 'test', + 'default_queue' => 'test', ], ], ]; diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index 0c41fdcb3..d33d9e0e3 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -7,6 +7,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; +use Symfony\Component\Config\Definition\Exception\InvalidTypeException; use Symfony\Component\Config\Definition\Processor; class ConfigurationTest extends TestCase @@ -96,7 +97,7 @@ public function testShouldSetDefaultConfigurationForClient() 'router_processor' => null, 'router_topic' => 'default', 'router_queue' => 'default', - 'default_processor_queue' => 'default', + 'default_queue' => 'default', 'traceable_producer' => true, 'redelivered_delay_time' => 0, ], @@ -104,6 +105,58 @@ public function testShouldSetDefaultConfigurationForClient() ], $config); } + public function testThrowIfClientDriverOptionsIsNotArray() + { + $configuration = new Configuration(true); + + $processor = new Processor(); + + $this->expectException(InvalidTypeException::class); + $this->expectExceptionMessage('Invalid type for path "enqueue.default.client.driver_options". Expected array, but got string'); + $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => 'null:', + 'client' => [ + 'driver_options' => 'invalidOption', + ], + ], + ]]); + } + + public function testShouldConfigureClientDriverOptions() + { + $configuration = new Configuration(true); + + $processor = new Processor(); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => 'null:', + 'client' => [ + 'driver_options' => [ + 'foo' => 'fooVal', + ], + ], + ], + ]]); + + $this->assertConfigEquals([ + 'default' => [ + 'client' => [ + 'prefix' => 'enqueue', + 'app_name' => 'app', + 'router_processor' => null, + 'router_topic' => 'default', + 'router_queue' => 'default', + 'default_queue' => 'default', + 'traceable_producer' => true, + 'driver_options' => [ + 'foo' => 'fooVal', + ], + ], + ], + ], $config); + } + public function testThrowExceptionIfRouterTopicIsEmpty() { $this->expectException(InvalidConfigurationException::class); @@ -147,12 +200,12 @@ public function testShouldThrowExceptionIfDefaultProcessorQueueIsEmpty() $processor = new Processor(); $this->expectException(InvalidConfigurationException::class); - $this->expectExceptionMessage('The path "enqueue.default.client.default_processor_queue" cannot contain an empty value, but got "".'); + $this->expectExceptionMessage('The path "enqueue.default.client.default_queue" cannot contain an empty value, but got "".'); $processor->processConfiguration($configuration, [[ 'default' => [ 'transport' => ['dsn' => 'null:'], 'client' => [ - 'default_processor_queue' => '', + 'default_queue' => '', ], ], ]]); diff --git a/pkg/enqueue/Client/Config.php b/pkg/enqueue/Client/Config.php index ef68fb632..888384207 100644 --- a/pkg/enqueue/Client/Config.php +++ b/pkg/enqueue/Client/Config.php @@ -52,8 +52,22 @@ class Config */ private $transportConfig; - public function __construct(string $prefix, string $app, string $routerTopic, string $routerQueue, string $defaultQueue, string $routerProcessor, array $transportConfig = []) - { + /** + * @var array + */ + private $driverConfig; + + public function __construct( + string $prefix, + string $separator, + string $app, + string $routerTopic, + string $routerQueue, + string $defaultQueue, + string $routerProcessor, + array $transportConfig, + array $driverConfig + ) { $this->prefix = trim($prefix); $this->app = trim($app); @@ -78,8 +92,9 @@ public function __construct(string $prefix, string $app, string $routerTopic, st } $this->transportConfig = $transportConfig; + $this->driverConfig = $driverConfig; - $this->separator = '.'; + $this->separator = $separator; } public function getPrefix(): string @@ -117,33 +132,47 @@ public function getRouterProcessor(): string return $this->routerProcessor; } - /** - * @deprecated - * - * @param null|mixed $default - */ public function getTransportOption(string $name, $default = null) { return array_key_exists($name, $this->transportConfig) ? $this->transportConfig[$name] : $default; } + public function getTransportOptions(): array + { + return $this->transportConfig; + } + + public function getDriverOption(string $name, $default = null) + { + return array_key_exists($name, $this->driverConfig) ? $this->driverConfig[$name] : $default; + } + + public function getDriverOptions(): array + { + return $this->driverConfig; + } + public static function create( string $prefix = null, + string $separator = null, string $app = null, string $routerTopic = null, string $routerQueue = null, string $defaultQueue = null, string $routerProcessor = null, - array $transportConfig = [] + array $transportConfig = [], + array $driverConfig = [] ): self { return new static( $prefix ?: '', + $separator ?: '.', $app ?: '', $routerTopic ?: 'router', $routerQueue ?: 'default', $defaultQueue ?: 'default', $routerProcessor ?: 'router', - $transportConfig + $transportConfig, + $driverConfig ); } } diff --git a/pkg/enqueue/Client/DriverFactory.php b/pkg/enqueue/Client/DriverFactory.php index 60fda51da..48433fb8e 100644 --- a/pkg/enqueue/Client/DriverFactory.php +++ b/pkg/enqueue/Client/DriverFactory.php @@ -12,24 +12,14 @@ final class DriverFactory implements DriverFactoryInterface { - /** - * @var Config - */ - private $config; - - /** - * @var RouteCollection - */ - private $routeCollection; - - public function __construct(Config $config, RouteCollection $routeCollection) + public function create(ConnectionFactory $factory, Config $config, RouteCollection $collection): DriverInterface { - $this->config = $config; - $this->routeCollection = $routeCollection; - } + $dsn = $config->getTransportOption('dsn'); + + if (empty($dsn)) { + throw new \LogicException('This driver factory relies on dsn option from transport config. The option is empty or not set.'); + } - public function create(ConnectionFactory $factory, string $dsn, array $config): DriverInterface - { $dsn = Dsn::parseFirst($dsn); if ($driverInfo = $this->findDriverInfo($dsn, Resources::getAvailableDrivers())) { @@ -44,7 +34,7 @@ public function create(ConnectionFactory $factory, string $dsn, array $config): )); } - return new RabbitMqDriver($factory->createContext(), $this->config, $this->routeCollection); + return new RabbitMqDriver($factory->createContext(), $config, $collection); } if (RabbitMqStompDriver::class === $driverClass) { @@ -59,15 +49,15 @@ public function create(ConnectionFactory $factory, string $dsn, array $config): $managementClient = StompManagementClient::create( ltrim($dsn->getPath(), '/'), $dsn->getHost() ?: 'localhost', - $config['management_plugin_port'] ?? 15672, + $config->getDriverOption('management_plugin_port', 15672), (string) $dsn->getUser(), (string) $dsn->getPassword() ); - return new RabbitMqStompDriver($factory->createContext(), $this->config, $this->routeCollection, $managementClient); + return new RabbitMqStompDriver($factory->createContext(), $config, $collection, $managementClient); } - return new $driverClass($factory->createContext(), $this->config, $this->routeCollection); + return new $driverClass($factory->createContext(), $config, $collection); } $knownDrivers = Resources::getKnownDrivers(); diff --git a/pkg/enqueue/Client/DriverFactoryInterface.php b/pkg/enqueue/Client/DriverFactoryInterface.php index 6a558b7e2..698ad05a4 100644 --- a/pkg/enqueue/Client/DriverFactoryInterface.php +++ b/pkg/enqueue/Client/DriverFactoryInterface.php @@ -6,5 +6,5 @@ interface DriverFactoryInterface { - public function create(ConnectionFactory $factory, string $dsn, array $config): DriverInterface; + public function create(ConnectionFactory $factory, Config $config, RouteCollection $collection): DriverInterface; } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php index 0acf659f7..e69311e36 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php @@ -65,13 +65,19 @@ public static function getConfiguration(bool $debug, string $name = 'client'): N $builder->children() ->booleanNode('traceable_producer')->defaultValue($debug)->end() ->scalarNode('prefix')->defaultValue('enqueue')->end() + ->scalarNode('separator')->defaultValue('.')->end() ->scalarNode('app_name')->defaultValue('app')->end() ->scalarNode('router_topic')->defaultValue('default')->cannotBeEmpty()->end() ->scalarNode('router_queue')->defaultValue('default')->cannotBeEmpty()->end() ->scalarNode('router_processor')->defaultNull()->end() - ->scalarNode('default_processor_queue')->defaultValue('default')->cannotBeEmpty()->end() ->integerNode('redelivered_delay_time')->min(0)->defaultValue(0)->end() - ->end()->end() + ->scalarNode('default_queue')->defaultValue('default')->cannotBeEmpty()->end() + ->arrayNode('driver_options') + ->addDefaultsIfNotSet() + ->info('The array contains driver specific options') + ->ignoreExtraKeys(false) + ->end() + ->end()->end() ; return $builder; @@ -83,10 +89,7 @@ public function build(ContainerBuilder $container, array $config): void ->setFactory([$this->diUtils->reference('driver'), 'getContext']) ; - $container->register($this->diUtils->format('driver_factory'), DriverFactory::class) - ->addArgument($this->diUtils->reference('config')) - ->addArgument($this->diUtils->reference('route_collection')) - ; + $container->register($this->diUtils->format('driver_factory'), DriverFactory::class); $routerProcessor = empty($config['router_processor']) ? $this->diUtils->format('router_processor') @@ -96,18 +99,19 @@ public function build(ContainerBuilder $container, array $config): void $container->register($this->diUtils->format('config'), Config::class) ->setArguments([ $config['prefix'], + $config['separator'], $config['app_name'], $config['router_topic'], $config['router_queue'], - $config['default_processor_queue'], + $config['default_queue'], $routerProcessor, - // @todo should be driver options. $config['transport'], + $config['driver_options'] ?? [], ]); $container->setParameter($this->diUtils->format('router_processor'), $routerProcessor); $container->setParameter($this->diUtils->format('router_queue_name'), $config['router_queue']); - $container->setParameter($this->diUtils->format('default_queue_name'), $config['default_processor_queue']); + $container->setParameter($this->diUtils->format('default_queue_name'), $config['default_queue']); $container->register($this->diUtils->format('route_collection'), RouteCollection::class) ->addArgument([]) @@ -220,8 +224,8 @@ public function createDriver(ContainerBuilder $container, array $config): string $container->register($driverId, DriverInterface::class) ->setFactory([new Reference($driverFactoryId), 'create']) ->addArgument(new Reference($factoryId)) - ->addArgument($config['dsn']) - ->addArgument($config) + ->addArgument($this->diUtils->reference('config')) + ->addArgument($this->diUtils->reference('route_collection')) ; if ($this->default) { diff --git a/pkg/enqueue/Tests/Client/ConfigTest.php b/pkg/enqueue/Tests/Client/ConfigTest.php index 8e54508cf..09b80e2c1 100644 --- a/pkg/enqueue/Tests/Client/ConfigTest.php +++ b/pkg/enqueue/Tests/Client/ConfigTest.php @@ -11,11 +11,14 @@ public function testShouldReturnPrefixSetInConstructor() { $config = new Config( 'thePrefix', + 'theSeparator', 'aApp', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); $this->assertEquals('thePrefix', $config->getPrefix()); @@ -29,10 +32,13 @@ public function testShouldTrimReturnPrefixSetInConstructor(string $empty) $config = new Config( $empty, 'aApp', + 'theSeparator', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); $this->assertSame('', $config->getPrefix()); @@ -42,11 +48,14 @@ public function testShouldReturnAppNameSetInConstructor() { $config = new Config( 'aPrefix', + 'theSeparator', 'theApp', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); $this->assertEquals('theApp', $config->getApp()); @@ -59,11 +68,14 @@ public function testShouldTrimReturnAppNameSetInConstructor(string $empty) { $config = new Config( 'aPrefix', + 'theSeparator', $empty, 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); $this->assertSame('', $config->getApp()); @@ -73,11 +85,14 @@ public function testShouldReturnRouterProcessorNameSetInConstructor() { $config = new Config( 'aPrefix', + 'theSeparator', 'aApp', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); $this->assertEquals('aRouterProcessorName', $config->getRouterProcessor()); @@ -87,11 +102,14 @@ public function testShouldReturnRouterTopicNameSetInConstructor() { $config = new Config( 'aPrefix', + 'theSeparator', 'aApp', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); $this->assertEquals('aRouterTopicName', $config->getRouterTopic()); @@ -101,11 +119,14 @@ public function testShouldReturnRouterQueueNameSetInConstructor() { $config = new Config( 'aPrefix', + 'theSeparator', 'aApp', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); $this->assertEquals('aRouterQueueName', $config->getRouterQueue()); @@ -115,11 +136,14 @@ public function testShouldReturnDefaultQueueNameSetInConstructor() { $config = new Config( 'aPrefix', + 'theSeparator', 'aApp', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); $this->assertEquals('aDefaultQueueName', $config->getDefaultQueue()); @@ -143,12 +167,15 @@ public function testThrowIfRouterTopicNameIsEmpty(string $empty) $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Router topic is empty.'); new Config( + '', '', '', $empty, 'aRouterQueueName', 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); } @@ -160,12 +187,15 @@ public function testThrowIfRouterQueueNameIsEmpty(string $empty) $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Router queue is empty.'); new Config( + '', '', '', 'aRouterTopicName', $empty, 'aDefaultQueueName', - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); } @@ -177,12 +207,15 @@ public function testThrowIfDefaultQueueNameIsEmpty(string $empty) $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Default processor queue name is empty.'); new Config( + '', '', '', 'aRouterTopicName', 'aRouterQueueName', $empty, - 'aRouterProcessorName' + 'aRouterProcessorName', + [], + [] ); } @@ -194,12 +227,15 @@ public function testThrowIfRouterProcessorNameIsEmpty(string $empty) $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Router processor name is empty.'); new Config( + '', '', '', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueueName', - $empty + $empty, + [], + [] ); } diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php index be5609db6..4cd214e97 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php @@ -32,7 +32,7 @@ public function testCouldBeConstructedWithRequiredArguments() public function testShouldSetRouterProcessorPropertyIfNotSetAndOnRouterQueue() { - $config = Config::create('test', '', '', 'router-queue', '', 'router-processor-name'); + $config = Config::create('test', '.', '', '', 'router-queue', '', 'router-processor-name'); $queue = new NullQueue('test.router-queue'); $driver = $this->createDriverMock(); diff --git a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php index 2d39018fa..b4c23dd0d 100644 --- a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php +++ b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php @@ -70,11 +70,13 @@ public function testShouldCreateAndReturnQueueInstanceWithPrefixAndAppName() $config = new Config( 'aPrefix', + '.', 'anAppName', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueue', 'aRouterProcessor', + [], [] ); @@ -99,11 +101,13 @@ public function testShouldCreateAndReturnQueueInstanceWithPrefixWithoutAppName() $config = new Config( 'aPrefix', + '.', '', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueue', 'aRouterProcessor', + [], [] ); @@ -128,11 +132,13 @@ public function testShouldCreateAndReturnQueueInstanceWithAppNameAndWithoutPrefi $config = new Config( '', + '.', 'anAppName', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueue', 'aRouterProcessor', + [], [] ); @@ -157,11 +163,13 @@ public function testShouldCreateAndReturnQueueInstanceWithoutPrefixAndAppName() $config = new Config( '', + '.', '', 'aRouterTopicName', 'aRouterQueueName', 'aDefaultQueue', 'aRouterProcessor', + [], [] ); diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php index 5e6dc245e..1378dd3a2 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php @@ -121,6 +121,7 @@ public function testThrowIfDelayIsSetButDelayPluginInstalledOptionIsFalse() $config = Config::create( 'aPrefix', + '.', '', null, null, @@ -156,6 +157,7 @@ public function testShouldSetXDelayHeaderIfDelayPluginInstalledOptionIsTrue() $config = Config::create( 'aPrefix', + '.', '', null, null, @@ -232,6 +234,7 @@ public function shouldSendMessageToDelayExchangeIfDelaySet() $config = Config::create( 'aPrefix', + '.', '', null, null, @@ -261,6 +264,7 @@ public function testShouldNotSetupBrokerIfManagementPluginInstalledOptionIsNotEn { $config = Config::create( 'aPrefix', + '.', '', null, null, @@ -345,6 +349,7 @@ public function testShouldSetupBroker() $config = Config::create( 'aPrefix', + '.', '', null, null, @@ -412,6 +417,7 @@ public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() $config = Config::create( 'aPrefix', + '.', '', null, null, @@ -555,6 +561,7 @@ protected function createDummyConfig(): Config { return Config::create( 'aPrefix', + '.', '', null, null, diff --git a/pkg/enqueue/Tests/Client/DriverFactoryTest.php b/pkg/enqueue/Tests/Client/DriverFactoryTest.php index c4f1ffb46..cce6311e5 100644 --- a/pkg/enqueue/Tests/Client/DriverFactoryTest.php +++ b/pkg/enqueue/Tests/Client/DriverFactoryTest.php @@ -61,9 +61,9 @@ public function testShouldBeFinal() $this->assertTrue($rc->isFinal()); } - public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() + public function testCouldBeConstructedWithoutAnyArguments() { - new DriverFactory($this->createConfigMock(), new RouteCollection([])); + new DriverFactory(); } public function testThrowIfPackageThatSupportSchemeNotInstalled() @@ -75,9 +75,9 @@ public function testThrowIfPackageThatSupportSchemeNotInstalled() $this->expectException(\LogicException::class); $this->expectExceptionMessage('To use given scheme "scheme5b7aa7d7cd213" a package has to be installed. Run "composer req thePackage theOtherPackage" to add it.'); - $factory = new DriverFactory($this->createConfigMock(), new RouteCollection([])); + $factory = new DriverFactory(); - $factory->create($this->createConnectionFactoryMock(), $scheme.'://foo', []); + $factory->create($this->createConnectionFactoryMock(), $this->createDummyConfig($scheme.'://foo'), new RouteCollection([])); } public function testThrowIfSchemeIsNotKnown() @@ -87,9 +87,9 @@ public function testThrowIfSchemeIsNotKnown() $this->expectException(\LogicException::class); $this->expectExceptionMessage('A given scheme "scheme5b7aa862e70a5" is not supported. Maybe it is a custom driver, make sure you registered it with "Enqueue\Client\Resources::addDriver".'); - $factory = new DriverFactory($this->createConfigMock(), new RouteCollection([])); + $factory = new DriverFactory(); - $factory->create($this->createConnectionFactoryMock(), $scheme.'://foo', []); + $factory->create($this->createConnectionFactoryMock(), $this->createDummyConfig($scheme.'://foo'), new RouteCollection([])); } public function testThrowIfDsnInvalid() @@ -97,9 +97,9 @@ public function testThrowIfDsnInvalid() $this->expectException(\LogicException::class); $this->expectExceptionMessage('The DSN is invalid. It does not have scheme separator ":".'); - $factory = new DriverFactory($this->createConfigMock(), new RouteCollection([])); + $factory = new DriverFactory(); - $factory->create($this->createConnectionFactoryMock(), 'invalidDsn', []); + $factory->create($this->createConnectionFactoryMock(), $this->createDummyConfig('invalidDsn'), new RouteCollection([])); } /** @@ -119,9 +119,9 @@ public function testReturnsExpectedFactories( ->willReturn($this->createMock($contextClass)) ; - $driverFactory = new DriverFactory($this->createConfigMock(), new RouteCollection([])); + $driverFactory = new DriverFactory(); - $driver = $driverFactory->create($connectionFactoryMock, $dsn, $conifg); + $driver = $driverFactory->create($connectionFactoryMock, $this->createDummyConfig($dsn), new RouteCollection([])); $this->assertInstanceOf($expectedDriverClass, $driver); } @@ -164,6 +164,21 @@ public static function provideDSN() yield ['beanstalk:', PheanstalkConnectionFactory::class, PheanstalkContext::class, [], GenericDriver::class]; } + private function createDummyConfig(string $dsn): Config + { + return Config::create( + null, + null, + null, + null, + null, + null, + null, + ['dsn' => $dsn], + [] + ); + } + private function createConnectionFactoryMock(): ConnectionFactory { return $this->createMock(ConnectionFactory::class); diff --git a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php index 0fecbdfcf..3469c3862 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php @@ -507,11 +507,14 @@ private function createDriverStub(): DriverInterface { $config = new Config( 'a_prefix', + '.', 'an_app', 'a_router_topic', 'a_router_queue', 'a_default_processor_queue', - 'a_router_processor_name' + 'a_router_processor_name', + [], + [] ); $driverMock = $this->createMock(DriverInterface::class); diff --git a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php index de07d5547..1346afe18 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php @@ -527,11 +527,14 @@ private function createDriverStub(): DriverInterface { $config = new Config( 'a_prefix', + '.', 'an_app', 'a_router_topic', 'a_router_queue', 'a_default_processor_queue', - 'a_router_processor_name' + 'a_router_processor_name', + [], + [] ); $driverMock = $this->createMock(DriverInterface::class); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/ClientFactoryTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/ClientFactoryTest.php index cac1805ce..9f37dff47 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/ClientFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/ClientFactoryTest.php @@ -45,8 +45,8 @@ public function testShouldCreateDriverFromDsn() $this->assertEquals( [ new Reference('enqueue.transport.default.connection_factory'), - 'foo://bar/baz', - ['dsn' => 'foo://bar/baz', 'foo' => 'fooVal'], + new Reference('enqueue.client.default.config'), + new Reference('enqueue.client.default.route_collection'), ], $container->getDefinition('enqueue.client.default.driver')->getArguments()) ; diff --git a/pkg/simple-client/SimpleClient.php b/pkg/simple-client/SimpleClient.php index 118a43532..4e3d8e9d6 100644 --- a/pkg/simple-client/SimpleClient.php +++ b/pkg/simple-client/SimpleClient.php @@ -20,11 +20,14 @@ use Enqueue\ConnectionFactoryFactory; use Enqueue\Consumption\CallbackProcessor; use Enqueue\Consumption\ChainExtension as ConsumptionChainExtension; +use Enqueue\Consumption\Extension\ReplyExtension; +use Enqueue\Consumption\Extension\SignalExtension; use Enqueue\Consumption\ExtensionInterface; use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\QueueConsumerInterface; use Enqueue\Rpc\Promise; use Enqueue\Rpc\RpcFactory; +use Enqueue\Symfony\Client\DependencyInjection\ClientFactory; use Enqueue\Symfony\DependencyInjection\TransportFactory; use Interop\Queue\Processor; use Psr\Log\LoggerInterface; @@ -98,14 +101,16 @@ final class SimpleClient * 'transport' => 'null:', * 'client' => [ * 'prefix' => 'enqueue', + * 'separator' => '.', * 'app_name' => 'app', * 'router_topic' => 'router', * 'router_queue' => 'default', - * 'default_processor_queue' => 'default', + * 'default_queue' => 'default', * 'redelivered_delay_time' => 0 * ], * 'extensions' => [ * 'signal_extension' => true, + * 'reply_extension' => true, * ] * ] * @@ -241,20 +246,23 @@ public function build(array $configs): void $config = new Config( $simpleClientConfig['client']['prefix'], + $simpleClientConfig['client']['separator'], $simpleClientConfig['client']['app_name'], $simpleClientConfig['client']['router_topic'], $simpleClientConfig['client']['router_queue'], - $simpleClientConfig['client']['default_processor_queue'], + $simpleClientConfig['client']['default_queue'], 'enqueue.client.router_processor', - $simpleClientConfig['transport'] + $simpleClientConfig['transport'], + [] ); + $routeCollection = new RouteCollection([]); - $driverFactory = new DriverFactory($config, $routeCollection); + $driverFactory = new DriverFactory(); $driver = $driverFactory->create( $connection, - $simpleClientConfig['transport']['dsn'], - $simpleClientConfig['transport'] + $config, + $routeCollection ); $rpcFactory = new RpcFactory($driver->getContext()); @@ -271,6 +279,14 @@ public function build(array $configs): void $consumptionExtensions[] = new DelayRedeliveredMessageExtension($driver, $simpleClientConfig['client']['redelivered_delay_time']); } + if ($simpleClientConfig['extensions']['signal_extension']) { + $consumptionExtensions[] = new SignalExtension(); + } + + if ($simpleClientConfig['extensions']['reply_extension']) { + $consumptionExtensions[] = new ReplyExtension(); + } + $consumptionExtensions[] = new SetRouterPropertiesExtension($driver); $consumptionExtensions[] = new LogExtension(); @@ -299,23 +315,17 @@ private function createConfiguration(): NodeInterface return ['transport' => ['dsn' => 'null:']]; }); - $rootNode->children()->append(TransportFactory::getConfiguration()); + $rootNode + ->append(TransportFactory::getConfiguration()) + ->append(TransportFactory::getQueueConsumerConfiguration()) + ->append(ClientFactory::getConfiguration(false)) + ; $rootNode->children() - ->arrayNode('client') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('prefix')->defaultValue('enqueue')->end() - ->scalarNode('app_name')->defaultValue('app')->end() - ->scalarNode('router_topic')->defaultValue('default')->cannotBeEmpty()->end() - ->scalarNode('router_queue')->defaultValue('default')->cannotBeEmpty()->end() - ->scalarNode('default_processor_queue')->defaultValue('default')->cannotBeEmpty()->end() - ->integerNode('redelivered_delay_time')->min(0)->defaultValue(0)->end() - ->end() - ->end() - ->arrayNode('extensions')->addDefaultsIfNotSet()->children() + ->arrayNode('extensions')->addDefaultsIfNotSet()->children() ->booleanNode('signal_extension')->defaultValue(function_exists('pcntl_signal_dispatch'))->end() - ->end()->end() + ->booleanNode('reply_extension')->defaultTrue()->end() + ->end() ; return $tb->buildTree(); diff --git a/pkg/simple-client/Tests/Functional/SimpleClientTest.php b/pkg/simple-client/Tests/Functional/SimpleClientTest.php index 63699c23b..4a4c83289 100644 --- a/pkg/simple-client/Tests/Functional/SimpleClientTest.php +++ b/pkg/simple-client/Tests/Functional/SimpleClientTest.php @@ -70,7 +70,7 @@ public function testSendEventWithOneSubscriber(array $config, string $timeLimit) 'app_name' => 'simple_client', 'router_topic' => 'test', 'router_queue' => 'test', - 'default_processor_queue' => 'test', + 'default_queue' => 'test', ]; $client = new SimpleClient($config); @@ -110,7 +110,7 @@ public function testSendEventWithTwoSubscriber(array $config, string $timeLimit) 'app_name' => 'simple_client', 'router_topic' => 'test', 'router_queue' => 'test', - 'default_processor_queue' => 'test', + 'default_queue' => 'test', ]; $client = new SimpleClient($config); @@ -153,7 +153,7 @@ public function testSendCommand(array $config, string $timeLimit) 'app_name' => 'simple_client', 'router_topic' => 'test', 'router_queue' => 'test', - 'default_processor_queue' => 'test', + 'default_queue' => 'test', ]; $client = new SimpleClient($config); diff --git a/pkg/wamp/Tests/Functional/WampConsumerTest.php b/pkg/wamp/Tests/Functional/WampConsumerTest.php index e9d3fca42..f76cce71b 100644 --- a/pkg/wamp/Tests/Functional/WampConsumerTest.php +++ b/pkg/wamp/Tests/Functional/WampConsumerTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Wamp\Tests\Functional; +use Enqueue\Test\RetryTrait; use Enqueue\Test\WampExtension; use Enqueue\Wamp\WampMessage; use PHPUnit\Framework\TestCase; @@ -11,10 +12,12 @@ /** * @group functional * @group Wamp + * @retry 5 */ class WampConsumerTest extends TestCase { use WampExtension; + use RetryTrait; public static function setUpBeforeClass() { From 01f00d8f15f98e94f34c419a7fc7b08c1e515081 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 21 Nov 2018 16:41:53 +0200 Subject: [PATCH 0441/1142] [client] update rabbitmq stomp driver configuration --- pkg/enqueue/Client/DriverFactory.php | 49 ++++++++++------------------ 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/pkg/enqueue/Client/DriverFactory.php b/pkg/enqueue/Client/DriverFactory.php index 48433fb8e..0dd9412d8 100644 --- a/pkg/enqueue/Client/DriverFactory.php +++ b/pkg/enqueue/Client/DriverFactory.php @@ -2,12 +2,9 @@ namespace Enqueue\Client; -use Enqueue\Client\Driver\RabbitMqDriver; use Enqueue\Client\Driver\RabbitMqStompDriver; use Enqueue\Client\Driver\StompManagementClient; use Enqueue\Dsn\Dsn; -use Enqueue\Stomp\StompConnectionFactory; -use Interop\Amqp\AmqpConnectionFactory; use Interop\Queue\ConnectionFactory; final class DriverFactory implements DriverFactoryInterface @@ -25,36 +22,8 @@ public function create(ConnectionFactory $factory, Config $config, RouteCollecti if ($driverInfo = $this->findDriverInfo($dsn, Resources::getAvailableDrivers())) { $driverClass = $driverInfo['driverClass']; - if (RabbitMqDriver::class === $driverClass) { - if (false == $factory instanceof AmqpConnectionFactory) { - throw new \LogicException(sprintf( - 'The factory must be instance of "%s", got "%s"', - AmqpConnectionFactory::class, - get_class($factory) - )); - } - - return new RabbitMqDriver($factory->createContext(), $config, $collection); - } - if (RabbitMqStompDriver::class === $driverClass) { - if (false == $factory instanceof StompConnectionFactory) { - throw new \LogicException(sprintf( - 'The factory must be instance of "%s", got "%s"', - StompConnectionFactory::class, - get_class($factory) - )); - } - - $managementClient = StompManagementClient::create( - ltrim($dsn->getPath(), '/'), - $dsn->getHost() ?: 'localhost', - $config->getDriverOption('management_plugin_port', 15672), - (string) $dsn->getUser(), - (string) $dsn->getPassword() - ); - - return new RabbitMqStompDriver($factory->createContext(), $config, $collection, $managementClient); + return $this->createRabbitMqStompDriver($factory, $dsn, $config, $collection); } return new $driverClass($factory->createContext(), $config, $collection); @@ -111,4 +80,20 @@ private function findDriverInfo(Dsn $dsn, array $factories): ?array return null; } + + private function createRabbitMqStompDriver(ConnectionFactory $factory, Dsn $dsn, Config $config, RouteCollection $collection): RabbitMqStompDriver + { + $defaultManagementHost = $dsn->getHost() ?: $config->getTransportOption('host', 'localhost'); + $managementVast = ltrim($dsn->getPath(), '/') ?: $config->getTransportOption('vhost', '/'); + + $managementClient = StompManagementClient::create( + urldecode($managementVast), + $config->getDriverOption('rabbitmq_management_host', $defaultManagementHost), + $config->getDriverOption('rabbitmq_management_port', 15672), + (string) $dsn->getUser() ?: $config->getTransportOption('user', 'guest'), + (string) $dsn->getPassword() ?: $config->getTransportOption('pass', 'guest') + ); + + return new RabbitMqStompDriver($factory->createContext(), $config, $collection, $managementClient); + } } From dab2bc4f22e6c89d20b81cc4ea6e7ca6548047ce Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 21 Nov 2018 16:42:23 +0200 Subject: [PATCH 0442/1142] [doc] update config ref. --- docs/bundle/config_reference.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index 45d6f8218..ea015de0a 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -39,6 +39,7 @@ enqueue: client: traceable_producer: true prefix: enqueue + separator: . app_name: app router_topic: default router_queue: default @@ -46,6 +47,9 @@ enqueue: redelivered_delay_time: 0 default_queue: default + # The array contains driver specific options + driver_options: [] + # The "monitoring" option could accept a string DSN, an array with DSN key, or null. It accept extra options. To find out what option you can set, look at stats storage constructor doc block. monitoring: @@ -57,9 +61,12 @@ enqueue: # The factory service should be a class that implements "Enqueue\Monitoring\StatsStorageFactory" interface storage_factory_class: ~ - job: false async_commands: enabled: false + job: + enabled: false + async_events: + enabled: false extensions: doctrine_ping_connection_extension: false doctrine_clear_identity_map_extension: false From d999549fb8d6a99a5fa602c730769f5369cbee89 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 23 Nov 2018 09:57:36 +0200 Subject: [PATCH 0443/1142] [redis] Fix ServerException. Code should be int, not null fixes https://github.com/php-enqueue/enqueue-dev/issues/650 --- pkg/redis/PRedis.php | 12 ++++++------ pkg/redis/PhpRedis.php | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/redis/PRedis.php b/pkg/redis/PRedis.php index 045c1020c..9115e677a 100644 --- a/pkg/redis/PRedis.php +++ b/pkg/redis/PRedis.php @@ -59,7 +59,7 @@ public function eval(string $script, array $keys = [], array $args = []) // mixed eval($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) return call_user_func_array([$this->redis, 'eval'], array_merge([$script, count($keys)], $keys, $args)); } catch (PRedisServerException $e) { - throw new ServerException('eval command has failed', null, $e); + throw new ServerException('eval command has failed', 0, $e); } } @@ -68,7 +68,7 @@ public function zadd(string $key, string $value, float $score): int try { return $this->redis->zadd($key, [$value => $score]); } catch (PRedisServerException $e) { - throw new ServerException('zadd command has failed', null, $e); + throw new ServerException('zadd command has failed', 0, $e); } } @@ -77,7 +77,7 @@ public function zrem(string $key, string $value): int try { return $this->redis->zrem($key, [$value]); } catch (PRedisServerException $e) { - throw new ServerException('zrem command has failed', null, $e); + throw new ServerException('zrem command has failed', 0, $e); } } @@ -86,7 +86,7 @@ public function lpush(string $key, string $value): int try { return $this->redis->lpush($key, [$value]); } catch (PRedisServerException $e) { - throw new ServerException('lpush command has failed', null, $e); + throw new ServerException('lpush command has failed', 0, $e); } } @@ -99,7 +99,7 @@ public function brpop(array $keys, int $timeout): ?RedisResult return null; } catch (PRedisServerException $e) { - throw new ServerException('brpop command has failed', null, $e); + throw new ServerException('brpop command has failed', 0, $e); } } @@ -112,7 +112,7 @@ public function rpop(string $key): ?RedisResult return null; } catch (PRedisServerException $e) { - throw new ServerException('rpop command has failed', null, $e); + throw new ServerException('rpop command has failed', 0, $e); } } diff --git a/pkg/redis/PhpRedis.php b/pkg/redis/PhpRedis.php index bd8dd9498..241677f68 100644 --- a/pkg/redis/PhpRedis.php +++ b/pkg/redis/PhpRedis.php @@ -31,7 +31,7 @@ public function eval(string $script, array $keys = [], array $args = []) try { return $this->redis->eval($script, array_merge($keys, $args), count($keys)); } catch (\RedisException $e) { - throw new ServerException('eval command has failed', null, $e); + throw new ServerException('eval command has failed', 0, $e); } } @@ -40,7 +40,7 @@ public function zadd(string $key, string $value, float $score): int try { return $this->redis->zAdd($key, $score, $value); } catch (\RedisException $e) { - throw new ServerException('zadd command has failed', null, $e); + throw new ServerException('zadd command has failed', 0, $e); } } @@ -49,7 +49,7 @@ public function zrem(string $key, string $value): int try { return $this->redis->zRem($key, $value); } catch (\RedisException $e) { - throw new ServerException('zrem command has failed', null, $e); + throw new ServerException('zrem command has failed', 0, $e); } } @@ -58,7 +58,7 @@ public function lpush(string $key, string $value): int try { return $this->redis->lPush($key, $value); } catch (\RedisException $e) { - throw new ServerException('lpush command has failed', null, $e); + throw new ServerException('lpush command has failed', 0, $e); } } @@ -71,7 +71,7 @@ public function brpop(array $keys, int $timeout): ?RedisResult return null; } catch (\RedisException $e) { - throw new ServerException('brpop command has failed', null, $e); + throw new ServerException('brpop command has failed', 0, $e); } } @@ -84,7 +84,7 @@ public function rpop(string $key): ?RedisResult return null; } catch (\RedisException $e) { - throw new ServerException('rpop command has failed', null, $e); + throw new ServerException('rpop command has failed', 0, $e); } } From 415208cacc6f80315df6de6efe37d4db74d1b16a Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 23 Nov 2018 10:00:43 +0200 Subject: [PATCH 0444/1142] [redis][client] Add rediss scheme fixes https://github.com/php-enqueue/enqueue-dev/issues/648 --- pkg/enqueue/Client/Resources.php | 2 +- pkg/enqueue/Resources.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue/Client/Resources.php b/pkg/enqueue/Client/Resources.php index cdc803970..b88b8227b 100644 --- a/pkg/enqueue/Client/Resources.php +++ b/pkg/enqueue/Client/Resources.php @@ -81,7 +81,7 @@ public static function getKnownDrivers(): array 'packages' => ['enqueue/enqueue', 'enqueue/gps'], ]; $map[] = [ - 'schemes' => ['redis'], + 'schemes' => ['redis', 'rediss'], 'driverClass' => RedisDriver::class, 'requiredSchemeExtensions' => [], 'packages' => ['enqueue/enqueue', 'enqueue/redis'], diff --git a/pkg/enqueue/Resources.php b/pkg/enqueue/Resources.php index 508dc2694..a3d94da66 100644 --- a/pkg/enqueue/Resources.php +++ b/pkg/enqueue/Resources.php @@ -143,7 +143,7 @@ public static function getKnownConnections(): array 'package' => 'enqueue/rdkafka', ]; $map[RedisConnectionFactory::class] = [ - 'schemes' => ['redis'], + 'schemes' => ['redis', 'rediss'], 'supportedSchemeExtensions' => ['predis', 'phpredis'], 'package' => 'enqueue/redis', ]; From d942c1e027dcbba3b751dfbb1c369c602781b11d Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 23 Nov 2018 10:22:22 +0200 Subject: [PATCH 0445/1142] [dsn] allow specify special chars in user and password. fixes https://github.com/php-enqueue/enqueue-dev/issues/652 --- pkg/dsn/Dsn.php | 7 +++++++ pkg/dsn/Tests/DsnTest.php | 30 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/pkg/dsn/Dsn.php b/pkg/dsn/Dsn.php index c7bba9e0a..338ec19af 100644 --- a/pkg/dsn/Dsn.php +++ b/pkg/dsn/Dsn.php @@ -226,7 +226,14 @@ public static function parse(string $dsn): array $schemeExtensions = array_values($schemeParts); $user = parse_url(http://github.com/$dsn,%20PHP_URL_USER) ?: null; + if (is_string($user)) { + $user = rawurldecode($user); + } + $password = parse_url(http://github.com/$dsn,%20PHP_URL_PASS) ?: null; + if (is_string($password)) { + $password = rawurldecode($password); + } $path = parse_url(http://github.com/$dsn,%20PHP_URL_PATH) ?: null; if ($path) { diff --git a/pkg/dsn/Tests/DsnTest.php b/pkg/dsn/Tests/DsnTest.php index 72b97488f..0bcd7d43a 100644 --- a/pkg/dsn/Tests/DsnTest.php +++ b/pkg/dsn/Tests/DsnTest.php @@ -382,6 +382,36 @@ public function testShouldParseExpectedNumberOfMultipleDsns() $this->assertCount(3, $dsns); } + public function testShouldParseDsnWithOnlyUser() + { + $dsn = Dsn::parseFirst('foo://user@host'); + + $this->assertSame('user', $dsn->getUser()); + $this->assertNull($dsn->getPassword()); + $this->assertSame('foo', $dsn->getScheme()); + $this->assertSame('host', $dsn->getHost()); + } + + public function testShouldUrlEncodeUser() + { + $dsn = Dsn::parseFirst('foo://us%3Aer@host'); + + $this->assertSame('us:er', $dsn->getUser()); + $this->assertNull($dsn->getPassword()); + $this->assertSame('foo', $dsn->getScheme()); + $this->assertSame('host', $dsn->getHost()); + } + + public function testShouldUrlEncodePassword() + { + $dsn = Dsn::parseFirst('foo://user:pass%3Aword@host'); + + $this->assertSame('user', $dsn->getUser()); + $this->assertSame('pass:word', $dsn->getPassword()); + $this->assertSame('foo', $dsn->getScheme()); + $this->assertSame('host', $dsn->getHost()); + } + public static function provideSchemes() { yield [':', '', '', []]; From e6494e353d149b17263a4cc24ad3f997752a3cce Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 23 Nov 2018 10:22:50 +0200 Subject: [PATCH 0446/1142] [redis] allow specify password as user or password query parameter. fixes https://github.com/php-enqueue/enqueue-dev/issues/652 --- pkg/redis/RedisConnectionFactory.php | 2 +- .../RedisConnectionFactoryConfigTest.php | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/pkg/redis/RedisConnectionFactory.php b/pkg/redis/RedisConnectionFactory.php index ce56657cb..a17726ca8 100644 --- a/pkg/redis/RedisConnectionFactory.php +++ b/pkg/redis/RedisConnectionFactory.php @@ -135,7 +135,7 @@ private function parseDsn(string $dsn): array 'port' => $dsn->getPort(), 'path' => $dsn->getPath(), 'database' => $database, - 'password' => $dsn->getPassword(), + 'password' => $dsn->getPassword() ?: $dsn->getUser() ?: $dsn->getString('password'), 'async' => $dsn->getBool('async'), 'persistent' => $dsn->getBool('persistent'), 'timeout' => $dsn->getFloat('timeout'), diff --git a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php index 897d5ee18..eee32baac 100644 --- a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php +++ b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php @@ -315,6 +315,50 @@ public static function provideConfigs() ], ]; + // password as user + yield [ + 'redis://asdfqwer1234asdf@foo', + [ + 'host' => 'foo', + 'scheme' => 'redis', + 'port' => 6379, + 'timeout' => 5., + 'database' => null, + 'password' => 'asdfqwer1234asdf', + 'scheme_extensions' => [], + 'path' => null, + 'async' => false, + 'persistent' => false, + 'lazy' => true, + 'read_write_timeout' => null, + 'predis_options' => null, + 'ssl' => null, + 'redelivery_delay' => 300, + ], + ]; + + // password as query parameter + yield [ + 'redis:?password=asdfqwer1234asdf', + [ + 'host' => '127.0.0.1', + 'scheme' => 'redis', + 'port' => 6379, + 'timeout' => 5., + 'database' => null, + 'password' => 'asdfqwer1234asdf', + 'scheme_extensions' => [], + 'path' => null, + 'async' => false, + 'persistent' => false, + 'lazy' => true, + 'read_write_timeout' => null, + 'predis_options' => null, + 'ssl' => null, + 'redelivery_delay' => 300, + ], + ]; + // from predis doc yield [ From 2ebf48d90a15c75e13f69b72291976cef39b0ed8 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 23 Nov 2018 10:40:55 +0200 Subject: [PATCH 0447/1142] fix tests. --- pkg/enqueue/Tests/ResourcesTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue/Tests/ResourcesTest.php b/pkg/enqueue/Tests/ResourcesTest.php index ed36236a7..214a0836f 100644 --- a/pkg/enqueue/Tests/ResourcesTest.php +++ b/pkg/enqueue/Tests/ResourcesTest.php @@ -33,7 +33,7 @@ public function testShouldGetAvailableConnectionsInExpectedFormat() $connectionInfo = $availableConnections[RedisConnectionFactory::class]; $this->assertArrayHasKey('schemes', $connectionInfo); - $this->assertSame(['redis'], $connectionInfo['schemes']); + $this->assertSame(['redis', 'rediss'], $connectionInfo['schemes']); $this->assertArrayHasKey('supportedSchemeExtensions', $connectionInfo); $this->assertSame(['predis', 'phpredis'], $connectionInfo['supportedSchemeExtensions']); @@ -51,7 +51,7 @@ public function testShouldGetKnownConnectionsInExpectedFormat() $connectionInfo = $availableConnections[RedisConnectionFactory::class]; $this->assertArrayHasKey('schemes', $connectionInfo); - $this->assertSame(['redis'], $connectionInfo['schemes']); + $this->assertSame(['redis', 'rediss'], $connectionInfo['schemes']); $this->assertArrayHasKey('supportedSchemeExtensions', $connectionInfo); $this->assertSame(['predis', 'phpredis'], $connectionInfo['supportedSchemeExtensions']); From a76a9b8156cb8acedba8522d2e66e7e81669a338 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Sat, 24 Nov 2018 20:49:07 +0200 Subject: [PATCH 0448/1142] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2de729078..0fb847f2c 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Features: * [Quick tour](docs/quick_tour.md) * [Documentation](docs/index.md) * [Blog](docs/index.md#blogs) -* [Questions](https://gitter.im/php-enqueue/Lobby) +* [Chat\Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro From 2c192e8d1265c244bb867bdc0906f6100f97bb8a Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 26 Nov 2018 11:52:30 +0200 Subject: [PATCH 0449/1142] [amqp][lib] Improve heartbeat handling. Introduce heartbeat on tick. --- pkg/amqp-lib/AmqpConnectionFactory.php | 1 + pkg/amqp-lib/AmqpContext.php | 2 +- pkg/amqp-lib/AmqpSubscriptionConsumer.php | 16 +++++++++++++++- pkg/amqp-lib/Tests/AmqpContextTest.php | 2 +- .../Tests/AmqpSubscriptionConsumerTest.php | 4 ++-- pkg/amqp-lib/composer.json | 2 +- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/pkg/amqp-lib/AmqpConnectionFactory.php b/pkg/amqp-lib/AmqpConnectionFactory.php index 6f3323a9f..169671d12 100644 --- a/pkg/amqp-lib/AmqpConnectionFactory.php +++ b/pkg/amqp-lib/AmqpConnectionFactory.php @@ -47,6 +47,7 @@ public function __construct($config = 'amqp:') ->addDefaultOption('login_response', null) ->addDefaultOption('locale', 'en_US') ->addDefaultOption('keepalive', false) + ->addDefaultOption('heartbeat_on_tick', true) ->parse() ; diff --git a/pkg/amqp-lib/AmqpContext.php b/pkg/amqp-lib/AmqpContext.php index b88b29b2a..83167c3db 100644 --- a/pkg/amqp-lib/AmqpContext.php +++ b/pkg/amqp-lib/AmqpContext.php @@ -110,7 +110,7 @@ public function createConsumer(Destination $destination): Consumer */ public function createSubscriptionConsumer(): SubscriptionConsumer { - return new AmqpSubscriptionConsumer($this); + return new AmqpSubscriptionConsumer($this, (bool) $this->config['heartbeat_on_tick']); } /** diff --git a/pkg/amqp-lib/AmqpSubscriptionConsumer.php b/pkg/amqp-lib/AmqpSubscriptionConsumer.php index 541d37fd7..2937a23d9 100644 --- a/pkg/amqp-lib/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-lib/AmqpSubscriptionConsumer.php @@ -27,9 +27,15 @@ class AmqpSubscriptionConsumer implements InteropAmqpSubscriptionConsumer */ private $subscribers; - public function __construct(AmqpContext $context) + /** + * @var bool + */ + private $heartbeatOnTick; + + public function __construct(AmqpContext $context, bool $heartbeatOnTick) { $this->context = $context; + $this->heartbeatOnTick = $heartbeatOnTick; } public function consume(int $timeout = 0): void @@ -41,6 +47,12 @@ public function consume(int $timeout = 0): void $signalHandler = new SignalSocketHelper(); $signalHandler->beforeSocket(); + $heartbeatOnTick = function (AmqpContext $context) { + $context->getLibChannel()->getConnection()->getIO()->check_heartbeat(); + }; + + $this->heartbeatOnTick && register_tick_function($heartbeatOnTick); + try { while (true) { $start = microtime(true); @@ -69,6 +81,8 @@ public function consume(int $timeout = 0): void throw $e; } finally { $signalHandler->afterSocket(); + + $this->heartbeatOnTick && unregister_tick_function($heartbeatOnTick); } } diff --git a/pkg/amqp-lib/Tests/AmqpContextTest.php b/pkg/amqp-lib/Tests/AmqpContextTest.php index b4e75241d..1fd8d8853 100644 --- a/pkg/amqp-lib/Tests/AmqpContextTest.php +++ b/pkg/amqp-lib/Tests/AmqpContextTest.php @@ -344,7 +344,7 @@ public function testShouldSetQos() public function testShouldReturnExpectedSubscriptionConsumerInstance() { - $context = new AmqpContext($this->createConnectionMock(), []); + $context = new AmqpContext($this->createConnectionMock(), ['heartbeat_on_tick' => true]); $this->assertInstanceOf(AmqpSubscriptionConsumer::class, $context->createSubscriptionConsumer()); } diff --git a/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php index 4e24cbdd5..028d3067e 100644 --- a/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php @@ -16,9 +16,9 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } - public function testCouldBeConstructedWithAmqpContextAsFirstArgument() + public function testCouldBeConstructedWithAmqpContextAndHeartbeatOnTickAsArguments() { - new AmqpSubscriptionConsumer($this->createAmqpContextMock()); + new AmqpSubscriptionConsumer($this->createAmqpContextMock(), $heartbeatOnTick = true); } /** diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 17b145a03..eb4848248 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "php-amqplib/php-amqplib": "^2.7", + "php-amqplib/php-amqplib": "^2.8", "queue-interop/amqp-interop": "^0.8", "enqueue/amqp-tools": "0.9.x-dev" }, From 83fd8cc44890834652c2f30ce4f6a05c0f888057 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 26 Nov 2018 12:08:36 +0200 Subject: [PATCH 0450/1142] [amqp] pass context to tick callback. --- pkg/amqp-lib/AmqpSubscriptionConsumer.php | 2 +- ...riptionConsumerWithHeartbeatOnTickTest.php | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 pkg/amqp-lib/Tests/Functional/AmqpSubscriptionConsumerWithHeartbeatOnTickTest.php diff --git a/pkg/amqp-lib/AmqpSubscriptionConsumer.php b/pkg/amqp-lib/AmqpSubscriptionConsumer.php index 2937a23d9..694c134dc 100644 --- a/pkg/amqp-lib/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-lib/AmqpSubscriptionConsumer.php @@ -51,7 +51,7 @@ public function consume(int $timeout = 0): void $context->getLibChannel()->getConnection()->getIO()->check_heartbeat(); }; - $this->heartbeatOnTick && register_tick_function($heartbeatOnTick); + $this->heartbeatOnTick && register_tick_function($heartbeatOnTick, $this->context); try { while (true) { diff --git a/pkg/amqp-lib/Tests/Functional/AmqpSubscriptionConsumerWithHeartbeatOnTickTest.php b/pkg/amqp-lib/Tests/Functional/AmqpSubscriptionConsumerWithHeartbeatOnTickTest.php new file mode 100644 index 000000000..aea380d17 --- /dev/null +++ b/pkg/amqp-lib/Tests/Functional/AmqpSubscriptionConsumerWithHeartbeatOnTickTest.php @@ -0,0 +1,83 @@ +context) { + $this->context->close(); + } + + parent::tearDown(); + } + + public function test() + { + $this->context = $context = $this->createContext(); + + $fooQueue = $this->createQueue($context, 'foo_subscription_consumer_consume_from_all_subscribed_queues_spec'); + + $expectedFooBody = 'fooBody'; + + $context->createProducer()->send($fooQueue, $context->createMessage($expectedFooBody)); + + $fooConsumer = $context->createConsumer($fooQueue); + + $actualBodies = []; + $actualQueues = []; + $callback = function (Message $message, Consumer $consumer) use (&$actualBodies, &$actualQueues) { + declare(ticks=1) { + $actualBodies[] = $message->getBody(); + $actualQueues[] = $consumer->getQueue()->getQueueName(); + + $consumer->acknowledge($message); + + return true; + } + }; + + $subscriptionConsumer = $context->createSubscriptionConsumer(); + $subscriptionConsumer->subscribe($fooConsumer, $callback); + + $subscriptionConsumer->consume(1000); + + $this->assertCount(1, $actualBodies); + } + + protected function createContext(): AmqpContext + { + $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); + + $context = $factory->createContext(); + $context->setQos(0, 5, false); + + return $context; + } + + protected function createQueue(AmqpContext $context, string $queueName): AmqpQueue + { + $queue = $context->createQueue($queueName); + $context->declareQueue($queue); + $context->purgeQueue($queue); + + return $queue; + } +} From 46106a2ecb9289850a89cd2dfcd99287f1482a80 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 26 Nov 2018 15:36:04 +0200 Subject: [PATCH 0451/1142] [docs][skip ci] Update amqp and redis doc. --- docs/transport/amqp_lib.md | 70 ++++++++++++++++++++++++++++++++++++++ docs/transport/redis.md | 12 ++++++- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/docs/transport/amqp_lib.md b/docs/transport/amqp_lib.md index 13c27c6e1..2d8e03866 100644 --- a/docs/transport/amqp_lib.md +++ b/docs/transport/amqp_lib.md @@ -12,6 +12,15 @@ Enqueue is an MIT-licensed open source project with its ongoing development made Implements [AMQP specifications](https://www.rabbitmq.com/specification.html) and implements [amqp interop](https://github.com/queue-interop/amqp-interop) interfaces. Build on top of [php amqp lib](https://github.com/php-amqplib/php-amqplib). +Features: +* Configure with DSN string +* Delay strategies out of the box +* Interchangeable with other AMQP Interop implementations +* Fixes AMQPIOWaitException when signal is sent. +* More reliable heartbeat implementations. +* Supports Subscription consumer + +Parts: * [Installation](#installation) * [Create context](#create-context) * [Declare topic](#declare-topic) @@ -25,6 +34,7 @@ Build on top of [php amqp lib](https://github.com/php-amqplib/php-amqplib). * [Consume message](#consume-message) * [Subscription consumer](#subscription-consumer) * [Purge queue messages](#purge-queue-messages) +* [Long running task, heartbeat, timeouts](#long-running-task,-heartbeat,-timeouts) ## Installation @@ -275,4 +285,64 @@ $queue = $context->createQueue('aQueue'); $context->purgeQueue($queue); ``` +## Long running task, heartbeat, timeouts + +AMQP relies on heartbeat feature to make sure consumer is still there. +Basically consumer is expected to send heartbeat frames from time to time to RabbitMQ broker. +It is not possible to implement heartbeat feature in PHP, due to its synchronous nature. +You could read more about the issues in post: [Keeping RabbitMQ connections alive in PHP](https://blog.mollie.com/keeping-rabbitmq-connections-alive-in-php-b11cb657d5fb). + +`enqueue/amqp-lib` address the issue by registering heartbeat call as a [tick callbacks](http://php.net/manual/en/function.register-tick-function.php). +To make it work you have to wrapp your long running task by `decalre(ticks=1) {}`. +The number of ticks could be adjusted to your needs. +Calling it at every tick is not good. + +Please note that it does not fix heartbeat issue if you spent most of the time on IO operation. + +Example: + +```php +createContext(); + +$queue = $context->createQueue('a_queue'); +$consumer = $context->createConsumer($queue); + +$subscriptionConsumer = $context->createSubscriptionConsumer(); +$subscriptionConsumer->subscribe($consumer, function(AmqpMessage $message, AmqpConsumer $consumer) { + // ticks number should be adjusted. + declare(ticks=1) { + foreach (fetchHugeSet() as $item) { + // cycle does something for a long time, much longer than amqp heartbeat. + } + } + + $consumer->acknowledge($message); + + return true; +}); + +$subscriptionConsumer->consume(10000); + + +function fetchHugeSet(): array {}; +``` + +Fixes partly `Invalid frame type 65` issue. + +``` +Error: Uncaught PhpAmqpLib\Exception\AMQPRuntimeException: Invalid frame type 65 in /some/path/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Connection/AbstractConnection.php:528 +``` + +Fixes partly `Broken pipe or closed connection` issue. + +``` +PHP Fatal error: Uncaught exception 'PhpAmqpLib\Exception\AMQPRuntimeException' with message 'Broken pipe or closed connection' in /some/path/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php:190 +``` + [back to index](../index.md) \ No newline at end of file diff --git a/docs/transport/redis.md b/docs/transport/redis.md index 2621b562c..f4c84e29a 100644 --- a/docs/transport/redis.md +++ b/docs/transport/redis.md @@ -12,8 +12,18 @@ Enqueue is an MIT-licensed open source project with its ongoing development made The transport uses [Redis](https://redis.io/) as a message broker. It creates a collection (a queue or topic) there. Pushes messages to the tail of the collection and pops from the head. The transport works with [phpredis](https://github.com/phpredis/phpredis) php extension or [predis](https://github.com/nrk/predis) library. -Make sure you installed either of them +Make sure you installed either of them + +Features: +* Configure with DSN string +* Delay strategies out of the box +* Recovery&Redelivery support +* Expiration support +* Delaying support +* Interchangeable with other Queue Interop implementations +* Supports Subscription consumer +Parts: * [Installation](#installation) * [Create context](#create-context) * [Send message to topic](#send-message-to-topic) From c4073e614a5f518d6d40cde815e9d808da148412 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 26 Nov 2018 15:38:38 +0200 Subject: [PATCH 0452/1142] [skip ci] fix doc --- docs/transport/amqp_lib.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/transport/amqp_lib.md b/docs/transport/amqp_lib.md index 2d8e03866..cd0f7e9e1 100644 --- a/docs/transport/amqp_lib.md +++ b/docs/transport/amqp_lib.md @@ -34,7 +34,7 @@ Parts: * [Consume message](#consume-message) * [Subscription consumer](#subscription-consumer) * [Purge queue messages](#purge-queue-messages) -* [Long running task, heartbeat, timeouts](#long-running-task,-heartbeat,-timeouts) +* [Long running task and heartbeat and timeouts](#long-running-task-and-heartbeat-and-timeouts) ## Installation @@ -285,10 +285,10 @@ $queue = $context->createQueue('aQueue'); $context->purgeQueue($queue); ``` -## Long running task, heartbeat, timeouts +## Long running task and heartbeat and timeouts AMQP relies on heartbeat feature to make sure consumer is still there. -Basically consumer is expected to send heartbeat frames from time to time to RabbitMQ broker. +Basically consumer is expected to send heartbeat frames from time to time to RabbitMQ broker so the broker does not close the connection. It is not possible to implement heartbeat feature in PHP, due to its synchronous nature. You could read more about the issues in post: [Keeping RabbitMQ connections alive in PHP](https://blog.mollie.com/keeping-rabbitmq-connections-alive-in-php-b11cb657d5fb). From 6c07702ce7f6d55e3774be9705b5406cfaacb8e6 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 27 Nov 2018 10:55:21 +0200 Subject: [PATCH 0453/1142] removed issues that have nothing to do with 0.8.x version. --- CHANGELOG.md | 40 ++++++---------------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dc423155..2eca09fb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,31 +1,14 @@ # Change Log +## [0.8.42](https://github.com/php-enqueue/enqueue-dev/tree/0.8.42) (2018-11-22) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.41...0.8.42) + +- Gitattributes backporting [\#654](https://github.com/php-enqueue/enqueue-dev/pull/654) ([webmake](https://github.com/webmake)) +- Fix ping to check each connection, not only first one [\#651](https://github.com/php-enqueue/enqueue-dev/pull/651) ([webmake](https://github.com/webmake)) + ## [0.8.41](https://github.com/php-enqueue/enqueue-dev/tree/0.8.41) (2018-11-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.40...0.8.41) -- \[dbal\] consumption improvements. [\#605](https://github.com/php-enqueue/enqueue-dev/issues/605) -- Make new RouterProcessor backward compatible. [\#598](https://github.com/php-enqueue/enqueue-dev/issues/598) -- profiler and data collector should support multiple clients. [\#594](https://github.com/php-enqueue/enqueue-dev/issues/594) -- \[bundle\]\[client\] Add ability to configure multiple clients. [\#592](https://github.com/php-enqueue/enqueue-dev/issues/592) -- \[gearman\]\[travis\] Build and cache gearman extension. [\#511](https://github.com/php-enqueue/enqueue-dev/issues/511) -- \[consumption\] Do not overwrite signal handlers set before SignalExtension [\#318](https://github.com/php-enqueue/enqueue-dev/issues/318) -- \[Symfony\] add support to transfer tokenStorage \(user info\) to the worker [\#69](https://github.com/php-enqueue/enqueue-dev/issues/69) - -- Fix AMQP tests [\#614](https://github.com/php-enqueue/enqueue-dev/issues/614) -- Enqueue/FS does not use latest Parse DSN class [\#610](https://github.com/php-enqueue/enqueue-dev/issues/610) -- Async commands queue setup error [\#608](https://github.com/php-enqueue/enqueue-dev/issues/608) -- \[FS\] Maximum function nesting level of '256' reached [\#327](https://github.com/php-enqueue/enqueue-dev/issues/327) - -- \[dbal\] consumer should still work if table is truncated [\#638](https://github.com/php-enqueue/enqueue-dev/issues/638) -- \[redis\] LogicException on set priority [\#635](https://github.com/php-enqueue/enqueue-dev/issues/635) -- Elastica populate with AWS SQS [\#629](https://github.com/php-enqueue/enqueue-dev/issues/629) -- SQS and fallback subscription consumer [\#625](https://github.com/php-enqueue/enqueue-dev/issues/625) -- \[dsn\] Add multi hosts parsing. [\#624](https://github.com/php-enqueue/enqueue-dev/issues/624) -- \[Symfony\] Try to check private service existence from container [\#621](https://github.com/php-enqueue/enqueue-dev/issues/621) -- Configuration with Amazon SQS and Symfony [\#619](https://github.com/php-enqueue/enqueue-dev/issues/619) -- \[redis\] Do not force phpredis [\#551](https://github.com/php-enqueue/enqueue-dev/issues/551) - -- Fixed headline [\#631](https://github.com/php-enqueue/enqueue-dev/pull/631) ([OskarStark](https://github.com/OskarStark)) - Compatibility with 0.9x [\#615](https://github.com/php-enqueue/enqueue-dev/pull/615) ([ASKozienko](https://github.com/ASKozienko)) - Fix Tests 0.8x [\#609](https://github.com/php-enqueue/enqueue-dev/pull/609) ([ASKozienko](https://github.com/ASKozienko)) - Add support for the 'ciphers' ssl option [\#607](https://github.com/php-enqueue/enqueue-dev/pull/607) ([eperazzo](https://github.com/eperazzo)) @@ -35,26 +18,16 @@ ## [0.8.40](https://github.com/php-enqueue/enqueue-dev/tree/0.8.40) (2018-10-22) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.39...0.8.40) -- \[redis\] support for delay [\#553](https://github.com/php-enqueue/enqueue-dev/issues/553) - - \[rdkafka\] Backport changes to topic subscription [\#575](https://github.com/php-enqueue/enqueue-dev/pull/575) ([Steveb-p](https://github.com/Steveb-p)) ## [0.8.39](https://github.com/php-enqueue/enqueue-dev/tree/0.8.39) (2018-10-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.38...0.8.39) -- Consuming with Simple Client and Kafka [\#557](https://github.com/php-enqueue/enqueue-dev/issues/557) - - Merge pull request \#552 from versh23/stomp-public [\#568](https://github.com/php-enqueue/enqueue-dev/pull/568) ([versh23](https://github.com/versh23)) ## [0.8.38](https://github.com/php-enqueue/enqueue-dev/tree/0.8.38) (2018-10-16) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.37...0.8.38) -- Support rabbitmq-cli-consumer [\#546](https://github.com/php-enqueue/enqueue-dev/issues/546) -- Add ability to choose transport\context to be used in consume command [\#312](https://github.com/php-enqueue/enqueue-dev/issues/312) - -- \[Symfony\] sendCommand / sendEvent for delayed message have different behaviour [\#523](https://github.com/php-enqueue/enqueue-dev/issues/523) -- \[bundle\] The bundle does not work correctly with env parameters set as tag attr. [\#28](https://github.com/php-enqueue/enqueue-dev/issues/28) - - Stomp heartbeat [\#549](https://github.com/php-enqueue/enqueue-dev/issues/549) - \[Elastica\]Slow processing [\#537](https://github.com/php-enqueue/enqueue-dev/issues/537) - \[consumption\] Some improvements [\#323](https://github.com/php-enqueue/enqueue-dev/issues/323) @@ -105,7 +78,6 @@ - Adding a signal handler to the consumer [\#485](https://github.com/php-enqueue/enqueue-dev/issues/485) - Problem with SQS DSN string with + in secret [\#481](https://github.com/php-enqueue/enqueue-dev/issues/481) -- Monitoring interface [\#476](https://github.com/php-enqueue/enqueue-dev/issues/476) ## [0.8.33](https://github.com/php-enqueue/enqueue-dev/tree/0.8.33) (2018-07-26) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.32...0.8.33) From d560407e453089d0e96e9710c1508ce16030cfeb Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 27 Nov 2018 14:28:19 +0200 Subject: [PATCH 0454/1142] Release 0.9.0 --- CHANGELOG.md | 715 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 526 insertions(+), 189 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2eca09fb8..8f7a8bd54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,36 +1,139 @@ # Change Log +## [0.9.0](https://github.com/php-enqueue/enqueue-dev/tree/0.9) (2018-11-27) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.42...0.9) + +**Merged pull requests:** + +- \[amqp\]\[lib\] Improve heartbeat handling. Introduce heartbeat on tick. Fixes "Invalid frame type 65" and "Broken pipe or closed connection" [\#658](https://github.com/php-enqueue/enqueue-dev/pull/658) ([makasim](https://github.com/makasim)) +- Redis dsn and password fixes [\#656](https://github.com/php-enqueue/enqueue-dev/pull/656) ([makasim](https://github.com/makasim)) +- Fix ping to check each connection, not only first one [\#651](https://github.com/php-enqueue/enqueue-dev/pull/651) ([webmake](https://github.com/webmake)) +- Rework DriverFactory, add separator option to Client Config. [\#646](https://github.com/php-enqueue/enqueue-dev/pull/646) ([makasim](https://github.com/makasim)) +- \[dsn\] Parse DSN Cluster [\#643](https://github.com/php-enqueue/enqueue-dev/pull/643) ([makasim](https://github.com/makasim)) +- \[dbal\] Use RetryableException, wrap fetchMessage exception to it too. [\#642](https://github.com/php-enqueue/enqueue-dev/pull/642) ([makasim](https://github.com/makasim)) +- \[bundle\] Add BC for topic\command subscribers. [\#641](https://github.com/php-enqueue/enqueue-dev/pull/641) ([makasim](https://github.com/makasim)) +- \[dbal\] handle gracefully concurrency issues or 3rd party interruptions. [\#640](https://github.com/php-enqueue/enqueue-dev/pull/640) ([makasim](https://github.com/makasim)) +- Fix compiler pass [\#639](https://github.com/php-enqueue/enqueue-dev/pull/639) ([ASKozienko](https://github.com/ASKozienko)) +- Fix wrong exceptions in transports [\#637](https://github.com/php-enqueue/enqueue-dev/pull/637) ([FrankGiesecke](https://github.com/FrankGiesecke)) +- Enable job-queue for default configuration [\#636](https://github.com/php-enqueue/enqueue-dev/pull/636) ([ASKozienko](https://github.com/ASKozienko)) +- better readability [\#632](https://github.com/php-enqueue/enqueue-dev/pull/632) ([OskarStark](https://github.com/OskarStark)) +- Fixed headline [\#631](https://github.com/php-enqueue/enqueue-dev/pull/631) ([OskarStark](https://github.com/OskarStark)) +- \[bundle\] Multi Client Configuration [\#628](https://github.com/php-enqueue/enqueue-dev/pull/628) ([ASKozienko](https://github.com/ASKozienko)) +- removed some dots [\#627](https://github.com/php-enqueue/enqueue-dev/pull/627) ([OskarStark](https://github.com/OskarStark)) +- Avoid receiveNoWait when only one subscriber [\#626](https://github.com/php-enqueue/enqueue-dev/pull/626) ([deguif](https://github.com/deguif)) +- Add context services to locator [\#623](https://github.com/php-enqueue/enqueue-dev/pull/623) ([Gnucki](https://github.com/Gnucki)) +- \[doc\]\[skip ci\] Add sponsoring section. [\#618](https://github.com/php-enqueue/enqueue-dev/pull/618) ([makasim](https://github.com/makasim)) +- Merge 0.8x -\> 0.9x [\#617](https://github.com/php-enqueue/enqueue-dev/pull/617) ([ASKozienko](https://github.com/ASKozienko)) +- Compatibility with 0.8x [\#616](https://github.com/php-enqueue/enqueue-dev/pull/616) ([ASKozienko](https://github.com/ASKozienko)) +- \[dbal\] Use concurrent fetch message approach \(no transaction, no pessimistic lock\) [\#613](https://github.com/php-enqueue/enqueue-dev/pull/613) ([makasim](https://github.com/makasim)) +- \[fs\] Use enqueue/dsn to parse DSN [\#612](https://github.com/php-enqueue/enqueue-dev/pull/612) ([makasim](https://github.com/makasim)) +- \[client\]\[bundle\] Take queue prefix into account while queue binding. [\#611](https://github.com/php-enqueue/enqueue-dev/pull/611) ([makasim](https://github.com/makasim)) +- Add support for the 'ciphers' ssl option [\#607](https://github.com/php-enqueue/enqueue-dev/pull/607) ([eperazzo](https://github.com/eperazzo)) +- Queue monitoring. [\#606](https://github.com/php-enqueue/enqueue-dev/pull/606) ([ASKozienko](https://github.com/ASKozienko)) +- Fix comment about queue deletion [\#604](https://github.com/php-enqueue/enqueue-dev/pull/604) ([a-ast](https://github.com/a-ast)) +- \[docs\] Fixed docs. Removed prefix Psr. [\#603](https://github.com/php-enqueue/enqueue-dev/pull/603) ([yurez](https://github.com/yurez)) +- fix wamp [\#597](https://github.com/php-enqueue/enqueue-dev/pull/597) ([ASKozienko](https://github.com/ASKozienko)) +- \[doc\]\[skip ci\] Add supporting section [\#595](https://github.com/php-enqueue/enqueue-dev/pull/595) ([makasim](https://github.com/makasim)) +- Do not export non source files [\#588](https://github.com/php-enqueue/enqueue-dev/pull/588) ([webmake](https://github.com/webmake)) +- Redis New Implementation [\#585](https://github.com/php-enqueue/enqueue-dev/pull/585) ([ASKozienko](https://github.com/ASKozienko)) +- Fix Redis Tests [\#582](https://github.com/php-enqueue/enqueue-dev/pull/582) ([ASKozienko](https://github.com/ASKozienko)) +- \[dbal\] Introduce redelivery support based on visibility approach. [\#581](https://github.com/php-enqueue/enqueue-dev/pull/581) ([rosamarsky](https://github.com/rosamarsky)) +- fix redis tests [\#578](https://github.com/php-enqueue/enqueue-dev/pull/578) ([ASKozienko](https://github.com/ASKozienko)) +- \[client\] Make symfony compiler passes multi client [\#577](https://github.com/php-enqueue/enqueue-dev/pull/577) ([makasim](https://github.com/makasim)) +- Removed predis from composer.json [\#576](https://github.com/php-enqueue/enqueue-dev/pull/576) ([rosamarsky](https://github.com/rosamarsky)) +- Added index for queue field in the enqueue collection [\#574](https://github.com/php-enqueue/enqueue-dev/pull/574) ([rosamarsky](https://github.com/rosamarsky)) +- WAMP [\#573](https://github.com/php-enqueue/enqueue-dev/pull/573) ([ASKozienko](https://github.com/ASKozienko)) +- Bundle multi transport configuration [\#572](https://github.com/php-enqueue/enqueue-dev/pull/572) ([makasim](https://github.com/makasim)) +- \[client\] Move client config to the factory. [\#571](https://github.com/php-enqueue/enqueue-dev/pull/571) ([makasim](https://github.com/makasim)) +- Update quick\_tour.md [\#569](https://github.com/php-enqueue/enqueue-dev/pull/569) ([luceos](https://github.com/luceos)) +- \[rdkafka\] Use default queue as router topic [\#567](https://github.com/php-enqueue/enqueue-dev/pull/567) ([rosamarsky](https://github.com/rosamarsky)) +- Fixing composer.json to require enqueue/dsn [\#566](https://github.com/php-enqueue/enqueue-dev/pull/566) ([adumas37](https://github.com/adumas37)) +- MongoDB Subscription Consumer feature [\#565](https://github.com/php-enqueue/enqueue-dev/pull/565) ([rosamarsky](https://github.com/rosamarsky)) +- Remove deprecated testcase implementation [\#564](https://github.com/php-enqueue/enqueue-dev/pull/564) ([samnela](https://github.com/samnela)) +- Dbal Subscription Consumer feature [\#563](https://github.com/php-enqueue/enqueue-dev/pull/563) ([rosamarsky](https://github.com/rosamarsky)) +- \[client\] Move services definition to ClientFactory. [\#556](https://github.com/php-enqueue/enqueue-dev/pull/556) ([makasim](https://github.com/makasim)) +- Fixed exception message in testThrowErrorIfServiceDoesNotImplementProcessorReturnType [\#559](https://github.com/php-enqueue/enqueue-dev/pull/559) ([rosamarsky](https://github.com/rosamarsky)) +- Update supported\_brokers.md [\#558](https://github.com/php-enqueue/enqueue-dev/pull/558) ([edgji](https://github.com/edgji)) +- \[consumption\] Logging improvements [\#555](https://github.com/php-enqueue/enqueue-dev/pull/555) ([makasim](https://github.com/makasim)) +- \[consumption\] Rework QueueConsumer extension points. [\#554](https://github.com/php-enqueue/enqueue-dev/pull/554) ([makasim](https://github.com/makasim)) +- \[STOMP\] make getStomp public [\#552](https://github.com/php-enqueue/enqueue-dev/pull/552) ([versh23](https://github.com/versh23)) +- \[consumption\] Add ability to consume from multiple transports. [\#548](https://github.com/php-enqueue/enqueue-dev/pull/548) ([makasim](https://github.com/makasim)) +- \[client\] Rename config options. [\#547](https://github.com/php-enqueue/enqueue-dev/pull/547) ([makasim](https://github.com/makasim)) +- Remove config parameters [\#545](https://github.com/php-enqueue/enqueue-dev/pull/545) ([makasim](https://github.com/makasim)) +- Remove transport factories [\#544](https://github.com/php-enqueue/enqueue-dev/pull/544) ([makasim](https://github.com/makasim)) +- Remove psr prefix [\#543](https://github.com/php-enqueue/enqueue-dev/pull/543) ([makasim](https://github.com/makasim)) +- \[amqp\] Set delay strategy if rabbitmq scheme extension present. [\#536](https://github.com/php-enqueue/enqueue-dev/pull/536) ([makasim](https://github.com/makasim)) +- \[client\] Add type hints to driver interface and its implementations. [\#535](https://github.com/php-enqueue/enqueue-dev/pull/535) ([makasim](https://github.com/makasim)) +- \[client\] Introduce routes. Foundation for multi transport support. [\#534](https://github.com/php-enqueue/enqueue-dev/pull/534) ([makasim](https://github.com/makasim)) +- \[gps\] enhance connection configuration. [\#531](https://github.com/php-enqueue/enqueue-dev/pull/531) ([makasim](https://github.com/makasim)) +- \[sqs\] Configuration enhancements [\#530](https://github.com/php-enqueue/enqueue-dev/pull/530) ([makasim](https://github.com/makasim)) +- \[redis\] Improve redis config, use enqueue/dsn [\#528](https://github.com/php-enqueue/enqueue-dev/pull/528) ([makasim](https://github.com/makasim)) +- \[dsn\] Add typed methods for query parameters. [\#527](https://github.com/php-enqueue/enqueue-dev/pull/527) ([makasim](https://github.com/makasim)) +- \[redis\] Revert timeout change. [\#526](https://github.com/php-enqueue/enqueue-dev/pull/526) ([makasim](https://github.com/makasim)) +- \[Redis\] Add support of secure\TLS connections \(based on PR 515\) [\#524](https://github.com/php-enqueue/enqueue-dev/pull/524) ([makasim](https://github.com/makasim)) +- Simplify Enqueue configuration. [\#522](https://github.com/php-enqueue/enqueue-dev/pull/522) ([makasim](https://github.com/makasim)) +- \[client\] Add typehints to producer interface, its implementations [\#521](https://github.com/php-enqueue/enqueue-dev/pull/521) ([makasim](https://github.com/makasim)) +- \[client\] Improve client extension. [\#517](https://github.com/php-enqueue/enqueue-dev/pull/517) ([makasim](https://github.com/makasim)) +- Add declare strict [\#516](https://github.com/php-enqueue/enqueue-dev/pull/516) ([makasim](https://github.com/makasim)) +- PHP 7.1+. Queue Interop typed interfaces. [\#512](https://github.com/php-enqueue/enqueue-dev/pull/512) ([makasim](https://github.com/makasim)) +- \[Symfony\] default factory should resolve DSN in runtime [\#510](https://github.com/php-enqueue/enqueue-dev/pull/510) ([makasim](https://github.com/makasim)) +- Fixed password auth for predis [\#509](https://github.com/php-enqueue/enqueue-dev/pull/509) ([Toflar](https://github.com/Toflar)) +- Allow either subscribe or assign in RdKafkaConsumer [\#508](https://github.com/php-enqueue/enqueue-dev/pull/508) ([Engerim](https://github.com/Engerim)) +- Remove deprecated in 0.8 code [\#507](https://github.com/php-enqueue/enqueue-dev/pull/507) ([makasim](https://github.com/makasim)) +- Run tests on rabbitmq 3.7 [\#506](https://github.com/php-enqueue/enqueue-dev/pull/506) ([makasim](https://github.com/makasim)) +- Symfony add default command name [\#505](https://github.com/php-enqueue/enqueue-dev/pull/505) ([makasim](https://github.com/makasim)) +- \[Consumption\] Add QueueConsumerInterface, make QueueConsumer final. [\#504](https://github.com/php-enqueue/enqueue-dev/pull/504) ([makasim](https://github.com/makasim)) +- Redis subscription consumer [\#503](https://github.com/php-enqueue/enqueue-dev/pull/503) ([makasim](https://github.com/makasim)) +- Remove support of old Symfony versions. [\#502](https://github.com/php-enqueue/enqueue-dev/pull/502) ([makasim](https://github.com/makasim)) +- \[BC break\]\[dbal\] Convert between Message::$expire and DbalMessage::$timeToLive [\#501](https://github.com/php-enqueue/enqueue-dev/pull/501) ([makasim](https://github.com/makasim)) +- \[BC break\]\[dbal\] Change columns type from int to bigint. [\#500](https://github.com/php-enqueue/enqueue-dev/pull/500) ([makasim](https://github.com/makasim)) +- \[BC break\]\[dbal\] Fix time conversion in DbalDriver. [\#499](https://github.com/php-enqueue/enqueue-dev/pull/499) ([makasim](https://github.com/makasim)) +- \[BC break\]\[dbal\] Add index, fix performance issue. [\#498](https://github.com/php-enqueue/enqueue-dev/pull/498) ([makasim](https://github.com/makasim)) +- \[redis\] Authentication support added [\#497](https://github.com/php-enqueue/enqueue-dev/pull/497) ([makasim](https://github.com/makasim)) +- add subscription consumer specs to amqp pkgs [\#495](https://github.com/php-enqueue/enqueue-dev/pull/495) ([makasim](https://github.com/makasim)) +- add contribution to subtree split message [\#494](https://github.com/php-enqueue/enqueue-dev/pull/494) ([makasim](https://github.com/makasim)) +- Get rid of path repository [\#493](https://github.com/php-enqueue/enqueue-dev/pull/493) ([makasim](https://github.com/makasim)) +- Move subscription related logic to SubscriptionConsumer class. [\#492](https://github.com/php-enqueue/enqueue-dev/pull/492) ([makasim](https://github.com/makasim)) +- remove bc layer. [\#489](https://github.com/php-enqueue/enqueue-dev/pull/489) ([makasim](https://github.com/makasim)) +- Job Queue: Throw orphan job exception when child job cleanup fails. [\#496](https://github.com/php-enqueue/enqueue-dev/pull/496) ([garrettrayj](https://github.com/garrettrayj)) +- \[bundle\] Fix panel rendering when message body is an object [\#442](https://github.com/php-enqueue/enqueue-dev/pull/442) ([thePanz](https://github.com/thePanz)) +- \[symfony\] Async commands [\#403](https://github.com/php-enqueue/enqueue-dev/pull/403) ([makasim](https://github.com/makasim)) + ## [0.8.42](https://github.com/php-enqueue/enqueue-dev/tree/0.8.42) (2018-11-22) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.41...0.8.42) +**Merged pull requests:** + - Gitattributes backporting [\#654](https://github.com/php-enqueue/enqueue-dev/pull/654) ([webmake](https://github.com/webmake)) -- Fix ping to check each connection, not only first one [\#651](https://github.com/php-enqueue/enqueue-dev/pull/651) ([webmake](https://github.com/webmake)) ## [0.8.41](https://github.com/php-enqueue/enqueue-dev/tree/0.8.41) (2018-11-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.40...0.8.41) +**Merged pull requests:** + - Compatibility with 0.9x [\#615](https://github.com/php-enqueue/enqueue-dev/pull/615) ([ASKozienko](https://github.com/ASKozienko)) - Fix Tests 0.8x [\#609](https://github.com/php-enqueue/enqueue-dev/pull/609) ([ASKozienko](https://github.com/ASKozienko)) -- Add support for the 'ciphers' ssl option [\#607](https://github.com/php-enqueue/enqueue-dev/pull/607) ([eperazzo](https://github.com/eperazzo)) - Allow JobStorage to reset the EntityManager [\#586](https://github.com/php-enqueue/enqueue-dev/pull/586) ([damijank](https://github.com/damijank)) - Fix delay not working on SQS [\#584](https://github.com/php-enqueue/enqueue-dev/pull/584) ([mbeccati](https://github.com/mbeccati)) ## [0.8.40](https://github.com/php-enqueue/enqueue-dev/tree/0.8.40) (2018-10-22) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.39...0.8.40) +**Merged pull requests:** + - \[rdkafka\] Backport changes to topic subscription [\#575](https://github.com/php-enqueue/enqueue-dev/pull/575) ([Steveb-p](https://github.com/Steveb-p)) ## [0.8.39](https://github.com/php-enqueue/enqueue-dev/tree/0.8.39) (2018-10-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.38...0.8.39) +**Merged pull requests:** + - Merge pull request \#552 from versh23/stomp-public [\#568](https://github.com/php-enqueue/enqueue-dev/pull/568) ([versh23](https://github.com/versh23)) ## [0.8.38](https://github.com/php-enqueue/enqueue-dev/tree/0.8.38) (2018-10-16) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.37...0.8.38) -- Stomp heartbeat [\#549](https://github.com/php-enqueue/enqueue-dev/issues/549) -- \[Elastica\]Slow processing [\#537](https://github.com/php-enqueue/enqueue-dev/issues/537) -- \[consumption\] Some improvements [\#323](https://github.com/php-enqueue/enqueue-dev/issues/323) +**Merged pull requests:** - Fixing kafka default configuration [\#562](https://github.com/php-enqueue/enqueue-dev/pull/562) ([adumas37](https://github.com/adumas37)) - enableSubscriptionConsumer setter [\#541](https://github.com/php-enqueue/enqueue-dev/pull/541) ([ArnaudTarroux](https://github.com/ArnaudTarroux)) @@ -38,75 +141,59 @@ ## [0.8.37](https://github.com/php-enqueue/enqueue-dev/tree/0.8.37) (2018-09-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.36...0.8.37) -- Message body serialization other than JSON [\#316](https://github.com/php-enqueue/enqueue-dev/issues/316) - -- \[Symfony\]\[Flex\]\[enqueue/fs\] Invalid ENQUEUE\_DSN value after recipe execution [\#520](https://github.com/php-enqueue/enqueue-dev/issues/520) - -- Command not processed on first registration [\#529](https://github.com/php-enqueue/enqueue-dev/issues/529) -- \[Redis\] default timeout setting makes connection impossible [\#525](https://github.com/php-enqueue/enqueue-dev/issues/525) -- use multiple queue [\#514](https://github.com/php-enqueue/enqueue-dev/issues/514) -- Populating and interrupting [\#469](https://github.com/php-enqueue/enqueue-dev/issues/469) +**Merged pull requests:** ## [0.8.36](https://github.com/php-enqueue/enqueue-dev/tree/0.8.36) (2018-08-22) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.35...0.8.36) -- DefaultTransportFactory should resolve DSN at runtime, if given as ENV. [\#394](https://github.com/php-enqueue/enqueue-dev/issues/394) - -- Dbal Performance degrades when more than 100k rows [\#465](https://github.com/php-enqueue/enqueue-dev/issues/465) -- \[dbal\] message delay does not work properly [\#418](https://github.com/php-enqueue/enqueue-dev/issues/418) - -- \[amqp-lib\] The connection timed out [\#487](https://github.com/php-enqueue/enqueue-dev/issues/487) -- \[dbal\] unable to requeue with delay [\#474](https://github.com/php-enqueue/enqueue-dev/issues/474) -- Purge / Purgable [\#466](https://github.com/php-enqueue/enqueue-dev/issues/466) -- Kafka consumer subscribe/assign problems [\#454](https://github.com/php-enqueue/enqueue-dev/issues/454) -- Exchange messages between applications [\#448](https://github.com/php-enqueue/enqueue-dev/issues/448) -- object not found error [\#420](https://github.com/php-enqueue/enqueue-dev/issues/420) -- \[symfony bundle\] The env "resolve:ENQUEUE\_DSN" var is not defined [\#375](https://github.com/php-enqueue/enqueue-dev/issues/375) +**Merged pull requests:** - Remove bool typehint for php \< 7 supports [\#513](https://github.com/php-enqueue/enqueue-dev/pull/513) ([ArnaudTarroux](https://github.com/ArnaudTarroux)) ## [0.8.35](https://github.com/php-enqueue/enqueue-dev/tree/0.8.35) (2018-08-06) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.34...0.8.35) +**Merged pull requests:** + +- Improve multi queue consumption. [\#488](https://github.com/php-enqueue/enqueue-dev/pull/488) ([makasim](https://github.com/makasim)) + ## [0.8.34](https://github.com/php-enqueue/enqueue-dev/tree/0.8.34) (2018-08-04) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.33...0.8.34) -- \[sqs\] Messages should not allow empty bodies [\#435](https://github.com/php-enqueue/enqueue-dev/issues/435) -- Use the auto-tagging feature for e.g. processors [\#405](https://github.com/php-enqueue/enqueue-dev/issues/405) - -- \[simple-client\] `sqs:` DSN not working [\#483](https://github.com/php-enqueue/enqueue-dev/issues/483) +**Merged pull requests:** -- Adding a signal handler to the consumer [\#485](https://github.com/php-enqueue/enqueue-dev/issues/485) -- Problem with SQS DSN string with + in secret [\#481](https://github.com/php-enqueue/enqueue-dev/issues/481) +- simple client dsn issue [\#486](https://github.com/php-enqueue/enqueue-dev/pull/486) ([makasim](https://github.com/makasim)) +- Update SQS DSN doc sample with mention urlencode [\#484](https://github.com/php-enqueue/enqueue-dev/pull/484) ([dgoujard](https://github.com/dgoujard)) +- Prevent SqsProducer from sending messages with empty bodies [\#478](https://github.com/php-enqueue/enqueue-dev/pull/478) ([elazar](https://github.com/elazar)) ## [0.8.33](https://github.com/php-enqueue/enqueue-dev/tree/0.8.33) (2018-07-26) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.32...0.8.33) -- \[consumption\] process niceness extension [\#449](https://github.com/php-enqueue/enqueue-dev/issues/449) -- \[Symfony\] AsyncListener does not use TraceableProducer [\#392](https://github.com/php-enqueue/enqueue-dev/issues/392) +**Merged pull requests:** -- Support MQTT [\#477](https://github.com/php-enqueue/enqueue-dev/issues/477) -- Bugs in RabbitMqDelayPluginDelayStrategy [\#455](https://github.com/php-enqueue/enqueue-dev/issues/455) -- \[sqs\] Support using a pre-configured SqsClient [\#443](https://github.com/php-enqueue/enqueue-dev/issues/443) -- IronMQ \(iron.io\) provider ? [\#415](https://github.com/php-enqueue/enqueue-dev/issues/415) +- Fix call debug method on null [\#480](https://github.com/php-enqueue/enqueue-dev/pull/480) ([makasim](https://github.com/makasim)) +- Fix AMQPContext::unsubscribe [\#479](https://github.com/php-enqueue/enqueue-dev/pull/479) ([adrienbrault](https://github.com/adrienbrault)) +- Add Localstack Docker container for SQS functional tests [\#473](https://github.com/php-enqueue/enqueue-dev/pull/473) ([elazar](https://github.com/elazar)) +- \[consumption\] add process niceness extension [\#467](https://github.com/php-enqueue/enqueue-dev/pull/467) ([ramunasd](https://github.com/ramunasd)) ## [0.8.32](https://github.com/php-enqueue/enqueue-dev/tree/0.8.32) (2018-07-10) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.31...0.8.32) -- \[Bundle\] auto-tag services [\#409](https://github.com/php-enqueue/enqueue-dev/issues/409) +**Merged pull requests:** -- Add documentation the processor services need to be public [\#406](https://github.com/php-enqueue/enqueue-dev/issues/406) - -- Is it possible to read messages in batch? [\#472](https://github.com/php-enqueue/enqueue-dev/issues/472) -- Batch publishing [\#463](https://github.com/php-enqueue/enqueue-dev/issues/463) -- populating, missing messages and supervisor [\#460](https://github.com/php-enqueue/enqueue-dev/issues/460) -- Processor was not found. processorName: "enqueue.client.router\_processor" [\#451](https://github.com/php-enqueue/enqueue-dev/issues/451) -- \[Bundle\] Enqueue\Symfony\Client\ContainerAwareProcessorRegistry expects processors to be public [\#410](https://github.com/php-enqueue/enqueue-dev/issues/410) +- Update of "back to index" link [\#468](https://github.com/php-enqueue/enqueue-dev/pull/468) ([N-M](https://github.com/N-M)) +- PHP\_URL\_SCHEME doesn't support underscores [\#453](https://github.com/php-enqueue/enqueue-dev/pull/453) ([coudenysj](https://github.com/coudenysj)) +- Add autoconfigure for services extending PsrProcess interface [\#452](https://github.com/php-enqueue/enqueue-dev/pull/452) ([mnavarrocarter](https://github.com/mnavarrocarter)) +- WIP: Add support for using a pre-configured client with the SQS driver [\#444](https://github.com/php-enqueue/enqueue-dev/pull/444) ([elazar](https://github.com/elazar)) ## [0.8.31](https://github.com/php-enqueue/enqueue-dev/tree/0.8.31) (2018-05-24) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.30...0.8.31) -- Gracefull shutdown? [\#440](https://github.com/php-enqueue/enqueue-dev/issues/440) +**Merged pull requests:** + +- Allow newer version of bunny [\#446](https://github.com/php-enqueue/enqueue-dev/pull/446) ([enumag](https://github.com/enumag)) +- Fix mistype at async\_events docs [\#445](https://github.com/php-enqueue/enqueue-dev/pull/445) ([diimpp](https://github.com/diimpp)) +- Improve exception messages for topic-subscribers [\#441](https://github.com/php-enqueue/enqueue-dev/pull/441) ([thePanz](https://github.com/thePanz)) ## [0.8.30](https://github.com/php-enqueue/enqueue-dev/tree/0.8.30) (2018-05-08) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.29...0.8.30) @@ -114,100 +201,139 @@ ## [0.8.29](https://github.com/php-enqueue/enqueue-dev/tree/0.8.29) (2018-05-08) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.28...0.8.29) +**Merged pull requests:** + +- \[mongodb\] Parse DSN if array [\#438](https://github.com/php-enqueue/enqueue-dev/pull/438) ([makasim](https://github.com/makasim)) +- \[gps\] Add support for google/cloud-pubsub ^1.0 [\#437](https://github.com/php-enqueue/enqueue-dev/pull/437) ([kfb-ts](https://github.com/kfb-ts)) +- fix typo in message\_producer.md [\#436](https://github.com/php-enqueue/enqueue-dev/pull/436) ([halidovz](https://github.com/halidovz)) + ## [0.8.28](https://github.com/php-enqueue/enqueue-dev/tree/0.8.28) (2018-05-03) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.27...0.8.28) -- Should `enqueue/enqueue` also be added to "require" in composer.json for DBAL package? [\#433](https://github.com/php-enqueue/enqueue-dev/issues/433) +**Merged pull requests:** -- RouterProcessor "acknowledges" commands and events without a registered processor [\#423](https://github.com/php-enqueue/enqueue-dev/issues/423) -- \[Symfony\]\[Documentation\] Migrate from JMSJobQueueBundle [\#421](https://github.com/php-enqueue/enqueue-dev/issues/421) +- remove enqueue core dependency [\#434](https://github.com/php-enqueue/enqueue-dev/pull/434) ([ASKozienko](https://github.com/ASKozienko)) +- Mongodb transport [\#430](https://github.com/php-enqueue/enqueue-dev/pull/430) ([turboboy88](https://github.com/turboboy88)) ## [0.8.27](https://github.com/php-enqueue/enqueue-dev/tree/0.8.27) (2018-05-01) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.26...0.8.27) -- How can I use the Symfony Bundle with Kafka? [\#428](https://github.com/php-enqueue/enqueue-dev/issues/428) +**Merged pull requests:** + +- Kafka symfony transport [\#432](https://github.com/php-enqueue/enqueue-dev/pull/432) ([dheineman](https://github.com/dheineman)) +- Drop PHP5 support, Drop Symfony 2.X support. [\#419](https://github.com/php-enqueue/enqueue-dev/pull/419) ([makasim](https://github.com/makasim)) ## [0.8.26](https://github.com/php-enqueue/enqueue-dev/tree/0.8.26) (2018-04-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.25...0.8.26) +**Merged pull requests:** + +- Allow to enable SSL in StompConnectionFactory [\#427](https://github.com/php-enqueue/enqueue-dev/pull/427) ([arjanvdbos](https://github.com/arjanvdbos)) +- Fix namespace in doc [\#426](https://github.com/php-enqueue/enqueue-dev/pull/426) ([Koc](https://github.com/Koc)) + ## [0.8.25](https://github.com/php-enqueue/enqueue-dev/tree/0.8.25) (2018-04-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.24...0.8.25) -- gearmand queue library can't not use for php7 [\#270](https://github.com/php-enqueue/enqueue-dev/issues/270) +**Merged pull requests:** -- Why no packagist support [\#424](https://github.com/php-enqueue/enqueue-dev/issues/424) -- \[DbalDriver\] does not convert Message::$expire to DbalMessage::$timeToLive [\#391](https://github.com/php-enqueue/enqueue-dev/issues/391) +- \[skip ci\] Update doc block. return value should be "self" [\#425](https://github.com/php-enqueue/enqueue-dev/pull/425) ([makasim](https://github.com/makasim)) +- \[bundle\] Make TraceableProducer service public [\#422](https://github.com/php-enqueue/enqueue-dev/pull/422) ([sbacelic](https://github.com/sbacelic)) +- Fix a tiny little typo in documentation [\#416](https://github.com/php-enqueue/enqueue-dev/pull/416) ([bobey](https://github.com/bobey)) ## [0.8.24](https://github.com/php-enqueue/enqueue-dev/tree/0.8.24) (2018-03-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.23...0.8.24) -- \[fs\] Escape special symbols [\#390](https://github.com/php-enqueue/enqueue-dev/issues/390) +**Merged pull requests:** -- Laravel Usage [\#408](https://github.com/php-enqueue/enqueue-dev/issues/408) -- \[JobRunner\] Uncaught exceptions leave jobs in "running" state [\#385](https://github.com/php-enqueue/enqueue-dev/issues/385) -- \[Feature Request\] Closure message body. [\#366](https://github.com/php-enqueue/enqueue-dev/issues/366) +- \[bundle\] Don't ping DBAL connection if it wasn't opened [\#414](https://github.com/php-enqueue/enqueue-dev/pull/414) ([ramunasd](https://github.com/ramunasd)) +- Fix AMQP\(s\) code in amqp.md [\#413](https://github.com/php-enqueue/enqueue-dev/pull/413) ([xdbas](https://github.com/xdbas)) +- Fixed typos [\#412](https://github.com/php-enqueue/enqueue-dev/pull/412) ([pborreli](https://github.com/pborreli)) +- Fixed typo [\#411](https://github.com/php-enqueue/enqueue-dev/pull/411) ([pborreli](https://github.com/pborreli)) +- Update sqs transport factory with missing endpoint parameter [\#404](https://github.com/php-enqueue/enqueue-dev/pull/404) ([asilgalis](https://github.com/asilgalis)) +- \[fs\] Escape delimiter symbols. [\#402](https://github.com/php-enqueue/enqueue-dev/pull/402) ([makasim](https://github.com/makasim)) ## [0.8.23](https://github.com/php-enqueue/enqueue-dev/tree/0.8.23) (2018-03-06) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.22...0.8.23) +**Merged pull requests:** + +- \[doc\]\[magento2\]\[skip ci\] Add docs for Mangeto2 module. [\#401](https://github.com/php-enqueue/enqueue-dev/pull/401) ([makasim](https://github.com/makasim)) +- Allow queue interop 1.0 alpha. [\#400](https://github.com/php-enqueue/enqueue-dev/pull/400) ([makasim](https://github.com/makasim)) +- Update Travis config to use Symfony 4 release [\#397](https://github.com/php-enqueue/enqueue-dev/pull/397) ([msheakoski](https://github.com/msheakoski)) +- Clean up when a job triggers an exception [\#395](https://github.com/php-enqueue/enqueue-dev/pull/395) ([msheakoski](https://github.com/msheakoski)) + ## [0.8.22](https://github.com/php-enqueue/enqueue-dev/tree/0.8.22) (2018-03-01) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.21...0.8.22) -- Runtime exception "\_\_construct\(\)" references interface "Enqueue\Client\ProducerInterface" but no such service exists [\#376](https://github.com/php-enqueue/enqueue-dev/issues/376) - -- \[Simple Client\] The simple client requires amqp-ext even if you use another brokers [\#386](https://github.com/php-enqueue/enqueue-dev/issues/386) -- \[symfony bundle\] EnqueueExtension. Transport factory with such name already added. Name stomp [\#383](https://github.com/php-enqueue/enqueue-dev/issues/383) -- Problem registering SQS transport using DSN string [\#380](https://github.com/php-enqueue/enqueue-dev/issues/380) +**Merged pull requests:** -- Close Connection [\#384](https://github.com/php-enqueue/enqueue-dev/issues/384) -- Outdated bundle documentation [\#381](https://github.com/php-enqueue/enqueue-dev/issues/381) -- \[RFC\] Throttle/debounce [\#378](https://github.com/php-enqueue/enqueue-dev/issues/378) +- \[client\] Simple Client should not depend on amqp-ext. [\#389](https://github.com/php-enqueue/enqueue-dev/pull/389) ([makasim](https://github.com/makasim)) +- \[bundle\] fix for "Transport factory with such name already added" [\#388](https://github.com/php-enqueue/enqueue-dev/pull/388) ([makasim](https://github.com/makasim)) +- \[bundle\] add producer interface alias. [\#382](https://github.com/php-enqueue/enqueue-dev/pull/382) ([makasim](https://github.com/makasim)) ## [0.8.21](https://github.com/php-enqueue/enqueue-dev/tree/0.8.21) (2018-02-16) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.20...0.8.21) -- Delayed-message doesn't work on my project ! [\#373](https://github.com/php-enqueue/enqueue-dev/issues/373) -- \[Symfony\] Command name misses in profiler [\#355](https://github.com/php-enqueue/enqueue-dev/issues/355) +**Merged pull requests:** + +- \[symfony\] Print command name [\#374](https://github.com/php-enqueue/enqueue-dev/pull/374) ([makasim](https://github.com/makasim)) ## [0.8.20](https://github.com/php-enqueue/enqueue-dev/tree/0.8.20) (2018-02-15) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.19...0.8.20) -- Pass options to predis client when using redis transport [\#367](https://github.com/php-enqueue/enqueue-dev/issues/367) -- Authentication Support for Redis [\#349](https://github.com/php-enqueue/enqueue-dev/issues/349) -- Does redis factory supports sentinel or cluster? [\#341](https://github.com/php-enqueue/enqueue-dev/issues/341) +**Merged pull requests:** + +- \[Redis\] Add ability to pass Redis instance to connection factory [\#372](https://github.com/php-enqueue/enqueue-dev/pull/372) ([makasim](https://github.com/makasim)) ## [0.8.19](https://github.com/php-enqueue/enqueue-dev/tree/0.8.19) (2018-02-14) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.18...0.8.19) -- \[Docs\] Describe difference between command and event messages [\#351](https://github.com/php-enqueue/enqueue-dev/issues/351) +**Merged pull requests:** -- Minor grammatical changes to documentation [\#363](https://github.com/php-enqueue/enqueue-dev/issues/363) -- \[DbalConsumer\] Issue with id type [\#360](https://github.com/php-enqueue/enqueue-dev/issues/360) +- \[dbal\] Sort priority messages by published at date too. [\#371](https://github.com/php-enqueue/enqueue-dev/pull/371) ([makasim](https://github.com/makasim)) +- Fix typo [\#369](https://github.com/php-enqueue/enqueue-dev/pull/369) ([kubk](https://github.com/kubk)) +- \[client\]\[skip ci\] Explain meaning of sendEvent, sendCommand methods. [\#365](https://github.com/php-enqueue/enqueue-dev/pull/365) ([makasim](https://github.com/makasim)) +- Modify async\_events.md grammar [\#364](https://github.com/php-enqueue/enqueue-dev/pull/364) ([ddproxy](https://github.com/ddproxy)) +- Fix wrong argument type [\#361](https://github.com/php-enqueue/enqueue-dev/pull/361) ([olix21](https://github.com/olix21)) ## [0.8.18](https://github.com/php-enqueue/enqueue-dev/tree/0.8.18) (2018-02-07) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.17...0.8.18) -- \[SQS\] Allow custom aws endpoint configuration [\#352](https://github.com/php-enqueue/enqueue-dev/issues/352) +**Merged pull requests:** -- Transport is not enabled: amqp: [\#356](https://github.com/php-enqueue/enqueue-dev/issues/356) - -- \[SQS\] Unable to connect to FIFO queue [\#342](https://github.com/php-enqueue/enqueue-dev/issues/342) -- \[dbal\] Consumer never fetches messages ordered by published time [\#340](https://github.com/php-enqueue/enqueue-dev/issues/340) +- \[bundle\] DefaultTransportFactory should accept DSN like foo: [\#358](https://github.com/php-enqueue/enqueue-dev/pull/358) ([makasim](https://github.com/makasim)) +- Added endpoint configuration and updated the tests [\#353](https://github.com/php-enqueue/enqueue-dev/pull/353) ([gitis](https://github.com/gitis)) +- Moved symfony/framework-bundle to require-dev [\#348](https://github.com/php-enqueue/enqueue-dev/pull/348) ([prisis](https://github.com/prisis)) +- Gearman PHP 7 support [\#347](https://github.com/php-enqueue/enqueue-dev/pull/347) ([Jawshua](https://github.com/Jawshua)) +- \[dbal\] Consumer never fetches messages ordered by published time [\#343](https://github.com/php-enqueue/enqueue-dev/pull/343) ([f7h](https://github.com/f7h)) ## [0.8.17](https://github.com/php-enqueue/enqueue-dev/tree/0.8.17) (2018-01-18) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.16...0.8.17) -- QueueConsumer should be final [\#311](https://github.com/php-enqueue/enqueue-dev/issues/311) +**Merged pull requests:** -- Unrecognized option "amqp" under "enqueue.transport" [\#333](https://github.com/php-enqueue/enqueue-dev/issues/333) +- \[consumption\] Prepare QueueConsumer for changes in 0.9 [\#337](https://github.com/php-enqueue/enqueue-dev/pull/337) ([makasim](https://github.com/makasim)) +- \[consumption\] Make QueueConsumer final [\#336](https://github.com/php-enqueue/enqueue-dev/pull/336) ([makasim](https://github.com/makasim)) +- \[bundle\]\[dx\] Add a message that suggest installing a pkg to use the transport. [\#335](https://github.com/php-enqueue/enqueue-dev/pull/335) ([makasim](https://github.com/makasim)) +- \[0.9\]\[BC break\]\[dbal\] Store UUIDs as binary data. Improves performance [\#280](https://github.com/php-enqueue/enqueue-dev/pull/280) ([makasim](https://github.com/makasim)) ## [0.8.16](https://github.com/php-enqueue/enqueue-dev/tree/0.8.16) (2018-01-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.15...0.8.16) +**Merged pull requests:** + +- \[Sqs\] Allow array-based DSN configuration [\#315](https://github.com/php-enqueue/enqueue-dev/pull/315) ([beryllium](https://github.com/beryllium)) + ## [0.8.15](https://github.com/php-enqueue/enqueue-dev/tree/0.8.15) (2018-01-12) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.14...0.8.15) -- SQS via DNS region missing [\#321](https://github.com/php-enqueue/enqueue-dev/issues/321) +**Merged pull requests:** + +- \[amqp\] fix signal handler if consume called from consume [\#328](https://github.com/php-enqueue/enqueue-dev/pull/328) ([makasim](https://github.com/makasim)) +- Update config\_reference.md [\#326](https://github.com/php-enqueue/enqueue-dev/pull/326) ([errogaht](https://github.com/errogaht)) +- Update message\_producer.md [\#325](https://github.com/php-enqueue/enqueue-dev/pull/325) ([errogaht](https://github.com/errogaht)) +- Update consumption\_extension.md [\#324](https://github.com/php-enqueue/enqueue-dev/pull/324) ([errogaht](https://github.com/errogaht)) +- \[consumption\] Correct message in LoggerExtension [\#322](https://github.com/php-enqueue/enqueue-dev/pull/322) ([makasim](https://github.com/makasim)) ## [0.8.14](https://github.com/php-enqueue/enqueue-dev/tree/0.8.14) (2018-01-10) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.13...0.8.14) @@ -215,139 +341,168 @@ ## [0.8.13](https://github.com/php-enqueue/enqueue-dev/tree/0.8.13) (2018-01-09) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.12...0.8.13) -- AMQPIOWaitException upon docker container shutdown [\#300](https://github.com/php-enqueue/enqueue-dev/issues/300) +**Merged pull requests:** + +- \[amqp\] Fix socket and signal issue. [\#317](https://github.com/php-enqueue/enqueue-dev/pull/317) ([makasim](https://github.com/makasim)) +- \[kafka\] add ability to set offset. [\#314](https://github.com/php-enqueue/enqueue-dev/pull/314) ([makasim](https://github.com/makasim)) ## [0.8.12](https://github.com/php-enqueue/enqueue-dev/tree/0.8.12) (2018-01-04) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.11...0.8.12) -- \[Elastica\] convert the Doctrine listeners to async too [\#244](https://github.com/php-enqueue/enqueue-dev/issues/244) +**Merged pull requests:** -- \[amqp-ext\] Unrecognized options "login, password, delay\_plugin\_installed" under "enqueue.transport.rabbitmq\_amqp [\#309](https://github.com/php-enqueue/enqueue-dev/issues/309) -- Symfony Bundle: amqp bunny doesn't stop the execution of the CLI command [\#303](https://github.com/php-enqueue/enqueue-dev/issues/303) +- \[rdkafka\] Don't do unnecessary subscribe\unsubscribe on every receive call [\#313](https://github.com/php-enqueue/enqueue-dev/pull/313) ([makasim](https://github.com/makasim)) +- \[consumption\] Fix signal handling when AMQP is used. [\#310](https://github.com/php-enqueue/enqueue-dev/pull/310) ([makasim](https://github.com/makasim)) +- Using Laravel helper to resolve filepath [\#302](https://github.com/php-enqueue/enqueue-dev/pull/302) ([robinvdvleuten](https://github.com/robinvdvleuten)) +- Changed larvel to laravel [\#301](https://github.com/php-enqueue/enqueue-dev/pull/301) ([robinvdvleuten](https://github.com/robinvdvleuten)) +- Check if logger exists [\#299](https://github.com/php-enqueue/enqueue-dev/pull/299) ([pascaldevink](https://github.com/pascaldevink)) +- Fix reversed logic for native UUID detection [\#297](https://github.com/php-enqueue/enqueue-dev/pull/297) ([msheakoski](https://github.com/msheakoski)) +- Job queue create tables [\#293](https://github.com/php-enqueue/enqueue-dev/pull/293) ([makasim](https://github.com/makasim)) ## [0.8.11](https://github.com/php-enqueue/enqueue-dev/tree/0.8.11) (2017-12-14) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.10...0.8.11) -- \[job-queue\] Change type hint from Closure to callable [\#286](https://github.com/php-enqueue/enqueue-dev/issues/286) - -- Consumer Requeue -\> DBAL NotNullConstraintViolationException [\#290](https://github.com/php-enqueue/enqueue-dev/issues/290) -- Set custom logger [\#287](https://github.com/php-enqueue/enqueue-dev/issues/287) -- \[Elastica\] persistence.driver = orm is optional [\#245](https://github.com/php-enqueue/enqueue-dev/issues/245) +**Merged pull requests:** -- \[composer\] Add support details to composer.json [\#288](https://github.com/php-enqueue/enqueue-dev/issues/288) +- \[job-queue\] Change typehint, allow not only Closure but other callabl… [\#292](https://github.com/php-enqueue/enqueue-dev/pull/292) ([makasim](https://github.com/makasim)) +- \[dbal\] Fix message re-queuing. Reuse producer for it. [\#291](https://github.com/php-enqueue/enqueue-dev/pull/291) ([makasim](https://github.com/makasim)) +- \[consumption\] Add ability to overwrite logger. [\#289](https://github.com/php-enqueue/enqueue-dev/pull/289) ([makasim](https://github.com/makasim)) +- \[doc\] yii2-queue amqp driver [\#282](https://github.com/php-enqueue/enqueue-dev/pull/282) ([makasim](https://github.com/makasim)) ## [0.8.10](https://github.com/php-enqueue/enqueue-dev/tree/0.8.10) (2017-12-04) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.9...0.8.10) -- \[dbal\] Store id \(uuid\) as binary data. [\#279](https://github.com/php-enqueue/enqueue-dev/issues/279) -- \[doc\] Add a doc with job queue doctrine migration example [\#278](https://github.com/php-enqueue/enqueue-dev/issues/278) -- Add mongodb support. [\#251](https://github.com/php-enqueue/enqueue-dev/issues/251) -- Add zeromq support [\#208](https://github.com/php-enqueue/enqueue-dev/issues/208) -- \[amqp-lib\] It should be possible to create queue without a name, [\#145](https://github.com/php-enqueue/enqueue-dev/issues/145) -- \[doc\] Add the doc for client extensions [\#73](https://github.com/php-enqueue/enqueue-dev/issues/73) +**Merged pull requests:** -- \[enqueue/dbal\] Logic for "The platform does not support UUIDs natively" is incorrect [\#276](https://github.com/php-enqueue/enqueue-dev/issues/276) +- \[doc\]\[skip ci\] add doc for client on send extensions. [\#285](https://github.com/php-enqueue/enqueue-dev/pull/285) ([makasim](https://github.com/makasim)) +- \[doc\]\[skip ci\] Add processor examples, notes on exception and more. [\#283](https://github.com/php-enqueue/enqueue-dev/pull/283) ([makasim](https://github.com/makasim)) +- \[travis\] add PHP 7.2 to build matrix. [\#281](https://github.com/php-enqueue/enqueue-dev/pull/281) ([makasim](https://github.com/makasim)) ## [0.8.9](https://github.com/php-enqueue/enqueue-dev/tree/0.8.9) (2017-11-21) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.8...0.8.9) -- \[rdkafka\] Introduce KeySerializer [\#255](https://github.com/php-enqueue/enqueue-dev/issues/255) -- \[amqp-lib\]\[RabbitMQ\] Publisher Confirms [\#206](https://github.com/php-enqueue/enqueue-dev/issues/206) -- \[client\]\[amqp\] Idea. Add support of dead queues [\#39](https://github.com/php-enqueue/enqueue-dev/issues/39) +**Merged pull requests:** -- \[amqp-ext\] Problem with consume messages [\#274](https://github.com/php-enqueue/enqueue-dev/issues/274) +- \[docker\] Incorporate amqp ext compilation to docker build process. [\#275](https://github.com/php-enqueue/enqueue-dev/pull/275) ([makasim](https://github.com/makasim)) +- \[bundle\] Apparently the use case tests have never worked properly. [\#273](https://github.com/php-enqueue/enqueue-dev/pull/273) ([makasim](https://github.com/makasim)) +- \[fs\] Copy past Symfony's LockHandler \(not awailable in Sf4\). [\#272](https://github.com/php-enqueue/enqueue-dev/pull/272) ([makasim](https://github.com/makasim)) +- Add Symfony4 support [\#269](https://github.com/php-enqueue/enqueue-dev/pull/269) ([makasim](https://github.com/makasim)) +- \[bundle\] use enqueue logo in profiler panel. [\#268](https://github.com/php-enqueue/enqueue-dev/pull/268) ([makasim](https://github.com/makasim)) +- \[rdkafka\] do not pass config if it was not set explisitly. [\#263](https://github.com/php-enqueue/enqueue-dev/pull/263) ([makasim](https://github.com/makasim)) ## [0.8.8](https://github.com/php-enqueue/enqueue-dev/tree/0.8.8) (2017-11-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.7...0.8.8) -- onIdle is not triggered [\#260](https://github.com/php-enqueue/enqueue-dev/issues/260) -- On exception Context is not set [\#259](https://github.com/php-enqueue/enqueue-dev/issues/259) +**Merged pull requests:** + +- \[Redis\] add dsn support for symfony bundle. [\#266](https://github.com/php-enqueue/enqueue-dev/pull/266) ([wilson-ng](https://github.com/wilson-ng)) +- \[consumption\]\[amqp\] onIdle is never called. [\#265](https://github.com/php-enqueue/enqueue-dev/pull/265) ([makasim](https://github.com/makasim)) +- \[consumption\] fix context is missing message on exception. [\#264](https://github.com/php-enqueue/enqueue-dev/pull/264) ([makasim](https://github.com/makasim)) ## [0.8.7](https://github.com/php-enqueue/enqueue-dev/tree/0.8.7) (2017-11-10) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.6...0.8.7) -- SetRouterPropertiesExtension does not work with SQS [\#261](https://github.com/php-enqueue/enqueue-dev/issues/261) +**Merged pull requests:** + +- Changes SetRouterPropertiesExtension to use the driver to generate the queue name [\#262](https://github.com/php-enqueue/enqueue-dev/pull/262) ([iainmckay](https://github.com/iainmckay)) +- \[Redis\] add custom database index [\#258](https://github.com/php-enqueue/enqueue-dev/pull/258) ([IndraGunawan](https://github.com/IndraGunawan)) ## [0.8.6](https://github.com/php-enqueue/enqueue-dev/tree/0.8.6) (2017-11-05) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.5...0.8.6) -- \[Elastica Bundle\] tag 0.8 [\#253](https://github.com/php-enqueue/enqueue-dev/issues/253) +**Merged pull requests:** + +- \[RdKafka\] Enable serializers to serialize message keys [\#254](https://github.com/php-enqueue/enqueue-dev/pull/254) ([tPl0ch](https://github.com/tPl0ch)) ## [0.8.5](https://github.com/php-enqueue/enqueue-dev/tree/0.8.5) (2017-11-02) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.4...0.8.5) +**Merged pull requests:** + +- Amqp add ssl pass phrase option [\#249](https://github.com/php-enqueue/enqueue-dev/pull/249) ([makasim](https://github.com/makasim)) +- \[amqp-lib\] Ignore empty ssl options. [\#248](https://github.com/php-enqueue/enqueue-dev/pull/248) ([makasim](https://github.com/makasim)) + ## [0.8.4](https://github.com/php-enqueue/enqueue-dev/tree/0.8.4) (2017-11-01) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.3...0.8.4) ## [0.8.3](https://github.com/php-enqueue/enqueue-dev/tree/0.8.3) (2017-11-01) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.2...0.8.3) -- \[Symfony\]\[Minor\] profiler view when no messages collected during the request [\#243](https://github.com/php-enqueue/enqueue-dev/issues/243) +**Merged pull requests:** + +- \[bundle\] streamline profiler view when no messages were sent [\#247](https://github.com/php-enqueue/enqueue-dev/pull/247) ([dkarlovi](https://github.com/dkarlovi)) +- \[bundle\] Renamed exposed services' name to classes' FQCN [\#242](https://github.com/php-enqueue/enqueue-dev/pull/242) ([Lctrs](https://github.com/Lctrs)) ## [0.8.2](https://github.com/php-enqueue/enqueue-dev/tree/0.8.2) (2017-10-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.1...0.8.2) -- \[amqp\] add ssl support [\#147](https://github.com/php-enqueue/enqueue-dev/issues/147) +**Merged pull requests:** + +- \[amqp\] Add AMQP secure \(SSL\) connections support [\#246](https://github.com/php-enqueue/enqueue-dev/pull/246) ([makasim](https://github.com/makasim)) ## [0.8.1](https://github.com/php-enqueue/enqueue-dev/tree/0.8.1) (2017-10-23) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.0...0.8.1) -- Allow kafka tests to fail. [\#232](https://github.com/php-enqueue/enqueue-dev/issues/232) +**Merged pull requests:** -- GPSTransportFactory registration is missing from EnqueueBundle [\#235](https://github.com/php-enqueue/enqueue-dev/issues/235) +- Only add Ampq transport factories when packages are found [\#241](https://github.com/php-enqueue/enqueue-dev/pull/241) ([jverdeyen](https://github.com/jverdeyen)) +- GPS Integration [\#239](https://github.com/php-enqueue/enqueue-dev/pull/239) ([ASKozienko](https://github.com/ASKozienko)) ## [0.8.0](https://github.com/php-enqueue/enqueue-dev/tree/0.8.0) (2017-10-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.19...0.8.0) -- \[amqp-lib\] The context should allow to get the lib's channel. [\#146](https://github.com/php-enqueue/enqueue-dev/issues/146) -- \[amqp\] One single transport factory for all supported amqp implementa… [\#233](https://github.com/php-enqueue/enqueue-dev/pull/233) ([makasim](https://github.com/makasim)) -- \[BC break\]\[amqp\] Introduce connection config. Make it same across all transports. [\#228](https://github.com/php-enqueue/enqueue-dev/pull/228) ([makasim](https://github.com/makasim)) +**Merged pull requests:** -- \[amqp-bunny\] High CPU usage while using basic.consume. [\#226](https://github.com/php-enqueue/enqueue-dev/issues/226) -- Amqp basic consume should restore default timeout inside consume callback. [\#225](https://github.com/php-enqueue/enqueue-dev/issues/225) -- AmqpProducer::send method must throw only interop exception. [\#224](https://github.com/php-enqueue/enqueue-dev/issues/224) +- 0.8v goes stable. [\#238](https://github.com/php-enqueue/enqueue-dev/pull/238) ([makasim](https://github.com/makasim)) +- \[travis\] allow kafka tests to fail. [\#237](https://github.com/php-enqueue/enqueue-dev/pull/237) ([makasim](https://github.com/makasim)) - \[consumption\]\[amqp\] move beforeReceive call at the end of the cycle f… [\#234](https://github.com/php-enqueue/enqueue-dev/pull/234) ([makasim](https://github.com/makasim)) -- \\[BC break\\]\\[amqp\\] Introduce connection config. Make it same across all transports. [\#228](https://github.com/php-enqueue/enqueue-dev/pull/228) ([makasim](https://github.com/makasim)) +- \[amqp\] One single transport factory for all supported amqp implementa… [\#233](https://github.com/php-enqueue/enqueue-dev/pull/233) ([makasim](https://github.com/makasim)) +- Missing client configuration in the documentation [\#231](https://github.com/php-enqueue/enqueue-dev/pull/231) ([lsv](https://github.com/lsv)) +- Added MIT license badge [\#230](https://github.com/php-enqueue/enqueue-dev/pull/230) ([tarlepp](https://github.com/tarlepp)) +- \[BC break\]\[amqp\] Introduce connection config. Make it same across all transports. [\#228](https://github.com/php-enqueue/enqueue-dev/pull/228) ([makasim](https://github.com/makasim)) ## [0.7.19](https://github.com/php-enqueue/enqueue-dev/tree/0.7.19) (2017-10-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.18...0.7.19) +**Merged pull requests:** + +- Fix typo [\#227](https://github.com/php-enqueue/enqueue-dev/pull/227) ([f3ath](https://github.com/f3ath)) - Amqp basic consume fixes [\#223](https://github.com/php-enqueue/enqueue-dev/pull/223) ([makasim](https://github.com/makasim)) +- Adds to small extension points to JobProcessor [\#222](https://github.com/php-enqueue/enqueue-dev/pull/222) ([iainmckay](https://github.com/iainmckay)) - \[BC break\]\[amqp\] Use same qos options across all all AMQP transports [\#221](https://github.com/php-enqueue/enqueue-dev/pull/221) ([makasim](https://github.com/makasim)) - \[BC break\] Amqp add basic consume support [\#217](https://github.com/php-enqueue/enqueue-dev/pull/217) ([makasim](https://github.com/makasim)) -- Amqp basic consume fixes [\#223](https://github.com/php-enqueue/enqueue-dev/pull/223) ([makasim](https://github.com/makasim)) - ## [0.7.18](https://github.com/php-enqueue/enqueue-dev/tree/0.7.18) (2017-10-10) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.17...0.7.18) -- \[consumption\]\[client\] Add --skip option to consume commands. [\#216](https://github.com/php-enqueue/enqueue-dev/issues/216) -- \[json\] jsonSerialize could throw an a exception. [\#132](https://github.com/php-enqueue/enqueue-dev/issues/132) +**Merged pull requests:** + +- \[client\] Add --skip option to consume command. [\#218](https://github.com/php-enqueue/enqueue-dev/pull/218) ([makasim](https://github.com/makasim)) ## [0.7.17](https://github.com/php-enqueue/enqueue-dev/tree/0.7.17) (2017-10-03) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.16...0.7.17) -- \[Symfony\] Error using profiler with symfony 2.8 [\#211](https://github.com/php-enqueue/enqueue-dev/issues/211) -- \[fs\] ErrorException: The Symfony\Component\Filesystem\LockHandler class is deprecated since version 3.4 [\#166](https://github.com/php-enqueue/enqueue-dev/issues/166) +**Merged pull requests:** + +- Fs do not throw error on user deprecate [\#214](https://github.com/php-enqueue/enqueue-dev/pull/214) ([makasim](https://github.com/makasim)) +- \[bundle\]\[profiler\] Fix array to string conversion notice. [\#212](https://github.com/php-enqueue/enqueue-dev/pull/212) ([makasim](https://github.com/makasim)) ## [0.7.16](https://github.com/php-enqueue/enqueue-dev/tree/0.7.16) (2017-09-28) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.15...0.7.16) +**Merged pull requests:** + +- Fixes the notation for Twig template names in the data collector [\#207](https://github.com/php-enqueue/enqueue-dev/pull/207) ([Lctrs](https://github.com/Lctrs)) - \[BC Break\]\[dsn\] replace xxx:// to xxx: [\#205](https://github.com/php-enqueue/enqueue-dev/pull/205) ([makasim](https://github.com/makasim)) ## [0.7.15](https://github.com/php-enqueue/enqueue-dev/tree/0.7.15) (2017-09-25) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.14...0.7.15) -- \[FS\]\[RFC\] Change to FIFO queue [\#171](https://github.com/php-enqueue/enqueue-dev/issues/171) -- Transports must support configuration via DSN string [\#87](https://github.com/php-enqueue/enqueue-dev/issues/87) -- Add support of async message processing to transport interfaces. Like Java JMS. [\#27](https://github.com/php-enqueue/enqueue-dev/issues/27) -- \[dbal\]\[bc break\] Performance improvements and new features. [\#199](https://github.com/php-enqueue/enqueue-dev/pull/199) ([makasim](https://github.com/makasim)) +**Merged pull requests:** -- \[FS\] Cannot decode json message [\#202](https://github.com/php-enqueue/enqueue-dev/issues/202) +- \[redis\] add dsn support for redis transport. [\#204](https://github.com/php-enqueue/enqueue-dev/pull/204) ([makasim](https://github.com/makasim)) - \[fs\] fix bugs introduced in \#181. [\#203](https://github.com/php-enqueue/enqueue-dev/pull/203) ([makasim](https://github.com/makasim)) - -- \[FS\] Cannot decode json message [\#201](https://github.com/php-enqueue/enqueue-dev/issues/201) -- \[FS\] Cannot decode json message [\#200](https://github.com/php-enqueue/enqueue-dev/issues/200) +- \[dbal\]\[bc break\] Performance improvements and new features. [\#199](https://github.com/php-enqueue/enqueue-dev/pull/199) ([makasim](https://github.com/makasim)) ## [0.7.14](https://github.com/php-enqueue/enqueue-dev/tree/0.7.14) (2017-09-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.13...0.7.14) @@ -355,44 +510,63 @@ ## [0.7.13](https://github.com/php-enqueue/enqueue-dev/tree/0.7.13) (2017-09-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.12...0.7.13) -- Topic subscriber doesn't work with 2 separate apps [\#196](https://github.com/php-enqueue/enqueue-dev/issues/196) +**Merged pull requests:** + +- \[dbal\] add priority support on transport level. [\#198](https://github.com/php-enqueue/enqueue-dev/pull/198) ([makasim](https://github.com/makasim)) +- \[bundle\] add tests for the case where topic subscriber does not def p… [\#197](https://github.com/php-enqueue/enqueue-dev/pull/197) ([makasim](https://github.com/makasim)) +- Fixed losing message priority for dbal driver [\#195](https://github.com/php-enqueue/enqueue-dev/pull/195) ([vtsykun](https://github.com/vtsykun)) ## [0.7.12](https://github.com/php-enqueue/enqueue-dev/tree/0.7.12) (2017-09-12) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.11...0.7.12) +**Merged pull requests:** + +- fixed NS [\#194](https://github.com/php-enqueue/enqueue-dev/pull/194) ([chdeliens](https://github.com/chdeliens)) + ## [0.7.11](https://github.com/php-enqueue/enqueue-dev/tree/0.7.11) (2017-09-11) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.10...0.7.11) -- Redis consumer has very high resource usage [\#191](https://github.com/php-enqueue/enqueue-dev/issues/191) +**Merged pull requests:** + +- Queue Consumer Options [\#193](https://github.com/php-enqueue/enqueue-dev/pull/193) ([ASKozienko](https://github.com/ASKozienko)) +- \[FS\] Polling Interval [\#192](https://github.com/php-enqueue/enqueue-dev/pull/192) ([ASKozienko](https://github.com/ASKozienko)) +- \[Symfony\] added toolbar info in profiler [\#190](https://github.com/php-enqueue/enqueue-dev/pull/190) ([Miliooo](https://github.com/Miliooo)) +- docs cli\_commands.md fix [\#189](https://github.com/php-enqueue/enqueue-dev/pull/189) ([Miliooo](https://github.com/Miliooo)) ## [0.7.10](https://github.com/php-enqueue/enqueue-dev/tree/0.7.10) (2017-08-31) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.9...0.7.10) -- Serialization beyond JSON [\#187](https://github.com/php-enqueue/enqueue-dev/issues/187) +**Merged pull requests:** -- Bug on AsyncDoctrineOrmProvider::setContext\(\) [\#186](https://github.com/php-enqueue/enqueue-dev/issues/186) +- \[rdkafka\] Add abilito change the way a message is serialized. [\#188](https://github.com/php-enqueue/enqueue-dev/pull/188) ([makasim](https://github.com/makasim)) ## [0.7.9](https://github.com/php-enqueue/enqueue-dev/tree/0.7.9) (2017-08-28) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.8...0.7.9) -- Update to phpstan 0.8 [\#141](https://github.com/php-enqueue/enqueue-dev/issues/141) -- \[client\] Add a reason while setting reject in DelayRedeliveredMessageExtension [\#41](https://github.com/php-enqueue/enqueue-dev/issues/41) +**Merged pull requests:** -- \[Doctrine\] add support to convert Doctrine events to Enqueue messages [\#68](https://github.com/php-enqueue/enqueue-dev/issues/68) +- \[client\] DelayRedeliveredMessageExtension. Add reject reason. [\#185](https://github.com/php-enqueue/enqueue-dev/pull/185) ([makasim](https://github.com/makasim)) +- \[phpstan\] update to 0.8 version [\#184](https://github.com/php-enqueue/enqueue-dev/pull/184) ([makasim](https://github.com/makasim)) ## [0.7.8](https://github.com/php-enqueue/enqueue-dev/tree/0.7.8) (2017-08-28) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.7...0.7.8) -- fix sqs tests when run by not a member of the project. [\#179](https://github.com/php-enqueue/enqueue-dev/issues/179) -- \[bundle\] It is not possible to use client's producer in a cli event, for example on exception [\#177](https://github.com/php-enqueue/enqueue-dev/issues/177) -- Error on PurgeFosElasticPopulateQueueListener::\_\_construct\(\) [\#174](https://github.com/php-enqueue/enqueue-dev/issues/174) -- \[bundle\] Possible issue when something configured wronly [\#172](https://github.com/php-enqueue/enqueue-dev/issues/172) -- \[FS\] Frame not being read correctly [\#170](https://github.com/php-enqueue/enqueue-dev/issues/170) +**Merged pull requests:** + +- \[consumption\] Do not close context. [\#183](https://github.com/php-enqueue/enqueue-dev/pull/183) ([makasim](https://github.com/makasim)) +- \[bundle\] do not use client's related stuff if it is disabled [\#182](https://github.com/php-enqueue/enqueue-dev/pull/182) ([makasim](https://github.com/makasim)) +- \[fs\] fix bug that happens with specific message length. [\#181](https://github.com/php-enqueue/enqueue-dev/pull/181) ([makasim](https://github.com/makasim)) +- \[sqs\] Skip tests if no amazon credentinals present. [\#180](https://github.com/php-enqueue/enqueue-dev/pull/180) ([makasim](https://github.com/makasim)) +- Fix typo in configuration parameter [\#178](https://github.com/php-enqueue/enqueue-dev/pull/178) ([akucherenko](https://github.com/akucherenko)) +- Google Pub/Sub [\#167](https://github.com/php-enqueue/enqueue-dev/pull/167) ([ASKozienko](https://github.com/ASKozienko)) ## [0.7.7](https://github.com/php-enqueue/enqueue-dev/tree/0.7.7) (2017-08-25) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.6...0.7.7) -- Add support for Google Cloud Pub/Sub [\#83](https://github.com/php-enqueue/enqueue-dev/issues/83) +**Merged pull requests:** + +- Use Query Builder for better support across platforms. [\#176](https://github.com/php-enqueue/enqueue-dev/pull/176) ([jenkoian](https://github.com/jenkoian)) +- fix pheanstalk redelivered, receive [\#173](https://github.com/php-enqueue/enqueue-dev/pull/173) ([ASKozienko](https://github.com/ASKozienko)) ## [0.7.6](https://github.com/php-enqueue/enqueue-dev/tree/0.7.6) (2017-08-16) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.5...0.7.6) @@ -400,6 +574,11 @@ ## [0.7.5](https://github.com/php-enqueue/enqueue-dev/tree/0.7.5) (2017-08-16) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.4...0.7.5) +**Merged pull requests:** + +- Bundle disable async events by default [\#169](https://github.com/php-enqueue/enqueue-dev/pull/169) ([makasim](https://github.com/makasim)) +- Delay Strategy Configuration [\#162](https://github.com/php-enqueue/enqueue-dev/pull/162) ([ASKozienko](https://github.com/ASKozienko)) + ## [0.7.4](https://github.com/php-enqueue/enqueue-dev/tree/0.7.4) (2017-08-10) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.3...0.7.4) @@ -409,51 +588,89 @@ ## [0.7.2](https://github.com/php-enqueue/enqueue-dev/tree/0.7.2) (2017-08-09) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.1...0.7.2) -- AmqpConsumer::receiveBasicGet, only one message per timeout consumed [\#159](https://github.com/php-enqueue/enqueue-dev/issues/159) -- Symfony 2.8 compatability issue [\#158](https://github.com/php-enqueue/enqueue-dev/issues/158) +**Merged pull requests:** + +- \[consumption\] adjust receive and idle timeouts [\#165](https://github.com/php-enqueue/enqueue-dev/pull/165) ([makasim](https://github.com/makasim)) +- Remove maxDepth option on profiler dump. [\#164](https://github.com/php-enqueue/enqueue-dev/pull/164) ([jenkoian](https://github.com/jenkoian)) ## [0.7.1](https://github.com/php-enqueue/enqueue-dev/tree/0.7.1) (2017-08-09) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.7.0...0.7.1) -- Symfony bundle doesn't work when sending commands [\#160](https://github.com/php-enqueue/enqueue-dev/issues/160) -- \[amqp-ext\] Server connection error [\#157](https://github.com/php-enqueue/enqueue-dev/issues/157) +**Merged pull requests:** + +- Client fix command routing [\#163](https://github.com/php-enqueue/enqueue-dev/pull/163) ([makasim](https://github.com/makasim)) ## [0.7.0](https://github.com/php-enqueue/enqueue-dev/tree/0.7.0) (2017-08-07) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.6.2...0.7.0) -- \[amqp\] Move client related code to Enqueue\Client\Amqp namespace. [\#143](https://github.com/php-enqueue/enqueue-dev/issues/143) -- \[amqp\] What should we do if consumer has already subscribed but smn is trying to change consumer tag? [\#142](https://github.com/php-enqueue/enqueue-dev/issues/142) -- Find a way to retry flaky tests [\#140](https://github.com/php-enqueue/enqueue-dev/issues/140) -- \[client\] use default topic as router topic. [\#135](https://github.com/php-enqueue/enqueue-dev/issues/135) +**Merged pull requests:** + +- continue if exclusive is set to false [\#156](https://github.com/php-enqueue/enqueue-dev/pull/156) ([toooni](https://github.com/toooni)) +- \[doc\] add elastica populate bundle [\#155](https://github.com/php-enqueue/enqueue-dev/pull/155) ([makasim](https://github.com/makasim)) +- \[producer\] do not throw exception if feature not implemented and null… [\#154](https://github.com/php-enqueue/enqueue-dev/pull/154) ([makasim](https://github.com/makasim)) +- Amqp bunny [\#153](https://github.com/php-enqueue/enqueue-dev/pull/153) ([makasim](https://github.com/makasim)) +- \[amqp\] Delay Strategy [\#152](https://github.com/php-enqueue/enqueue-dev/pull/152) ([ASKozienko](https://github.com/ASKozienko)) +- \[client\] Use default as router topic. [\#151](https://github.com/php-enqueue/enqueue-dev/pull/151) ([makasim](https://github.com/makasim)) +- Amqp Tutorial [\#150](https://github.com/php-enqueue/enqueue-dev/pull/150) ([ASKozienko](https://github.com/ASKozienko)) +- Delay, ttl, priority, in producer [\#149](https://github.com/php-enqueue/enqueue-dev/pull/149) ([makasim](https://github.com/makasim)) +- \[Amqp\] Qos [\#148](https://github.com/php-enqueue/enqueue-dev/pull/148) ([ASKozienko](https://github.com/ASKozienko)) +- amqp interop client [\#144](https://github.com/php-enqueue/enqueue-dev/pull/144) ([ASKozienko](https://github.com/ASKozienko)) +- \[composer\] Add extensions to platform config. [\#139](https://github.com/php-enqueue/enqueue-dev/pull/139) ([makasim](https://github.com/makasim)) +- Amqp Interop [\#138](https://github.com/php-enqueue/enqueue-dev/pull/138) ([ASKozienko](https://github.com/ASKozienko)) ## [0.6.2](https://github.com/php-enqueue/enqueue-dev/tree/0.6.2) (2017-07-21) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.6.1...0.6.2) +**Merged pull requests:** + +- Laravel queue package [\#137](https://github.com/php-enqueue/enqueue-dev/pull/137) ([makasim](https://github.com/makasim)) +- Add AmqpLib support [\#136](https://github.com/php-enqueue/enqueue-dev/pull/136) ([fibula](https://github.com/fibula)) + ## [0.6.1](https://github.com/php-enqueue/enqueue-dev/tree/0.6.1) (2017-07-17) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.6.0...0.6.1) +**Merged pull requests:** + +- RdKafka Transport [\#134](https://github.com/php-enqueue/enqueue-dev/pull/134) ([ASKozienko](https://github.com/ASKozienko)) + ## [0.6.0](https://github.com/php-enqueue/enqueue-dev/tree/0.6.0) (2017-07-07) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.5.3...0.6.0) +**Merged pull requests:** + +- Remove previously deprecated code. [\#131](https://github.com/php-enqueue/enqueue-dev/pull/131) ([makasim](https://github.com/makasim)) +- Migrate to queue interop [\#130](https://github.com/php-enqueue/enqueue-dev/pull/130) ([makasim](https://github.com/makasim)) + ## [0.5.3](https://github.com/php-enqueue/enqueue-dev/tree/0.5.3) (2017-07-06) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.5.2...0.5.3) -- \[Symfony\] Symfony 3.3 / 4.x compatibility for ProxyEventDispatcher [\#109](https://github.com/php-enqueue/enqueue-dev/issues/109) +**Merged pull requests:** + +- \[bundle\] Extend EventDispatcher instead of container aware one. [\#129](https://github.com/php-enqueue/enqueue-dev/pull/129) ([makasim](https://github.com/makasim)) ## [0.5.2](https://github.com/php-enqueue/enqueue-dev/tree/0.5.2) (2017-07-03) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.5.1...0.5.2) +**Merged pull requests:** + +- \[client\] Send exclusive commands to their queues directly, by passing… [\#127](https://github.com/php-enqueue/enqueue-dev/pull/127) ([makasim](https://github.com/makasim)) +- \[symfony\] Extract DriverFactoryInterface from TransportFactoryInterface. [\#126](https://github.com/php-enqueue/enqueue-dev/pull/126) ([makasim](https://github.com/makasim)) + ## [0.5.1](https://github.com/php-enqueue/enqueue-dev/tree/0.5.1) (2017-06-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.5.0...0.5.1) -- \[doc\] add a doc for client message scopes [\#56](https://github.com/php-enqueue/enqueue-dev/issues/56) +**Merged pull requests:** -- \[client\] Command, Event segregation. [\#105](https://github.com/php-enqueue/enqueue-dev/issues/105) +- Add Gearman transport. [\#125](https://github.com/php-enqueue/enqueue-dev/pull/125) ([makasim](https://github.com/makasim)) ## [0.5.0](https://github.com/php-enqueue/enqueue-dev/tree/0.5.0) (2017-06-26) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.20...0.5.0) -- DBAL Transport: polling\_interval not taken into account [\#121](https://github.com/php-enqueue/enqueue-dev/issues/121) +**Merged pull requests:** + +- \[client\] Merge experimental ProducerV2 methods to Producer interface. [\#124](https://github.com/php-enqueue/enqueue-dev/pull/124) ([makasim](https://github.com/makasim)) +- \[WIP\]\[beanstalk\] Add transport for beanstalkd [\#123](https://github.com/php-enqueue/enqueue-dev/pull/123) ([makasim](https://github.com/makasim)) +- fix dbal polling interval configuration option [\#122](https://github.com/php-enqueue/enqueue-dev/pull/122) ([ASKozienko](https://github.com/ASKozienko)) ## [0.4.20](https://github.com/php-enqueue/enqueue-dev/tree/0.4.20) (2017-06-20) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.19...0.4.20) @@ -464,173 +681,287 @@ ## [0.4.18](https://github.com/php-enqueue/enqueue-dev/tree/0.4.18) (2017-06-20) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.17...0.4.18) +**Merged pull requests:** + +- \[client\] Add ability to define a command as exclusive [\#120](https://github.com/php-enqueue/enqueue-dev/pull/120) ([makasim](https://github.com/makasim)) + ## [0.4.17](https://github.com/php-enqueue/enqueue-dev/tree/0.4.17) (2017-06-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.16...0.4.17) -- \[RabbitMQ\] High resource usage in AmqpConsumer::receiveBasicGet\(\) [\#116](https://github.com/php-enqueue/enqueue-dev/issues/116) +**Merged pull requests:** + +- \[simple-client\] Allow processor instance bind. [\#119](https://github.com/php-enqueue/enqueue-dev/pull/119) ([makasim](https://github.com/makasim)) +- \[amqp\] Add 'receive\_method' to amqp transport factory. [\#118](https://github.com/php-enqueue/enqueue-dev/pull/118) ([makasim](https://github.com/makasim)) +- \[amqp\] Fixes high CPU consumption when basic get is used [\#117](https://github.com/php-enqueue/enqueue-dev/pull/117) ([makasim](https://github.com/makasim)) ## [0.4.16](https://github.com/php-enqueue/enqueue-dev/tree/0.4.16) (2017-06-16) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.15...0.4.16) +**Merged pull requests:** + +- ProducerV2 For SimpleClient [\#115](https://github.com/php-enqueue/enqueue-dev/pull/115) ([ASKozienko](https://github.com/ASKozienko)) + ## [0.4.15](https://github.com/php-enqueue/enqueue-dev/tree/0.4.15) (2017-06-14) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.14...0.4.15) -- Symfony async events. Support event subscribers. [\#94](https://github.com/php-enqueue/enqueue-dev/issues/94) +**Merged pull requests:** + +- RPC Deletes Reply Queue After Receive Message [\#114](https://github.com/php-enqueue/enqueue-dev/pull/114) ([ASKozienko](https://github.com/ASKozienko)) ## [0.4.14](https://github.com/php-enqueue/enqueue-dev/tree/0.4.14) (2017-06-09) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.13...0.4.14) +**Merged pull requests:** + +- \[RFC\]\[client\] Add ability to send events or commands. [\#113](https://github.com/php-enqueue/enqueue-dev/pull/113) ([makasim](https://github.com/makasim)) + ## [0.4.13](https://github.com/php-enqueue/enqueue-dev/tree/0.4.13) (2017-06-09) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.12...0.4.13) -- \[amqp\] Consumer always gets the queue the consume callback was called on. [\#110](https://github.com/php-enqueue/enqueue-dev/issues/110) +**Merged pull requests:** + +- \[amqp\] Add ability to choose what receive method to use: basic\_get or basic\_consume. [\#112](https://github.com/php-enqueue/enqueue-dev/pull/112) ([makasim](https://github.com/makasim)) ## [0.4.12](https://github.com/php-enqueue/enqueue-dev/tree/0.4.12) (2017-06-08) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.11...0.4.12) +**Merged pull requests:** + +- \[amqp\]\[hotfix\] Switch to AMQP' basic.get till the issue with basic.consume is solved. [\#111](https://github.com/php-enqueue/enqueue-dev/pull/111) ([makasim](https://github.com/makasim)) +- \[amqp\] Add pre\_fetch\_count, pre\_fetch\_size options. [\#108](https://github.com/php-enqueue/enqueue-dev/pull/108) ([makasim](https://github.com/makasim)) + ## [0.4.11](https://github.com/php-enqueue/enqueue-dev/tree/0.4.11) (2017-05-30) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.10...0.4.11) -- \[amqp\] Get message count [\#64](https://github.com/php-enqueue/enqueue-dev/issues/64) +**Merged pull requests:** + +- \[bundle\] Fix "Incompatible use of dynamic environment variables "ENQUEUE\_DSN" found in parameters." [\#107](https://github.com/php-enqueue/enqueue-dev/pull/107) ([makasim](https://github.com/makasim)) ## [0.4.10](https://github.com/php-enqueue/enqueue-dev/tree/0.4.10) (2017-05-26) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.9...0.4.10) -- \[RabbitMQ\] support for wildcard topics \("topic exchange"\) [\#65](https://github.com/php-enqueue/enqueue-dev/issues/65) +**Merged pull requests:** + +- \[dbal\] Add DSN support. [\#104](https://github.com/php-enqueue/enqueue-dev/pull/104) ([makasim](https://github.com/makasim)) +- Calling AmqpContext::declareQueue\(\) now returns an integer holding the queue message count [\#66](https://github.com/php-enqueue/enqueue-dev/pull/66) ([J7mbo](https://github.com/J7mbo)) ## [0.4.9](https://github.com/php-enqueue/enqueue-dev/tree/0.4.9) (2017-05-25) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.8...0.4.9) -- \[client\]\[dx\] Message constructor must accept body, properties and headers.` [\#88](https://github.com/php-enqueue/enqueue-dev/issues/88) +**Merged pull requests:** -- filesystem dsn must have one more / [\#99](https://github.com/php-enqueue/enqueue-dev/issues/99) - -- Code duplication inside messages [\#96](https://github.com/php-enqueue/enqueue-dev/issues/96) +- \[transport\] Fs transport dsn must contain one extra "/" [\#103](https://github.com/php-enqueue/enqueue-dev/pull/103) ([makasim](https://github.com/makasim)) +- Add message spec test case [\#102](https://github.com/php-enqueue/enqueue-dev/pull/102) ([makasim](https://github.com/makasim)) ## [0.4.8](https://github.com/php-enqueue/enqueue-dev/tree/0.4.8) (2017-05-24) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.6...0.4.8) +**Merged pull requests:** + +- \[client\] Fixes edge cases in client's routing logic. [\#101](https://github.com/php-enqueue/enqueue-dev/pull/101) ([makasim](https://github.com/makasim)) +- \[bundle\] Auto register reply extension. [\#100](https://github.com/php-enqueue/enqueue-dev/pull/100) ([makasim](https://github.com/makasim)) +- Do pkg release if there are changes in it. [\#98](https://github.com/php-enqueue/enqueue-dev/pull/98) ([makasim](https://github.com/makasim)) + ## [0.4.6](https://github.com/php-enqueue/enqueue-dev/tree/0.4.6) (2017-05-23) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.5...0.4.6) ## [0.4.5](https://github.com/php-enqueue/enqueue-dev/tree/0.4.5) (2017-05-22) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.4...0.4.5) +**Merged pull requests:** + +- Symfony. Async event subscriber. [\#95](https://github.com/php-enqueue/enqueue-dev/pull/95) ([makasim](https://github.com/makasim)) + ## [0.4.4](https://github.com/php-enqueue/enqueue-dev/tree/0.4.4) (2017-05-20) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.3...0.4.4) +**Merged pull requests:** + +- Symfony. Async event dispatching [\#86](https://github.com/php-enqueue/enqueue-dev/pull/86) ([makasim](https://github.com/makasim)) + ## [0.4.3](https://github.com/php-enqueue/enqueue-dev/tree/0.4.3) (2017-05-18) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.2...0.4.3) -- \[Performance, DX\] Add a message pool [\#91](https://github.com/php-enqueue/enqueue-dev/issues/91) -- \[bundle\] Show only part of the message body. Add a button show the whole message body. [\#90](https://github.com/php-enqueue/enqueue-dev/issues/90) +**Merged pull requests:** + +- \[client\] SpoolProducer [\#93](https://github.com/php-enqueue/enqueue-dev/pull/93) ([makasim](https://github.com/makasim)) +- Add some handy functions. Improve READMEs [\#92](https://github.com/php-enqueue/enqueue-dev/pull/92) ([makasim](https://github.com/makasim)) +- Run phpstan and php-cs-fixer on travis [\#85](https://github.com/php-enqueue/enqueue-dev/pull/85) ([makasim](https://github.com/makasim)) ## [0.4.2](https://github.com/php-enqueue/enqueue-dev/tree/0.4.2) (2017-05-15) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.1...0.4.2) +**Merged pull requests:** + +- Add dsn\_to\_connection\_factory and dsn\_to\_context functions. [\#84](https://github.com/php-enqueue/enqueue-dev/pull/84) ([makasim](https://github.com/makasim)) +- Add ability to set transport DSN directly to default transport factory. [\#81](https://github.com/php-enqueue/enqueue-dev/pull/81) ([makasim](https://github.com/makasim)) +- \[bundle\] Set null transport as default. Prevent errors on bundle install. [\#77](https://github.com/php-enqueue/enqueue-dev/pull/77) ([makasim](https://github.com/makasim)) + ## [0.4.1](https://github.com/php-enqueue/enqueue-dev/tree/0.4.1) (2017-05-12) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.4.0...0.4.1) ## [0.4.0](https://github.com/php-enqueue/enqueue-dev/tree/0.4.0) (2017-05-12) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.8...0.4.0) -- \[Extensions\] extensions priority [\#79](https://github.com/php-enqueue/enqueue-dev/issues/79) +**Merged pull requests:** + +- \[fs\] add DSN support [\#82](https://github.com/php-enqueue/enqueue-dev/pull/82) ([makasim](https://github.com/makasim)) +- \[amqp\] Configure by string DSN. [\#80](https://github.com/php-enqueue/enqueue-dev/pull/80) ([makasim](https://github.com/makasim)) +- \[fs\] Filesystem transport must create a storage dir if it does not exists. [\#78](https://github.com/php-enqueue/enqueue-dev/pull/78) ([makasim](https://github.com/makasim)) +- \[magento\] Add basic docs for enqueue magento extension. [\#76](https://github.com/php-enqueue/enqueue-dev/pull/76) ([makasim](https://github.com/makasim)) ## [0.3.8](https://github.com/php-enqueue/enqueue-dev/tree/0.3.8) (2017-05-10) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.7...0.3.8) -- Add support for production extensions [\#70](https://github.com/php-enqueue/enqueue-dev/issues/70) +**Merged pull requests:** + +- Multi Transport Simple Client [\#75](https://github.com/php-enqueue/enqueue-dev/pull/75) ([ASKozienko](https://github.com/ASKozienko)) +- Client Extensions [\#72](https://github.com/php-enqueue/enqueue-dev/pull/72) ([ASKozienko](https://github.com/ASKozienko)) ## [0.3.7](https://github.com/php-enqueue/enqueue-dev/tree/0.3.7) (2017-05-04) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.6...0.3.7) -- \[rpc\] RpcClient must check existence of createTemporaryQueue. It is not part of transport interface [\#49](https://github.com/php-enqueue/enqueue-dev/issues/49) +**Merged pull requests:** -- JobQueue/Job shouldn't be required when Doctrine schema update [\#67](https://github.com/php-enqueue/enqueue-dev/issues/67) +- JobQueue/Job shouldn't be required when Doctrine schema update [\#71](https://github.com/php-enqueue/enqueue-dev/pull/71) ([ASKozienko](https://github.com/ASKozienko)) ## [0.3.6](https://github.com/php-enqueue/enqueue-dev/tree/0.3.6) (2017-04-28) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.5...0.3.6) +**Merged pull requests:** + +- Amazon SQS Transport [\#60](https://github.com/php-enqueue/enqueue-dev/pull/60) ([ASKozienko](https://github.com/ASKozienko)) + ## [0.3.5](https://github.com/php-enqueue/enqueue-dev/tree/0.3.5) (2017-04-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.4...0.3.5) -- \[client\] Queue subscriber interface. [\#53](https://github.com/php-enqueue/enqueue-dev/issues/53) -- Additional drivers [\#32](https://github.com/php-enqueue/enqueue-dev/issues/32) +**Merged pull requests:** -- Multiple consumer handling one message [\#62](https://github.com/php-enqueue/enqueue-dev/issues/62) +- \[consumption\] Add support of QueueSubscriberInterface to transport consume command. [\#63](https://github.com/php-enqueue/enqueue-dev/pull/63) ([makasim](https://github.com/makasim)) +- \[client\] Add ability to hardcode queue name. It is used as is and not adjusted or modified in any way [\#61](https://github.com/php-enqueue/enqueue-dev/pull/61) ([makasim](https://github.com/makasim)) ## [0.3.4](https://github.com/php-enqueue/enqueue-dev/tree/0.3.4) (2017-04-24) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.3...0.3.4) +**Merged pull requests:** + +- DBAL Transport [\#54](https://github.com/php-enqueue/enqueue-dev/pull/54) ([ASKozienko](https://github.com/ASKozienko)) + ## [0.3.3](https://github.com/php-enqueue/enqueue-dev/tree/0.3.3) (2017-04-21) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.2...0.3.3) -- Move some dependencies to dev section [\#57](https://github.com/php-enqueue/enqueue-dev/issues/57) +**Merged pull requests:** + +- \[client\] Redis driver [\#59](https://github.com/php-enqueue/enqueue-dev/pull/59) ([makasim](https://github.com/makasim)) +- Redis transport. [\#55](https://github.com/php-enqueue/enqueue-dev/pull/55) ([makasim](https://github.com/makasim)) ## [0.3.2](https://github.com/php-enqueue/enqueue-dev/tree/0.3.2) (2017-04-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.1...0.3.2) +**Merged pull requests:** + +- share simple client context [\#52](https://github.com/php-enqueue/enqueue-dev/pull/52) ([ASKozienko](https://github.com/ASKozienko)) + ## [0.3.1](https://github.com/php-enqueue/enqueue-dev/tree/0.3.1) (2017-04-12) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.3.0...0.3.1) -- \[client\] Rename MessageProducer to Producer. To be similar what Psr has [\#42](https://github.com/php-enqueue/enqueue-dev/issues/42) +**Merged pull requests:** -- \[transport\] Add Psr prefix to transport interfaces. [\#44](https://github.com/php-enqueue/enqueue-dev/issues/44) +- \[client\] Add RpcClient on client level. [\#50](https://github.com/php-enqueue/enqueue-dev/pull/50) ([makasim](https://github.com/makasim)) ## [0.3.0](https://github.com/php-enqueue/enqueue-dev/tree/0.3.0) (2017-04-07) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.12...0.3.0) +**Merged pull requests:** + +- Remove deprecated stuff [\#48](https://github.com/php-enqueue/enqueue-dev/pull/48) ([makasim](https://github.com/makasim)) + ## [0.2.12](https://github.com/php-enqueue/enqueue-dev/tree/0.2.12) (2017-04-07) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.11...0.2.12) -- \[consumption\] Need an extension point after the message is processed but before the ack\reject actually is done. [\#43](https://github.com/php-enqueue/enqueue-dev/issues/43) +**Merged pull requests:** + +- \[client\] Rename MessageProducer classes to Producer [\#47](https://github.com/php-enqueue/enqueue-dev/pull/47) ([makasim](https://github.com/makasim)) +- \[consumption\] Add onResult extension point. [\#46](https://github.com/php-enqueue/enqueue-dev/pull/46) ([makasim](https://github.com/makasim)) +- \[transport\] Add Psr prefix to transport interfaces. Deprecates old ones. [\#45](https://github.com/php-enqueue/enqueue-dev/pull/45) ([makasim](https://github.com/makasim)) ## [0.2.11](https://github.com/php-enqueue/enqueue-dev/tree/0.2.11) (2017-04-05) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.10...0.2.11) +**Merged pull requests:** + +- \[client\] Add ability to define scope of send message. [\#40](https://github.com/php-enqueue/enqueue-dev/pull/40) ([makasim](https://github.com/makasim)) + ## [0.2.10](https://github.com/php-enqueue/enqueue-dev/tree/0.2.10) (2017-04-03) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.9...0.2.10) ## [0.2.9](https://github.com/php-enqueue/enqueue-dev/tree/0.2.9) (2017-04-03) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.8...0.2.9) +**Merged pull requests:** + +- \[bundle\] Fix extensions priority ordering. Must be from high to low. [\#38](https://github.com/php-enqueue/enqueue-dev/pull/38) ([makasim](https://github.com/makasim)) + ## [0.2.8](https://github.com/php-enqueue/enqueue-dev/tree/0.2.8) (2017-04-03) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.7...0.2.8) -- Do not print "Idle" when consumer is run with debug level \(-vvv\) [\#35](https://github.com/php-enqueue/enqueue-dev/issues/35) -- \[amqp\] Move RabbitMQ specific logic from AmqpDriver to RabbitMQAmqpDriver. [\#20](https://github.com/php-enqueue/enqueue-dev/issues/20) -- \[filesystem\] Consumer::receive method impr. Add file\_size check to the loop [\#15](https://github.com/php-enqueue/enqueue-dev/issues/15) +**Merged pull requests:** -- \[client\] DelayRedeliveredMessagesExtension must do nothing if the result\status has been already set [\#36](https://github.com/php-enqueue/enqueue-dev/issues/36) - -- Invalid typehint for Enqueue\Client\Message::setBody [\#31](https://github.com/php-enqueue/enqueue-dev/issues/31) +- Improvements and fixes [\#37](https://github.com/php-enqueue/enqueue-dev/pull/37) ([makasim](https://github.com/makasim)) +- fix fsdriver router topic name [\#34](https://github.com/php-enqueue/enqueue-dev/pull/34) ([bendavies](https://github.com/bendavies)) +- run php-cs-fixer [\#33](https://github.com/php-enqueue/enqueue-dev/pull/33) ([bendavies](https://github.com/bendavies)) ## [0.2.7](https://github.com/php-enqueue/enqueue-dev/tree/0.2.7) (2017-03-18) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.6...0.2.7) +**Merged pull requests:** + +- \[client\] Allow send objects that implements \JsonSerializable interface. [\#30](https://github.com/php-enqueue/enqueue-dev/pull/30) ([makasim](https://github.com/makasim)) + ## [0.2.6](https://github.com/php-enqueue/enqueue-dev/tree/0.2.6) (2017-03-14) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.5...0.2.6) -- \[bundle\]\[doc\] desctibe message processor's tag options. [\#23](https://github.com/php-enqueue/enqueue-dev/issues/23) +**Merged pull requests:** + +- Fix Simple Client [\#29](https://github.com/php-enqueue/enqueue-dev/pull/29) ([ASKozienko](https://github.com/ASKozienko)) +- Update quick\_tour.md add Bundle to AppKernel [\#26](https://github.com/php-enqueue/enqueue-dev/pull/26) ([jverdeyen](https://github.com/jverdeyen)) +- \[doc\] Add docs about message processors. [\#24](https://github.com/php-enqueue/enqueue-dev/pull/24) ([makasim](https://github.com/makasim)) +- Fix unclear sentences in docs [\#21](https://github.com/php-enqueue/enqueue-dev/pull/21) ([cirnatdan](https://github.com/cirnatdan)) ## [0.2.5](https://github.com/php-enqueue/enqueue-dev/tree/0.2.5) (2017-01-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.4...0.2.5) -- \[amqp\]\[bug\] Consumer received message targeted for another consumer of this same channel [\#13](https://github.com/php-enqueue/enqueue-dev/issues/13) +**Merged pull requests:** -- \[travis\] Test against different Symfony versions, at least 2.8, 3.0, 3.1 [\#17](https://github.com/php-enqueue/enqueue-dev/issues/17) -- \[docker\] Build images for all containers that built from Dockerfiles. [\#16](https://github.com/php-enqueue/enqueue-dev/issues/16) +- \[amqp\] Put in buffer not our message. Continue consumption. [\#22](https://github.com/php-enqueue/enqueue-dev/pull/22) ([makasim](https://github.com/makasim)) +- \[travis\] Run test with different Symfony versions. 2.8, 3.0 [\#19](https://github.com/php-enqueue/enqueue-dev/pull/19) ([makasim](https://github.com/makasim)) +- \[fs\] Add missing enqueue/psr-queue package to composer.json. [\#18](https://github.com/php-enqueue/enqueue-dev/pull/18) ([makasim](https://github.com/makasim)) ## [0.2.4](https://github.com/php-enqueue/enqueue-dev/tree/0.2.4) (2017-01-18) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.3...0.2.4) +**Merged pull requests:** + +- \[consumption\]\[bug\] Receive timeout is in milliseconds. Set it to 5000.… [\#14](https://github.com/php-enqueue/enqueue-dev/pull/14) ([makasim](https://github.com/makasim)) +- Filesystem transport [\#12](https://github.com/php-enqueue/enqueue-dev/pull/12) ([makasim](https://github.com/makasim)) +- \[consumption\] Do not print "Switch to queue xxx" if queue the same. [\#11](https://github.com/php-enqueue/enqueue-dev/pull/11) ([makasim](https://github.com/makasim)) + ## [0.2.3](https://github.com/php-enqueue/enqueue-dev/tree/0.2.3) (2017-01-09) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.2...0.2.3) +**Merged pull requests:** + +- Auto generate changelog [\#10](https://github.com/php-enqueue/enqueue-dev/pull/10) ([makasim](https://github.com/makasim)) +- \[travis\] Cache docker images on travis. [\#9](https://github.com/php-enqueue/enqueue-dev/pull/9) ([makasim](https://github.com/makasim)) +- \[enhancement\]\[amqp-ext\] Add purge queue method to amqp context. [\#8](https://github.com/php-enqueue/enqueue-dev/pull/8) ([makasim](https://github.com/makasim)) +- \[bug\]\[amqp-ext\] Receive timeout parameter is miliseconds [\#7](https://github.com/php-enqueue/enqueue-dev/pull/7) ([makasim](https://github.com/makasim)) + ## [0.2.2](https://github.com/php-enqueue/enqueue-dev/tree/0.2.2) (2017-01-06) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.1...0.2.2) -- Amqp lazy connection [\#4](https://github.com/php-enqueue/enqueue-dev/issues/4) +**Merged pull requests:** + +- \[amqp\] introduce lazy context. [\#6](https://github.com/php-enqueue/enqueue-dev/pull/6) ([makasim](https://github.com/makasim)) ## [0.2.1](https://github.com/php-enqueue/enqueue-dev/tree/0.2.1) (2017-01-05) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.2.0...0.2.1) @@ -638,6 +969,12 @@ ## [0.2.0](https://github.com/php-enqueue/enqueue-dev/tree/0.2.0) (2017-01-05) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.1.0...0.2.0) +**Merged pull requests:** + +- Upd php cs fixer [\#3](https://github.com/php-enqueue/enqueue-dev/pull/3) ([makasim](https://github.com/makasim)) +- \[psr\] Introduce MessageProcessor interface \(moved from consumption\). [\#2](https://github.com/php-enqueue/enqueue-dev/pull/2) ([makasim](https://github.com/makasim)) +- \[bundle\] Add ability to disable signal extension. [\#1](https://github.com/php-enqueue/enqueue-dev/pull/1) ([makasim](https://github.com/makasim)) + ## [0.1.0](https://github.com/php-enqueue/enqueue-dev/tree/0.1.0) (2016-12-29) From 0f204de7e6a058b6a13ecb976c32ec2159798484 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 27 Nov 2018 14:35:58 +0200 Subject: [PATCH 0455/1142] update release scripts. --- bin/changelog | 13 +++++++++++++ bin/dev | 5 +---- bin/release | 10 +++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100755 bin/changelog diff --git a/bin/changelog b/bin/changelog new file mode 100755 index 000000000..8a9296175 --- /dev/null +++ b/bin/changelog @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e + +if (( "$#" != 1 )) +then + echo "Tag has to be provided" + exit 1 +fi + +docker-compose run -e CHANGELOG_GITHUB_TOKEN=${CHANGELOG_GITHUB_TOKEN:-""} --workdir="/mqdev" --rm generate-changelog github_changelog_generator --future-release "$1" --no-issues --unreleased-only --output "CHANGELOG_FUTURE.md" + +#git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRENT_BRANCH" \ No newline at end of file diff --git a/bin/dev b/bin/dev index 462332e6f..e5f40ffbd 100755 --- a/bin/dev +++ b/bin/dev @@ -3,7 +3,7 @@ set -x set -e -while getopts "bustefcdp" OPTION; do +while getopts "bustefdp" OPTION; do case $OPTION in b) docker-compose pull && docker-compose build @@ -20,9 +20,6 @@ while getopts "bustefcdp" OPTION; do f) ./bin/php-cs-fixer fix ;; - c) - docker-compose run -e CHANGELOG_GITHUB_TOKEN=${CHANGELOG_GITHUB_TOKEN:-""} --workdir="/mqdev" --rm generate-changelog github_changelog_generator --release-branch="$3" --future-release "$2" --simple-list - ;; d) docker-compose run --workdir="/mqdev" --rm dev php pkg/enqueue-bundle/Tests/Functional/app/console.php config:dump-reference enqueue -vvv ;; diff --git a/bin/release b/bin/release index 5bee5e195..818f0c27f 100755 --- a/bin/release +++ b/bin/release @@ -8,9 +8,17 @@ then exit 1 fi + +if [ ! -f ./CHANGELOG_FUTURE.md ]; then + echo "Release changelog has not been generated. File CHANGELOG_FUTURE.md does not exist." + exit 1 +fi + +rm ./CHANGELOG_FUTURE.md + CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD` -./bin/dev -c $1 "$CURRENT_BRANCH" && git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRENT_BRANCH" +git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRENT_BRANCH" ./bin/subtree-split From 3efa4340d4775ff903d95d23ef3660706f0d6cbe Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Tue, 27 Nov 2018 15:49:48 +0200 Subject: [PATCH 0456/1142] Update release --- bin/release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/release b/bin/release index 818f0c27f..4ef1a760a 100755 --- a/bin/release +++ b/bin/release @@ -22,7 +22,7 @@ git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRE ./bin/subtree-split -for REMOTE in origin stomp amqp-ext amqp-lib amqp-bunny amqp-tools pheanstalk gearman sqs gps fs redis dbal null rdkafka enqueue simple-client enqueue-bundle job-queue test async-event-dispatcher mongodb +for REMOTE in origin stomp amqp-ext amqp-lib amqp-bunny amqp-tools pheanstalk gearman sqs gps fs redis dbal null rdkafka enqueue simple-client enqueue-bundle job-queue test async-event-dispatcher mongodb wamp monitoring do echo "" echo "" From 2802f420771a71ec39c4feaadb5e1051b0d25728 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 27 Nov 2018 19:54:18 +0200 Subject: [PATCH 0457/1142] Allow installing stable dependencies. --- pkg/amqp-bunny/composer.json | 2 +- pkg/amqp-ext/composer.json | 2 +- pkg/amqp-lib/composer.json | 2 +- pkg/async-command/composer.json | 2 +- pkg/async-event-dispatcher/composer.json | 2 +- pkg/enqueue-bundle/composer.json | 4 ++-- pkg/enqueue/composer.json | 4 ++-- pkg/fs/composer.json | 2 +- pkg/gps/composer.json | 2 +- pkg/job-queue/composer.json | 2 +- pkg/monitoring/composer.json | 2 +- pkg/redis/composer.json | 2 +- pkg/simple-client/composer.json | 2 +- pkg/sqs/composer.json | 2 +- pkg/stomp/composer.json | 2 +- pkg/wamp/composer.json | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 7bda3946e..086db9534 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -10,7 +10,7 @@ "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7", "bunny/bunny": "^0.2.4|^0.3|^0.4", - "enqueue/amqp-tools": "0.9.x-dev" + "enqueue/amqp-tools": "^0.9" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 5bedd525c..6dcdd96e2 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -10,7 +10,7 @@ "ext-amqp": "^1.9.3", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7", - "enqueue/amqp-tools": "0.9.x-dev" + "enqueue/amqp-tools": "^0.9" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index eb4848248..415ca9f23 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "php-amqplib/php-amqplib": "^2.8", "queue-interop/amqp-interop": "^0.8", - "enqueue/amqp-tools": "0.9.x-dev" + "enqueue/amqp-tools": "^0.9" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 8e44fe39b..5d93f47b1 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": ">=7.1", - "enqueue/enqueue": "0.9.x-dev", + "enqueue/enqueue": "^0.9", "queue-interop/queue-interop": "^0.7", "symfony/console": "^3.4|^4", "symfony/process": "^3.4|^4" diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index 2c9d253e8..ca63adfb0 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/enqueue": "0.9.x-dev", + "enqueue/enqueue": "^0.9", "queue-interop/queue-interop": "^0.7", "symfony/event-dispatcher": "^3.4|^4" }, diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 4ca94b6ef..c74197602 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -10,8 +10,8 @@ "symfony/framework-bundle": "^3.4|^4", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7", - "enqueue/enqueue": "0.9.x-dev", - "enqueue/null": "0.9.x-dev" + "enqueue/enqueue": "^0.9", + "enqueue/null": "^0.9" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 31b2159fd..26d147705 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -9,8 +9,8 @@ "php": "^7.1.3", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7", - "enqueue/null": "0.9.x-dev", - "enqueue/dsn": "0.9.x-dev", + "enqueue/null": "^0.9", + "enqueue/dsn": "^0.9", "ramsey/uuid": "^2|^3.5", "psr/log": "^1", "psr/container": "^1" diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index cb7cd4732..0be58949c 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/queue-interop": "^0.7", - "enqueue/dsn": "0.9.x-dev", + "enqueue/dsn": "^0.9", "symfony/filesystem": "^3.4|^4", "makasim/temp-file": "^0.2@stable" }, diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index bb37b07e3..295ae105f 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "queue-interop/queue-interop": "^0.7", "google/cloud-pubsub": "^1.0", - "enqueue/dsn": "0.9.x-dev" + "enqueue/dsn": "^0.9" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 54efca4a4..3ade4f79a 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/enqueue": "0.9.x-dev", + "enqueue/enqueue": "^0.9", "enqueue/null": "0.9.x-dev", "queue-interop/queue-interop": "^0.7", "doctrine/orm": "~2.4" diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index 11a4b70db..e31ecbc11 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/enqueue": "0.9.x-dev", + "enqueue/enqueue": "^0.9", "ramsey/uuid": "^3", "enqueue/dsn": "0.9.x-dev" }, diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 41931ffa8..0b0a3a37b 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/queue-interop": "^0.7", - "enqueue/dsn": "0.9.x-dev", + "enqueue/dsn": "^0.9", "ramsey/uuid": "^3" }, "require-dev": { diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index e204c0586..a4bbc478b 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/enqueue": "0.9.x-dev", + "enqueue/enqueue": "^0.9", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7", "symfony/config": "^3.4|^4" diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index c6c4d07fe..ec8388c4f 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/queue-interop": "^0.7", - "enqueue/dsn": "0.9.x-dev", + "enqueue/dsn": "^0.9", "aws/aws-sdk-php": "~3.26" }, "require-dev": { diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index ba79e4c2f..4efde62d7 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/dsn": "0.9.x-dev", + "enqueue/dsn": "^0.9", "stomp-php/stomp-php": "^4", "queue-interop/queue-interop": "^0.7", "php-http/guzzle6-adapter": "^1.1", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 62a48c735..7c2f15e64 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/queue-interop": "^0.7", - "enqueue/dsn": "0.9.x-dev", + "enqueue/dsn": "^0.9", "thruway/pawl-transport": "^0.5.0", "voryx/thruway": "^0.5.3" }, From cb73828d4f4308c7ec59e9feb67563a3584a7fca Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 27 Nov 2018 20:48:32 +0200 Subject: [PATCH 0458/1142] Release 0.9.1 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72facd237..6eeafc0a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## [0.9.1](https://github.com/php-enqueue/enqueue-dev/tree/0.9.1) (2018-11-27) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.0...0.9.1) + +**Merged pull requests:** + +- Allow installing stable dependencies. [\#660](https://github.com/php-enqueue/enqueue-dev/pull/660) ([makasim](https://github.com/makasim)) + ## [0.9.0](https://github.com/php-enqueue/enqueue-dev/tree/0.9) (2018-11-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.8.42...0.9) From 9d8c38701fc25c8882e4bb8bf5107a1c72369bea Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Tue, 27 Nov 2018 20:55:06 +0200 Subject: [PATCH 0459/1142] Update release --- bin/release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/release b/bin/release index 4ef1a760a..95e331bd0 100755 --- a/bin/release +++ b/bin/release @@ -22,7 +22,7 @@ git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRE ./bin/subtree-split -for REMOTE in origin stomp amqp-ext amqp-lib amqp-bunny amqp-tools pheanstalk gearman sqs gps fs redis dbal null rdkafka enqueue simple-client enqueue-bundle job-queue test async-event-dispatcher mongodb wamp monitoring +for REMOTE in origin stomp amqp-ext amqp-lib amqp-bunny amqp-tools pheanstalk gearman sqs gps fs redis dbal null rdkafka enqueue simple-client enqueue-bundle job-queue test async-event-dispatcher mongodb wamp monitoring dsn do echo "" echo "" From abbd1a7552edd77d635c1faff3e37bd9ca585972 Mon Sep 17 00:00:00 2001 From: Marko Kunic Date: Wed, 28 Nov 2018 17:29:36 +0000 Subject: [PATCH 0460/1142] Update Dsn.php --- pkg/dsn/Dsn.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkg/dsn/Dsn.php b/pkg/dsn/Dsn.php index 338ec19af..a5cc139b2 100644 --- a/pkg/dsn/Dsn.php +++ b/pkg/dsn/Dsn.php @@ -80,16 +80,6 @@ public function __construct( $this->queryBag = new QueryBag($query); } -// public function __toString(): string -// { -// return $this->dsn; -// } -// -// public function getDsn(): string -// { -// return $this->dsn; -// } - public function getScheme(): string { return $this->scheme; From 047a7a8117f67f12d8fecf6d78f2f8159c2ed38c Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Thu, 29 Nov 2018 11:39:09 +0200 Subject: [PATCH 0461/1142] Update release --- bin/release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/release b/bin/release index 95e331bd0..41735ff64 100755 --- a/bin/release +++ b/bin/release @@ -22,7 +22,7 @@ git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRE ./bin/subtree-split -for REMOTE in origin stomp amqp-ext amqp-lib amqp-bunny amqp-tools pheanstalk gearman sqs gps fs redis dbal null rdkafka enqueue simple-client enqueue-bundle job-queue test async-event-dispatcher mongodb wamp monitoring dsn +for REMOTE in origin stomp amqp-ext amqp-lib amqp-bunny amqp-tools pheanstalk gearman sqs gps fs redis dbal null rdkafka enqueue simple-client enqueue-bundle job-queue test async-event-dispatcher async-command mongodb wamp monitoring dsn do echo "" echo "" From 3aace61432188e1539cabd77db49d94103e4b901 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 30 Nov 2018 14:22:06 +0200 Subject: [PATCH 0462/1142] [sqs] Use a queue created in another AWS account. --- pkg/sqs/SqsConnectionFactory.php | 23 ++++--- pkg/sqs/SqsContext.php | 17 +++-- pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php | 21 ++++++ ...dAndReceiveDelayedMessageFromQueueTest.php | 25 ++----- .../Spec/SqsSendToAndReceiveFromQueueTest.php | 25 ++----- .../Spec/SqsSendToAndReceiveFromTopicTest.php | 25 ++----- ...SqsSendToAndReceiveNoWaitFromQueueTest.php | 32 +++++++-- ...SqsSendToAndReceiveNoWaitFromTopicTest.php | 32 +++++++-- .../SqsSendToTopicAndReceiveFromQueueTest.php | 37 ++++++++-- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 37 ++++++++-- .../Tests/SqsConnectionFactoryConfigTest.php | 7 ++ pkg/sqs/Tests/SqsConnectionFactoryTest.php | 5 +- pkg/sqs/Tests/SqsContextTest.php | 68 ++++++++++++++----- 13 files changed, 231 insertions(+), 123 deletions(-) create mode 100644 pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php diff --git a/pkg/sqs/SqsConnectionFactory.php b/pkg/sqs/SqsConnectionFactory.php index 5f626c368..82e8f1ae1 100644 --- a/pkg/sqs/SqsConnectionFactory.php +++ b/pkg/sqs/SqsConnectionFactory.php @@ -23,14 +23,15 @@ class SqsConnectionFactory implements ConnectionFactory /** * $config = [ - * 'key' => null - AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. - * 'secret' => null, - AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. - * 'token' => null, - AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. - * 'region' => null, - (string, required) Region to connect to. See http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of available regions. - * 'retries' => 3, - (int, default=int(3)) Configures the maximum number of allowed retries for a client (pass 0 to disable retries). - * 'version' => '2012-11-05', - (string, required) The version of the webservice to utilize - * 'lazy' => true, - Enable lazy connection (boolean) - * 'endpoint' => null - (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack + * 'key' => null AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'secret' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'token' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'region' => null, (string, required) Region to connect to. See http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of available regions. + * 'retries' => 3, (int, default=int(3)) Configures the maximum number of allowed retries for a client (pass 0 to disable retries). + * 'version' => '2012-11-05', (string, required) The version of the webservice to utilize + * 'lazy' => true, Enable lazy connection (boolean) + * 'endpoint' => null (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack + * 'queue_owner_aws_account_id' The AWS account ID of the account that created the queue. * ]. * * or @@ -74,10 +75,10 @@ public function createContext(): Context if ($this->config['lazy']) { return new SqsContext(function () { return $this->establishConnection(); - }); + }, $this->config); } - return new SqsContext($this->establishConnection()); + return new SqsContext($this->establishConnection(), $this->config); } private function establishConnection(): SqsClient @@ -132,6 +133,7 @@ private function parseDsn(string $dsn): array 'version' => $dsn->getString('version'), 'lazy' => $dsn->getBool('lazy'), 'endpoint' => $dsn->getString('endpoint'), + 'queue_owner_aws_account_id' => $dsn->getString('queue_owner_aws_account_id'), ]), function ($value) { return null !== $value; }); } @@ -146,6 +148,7 @@ private function defaultConfig(): array 'version' => '2012-11-05', 'lazy' => true, 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ]; } } diff --git a/pkg/sqs/SqsContext.php b/pkg/sqs/SqsContext.php index cb3a9edfa..810145b1a 100644 --- a/pkg/sqs/SqsContext.php +++ b/pkg/sqs/SqsContext.php @@ -34,12 +34,14 @@ class SqsContext implements Context */ private $queueUrls; + private $config; + /** * Callable must return instance of SqsClient once called. * * @param SqsClient|callable $client */ - public function __construct($client) + public function __construct($client, array $config) { if ($client instanceof SqsClient) { $this->client = $client; @@ -52,6 +54,8 @@ public function __construct($client) SqsClient::class )); } + + $this->config = $config; } /** @@ -148,15 +152,18 @@ public function getQueueUrl(SqsDestination $destination): string return $this->queueUrls[$destination->getQueueName()]; } - $result = $this->getClient()->getQueueUrl([ - 'QueueName' => $destination->getQueueName(), - ]); + $arguments = ['QueueName' => $destination->getQueueName()]; + if (false == empty($this->config['queue_owner_aws_account_id'])) { + $arguments['QueueOwnerAWSAccountId'] = $this->config['queue_owner_aws_account_id']; + } + + $result = $this->getClient()->getQueueUrl($arguments); if (false == $result->hasKey('QueueUrl')) { throw new \RuntimeException(sprintf('QueueUrl cannot be resolved. queueName: "%s"', $destination->getQueueName())); } - return $this->queueUrls[$destination->getQueueName()] = $result->get('QueueUrl'); + return $this->queueUrls[$destination->getQueueName()] = (string) $result->get('QueueUrl'); } public function declareQueue(SqsDestination $dest): void diff --git a/pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php b/pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php new file mode 100644 index 000000000..79af8208e --- /dev/null +++ b/pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php @@ -0,0 +1,21 @@ +queue = $context->createQueue($queueName); + $context->declareQueue($this->queue); + + return $this->queue; + } +} diff --git a/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php index 2c8f2a21a..710e918f3 100644 --- a/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php @@ -17,17 +17,13 @@ class SqsSendAndReceiveDelayedMessageFromQueueTest extends SendAndReceiveDelayed { use RetryTrait; use SqsExtension; + use CreateSqsQueueTrait; /** * @var SqsContext */ private $context; - /** - * @var SqsDestination - */ - private $queue; - protected function tearDown() { parent::tearDown(); @@ -37,26 +33,13 @@ protected function tearDown() } } - /** - * {@inheritdoc} - */ - protected function createContext() + protected function createContext(): SqsContext { return $this->context = $this->buildSqsContext(); } - /** - * {@inheritdoc} - * - * @param SqsContext $context - */ - protected function createQueue(Context $context, $queueName) + protected function createQueue(Context $context, $queueName): SqsDestination { - $queueName = $queueName.time(); - - $this->queue = $context->createQueue($queueName); - $context->declareQueue($this->queue); - - return $this->queue; + return $this->createSqsQueue($context, $queueName); } } diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php index 934dda60e..780aca4c1 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php @@ -14,17 +14,13 @@ class SqsSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { use SqsExtension; + use CreateSqsQueueTrait; /** * @var SqsContext */ private $context; - /** - * @var SqsDestination - */ - private $queue; - protected function tearDown() { parent::tearDown(); @@ -34,26 +30,13 @@ protected function tearDown() } } - /** - * {@inheritdoc} - */ - protected function createContext() + protected function createContext(): SqsContext { return $this->context = $this->buildSqsContext(); } - /** - * {@inheritdoc} - * - * @param SqsContext $context - */ - protected function createQueue(Context $context, $queueName) + protected function createQueue(Context $context, $queueName): SqsDestination { - $queueName = $queueName.time(); - - $this->queue = $context->createQueue($queueName); - $context->declareQueue($this->queue); - - return $this->queue; + return $this->createSqsQueue($context, $queueName); } } diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php index f21e33903..b66631233 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php @@ -17,17 +17,13 @@ class SqsSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { use SqsExtension; use RetryTrait; + use CreateSqsQueueTrait; /** * @var SqsContext */ private $context; - /** - * @var SqsDestination - */ - private $queue; - protected function tearDown() { parent::tearDown(); @@ -37,26 +33,13 @@ protected function tearDown() } } - /** - * {@inheritdoc} - */ - protected function createContext() + protected function createContext(): SqsContext { return $this->context = $this->buildSqsContext(); } - /** - * {@inheritdoc} - * - * @param SqsContext $context - */ - protected function createTopic(Context $context, $topicName) + protected function createTopic(Context $context, $queueName): SqsDestination { - $topicName = $topicName.time(); - - $this->queue = $context->createTopic($topicName); - $context->declareQueue($this->queue); - - return $this->queue; + return $this->createSqsQueue($context, $queueName); } } diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php index 9301c647b..bb4890cc6 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php @@ -2,6 +2,10 @@ namespace Enqueue\Sqs\Tests\Spec; +use Enqueue\Sqs\SqsContext; +use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\SqsExtension; +use Interop\Queue\Context; use Interop\Queue\Spec\SendToAndReceiveNoWaitFromQueueSpec; /** @@ -9,16 +13,30 @@ */ class SqsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { - public function test() - { - $this->markTestSkipped('The test is fragile. This is how SQS.'); - } + use SqsExtension; + use CreateSqsQueueTrait; /** - * {@inheritdoc} + * @var SqsContext */ - protected function createContext() + private $context; + + protected function tearDown() + { + parent::tearDown(); + + if ($this->context && $this->queue) { + $this->context->deleteQueue($this->queue); + } + } + + protected function createContext(): SqsContext + { + return $this->context = $this->buildSqsContext(); + } + + protected function createQueue(Context $context, $queueName): SqsDestination { - throw new \LogicException('Should not be ever called'); + return $this->createSqsQueue($context, $queueName); } } diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php index 3d9149b05..a813fdb6f 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php @@ -2,6 +2,10 @@ namespace Enqueue\Sqs\Tests\Spec; +use Enqueue\Sqs\SqsContext; +use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\SqsExtension; +use Interop\Queue\Context; use Interop\Queue\Spec\SendToAndReceiveNoWaitFromTopicSpec; /** @@ -9,16 +13,30 @@ */ class SqsSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFromTopicSpec { - public function test() - { - $this->markTestSkipped('The test is fragile. This is how SQS.'); - } + use SqsExtension; + use CreateSqsQueueTrait; /** - * {@inheritdoc} + * @var SqsContext */ - protected function createContext() + private $context; + + protected function tearDown() + { + parent::tearDown(); + + if ($this->context && $this->queue) { + $this->context->deleteQueue($this->queue); + } + } + + protected function createContext(): SqsContext + { + return $this->context = $this->buildSqsContext(); + } + + protected function createTopic(Context $context, $queueName): SqsDestination { - throw new \LogicException('Should not be ever called'); + return $this->createSqsQueue($context, $queueName); } } diff --git a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php index a9db45362..082fa527a 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php @@ -2,6 +2,10 @@ namespace Enqueue\Sqs\Tests\Spec; +use Enqueue\Sqs\SqsContext; +use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\SqsExtension; +use Interop\Queue\Context; use Interop\Queue\Spec\SendToTopicAndReceiveFromQueueSpec; /** @@ -9,16 +13,35 @@ */ class SqsSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFromQueueSpec { - public function test() - { - $this->markTestSkipped('The SQS does not support it'); - } + use SqsExtension; + use CreateSqsQueueTrait; /** - * {@inheritdoc} + * @var SqsContext */ - protected function createContext() + private $context; + + protected function tearDown() + { + parent::tearDown(); + + if ($this->context && $this->queue) { + $this->context->deleteQueue($this->queue); + } + } + + protected function createContext(): SqsContext + { + return $this->context = $this->buildSqsContext(); + } + + protected function createTopic(Context $context, $queueName): SqsDestination + { + return $this->createSqsQueue($context, $queueName); + } + + protected function createQueue(Context $context, $queueName): SqsDestination { - throw new \LogicException('Should not be ever called'); + return $this->createSqsQueue($context, $queueName); } } diff --git a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php index bbb9be63a..d4175ef4e 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -2,6 +2,10 @@ namespace Enqueue\Sqs\Tests\Spec; +use Enqueue\Sqs\SqsContext; +use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\SqsExtension; +use Interop\Queue\Context; use Interop\Queue\Spec\SendToTopicAndReceiveNoWaitFromQueueSpec; /** @@ -9,16 +13,35 @@ */ class SqsSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveNoWaitFromQueueSpec { - public function test() - { - $this->markTestSkipped('The SQS does not support it'); - } + use SqsExtension; + use CreateSqsQueueTrait; /** - * {@inheritdoc} + * @var SqsContext */ - protected function createContext() + private $context; + + protected function tearDown() + { + parent::tearDown(); + + if ($this->context && $this->queue) { + $this->context->deleteQueue($this->queue); + } + } + + protected function createContext(): SqsContext + { + return $this->context = $this->buildSqsContext(); + } + + protected function createTopic(Context $context, $queueName): SqsDestination + { + return $this->createSqsQueue($context, $queueName); + } + + protected function createQueue(Context $context, $queueName): SqsDestination { - throw new \LogicException('Should not be ever called'); + return $this->createSqsQueue($context, $queueName); } } diff --git a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php index f2ad15948..375b0d03a 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php @@ -63,6 +63,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => true, 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ], ]; @@ -77,6 +78,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => true, 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ], ]; @@ -91,6 +93,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => true, 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ], ]; @@ -105,6 +108,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => false, 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ], ]; @@ -119,6 +123,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => false, 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ], ]; @@ -133,6 +138,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => false, 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ], ]; @@ -153,6 +159,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => false, 'endpoint' => 'http://localstack:1111/', + 'queue_owner_aws_account_id' => null, ], ]; } diff --git a/pkg/sqs/Tests/SqsConnectionFactoryTest.php b/pkg/sqs/Tests/SqsConnectionFactoryTest.php index c4544c9e0..21d3784c4 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryTest.php @@ -7,8 +7,9 @@ use Enqueue\Sqs\SqsContext; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\ConnectionFactory; +use PHPUnit\Framework\TestCase; -class SqsConnectionFactoryTest extends \PHPUnit\Framework\TestCase +class SqsConnectionFactoryTest extends TestCase { use ClassExtensionTrait; @@ -30,6 +31,7 @@ public function testCouldBeConstructedWithEmptyConfiguration() 'retries' => 3, 'version' => '2012-11-05', 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ], 'config', $factory); } @@ -46,6 +48,7 @@ public function testCouldBeConstructedWithCustomConfiguration() 'retries' => 3, 'version' => '2012-11-05', 'endpoint' => null, + 'queue_owner_aws_account_id' => null, ], 'config', $factory); } diff --git a/pkg/sqs/Tests/SqsContextTest.php b/pkg/sqs/Tests/SqsContextTest.php index f6567d870..9ed8e40c7 100644 --- a/pkg/sqs/Tests/SqsContextTest.php +++ b/pkg/sqs/Tests/SqsContextTest.php @@ -26,26 +26,26 @@ public function testShouldImplementContextInterface() public function testCouldBeConstructedWithSqsClientAsFirstArgument() { - new SqsContext($this->createSqsClientMock()); + new SqsContext($this->createSqsClientMock(), []); } public function testCouldBeConstructedWithSqsClientFactoryAsFirstArgument() { new SqsContext(function () { return $this->createSqsClientMock(); - }); + }, []); } public function testThrowIfNeitherSqsClientNorFactoryGiven() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('The $client argument must be either Aws\Sqs\SqsClient or callable that returns Aws\Sqs\SqsClient once called.'); - new SqsContext(new \stdClass()); + new SqsContext(new \stdClass(), []); } public function testShouldAllowCreateEmptyMessage() { - $context = new SqsContext($this->createSqsClientMock()); + $context = new SqsContext($this->createSqsClientMock(), []); $message = $context->createMessage(); @@ -58,7 +58,7 @@ public function testShouldAllowCreateEmptyMessage() public function testShouldAllowCreateCustomMessage() { - $context = new SqsContext($this->createSqsClientMock()); + $context = new SqsContext($this->createSqsClientMock(), []); $message = $context->createMessage('theBody', ['aProp' => 'aPropVal'], ['aHeader' => 'aHeaderVal']); @@ -71,7 +71,9 @@ public function testShouldAllowCreateCustomMessage() public function testShouldCreateQueue() { - $context = new SqsContext($this->createSqsClientMock()); + $context = new SqsContext($this->createSqsClientMock(), [ + 'queue_owner_aws_account_id' => null, + ]); $queue = $context->createQueue('aQueue'); @@ -81,7 +83,9 @@ public function testShouldCreateQueue() public function testShouldAllowCreateTopic() { - $context = new SqsContext($this->createSqsClientMock()); + $context = new SqsContext($this->createSqsClientMock(), [ + 'queue_owner_aws_account_id' => null, + ]); $topic = $context->createTopic('aTopic'); @@ -91,7 +95,7 @@ public function testShouldAllowCreateTopic() public function testThrowNotImplementedOnCreateTmpQueueCall() { - $context = new SqsContext($this->createSqsClientMock()); + $context = new SqsContext($this->createSqsClientMock(), []); $this->expectException(TemporaryQueueNotSupportedException::class); @@ -100,7 +104,7 @@ public function testThrowNotImplementedOnCreateTmpQueueCall() public function testShouldCreateProducer() { - $context = new SqsContext($this->createSqsClientMock()); + $context = new SqsContext($this->createSqsClientMock(), []); $producer = $context->createProducer(); @@ -109,7 +113,7 @@ public function testShouldCreateProducer() public function testShouldThrowIfNotSqsDestinationGivenOnCreateConsumer() { - $context = new SqsContext($this->createSqsClientMock()); + $context = new SqsContext($this->createSqsClientMock(), []); $this->expectException(InvalidDestinationException::class); $this->expectExceptionMessage('The destination must be an instance of Enqueue\Sqs\SqsDestination but got Mock_Queue'); @@ -119,7 +123,9 @@ public function testShouldThrowIfNotSqsDestinationGivenOnCreateConsumer() public function testShouldCreateConsumer() { - $context = new SqsContext($this->createSqsClientMock()); + $context = new SqsContext($this->createSqsClientMock(), [ + 'queue_owner_aws_account_id' => null, + ]); $queue = $context->createQueue('aQueue'); @@ -138,7 +144,9 @@ public function testShouldAllowDeclareQueue() ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) ; - $context = new SqsContext($sqsClient); + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); $queue = $context->createQueue('aQueueName'); @@ -161,7 +169,9 @@ public function testShouldAllowDeleteQueue() ->willReturn(new Result()) ; - $context = new SqsContext($sqsClient); + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); $queue = $context->createQueue('aQueueName'); @@ -184,7 +194,9 @@ public function testShouldAllowPurgeQueue() ->willReturn(new Result()) ; - $context = new SqsContext($sqsClient); + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); $queue = $context->createQueue('aQueueName'); @@ -201,7 +213,29 @@ public function testShouldAllowGetQueueUrl() ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) ; - $context = new SqsContext($sqsClient); + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); + + $context->getQueueUrl(new SqsDestination('aQueueName')); + } + + public function testShouldAllowGetQueueUrlFromAnotherAWSAccount() + { + $sqsClient = $this->createSqsClientMock(); + $sqsClient + ->expects($this->once()) + ->method('getQueueUrl') + ->with($this->identicalTo([ + 'QueueName' => 'aQueueName', + 'QueueOwnerAWSAccountId' => 'anotherAWSAccountID', + ])) + ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) + ; + + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => 'anotherAWSAccountID', + ]); $context->getQueueUrl(new SqsDestination('aQueueName')); } @@ -216,7 +250,9 @@ public function testShouldThrowExceptionIfGetQueueUrlResultHasNoQueueUrlProperty ->willReturn(new Result([])) ; - $context = new SqsContext($sqsClient); + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); $this->expectException(\RuntimeException::class); $this->expectExceptionMessage('QueueUrl cannot be resolved. queueName: "aQueueName"'); From 66067ad8dbbe743a29228679f148f7acfe2e8a10 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 30 Nov 2018 17:45:57 +0200 Subject: [PATCH 0463/1142] [dbal] Fix ordered bytes time codec for message id on decode. https://travis-ci.org/php-enqueue/enqueue-dev/jobs/458362777 ``` 1) Enqueue\Dbal\Tests\Functional\DbalConsumerTest::testShouldOrderMessagesWithSamePriorityByPublishedAtDate InvalidArgumentException: $bytes string should contain 16 characters. /mqdev/vendor/ramsey/uuid/src/Codec/StringCodec.php:97 /mqdev/vendor/ramsey/uuid/src/UuidFactory.php:188 /mqdev/vendor/ramsey/uuid/src/Uuid.php:632 /mqdev/pkg/dbal/DbalContext.php:155 /mqdev/pkg/dbal/DbalConsumerHelperTrait.php:82 /mqdev/pkg/dbal/DbalConsumer.php:83 /mqdev/vendor/queue-interop/queue-interop/src/Impl/ConsumerPollingTrait.php:42 /mqdev/pkg/dbal/Tests/Functional/DbalConsumerTest.php:95 ``` --- pkg/dbal/DbalContext.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 63ce0b1da..431b115d5 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -17,7 +17,9 @@ use Interop\Queue\Queue; use Interop\Queue\SubscriptionConsumer; use Interop\Queue\Topic; +use Ramsey\Uuid\Codec\OrderedTimeCodec; use Ramsey\Uuid\Uuid; +use Ramsey\Uuid\UuidFactory; class DbalContext implements Context { @@ -152,7 +154,9 @@ public function convertMessage(array $arrayMessage): DbalMessage ); if (isset($arrayMessage['id'])) { - $message->setMessageId(Uuid::fromBytes($arrayMessage['id'])->toString()); + $uuidCodec = new OrderedTimeCodec((new UuidFactory())->getUuidBuilder()); + + $message->setMessageId($uuidCodec->decodeBytes($arrayMessage['id'])->toString()); } if (isset($arrayMessage['queue'])) { $message->setQueue($arrayMessage['queue']); From 7f17f06f3754e0ed67889523bd54725872381088 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 1 Dec 2018 16:36:44 +0200 Subject: [PATCH 0464/1142] [sqs] Add ability to use another aws account per queue. --- docs/transport/sqs.md | 20 +++++++++++++++ pkg/sqs/SqsContext.php | 5 +++- pkg/sqs/SqsDestination.php | 15 +++++++++++ .../Spec/SqsSendToAndReceiveFromQueueTest.php | 3 +++ ...SqsSendToAndReceiveNoWaitFromQueueTest.php | 3 +++ ...SqsSendToAndReceiveNoWaitFromTopicTest.php | 3 +++ .../SqsSendToTopicAndReceiveFromQueueTest.php | 3 +++ ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 3 +++ pkg/sqs/Tests/SqsContextTest.php | 25 ++++++++++++++++++- 9 files changed, 78 insertions(+), 2 deletions(-) diff --git a/docs/transport/sqs.md b/docs/transport/sqs.md index 8bb06aa13..3e014ca99 100644 --- a/docs/transport/sqs.md +++ b/docs/transport/sqs.md @@ -19,6 +19,7 @@ It uses internally official [aws sdk library](https://packagist.org/packages/aws * [Send delay message](#send-delay-message) * [Consume message](#consume-message) * [Purge queue messages](#purge-queue-messages) +* [Queue from another AWS account](#queue-from-another-aws-account) ## Installation @@ -122,4 +123,23 @@ $fooQueue = $context->createQueue('foo'); $context->purgeQueue($fooQueue); ``` +## Queue from another AWS account + +SQS allows to use queues from another account. You could set it globally for all queues via option `queue_owner_aws_account_id` or +per queue using `SqsDestination::setQueueOwnerAWSAccountId` method. + +```php +createContext(); + +// per queue. +$queue = $context->createQueue('foo'); +$queue->setQueueOwnerAWSAccountId('awsAccountId'); +``` + [back to index](../index.md) diff --git a/pkg/sqs/SqsContext.php b/pkg/sqs/SqsContext.php index 810145b1a..964dfaad7 100644 --- a/pkg/sqs/SqsContext.php +++ b/pkg/sqs/SqsContext.php @@ -153,7 +153,10 @@ public function getQueueUrl(SqsDestination $destination): string } $arguments = ['QueueName' => $destination->getQueueName()]; - if (false == empty($this->config['queue_owner_aws_account_id'])) { + + if ($destination->getQueueOwnerAWSAccountId()) { + $arguments['QueueOwnerAWSAccountId'] = $destination->getQueueOwnerAWSAccountId(); + } elseif (false == empty($this->config['queue_owner_aws_account_id'])) { $arguments['QueueOwnerAWSAccountId'] = $this->config['queue_owner_aws_account_id']; } diff --git a/pkg/sqs/SqsDestination.php b/pkg/sqs/SqsDestination.php index 21fc17828..ec8cf3252 100644 --- a/pkg/sqs/SqsDestination.php +++ b/pkg/sqs/SqsDestination.php @@ -19,6 +19,11 @@ class SqsDestination implements Topic, Queue */ private $attributes; + /** + * @var string|null + */ + private $queueOwnerAWSAccountId; + /** * The name of the new queue. * The following limits apply to this name: @@ -187,4 +192,14 @@ public function setContentBasedDeduplication(bool $enable): void unset($this->attributes['ContentBasedDeduplication']); } } + + public function getQueueOwnerAWSAccountId(): ?string + { + return $this->queueOwnerAWSAccountId; + } + + public function setQueueOwnerAWSAccountId(?string $queueOwnerAWSAccountId): void + { + $this->queueOwnerAWSAccountId = $queueOwnerAWSAccountId; + } } diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php index 780aca4c1..1a3cdb54e 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php @@ -4,15 +4,18 @@ use Enqueue\Sqs\SqsContext; use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\RetryTrait; use Enqueue\Test\SqsExtension; use Interop\Queue\Context; use Interop\Queue\Spec\SendToAndReceiveFromQueueSpec; /** * @group functional + * @retry 5 */ class SqsSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { + use RetryTrait; use SqsExtension; use CreateSqsQueueTrait; diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php index bb4890cc6..378e65c13 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php @@ -4,15 +4,18 @@ use Enqueue\Sqs\SqsContext; use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\RetryTrait; use Enqueue\Test\SqsExtension; use Interop\Queue\Context; use Interop\Queue\Spec\SendToAndReceiveNoWaitFromQueueSpec; /** * @group functional + * @retry 5 */ class SqsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { + use RetryTrait; use SqsExtension; use CreateSqsQueueTrait; diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php index a813fdb6f..175af9568 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php @@ -4,15 +4,18 @@ use Enqueue\Sqs\SqsContext; use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\RetryTrait; use Enqueue\Test\SqsExtension; use Interop\Queue\Context; use Interop\Queue\Spec\SendToAndReceiveNoWaitFromTopicSpec; /** * @group functional + * @retry 5 */ class SqsSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFromTopicSpec { + use RetryTrait; use SqsExtension; use CreateSqsQueueTrait; diff --git a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php index 082fa527a..2f9c8b638 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php @@ -4,15 +4,18 @@ use Enqueue\Sqs\SqsContext; use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\RetryTrait; use Enqueue\Test\SqsExtension; use Interop\Queue\Context; use Interop\Queue\Spec\SendToTopicAndReceiveFromQueueSpec; /** * @group functional + * @retry 5 */ class SqsSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFromQueueSpec { + use RetryTrait; use SqsExtension; use CreateSqsQueueTrait; diff --git a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php index d4175ef4e..b4cc5669f 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -4,15 +4,18 @@ use Enqueue\Sqs\SqsContext; use Enqueue\Sqs\SqsDestination; +use Enqueue\Test\RetryTrait; use Enqueue\Test\SqsExtension; use Interop\Queue\Context; use Interop\Queue\Spec\SendToTopicAndReceiveNoWaitFromQueueSpec; /** * @group functional + * @retry 5 */ class SqsSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveNoWaitFromQueueSpec { + use RetryTrait; use SqsExtension; use CreateSqsQueueTrait; diff --git a/pkg/sqs/Tests/SqsContextTest.php b/pkg/sqs/Tests/SqsContextTest.php index 9ed8e40c7..06d2413cd 100644 --- a/pkg/sqs/Tests/SqsContextTest.php +++ b/pkg/sqs/Tests/SqsContextTest.php @@ -220,7 +220,7 @@ public function testShouldAllowGetQueueUrl() $context->getQueueUrl(new SqsDestination('aQueueName')); } - public function testShouldAllowGetQueueUrlFromAnotherAWSAccount() + public function testShouldAllowGetQueueUrlFromAnotherAWSAccountSetGlobally() { $sqsClient = $this->createSqsClientMock(); $sqsClient @@ -240,6 +240,29 @@ public function testShouldAllowGetQueueUrlFromAnotherAWSAccount() $context->getQueueUrl(new SqsDestination('aQueueName')); } + public function testShouldAllowGetQueueUrlFromAnotherAWSAccountSetPerQueue() + { + $sqsClient = $this->createSqsClientMock(); + $sqsClient + ->expects($this->once()) + ->method('getQueueUrl') + ->with($this->identicalTo([ + 'QueueName' => 'aQueueName', + 'QueueOwnerAWSAccountId' => 'anotherAWSAccountID', + ])) + ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) + ; + + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); + + $queue = new SqsDestination('aQueueName'); + $queue->setQueueOwnerAWSAccountId('anotherAWSAccountID'); + + $context->getQueueUrl($queue); + } + public function testShouldThrowExceptionIfGetQueueUrlResultHasNoQueueUrlProperty() { $sqsClient = $this->createSqsClientMock(); From 4dbec68ad4c89a2aede72b701a29e4cab97d6692 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 3 Dec 2018 15:09:51 +0200 Subject: [PATCH 0465/1142] [sqs] Multi region support. --- pkg/sqs/SqsClient.php | 30 ++- pkg/sqs/SqsConnectionFactory.php | 28 +- pkg/sqs/SqsConsumer.php | 6 +- pkg/sqs/SqsContext.php | 68 ++--- pkg/sqs/SqsProducer.php | 2 +- pkg/sqs/Tests/SqsClientTest.php | 299 +++++++++++++++++++++ pkg/sqs/Tests/SqsConnectionFactoryTest.php | 17 +- pkg/sqs/Tests/SqsConsumerTest.php | 175 ++++++++++-- pkg/sqs/Tests/SqsContextTest.php | 168 ++++++++++-- pkg/sqs/Tests/SqsProducerTest.php | 72 +++-- 10 files changed, 729 insertions(+), 136 deletions(-) create mode 100644 pkg/sqs/Tests/SqsClientTest.php diff --git a/pkg/sqs/SqsClient.php b/pkg/sqs/SqsClient.php index 8bd725c01..65cf2fb29 100644 --- a/pkg/sqs/SqsClient.php +++ b/pkg/sqs/SqsClient.php @@ -25,11 +25,12 @@ class SqsClient */ private $inputClient; + /** + * @param AwsSqsClient|callable $inputClient + */ public function __construct($inputClient) { - $this->inputClient = is_callable($inputClient) ? $inputClient : function () use ($inputClient) { - return $inputClient; - }; + $this->inputClient = $inputClient; } public function deleteMessage(array $args): Result @@ -89,7 +90,13 @@ public function getAWSClient(): AwsSqsClient private function callApi(string $name, array $args): Result { + $this->resolveClient(); + if ($this->singleClient) { + if (false == empty($args['@region'])) { + throw new \LogicException('Cannot send message to another region because transport is configured with single aws client'); + } + unset($args['@region']); return call_user_func([$this->singleClient, $name], $args); @@ -108,16 +115,27 @@ private function resolveClient(): void return; } - $client = call_user_func($this->inputClient); + $client = $this->inputClient; if ($client instanceof MultiRegionClient) { $this->multiClient = $client; return; - } - if ($client instanceof AwsSqsClient) { + } elseif ($client instanceof AwsSqsClient) { $this->singleClient = $client; return; + } elseif (is_callable($client)) { + $client = call_user_func($client); + if ($client instanceof MultiRegionClient) { + $this->multiClient = $client; + + return; + } + if ($client instanceof AwsSqsClient) { + $this->singleClient = $client; + + return; + } } throw new \LogicException(sprintf( diff --git a/pkg/sqs/SqsConnectionFactory.php b/pkg/sqs/SqsConnectionFactory.php index 898dd32dd..4a99c752e 100644 --- a/pkg/sqs/SqsConnectionFactory.php +++ b/pkg/sqs/SqsConnectionFactory.php @@ -4,9 +4,8 @@ namespace Enqueue\Sqs; -use Aws\MultiRegionClient; use Aws\Sdk; -use Aws\Sqs\SqsClient; +use Aws\Sqs\SqsClient as AwsSqsClient; use Enqueue\Dsn\Dsn; use Interop\Queue\ConnectionFactory; use Interop\Queue\Context; @@ -19,7 +18,7 @@ class SqsConnectionFactory implements ConnectionFactory private $config; /** - * @var MultiRegionClient + * @var SqsClient */ private $client; @@ -45,8 +44,8 @@ class SqsConnectionFactory implements ConnectionFactory */ public function __construct($config = 'sqs:') { - if ($config instanceof SqsClient) { - $this->client = $config; + if ($config instanceof AwsSqsClient) { + $this->client = new SqsClient($config); $this->config = ['lazy' => false] + $this->defaultConfig(); return; @@ -63,7 +62,7 @@ public function __construct($config = 'sqs:') unset($config['dsn']); } } else { - throw new \LogicException(sprintf('The config must be either an array of options, a DSN string, null or instance of %s', SqsClient::class)); + throw new \LogicException(sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSqsClient::class)); } $this->config = array_replace($this->defaultConfig(), $config); @@ -74,16 +73,10 @@ public function __construct($config = 'sqs:') */ public function createContext(): Context { - if ($this->config['lazy']) { - return new SqsContext(function () { - return $this->establishConnection(); - }, $this->config); - } - return new SqsContext($this->establishConnection(), $this->config); } - private function establishConnection(): MultiRegionClient + private function establishConnection(): SqsClient { if ($this->client) { return $this->client; @@ -110,7 +103,14 @@ private function establishConnection(): MultiRegionClient } } - $this->client = (new Sdk(['Sqs' => $config]))->createMultiRegionSqs(); + $establishConnection = function () use ($config) { + return (new Sdk(['Sqs' => $config]))->createMultiRegionSqs(); + }; + + $this->client = $this->config['lazy'] ? + new SqsClient($establishConnection) : + new SqsClient($establishConnection()) + ; return $this->client; } diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index 81f489dd9..b6ded7e20 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -119,7 +119,7 @@ public function acknowledge(Message $message): void { InvalidMessageException::assertMessageInstanceOf($message, SqsMessage::class); - $this->context->getClient()->deleteMessage([ + $this->context->getSqsClient()->deleteMessage([ '@region' => $this->queue->getRegion(), 'QueueUrl' => $this->context->getQueueUrl($this->queue), 'ReceiptHandle' => $message->getReceiptHandle(), @@ -133,7 +133,7 @@ public function reject(Message $message, bool $requeue = false): void { InvalidMessageException::assertMessageInstanceOf($message, SqsMessage::class); - $this->context->getClient()->deleteMessage([ + $this->context->getSqsClient()->deleteMessage([ '@region' => $this->queue->getRegion(), 'QueueUrl' => $this->context->getQueueUrl($this->queue), 'ReceiptHandle' => $message->getReceiptHandle(), @@ -163,7 +163,7 @@ protected function receiveMessage(int $timeoutSeconds): ?SqsMessage $arguments['VisibilityTimeout'] = $this->visibilityTimeout; } - $result = $this->context->getClient()->receiveMessage($arguments); + $result = $this->context->getSqsClient()->receiveMessage($arguments); if ($result->hasKey('Messages')) { $this->messages = $result->get('Messages'); diff --git a/pkg/sqs/SqsContext.php b/pkg/sqs/SqsContext.php index 7d26c6d9f..8be6fcddb 100644 --- a/pkg/sqs/SqsContext.php +++ b/pkg/sqs/SqsContext.php @@ -4,7 +4,7 @@ namespace Enqueue\Sqs; -use Aws\Sqs\SqsClient; +use Aws\Sqs\SqsClient as AwsSqsClient; use Interop\Queue\Consumer; use Interop\Queue\Context; use Interop\Queue\Destination; @@ -24,37 +24,19 @@ class SqsContext implements Context */ private $client; - /** - * @var callable - */ - private $clientFactory; - /** * @var array */ private $queueUrls; - private $config; - /** - * Callable must return instance of SqsClient once called. - * - * @param SqsClient|callable $client + * @var array */ - public function __construct($client, array $config) - { - if ($client instanceof SqsClient) { - $this->client = $client; - } elseif (is_callable($client)) { - $this->clientFactory = $client; - } else { - throw new \InvalidArgumentException(sprintf( - 'The $client argument must be either %s or callable that returns %s once called.', - SqsClient::class, - SqsClient::class - )); - } + private $config; + public function __construct(SqsClient $client, array $config) + { + $this->client = $client; $this->config = $config; } @@ -118,7 +100,7 @@ public function purgeQueue(Queue $queue): void { InvalidDestinationException::assertDestinationInstanceOf($queue, SqsDestination::class); - $this->getClient()->purgeQueue([ + $this->client->purgeQueue([ '@region' => $queue->getRegion(), 'QueueUrl' => $this->getQueueUrl($queue), ]); @@ -129,24 +111,26 @@ public function createSubscriptionConsumer(): SubscriptionConsumer throw SubscriptionConsumerNotSupportedException::providerDoestNotSupportIt(); } - public function getClient(): SqsClient + public function getAwsSqsClient(): AwsSqsClient { - if (false == $this->client) { - $client = call_user_func($this->clientFactory); - if (false == $client instanceof SqsClient) { - throw new \LogicException(sprintf( - 'The factory must return instance of "%s". But it returns %s', - SqsClient::class, - is_object($client) ? get_class($client) : gettype($client) - )); - } - - $this->client = $client; - } + return $this->client->getAWSClient(); + } + public function getSqsClient(): SqsClient + { return $this->client; } + /** + * @deprecated use getAwsSqsClient method + */ + public function getClient(): AwsSqsClient + { + @trigger_error('The method is deprecated since 0.9.2. SqsContext::getAwsSqsClient() method should be used.', E_USER_DEPRECATED); + + return $this->getAwsSqsClient(); + } + public function getQueueUrl(SqsDestination $destination): string { if (isset($this->queueUrls[$destination->getQueueName()])) { @@ -155,7 +139,7 @@ public function getQueueUrl(SqsDestination $destination): string $arguments = [ '@region' => $destination->getRegion(), - 'QueueName' => $destination->getQueueName() + 'QueueName' => $destination->getQueueName(), ]; if ($destination->getQueueOwnerAWSAccountId()) { @@ -164,7 +148,7 @@ public function getQueueUrl(SqsDestination $destination): string $arguments['QueueOwnerAWSAccountId'] = $this->config['queue_owner_aws_account_id']; } - $result = $this->getClient()->getQueueUrl($arguments); + $result = $this->client->getQueueUrl($arguments); if (false == $result->hasKey('QueueUrl')) { throw new \RuntimeException(sprintf('QueueUrl cannot be resolved. queueName: "%s"', $destination->getQueueName())); @@ -175,7 +159,7 @@ public function getQueueUrl(SqsDestination $destination): string public function declareQueue(SqsDestination $dest): void { - $result = $this->getClient()->createQueue([ + $result = $this->client->createQueue([ '@region' => $dest->getRegion(), 'Attributes' => $dest->getAttributes(), 'QueueName' => $dest->getQueueName(), @@ -190,7 +174,7 @@ public function declareQueue(SqsDestination $dest): void public function deleteQueue(SqsDestination $dest): void { - $this->getClient()->deleteQueue([ + $this->client->deleteQueue([ 'QueueUrl' => $this->getQueueUrl($dest), ]); diff --git a/pkg/sqs/SqsProducer.php b/pkg/sqs/SqsProducer.php index f264c19f5..b33d57fb8 100644 --- a/pkg/sqs/SqsProducer.php +++ b/pkg/sqs/SqsProducer.php @@ -71,7 +71,7 @@ public function send(Destination $destination, Message $message): void $arguments['MessageGroupId'] = $message->getMessageGroupId(); } - $result = $this->context->getClient()->sendMessage($arguments); + $result = $this->context->getSqsClient()->sendMessage($arguments); if (false == $result->hasKey('MessageId')) { throw new \RuntimeException('Message was not sent'); diff --git a/pkg/sqs/Tests/SqsClientTest.php b/pkg/sqs/Tests/SqsClientTest.php new file mode 100644 index 000000000..2a45edc72 --- /dev/null +++ b/pkg/sqs/Tests/SqsClientTest.php @@ -0,0 +1,299 @@ + [ + 'key' => '', + 'secret' => '', + 'token' => '', + 'region' => '', + 'version' => '2012-11-05', + 'endpoint' => 'http://localhost/', + ]]))->createSqs(); + + $client = new SqsClient($awsClient); + + $this->assertSame($awsClient, $client->getAWSClient()); + } + + public function testShouldAllowGetAwsClientIfMultipleClientProvided() + { + $awsClient = (new Sdk(['Sqs' => [ + 'key' => '', + 'secret' => '', + 'token' => '', + 'region' => '', + 'version' => '2012-11-05', + 'endpoint' => 'http://localhost/', + ]]))->createMultiRegionSqs(); + + $client = new SqsClient($awsClient); + + $this->assertInstanceOf(AwsSqsClient::class, $client->getAWSClient()); + } + + /** + * @dataProvider provideApiCallsSingleClient + * @dataProvider provideApiCallsMultipleClient + */ + public function testApiCall(string $method, array $args, array $result, string $awsClientClass) + { + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->once()) + ->method($method) + ->with($this->identicalTo($args)) + ->willReturn(new Result($result)); + + $client = new SqsClient($awsClient); + + $actualResult = $client->{$method}($args); + + $this->assertInstanceOf(Result::class, $actualResult); + $this->assertSame($result, $actualResult->toArray()); + } + + /** + * @dataProvider provideApiCallsSingleClient + * @dataProvider provideApiCallsMultipleClient + */ + public function testLazyApiCall(string $method, array $args, array $result, string $awsClientClass) + { + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->once()) + ->method($method) + ->with($this->identicalTo($args)) + ->willReturn(new Result($result)); + + $client = new SqsClient(function () use ($awsClient) { + return $awsClient; + }); + + $actualResult = $client->{$method}($args); + + $this->assertInstanceOf(Result::class, $actualResult); + $this->assertSame($result, $actualResult->toArray()); + } + + /** + * @dataProvider provideApiCallsSingleClient + * @dataProvider provideApiCallsMultipleClient + */ + public function testThrowIfInvalidInputClientApiCall(string $method, array $args, array $result, string $awsClientClass) + { + $client = new SqsClient(new \stdClass()); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The input client must be an instance of "Aws\Sqs\SqsClient" or "Aws\MultiRegionClient" or a callable that returns one of those. Got "stdClass"'); + $client->{$method}($args); + } + + /** + * @dataProvider provideApiCallsSingleClient + * @dataProvider provideApiCallsMultipleClient + */ + public function testThrowIfInvalidLazyInputClientApiCall(string $method, array $args, array $result, string $awsClientClass) + { + $client = new SqsClient(function () { return new \stdClass(); }); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The input client must be an instance of "Aws\Sqs\SqsClient" or "Aws\MultiRegionClient" or a callable that returns one of those. Got "stdClass"'); + $client->{$method}($args); + } + + /** + * @dataProvider provideApiCallsMultipleClient + */ + public function testApiCallWithMultiClientAndCustomRegion(string $method, array $args, array $result, string $awsClientClass) + { + $args['@region'] = 'theRegion'; + + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->once()) + ->method($method) + ->with($this->identicalTo($args)) + ->willReturn(new Result($result)); + + $client = new SqsClient($awsClient); + + $actualResult = $client->{$method}($args); + + $this->assertInstanceOf(Result::class, $actualResult); + $this->assertSame($result, $actualResult->toArray()); + } + + /** + * @dataProvider provideApiCallsSingleClient + */ + public function testApiCallWithSingleClientAndCustomRegion(string $method, array $args, array $result, string $awsClientClass) + { + $args['@region'] = 'theRegion'; + + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->never()) + ->method($method) + ; + + $client = new SqsClient($awsClient); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Cannot send message to another region because transport is configured with single aws client'); + $client->{$method}($args); + } + + /** + * @dataProvider provideApiCallsSingleClient + */ + public function testApiCallWithMultiClientAndEmptyCustomRegion(string $method, array $args, array $result, string $awsClientClass) + { + $expectedArgs = $args; + $args['@region'] = ''; + + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->once()) + ->method($method) + ->with($this->identicalTo($expectedArgs)) + ->willReturn(new Result($result)); + + $client = new SqsClient($awsClient); + + $actualResult = $client->{$method}($args); + + $this->assertInstanceOf(Result::class, $actualResult); + $this->assertSame($result, $actualResult->toArray()); + } + + public function provideApiCallsSingleClient() + { + yield [ + 'deleteMessage', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSqsClient::class, + ]; + + yield [ + 'receiveMessage', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSqsClient::class, + ]; + + yield [ + 'purgeQueue', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSqsClient::class, + ]; + + yield [ + 'getQueueUrl', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSqsClient::class, + ]; + + yield [ + 'createQueue', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSqsClient::class, + ]; + + yield [ + 'deleteQueue', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSqsClient::class, + ]; + + yield [ + 'sendMessage', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSqsClient::class, + ]; + } + + public function provideApiCallsMultipleClient() + { + yield [ + 'deleteMessage', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + + yield [ + 'receiveMessage', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + + yield [ + 'purgeQueue', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + + yield [ + 'getQueueUrl', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + + yield [ + 'createQueue', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + + yield [ + 'deleteQueue', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + + yield [ + 'sendMessage', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + } +} diff --git a/pkg/sqs/Tests/SqsConnectionFactoryTest.php b/pkg/sqs/Tests/SqsConnectionFactoryTest.php index 21d3784c4..056ecc41b 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryTest.php @@ -2,7 +2,8 @@ namespace Enqueue\Sqs\Tests; -use Aws\Sqs\SqsClient; +use Aws\Sqs\SqsClient as AwsSqsClient; +use Enqueue\Sqs\SqsClient; use Enqueue\Sqs\SqsConnectionFactory; use Enqueue\Sqs\SqsContext; use Enqueue\Test\ClassExtensionTrait; @@ -54,14 +55,17 @@ public function testCouldBeConstructedWithCustomConfiguration() public function testCouldBeConstructedWithClient() { - $client = $this->createMock(SqsClient::class); + $awsClient = $this->createMock(AwsSqsClient::class); - $factory = new SqsConnectionFactory($client); + $factory = new SqsConnectionFactory($awsClient); $context = $factory->createContext(); $this->assertInstanceOf(SqsContext::class, $context); - $this->assertAttributeSame($client, 'client', $context); + + $client = $this->readAttribute($context, 'client'); + $this->assertInstanceOf(SqsClient::class, $client); + $this->assertAttributeSame($awsClient, 'inputClient', $client); } public function testShouldCreateLazyContext() @@ -72,7 +76,8 @@ public function testShouldCreateLazyContext() $this->assertInstanceOf(SqsContext::class, $context); - $this->assertAttributeEquals(null, 'client', $context); - $this->assertInternalType('callable', $this->readAttribute($context, 'clientFactory')); + $client = $this->readAttribute($context, 'client'); + $this->assertInstanceOf(SqsClient::class, $client); + $this->assertAttributeInstanceOf(\Closure::class, 'inputClient', $client); } } diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index c25782682..5d1f1cdeb 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -3,7 +3,7 @@ namespace Enqueue\Sqs\Tests; use Aws\Result; -use Aws\Sqs\SqsClient; +use Enqueue\Sqs\SqsClient; use Enqueue\Sqs\SqsConsumer; use Enqueue\Sqs\SqsContext; use Enqueue\Sqs\SqsDestination; @@ -53,13 +53,17 @@ public function testCouldAcknowledgeMessage() $client ->expects($this->once()) ->method('deleteMessage') - ->with($this->identicalTo(['QueueUrl' => 'theQueueUrl', 'ReceiptHandle' => 'theReceipt'])) + ->with($this->identicalTo([ + '@region' => null, + 'QueueUrl' => 'theQueueUrl', + 'ReceiptHandle' => 'theReceipt', + ])) ; $context = $this->createContextMock(); $context ->expects($this->once()) - ->method('getClient') + ->method('getSqsClient') ->willReturn($client) ; $context @@ -75,6 +79,41 @@ public function testCouldAcknowledgeMessage() $consumer->acknowledge($message); } + public function testCouldAcknowledgeMessageWithCustomRegion() + { + $client = $this->createSqsClientMock(); + $client + ->expects($this->once()) + ->method('deleteMessage') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueUrl' => 'theQueueUrl', + 'ReceiptHandle' => 'theReceipt', + ])) + ; + + $context = $this->createContextMock(); + $context + ->expects($this->once()) + ->method('getSqsClient') + ->willReturn($client) + ; + $context + ->expects($this->once()) + ->method('getQueueUrl') + ->willReturn('theQueueUrl') + ; + + $message = new SqsMessage(); + $message->setReceiptHandle('theReceipt'); + + $destination = new SqsDestination('queue'); + $destination->setRegion('theRegion'); + + $consumer = new SqsConsumer($context, $destination); + $consumer->acknowledge($message); + } + public function testRejectShouldThrowIfInstanceOfMessageIsInvalid() { $this->expectException(InvalidMessageException::class); @@ -90,13 +129,17 @@ public function testShouldRejectMessage() $client ->expects($this->once()) ->method('deleteMessage') - ->with($this->identicalTo(['QueueUrl' => 'theQueueUrl', 'ReceiptHandle' => 'theReceipt'])) + ->with($this->identicalTo([ + '@region' => null, + 'QueueUrl' => 'theQueueUrl', + 'ReceiptHandle' => 'theReceipt', + ])) ; $context = $this->createContextMock(); $context ->expects($this->once()) - ->method('getClient') + ->method('getSqsClient') ->willReturn($client) ; $context @@ -116,13 +159,56 @@ public function testShouldRejectMessage() $consumer->reject($message); } + public function testShouldRejectMessageWithCustomRegion() + { + $client = $this->createSqsClientMock(); + $client + ->expects($this->once()) + ->method('deleteMessage') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueUrl' => 'theQueueUrl', + 'ReceiptHandle' => 'theReceipt', + ])) + ; + + $context = $this->createContextMock(); + $context + ->expects($this->once()) + ->method('getSqsClient') + ->willReturn($client) + ; + $context + ->expects($this->once()) + ->method('getQueueUrl') + ->willReturn('theQueueUrl') + ; + $context + ->expects($this->never()) + ->method('createProducer') + ; + + $message = new SqsMessage(); + $message->setReceiptHandle('theReceipt'); + + $destination = new SqsDestination('queue'); + $destination->setRegion('theRegion'); + + $consumer = new SqsConsumer($context, $destination); + $consumer->reject($message); + } + public function testShouldRejectMessageAndRequeue() { $client = $this->createSqsClientMock(); $client ->expects($this->once()) ->method('deleteMessage') - ->with($this->identicalTo(['QueueUrl' => 'theQueueUrl', 'ReceiptHandle' => 'theReceipt'])) + ->with($this->identicalTo([ + '@region' => null, + 'QueueUrl' => 'theQueueUrl', + 'ReceiptHandle' => 'theReceipt', + ])) ; $message = new SqsMessage(); @@ -140,7 +226,7 @@ public function testShouldRejectMessageAndRequeue() $context = $this->createContextMock(); $context ->expects($this->once()) - ->method('getClient') + ->method('getSqsClient') ->willReturn($client) ; $context @@ -161,6 +247,7 @@ public function testShouldRejectMessageAndRequeue() public function testShouldReceiveMessage() { $expectedAttributes = [ + '@region' => null, 'AttributeNames' => ['All'], 'MessageAttributeNames' => ['All'], 'MaxNumberOfMessages' => 1, @@ -193,7 +280,7 @@ public function testShouldReceiveMessage() $context = $this->createContextMock(); $context ->expects($this->once()) - ->method('getClient') + ->method('getSqsClient') ->willReturn($client) ; $context @@ -218,9 +305,67 @@ public function testShouldReceiveMessage() $this->assertEquals('The Receipt', $result->getReceiptHandle()); } + public function testShouldReceiveMessageWithCustomRegion() + { + $expectedAttributes = [ + '@region' => 'theRegion', + 'AttributeNames' => ['All'], + 'MessageAttributeNames' => ['All'], + 'MaxNumberOfMessages' => 1, + 'QueueUrl' => 'theQueueUrl', + 'WaitTimeSeconds' => 0, + ]; + + $client = $this->createSqsClientMock(); + $client + ->expects($this->once()) + ->method('receiveMessage') + ->with($this->identicalTo($expectedAttributes)) + ->willReturn(new Result(['Messages' => [[ + 'Body' => 'The Body', + 'ReceiptHandle' => 'The Receipt', + 'Attributes' => [ + 'ApproximateReceiveCount' => 3, + ], + 'MessageAttributes' => [ + 'Headers' => [ + 'StringValue' => json_encode([['hkey' => 'hvalue'], ['key' => 'value']]), + 'DataType' => 'String', + ], + ], + ]]])) + ; + + $context = $this->createContextMock(); + $context + ->expects($this->once()) + ->method('getSqsClient') + ->willReturn($client) + ; + $context + ->expects($this->once()) + ->method('getQueueUrl') + ->willReturn('theQueueUrl') + ; + $context + ->expects($this->once()) + ->method('createMessage') + ->willReturn(new SqsMessage()) + ; + + $destination = new SqsDestination('queue'); + $destination->setRegion('theRegion'); + + $consumer = new SqsConsumer($context, $destination); + $result = $consumer->receiveNoWait(); + + $this->assertInstanceOf(SqsMessage::class, $result); + } + public function testShouldReturnNullIfThereIsNoNewMessage() { $expectedAttributes = [ + '@region' => null, 'AttributeNames' => ['All'], 'MessageAttributeNames' => ['All'], 'MaxNumberOfMessages' => 1, @@ -239,7 +384,7 @@ public function testShouldReturnNullIfThereIsNoNewMessage() $context = $this->createContextMock(); $context ->expects($this->once()) - ->method('getClient') + ->method('getSqsClient') ->willReturn($client) ; $context @@ -261,7 +406,7 @@ public function testShouldReturnNullIfThereIsNoNewMessage() /** * @return \PHPUnit_Framework_MockObject_MockObject|SqsProducer */ - private function createProducerMock() + private function createProducerMock(): SqsProducer { return $this->createMock(SqsProducer::class); } @@ -269,19 +414,15 @@ private function createProducerMock() /** * @return \PHPUnit_Framework_MockObject_MockObject|SqsClient */ - private function createSqsClientMock() + private function createSqsClientMock(): SqsClient { - return $this->getMockBuilder(SqsClient::class) - ->disableOriginalConstructor() - ->setMethods(['deleteMessage', 'receiveMessage']) - ->getMock() - ; + return $this->createMock(SqsClient::class); } /** * @return \PHPUnit_Framework_MockObject_MockObject|SqsContext */ - private function createContextMock() + private function createContextMock(): SqsContext { return $this->createMock(SqsContext::class); } diff --git a/pkg/sqs/Tests/SqsContextTest.php b/pkg/sqs/Tests/SqsContextTest.php index 06d2413cd..53dfc4358 100644 --- a/pkg/sqs/Tests/SqsContextTest.php +++ b/pkg/sqs/Tests/SqsContextTest.php @@ -3,7 +3,7 @@ namespace Enqueue\Sqs\Tests; use Aws\Result; -use Aws\Sqs\SqsClient; +use Enqueue\Sqs\SqsClient; use Enqueue\Sqs\SqsConsumer; use Enqueue\Sqs\SqsContext; use Enqueue\Sqs\SqsDestination; @@ -14,8 +14,9 @@ use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\TemporaryQueueNotSupportedException; use Interop\Queue\Queue; +use PHPUnit\Framework\TestCase; -class SqsContextTest extends \PHPUnit\Framework\TestCase +class SqsContextTest extends TestCase { use ClassExtensionTrait; @@ -29,20 +30,6 @@ public function testCouldBeConstructedWithSqsClientAsFirstArgument() new SqsContext($this->createSqsClientMock(), []); } - public function testCouldBeConstructedWithSqsClientFactoryAsFirstArgument() - { - new SqsContext(function () { - return $this->createSqsClientMock(); - }, []); - } - - public function testThrowIfNeitherSqsClientNorFactoryGiven() - { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('The $client argument must be either Aws\Sqs\SqsClient or callable that returns Aws\Sqs\SqsClient once called.'); - new SqsContext(new \stdClass(), []); - } - public function testShouldAllowCreateEmptyMessage() { $context = new SqsContext($this->createSqsClientMock(), []); @@ -140,7 +127,34 @@ public function testShouldAllowDeclareQueue() $sqsClient ->expects($this->once()) ->method('createQueue') - ->with($this->identicalTo(['Attributes' => [], 'QueueName' => 'aQueueName'])) + ->with($this->identicalTo([ + '@region' => null, + 'Attributes' => [], + 'QueueName' => 'aQueueName', + ])) + ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) + ; + + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); + + $queue = $context->createQueue('aQueueName'); + + $context->declareQueue($queue); + } + + public function testShouldAllowDeclareQueueWithCustomRegion() + { + $sqsClient = $this->createSqsClientMock(); + $sqsClient + ->expects($this->once()) + ->method('createQueue') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'Attributes' => [], + 'QueueName' => 'aQueueName', + ])) ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) ; @@ -149,6 +163,7 @@ public function testShouldAllowDeclareQueue() ]); $queue = $context->createQueue('aQueueName'); + $queue->setRegion('theRegion'); $context->declareQueue($queue); } @@ -159,7 +174,10 @@ public function testShouldAllowDeleteQueue() $sqsClient ->expects($this->once()) ->method('getQueueUrl') - ->with($this->identicalTo(['QueueName' => 'aQueueName'])) + ->with($this->identicalTo([ + '@region' => null, + 'QueueName' => 'aQueueName', + ])) ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) ; $sqsClient @@ -178,19 +196,85 @@ public function testShouldAllowDeleteQueue() $context->deleteQueue($queue); } + public function testShouldAllowDeleteQueueWithCustomRegion() + { + $sqsClient = $this->createSqsClientMock(); + $sqsClient + ->expects($this->once()) + ->method('getQueueUrl') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueName' => 'aQueueName', + ])) + ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) + ; + $sqsClient + ->expects($this->once()) + ->method('deleteQueue') + ->with($this->identicalTo(['QueueUrl' => 'theQueueUrl'])) + ->willReturn(new Result()) + ; + + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); + + $queue = $context->createQueue('aQueueName'); + $queue->setRegion('theRegion'); + + $context->deleteQueue($queue); + } + public function testShouldAllowPurgeQueue() { $sqsClient = $this->createSqsClientMock(); $sqsClient ->expects($this->once()) ->method('getQueueUrl') - ->with($this->identicalTo(['QueueName' => 'aQueueName'])) + ->with($this->identicalTo([ + '@region' => null, + 'QueueName' => 'aQueueName', + ])) + ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) + ; + $sqsClient + ->expects($this->once()) + ->method('purgeQueue') + ->with($this->identicalTo([ + '@region' => null, + 'QueueUrl' => 'theQueueUrl', + ])) + ->willReturn(new Result()) + ; + + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); + + $queue = $context->createQueue('aQueueName'); + + $context->purgeQueue($queue); + } + + public function testShouldAllowPurgeQueueWithCustomRegion() + { + $sqsClient = $this->createSqsClientMock(); + $sqsClient + ->expects($this->once()) + ->method('getQueueUrl') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueName' => 'aQueueName', + ])) ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) ; $sqsClient ->expects($this->once()) ->method('purgeQueue') - ->with($this->identicalTo(['QueueUrl' => 'theQueueUrl'])) + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueUrl' => 'theQueueUrl', + ])) ->willReturn(new Result()) ; @@ -199,6 +283,7 @@ public function testShouldAllowPurgeQueue() ]); $queue = $context->createQueue('aQueueName'); + $queue->setRegion('theRegion'); $context->purgeQueue($queue); } @@ -209,7 +294,10 @@ public function testShouldAllowGetQueueUrl() $sqsClient ->expects($this->once()) ->method('getQueueUrl') - ->with($this->identicalTo(['QueueName' => 'aQueueName'])) + ->with($this->identicalTo([ + '@region' => null, + 'QueueName' => 'aQueueName', + ])) ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) ; @@ -220,6 +308,29 @@ public function testShouldAllowGetQueueUrl() $context->getQueueUrl(new SqsDestination('aQueueName')); } + public function testShouldAllowGetQueueUrlWithCustomRegion() + { + $sqsClient = $this->createSqsClientMock(); + $sqsClient + ->expects($this->once()) + ->method('getQueueUrl') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueName' => 'aQueueName', + ])) + ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) + ; + + $context = new SqsContext($sqsClient, [ + 'queue_owner_aws_account_id' => null, + ]); + + $queue = new SqsDestination('aQueueName'); + $queue->setRegion('theRegion'); + + $context->getQueueUrl($queue); + } + public function testShouldAllowGetQueueUrlFromAnotherAWSAccountSetGlobally() { $sqsClient = $this->createSqsClientMock(); @@ -227,6 +338,7 @@ public function testShouldAllowGetQueueUrlFromAnotherAWSAccountSetGlobally() ->expects($this->once()) ->method('getQueueUrl') ->with($this->identicalTo([ + '@region' => null, 'QueueName' => 'aQueueName', 'QueueOwnerAWSAccountId' => 'anotherAWSAccountID', ])) @@ -247,6 +359,7 @@ public function testShouldAllowGetQueueUrlFromAnotherAWSAccountSetPerQueue() ->expects($this->once()) ->method('getQueueUrl') ->with($this->identicalTo([ + '@region' => null, 'QueueName' => 'aQueueName', 'QueueOwnerAWSAccountId' => 'anotherAWSAccountID', ])) @@ -269,7 +382,10 @@ public function testShouldThrowExceptionIfGetQueueUrlResultHasNoQueueUrlProperty $sqsClient ->expects($this->once()) ->method('getQueueUrl') - ->with($this->identicalTo(['QueueName' => 'aQueueName'])) + ->with($this->identicalTo([ + '@region' => null, + 'QueueName' => 'aQueueName', + ])) ->willReturn(new Result([])) ; @@ -286,12 +402,8 @@ public function testShouldThrowExceptionIfGetQueueUrlResultHasNoQueueUrlProperty /** * @return \PHPUnit_Framework_MockObject_MockObject|SqsClient */ - private function createSqsClientMock() + private function createSqsClientMock(): SqsClient { - return $this->getMockBuilder(SqsClient::class) - ->disableOriginalConstructor() - ->setMethods(['deleteQueue', 'purgeQueue', 'createQueue', 'getQueueUrl']) - ->getMock() - ; + return $this->createMock(SqsClient::class); } } diff --git a/pkg/sqs/Tests/SqsProducerTest.php b/pkg/sqs/Tests/SqsProducerTest.php index fe5e9428b..a33b98f76 100644 --- a/pkg/sqs/Tests/SqsProducerTest.php +++ b/pkg/sqs/Tests/SqsProducerTest.php @@ -3,7 +3,7 @@ namespace Enqueue\Sqs\Tests; use Aws\Result; -use Aws\Sqs\SqsClient; +use Enqueue\Sqs\SqsClient; use Enqueue\Sqs\SqsContext; use Enqueue\Sqs\SqsDestination; use Enqueue\Sqs\SqsMessage; @@ -68,7 +68,7 @@ public function testShouldThrowIfSendMessageFailed() ; $context ->expects($this->once()) - ->method('getClient') + ->method('getSqsClient') ->will($this->returnValue($client)) ; @@ -85,6 +85,7 @@ public function testShouldThrowIfSendMessageFailed() public function testShouldSendMessage() { $expectedArguments = [ + '@region' => null, 'MessageAttributes' => [ 'Headers' => [ 'DataType' => 'String', @@ -103,7 +104,7 @@ public function testShouldSendMessage() ->expects($this->once()) ->method('sendMessage') ->with($this->identicalTo($expectedArguments)) - ->willReturn(new Result()) + ->willReturn(new Result(['MessageId' => 'theMessageId'])) ; $context = $this->createSqsContextMock(); @@ -114,7 +115,7 @@ public function testShouldSendMessage() ; $context ->expects($this->once()) - ->method('getClient') + ->method('getSqsClient') ->will($this->returnValue($client)) ; @@ -124,8 +125,48 @@ public function testShouldSendMessage() $message->setMessageDeduplicationId('theDeduplicationId'); $message->setMessageGroupId('groupId'); - $this->expectException(\RuntimeException::class); - $this->expectExceptionMessage('Message was not sent'); + $producer = new SqsProducer($context); + $producer->send($destination, $message); + } + + public function testShouldSendMessageWithCustomRegion() + { + $expectedArguments = [ + '@region' => 'theRegion', + 'MessageAttributes' => [ + 'Headers' => [ + 'DataType' => 'String', + 'StringValue' => '[[],[]]', + ], + ], + 'MessageBody' => 'theBody', + 'QueueUrl' => 'theQueueUrl', + ]; + + $client = $this->createSqsClientMock(); + $client + ->expects($this->once()) + ->method('sendMessage') + ->with($this->identicalTo($expectedArguments)) + ->willReturn(new Result(['MessageId' => 'theMessageId'])) + ; + + $context = $this->createSqsContextMock(); + $context + ->expects($this->once()) + ->method('getQueueUrl') + ->willReturn('theQueueUrl') + ; + $context + ->expects($this->once()) + ->method('getSqsClient') + ->will($this->returnValue($client)) + ; + + $destination = new SqsDestination('queue-name'); + $destination->setRegion('theRegion'); + + $message = new SqsMessage('theBody'); $producer = new SqsProducer($context); $producer->send($destination, $message); @@ -134,6 +175,7 @@ public function testShouldSendMessage() public function testShouldSendDelayedMessage() { $expectedArguments = [ + '@region' => null, 'MessageAttributes' => [ 'Headers' => [ 'DataType' => 'String', @@ -152,7 +194,7 @@ public function testShouldSendDelayedMessage() ->expects($this->once()) ->method('sendMessage') ->with($this->identicalTo($expectedArguments)) - ->willReturn(new Result()) + ->willReturn(new Result(['MessageId' => 'theMessageId'])) ; $context = $this->createSqsContextMock(); @@ -163,7 +205,7 @@ public function testShouldSendDelayedMessage() ; $context ->expects($this->once()) - ->method('getClient') + ->method('getSqsClient') ->will($this->returnValue($client)) ; @@ -173,9 +215,6 @@ public function testShouldSendDelayedMessage() $message->setMessageDeduplicationId('theDeduplicationId'); $message->setMessageGroupId('groupId'); - $this->expectException(\RuntimeException::class); - $this->expectExceptionMessage('Message was not sent'); - $producer = new SqsProducer($context); $producer->setDeliveryDelay(5000); $producer->send($destination, $message); @@ -184,7 +223,7 @@ public function testShouldSendDelayedMessage() /** * @return \PHPUnit_Framework_MockObject_MockObject|SqsContext */ - private function createSqsContextMock() + private function createSqsContextMock(): SqsContext { return $this->createMock(SqsContext::class); } @@ -192,13 +231,8 @@ private function createSqsContextMock() /** * @return \PHPUnit_Framework_MockObject_MockObject|SqsClient */ - private function createSqsClientMock() + private function createSqsClientMock(): SqsClient { - return $this - ->getMockBuilder(SqsClient::class) - ->disableOriginalConstructor() - ->setMethods(['sendMessage']) - ->getMock() - ; + return $this->createMock(SqsClient::class); } } From 2416b285384994d2565967656812a5bc224e6232 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 3 Dec 2018 15:19:34 +0200 Subject: [PATCH 0466/1142] [sqs][docs] Add docs for multi sqs client use --- docs/transport/sqs.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/transport/sqs.md b/docs/transport/sqs.md index 3e014ca99..235df6ccd 100644 --- a/docs/transport/sqs.md +++ b/docs/transport/sqs.md @@ -142,4 +142,23 @@ $queue = $context->createQueue('foo'); $queue->setQueueOwnerAWSAccountId('awsAccountId'); ``` +## Multi region examples + +Enqueue SQS provides a generic multi-region support. This enables users to specify which AWS Region to send a command to by setting region on SqsDestination. +You might need it to access SQS FIFO queue because they are not available for all regions. +If not specified the default region is used. + +```php +createContext(); + +$queue = $context->createQueue('foo'); +$queue->setRegion('us-west-2'); + +// the request goes to US West (Oregon) Region +$context->declareQueue($queue); +``` + [back to index](../index.md) From f9bd13f52e988aee78082bc27f226834b2fc78af Mon Sep 17 00:00:00 2001 From: Lars Greiss Date: Wed, 5 Dec 2018 19:59:50 +0100 Subject: [PATCH 0467/1142] [fs] Do not throw error in jsonUnserialize on deprecation notice Caused by queue-interop package [ErrorException] The "Enqueue\Fs\FsMessage" class implements "Interop\Queue\PsrMessage" that is deprecated will be removed in later versions. use one without Psr prefix. * The Message interface is the root interface of all transport messages. Most message-oriented middleware (MOM) products treat messages as lightweight entities that consist of a header and a payload. The header contains fields used for message routing an d identification; the payload contains the application data being sent. * Within this general form, the definition of a message varies significantly across products. thrown here: https://github.com/ssiergl/enqueue-dev/blob/master/pkg/fs/FsConsumer.php#L131 --- pkg/fs/FsContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/fs/FsContext.php b/pkg/fs/FsContext.php index 0d499526c..480074e03 100644 --- a/pkg/fs/FsContext.php +++ b/pkg/fs/FsContext.php @@ -105,7 +105,7 @@ public function workWithFile(FsDestination $destination, string $mode, callable set_error_handler(function ($severity, $message, $file, $line) { throw new \ErrorException($message, 0, $severity, $file, $line); - }); + }, E_ALL & ~E_USER_DEPRECATED); try { $file = fopen((string) $destination->getFileInfo(), $mode); From 2af7a2d9eab3e4290a8c789631fa1bbb69ebcd74 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 6 Dec 2018 08:45:25 +0200 Subject: [PATCH 0468/1142] Amazon SNS transport. --- composer.json | 3 +- docker-compose.yml | 4 +- phpunit.xml.dist | 4 + pkg/sns/.gitattributes | 5 + pkg/sns/.gitignore | 6 + pkg/sns/.travis.yml | 21 ++ pkg/sns/LICENSE | 20 ++ pkg/sns/README.md | 28 +++ pkg/sns/SnsClient.php | 128 ++++++++++ pkg/sns/SnsConnectionFactory.php | 149 ++++++++++++ pkg/sns/SnsContext.php | 148 +++++++++++ pkg/sns/SnsDestination.php | 91 +++++++ pkg/sns/SnsMessage.php | 33 +++ pkg/sns/SnsProducer.php | 119 +++++++++ pkg/sns/SnsSubscribe.php | 39 +++ pkg/sns/Tests/SnsClientTest.php | 229 ++++++++++++++++++ .../Tests/SnsConnectionFactoryConfigTest.php | 152 ++++++++++++ pkg/sns/Tests/SnsConnectionFactoryTest.php | 79 ++++++ pkg/sns/Tests/SnsDestinationTest.php | 52 ++++ pkg/sns/Tests/SnsProducerTest.php | 144 +++++++++++ .../Tests/Spec/SnsConnectionFactoryTest.php | 18 ++ pkg/sns/Tests/Spec/SnsContextTest.php | 25 ++ pkg/sns/Tests/Spec/SnsMessageTest.php | 14 ++ pkg/sns/Tests/Spec/SnsProducerTest.php | 15 ++ pkg/sns/Tests/Spec/SnsQueueTest.php | 14 ++ pkg/sns/Tests/Spec/SnsTopicTest.php | 14 ++ pkg/sns/composer.json | 38 +++ pkg/sns/examples/consume.php | 33 +++ pkg/sns/examples/produce.php | 34 +++ pkg/sns/phpunit.xml.dist | 30 +++ pkg/sqs/README.md | 4 +- pkg/sqs/SqsClient.php | 7 +- pkg/sqs/SqsContext.php | 29 +++ pkg/sqs/Tests/SqsClientTest.php | 14 ++ pkg/sqs/Tests/SqsContextTest.php | 30 +++ pkg/test/SnsExtension.php | 18 ++ 36 files changed, 1786 insertions(+), 5 deletions(-) create mode 100644 pkg/sns/.gitattributes create mode 100644 pkg/sns/.gitignore create mode 100644 pkg/sns/.travis.yml create mode 100644 pkg/sns/LICENSE create mode 100644 pkg/sns/README.md create mode 100644 pkg/sns/SnsClient.php create mode 100644 pkg/sns/SnsConnectionFactory.php create mode 100644 pkg/sns/SnsContext.php create mode 100644 pkg/sns/SnsDestination.php create mode 100644 pkg/sns/SnsMessage.php create mode 100644 pkg/sns/SnsProducer.php create mode 100644 pkg/sns/SnsSubscribe.php create mode 100644 pkg/sns/Tests/SnsClientTest.php create mode 100644 pkg/sns/Tests/SnsConnectionFactoryConfigTest.php create mode 100644 pkg/sns/Tests/SnsConnectionFactoryTest.php create mode 100644 pkg/sns/Tests/SnsDestinationTest.php create mode 100644 pkg/sns/Tests/SnsProducerTest.php create mode 100644 pkg/sns/Tests/Spec/SnsConnectionFactoryTest.php create mode 100644 pkg/sns/Tests/Spec/SnsContextTest.php create mode 100644 pkg/sns/Tests/Spec/SnsMessageTest.php create mode 100644 pkg/sns/Tests/Spec/SnsProducerTest.php create mode 100644 pkg/sns/Tests/Spec/SnsQueueTest.php create mode 100644 pkg/sns/Tests/Spec/SnsTopicTest.php create mode 100644 pkg/sns/composer.json create mode 100644 pkg/sns/examples/consume.php create mode 100644 pkg/sns/examples/produce.php create mode 100644 pkg/sns/phpunit.xml.dist create mode 100644 pkg/test/SnsExtension.php diff --git a/composer.json b/composer.json index ff9db427d..500ff2d06 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "doctrine/orm": "~2.4", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3", - "aws/aws-sdk-php": "~3.26", + "aws/aws-sdk-php": "^3.26", "stomp-php/stomp-php": "^4", "php-http/guzzle6-adapter": "^1.1", "php-http/client-common": "^1.7@dev", @@ -75,6 +75,7 @@ "Enqueue\\Redis\\": "pkg/redis/", "Enqueue\\SimpleClient\\": "pkg/simple-client/", "Enqueue\\Sqs\\": "pkg/sqs/", + "Enqueue\\Sns\\": "pkg/sns/", "Enqueue\\Stomp\\": "pkg/stomp/", "Enqueue\\Test\\": "pkg/test/", "Enqueue\\Dsn\\": "pkg/dsn/", diff --git a/docker-compose.yml b/docker-compose.yml index cc8451fbc..3d50a6940 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,6 +31,7 @@ services: - PHPREDIS_DSN=redis+phpredis://redis - GPS_DSN=gps:?projectId=mqdev&emulatorHost=http://google-pubsub:8085 - SQS_DSN=sqs:?key=key&secret=secret®ion=us-east-1&endpoint=http://localstack:4576&version=latest + - SNS_DSN=sns:?key=key&secret=secret®ion=us-east-1&endpoint=http://localstack:4575&version=latest - WAMP_DSN=wamp://thruway:9090 - REDIS_HOST=redis - REDIS_PORT=6379 @@ -121,9 +122,10 @@ services: image: 'localstack/localstack:latest' ports: - '4576:4576' + - '4575:4575' environment: HOSTNAME_EXTERNAL: 'localstack' - SERVICES: 'sqs' + SERVICES: 'sqs,sns' influxdb: image: 'influxdb:latest' diff --git a/phpunit.xml.dist b/phpunit.xml.dist index f1c8f205f..5c5501702 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -61,6 +61,10 @@ pkg/sqs/Tests + + pkg/sns/Tests + + pkg/pheanstalk/Tests diff --git a/pkg/sns/.gitattributes b/pkg/sns/.gitattributes new file mode 100644 index 000000000..bdf2dcb14 --- /dev/null +++ b/pkg/sns/.gitattributes @@ -0,0 +1,5 @@ +/Tests export-ignore +.gitattributes export-ignore +.gitignore export-ignore +.travis.yml export-ignore +phpunit.xml.dist export-ignore diff --git a/pkg/sns/.gitignore b/pkg/sns/.gitignore new file mode 100644 index 000000000..a770439e5 --- /dev/null +++ b/pkg/sns/.gitignore @@ -0,0 +1,6 @@ +*~ +/composer.lock +/composer.phar +/phpunit.xml +/vendor/ +/.idea/ diff --git a/pkg/sns/.travis.yml b/pkg/sns/.travis.yml new file mode 100644 index 000000000..9ed4fa123 --- /dev/null +++ b/pkg/sns/.travis.yml @@ -0,0 +1,21 @@ +sudo: false + +git: + depth: 10 + +language: php + +php: + - '7.1' + - '7.2' + +cache: + directories: + - $HOME/.composer/cache + +install: + - composer self-update + - composer install --prefer-source + +script: + - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/sns/LICENSE b/pkg/sns/LICENSE new file mode 100644 index 000000000..20211e5fd --- /dev/null +++ b/pkg/sns/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) +Copyright (c) 2018 Max Kotliar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pkg/sns/README.md b/pkg/sns/README.md new file mode 100644 index 000000000..bcec08c1e --- /dev/null +++ b/pkg/sns/README.md @@ -0,0 +1,28 @@ +

Supporting Enqueue

+ +Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: + +- [Become a sponsor](https://www.patreon.com/makasim) +- [Become our client](http://forma-pro.com/) + +--- + +# Amazon SNS Transport + +[![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) +[![Build Status](https://travis-ci.org/php-enqueue/sns.png?branch=master)](https://travis-ci.org/php-enqueue/sns) +[![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns) +[![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) + +This is an implementation of Queue Interop specification. It allows you to send and consume message using [Amazon SNS](https://aws.amazon.com/sns/) service. + +## Resources + +* [Site](https://enqueue.forma-pro.com/) +* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/transport/sns.md) +* [Questions](https://gitter.im/php-enqueue/Lobby) +* [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) + +## License + +It is released under the [MIT License](LICENSE). \ No newline at end of file diff --git a/pkg/sns/SnsClient.php b/pkg/sns/SnsClient.php new file mode 100644 index 000000000..6b5f6a337 --- /dev/null +++ b/pkg/sns/SnsClient.php @@ -0,0 +1,128 @@ +inputClient = $inputClient; + } + + public function createTopic(array $args): Result + { + return $this->callApi('createTopic', $args); + } + + public function publish(array $args): Result + { + return $this->callApi('publish', $args); + } + + public function subscribe(array $args): Result + { + return $this->callApi('subscribe', $args); + } + + public function getAWSClient(): AwsSnsClient + { + $this->resolveClient(); + + if ($this->singleClient) { + return $this->singleClient; + } + + if ($this->multiClient) { + $mr = new \ReflectionMethod($this->multiClient, 'getClientFromPool'); + $mr->setAccessible(true); + $singleClient = $mr->invoke($this->multiClient, $this->multiClient->getRegion()); + $mr->setAccessible(false); + + return $singleClient; + } + + throw new \LogicException('The multi or single client must be set'); + } + + private function callApi(string $name, array $args): Result + { + $this->resolveClient(); + + if ($this->singleClient) { + if (false == empty($args['@region'])) { + throw new \LogicException('Cannot send message to another region because transport is configured with single aws client'); + } + + unset($args['@region']); + + return call_user_func([$this->singleClient, $name], $args); + } + + if ($this->multiClient) { + return call_user_func([$this->multiClient, $name], $args); + } + + throw new \LogicException('The multi or single client must be set'); + } + + private function resolveClient(): void + { + if ($this->singleClient || $this->multiClient) { + return; + } + + $client = $this->inputClient; + if ($client instanceof MultiRegionClient) { + $this->multiClient = $client; + + return; + } elseif ($client instanceof AwsSnsClient) { + $this->singleClient = $client; + + return; + } elseif (is_callable($client)) { + $client = call_user_func($client); + if ($client instanceof MultiRegionClient) { + $this->multiClient = $client; + + return; + } + if ($client instanceof AwsSnsClient) { + $this->singleClient = $client; + + return; + } + } + + throw new \LogicException(sprintf( + 'The input client must be an instance of "%s" or "%s" or a callable that returns one of those. Got "%s"', + AwsSnsClient::class, + MultiRegionClient::class, + is_object($client) ? get_class($client) : gettype($client) + )); + } +} diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php new file mode 100644 index 000000000..ffef39803 --- /dev/null +++ b/pkg/sns/SnsConnectionFactory.php @@ -0,0 +1,149 @@ + null AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'secret' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'token' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'region' => null, (string, required) Region to connect to. See http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of available regions. + * 'version' => '2012-11-05', (string, required) The version of the webservice to utilize + * 'lazy' => true, Enable lazy connection (boolean) + * 'endpoint' => null (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack + * ]. + * + * or + * + * sns: + * sns::?key=aKey&secret=aSecret&token=aToken + * + * @param array|string|SnsClient|null $config + */ + public function __construct($config = 'sns:') + { + if ($config instanceof AwsSnsClient) { + $this->client = new SnsClient($config); + $this->config = ['lazy' => false] + $this->defaultConfig(); + + return; + } + + if (empty($config)) { + $config = []; + } elseif (is_string($config)) { + $config = $this->parseDsn($config); + } elseif (is_array($config)) { + if (array_key_exists('dsn', $config)) { + $config = array_replace_recursive($config, $this->parseDsn($config['dsn'])); + + unset($config['dsn']); + } + } else { + throw new \LogicException(sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSnsClient::class)); + } + + $this->config = array_replace($this->defaultConfig(), $config); + } + + /** + * @return SnsContext + */ + public function createContext(): Context + { + return new SnsContext($this->establishConnection(), $this->config); + } + + private function establishConnection(): SnsClient + { + if ($this->client) { + return $this->client; + } + + $config = [ + 'version' => $this->config['version'], + 'region' => $this->config['region'], + ]; + + if (isset($this->config['endpoint'])) { + $config['endpoint'] = $this->config['endpoint']; + } + + if ($this->config['key'] && $this->config['secret']) { + $config['credentials'] = [ + 'key' => $this->config['key'], + 'secret' => $this->config['secret'], + ]; + + if ($this->config['token']) { + $config['credentials']['token'] = $this->config['token']; + } + } + + $establishConnection = function () use ($config) { + return (new Sdk(['Sns' => $config]))->createMultiRegionSns(); + }; + + $this->client = $this->config['lazy'] ? + new SnsClient($establishConnection) : + new SnsClient($establishConnection()) + ; + + return $this->client; + } + + private function parseDsn(string $dsn): array + { + $dsn = Dsn::parseFirst($dsn); + + if ('sns' !== $dsn->getSchemeProtocol()) { + throw new \LogicException(sprintf( + 'The given scheme protocol "%s" is not supported. It must be "sns"', + $dsn->getSchemeProtocol() + )); + } + + return array_filter(array_replace($dsn->getQuery(), [ + 'key' => $dsn->getString('key'), + 'secret' => $dsn->getString('secret'), + 'token' => $dsn->getString('token'), + 'region' => $dsn->getString('region'), + 'version' => $dsn->getString('version'), + 'lazy' => $dsn->getBool('lazy'), + 'endpoint' => $dsn->getString('endpoint'), + ]), function ($value) { return null !== $value; }); + } + + private function defaultConfig(): array + { + return [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => true, + 'endpoint' => null, + ]; + } +} diff --git a/pkg/sns/SnsContext.php b/pkg/sns/SnsContext.php new file mode 100644 index 000000000..818eda4a7 --- /dev/null +++ b/pkg/sns/SnsContext.php @@ -0,0 +1,148 @@ +client = $client; + $this->config = $config; + + $this->topicArns = []; + } + + /** + * @return SnsMessage + */ + public function createMessage(string $body = '', array $properties = [], array $headers = []): Message + { + return new SnsMessage($body, $properties, $headers); + } + + /** + * @return SnsDestination + */ + public function createTopic(string $topicName): Topic + { + return new SnsDestination($topicName); + } + + /** + * @return SnsDestination + */ + public function createQueue(string $queueName): Queue + { + return new SnsDestination($queueName); + } + + public function declareTopic(SnsDestination $destination): void + { + $result = $this->client->createTopic([ + 'Attributes' => $destination->getAttributes(), + 'Name' => $destination->getQueueName(), + ]); + + if (false == $result->hasKey('TopicArn')) { + throw new \RuntimeException(sprintf('Cannot create topic. topicName: "%s"', $destination->getTopicName())); + } + + $this->topicArns[$destination->getTopicName()] = (string) $result->get('TopicArn'); + } + + public function subscribe(SnsSubscribe $subscribe): void + { + $this->client->subscribe([ + 'Attributes' => $subscribe->getAttributes(), + 'Endpoint' => $subscribe->getEndpoint(), + //'Protocol' => '', // REQUIRED +//'ReturnSubscriptionArn' => true || false, +//'TopicArn' => '', // REQUIRED +//]); + ]); + } + + public function getTopicArn(SnsDestination $destination): string + { + if (false == array_key_exists($destination->getTopicName(), $this->topicArns)) { + $this->declareTopic($destination); + } + + return $this->topicArns[$destination->getTopicName()]; + } + + public function createTemporaryQueue(): Queue + { + throw TemporaryQueueNotSupportedException::providerDoestNotSupportIt(); + } + + /** + * @return SnsProducer + */ + public function createProducer(): Producer + { + return new SnsProducer($this); + } + + /** + * @param SnsDestination $destination + */ + public function createConsumer(Destination $destination): Consumer + { + throw new \LogicException('SNS transport does not support consumption. You should consider using SQS instead.'); + } + + public function close(): void + { + } + + /** + * @param SnsDestination $queue + */ + public function purgeQueue(Queue $queue): void + { + PurgeQueueNotSupportedException::providerDoestNotSupportIt(); + } + + public function createSubscriptionConsumer(): SubscriptionConsumer + { + throw SubscriptionConsumerNotSupportedException::providerDoestNotSupportIt(); + } + + public function getAwsSnsClient(): AwsSnsClient + { + return $this->client->getAWSClient(); + } + + public function getSnsClient(): SnsClient + { + return $this->client; + } +} diff --git a/pkg/sns/SnsDestination.php b/pkg/sns/SnsDestination.php new file mode 100644 index 000000000..0db9d914e --- /dev/null +++ b/pkg/sns/SnsDestination.php @@ -0,0 +1,91 @@ +name = $name; + $this->attributes = []; + } + + public function getQueueName(): string + { + return $this->name; + } + + public function getTopicName(): string + { + return $this->name; + } + + /** + * The policy that defines who can access your topic. By default, only the topic owner can publish or subscribe to the topic. + */ + public function setPolicy(string $policy = null): void + { + $this->setAttribute('Policy', $policy); + } + + public function getPolicy(): ?string + { + return $this->getAttribute('Policy'); + } + + /** + * The display name to use for a topic with SMS subscriptions. + */ + public function setDisplayName(string $displayName = null): void + { + $this->setAttribute('DisplayName', $displayName); + } + + public function getDisplayName(): ?string + { + return $this->getAttribute('DisplayName'); + } + + /** + * The display name to use for a topic with SMS subscriptions. + */ + public function setDeliveryPolicy(int $deliveryPolicy = null): void + { + $this->setAttribute('DeliveryPolicy', $deliveryPolicy); + } + + public function getDeliveryPolicy(): ?int + { + return $this->getAttribute('DeliveryPolicy'); + } + + public function getAttributes(): array + { + return $this->attributes; + } + + private function getAttribute(string $name, $default = null) + { + return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default; + } + + private function setAttribute(string $name, $value): void + { + if (null == $value) { + unset($this->attributes[$name]); + } else { + $this->attributes[$name] = $value; + } + } +} diff --git a/pkg/sns/SnsMessage.php b/pkg/sns/SnsMessage.php new file mode 100644 index 000000000..7eb3c0d83 --- /dev/null +++ b/pkg/sns/SnsMessage.php @@ -0,0 +1,33 @@ +body = $body; + $this->properties = $properties; + $this->headers = $headers; + $this->redelivered = false; + } + + public function getSnsMessageId(): ?string + { + return $this->snsMessageId; + } + + public function setSnsMessageId(?string $snsMessageId): void + { + $this->snsMessageId = $snsMessageId; + } +} diff --git a/pkg/sns/SnsProducer.php b/pkg/sns/SnsProducer.php new file mode 100644 index 000000000..b702d10c3 --- /dev/null +++ b/pkg/sns/SnsProducer.php @@ -0,0 +1,119 @@ +context = $context; + } + + /** + * @param SnsDestination $destination + * @param SnsMessage $message + */ + public function send(Destination $destination, Message $message): void + { + InvalidDestinationException::assertDestinationInstanceOf($destination, SnsDestination::class); + InvalidMessageException::assertMessageInstanceOf($message, SnsMessage::class); + + $body = $message->getBody(); + if (empty($body)) { + throw new InvalidMessageException('The message body must be a non-empty string.'); + } + + $topicArn = $this->context->getTopicArn($destination); + + $arguments = [ + 'Message' => $message->getBody(), + 'MessageAttributes' => [ + 'Headers' => [ + 'DataType' => 'String', + 'StringValue' => json_encode([$message->getHeaders(), $message->getProperties()]), + ], + ], + 'TopicArn' => $topicArn, + ]; + + $result = $this->context->getSnsClient()->publish($arguments); + + if (false == $result->hasKey('MessageId')) { + throw new \RuntimeException('Message was not sent'); + } + + $message->setSnsMessageId((string) $result->get('MessageId')); + } + + /** + * @return SnsProducer + */ + public function setDeliveryDelay(int $deliveryDelay = null): Producer + { + if (null === $deliveryDelay) { + return $this; + } + + DeliveryDelayNotSupportedException::providerDoestNotSupportIt(); + } + + public function getDeliveryDelay(): ?int + { + return $this->deliveryDelay; + } + + /** + * @return SnsProducer + */ + public function setPriority(int $priority = null): Producer + { + if (null === $priority) { + return $this; + } + + throw PriorityNotSupportedException::providerDoestNotSupportIt(); + } + + public function getPriority(): ?int + { + return null; + } + + /** + * @return SnsProducer + */ + public function setTimeToLive(int $timeToLive = null): Producer + { + if (null === $timeToLive) { + return $this; + } + + throw TimeToLiveNotSupportedException::providerDoestNotSupportIt(); + } + + public function getTimeToLive(): ?int + { + return null; + } +} diff --git a/pkg/sns/SnsSubscribe.php b/pkg/sns/SnsSubscribe.php new file mode 100644 index 000000000..94d457d55 --- /dev/null +++ b/pkg/sns/SnsSubscribe.php @@ -0,0 +1,39 @@ +destination = $destination; + $this->endpoint = $endpoint; + $this->protocol = $protocol; + $this->attributes = $arguments; + } + + public function getDestination(): SnsDestination + { + return $this->destination; + } + + public function getEndpoint(): string + { + return $this->endpoint; + } + + public function getAttributes(): array + { + return $this->attributes; + } +} diff --git a/pkg/sns/Tests/SnsClientTest.php b/pkg/sns/Tests/SnsClientTest.php new file mode 100644 index 000000000..e56a18790 --- /dev/null +++ b/pkg/sns/Tests/SnsClientTest.php @@ -0,0 +1,229 @@ + [ + 'key' => '', + 'secret' => '', + 'token' => '', + 'region' => '', + 'version' => '2010-03-31', + 'endpoint' => 'http://localhost/', + ]]))->createSns(); + + $client = new SnsClient($awsClient); + + $this->assertSame($awsClient, $client->getAWSClient()); + } + + public function testShouldAllowGetAwsClientIfMultipleClientProvided() + { + $awsClient = (new Sdk(['Sns' => [ + 'key' => '', + 'secret' => '', + 'token' => '', + 'region' => '', + 'version' => '2010-03-31', + 'endpoint' => 'http://localhost/', + ]]))->createMultiRegionSns(); + + $client = new SnsClient($awsClient); + + $this->assertInstanceOf(AwsSnsClient::class, $client->getAWSClient()); + } + + /** + * @dataProvider provideApiCallsSingleClient + * @dataProvider provideApiCallsMultipleClient + */ + public function testApiCall(string $method, array $args, array $result, string $awsClientClass) + { + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->once()) + ->method($method) + ->with($this->identicalTo($args)) + ->willReturn(new Result($result)); + + $client = new SnsClient($awsClient); + + $actualResult = $client->{$method}($args); + + $this->assertInstanceOf(Result::class, $actualResult); + $this->assertSame($result, $actualResult->toArray()); + } + + /** + * @dataProvider provideApiCallsSingleClient + * @dataProvider provideApiCallsMultipleClient + */ + public function testLazyApiCall(string $method, array $args, array $result, string $awsClientClass) + { + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->once()) + ->method($method) + ->with($this->identicalTo($args)) + ->willReturn(new Result($result)); + + $client = new SnsClient(function () use ($awsClient) { + return $awsClient; + }); + + $actualResult = $client->{$method}($args); + + $this->assertInstanceOf(Result::class, $actualResult); + $this->assertSame($result, $actualResult->toArray()); + } + + /** + * @dataProvider provideApiCallsSingleClient + * @dataProvider provideApiCallsMultipleClient + */ + public function testThrowIfInvalidInputClientApiCall(string $method, array $args, array $result, string $awsClientClass) + { + $client = new SnsClient(new \stdClass()); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The input client must be an instance of "Aws\Sns\SnsClient" or "Aws\MultiRegionClient" or a callable that returns one of those. Got "stdClass"'); + $client->{$method}($args); + } + + /** + * @dataProvider provideApiCallsSingleClient + * @dataProvider provideApiCallsMultipleClient + */ + public function testThrowIfInvalidLazyInputClientApiCall(string $method, array $args, array $result, string $awsClientClass) + { + $client = new SnsClient(function () { return new \stdClass(); }); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The input client must be an instance of "Aws\Sns\SnsClient" or "Aws\MultiRegionClient" or a callable that returns one of those. Got "stdClass"'); + $client->{$method}($args); + } + + /** + * @dataProvider provideApiCallsMultipleClient + */ + public function testApiCallWithMultiClientAndCustomRegion(string $method, array $args, array $result, string $awsClientClass) + { + $args['@region'] = 'theRegion'; + + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->once()) + ->method($method) + ->with($this->identicalTo($args)) + ->willReturn(new Result($result)); + + $client = new SnsClient($awsClient); + + $actualResult = $client->{$method}($args); + + $this->assertInstanceOf(Result::class, $actualResult); + $this->assertSame($result, $actualResult->toArray()); + } + + /** + * @dataProvider provideApiCallsSingleClient + */ + public function testApiCallWithSingleClientAndCustomRegion(string $method, array $args, array $result, string $awsClientClass) + { + $args['@region'] = 'theRegion'; + + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->never()) + ->method($method) + ; + + $client = new SnsClient($awsClient); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Cannot send message to another region because transport is configured with single aws client'); + $client->{$method}($args); + } + + /** + * @dataProvider provideApiCallsSingleClient + */ + public function testApiCallWithMultiClientAndEmptyCustomRegion(string $method, array $args, array $result, string $awsClientClass) + { + $expectedArgs = $args; + $args['@region'] = ''; + + $awsClient = $this->getMockBuilder($awsClientClass) + ->disableOriginalConstructor() + ->setMethods([$method]) + ->getMock(); + $awsClient + ->expects($this->once()) + ->method($method) + ->with($this->identicalTo($expectedArgs)) + ->willReturn(new Result($result)); + + $client = new SnsClient($awsClient); + + $actualResult = $client->{$method}($args); + + $this->assertInstanceOf(Result::class, $actualResult); + $this->assertSame($result, $actualResult->toArray()); + } + + public function provideApiCallsSingleClient() + { + yield [ + 'createTopic', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSnsClient::class, + ]; + + yield [ + 'publish', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSnsClient::class, + ]; + } + + public function provideApiCallsMultipleClient() + { + yield [ + 'createTopic', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + + yield [ + 'publish', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + } +} diff --git a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php new file mode 100644 index 000000000..d9cbff390 --- /dev/null +++ b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php @@ -0,0 +1,152 @@ +expectException(\LogicException::class); + $this->expectExceptionMessage('The config must be either an array of options, a DSN string, null or instance of Aws\Sns\SnsClient'); + + new SnsConnectionFactory(new \stdClass()); + } + + public function testThrowIfSchemeIsNotAmqp() + { + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The given scheme protocol "http" is not supported. It must be "sns"'); + + new SnsConnectionFactory('http://example.com/'); + } + + public function testThrowIfDsnCouldNotBeParsed() + { + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The DSN is invalid.'); + + new SnsConnectionFactory('foo'); + } + + /** + * @dataProvider provideConfigs + * + * @param mixed $config + * @param mixed $expectedConfig + */ + public function testShouldParseConfigurationAsExpected($config, $expectedConfig) + { + $factory = new SnsConnectionFactory($config); + + $this->assertAttributeEquals($expectedConfig, 'config', $factory); + } + + public static function provideConfigs() + { + yield [ + null, + [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => true, + 'endpoint' => null, + ], + ]; + + yield [ + 'sns:', + [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => true, + 'endpoint' => null, + ], + ]; + + yield [ + [], + [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => true, + 'endpoint' => null, + ], + ]; + + yield [ + 'sns:?key=theKey&secret=theSecret&token=theToken&lazy=0', + [ + 'key' => 'theKey', + 'secret' => 'theSecret', + 'token' => 'theToken', + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => false, + 'endpoint' => null, + ], + ]; + + yield [ + ['dsn' => 'sns:?key=theKey&secret=theSecret&token=theToken&lazy=0'], + [ + 'key' => 'theKey', + 'secret' => 'theSecret', + 'token' => 'theToken', + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => false, + 'endpoint' => null, + ], + ]; + + yield [ + ['key' => 'theKey', 'secret' => 'theSecret', 'token' => 'theToken', 'lazy' => false], + [ + 'key' => 'theKey', + 'secret' => 'theSecret', + 'token' => 'theToken', + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => false, + 'endpoint' => null, + ], + ]; + + yield [ + [ + 'key' => 'theKey', + 'secret' => 'theSecret', + 'token' => 'theToken', + 'lazy' => false, + 'endpoint' => 'http://localstack:1111/', + ], + [ + 'key' => 'theKey', + 'secret' => 'theSecret', + 'token' => 'theToken', + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => false, + 'endpoint' => 'http://localstack:1111/', + ], + ]; + } +} diff --git a/pkg/sns/Tests/SnsConnectionFactoryTest.php b/pkg/sns/Tests/SnsConnectionFactoryTest.php new file mode 100644 index 000000000..104c4dc18 --- /dev/null +++ b/pkg/sns/Tests/SnsConnectionFactoryTest.php @@ -0,0 +1,79 @@ +assertClassImplements(ConnectionFactory::class, SnsConnectionFactory::class); + } + + public function testCouldBeConstructedWithEmptyConfiguration() + { + $factory = new SnsConnectionFactory([]); + + $this->assertAttributeEquals([ + 'lazy' => true, + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'version' => '2010-03-31', + 'endpoint' => null, + ], 'config', $factory); + } + + public function testCouldBeConstructedWithCustomConfiguration() + { + $factory = new SnsConnectionFactory(['key' => 'theKey']); + + $this->assertAttributeEquals([ + 'lazy' => true, + 'key' => 'theKey', + 'secret' => null, + 'token' => null, + 'region' => null, + 'version' => '2010-03-31', + 'endpoint' => null, + ], 'config', $factory); + } + + public function testCouldBeConstructedWithClient() + { + $awsClient = $this->createMock(AwsSnsClient::class); + + $factory = new SnsConnectionFactory($awsClient); + + $context = $factory->createContext(); + + $this->assertInstanceOf(SnsContext::class, $context); + + $client = $this->readAttribute($context, 'client'); + $this->assertInstanceOf(SnsClient::class, $client); + $this->assertAttributeSame($awsClient, 'inputClient', $client); + } + + public function testShouldCreateLazyContext() + { + $factory = new SnsConnectionFactory(['lazy' => true]); + + $context = $factory->createContext(); + + $this->assertInstanceOf(SnsContext::class, $context); + + $client = $this->readAttribute($context, 'client'); + $this->assertInstanceOf(SnsClient::class, $client); + $this->assertAttributeInstanceOf(\Closure::class, 'inputClient', $client); + } +} diff --git a/pkg/sns/Tests/SnsDestinationTest.php b/pkg/sns/Tests/SnsDestinationTest.php new file mode 100644 index 000000000..c9f9669e7 --- /dev/null +++ b/pkg/sns/Tests/SnsDestinationTest.php @@ -0,0 +1,52 @@ +assertClassImplements(Topic::class, SnsDestination::class); + $this->assertClassImplements(Queue::class, SnsDestination::class); + } + + public function testShouldReturnNameSetInConstructor() + { + $destination = new SnsDestination('aDestinationName'); + + $this->assertSame('aDestinationName', $destination->getQueueName()); + $this->assertSame('aDestinationName', $destination->getTopicName()); + } + + public function testCouldSetPolicyAttribute() + { + $destination = new SnsDestination('aDestinationName'); + $destination->setPolicy('thePolicy'); + + $this->assertSame(['Policy' => 'thePolicy'], $destination->getAttributes()); + } + + public function testCouldSetDisplayNameAttribute() + { + $destination = new SnsDestination('aDestinationName'); + $destination->setDisplayName('theDisplayName'); + + $this->assertSame(['DisplayName' => 'theDisplayName'], $destination->getAttributes()); + } + + public function testCouldSetDeliveryPolicyAttribute() + { + $destination = new SnsDestination('aDestinationName'); + $destination->setDeliveryPolicy(123); + + $this->assertSame(['DeliveryPolicy' => 123], $destination->getAttributes()); + } +} diff --git a/pkg/sns/Tests/SnsProducerTest.php b/pkg/sns/Tests/SnsProducerTest.php new file mode 100644 index 000000000..f5a039702 --- /dev/null +++ b/pkg/sns/Tests/SnsProducerTest.php @@ -0,0 +1,144 @@ +assertClassImplements(Producer::class, SnsProducer::class); + } + + public function testCouldBeConstructedWithRequiredArguments() + { + new SnsProducer($this->createSnsContextMock()); + } + + public function testShouldThrowIfBodyOfInvalidType() + { + $this->expectException(InvalidMessageException::class); + $this->expectExceptionMessage('The message body must be a non-empty string.'); + + $producer = new SnsProducer($this->createSnsContextMock()); + + $message = new SnsMessage(''); + + $producer->send(new SnsDestination(''), $message); + } + + public function testShouldThrowIfDestinationOfInvalidType() + { + $this->expectException(InvalidDestinationException::class); + $this->expectExceptionMessage('The destination must be an instance of Enqueue\Sns\SnsDestination but got Mock_Destinat'); + + $producer = new SnsProducer($this->createSnsContextMock()); + + $producer->send($this->createMock(Destination::class), new SnsMessage()); + } + + public function testShouldThrowIfPublishFailed() + { + $destination = new SnsDestination('queue-name'); + + $client = $this->createSnsClientMock(); + $client + ->expects($this->once()) + ->method('publish') + ->willReturn(new Result()) + ; + + $context = $this->createSnsContextMock(); + $context + ->expects($this->once()) + ->method('getTopicArn') + ->with($this->identicalTo($destination)) + ->willReturn('theTopicArn') + ; + $context + ->expects($this->once()) + ->method('getSnsClient') + ->will($this->returnValue($client)) + ; + + $message = new SnsMessage('foo'); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('Message was not sent'); + + $producer = new SnsProducer($context); + $producer->send($destination, $message); + } + + public function testShouldPublish() + { + $destination = new SnsDestination('queue-name'); + + $expectedArguments = [ + 'Message' => 'theBody', + 'MessageAttributes' => [ + 'Headers' => [ + 'DataType' => 'String', + 'StringValue' => '[{"hkey":"hvaleu"},{"key":"value"}]', + ], + ], + 'TopicArn' => 'theTopicArn', + ]; + + $client = $this->createSnsClientMock(); + $client + ->expects($this->once()) + ->method('publish') + ->with($this->identicalTo($expectedArguments)) + ->willReturn(new Result(['MessageId' => 'theMessageId'])) + ; + + $context = $this->createSnsContextMock(); + $context + ->expects($this->once()) + ->method('getTopicArn') + ->with($this->identicalTo($destination)) + ->willReturn('theTopicArn') + ; + $context + ->expects($this->once()) + ->method('getSnsClient') + ->will($this->returnValue($client)) + ; + + $message = new SnsMessage('theBody', ['key' => 'value'], ['hkey' => 'hvaleu']); + + $producer = new SnsProducer($context); + $producer->send($destination, $message); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|SnsContext + */ + private function createSnsContextMock(): SnsContext + { + return $this->createMock(SnsContext::class); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|SnsClient + */ + private function createSnsClientMock(): SnsClient + { + return $this->createMock(SnsClient::class); + } +} diff --git a/pkg/sns/Tests/Spec/SnsConnectionFactoryTest.php b/pkg/sns/Tests/Spec/SnsConnectionFactoryTest.php new file mode 100644 index 000000000..20008bc04 --- /dev/null +++ b/pkg/sns/Tests/Spec/SnsConnectionFactoryTest.php @@ -0,0 +1,18 @@ +expectException(\LogicException::class); + $this->expectExceptionMessage('SNS transport does not support consumption. You should consider using SQS instead.'); + + parent::testShouldCreateConsumerOnCreateConsumerMethodCall(); + } + + protected function createContext() + { + $client = $this->createMock(SnsClient::class); + + return new SnsContext($client, []); + } +} diff --git a/pkg/sns/Tests/Spec/SnsMessageTest.php b/pkg/sns/Tests/Spec/SnsMessageTest.php new file mode 100644 index 000000000..af24344e6 --- /dev/null +++ b/pkg/sns/Tests/Spec/SnsMessageTest.php @@ -0,0 +1,14 @@ +createMock(SnsContext::class)); + } +} diff --git a/pkg/sns/Tests/Spec/SnsQueueTest.php b/pkg/sns/Tests/Spec/SnsQueueTest.php new file mode 100644 index 000000000..39c0e5513 --- /dev/null +++ b/pkg/sns/Tests/Spec/SnsQueueTest.php @@ -0,0 +1,14 @@ +createContext(); + +$queue = $context->createQueue('enqueue'); +$consumer = $context->createConsumer($queue); + +while (true) { + if ($m = $consumer->receive(20000)) { + $consumer->acknowledge($m); + echo 'Received message: '.$m->getBody().PHP_EOL; + } +} + +echo 'Done'."\n"; diff --git a/pkg/sns/examples/produce.php b/pkg/sns/examples/produce.php new file mode 100644 index 000000000..d37fce79f --- /dev/null +++ b/pkg/sns/examples/produce.php @@ -0,0 +1,34 @@ + getenv('ENQUEUE_AWS__SQS__KEY'), + 'secret' => getenv('ENQUEUE_AWS__SQS__SECRET'), + 'region' => getenv('ENQUEUE_AWS__SQS__REGION'), +]); +$context = $factory->createContext(); + +$topic = $context->createTopic('test_enqueue'); +$context->declareTopic($topic); + +$message = $context->createMessage('a_body'); +$message->setProperty('aProp', 'aPropVal'); +$message->setHeader('aHeader', 'aHeaderVal'); + +$context->createProducer()->send($topic, $message); diff --git a/pkg/sns/phpunit.xml.dist b/pkg/sns/phpunit.xml.dist new file mode 100644 index 000000000..3fe611e9c --- /dev/null +++ b/pkg/sns/phpunit.xml.dist @@ -0,0 +1,30 @@ + + + + + + + ./Tests + + + + + + . + + ./vendor + ./Tests + + + + diff --git a/pkg/sqs/README.md b/pkg/sqs/README.md index 7c46d801c..1c7d7da08 100644 --- a/pkg/sqs/README.md +++ b/pkg/sqs/README.md @@ -14,12 +14,12 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) -This is an implementation of Queue Interop specification. It allows you to send and consume message through Amazon SQS library. +This is an implementation of Queue Interop specification. It allows you to send and consume message using [Amazon SQS](https://aws.amazon.com/sqs/) service. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/transport/sqs.md) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/pkg/sqs/SqsClient.php b/pkg/sqs/SqsClient.php index 65cf2fb29..07256d3aa 100644 --- a/pkg/sqs/SqsClient.php +++ b/pkg/sqs/SqsClient.php @@ -26,7 +26,7 @@ class SqsClient private $inputClient; /** - * @param AwsSqsClient|callable $inputClient + * @param AwsSqsClient|MultiRegionClient|callable $inputClient */ public function __construct($inputClient) { @@ -53,6 +53,11 @@ public function getQueueUrl(array $args): Result return $this->callApi('getQueueUrl', $args); } + public function getQueueAttributes(array $args): Result + { + return $this->callApi('getQueueAttributes', $args); + } + public function createQueue(array $args): Result { return $this->callApi('createQueue', $args); diff --git a/pkg/sqs/SqsContext.php b/pkg/sqs/SqsContext.php index 8be6fcddb..4860bbefe 100644 --- a/pkg/sqs/SqsContext.php +++ b/pkg/sqs/SqsContext.php @@ -29,6 +29,11 @@ class SqsContext implements Context */ private $queueUrls; + /** + * @var array + */ + private $queueArns; + /** * @var array */ @@ -38,6 +43,9 @@ public function __construct(SqsClient $client, array $config) { $this->client = $client; $this->config = $config; + + $this->queueUrls = []; + $this->queueArns = []; } /** @@ -157,6 +165,27 @@ public function getQueueUrl(SqsDestination $destination): string return $this->queueUrls[$destination->getQueueName()] = (string) $result->get('QueueUrl'); } + public function getQueueArn(SqsDestination $destination): string + { + if (isset($this->queueArns[$destination->getQueueName()])) { + return $this->queueArns[$destination->getQueueName()]; + } + + $arguments = [ + '@region' => $destination->getRegion(), + 'QueueUrl' => $this->getQueueUrl($destination), + 'AttributeNames' => ['QueueArn'], + ]; + + $result = $this->client->getQueueAttributes($arguments); + + if (false == $result->hasKey('QueueArn')) { + throw new \RuntimeException(sprintf('QueueArn cannot be resolved. queueName: "%s"', $destination->getQueueName())); + } + + return $this->queueArns[$destination->getQueueName()] = (string) $result->get('QueueArn'); + } + public function declareQueue(SqsDestination $dest): void { $result = $this->client->createQueue([ diff --git a/pkg/sqs/Tests/SqsClientTest.php b/pkg/sqs/Tests/SqsClientTest.php index 2a45edc72..08c44a307 100644 --- a/pkg/sqs/Tests/SqsClientTest.php +++ b/pkg/sqs/Tests/SqsClientTest.php @@ -223,6 +223,13 @@ public function provideApiCallsSingleClient() AwsSqsClient::class, ]; + yield [ + 'getQueueAttributes', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + AwsSqsClient::class, + ]; + yield [ 'createQueue', ['fooArg' => 'fooArgVal'], @@ -275,6 +282,13 @@ public function provideApiCallsMultipleClient() MultiRegionClient::class, ]; + yield [ + 'getQueueAttributes', + ['fooArg' => 'fooArgVal'], + ['bar' => 'barVal'], + MultiRegionClient::class, + ]; + yield [ 'createQueue', ['fooArg' => 'fooArgVal'], diff --git a/pkg/sqs/Tests/SqsContextTest.php b/pkg/sqs/Tests/SqsContextTest.php index 53dfc4358..204e5d87a 100644 --- a/pkg/sqs/Tests/SqsContextTest.php +++ b/pkg/sqs/Tests/SqsContextTest.php @@ -308,6 +308,36 @@ public function testShouldAllowGetQueueUrl() $context->getQueueUrl(new SqsDestination('aQueueName')); } + public function testShouldAllowGetQueueArn() + { + $sqsClient = $this->createSqsClientMock(); + $sqsClient + ->expects($this->once()) + ->method('getQueueUrl') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueName' => 'aQueueName', + ])) + ->willReturn(new Result(['QueueUrl' => 'theQueueUrl'])) + ; + $sqsClient + ->expects($this->once()) + ->method('getQueueAttributes') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueUrl' => 'theQueueUrl', + 'AttributeNames' => ['QueueArn'], + ])) + ->willReturn(new Result(['QueueArn' => 'theQueueArn'])) + ; + + $context = new SqsContext($sqsClient, []); + + $queue = $context->createQueue('aQueueName'); + + $this->assertSame('theQueueArn', $context->getQueueArn($queue)); + } + public function testShouldAllowGetQueueUrlWithCustomRegion() { $sqsClient = $this->createSqsClientMock(); diff --git a/pkg/test/SnsExtension.php b/pkg/test/SnsExtension.php new file mode 100644 index 000000000..6c01abe2f --- /dev/null +++ b/pkg/test/SnsExtension.php @@ -0,0 +1,18 @@ +createContext(); + } +} From b44a6e8e794fe6ddf17a0cef3afa4b4c07677814 Mon Sep 17 00:00:00 2001 From: Jak Spalding Date: Thu, 6 Dec 2018 19:56:21 +0000 Subject: [PATCH 0469/1142] fix: polling_interval is an integer --- pkg/mongodb/MongodbConnectionFactory.php | 2 +- pkg/mongodb/Tests/MongodbConnectionFactoryTest.php | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pkg/mongodb/MongodbConnectionFactory.php b/pkg/mongodb/MongodbConnectionFactory.php index 28a5fc068..a5148f1c0 100644 --- a/pkg/mongodb/MongodbConnectionFactory.php +++ b/pkg/mongodb/MongodbConnectionFactory.php @@ -98,7 +98,7 @@ public static function parseDsn(string $dsn): array parse_str($parsedUrl['query'], $queryParts); //get enqueue attributes values if (!empty($queryParts['polling_interval'])) { - $config['polling_interval'] = $queryParts['polling_interval']; + $config['polling_interval'] = (int) $queryParts['polling_interval']; } if (!empty($queryParts['enqueue_collection'])) { $config['collection_name'] = $queryParts['enqueue_collection']; diff --git a/pkg/mongodb/Tests/MongodbConnectionFactoryTest.php b/pkg/mongodb/Tests/MongodbConnectionFactoryTest.php index 63ec00cea..c15b0fa43 100644 --- a/pkg/mongodb/Tests/MongodbConnectionFactoryTest.php +++ b/pkg/mongodb/Tests/MongodbConnectionFactoryTest.php @@ -45,6 +45,20 @@ public function testCouldBeConstructedWithCustomConfiguration() $this->assertAttributeEquals($params, 'config', $factory); } + public function testCouldBeConstructedWithCustomConfigurationFromDsn() + { + $params = [ + 'dsn' => 'mongodb://127.0.0.3/test-db-name?enqueue_collection=collection-name&polling_interval=3000', + 'dbname' => 'test-db-name', + 'collection_name' => 'collection-name', + 'polling_interval' => 3000, + ]; + + $factory = new MongodbConnectionFactory($params['dsn']); + + $this->assertAttributeEquals($params, 'config', $factory); + } + public function testShouldCreateContext() { $factory = new MongodbConnectionFactory(); From fe64cafee453cb5f536ce5dbf2bce069ed14e7cb Mon Sep 17 00:00:00 2001 From: Nommyde Date: Fri, 7 Dec 2018 14:29:38 +0300 Subject: [PATCH 0470/1142] fix: Wrong parameters for Exception int must be passed when strict_types is on --- pkg/dbal/DbalProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index 014c7775c..e18753729 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -139,7 +139,7 @@ public function send(Destination $destination, Message $message): void 'redeliver_after' => Type::BIGINT, ]); } catch (\Exception $e) { - throw new Exception('The transport fails to send the message due to some internal error.', null, $e); + throw new Exception('The transport fails to send the message due to some internal error.', 0, $e); } } From c1e5f6e8a05bbaeeb2bd052288ec27a5a6e3d8f4 Mon Sep 17 00:00:00 2001 From: Lars Greiss Date: Fri, 7 Dec 2018 23:44:48 +0100 Subject: [PATCH 0471/1142] [fs]: fix: Wrong parameters for Exception int must be passed when strict_types is on same like https://github.com/php-enqueue/enqueue-dev/commit/fe64cafee453cb5f536ce5dbf2bce069ed14e7cb --- pkg/fs/FsConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/fs/FsConsumer.php b/pkg/fs/FsConsumer.php index d9092aaf4..65ff12e61 100644 --- a/pkg/fs/FsConsumer.php +++ b/pkg/fs/FsConsumer.php @@ -137,7 +137,7 @@ public function receiveNoWait(): ?Message $this->preFetchedMessages[] = $fetchedMessage; } catch (\Exception $e) { - throw new \LogicException(sprintf("Cannot decode json message '%s'", $rawMessage), null, $e); + throw new \LogicException(sprintf("Cannot decode json message '%s'", $rawMessage), 0, $e); } } else { return null; From 1504cb49bd0ae879277fd7aba0e1cbbb1aae80d9 Mon Sep 17 00:00:00 2001 From: Tobias Sette Date: Mon, 10 Dec 2018 00:42:24 -0200 Subject: [PATCH 0472/1142] Fix package name for redis --- docs/client/supported_brokers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/client/supported_brokers.md b/docs/client/supported_brokers.md index a0d7b08b3..ddc8a3968 100644 --- a/docs/client/supported_brokers.md +++ b/docs/client/supported_brokers.md @@ -19,7 +19,7 @@ Here's the list of transports supported by Enqueue Client: | Doctrine DBAL | [enqueue/dbal](../transport/dbal.md) | mysql: pgsql: pdo_pgsql etc | | Filesystem | [enqueue/fs](../transport/fs.md) | file:///foo/bar | | Google PubSub | [enqueue/gps](../transport/gps.md) | gps: | -| Redis | [enqueue/gps](../transport/redis.md) | redis: | +| Redis | [enqueue/redis](../transport/redis.md) | redis: | | Amazon SQS | [enqueue/sqs](../transport/sqs.md) | sqs: | | STOMP, RabbitMQ | [enqueue/stomp](../transport/stomp.md) | stomp: | | Kafka | [enqueue/rdkafka](../transport/kafka.md) | kafka: | From c698aa0ebf6118cf59b29941b5b278ccb5aa3f8c Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Tue, 11 Dec 2018 08:30:34 +0100 Subject: [PATCH 0473/1142] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fb847f2c..e08bdfcf9 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Features: [![Build Status](https://travis-ci.org/php-enqueue/null.png?branch=master)](https://travis-ci.org/php-enqueue/null) [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) - * [the others are comming](https://github.com/php-enqueue/enqueue-dev/issues/284) + * [the others are coming](https://github.com/php-enqueue/enqueue-dev/issues/284) * [Symfony bundle](docs/bundle/quick_tour.md) * [Magento1 extension](docs/magento/quick_tour.md) * [Magento2 module](docs/magento2/quick_tour.md) From 111fa406fc38ce7037d4e0480bb094ebc6af678a Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Thu, 13 Dec 2018 07:55:07 +0100 Subject: [PATCH 0474/1142] typo --- docs/bundle/cli_commands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bundle/cli_commands.md b/docs/bundle/cli_commands.md index 88cf5e5b7..c61d4b7c9 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/bundle/cli_commands.md @@ -155,7 +155,7 @@ Help: ``` ./bin/console enqueue:transport:consume --help -Usage:ng mqdev_gearmand_1 ... done +Usage: enqueue:transport:consume [options] [--] Arguments: From eca749a38c3e7dfb0df1676e10e60702f8888f45 Mon Sep 17 00:00:00 2001 From: Kotlyar Maksim Date: Thu, 13 Dec 2018 16:54:03 +0200 Subject: [PATCH 0475/1142] [job-queue] Fix tests on newer dbal versions. --- .../Test/DbalPersistedConnection.php | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/pkg/job-queue/Test/DbalPersistedConnection.php b/pkg/job-queue/Test/DbalPersistedConnection.php index 7c06f5ab0..1b907f89f 100644 --- a/pkg/job-queue/Test/DbalPersistedConnection.php +++ b/pkg/job-queue/Test/DbalPersistedConnection.php @@ -71,10 +71,16 @@ public function rollBack() */ protected function setConnected($connected) { - $isConnected = new \ReflectionProperty('Doctrine\DBAL\Connection', '_isConnected'); - $isConnected->setAccessible(true); - $isConnected->setValue($this, $connected); - $isConnected->setAccessible(false); + $rc = new \ReflectionClass(Connection::class); + $rp = $rc->hasProperty('isConnected') ? + $rc->getProperty('isConnected') : + $rc->getProperty('_isConnected') + ; + + + $rp->setAccessible(true); + $rp->setValue($this, $connected); + $rp->setAccessible(false); } /** @@ -134,10 +140,15 @@ protected function getConnectionId() */ private function setTransactionNestingLevel($level) { - $prop = new \ReflectionProperty('Doctrine\DBAL\Connection', '_transactionNestingLevel'); - $prop->setAccessible(true); - - return $prop->setValue($this, $level); + $rc = new \ReflectionClass(Connection::class); + $rp = $rc->hasProperty('transactionNestingLevel') ? + $rc->getProperty('transactionNestingLevel') : + $rc->getProperty('_transactionNestingLevel') + ; + + $rp->setAccessible(true); + $rp->setValue($this, $level); + $rp->setAccessible(false); } /** From 5122e911039e68797b0826b7ea2b977f0ddbaefa Mon Sep 17 00:00:00 2001 From: Kotlyar Maksim Date: Thu, 13 Dec 2018 17:14:28 +0200 Subject: [PATCH 0476/1142] fix cs --- pkg/job-queue/Test/DbalPersistedConnection.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/job-queue/Test/DbalPersistedConnection.php b/pkg/job-queue/Test/DbalPersistedConnection.php index 1b907f89f..f1ec03035 100644 --- a/pkg/job-queue/Test/DbalPersistedConnection.php +++ b/pkg/job-queue/Test/DbalPersistedConnection.php @@ -77,7 +77,6 @@ protected function setConnected($connected) $rc->getProperty('_isConnected') ; - $rp->setAccessible(true); $rp->setValue($this, $connected); $rp->setAccessible(false); From e8f131d0aa202ce18e6e4389dbd8c7bdd4a78db6 Mon Sep 17 00:00:00 2001 From: Kotlyar Maksim Date: Thu, 13 Dec 2018 17:26:05 +0200 Subject: [PATCH 0477/1142] Allow Queue Interop 0.8 version (wihtout Psr prefixed interfaces) --- composer.json | 2 +- pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index ff9db427d..ed76384f5 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "ext-rdkafka": "^3.0.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "bunny/bunny": "^0.2.4|^0.3|^0.4", "php-amqplib/php-amqplib": "^2.7", "doctrine/dbal": "^2.6", diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index fe84c2e20..bb3cacb53 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -69,7 +69,7 @@ public function testThrowErrorIfServiceDoesNotImplementProcessorReturnType() $registry = new ContainerProcessorRegistry($containerMock); $this->expectException(\TypeError::class); - $this->expectExceptionMessage('Return value of Enqueue\Symfony\ContainerProcessorRegistry::get() must implement interface Interop\Queue\PsrProcessor, instance of stdClass returned'); + $this->expectExceptionMessage('Return value of Enqueue\Symfony\ContainerProcessorRegistry::get() must implement interface Interop\Queue\Processor, instance of stdClass returned'); $registry->get('processor-name'); } From f808bcb9895692c614b0be8ebae85ed562aaf995 Mon Sep 17 00:00:00 2001 From: Kotlyar Maksim Date: Thu, 13 Dec 2018 17:31:01 +0200 Subject: [PATCH 0478/1142] Allow queue interop 0.8 in packages --- pkg/amqp-bunny/composer.json | 2 +- pkg/amqp-ext/composer.json | 2 +- pkg/amqp-lib/composer.json | 1 + pkg/amqp-tools/composer.json | 2 +- pkg/async-command/composer.json | 2 +- pkg/async-event-dispatcher/composer.json | 2 +- pkg/dbal/composer.json | 2 +- pkg/enqueue-bundle/composer.json | 2 +- pkg/enqueue/composer.json | 2 +- pkg/fs/composer.json | 2 +- pkg/gearman/composer.json | 2 +- pkg/gps/composer.json | 2 +- pkg/job-queue/composer.json | 2 +- pkg/mongodb/composer.json | 2 +- pkg/null/composer.json | 2 +- pkg/pheanstalk/composer.json | 2 +- pkg/rdkafka/composer.json | 2 +- pkg/redis/composer.json | 2 +- pkg/simple-client/composer.json | 2 +- pkg/sqs/composer.json | 2 +- pkg/stomp/composer.json | 2 +- pkg/wamp/composer.json | 2 +- 22 files changed, 22 insertions(+), 21 deletions(-) diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 086db9534..63b6addb0 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "bunny/bunny": "^0.2.4|^0.3|^0.4", "enqueue/amqp-tools": "^0.9" }, diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 6dcdd96e2..1c681f17e 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "ext-amqp": "^1.9.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/amqp-tools": "^0.9" }, "require-dev": { diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 415ca9f23..100dc583b 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -9,6 +9,7 @@ "php": "^7.1.3", "php-amqplib/php-amqplib": "^2.8", "queue-interop/amqp-interop": "^0.8", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/amqp-tools": "^0.9" }, "require-dev": { diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index f0c70aa7f..aba5b5af3 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7" + "queue-interop/queue-interop": "^0.7|^0.8" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 5d93f47b1..7474c8834 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -8,7 +8,7 @@ "require": { "php": ">=7.1", "enqueue/enqueue": "^0.9", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "symfony/console": "^3.4|^4", "symfony/process": "^3.4|^4" }, diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index ca63adfb0..d5996f4aa 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "enqueue/enqueue": "^0.9", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "symfony/event-dispatcher": "^3.4|^4" }, "require-dev": { diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index b48985714..253d63d31 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "doctrine/dbal": "^2.6", "ramsey/uuid": "^3" }, diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index c74197602..63620a3b5 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "symfony/framework-bundle": "^3.4|^4", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/enqueue": "^0.9", "enqueue/null": "^0.9" }, diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 26d147705..05dd1df2c 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/null": "^0.9", "enqueue/dsn": "^0.9", "ramsey/uuid": "^2|^3.5", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 0be58949c..fb95a36f9 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", "symfony/filesystem": "^3.4|^4", "makasim/temp-file": "^0.2@stable" diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index e23162405..102703aed 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "ext-gearman": "^2.0", - "queue-interop/queue-interop": "^0.7" + "queue-interop/queue-interop": "^0.7|^0.8" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 295ae105f..46f804ebb 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "google/cloud-pubsub": "^1.0", "enqueue/dsn": "^0.9" }, diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 3ade4f79a..0dab189f1 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "enqueue/enqueue": "^0.9", "enqueue/null": "0.9.x-dev", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "doctrine/orm": "~2.4" }, "require-dev": { diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index b3afedb03..ec5bfe34d 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -11,7 +11,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "mongodb/mongodb": "^1.2", "ext-mongodb": "^1.3" }, diff --git a/pkg/null/composer.json b/pkg/null/composer.json index cb900e1cd..1fa1a2c22 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7" + "queue-interop/queue-interop": "^0.7|^0.8" }, "require-dev": { "phpunit/phpunit": "~5.5", diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index 38ea2ee80..a3e34ee10 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "pda/pheanstalk": "^3", - "queue-interop/queue-interop": "^0.7" + "queue-interop/queue-interop": "^0.7|^0.8" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 9ec0d2f20..e0d55b396 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "ext-rdkafka": "^3.0.3", - "queue-interop/queue-interop": "^0.7" + "queue-interop/queue-interop": "^0.7|^0.8" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 0b0a3a37b..7e9294548 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", "ramsey/uuid": "^3" }, diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index a4bbc478b..571cca783 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "enqueue/enqueue": "^0.9", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "symfony/config": "^3.4|^4" }, "require-dev": { diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index ec8388c4f..0022bf72f 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", "aws/aws-sdk-php": "~3.26" }, diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 4efde62d7..0f667a8ae 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "enqueue/dsn": "^0.9", "stomp-php/stomp-php": "^4", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "php-http/guzzle6-adapter": "^1.1", "php-http/client-common": "^1.7@dev", "richardfullmer/rabbitmq-management-api": "^2.0" diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 7c2f15e64..28c2c7065 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", "thruway/pawl-transport": "^0.5.0", "voryx/thruway": "^0.5.3" From bede5416ead0dcdae8ba2f6ff93333af115f4a3c Mon Sep 17 00:00:00 2001 From: Kotlyar Maksim Date: Thu, 13 Dec 2018 19:00:54 +0200 Subject: [PATCH 0479/1142] Release 0.9.2 --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eeafc0a8..f9370be3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Change Log +## [0.9.2](https://github.com/php-enqueue/enqueue-dev/tree/0.9.2) (2018-12-13) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.1...0.9.2) + +**Merged pull requests:** + +- Allow 0.8.x Queue Interop \(without deprecated Psr prefixed interfaces\) [\#688](https://github.com/php-enqueue/enqueue-dev/pull/688) ([makasim](https://github.com/makasim)) +- \[dsn\] remove commented out code [\#661](https://github.com/php-enqueue/enqueue-dev/pull/661) ([kunicmarko20](https://github.com/kunicmarko20)) +- \[fs\]: fix: Wrong parameters for Exception [\#678](https://github.com/php-enqueue/enqueue-dev/pull/678) ([ssiergl](https://github.com/ssiergl)) +- \[fs\] Do not throw error in jsonUnserialize on deprecation notice [\#671](https://github.com/php-enqueue/enqueue-dev/pull/671) ([ssiergl](https://github.com/ssiergl)) +- \[mongodb\] polling\_integer type not correctly handled when using DSN [\#673](https://github.com/php-enqueue/enqueue-dev/pull/673) ([jak](https://github.com/jak)) +- \[dbal\] Use ordered bytes time uuid codec on message id decode. [\#665](https://github.com/php-enqueue/enqueue-dev/pull/665) ([makasim](https://github.com/makasim)) +- \[dbal\] fix: Wrong parameters for Exception [\#676](https://github.com/php-enqueue/enqueue-dev/pull/676) ([Nommyde](https://github.com/Nommyde)) +- \[sqs\] Add ability to use another aws account per queue. [\#666](https://github.com/php-enqueue/enqueue-dev/pull/666) ([makasim](https://github.com/makasim)) +- \[sqs\] Multi region support [\#664](https://github.com/php-enqueue/enqueue-dev/pull/664) ([makasim](https://github.com/makasim)) +- \[sqs\] Use a queue created in another AWS account. [\#662](https://github.com/php-enqueue/enqueue-dev/pull/662) ([makasim](https://github.com/makasim)) +- \[job-queue\] Fix tests on newer dbal versions. [\#687](https://github.com/php-enqueue/enqueue-dev/pull/687) ([makasim](https://github.com/makasim)) +- [doc] typo [\#686](https://github.com/php-enqueue/enqueue-dev/pull/686) ([OskarStark](https://github.com/OskarStark)) +- [doc] typo [\#683](https://github.com/php-enqueue/enqueue-dev/pull/683) ([OskarStark](https://github.com/OskarStark)) +- [doc] Fix package name for redis [\#680](https://github.com/php-enqueue/enqueue-dev/pull/680) ([gnumoksha](https://github.com/gnumoksha)) + ## [0.9.1](https://github.com/php-enqueue/enqueue-dev/tree/0.9.1) (2018-11-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.0...0.9.1) From 24dd7a9860246c5e6ae7d02a0b9899a600840179 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Fri, 14 Dec 2018 10:13:35 +0100 Subject: [PATCH 0480/1142] updated docs --- pkg/enqueue/Client/CommandSubscriberInterface.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Client/CommandSubscriberInterface.php b/pkg/enqueue/Client/CommandSubscriberInterface.php index 5bbe78efe..9ee09d0ab 100644 --- a/pkg/enqueue/Client/CommandSubscriberInterface.php +++ b/pkg/enqueue/Client/CommandSubscriberInterface.php @@ -41,7 +41,7 @@ interface CommandSubscriberInterface * queue, processor, prefix_queue, and exclusive are optional. * It is possible to pass other options, they could be accessible on a route instance through options. * - * Note: If you set queueNameHardcoded to true then the queueName is used as is and therefor the driver is not used to create a transport queue name. + * Note: If you set "prefix_queue" to true then the "queue" is used as is and therefor the driver is not used to create a transport queue name. * * @return string|array */ From 6c982e1c84254a7df1f1e856bba95c22a91c5caf Mon Sep 17 00:00:00 2001 From: Jo Carter Date: Fri, 14 Dec 2018 12:15:30 +0000 Subject: [PATCH 0481/1142] Fix TreeBuilder in Symfony 4.2 A tree builder without a root node is deprecated since Symfony 4.2 and will not be supported anymore in 5.0. --- .../DependencyInjection/Configuration.php | 4 +- .../DependencyInjection/Configuration.php | 4 +- .../TransportFactoryTest.php | 52 +++++++++---------- pkg/simple-client/SimpleClient.php | 4 +- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pkg/async-event-dispatcher/DependencyInjection/Configuration.php b/pkg/async-event-dispatcher/DependencyInjection/Configuration.php index 9703e6284..51c94b60c 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/Configuration.php +++ b/pkg/async-event-dispatcher/DependencyInjection/Configuration.php @@ -12,8 +12,8 @@ class Configuration implements ConfigurationInterface */ public function getConfigTreeBuilder() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('enqueue_async_event_dispatcher'); + $tb = new TreeBuilder('enqueue_async_event_dispatcher'); + $rootNode = $tb->getRootNode(); $rootNode->children() ->scalarNode('context_service')->isRequired()->cannotBeEmpty()->end() diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index d7b3ba3a1..ecc40d42e 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -24,8 +24,8 @@ public function __construct(bool $debug) public function getConfigTreeBuilder(): TreeBuilder { - $tb = new TreeBuilder(); - $rootNode = $tb->root('enqueue'); + $tb = new TreeBuilder('enqueue'); + $rootNode = $tb->getRootNode(); $rootNode ->requiresAtLeastOneElement() diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php index 6cc02b697..5f96c721c 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php @@ -37,8 +37,8 @@ public function testThrowIfEmptyNameGivenOnConstruction() public function testShouldAllowAddConfigurationAsStringDsn() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -59,8 +59,8 @@ public function testShouldAllowAddConfigurationAsStringDsn() */ public function testShouldAllowAddConfigurationAsDsnWithoutSlashes() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -76,8 +76,8 @@ public function testShouldAllowAddConfigurationAsDsnWithoutSlashes() public function testShouldSetNullTransportIfNullGiven() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -93,8 +93,8 @@ public function testShouldSetNullTransportIfNullGiven() public function testShouldSetNullTransportIfEmptyStringGiven() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -110,8 +110,8 @@ public function testShouldSetNullTransportIfEmptyStringGiven() public function testShouldSetNullTransportIfEmptyArrayGiven() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -127,8 +127,8 @@ public function testShouldSetNullTransportIfEmptyArrayGiven() public function testThrowIfEmptyDsnGiven() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -140,8 +140,8 @@ public function testThrowIfEmptyDsnGiven() public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -159,8 +159,8 @@ public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTime() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -178,8 +178,8 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTi public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSameTime() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -196,8 +196,8 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSame public function testShouldAllowSetFactoryClass() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -214,8 +214,8 @@ public function testShouldAllowSetFactoryClass() public function testShouldAllowSetFactoryService() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -232,8 +232,8 @@ public function testShouldAllowSetFactoryService() public function testShouldAllowSetConnectionFactoryClass() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -250,8 +250,8 @@ public function testShouldAllowSetConnectionFactoryClass() public function testThrowIfExtraOptionGiven() { - $tb = new TreeBuilder(); - $rootNode = $tb->root('foo'); + $tb = new TreeBuilder('foo'); + $rootNode = $tb->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); diff --git a/pkg/simple-client/SimpleClient.php b/pkg/simple-client/SimpleClient.php index 4e3d8e9d6..fcaa52d03 100644 --- a/pkg/simple-client/SimpleClient.php +++ b/pkg/simple-client/SimpleClient.php @@ -306,8 +306,8 @@ public function build(array $configs): void private function createConfiguration(): NodeInterface { - $tb = new TreeBuilder(); - $rootNode = $tb->root('enqueue'); + $tb = new TreeBuilder('enqueue'); + $rootNode = $tb->getRootNode(); $rootNode ->beforeNormalization() From 99cd93387e144b565e305bf19b422589d65e32aa Mon Sep 17 00:00:00 2001 From: Jo Carter Date: Fri, 14 Dec 2018 12:27:16 +0000 Subject: [PATCH 0482/1142] BC fix. --- .../DependencyInjection/Configuration.php | 7 +- .../DependencyInjection/Configuration.php | 7 +- .../TransportFactoryTest.php | 91 ++++++++++++++++--- pkg/simple-client/SimpleClient.php | 7 +- 4 files changed, 96 insertions(+), 16 deletions(-) diff --git a/pkg/async-event-dispatcher/DependencyInjection/Configuration.php b/pkg/async-event-dispatcher/DependencyInjection/Configuration.php index 51c94b60c..2deb06a1f 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/Configuration.php +++ b/pkg/async-event-dispatcher/DependencyInjection/Configuration.php @@ -13,7 +13,12 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $tb = new TreeBuilder('enqueue_async_event_dispatcher'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('enqueue_async_event_dispatcher'); + } $rootNode->children() ->scalarNode('context_service')->isRequired()->cannotBeEmpty()->end() diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index ecc40d42e..074ea8267 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -25,7 +25,12 @@ public function __construct(bool $debug) public function getConfigTreeBuilder(): TreeBuilder { $tb = new TreeBuilder('enqueue'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('enqueue'); + } $rootNode ->requiresAtLeastOneElement() diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php index 5f96c721c..7b76eeffd 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php @@ -38,7 +38,12 @@ public function testThrowIfEmptyNameGivenOnConstruction() public function testShouldAllowAddConfigurationAsStringDsn() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); @@ -60,7 +65,12 @@ public function testShouldAllowAddConfigurationAsStringDsn() public function testShouldAllowAddConfigurationAsDsnWithoutSlashes() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); @@ -77,7 +87,12 @@ public function testShouldAllowAddConfigurationAsDsnWithoutSlashes() public function testShouldSetNullTransportIfNullGiven() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); @@ -94,7 +109,12 @@ public function testShouldSetNullTransportIfNullGiven() public function testShouldSetNullTransportIfEmptyStringGiven() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); @@ -111,7 +131,12 @@ public function testShouldSetNullTransportIfEmptyStringGiven() public function testShouldSetNullTransportIfEmptyArrayGiven() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); @@ -128,7 +153,12 @@ public function testShouldSetNullTransportIfEmptyArrayGiven() public function testThrowIfEmptyDsnGiven() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); @@ -141,7 +171,12 @@ public function testThrowIfEmptyDsnGiven() public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); @@ -160,7 +195,12 @@ public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTime() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); @@ -179,7 +219,12 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTi public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSameTime() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -197,7 +242,12 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSame public function testShouldAllowSetFactoryClass() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -215,7 +265,12 @@ public function testShouldAllowSetFactoryClass() public function testShouldAllowSetFactoryService() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -233,7 +288,12 @@ public function testShouldAllowSetFactoryService() public function testShouldAllowSetConnectionFactoryClass() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -251,7 +311,12 @@ public function testShouldAllowSetConnectionFactoryClass() public function testThrowIfExtraOptionGiven() { $tb = new TreeBuilder('foo'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('foo'); + } $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); diff --git a/pkg/simple-client/SimpleClient.php b/pkg/simple-client/SimpleClient.php index fcaa52d03..dd0eb7466 100644 --- a/pkg/simple-client/SimpleClient.php +++ b/pkg/simple-client/SimpleClient.php @@ -307,7 +307,12 @@ public function build(array $configs): void private function createConfiguration(): NodeInterface { $tb = new TreeBuilder('enqueue'); - $rootNode = $tb->getRootNode(); + + if (method_exists($tb, 'getRootNode')) { + $rootNode = $tb->getRootNode(); + } else { + $rootNode = $tb->root('enqueue'); + } $rootNode ->beforeNormalization() From 6cc7014195fa47392a084f5d407e23937646664f Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 14 Dec 2018 14:39:47 +0200 Subject: [PATCH 0483/1142] Add commands for single transport\client with typed arguments. --- docs/client/quick_tour.md | 22 ++- docs/quick_tour.md | 4 +- .../Tests/Functional/UseCasesTest.php | 2 +- .../Symfony/Client/SimpleConsumeCommand.php | 26 ++++ .../Symfony/Client/SimpleProduceCommand.php | 18 +++ .../Symfony/Client/SimpleRoutesCommand.php | 18 +++ .../Client/SimpleSetupBrokerCommand.php | 18 +++ .../Consumption/SimpleConsumeCommand.php | 18 +++ .../Client/SimpleConsumeCommandTest.php | 142 ++++++++++++++++++ .../Client/SimpleProduceCommandTest.php | 89 +++++++++++ .../Client/SimpleRoutesCommandTest.php | 119 +++++++++++++++ .../Client/SimpleSetupBrokerCommandTest.php | 87 +++++++++++ .../Consumption/SimpleConsumeCommandTest.php | 86 +++++++++++ pkg/simple-client/SimpleClient.php | 5 + 14 files changed, 639 insertions(+), 15 deletions(-) create mode 100644 pkg/enqueue/Symfony/Client/SimpleConsumeCommand.php create mode 100644 pkg/enqueue/Symfony/Client/SimpleProduceCommand.php create mode 100644 pkg/enqueue/Symfony/Client/SimpleRoutesCommand.php create mode 100644 pkg/enqueue/Symfony/Client/SimpleSetupBrokerCommand.php create mode 100644 pkg/enqueue/Symfony/Consumption/SimpleConsumeCommand.php create mode 100644 pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php create mode 100644 pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php create mode 100644 pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php create mode 100644 pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php create mode 100644 pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php diff --git a/docs/client/quick_tour.md b/docs/client/quick_tour.md index af3fd8251..d0fe2a274 100644 --- a/docs/client/quick_tour.md +++ b/docs/client/quick_tour.md @@ -115,25 +115,23 @@ $client->consume(); // bin/enqueue.php -use Enqueue\Symfony\Client\ConsumeMessagesCommand; -use Enqueue\Symfony\Client\Meta\QueuesCommand; -use Enqueue\Symfony\Client\Meta\TopicsCommand; -use Enqueue\Symfony\Client\ProduceMessageCommand; +use Enqueue\Symfony\Client\SimpleConsumeCommand; +use Enqueue\Symfony\Client\SimpleProduceCommand; +use Enqueue\Symfony\Client\SimpleRoutesCommand; +use Enqueue\Symfony\Client\SimpleSetupBrokerCommand; use Enqueue\Symfony\Client\SetupBrokerCommand; use Symfony\Component\Console\Application; /** @var \Enqueue\SimpleClient\SimpleClient $client */ $application = new Application(); -$application->add(new SetupBrokerCommand($client->getDriver())); -$application->add(new ProduceMessageCommand($client->getProducer())); -$application->add(new QueuesCommand($client->getQueueMetaRegistry())); -$application->add(new TopicsCommand($client->getTopicMetaRegistry())); -$application->add(new ConsumeMessagesCommand( +$application->add(new SimpleSetupBrokerCommand($client->getDriver())); +$application->add(new SimpleRoutesCommand($client->getDriver())); +$application->add(new SimpleProduceCommand($client->getProducer())); +$application->add(new SimpleConsumeCommand( $client->getQueueConsumer(), - $client->getDelegateProcessor(), - $client->getQueueMetaRegistry(), - $client->getDriver() + $client->getDriver(), + $client->getDelegateProcessor() )); $application->run(); diff --git a/docs/quick_tour.md b/docs/quick_tour.md index 472b9e327..9c3e6b5d1 100644 --- a/docs/quick_tour.md +++ b/docs/quick_tour.md @@ -260,7 +260,7 @@ Let's see how you can use consumption one: use Symfony\Component\Console\Application; use Interop\Queue\Message; use Enqueue\Consumption\QueueConsumer; -use Enqueue\Symfony\Consumption\ConsumeMessagesCommand; +use Enqueue\Symfony\Consumption\SimpleConsumeCommand; /** @var QueueConsumer $queueConsumer */ @@ -268,7 +268,7 @@ $queueConsumer->bindCallback('a_queue', function(Message $message) { // process message }); -$consumeCommand = new ConsumeMessagesCommand($queueConsumer); +$consumeCommand = new SimpleConsumeCommand($queueConsumer); $consumeCommand->setName('consume'); $app = new Application(); diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 474cb8710..163527175 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -309,7 +309,7 @@ public function testClientConsumeMessagesFromExplicitlySetQueue() $this->assertEquals($expectedBody, $processor->message->getBody()); } - public function testTransportConsumeMessagesCommandShouldConsumeMessage() + public function testTransportConsumeCommandShouldConsumeOneMessage() { $this->customSetUp([ 'default' => [ diff --git a/pkg/enqueue/Symfony/Client/SimpleConsumeCommand.php b/pkg/enqueue/Symfony/Client/SimpleConsumeCommand.php new file mode 100644 index 000000000..fafc35d05 --- /dev/null +++ b/pkg/enqueue/Symfony/Client/SimpleConsumeCommand.php @@ -0,0 +1,26 @@ + $queueConsumer, + 'driver' => $driver, + 'processor' => $processor, + ]), + 'default', + 'queue_consumer', + 'driver', + 'processor' + ); + } +} diff --git a/pkg/enqueue/Symfony/Client/SimpleProduceCommand.php b/pkg/enqueue/Symfony/Client/SimpleProduceCommand.php new file mode 100644 index 000000000..5d7f76533 --- /dev/null +++ b/pkg/enqueue/Symfony/Client/SimpleProduceCommand.php @@ -0,0 +1,18 @@ + $producer]), + 'default', + 'producer' + ); + } +} diff --git a/pkg/enqueue/Symfony/Client/SimpleRoutesCommand.php b/pkg/enqueue/Symfony/Client/SimpleRoutesCommand.php new file mode 100644 index 000000000..0023f14ae --- /dev/null +++ b/pkg/enqueue/Symfony/Client/SimpleRoutesCommand.php @@ -0,0 +1,18 @@ + $driver]), + 'default', + 'driver' + ); + } +} diff --git a/pkg/enqueue/Symfony/Client/SimpleSetupBrokerCommand.php b/pkg/enqueue/Symfony/Client/SimpleSetupBrokerCommand.php new file mode 100644 index 000000000..aae19f84b --- /dev/null +++ b/pkg/enqueue/Symfony/Client/SimpleSetupBrokerCommand.php @@ -0,0 +1,18 @@ + $driver]), + 'default', + 'driver' + ); + } +} diff --git a/pkg/enqueue/Symfony/Consumption/SimpleConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/SimpleConsumeCommand.php new file mode 100644 index 000000000..90d0e362e --- /dev/null +++ b/pkg/enqueue/Symfony/Consumption/SimpleConsumeCommand.php @@ -0,0 +1,18 @@ + $consumer]), + 'default', + 'queue_consumer' + ); + } +} diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php new file mode 100644 index 000000000..cb12fe5aa --- /dev/null +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php @@ -0,0 +1,142 @@ +assertClassExtends(ConsumeCommand::class, SimpleConsumeCommand::class); + } + + public function testShouldNotBeFinal() + { + $this->assertClassNotFinal(SimpleConsumeCommand::class); + } + + public function testCouldBeConstructedWithRequiredAttributes() + { + new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); + } + + public function testShouldHaveCommandName() + { + $command = new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); + + $this->assertEquals('enqueue:consume', $command->getName()); + } + + public function testShouldHaveExpectedOptions() + { + $command = new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); + + $options = $command->getDefinition()->getOptions(); + + $this->assertCount(9, $options); + $this->assertArrayHasKey('memory-limit', $options); + $this->assertArrayHasKey('message-limit', $options); + $this->assertArrayHasKey('time-limit', $options); + $this->assertArrayHasKey('receive-timeout', $options); + $this->assertArrayHasKey('niceness', $options); + $this->assertArrayHasKey('client', $options); + $this->assertArrayHasKey('logger', $options); + $this->assertArrayHasKey('skip', $options); + $this->assertArrayHasKey('setup-broker', $options); + } + + public function testShouldHaveExpectedAttributes() + { + $command = new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); + + $arguments = $command->getDefinition()->getArguments(); + + $this->assertCount(1, $arguments); + $this->assertArrayHasKey('client-queue-names', $arguments); + } + + public function testShouldBindDefaultQueueOnly() + { + $queue = new NullQueue(''); + + $routeCollection = new RouteCollection([]); + + $processor = $this->createDelegateProcessorMock(); + + $consumer = $this->createQueueConsumerMock(); + $consumer + ->expects($this->once()) + ->method('bind') + ->with($this->identicalTo($queue), $this->identicalTo($processor)) + ; + $consumer + ->expects($this->once()) + ->method('consume') + ->with($this->isInstanceOf(ChainExtension::class)) + ; + + $driver = $this->createDriverStub($routeCollection); + $driver + ->expects($this->once()) + ->method('createQueue') + ->with('default', true) + ->willReturn($queue) + ; + + $command = new SimpleConsumeCommand($consumer, $driver, $processor); + + $tester = new CommandTester($command); + $tester->execute([]); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|DelegateProcessor + */ + private function createDelegateProcessorMock() + { + return $this->createMock(DelegateProcessor::class); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface + */ + private function createQueueConsumerMock() + { + return $this->createMock(QueueConsumerInterface::class); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|DriverInterface + */ + private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface + { + $driverMock = $this->createMock(DriverInterface::class); + $driverMock + ->expects($this->any()) + ->method('getRouteCollection') + ->willReturn($routeCollection) + ; + + $driverMock + ->expects($this->any()) + ->method('getConfig') + ->willReturn(Config::create('aPrefix', 'anApp')) + ; + + return $driverMock; + } +} diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php new file mode 100644 index 000000000..82a7e0089 --- /dev/null +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php @@ -0,0 +1,89 @@ +assertClassExtends(ProduceCommand::class, SimpleProduceCommand::class); + } + + public function testShouldNotBeFinal() + { + $this->assertClassNotFinal(SimpleProduceCommand::class); + } + + public function testCouldBeConstructedWithContainerAsFirstArgument() + { + new SimpleProduceCommand($this->createProducerMock()); + } + + public function testShouldHaveCommandName() + { + $command = new SimpleProduceCommand($this->createProducerMock()); + + $this->assertEquals('enqueue:produce', $command->getName()); + } + + public function testShouldHaveExpectedOptions() + { + $command = new SimpleProduceCommand($this->createProducerMock()); + + $options = $command->getDefinition()->getOptions(); + $this->assertCount(3, $options); + $this->assertArrayHasKey('client', $options); + $this->assertArrayHasKey('topic', $options); + $this->assertArrayHasKey('command', $options); + } + + public function testShouldHaveExpectedAttributes() + { + $command = new SimpleProduceCommand($this->createProducerMock()); + + $arguments = $command->getDefinition()->getArguments(); + $this->assertCount(1, $arguments); + + $this->assertArrayHasKey('message', $arguments); + } + + public function testThrowIfNeitherTopicNorCommandOptionsAreSet() + { + $producerMock = $this->createProducerMock(); + $producerMock + ->expects($this->never()) + ->method('sendEvent') + ; + $producerMock + ->expects($this->never()) + ->method('sendCommand') + ; + + $command = new SimpleProduceCommand($producerMock); + + $tester = new CommandTester($command); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Either topic or command option should be set, none is set.'); + $tester->execute([ + 'message' => 'theMessage', + ]); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + */ + private function createProducerMock() + { + return $this->createMock(ProducerInterface::class); + } +} diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php new file mode 100644 index 000000000..ce97be1c0 --- /dev/null +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php @@ -0,0 +1,119 @@ +assertClassExtends(RoutesCommand::class, SimpleRoutesCommand::class); + } + + public function testShouldNotBeFinal() + { + $this->assertClassNotFinal(SimpleRoutesCommand::class); + } + + public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() + { + new SimpleRoutesCommand($this->createDriverMock()); + } + + public function testShouldHaveCommandName() + { + $command = new SimpleRoutesCommand($this->createDriverMock()); + + $this->assertEquals('enqueue:routes', $command->getName()); + } + + public function testShouldHaveCommandAliases() + { + $command = new SimpleRoutesCommand($this->createDriverMock()); + + $this->assertEquals(['debug:enqueue:routes'], $command->getAliases()); + } + + public function testShouldHaveExpectedOptions() + { + $command = new SimpleRoutesCommand($this->createDriverMock()); + + $options = $command->getDefinition()->getOptions(); + $this->assertCount(2, $options); + + $this->assertArrayHasKey('show-route-options', $options); + $this->assertArrayHasKey('client', $options); + } + + public function testShouldHaveExpectedAttributes() + { + $command = new SimpleRoutesCommand($this->createDriverMock()); + + $arguments = $command->getDefinition()->getArguments(); + $this->assertCount(0, $arguments); + } + + public function testShouldOutputEmptyRouteCollection() + { + $routeCollection = new RouteCollection([]); + + $command = new SimpleRoutesCommand($this->createDriverStub(Config::create(), $routeCollection)); + + $tester = new CommandTester($command); + + $tester->execute([]); + + $expectedOutput = <<<'OUTPUT' +Found 0 routes + + +OUTPUT; + + $this->assertCommandOutput($expectedOutput, $tester); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function createDriverMock(): DriverInterface + { + return $this->createMock(DriverInterface::class); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function createDriverStub(Config $config, RouteCollection $routeCollection): DriverInterface + { + $driverMock = $this->createDriverMock(); + $driverMock + ->expects($this->any()) + ->method('getConfig') + ->willReturn($config) + ; + + $driverMock + ->expects($this->any()) + ->method('getRouteCollection') + ->willReturn($routeCollection) + ; + + return $driverMock; + } + + private function assertCommandOutput(string $expected, CommandTester $tester): void + { + $this->assertSame(0, $tester->getStatusCode()); + $this->assertSame($expected, $tester->getDisplay()); + } +} diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php new file mode 100644 index 000000000..240cffa9a --- /dev/null +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php @@ -0,0 +1,87 @@ +assertClassExtends(SetupBrokerCommand::class, SimpleSetupBrokerCommand::class); + } + + public function testShouldNotBeFinal() + { + $this->assertClassNotFinal(SimpleSetupBrokerCommand::class); + } + + public function testCouldBeConstructedWithContainerAsFirstArgument() + { + new SimpleSetupBrokerCommand($this->createClientDriverMock()); + } + + public function testShouldHaveCommandName() + { + $command = new SimpleSetupBrokerCommand($this->createClientDriverMock()); + + $this->assertEquals('enqueue:setup-broker', $command->getName()); + } + + public function testShouldHaveCommandAliases() + { + $command = new SimpleSetupBrokerCommand($this->createClientDriverMock()); + + $this->assertEquals(['enq:sb'], $command->getAliases()); + } + + public function testShouldHaveExpectedOptions() + { + $command = new SimpleSetupBrokerCommand($this->createClientDriverMock()); + + $options = $command->getDefinition()->getOptions(); + + $this->assertCount(1, $options); + $this->assertArrayHasKey('client', $options); + } + + public function testShouldHaveExpectedAttributes() + { + $command = new SimpleSetupBrokerCommand($this->createClientDriverMock()); + + $arguments = $command->getDefinition()->getArguments(); + + $this->assertCount(0, $arguments); + } + + public function testShouldCallDriverSetupBrokerMethod() + { + $driver = $this->createClientDriverMock(); + $driver + ->expects($this->once()) + ->method('setupBroker') + ; + + $command = new SimpleSetupBrokerCommand($driver); + + $tester = new CommandTester($command); + $tester->execute([]); + + $this->assertContains('Broker set up', $tester->getDisplay()); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|DriverInterface + */ + private function createClientDriverMock() + { + return $this->createMock(DriverInterface::class); + } +} diff --git a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php new file mode 100644 index 000000000..34d4161fb --- /dev/null +++ b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php @@ -0,0 +1,86 @@ +assertClassExtends(ConsumeCommand::class, SimpleConsumeCommand::class); + } + + public function testShouldNotBeFinal() + { + $this->assertClassNotFinal(SimpleConsumeCommand::class); + } + + public function testCouldBeConstructedWithRequiredAttributes() + { + new SimpleConsumeCommand($this->createQueueConsumerMock()); + } + + public function testShouldHaveCommandName() + { + $command = new SimpleConsumeCommand($this->createQueueConsumerMock()); + + $this->assertEquals('enqueue:transport:consume', $command->getName()); + } + + public function testShouldHaveExpectedOptions() + { + $command = new SimpleConsumeCommand($this->createQueueConsumerMock()); + + $options = $command->getDefinition()->getOptions(); + + $this->assertCount(7, $options); + $this->assertArrayHasKey('memory-limit', $options); + $this->assertArrayHasKey('message-limit', $options); + $this->assertArrayHasKey('time-limit', $options); + $this->assertArrayHasKey('receive-timeout', $options); + $this->assertArrayHasKey('niceness', $options); + $this->assertArrayHasKey('transport', $options); + $this->assertArrayHasKey('logger', $options); + } + + public function testShouldHaveExpectedAttributes() + { + $command = new SimpleConsumeCommand($this->createQueueConsumerMock()); + + $arguments = $command->getDefinition()->getArguments(); + + $this->assertCount(0, $arguments); + } + + public function testShouldExecuteDefaultConsumption() + { + $consumer = $this->createQueueConsumerMock(); + $consumer + ->expects($this->once()) + ->method('consume') + ->with($this->isInstanceOf(ChainExtension::class)) + ; + + $command = new SimpleConsumeCommand($consumer); + + $tester = new CommandTester($command); + $tester->execute([]); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface + */ + private function createQueueConsumerMock() + { + return $this->createMock(QueueConsumerInterface::class); + } +} diff --git a/pkg/simple-client/SimpleClient.php b/pkg/simple-client/SimpleClient.php index 4e3d8e9d6..b4c146eba 100644 --- a/pkg/simple-client/SimpleClient.php +++ b/pkg/simple-client/SimpleClient.php @@ -219,6 +219,11 @@ public function getProducer(bool $setupBroker = false): ProducerInterface return $this->producer; } + public function getDelegateProcessor(): DelegateProcessor + { + return $this->delegateProcessor; + } + public function setupBroker(): void { $this->getDriver()->setupBroker(); From 1f7dc9e12ad0e319fe8e700b37170206e3803a89 Mon Sep 17 00:00:00 2001 From: Jo Carter Date: Fri, 14 Dec 2018 13:03:59 +0000 Subject: [PATCH 0484/1142] Further BC fix --- .../DependencyInjection/Configuration.php | 6 +- .../DependencyInjection/Configuration.php | 6 +- .../TransportFactoryTest.php | 116 ++++-------------- pkg/simple-client/SimpleClient.php | 6 +- 4 files changed, 34 insertions(+), 100 deletions(-) diff --git a/pkg/async-event-dispatcher/DependencyInjection/Configuration.php b/pkg/async-event-dispatcher/DependencyInjection/Configuration.php index 2deb06a1f..56151e956 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/Configuration.php +++ b/pkg/async-event-dispatcher/DependencyInjection/Configuration.php @@ -12,11 +12,11 @@ class Configuration implements ConfigurationInterface */ public function getConfigTreeBuilder() { - $tb = new TreeBuilder('enqueue_async_event_dispatcher'); - - if (method_exists($tb, 'getRootNode')) { + if (method_exists(TreeBuilder::class, 'getRootNode')) { + $tb = new TreeBuilder('enqueue_async_event_dispatcher'); $rootNode = $tb->getRootNode(); } else { + $tb = new TreeBuilder(); $rootNode = $tb->root('enqueue_async_event_dispatcher'); } diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 074ea8267..6257fa4f1 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -24,11 +24,11 @@ public function __construct(bool $debug) public function getConfigTreeBuilder(): TreeBuilder { - $tb = new TreeBuilder('enqueue'); - - if (method_exists($tb, 'getRootNode')) { + if (method_exists(TreeBuilder::class, 'getRootNode')) { + $tb = new TreeBuilder('enqueue'); $rootNode = $tb->getRootNode(); } else { + $tb = new TreeBuilder(); $rootNode = $tb->root('enqueue'); } diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php index 7b76eeffd..92d89dd88 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php @@ -11,6 +11,7 @@ use Interop\Queue\ConnectionFactory; use Interop\Queue\Context; use PHPUnit\Framework\TestCase; +use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; use Symfony\Component\Config\Definition\Processor; @@ -37,13 +38,7 @@ public function testThrowIfEmptyNameGivenOnConstruction() public function testShouldAllowAddConfigurationAsStringDsn() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -64,13 +59,7 @@ public function testShouldAllowAddConfigurationAsStringDsn() */ public function testShouldAllowAddConfigurationAsDsnWithoutSlashes() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -86,13 +75,7 @@ public function testShouldAllowAddConfigurationAsDsnWithoutSlashes() public function testShouldSetNullTransportIfNullGiven() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -108,13 +91,7 @@ public function testShouldSetNullTransportIfNullGiven() public function testShouldSetNullTransportIfEmptyStringGiven() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -130,13 +107,7 @@ public function testShouldSetNullTransportIfEmptyStringGiven() public function testShouldSetNullTransportIfEmptyArrayGiven() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -152,13 +123,7 @@ public function testShouldSetNullTransportIfEmptyArrayGiven() public function testThrowIfEmptyDsnGiven() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -170,13 +135,7 @@ public function testThrowIfEmptyDsnGiven() public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -194,13 +153,7 @@ public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTime() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -218,13 +171,7 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTi public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSameTime() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -241,13 +188,7 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSame public function testShouldAllowSetFactoryClass() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -264,13 +205,7 @@ public function testShouldAllowSetFactoryClass() public function testShouldAllowSetFactoryService() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -287,13 +222,7 @@ public function testShouldAllowSetFactoryService() public function testShouldAllowSetConnectionFactoryClass() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -310,13 +239,7 @@ public function testShouldAllowSetConnectionFactoryClass() public function testThrowIfExtraOptionGiven() { - $tb = new TreeBuilder('foo'); - - if (method_exists($tb, 'getRootNode')) { - $rootNode = $tb->getRootNode(); - } else { - $rootNode = $tb->root('foo'); - } + $rootNode = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -529,4 +452,15 @@ public function testThrowIfBuildRpcClientCalledButContextServiceDoesNotExist() $this->expectExceptionMessage('The service "enqueue.transport.default.context" does not exist.'); $transport->buildRpcClient($container, []); } + + private function getRootNode(): NodeDefinition + { + if (method_exists(TreeBuilder::class, 'getRootNode')) { + $tb = new TreeBuilder('foo'); + return $tb->getRootNode(); + } + + $tb = new TreeBuilder(); + return $tb->root('foo'); + } } diff --git a/pkg/simple-client/SimpleClient.php b/pkg/simple-client/SimpleClient.php index dd0eb7466..0e03da77d 100644 --- a/pkg/simple-client/SimpleClient.php +++ b/pkg/simple-client/SimpleClient.php @@ -306,11 +306,11 @@ public function build(array $configs): void private function createConfiguration(): NodeInterface { - $tb = new TreeBuilder('enqueue'); - - if (method_exists($tb, 'getRootNode')) { + if (method_exists(TreeBuilder::class, 'getRootNode')) { + $tb = new TreeBuilder('enqueue'); $rootNode = $tb->getRootNode(); } else { + $tb = new TreeBuilder(); $rootNode = $tb->root('enqueue'); } From 8f74fc66587d90cebf5dafbe74dad6bd3457078b Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 14 Dec 2018 15:07:46 +0200 Subject: [PATCH 0485/1142] [simple-client] Simple Client should accept string DSN as constructor argument. --- pkg/simple-client/SimpleClient.php | 7 ++++ .../Tests/Functional/SimpleClientTest.php | 33 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/pkg/simple-client/SimpleClient.php b/pkg/simple-client/SimpleClient.php index b4c146eba..ea07ef018 100644 --- a/pkg/simple-client/SimpleClient.php +++ b/pkg/simple-client/SimpleClient.php @@ -119,6 +119,13 @@ final class SimpleClient */ public function __construct($config, LoggerInterface $logger = null) { + if (is_string($config)) { + $config = [ + 'transport' => $config, + 'client' => true, + ]; + } + $this->build(['enqueue' => $config]); $this->logger = $logger ?: new NullLogger(); diff --git a/pkg/simple-client/Tests/Functional/SimpleClientTest.php b/pkg/simple-client/Tests/Functional/SimpleClientTest.php index 4a4c83289..13320fb67 100644 --- a/pkg/simple-client/Tests/Functional/SimpleClientTest.php +++ b/pkg/simple-client/Tests/Functional/SimpleClientTest.php @@ -56,12 +56,39 @@ public function transportConfigDataProvider() ], '+1sec']; } + public function testShouldWorkWithStringDsnConstructorArgument() + { + $actualMessage = null; + + $client = new SimpleClient(getenv('AMQP_DSN')); + + $client->bindTopic('foo_topic', function (Message $message) use (&$actualMessage) { + $actualMessage = $message; + + return Result::ACK; + }); + + $client->setupBroker(); + $this->purgeQueue($client); + + $client->sendEvent('foo_topic', 'Hello there!'); + + $client->getQueueConsumer()->setReceiveTimeout(200); + $client->consume(new ChainExtension([ + new LimitConsumptionTimeExtension(new \DateTime('+1sec')), + new LimitConsumedMessagesExtension(2), + ])); + + $this->assertInstanceOf(Message::class, $actualMessage); + $this->assertSame('Hello there!', $actualMessage->getBody()); + } + /** * @dataProvider transportConfigDataProvider * * @param mixed $config */ - public function testSendEventWithOneSubscriber(array $config, string $timeLimit) + public function testSendEventWithOneSubscriber($config, string $timeLimit) { $actualMessage = null; @@ -101,7 +128,7 @@ public function testSendEventWithOneSubscriber(array $config, string $timeLimit) * * @param mixed $config */ - public function testSendEventWithTwoSubscriber(array $config, string $timeLimit) + public function testSendEventWithTwoSubscriber($config, string $timeLimit) { $received = 0; @@ -144,7 +171,7 @@ public function testSendEventWithTwoSubscriber(array $config, string $timeLimit) * * @param mixed $config */ - public function testSendCommand(array $config, string $timeLimit) + public function testSendCommand($config, string $timeLimit) { $received = 0; From 463725b301d2aba18bce3e49adb03b2e35dfd627 Mon Sep 17 00:00:00 2001 From: Jo Carter Date: Fri, 14 Dec 2018 13:14:51 +0000 Subject: [PATCH 0486/1142] Fix wonky var return --- .../TransportFactoryTest.php | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php index 92d89dd88..68868716b 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php @@ -38,7 +38,7 @@ public function testThrowIfEmptyNameGivenOnConstruction() public function testShouldAllowAddConfigurationAsStringDsn() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -59,7 +59,7 @@ public function testShouldAllowAddConfigurationAsStringDsn() */ public function testShouldAllowAddConfigurationAsDsnWithoutSlashes() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -75,7 +75,7 @@ public function testShouldAllowAddConfigurationAsDsnWithoutSlashes() public function testShouldSetNullTransportIfNullGiven() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -91,7 +91,7 @@ public function testShouldSetNullTransportIfNullGiven() public function testShouldSetNullTransportIfEmptyStringGiven() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -107,7 +107,7 @@ public function testShouldSetNullTransportIfEmptyStringGiven() public function testShouldSetNullTransportIfEmptyArrayGiven() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -123,7 +123,7 @@ public function testShouldSetNullTransportIfEmptyArrayGiven() public function testThrowIfEmptyDsnGiven() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -135,7 +135,7 @@ public function testThrowIfEmptyDsnGiven() public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -153,7 +153,7 @@ public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTime() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); @@ -171,7 +171,7 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTi public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSameTime() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -188,7 +188,7 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSame public function testShouldAllowSetFactoryClass() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -205,7 +205,7 @@ public function testShouldAllowSetFactoryClass() public function testShouldAllowSetFactoryService() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -222,7 +222,7 @@ public function testShouldAllowSetFactoryService() public function testShouldAllowSetConnectionFactoryClass() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -239,7 +239,7 @@ public function testShouldAllowSetConnectionFactoryClass() public function testThrowIfExtraOptionGiven() { - $rootNode = $this->getRootNode(); + list($tb, $rootNode) = $this->getRootNode(); $rootNode->append(TransportFactory::getConfiguration()); $processor = new Processor(); @@ -453,14 +453,19 @@ public function testThrowIfBuildRpcClientCalledButContextServiceDoesNotExist() $transport->buildRpcClient($container, []); } - private function getRootNode(): NodeDefinition + /** + * @return [TreeBuilder, NodeDefinition] + */ + private function getRootNode(): array { if (method_exists(TreeBuilder::class, 'getRootNode')) { $tb = new TreeBuilder('foo'); - return $tb->getRootNode(); + + return [$tb, $tb->getRootNode()]; } $tb = new TreeBuilder(); - return $tb->root('foo'); + + return [$tb, $tb->root('foo')]; } } From 5c48b7c9a38ec666b3c3d7f320eed4cf07b2dca1 Mon Sep 17 00:00:00 2001 From: Jo Carter Date: Fri, 14 Dec 2018 13:31:19 +0000 Subject: [PATCH 0487/1142] Exclude from STAN --- phpstan.neon | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/phpstan.neon b/phpstan.neon index 1a51a46e1..222a9fe95 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -10,4 +10,7 @@ parameters: - pkg/job-queue/Test/JobRunner.php - pkg/job-queue/Tests/Functional/app/AppKernel.php - pkg/rdkafka/RdKafkaConsumer.php - + - pkg/async-event-dispatcher/DependencyInjection/Configuration.php + - pkg/enqueue-bundle/DependencyInjection/Configuration.php + - pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php + - pkg/simple-client/SimpleClient.php From ab8e66c260fa53819290d1da544222d986d06e33 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 14 Dec 2018 21:01:02 +0200 Subject: [PATCH 0488/1142] fix extensions version in tests. --- pkg/enqueue-bundle/Tests/fix_composer_json.php | 2 +- pkg/enqueue/Tests/fix_composer_json.php | 4 ++-- pkg/simple-client/Tests/fix_composer_json.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/fix_composer_json.php b/pkg/enqueue-bundle/Tests/fix_composer_json.php index fc430e276..f025f6081 100644 --- a/pkg/enqueue-bundle/Tests/fix_composer_json.php +++ b/pkg/enqueue-bundle/Tests/fix_composer_json.php @@ -4,6 +4,6 @@ $composerJson = json_decode(file_get_contents(__DIR__.'/../composer.json'), true); -$composerJson['config']['platform']['ext-amqp'] = '1.7'; +$composerJson['config']['platform']['ext-amqp'] = '1.9.3'; file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, JSON_PRETTY_PRINT)); diff --git a/pkg/enqueue/Tests/fix_composer_json.php b/pkg/enqueue/Tests/fix_composer_json.php index bce1ebb75..dfbec62fb 100644 --- a/pkg/enqueue/Tests/fix_composer_json.php +++ b/pkg/enqueue/Tests/fix_composer_json.php @@ -4,8 +4,8 @@ $composerJson = json_decode(file_get_contents(__DIR__.'/../composer.json'), true); -$composerJson['config']['platform']['ext-amqp'] = '1.7'; +$composerJson['config']['platform']['ext-amqp'] = '1.9.3'; $composerJson['config']['platform']['ext-rdkafka'] = '3.3'; -$composerJson['config']['platform']['ext-gearman'] = '1.1'; +$composerJson['config']['platform']['ext-gearman'] = '2'; file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, JSON_PRETTY_PRINT)); diff --git a/pkg/simple-client/Tests/fix_composer_json.php b/pkg/simple-client/Tests/fix_composer_json.php index fc430e276..f025f6081 100644 --- a/pkg/simple-client/Tests/fix_composer_json.php +++ b/pkg/simple-client/Tests/fix_composer_json.php @@ -4,6 +4,6 @@ $composerJson = json_decode(file_get_contents(__DIR__.'/../composer.json'), true); -$composerJson['config']['platform']['ext-amqp'] = '1.7'; +$composerJson['config']['platform']['ext-amqp'] = '1.9.3'; file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, JSON_PRETTY_PRINT)); From 8c81a0ad5bb61199431855f2254622554a658c49 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 15 Dec 2018 13:01:56 +0200 Subject: [PATCH 0489/1142] [doc][skip ci] Update docs. --- docs/bundle/cli_commands.md | 130 ++++++++++------------- docs/bundle/config_reference.md | 2 +- docs/bundle/job_queue.md | 2 +- docs/bundle/message_processor.md | 172 +++++++++++++++++-------------- docs/bundle/quick_tour.md | 13 +-- 5 files changed, 161 insertions(+), 158 deletions(-) diff --git a/docs/bundle/cli_commands.md b/docs/bundle/cli_commands.md index c61d4b7c9..9bb114aba 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/bundle/cli_commands.md @@ -35,18 +35,20 @@ Options: --message-limit=MESSAGE-LIMIT Consume n messages and exit --time-limit=TIME-LIMIT Consume messages during this time --memory-limit=MEMORY-LIMIT Consume messages until process reaches this memory limit in MB + --niceness=NICENESS Set process niceness --setup-broker Creates queues, topics, exchanges, binding etc on broker side. - --idle-timeout=IDLE-TIMEOUT The time in milliseconds queue consumer idle if no message has been received. --receive-timeout=RECEIVE-TIMEOUT The time in milliseconds queue consumer waits for a message. + --logger[=LOGGER] A logger to be used. Could be "default", "null", "stdout". [default: "default"] --skip[=SKIP] Queues to skip consumption of messages from (multiple values allowed) + -c, --client[=CLIENT] The client to consume messages from. [default: "default"] -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question - -e, --env=ENV The environment name [default: "test"] - --no-debug Switches off debug mode + -e, --env=ENV The Environment name. [default: "test"] + --no-debug Switches off debug mode. -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Help: @@ -58,26 +60,28 @@ Help: ``` ./bin/console enqueue:produce --help Usage: - enqueue:produce - enq:p + enqueue:produce [options] [--] Arguments: - topic A topic to send message to - message A message to send + message A message Options: - -h, --help Display this help message - -q, --quiet Do not output any message - -V, --version Display this application version - --ansi Force ANSI output - --no-ansi Disable ANSI output - -n, --no-interaction Do not ask any interactive question - -e, --env=ENV The environment name [default: "dev"] - --no-debug Switches off debug mode - -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug + -c, --client[=CLIENT] The client to consume messages from. [default: "default"] + --topic[=TOPIC] The topic to send a message to + --command[=COMMAND] The command to send a message to + -h, --help Display this help message + -q, --quiet Do not output any message + -V, --version Display this application version + --ansi Force ANSI output + --no-ansi Disable ANSI output + -n, --no-interaction Do not ask any interactive question + -e, --env=ENV The Environment name. [default: "test"] + --no-debug Switches off debug mode. + -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Help: - A command to send a message to topic + Sends an event to the topic + ``` ## enqueue:setup-broker @@ -85,70 +89,48 @@ Help: ``` ./bin/console enqueue:setup-broker --help Usage: - enqueue:setup-broker + enqueue:setup-broker [options] enq:sb Options: - -h, --help Display this help message - -q, --quiet Do not output any message - -V, --version Display this application version - --ansi Force ANSI output - --no-ansi Disable ANSI output - -n, --no-interaction Do not ask any interactive question - -e, --env=ENV The environment name [default: "dev"] - --no-debug Switches off debug mode - -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug - -Help: - Creates all required queues -``` - -## enqueue:queues - -``` -./bin/console enqueue:queues --help -Usage: - enqueue:queues - enq:m:q - debug:enqueue:queues - -Options: - -h, --help Display this help message - -q, --quiet Do not output any message - -V, --version Display this application version - --ansi Force ANSI output - --no-ansi Disable ANSI output - -n, --no-interaction Do not ask any interactive question - -e, --env=ENV The environment name [default: "dev"] - --no-debug Switches off debug mode - -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug + -c, --client[=CLIENT] The client to consume messages from. [default: "default"] + -h, --help Display this help message + -q, --quiet Do not output any message + -V, --version Display this application version + --ansi Force ANSI output + --no-ansi Disable ANSI output + -n, --no-interaction Do not ask any interactive question + -e, --env=ENV The Environment name. [default: "test"] + --no-debug Switches off debug mode. + -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Help: - A command shows all available queues and some information about them. + Setup broker. Configure the broker, creates queues, topics and so on. ``` -## enqueue:topics +## enqueue:routes ``` -./bin/console enqueue:topics --help +./bin/console enqueue:routes --help Usage: - enqueue:topics - enq:m:t - debug:enqueue:topics + enqueue:routes [options] + debug:enqueue:routes Options: - -h, --help Display this help message - -q, --quiet Do not output any message - -V, --version Display this application version - --ansi Force ANSI output - --no-ansi Disable ANSI output - -n, --no-interaction Do not ask any interactive question - -e, --env=ENV The environment name [default: "dev"] - --no-debug Switches off debug mode - -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug + --show-route-options Adds ability to hide options. + -c, --client[=CLIENT] The client to consume messages from. [default: "default"] + -h, --help Display this help message + -q, --quiet Do not output any message + -V, --version Display this application version + --ansi Force ANSI output + --no-ansi Disable ANSI output + -n, --no-interaction Do not ask any interactive question + -e, --env=ENV The Environment name. [default: "test"] + --no-debug Switches off debug mode. + -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Help: - A command shows all available topics and some information about them. + A command lists all registered routes. ``` ## enqueue:transport:consume @@ -156,26 +138,28 @@ Help: ``` ./bin/console enqueue:transport:consume --help Usage: - enqueue:transport:consume [options] [--] + enqueue:transport:consume [options] [--] []... Arguments: - processor-service A message processor service + processor A message processor. + queues A queue to consume from Options: --message-limit=MESSAGE-LIMIT Consume n messages and exit --time-limit=TIME-LIMIT Consume messages during this time --memory-limit=MEMORY-LIMIT Consume messages until process reaches this memory limit in MB - --idle-timeout=IDLE-TIMEOUT The time in milliseconds queue consumer idle if no message has been received. + --niceness=NICENESS Set process niceness --receive-timeout=RECEIVE-TIMEOUT The time in milliseconds queue consumer waits for a message. - --queue[=QUEUE] Queues to consume from (multiple values allowed) + --logger[=LOGGER] A logger to be used. Could be "default", "null", "stdout". [default: "default"] + -t, --transport[=TRANSPORT] The transport to consume messages from. [default: "default"] -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question - -e, --env=ENV The environment name [default: "test"] - --no-debug Switches off debug mode + -e, --env=ENV The Environment name. [default: "test"] + --no-debug Switches off debug mode. -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Help: diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index ea015de0a..1d57875d5 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -21,7 +21,7 @@ enqueue: # The transport option could accept a string DSN, an array with DSN key, or null. It accept extra options. To find out what option you can set, look at connection factory constructor docblock. transport: # Required - # The MQ broker DSN. These schemes are supported: "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb", "wamp", "ws", to use these "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "stomp", "sqs", "gps", "mongodb", "wamp", "ws" you have to install a package. + # The MQ broker DSN. These schemes are supported: "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "rediss", "stomp", "sqs", "gps", "mongodb", "wamp", "ws", to use these "file", "amqp", "amqps", "db2", "ibm-db2", "mssql", "sqlsrv", "mysql", "mysql2", "pgsql", "postgres", "sqlite", "sqlite3", "null", "gearman", "beanstalk", "kafka", "rdkafka", "redis", "rediss", "stomp", "sqs", "gps", "mongodb", "wamp", "ws" you have to install a package. dsn: ~ # Required # The connection factory class should implement "Interop\Queue\ConnectionFactory" interface diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index f33df1d8d..bc574e05b 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -143,7 +143,7 @@ services: class: 'App\Queue\SearchReindexProcessor' arguments: ['@Enqueue\JobQueue\JobRunner'] tags: - - { name: 'enqueue.client.processor' } + - { name: 'enqueue.command_subscriber' } ``` * Schedule command diff --git a/docs/bundle/message_processor.md b/docs/bundle/message_processor.md index 56793ae01..bb89f2fc1 100644 --- a/docs/bundle/message_processor.md +++ b/docs/bundle/message_processor.md @@ -9,40 +9,30 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message processor +A processor is responsible for processing consumed messages. Message processors and usage examples described in [consumption/message_processor](../consumption/message_processor.md) -Here we just show how to register a message processor service to enqueue. Let's say we have app bundle and a message processor there +Here we just show how to register a message processor service to enqueue. -* [Container tag](#container-tag) -* [Topic subscriber](#topic-subscriber) -* [Command subscriber](#command-subscriber) +* Transport: -# Container tag + * [Register a transport processor](#register-a-transport-processor) -```yaml -# src/AppBundle/Resources/services.yml - -services: - app.async.say_hello_processor: - class: 'AppBundle\Async\SayHelloProcessor' - tags: - - { name: 'enqueue.client.processor', topicName: 'aTopic' } - -``` +* Client: -The tag has some additional options: - -* topicName [Req]: Tells what topic to consume messages from. -* queueName: By default message processor does not require an extra queue on broker side. It reuse a default one. Setting the option you can define a custom queue to be used. -* processorName: By default the service id is used as message processor name. Using the option you can define a custom name. - -# Topic subscriber + * [Register a topic subscriber processor](#register-a-topic-subscriber-processor) + * [Register a command subscriber processor](#register-a-command-subscriber-processor) + * [Register a custom processor](#register-a-custom-processor) + +## Register a topic subscriber processor There is a `TopicSubscriberInterface` interface (like [EventSubscriberInterface](https://github.com/symfony/symfony/blob/master/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php)). -It is handy to subscribe on event messages. It allows to keep subscription login and process logic closer to each other. +It is handy to subscribe on event messages. +Check interface description for more possible ways to configure it. +It allows to keep subscription and processing logic in one place. ```php ['queueName' => 'fooQueue', 'processorName' => 'foo'], - 'anotherTopic' => ['queueName' => 'barQueue', 'processorName' => 'bar'], - ]; - } -} -``` - -In the container you can just add the tag `enqueue.client.message_processor` and omit any other options: +Tag the service in the container with `enqueue.topic_subscriber` tag: ```yaml -# src/AppBundle/Resources/services.yml +# config/services.yml services: - app.async.say_hello_processor: - class: 'AppBundle\Async\SayHelloProcessor' + App\Queue\SayHelloProcessor: tags: - - { name: 'enqueue.client.processor'} - + - { name: 'enqueue.topic_subscriber' } + + # registers to no default client + - { name: 'enqueue.topic_subscriber', client: 'foo' } ``` -# Command subscriber +## Register a command subscriber processor -There is a `CommandSubscriberInterface` interface which allows to register a command handlers. -If you send a message using ProducerV2::sendCommand('aCommandName') method it will come to this processor. +There is a `CommandSubscriberInterface` interface. +It is handy to register a command processor. +Check interface description for more possible ways to configure it. +It allows to keep subscription and processing logic in one place. ```php 'fooQueue', 'processorName' => 'aCommandName']; - } -} +services: + App\Queue\SendEmailProcessor: + tags: + - { name: 'enqueue.command_subscriber' } + + # registers to no default client + - { name: 'enqueue.command_subscriber', client: 'foo' } ``` There is a possibility to register a command processor which works exclusively on the queue (no other processors bound to it). -In this case you can send messages without setting any message properties at all. Here's an example of such a processor: +In this case you can send messages without setting any message properties at all. +It might be handy if you want to process messages that are sent by another application. -In the container you can just add the tag `enqueue.client.message_processor` and omit any other options: +Here's a configuration example: ```php 'the-exclusive-command-name', - 'queueName' => 'the-queue-name', - 'queueNameHardcoded' => true, + 'command' => 'aCommand', + 'queue' => 'the-queue-name', + 'prefix_queue' => false, 'exclusive' => true, ]; } } ``` -The same as a topic subscriber you have to tag a processor service (no need to add any options there): +The service has to be tagged with `enqueue.command_subscriber` tag. + +# Register a custom processor +You could register a processor that does not implement neither `CommandSubscriberInterface` not `TopicSubscriberInterface`. +There is a tag `enqueue.processor` for it. You must define either `topic` or `command` tag attribute. +It is possible to define a client you would like to register the processor to. By default, it is registered to default client (first configured or named `default` one ). ```yaml # src/AppBundle/Resources/services.yml services: - app.async.say_hello_processor: - class: 'AppBundle\Async\SayHelloProcessor' + AppBundle\Async\SayHelloProcessor: tags: - - { name: 'enqueue.client.processor'} + # registers as topic processor + - { name: 'enqueue.processor', topic: 'aTopic' } + # registers as command processor + - { name: 'enqueue.processor', command: 'aCommand' } + + # registers to no default client + - { name: 'enqueue.processor', command: 'aCommand', client: 'foo' } +``` + +The tag has some additional options: + +* queue +* prefix_queue +* processor +* exclusive + +You could add your own attributes. They will be accessible through `Route::getOption` later. + +# Register a transport processor + +If you want to use a processor with `enqueue:transport:consume` it should be tagged `enqueue.transport.processor`. +It is possible to define a transport you would like to register the processor to. By default, it is registered to default transport (first configured or named `default` one ). + +```yaml +# config/services.yml + +services: + App\Queue\SayHelloProcessor: + tags: + - { name: 'enqueue.transport.processor', processor: 'say_hello' } + + # registers to no default transport + - { name: 'enqueue.processor', transport: 'foo' } +``` + +The tag has some additional options: + +* processor + +Now you can run a command and tell it to consume from a given queue and process messages with given processor: +```bash +$ ./bin/console enqueue:transport:consume say_hello foo_queue -vvv ``` [back to index](../index.md) diff --git a/docs/bundle/quick_tour.md b/docs/bundle/quick_tour.md index 17496102b..4e5f57d94 100644 --- a/docs/bundle/quick_tour.md +++ b/docs/bundle/quick_tour.md @@ -15,10 +15,10 @@ It adds easy to use [configuration layer](config_reference.md), register service ## Install ```bash -$ composer require enqueue/enqueue-bundle enqueue/amqp-ext # or enqueue/amqp-bunny, enqueue/amqp-lib +$ composer require enqueue/enqueue-bundle enqueue/fs ``` -_**Note**: You could use not only AMQP transport but any other [available](https://github.com/php-enqueue/enqueue-dev/tree/master/docs/transport)._ +_**Note**: You could various other [transports](https://github.com/php-enqueue/enqueue-dev/tree/master/docs/transport)._ _**Note**: If you are looking for a way to migrate from `php-amqplib/rabbitmq-bundle` read this [article](https://blog.forma-pro.com/the-how-and-why-of-the-migration-from-rabbitmqbundle-to-enqueuebundle-6c4054135e2b)._ @@ -28,11 +28,12 @@ Then, enable the bundle by adding `new Enqueue\Bundle\EnqueueBundle()` to the bu ```php Date: Sat, 15 Dec 2018 22:34:14 +0200 Subject: [PATCH 0490/1142] [async-command] Remove command subsriber interface. remove services.yaml --- .../AsyncCommandExtension.php | 25 +++++++++---------- .../Resources/config/services.yml | 7 ------ pkg/async-command/RunCommandProcessor.php | 13 +--------- 3 files changed, 13 insertions(+), 32 deletions(-) delete mode 100644 pkg/async-command/Resources/config/services.yml diff --git a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php index 3d614b4c2..b4005ab28 100644 --- a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php +++ b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php @@ -2,28 +2,27 @@ namespace Enqueue\AsyncCommand\DependencyInjection; +use Enqueue\AsyncCommand\Commands; use Enqueue\AsyncCommand\RunCommandProcessor; -use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; -use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; class AsyncCommandExtension extends Extension { - /** - * {@inheritdoc} - */ public function load(array $configs, ContainerBuilder $container) { - $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); - $loader->load('services.yml'); - - $service = $container->register('enqueue.async_command.run_command_processor', RunCommandProcessor::class) - ->addArgument('%kernel.project_dir%') - ; - foreach ($configs['clients'] as $client) { - $service->addTag('enqueue.command_subscriber', ['client' => $client]); + $id = sprintf('enqueue.async_command.%s.run_command_processor', $client); + $container->register($id, RunCommandProcessor::class) + ->addArgument('%kernel.project_dir%') + ->addTag('enqueue.processor', [ + 'client' => $client, + 'command' => Commands::RUN_COMMAND, + 'queue' => Commands::RUN_COMMAND, + 'queue_prefixed' => false, + 'exclusive' => true, + ]) + ; } } } diff --git a/pkg/async-command/Resources/config/services.yml b/pkg/async-command/Resources/config/services.yml deleted file mode 100644 index 84ada4226..000000000 --- a/pkg/async-command/Resources/config/services.yml +++ /dev/null @@ -1,7 +0,0 @@ -services: - enqueue.async_command.run_command_processor: - class: 'Enqueue\AsyncCommand\RunCommandProcessor' - arguments: - - '%kernel.project_dir%' - tags: - - { name: 'enqueue.command_subscriber', client: 'default' } diff --git a/pkg/async-command/RunCommandProcessor.php b/pkg/async-command/RunCommandProcessor.php index b093adc5c..7925d658c 100644 --- a/pkg/async-command/RunCommandProcessor.php +++ b/pkg/async-command/RunCommandProcessor.php @@ -2,7 +2,6 @@ namespace Enqueue\AsyncCommand; -use Enqueue\Client\CommandSubscriberInterface; use Enqueue\Consumption\Result; use Interop\Queue\Context; use Interop\Queue\Message; @@ -10,7 +9,7 @@ use Symfony\Component\Process\PhpExecutableFinder; use Symfony\Component\Process\Process; -final class RunCommandProcessor implements Processor, CommandSubscriberInterface +final class RunCommandProcessor implements Processor { /** * @var string @@ -42,16 +41,6 @@ public function process(Message $message, Context $context): Result return Result::ack(); } - public static function getSubscribedCommand(): array - { - return [ - 'command' => Commands::RUN_COMMAND, - 'queue' => Commands::RUN_COMMAND, - 'prefix_queue' => false, - 'exclusive' => true, - ]; - } - /** * @return string */ From 88092173c85f279df742617a7861f37d33818eee Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 15 Dec 2018 22:34:44 +0200 Subject: [PATCH 0491/1142] [async-events] Remove command subscriber interface. --- pkg/async-event-dispatcher/AsyncProcessor.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pkg/async-event-dispatcher/AsyncProcessor.php b/pkg/async-event-dispatcher/AsyncProcessor.php index 3f5780734..c89f7e1de 100644 --- a/pkg/async-event-dispatcher/AsyncProcessor.php +++ b/pkg/async-event-dispatcher/AsyncProcessor.php @@ -2,14 +2,13 @@ namespace Enqueue\AsyncEventDispatcher; -use Enqueue\Client\CommandSubscriberInterface; use Enqueue\Consumption\Result; use Interop\Queue\Context; use Interop\Queue\Message; use Interop\Queue\Processor; use Symfony\Component\EventDispatcher\EventDispatcherInterface; -class AsyncProcessor implements Processor, CommandSubscriberInterface +class AsyncProcessor implements Processor { /** * @var Registry @@ -51,9 +50,4 @@ public function process(Message $message, Context $context) return self::ACK; } - - public static function getSubscribedCommand() - { - return Commands::DISPATCH_ASYNC_EVENTS; - } } From 214a5a65566f031a878384132eabdd5b2e66652e Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 15 Dec 2018 22:46:41 +0200 Subject: [PATCH 0492/1142] add transport processor tag. --- .../AsyncCommandExtension.php | 1 + .../AsyncEventDispatcherExtension.php | 18 +++++++++++++++--- .../Resources/config/services.yml | 14 -------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php index b4005ab28..9bf17a124 100644 --- a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php +++ b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php @@ -22,6 +22,7 @@ public function load(array $configs, ContainerBuilder $container) 'queue_prefixed' => false, 'exclusive' => true, ]) + ->addTag('enqueue.transport.processor') ; } } diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventDispatcherExtension.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventDispatcherExtension.php index b2ec12fad..8cb79ee98 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventDispatcherExtension.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventDispatcherExtension.php @@ -2,17 +2,17 @@ namespace Enqueue\AsyncEventDispatcher\DependencyInjection; +use Enqueue\AsyncEventDispatcher\AsyncProcessor; +use Enqueue\AsyncEventDispatcher\Commands; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +use Symfony\Component\DependencyInjection\Reference; class AsyncEventDispatcherExtension extends Extension { - /** - * {@inheritdoc} - */ public function load(array $configs, ContainerBuilder $container) { $config = $this->processConfiguration(new Configuration(), $configs); @@ -21,5 +21,17 @@ public function load(array $configs, ContainerBuilder $container) $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); + + $container->register('enqueue.events.async_processor', AsyncProcessor::class) + ->addArgument(new Reference('enqueue.events.registry')) + ->addArgument(new Reference('enqueue.events.event_dispatcher')) + ->addTag('enqueue.processor', [ + 'command' => Commands::DISPATCH_ASYNC_EVENTS, + 'queue' => '%enqueue_events_queue%', + 'queue_prefixed' => false, + 'exclusive' => true, + ]) + ->addTag('enqueue.transport.processor') + ; } } diff --git a/pkg/async-event-dispatcher/Resources/config/services.yml b/pkg/async-event-dispatcher/Resources/config/services.yml index 81ae3f305..2cef52714 100644 --- a/pkg/async-event-dispatcher/Resources/config/services.yml +++ b/pkg/async-event-dispatcher/Resources/config/services.yml @@ -25,20 +25,6 @@ services: - '@event_dispatcher' - '@enqueue.events.async_listener' - enqueue.events.async_processor: - class: 'Enqueue\AsyncEventDispatcher\AsyncProcessor' - public: public - arguments: - - '@enqueue.events.registry' - - '@enqueue.events.event_dispatcher' - tags: - - - name: 'enqueue.processor' - command: 'symfony.dispatch_async_events' - queue: '%enqueue_events_queue%' - queue_prefixed: false - exclusive: true - enqueue.events.php_serializer_event_transofrmer: class: 'Enqueue\AsyncEventDispatcher\PhpSerializerEventTransformer' public: public From f5117c5b5f81fd3f91a20ad2fa8d3f17e110a263 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 15 Dec 2018 22:53:01 +0200 Subject: [PATCH 0493/1142] remove not needed tests. --- .../Tests/RunCommandProcessorTest.php | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/pkg/async-command/Tests/RunCommandProcessorTest.php b/pkg/async-command/Tests/RunCommandProcessorTest.php index ce5dc9e4c..83274e2c0 100644 --- a/pkg/async-command/Tests/RunCommandProcessorTest.php +++ b/pkg/async-command/Tests/RunCommandProcessorTest.php @@ -2,9 +2,7 @@ namespace Enqueue\AsyncCommand\Tests; -use Enqueue\AsyncCommand\Commands; use Enqueue\AsyncCommand\RunCommandProcessor; -use Enqueue\Client\CommandSubscriberInterface; use Interop\Queue\Processor; use PHPUnit\Framework\TestCase; @@ -17,13 +15,6 @@ public function testShouldImplementProcessorInterface() $this->assertTrue($rc->implementsInterface(Processor::class)); } - public function testShouldImplementCommandSubscriberInterfaceInterface() - { - $rc = new \ReflectionClass(RunCommandProcessor::class); - - $this->assertTrue($rc->implementsInterface(CommandSubscriberInterface::class)); - } - public function testShouldBeFinal() { $rc = new \ReflectionClass(RunCommandProcessor::class); @@ -37,16 +28,4 @@ public function testCouldBeConstructedWithProjectDirAsFirstArgument() $this->assertAttributeSame('aProjectDir', 'projectDir', $processor); } - - public function testShouldSubscribeOnRunCommand() - { - $subscription = RunCommandProcessor::getSubscribedCommand(); - - $this->assertSame([ - 'command' => Commands::RUN_COMMAND, - 'queue' => Commands::RUN_COMMAND, - 'prefix_queue' => false, - 'exclusive' => true, - ], $subscription); - } } From f3fec660f36a271ab3feab9a1f2a704bd6185f63 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 17 Dec 2018 13:23:18 +0200 Subject: [PATCH 0494/1142] fix tests. --- .../Tests/Functional/App/config/config.yml | 4 ++++ .../Functional/Events/AsyncProcessorTest.php | 10 +++++----- .../Tests/Functional/RoutesCommandTest.php | 20 +++++++++---------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 718990333..1198e60d2 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -75,6 +75,10 @@ services: alias: 'enqueue.client.routes_command' public: true + test.enqueue.events.async_processor: + alias: 'enqueue.events.async_processor' + public: true + test_async_listener: class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncListener' public: true diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php index 101e5ecec..e595414ae 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php @@ -33,7 +33,7 @@ public function setUp() public function testCouldBeGetFromContainerAsService() { /** @var AsyncProcessor $processor */ - $processor = static::$container->get('enqueue.events.async_processor'); + $processor = static::$container->get('test.enqueue.events.async_processor'); $this->assertInstanceOf(AsyncProcessor::class, $processor); } @@ -41,7 +41,7 @@ public function testCouldBeGetFromContainerAsService() public function testShouldRejectIfMessageDoesNotContainEventNameProperty() { /** @var AsyncProcessor $processor */ - $processor = static::$container->get('enqueue.events.async_processor'); + $processor = static::$container->get('test.enqueue.events.async_processor'); $message = new NullMessage(); @@ -51,7 +51,7 @@ public function testShouldRejectIfMessageDoesNotContainEventNameProperty() public function testShouldRejectIfMessageDoesNotContainTransformerNameProperty() { /** @var AsyncProcessor $processor */ - $processor = static::$container->get('enqueue.events.async_processor'); + $processor = static::$container->get('test.enqueue.events.async_processor'); $message = new NullMessage(); $message->setProperty('event_name', 'anEventName'); @@ -62,7 +62,7 @@ public function testShouldRejectIfMessageDoesNotContainTransformerNameProperty() public function testShouldCallRealListener() { /** @var AsyncProcessor $processor */ - $processor = static::$container->get('enqueue.events.async_processor'); + $processor = static::$container->get('test.enqueue.events.async_processor'); $message = new NullMessage(); $message->setProperty('event_name', 'test_async'); @@ -93,7 +93,7 @@ public function testShouldCallRealListener() public function testShouldCallRealSubscriber() { /** @var AsyncProcessor $processor */ - $processor = static::$container->get('enqueue.events.async_processor'); + $processor = static::$container->get('test.enqueue.events.async_processor'); $message = new NullMessage(); $message->setProperty('event_name', 'test_async_subscriber'); diff --git a/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php b/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php index afefe6482..4970e9b43 100644 --- a/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php @@ -25,12 +25,12 @@ public function testShouldDisplayRegisteredTopics() $tester = new CommandTester($command); $tester->execute([]); - $expected = <<<'OUTPUT' -| topic | theTopic | default (prefixed) | test_topic_subscriber_processor | (hidden) | -OUTPUT; - $this->assertSame(0, $tester->getStatusCode()); - $this->assertContains($expected, $tester->getDisplay()); + $this->assertContains('| topic', $tester->getDisplay()); + $this->assertContains('| theTopic', $tester->getDisplay()); + $this->assertContains('| default (prefixed)', $tester->getDisplay()); + $this->assertContains('| test_topic_subscriber_processor', $tester->getDisplay()); + $this->assertContains('| (hidden)', $tester->getDisplay()); } public function testShouldDisplayCommands() @@ -41,11 +41,11 @@ public function testShouldDisplayCommands() $tester = new CommandTester($command); $tester->execute([]); - $expected = <<<'OUTPUT' -| command | theCommand | default (prefixed) | test_command_subscriber_processor | (hidden) | -OUTPUT; - $this->assertSame(0, $tester->getStatusCode()); - $this->assertContains($expected, $tester->getDisplay()); + $this->assertContains('| command', $tester->getDisplay()); + $this->assertContains('| theCommand', $tester->getDisplay()); + $this->assertContains('| test_command_subscriber_processor', $tester->getDisplay()); + $this->assertContains('| default (prefixed)', $tester->getDisplay()); + $this->assertContains('| (hidden)', $tester->getDisplay()); } } From 9ae2699219f39129f62cd952925851e7c1989115 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 17 Dec 2018 15:15:25 +0200 Subject: [PATCH 0495/1142] Release 0.9.3 --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9370be3d..a6249c6bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## [0.9.3](https://github.com/php-enqueue/enqueue-dev/tree/0.9.3) (2018-12-17) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.2...0.9.3) + +**Merged pull requests:** + +- Fix async command package [\#694](https://github.com/php-enqueue/enqueue-dev/pull/694) ([makasim](https://github.com/makasim)) +- Fix async events package [\#694](https://github.com/php-enqueue/enqueue-dev/pull/694) ([makasim](https://github.com/makasim)) +- Add commands for single transport\client with typed arguments. [\#693](https://github.com/php-enqueue/enqueue-dev/pull/693) ([makasim](https://github.com/makasim)) +- Fix TreeBuilder in Symfony 4.2 [\#692](https://github.com/php-enqueue/enqueue-dev/pull/692) ([angelsk](https://github.com/angelsk)) +- [doc] update docs [\#689](https://github.com/php-enqueue/enqueue-dev/pull/689) ([OskarStark](https://github.com/OskarStark)) + ## [0.9.2](https://github.com/php-enqueue/enqueue-dev/tree/0.9.2) (2018-12-13) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.1...0.9.2) From 8b94d3a193373ffdf69598d6d1d9190ef2fe2d1e Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 17 Dec 2018 15:33:23 +0200 Subject: [PATCH 0496/1142] Allow stable dsn pkg version --- pkg/test/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/test/composer.json b/pkg/test/composer.json index 1cf9f5482..52a5e368a 100644 --- a/pkg/test/composer.json +++ b/pkg/test/composer.json @@ -10,7 +10,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "require": { - "enqueue/dsn": "0.9.x-dev" + "enqueue/dsn": "^0.9" }, "autoload": { "psr-4": { "Enqueue\\Test\\": "" } From 35aa5cb23a1ffa36b06abeebe1ed9f1134d73749 Mon Sep 17 00:00:00 2001 From: Rubens Panfili Date: Tue, 18 Dec 2018 19:27:30 +0100 Subject: [PATCH 0497/1142] fix #696 parsing vhost from amqp dsn --- pkg/amqp-tools/ConnectionConfig.php | 4 ++- pkg/amqp-tools/Tests/ConnectionConfigTest.php | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/pkg/amqp-tools/ConnectionConfig.php b/pkg/amqp-tools/ConnectionConfig.php index c54eb179c..5d52891e9 100644 --- a/pkg/amqp-tools/ConnectionConfig.php +++ b/pkg/amqp-tools/ConnectionConfig.php @@ -402,7 +402,9 @@ private function parseDsn($dsn) 'port' => $dsn->getPort(), 'user' => $dsn->getUser(), 'pass' => $dsn->getPassword(), - 'vhost' => null !== $dsn->getPath() ? ltrim($dsn->getPath(), '/') : null, + 'vhost' => null !== ($path = $dsn->getPath()) ? + (0 === strpos($path, '/') ? substr($path, 1) : $path) + : null, 'read_timeout' => $dsn->getFloat('read_timeout'), 'write_timeout' => $dsn->getFloat('write_timeout'), 'connection_timeout' => $dsn->getFloat('connection_timeout'), diff --git a/pkg/amqp-tools/Tests/ConnectionConfigTest.php b/pkg/amqp-tools/Tests/ConnectionConfigTest.php index 28baff46b..d45b847b3 100644 --- a/pkg/amqp-tools/Tests/ConnectionConfigTest.php +++ b/pkg/amqp-tools/Tests/ConnectionConfigTest.php @@ -534,5 +534,31 @@ public static function provideConfigs() 'ssl_passphrase' => '', ], ]; + + yield [ + 'amqp://guest:guest@localhost:5672/%2f', + [ + 'host' => 'localhost', + 'port' => 5672, + 'vhost' => '/', + 'user' => 'guest', + 'pass' => 'guest', + 'read_timeout' => 3., + 'write_timeout' => 3., + 'connection_timeout' => 3., + 'persisted' => false, + 'lazy' => true, + 'qos_prefetch_size' => 0, + 'qos_prefetch_count' => 1, + 'qos_global' => false, + 'heartbeat' => 0.0, + 'ssl_on' => false, + 'ssl_verify' => true, + 'ssl_cacert' => '', + 'ssl_cert' => '', + 'ssl_key' => '', + 'ssl_passphrase' => '', + ], + ]; } } From 4df83de814182233d064885632b9d83612223378 Mon Sep 17 00:00:00 2001 From: Joeri Verdeyen Date: Tue, 18 Dec 2018 21:05:22 +0100 Subject: [PATCH 0498/1142] Use string-based UUIDs instead of binary --- pkg/dbal/DbalConsumerHelperTrait.php | 6 +++--- pkg/dbal/DbalContext.php | 9 ++------- pkg/dbal/DbalProducer.php | 11 +---------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 1e6e9c579..87e720dac 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -49,7 +49,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->set('redeliver_after', ':redeliverAfter') ->andWhere('id = :messageId') ->andWhere('delivery_id IS NULL') - ->setParameter('deliveryId', $deliveryId->getBytes(), Type::GUID) + ->setParameter('deliveryId', $deliveryId, Type::GUID) ->setParameter('redeliverAfter', $now + $redeliveryDelay, Type::BIGINT) ; @@ -68,7 +68,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->select('*') ->from($this->getContext()->getTableName()) ->andWhere('delivery_id = :deliveryId') - ->setParameter('deliveryId', $deliveryId->getBytes(), Type::GUID) + ->setParameter('deliveryId', $deliveryId, Type::GUID) ->setMaxResults(1) ->execute() ->fetch(); @@ -152,7 +152,7 @@ private function deleteMessage(string $deliveryId): void $this->getConnection()->delete( $this->getContext()->getTableName(), - ['delivery_id' => Uuid::fromString($deliveryId)->getBytes()], + ['delivery_id' => $deliveryId], ['delivery_id' => Type::GUID] ); } diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 431b115d5..f6119481c 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -17,9 +17,6 @@ use Interop\Queue\Queue; use Interop\Queue\SubscriptionConsumer; use Interop\Queue\Topic; -use Ramsey\Uuid\Codec\OrderedTimeCodec; -use Ramsey\Uuid\Uuid; -use Ramsey\Uuid\UuidFactory; class DbalContext implements Context { @@ -154,9 +151,7 @@ public function convertMessage(array $arrayMessage): DbalMessage ); if (isset($arrayMessage['id'])) { - $uuidCodec = new OrderedTimeCodec((new UuidFactory())->getUuidBuilder()); - - $message->setMessageId($uuidCodec->decodeBytes($arrayMessage['id'])->toString()); + $message->setMessageId($arrayMessage['id']); } if (isset($arrayMessage['queue'])) { $message->setQueue($arrayMessage['queue']); @@ -171,7 +166,7 @@ public function convertMessage(array $arrayMessage): DbalMessage $message->setPublishedAt((int) $arrayMessage['published_at']); } if (isset($arrayMessage['delivery_id'])) { - $message->setDeliveryId(Uuid::fromBytes($arrayMessage['delivery_id'])->toString()); + $message->setDeliveryId($arrayMessage['delivery_id']); } if (isset($arrayMessage['redeliver_after'])) { $message->setRedeliverAfter((int) $arrayMessage['redeliver_after']); diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index e18753729..f1666de24 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -11,9 +11,7 @@ use Interop\Queue\Exception\InvalidMessageException; use Interop\Queue\Message; use Interop\Queue\Producer; -use Ramsey\Uuid\Codec\OrderedTimeCodec; use Ramsey\Uuid\Uuid; -use Ramsey\Uuid\UuidFactory; class DbalProducer implements Producer { @@ -37,18 +35,12 @@ class DbalProducer implements Producer */ private $context; - /** - * @var OrderedTimeCodec - */ - private $uuidCodec; - /** * @param DbalContext $context */ public function __construct(DbalContext $context) { $this->context = $context; - $this->uuidCodec = new OrderedTimeCodec((new UuidFactory())->getUuidBuilder()); } /** @@ -71,7 +63,6 @@ public function send(Destination $destination, Message $message): void } $body = $message->getBody(); - $uuid = Uuid::uuid4(); $publishedAt = null !== $message->getPublishedAt() ? $message->getPublishedAt() : @@ -79,7 +70,7 @@ public function send(Destination $destination, Message $message): void ; $dbalMessage = [ - 'id' => $this->uuidCodec->encodeBinary($uuid), + 'id' => Uuid::uuid4(), 'published_at' => $publishedAt, 'body' => $body, 'headers' => JSON::encode($message->getHeaders()), From 0f27ec94e3d2c78d50b9812ef78488af561fc50f Mon Sep 17 00:00:00 2001 From: SAMUEL NELA Date: Wed, 19 Dec 2018 14:05:44 +0100 Subject: [PATCH 0499/1142] Fix link to declare queue --- docs/transport/amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/transport/amqp.md b/docs/transport/amqp.md index bc8aec185..52f70d77a 100644 --- a/docs/transport/amqp.md +++ b/docs/transport/amqp.md @@ -15,7 +15,7 @@ Build on top of [php amqp extension](https://github.com/pdezwart/php-amqp). * [Installation](#installation) * [Create context](#create-context) * [Declare topic](#declare-topic) -* [Declare queue](#decalre-queue) +* [Declare queue](#declare-queue) * [Bind queue to topic](#bind-queue-to-topic) * [Send message to topic](#send-message-to-topic) * [Send message to queue](#send-message-to-queue) From b7a22cde9c32df762290deba3f95668734353a53 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 20 Dec 2018 14:07:24 +0200 Subject: [PATCH 0500/1142] [client] Fix Exclusive Command Extension ignores route queue preifx option. --- .../ConsumptionExtension/ExclusiveCommandExtension.php | 2 +- .../ConsumptionExtension/ExclusiveCommandExtensionTest.php | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue/Client/ConsumptionExtension/ExclusiveCommandExtension.php b/pkg/enqueue/Client/ConsumptionExtension/ExclusiveCommandExtension.php index a76e49f30..7ab88ae0f 100644 --- a/pkg/enqueue/Client/ConsumptionExtension/ExclusiveCommandExtension.php +++ b/pkg/enqueue/Client/ConsumptionExtension/ExclusiveCommandExtension.php @@ -64,7 +64,7 @@ private function buildMap(): array continue; } - $queueName = $this->driver->createQueue($route->getQueue())->getQueueName(); + $queueName = $this->driver->createRouteQueue($route)->getQueueName(); if (array_key_exists($queueName, $map)) { throw new \LogicException('The queue name has been already bound by another exclusive command processor'); } diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php index 3e1ef2ba0..877836758 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php @@ -181,9 +181,10 @@ public function testShouldSetCommandPropertiesIfCurrentQueueHasExclusiveCommandP $driver = $this->createDriverStub($routeCollection); $driver ->expects($this->any()) - ->method('createQueue') - ->willReturnCallback(function (string $queueName) { - return new NullQueue($queueName); + ->method('createRouteQueue') + ->with($this->isInstanceOf(Route::class)) + ->willReturnCallback(function (Route $route) { + return new NullQueue($route->getQueue()); }) ; From 9c475a6e96597bc998ce9171d1cceeb3684decc1 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 20 Dec 2018 14:13:19 +0200 Subject: [PATCH 0501/1142] [client] Fix SetRouterProeprtiesExtension should skip no topic messages. --- .../SetRouterPropertiesExtension.php | 3 ++ .../SetRouterPropertiesExtensionTest.php | 32 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php b/pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php index 16558867e..c7682f60e 100644 --- a/pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php +++ b/pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php @@ -25,6 +25,9 @@ public function __construct(DriverInterface $driver) public function onMessageReceived(MessageReceived $context): void { $message = $context->getMessage(); + if (false == $message->getProperty(Config::TOPIC)) { + return; + } if ($message->getProperty(Config::PROCESSOR)) { return; } diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php index 4cd214e97..3c12de4f9 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php @@ -49,6 +49,7 @@ public function testShouldSetRouterProcessorPropertyIfNotSetAndOnRouterQueue() ; $message = new NullMessage(); + $message->setProperty(Config::TOPIC, 'aTopic'); $messageReceived = new MessageReceived( $this->createContextMock(), @@ -64,6 +65,7 @@ public function testShouldSetRouterProcessorPropertyIfNotSetAndOnRouterQueue() $this->assertEquals([ Config::PROCESSOR => 'router-processor-name', + Config::TOPIC => 'aTopic', ], $message->getProperties()); } @@ -86,6 +88,7 @@ public function testShouldNotSetRouterProcessorPropertyIfNotSetAndNotOnRouterQue ; $message = new NullMessage(); + $message->setProperty(Config::TOPIC, 'aTopic'); $messageReceived = new MessageReceived( $this->createContextMock(), @@ -99,7 +102,9 @@ public function testShouldNotSetRouterProcessorPropertyIfNotSetAndNotOnRouterQue $extension = new SetRouterPropertiesExtension($driver); $extension->onMessageReceived($messageReceived); - $this->assertEquals([], $message->getProperties()); + $this->assertEquals([ + Config::TOPIC => 'aTopic', + ], $message->getProperties()); } public function testShouldNotSetAnyPropertyIfProcessorNamePropertyAlreadySet() @@ -130,6 +135,31 @@ public function testShouldNotSetAnyPropertyIfProcessorNamePropertyAlreadySet() ], $message->getProperties()); } + public function testShouldSkipMessagesWithoutTopicPropertySet() + { + $driver = $this->createDriverMock(); + $driver + ->expects($this->never()) + ->method('getConfig') + ; + + $message = new NullMessage(); + + $messageReceived = new MessageReceived( + $this->createContextMock(), + $this->createConsumerStub(null), + $message, + $this->createProcessorMock(), + 1, + new NullLogger() + ); + + $extension = new SetRouterPropertiesExtension($driver); + $extension->onMessageReceived($messageReceived); + + $this->assertEquals([], $message->getProperties()); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext */ From bebe040427521ab1cf938697db17b615dca52c80 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 20 Dec 2018 14:20:43 +0200 Subject: [PATCH 0502/1142] [client] sendToProcessor should able to send message to router processor. --- pkg/enqueue/Client/Driver/GenericDriver.php | 8 ++-- .../Client/Driver/GenericDriverTestsTrait.php | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/pkg/enqueue/Client/Driver/GenericDriver.php b/pkg/enqueue/Client/Driver/GenericDriver.php index 63a1f12f3..529f6322c 100644 --- a/pkg/enqueue/Client/Driver/GenericDriver.php +++ b/pkg/enqueue/Client/Driver/GenericDriver.php @@ -71,7 +71,9 @@ public function sendToProcessor(Message $message): DriverSendResult /** @var InteropQueue $queue */ $queue = null; - if ($topic && $processor = $message->getProperty(Config::PROCESSOR)) { + $routerProcessor = $this->config->getRouterProcessor(); + $processor = $message->getProperty(Config::PROCESSOR); + if ($topic && $processor && $processor !== $routerProcessor) { $route = $this->routeCollection->topicAndProcessor($topic, $processor); if (false == $route) { throw new \LogicException(sprintf('There is no route for topic "%s" and processor "%s"', $topic, $processor)); @@ -79,8 +81,8 @@ public function sendToProcessor(Message $message): DriverSendResult $message->setProperty(Config::PROCESSOR, $route->getProcessor()); $queue = $this->createRouteQueue($route); - } elseif ($topic && false == $message->getProperty(Config::PROCESSOR)) { - $message->setProperty(Config::PROCESSOR, $this->config->getRouterProcessor()); + } elseif ($topic && (false == $processor || $processor === $routerProcessor)) { + $message->setProperty(Config::PROCESSOR, $routerProcessor); $queue = $this->createQueue($this->config->getRouterQueue()); } elseif ($command) { diff --git a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php index b4c23dd0d..ec38dfdd5 100644 --- a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php +++ b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php @@ -445,6 +445,54 @@ public function testThrowIfCommandSetOnSendToRouter() $driver->sendToRouter($message); } + public function testShouldSendMessageToRouterProcessor() + { + $queue = $this->createQueue(''); + $transportMessage = $this->createMessage(); + + $producer = $this->createProducerMock(); + $producer + ->expects($this->once()) + ->method('send') + ->with($this->identicalTo($queue), $this->identicalTo($transportMessage)) + ; + $context = $this->createContextMock(); + $context + ->expects($this->once()) + ->method('createQueue') + ->with($this->getDefaultQueueTransportName()) + ->willReturn($queue) + ; + $context + ->expects($this->once()) + ->method('createProducer') + ->willReturn($producer) + ; + $context + ->expects($this->once()) + ->method('createMessage') + ->willReturn($transportMessage) + ; + + $config = $this->createDummyConfig(); + + $driver = $this->createDriver( + $context, + $config, + new RouteCollection([ + new Route('topic', Route::TOPIC, 'processor', [ + 'queue' => 'custom' + ]), + ]) + ); + + $message = new Message(); + $message->setProperty(Config::TOPIC, 'topic'); + $message->setProperty(Config::PROCESSOR, $config->getRouterProcessor()); + + $driver->sendToProcessor($message); + } + public function testShouldSendTopicMessageToProcessorToDefaultQueue() { $queue = $this->createQueue(''); From 9e281edb161f1a507fc6c1028e8dd61151518044 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 20 Dec 2018 15:04:59 +0200 Subject: [PATCH 0503/1142] fix cs --- pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php index ec38dfdd5..cb141372b 100644 --- a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php +++ b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php @@ -481,7 +481,7 @@ public function testShouldSendMessageToRouterProcessor() $config, new RouteCollection([ new Route('topic', Route::TOPIC, 'processor', [ - 'queue' => 'custom' + 'queue' => 'custom', ]), ]) ); From a1de86c5e6767b9204ccf2bab8f9f22531ef063d Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 21 Dec 2018 10:26:20 +0200 Subject: [PATCH 0504/1142] [skip ci] upd changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6249c6bd..cd4de1b34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## [0.9.4](https://github.com/php-enqueue/enqueue-dev/tree/0.9.4) (2018-12-20) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.3...0.9.4) + +**Merged pull requests:** + +- \[client\] sendToProcessor should able to send message to router processor. [\#703](https://github.com/php-enqueue/enqueue-dev/pull/703) ([makasim](https://github.com/makasim)) +- \[client\] Fix SetRouterPropertiesExtension should skip no topic messages. [\#702](https://github.com/php-enqueue/enqueue-dev/pull/702) ([makasim](https://github.com/makasim)) +- \[client\] Fix Exclusive Command Extension ignores route queue prefix option. [\#701](https://github.com/php-enqueue/enqueue-dev/pull/701) ([makasim](https://github.com/makasim)) +- \[amqp\] fix \#696 parsing vhost from amqp dsn [\#697](https://github.com/php-enqueue/enqueue-dev/pull/697) ([rpanfili](https://github.com/rpanfili)) +- \[doc\] Fix link to declare queue [\#699](https://github.com/php-enqueue/enqueue-dev/pull/699) ([samnela](https://github.com/samnela)) + ## [0.9.3](https://github.com/php-enqueue/enqueue-dev/tree/0.9.3) (2018-12-17) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.2...0.9.3) From 8db40f838b18be972c984dd58987367e046ff730 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 21 Dec 2018 14:33:56 +0200 Subject: [PATCH 0505/1142] fix tests --- pkg/dbal/Tests/DbalConsumerTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index 1478fe89a..85130893d 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -70,7 +70,7 @@ public function testShouldDeleteMessageOnAcknowledge() ->method('delete') ->with( 'some-table-name', - ['delivery_id' => $deliveryId->getBytes()], + ['delivery_id' => $deliveryId->toString()], ['delivery_id' => Type::GUID] ) ; @@ -141,7 +141,7 @@ public function testShouldDeleteMessageFromQueueOnReject() ->method('delete') ->with( 'some-table-name', - ['delivery_id' => $deliveryId->getBytes()], + ['delivery_id' => $deliveryId->toString()], ['delivery_id' => Type::GUID] ) ; From 7d2ba0d27820ac587d97d6a26f681c1e120c7f8f Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 21 Dec 2018 16:05:15 +0200 Subject: [PATCH 0506/1142] [dbal] Run functional tests with PostgresSQL --- docker-compose.yml | 10 ++++ docker/Dockerfile | 2 +- docker/bin/refresh-postgres-database.php | 14 +++++ docker/bin/test.sh | 8 +-- .../Tests/Functional/DbalConsumerTest.php | 2 +- .../{ => Mysql}/CreateDbalContextTrait.php | 2 +- .../Spec/{ => Mysql}/DbalContextTest.php | 2 +- .../Spec/{ => Mysql}/DbalProducerTest.php | 2 +- .../{ => Mysql}/DbalRequeueMessageTest.php | 2 +- ...dAndReceiveDelayedMessageFromQueueTest.php | 2 +- ...ndReceivePriorityMessagesFromQueueTest.php | 2 +- ...ReceiveTimeToLiveMessagesFromQueueTest.php | 2 +- .../DbalSendToAndReceiveFromQueueTest.php | 2 +- .../DbalSendToAndReceiveFromTopicTest.php | 2 +- ...balSendToAndReceiveNoWaitFromQueueTest.php | 2 +- ...balSendToAndReceiveNoWaitFromTopicTest.php | 2 +- ...umerConsumeFromAllSubscribedQueuesTest.php | 2 +- ...onConsumerConsumeUntilUnsubscribedTest.php | 2 +- ...balSubscriptionConsumerStopOnFalseTest.php | 2 +- .../Postgresql/CreateDbalContextTrait.php | 27 ++++++++++ .../Tests/Spec/Postgresql/DbalContextTest.php | 21 ++++++++ .../Spec/Postgresql/DbalProducerTest.php | 21 ++++++++ .../Postgresql/DbalRequeueMessageTest.php | 21 ++++++++ ...dAndReceiveDelayedMessageFromQueueTest.php | 21 ++++++++ ...ndReceivePriorityMessagesFromQueueTest.php | 51 +++++++++++++++++++ ...ReceiveTimeToLiveMessagesFromQueueTest.php | 21 ++++++++ .../DbalSendToAndReceiveFromQueueTest.php | 21 ++++++++ .../DbalSendToAndReceiveFromTopicTest.php | 21 ++++++++ ...balSendToAndReceiveNoWaitFromQueueTest.php | 21 ++++++++ ...balSendToAndReceiveNoWaitFromTopicTest.php | 21 ++++++++ ...umerConsumeFromAllSubscribedQueuesTest.php | 41 +++++++++++++++ ...onConsumerConsumeUntilUnsubscribedTest.php | 41 +++++++++++++++ ...balSubscriptionConsumerStopOnFalseTest.php | 41 +++++++++++++++ 33 files changed, 435 insertions(+), 19 deletions(-) create mode 100644 docker/bin/refresh-postgres-database.php rename pkg/dbal/Tests/Spec/{ => Mysql}/CreateDbalContextTrait.php (94%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalContextTest.php (87%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalProducerTest.php (88%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalRequeueMessageTest.php (88%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSendAndReceiveDelayedMessageFromQueueTest.php (90%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSendAndReceivePriorityMessagesFromQueueTest.php (96%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php (90%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSendToAndReceiveFromQueueTest.php (89%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSendToAndReceiveFromTopicTest.php (89%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSendToAndReceiveNoWaitFromQueueTest.php (89%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSendToAndReceiveNoWaitFromTopicTest.php (89%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php (95%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php (95%) rename pkg/dbal/Tests/Spec/{ => Mysql}/DbalSubscriptionConsumerStopOnFalseTest.php (94%) create mode 100644 pkg/dbal/Tests/Spec/Postgresql/CreateDbalContextTrait.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalContextTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalProducerTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalRequeueMessageTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveDelayedMessageFromQueueTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromQueueTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromTopicTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromQueueTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromTopicTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php create mode 100644 pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerStopOnFalseTest.php diff --git a/docker-compose.yml b/docker-compose.yml index cc8451fbc..e2fcf287e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,7 @@ services: depends_on: - rabbitmq - mysql + - postgres - redis - beanstalkd - gearmand @@ -26,7 +27,9 @@ services: - RABITMQ_STOMP_DSN=stomp+rabbitmq://guest:guest@rabbitmq:61613/mqdev - RABBITMQ_MANAGMENT_DSN=http://guest:guest@rabbitmq:15672/mqdev - DOCTRINE_DSN=mysql://root:rootpass@mysql/mqdev + - DOCTRINE_POSTGRES_DSN=postgres://postgres:pass@postgres/template1 - MYSQL_DSN=mysql://root:rootpass@mysql/mqdev + - POSTGRES_DSN=postgres://postgres:pass@postgres/postgres - PREDIS_DSN=redis+predis://redis - PHPREDIS_DSN=redis+phpredis://redis - GPS_DSN=gps:?projectId=mqdev&emulatorHost=http://google-pubsub:8085 @@ -77,6 +80,13 @@ services: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: mqdev + postgres: + image: postgres + environment: + POSTGRES_PASSWORD: pass + ports: + - "5432:5432" + generate-changelog: image: enqueue/generate-changelog:latest # build: { context: docker, dockerfile: Dockerfile.generate-changelog } diff --git a/docker/Dockerfile b/docker/Dockerfile index 323e241d5..c79a46461 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -3,7 +3,7 @@ FROM formapro/nginx-php-fpm:latest-all-exts ## libs RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php-dev php-redis git python + apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php-dev php-redis php-pgsql git python RUN set -x && \ apt-get update && \ diff --git a/docker/bin/refresh-postgres-database.php b/docker/bin/refresh-postgres-database.php new file mode 100644 index 000000000..7efaf4806 --- /dev/null +++ b/docker/bin/refresh-postgres-database.php @@ -0,0 +1,14 @@ +createContext(); + +$dbalContext->getDbalConnection()->getSchemaManager()->dropAndCreateDatabase('postgres'); +$dbalContext->createDataBaseTable(); + +echo 'Postgresql Database is updated'.PHP_EOL; diff --git a/docker/bin/test.sh b/docker/bin/test.sh index 35caf838a..2070584bb 100755 --- a/docker/bin/test.sh +++ b/docker/bin/test.sh @@ -32,6 +32,7 @@ trap "FORCE_EXIT=true" SIGTERM SIGINT waitForService rabbitmq 5672 50 waitForService rabbitmqssl 5671 50 waitForService mysql 3306 50 +waitForService postgres 5432 50 waitForService redis 6379 50 waitForService beanstalkd 11300 50 waitForService gearmand 4730 50 @@ -40,9 +41,10 @@ waitForService mongo 27017 50 waitForService thruway 9090 50 waitForService localstack 4576 50 -php docker/bin/refresh-mysql-database.php -php pkg/job-queue/Tests/Functional/app/console doctrine:database:create --if-not-exists -php pkg/job-queue/Tests/Functional/app/console doctrine:schema:update --force +php docker/bin/refresh-mysql-database.php || exit 1 +php docker/bin/refresh-postgres-database.php || exit 1 +php pkg/job-queue/Tests/Functional/app/console doctrine:database:create --if-not-exists || exit 1 +php pkg/job-queue/Tests/Functional/app/console doctrine:schema:update --force || exit 1 #php pkg/enqueue-bundle/Tests/Functional/app/console.php config:dump-reference enqueue bin/phpunit "$@" diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index 01e18fe94..1f8757e15 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -6,7 +6,7 @@ use Enqueue\Dbal\DbalContext; use Enqueue\Dbal\DbalMessage; -use Enqueue\Dbal\Tests\Spec\CreateDbalContextTrait; +use Enqueue\Dbal\Tests\Spec\Mysql\CreateDbalContextTrait; use PHPUnit\Framework\TestCase; /** diff --git a/pkg/dbal/Tests/Spec/CreateDbalContextTrait.php b/pkg/dbal/Tests/Spec/Mysql/CreateDbalContextTrait.php similarity index 94% rename from pkg/dbal/Tests/Spec/CreateDbalContextTrait.php rename to pkg/dbal/Tests/Spec/Mysql/CreateDbalContextTrait.php index 5a513869a..8f76cb2ff 100644 --- a/pkg/dbal/Tests/Spec/CreateDbalContextTrait.php +++ b/pkg/dbal/Tests/Spec/Mysql/CreateDbalContextTrait.php @@ -1,6 +1,6 @@ markTestSkipped('The POSTGRES_DSN env is not available. Skip tests'); + } + + $factory = new DbalConnectionFactory($env); + + $context = $factory->createContext(); + + if ($context->getDbalConnection()->getSchemaManager()->tablesExist([$context->getTableName()])) { + $context->getDbalConnection()->getSchemaManager()->dropTable($context->getTableName()); + } + + $context->createDataBaseTable(); + + return $context; + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalContextTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalContextTest.php new file mode 100644 index 000000000..89aa1d45d --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalContextTest.php @@ -0,0 +1,21 @@ +createDbalContext(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalProducerTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalProducerTest.php new file mode 100644 index 000000000..533d032e9 --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalProducerTest.php @@ -0,0 +1,21 @@ +createDbalContext()->createProducer(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalRequeueMessageTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalRequeueMessageTest.php new file mode 100644 index 000000000..e61f5a352 --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalRequeueMessageTest.php @@ -0,0 +1,21 @@ +createDbalContext(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveDelayedMessageFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveDelayedMessageFromQueueTest.php new file mode 100644 index 000000000..f33c5688b --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveDelayedMessageFromQueueTest.php @@ -0,0 +1,21 @@ +createDbalContext(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php new file mode 100644 index 000000000..a645cbad6 --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php @@ -0,0 +1,51 @@ +publishedAt = (int) (microtime(true) * 10000); + } + + /** + * @return Context + */ + protected function createContext() + { + return $this->createDbalContext(); + } + + /** + * {@inheritdoc} + * + * @param DbalContext $context + * + * @return DbalMessage + */ + protected function createMessage(Context $context, $body) + { + /** @var DbalMessage $message */ + $message = parent::createMessage($context, $body); + + // in order to test priorities correctly we have to make sure the messages were sent in the same time. + $message->setPublishedAt($this->publishedAt); + + return $message; + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php new file mode 100644 index 000000000..99b007770 --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php @@ -0,0 +1,21 @@ +createDbalContext(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromQueueTest.php new file mode 100644 index 000000000..c486f0f37 --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromQueueTest.php @@ -0,0 +1,21 @@ +createDbalContext(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromTopicTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromTopicTest.php new file mode 100644 index 000000000..0802c0935 --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromTopicTest.php @@ -0,0 +1,21 @@ +createDbalContext(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromQueueTest.php new file mode 100644 index 000000000..74e13d89f --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromQueueTest.php @@ -0,0 +1,21 @@ +createDbalContext(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromTopicTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromTopicTest.php new file mode 100644 index 000000000..0b6b30c17 --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromTopicTest.php @@ -0,0 +1,21 @@ +createDbalContext(); + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php new file mode 100644 index 000000000..d50da8acf --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php @@ -0,0 +1,41 @@ +createDbalContext(); + } + + /** + * @param DbalContext $context + * + * {@inheritdoc} + */ + protected function createQueue(Context $context, $queueName) + { + $queue = parent::createQueue($context, $queueName); + $context->purgeQueue($queue); + + return $queue; + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php new file mode 100644 index 000000000..64473a30f --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -0,0 +1,41 @@ +createDbalContext(); + } + + /** + * @param DbalContext $context + * + * {@inheritdoc} + */ + protected function createQueue(Context $context, $queueName) + { + $queue = parent::createQueue($context, $queueName); + $context->purgeQueue($queue); + + return $queue; + } +} diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerStopOnFalseTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerStopOnFalseTest.php new file mode 100644 index 000000000..2b493ba84 --- /dev/null +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerStopOnFalseTest.php @@ -0,0 +1,41 @@ +createDbalContext(); + } + + /** + * @param DbalContext $context + * + * {@inheritdoc} + */ + protected function createQueue(Context $context, $queueName) + { + $queue = parent::createQueue($context, $queueName); + $context->purgeQueue($queue); + + return $queue; + } +} From 9e63e2539fe22c807b07a9b8fef763ee77c64ce8 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 21 Dec 2018 16:59:28 +0200 Subject: [PATCH 0507/1142] do not expose port. --- docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e2fcf287e..d302118ad 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -84,8 +84,6 @@ services: image: postgres environment: POSTGRES_PASSWORD: pass - ports: - - "5432:5432" generate-changelog: image: enqueue/generate-changelog:latest From 24d7944096384d763ff7d15ec32a31d24470987e Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 21 Dec 2018 18:24:26 +0200 Subject: [PATCH 0508/1142] Release 0.9.5 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd4de1b34..e25206b8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## [0.9.5](https://github.com/php-enqueue/enqueue-dev/tree/0.9.5) (2018-12-21) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.4...0.9.5) + +**Merged pull requests:** + +- \[dbal\] Run tests on PostgreSQS [\#705](https://github.com/php-enqueue/enqueue-dev/pull/705) ([makasim](https://github.com/makasim)) +- \[dbal\] Use string-based UUIDs instead of binary [\#698](https://github.com/php-enqueue/enqueue-dev/pull/698) ([jverdeyen](https://github.com/jverdeyen)) + ## [0.9.4](https://github.com/php-enqueue/enqueue-dev/tree/0.9.4) (2018-12-20) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.3...0.9.4) From aa2eac98acf415f2b5f2dcc722e33ba6dfc19355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C5=ABnas=20Dronga?= Date: Fri, 28 Dec 2018 00:11:00 +0200 Subject: [PATCH 0509/1142] [consumption] fix wrong niceness extension param --- .../LimitsExtensionsCommandTrait.php | 4 +-- .../LimitsExtensionsCommandTraitTest.php | 28 ++++++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/pkg/enqueue/Symfony/Consumption/LimitsExtensionsCommandTrait.php b/pkg/enqueue/Symfony/Consumption/LimitsExtensionsCommandTrait.php index b721af925..d7363db09 100644 --- a/pkg/enqueue/Symfony/Consumption/LimitsExtensionsCommandTrait.php +++ b/pkg/enqueue/Symfony/Consumption/LimitsExtensionsCommandTrait.php @@ -58,8 +58,8 @@ protected function getLimitsExtensions(InputInterface $input, OutputInterface $o } $niceness = $input->getOption('niceness'); - if ($niceness) { - $extensions[] = new NicenessExtension($niceness); + if (!empty($niceness) && is_numeric($niceness)) { + $extensions[] = new NicenessExtension((int) $niceness); } return $extensions; diff --git a/pkg/enqueue/Tests/Symfony/Consumption/LimitsExtensionsCommandTraitTest.php b/pkg/enqueue/Tests/Symfony/Consumption/LimitsExtensionsCommandTraitTest.php index 54952749a..e92912355 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/LimitsExtensionsCommandTraitTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/LimitsExtensionsCommandTraitTest.php @@ -108,17 +108,37 @@ public function testShouldAddThreeLimitExtensions() $this->assertInstanceOf(LimitConsumerMemoryExtension::class, $result[2]); } - public function testShouldAddNicenessExtension() + /** + * @param mixed $inputValue + * @param bool $enabled + * @dataProvider provideNicenessValues + */ + public function testShouldAddNicenessExtension($inputValue, bool $enabled) { $command = new LimitsExtensionsCommand('name'); $tester = new CommandTester($command); $tester->execute([ - '--niceness' => 1, + '--niceness' => $inputValue, ]); $result = $command->getExtensions(); - $this->assertCount(1, $result); - $this->assertInstanceOf(NicenessExtension::class, $result[0]); + if ($enabled) { + $this->assertCount(1, $result); + $this->assertInstanceOf(NicenessExtension::class, $result[0]); + } else { + $this->assertEmpty($result); + } + } + + public function provideNicenessValues(): \Generator + { + yield [1, true]; + yield ['1', true]; + yield [-1.0, true]; + yield ['100', true]; + yield ['', false]; + yield ['0', false]; + yield [0.0, false]; } } From b21ba412ff25129f48a6fcf2f2297c32177e836d Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Wed, 2 Jan 2019 15:51:38 +0100 Subject: [PATCH 0510/1142] Add minimum stability - stable support --- pkg/monitoring/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index e31ecbc11..f77c56033 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "enqueue/enqueue": "^0.9", "ramsey/uuid": "^3", - "enqueue/dsn": "0.9.x-dev" + "enqueue/dsn": "^0.9" }, "require-dev": { "phpunit/phpunit": "~5.4.0", From 430cd4b1ef18da035a36db4b7ec6270d8e4d7801 Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Wed, 2 Jan 2019 18:44:11 +0100 Subject: [PATCH 0511/1142] Fix issue with invalid line format --- pkg/monitoring/InfluxDbStorage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index 7d25e1c57..d1e8e7c00 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -155,7 +155,7 @@ public function pushSentMessageStats(SentMessageStats $stats): void } $points = [ - new Point($this->config['measurementSentMessages'], null, $tags, [], $stats->getTimestampMs()), + new Point($this->config['measurementSentMessages'], 1, $tags, [], $stats->getTimestampMs()), ]; $this->getDb()->writePoints($points, Database::PRECISION_MILLISECONDS); From 359c4ab1cb875e15e2aea317e29ad945216a3d28 Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Wed, 2 Jan 2019 18:44:47 +0100 Subject: [PATCH 0512/1142] Add WAMP Thruway to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6ac624141..a46930d73 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ bin/phpstan bin/jp.php bin/php-parse bin/google-cloud-batch +bin/thruway vendor var .php_cs From 98cc4aa5e4a81ff947dc7208ef921110396a70ea Mon Sep 17 00:00:00 2001 From: lalov Date: Fri, 4 Jan 2019 15:07:59 +0100 Subject: [PATCH 0513/1142] Use database from config --- pkg/redis/PRedis.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/redis/PRedis.php b/pkg/redis/PRedis.php index 9115e677a..f76ad3efd 100644 --- a/pkg/redis/PRedis.php +++ b/pkg/redis/PRedis.php @@ -41,6 +41,7 @@ public function __construct(array $config) 'host' => $config['host'], 'port' => $config['port'], 'password' => $config['password'], + 'database' => $config['database'], 'path' => $config['path'], 'async' => $config['async'], 'persistent' => $config['persistent'], From a53935e17d47c55eb3c86c476f7778712706e062 Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Fri, 4 Jan 2019 17:26:46 +0100 Subject: [PATCH 0514/1142] Add datadog integration --- composer.json | 3 +- pkg/monitoring/DatadogStorage.php | 182 ++++++++++++++++++ pkg/monitoring/GenericStatsStorageFactory.php | 12 +- pkg/monitoring/README.md | 2 +- pkg/monitoring/Resources.php | 5 + .../DependencyInjection/MonitoringFactory.php | 4 +- .../Tests/GenericStatsStorageFactoryTest.php | 18 +- pkg/monitoring/composer.json | 4 +- 8 files changed, 215 insertions(+), 15 deletions(-) create mode 100644 pkg/monitoring/DatadogStorage.php diff --git a/composer.json b/composer.json index ed76384f5..f8ef90bcc 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,8 @@ "predis/predis": "^1.1", "thruway/pawl-transport": "^0.5.0", "voryx/thruway": "^0.5.3", - "influxdb/influxdb-php": "^1.14" + "influxdb/influxdb-php": "^1.14", + "datadog/php-datadogstatsd": "^1.3" }, "require-dev": { "phpunit/phpunit": "^5.5", diff --git a/pkg/monitoring/DatadogStorage.php b/pkg/monitoring/DatadogStorage.php new file mode 100644 index 000000000..dd150ad68 --- /dev/null +++ b/pkg/monitoring/DatadogStorage.php @@ -0,0 +1,182 @@ +config = $this->prepareConfig($config); + + if (false === $this->datadog) { + if (true === $this->config['batched']) { + $this->datadog = new BatchedDogStatsd($this->config); + } else { + $this->datadog = new DogStatsd($this->config); + } + } + } + + public function pushConsumerStats(ConsumerStats $stats): void + { + $queues = $stats->getQueues(); + array_walk($queues, function (Queue $queue) use ($stats) { + $tags = [ + 'queue' => $queue, + 'consumerId' => $stats->getConsumerId(), + ]; + + $values = [ + 'startedAtMs' => $stats->getStartedAtMs(), + 'started' => $stats->isStarted(), + 'finished' => $stats->isFinished(), + 'failed' => $stats->isFailed(), + ]; + + if ($stats->getFinishedAtMs()) { + $values['finishedAtMs'] = $stats->getFinishedAtMs(); + } + + $this->datadog->gauge($this->config['metric.consumers.started'], $stats->isStarted(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.finished'], $stats->isFinished(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.failed'], $stats->isFailed(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.received'], $stats->getReceived(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.acknowledged'], $stats->getAcknowledged(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.rejected'], $stats->getRejected(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.requeued'], $stats->getRejected(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.memoryUsage'], $stats->getMemoryUsage(), 1, $tags); + }); + } + + public function pushSentMessageStats(SentMessageStats $stats): void + { + $tags = [ + 'destination' => $stats->getDestination(), + ]; + + $properties = $stats->getProperties(); + if (false === empty($properties[Config::TOPIC])) { + $tags['topic'] = $properties[Config::TOPIC]; + } + + if (false === empty($properties[Config::COMMAND])) { + $tags['command'] = $properties[Config::COMMAND]; + } + + $this->datadog->increment($this->config['metric.messages.sent'], 1, $tags); + } + + public function pushConsumedMessageStats(ConsumedMessageStats $stats): void + { + $tags = [ + 'queue' => $stats->getQueue(), + 'status' => $stats->getStatus(), + ]; + + if (ConsumedMessageStats::STATUS_FAILED === $stats->getStatus()) { + $this->datadog->increment($this->config['metric.messages.failed'], 1, $tags); + } + + if ($stats->isRedelivered()) { + $this->datadog->increment($this->config['metric.messages.redelivered'], 1, $tags); + } + + $runtime = $stats->getTimestampMs() - $stats->getReceivedAtMs(); + $this->datadog->histogram($this->config['metric.messages.consumed'], $runtime, 1, $tags); + } + + private function parseDsn(string $dsn): array + { + $dsn = Dsn::parseFirst($dsn); + + if ('datadog' !== $dsn->getSchemeProtocol()) { + throw new \LogicException(sprintf( + 'The given scheme protocol "%s" is not supported. It must be "datadog"', + $dsn->getSchemeProtocol() + )); + } + + return array_filter(array_replace($dsn->getQuery(), [ + 'host' => $dsn->getHost(), + 'port' => $dsn->getPort(), + 'global_tags' => $dsn->getString('global_tags'), + 'batched' => $dsn->getString('batched'), + 'metric.messages.sent' => $dsn->getString('metric.messages.sent'), + 'metric.messages.consumed' => $dsn->getString('metric.messages.consumed'), + 'metric.messages.redelivered' => $dsn->getString('metric.messages.redelivered'), + 'metric.messages.failed' => $dsn->getString('metric.messages.failed'), + 'metric.consumers.started' => $dsn->getString('metric.consumers.started'), + 'metric.consumers.finished' => $dsn->getString('metric.consumers.finished'), + 'metric.consumers.failed' => $dsn->getString('metric.consumers.failed'), + 'metric.consumers.received' => $dsn->getString('metric.consumers.received'), + 'metric.consumers.acknowledged' => $dsn->getString('metric.consumers.acknowledged'), + 'metric.consumers.rejected' => $dsn->getString('metric.consumers.rejected'), + 'metric.consumers.requeued' => $dsn->getString('metric.consumers.requeued'), + 'metric.consumers.memoryUsage' => $dsn->getString('metric.consumers.memoryUsage'), + ]), function ($value) { + return null !== $value; + }); + } + + /** + * @param $config + * + * @return array + */ + private function prepareConfig($config): array + { + if (empty($config)) { + $config = $this->parseDsn('datadog:'); + } elseif (\is_string($config)) { + $config = $this->parseDsn($config); + } elseif (\is_array($config)) { + $config = empty($config['dsn']) ? $config : $this->parseDsn($config['dsn']); + } elseif ($config instanceof DogStatsd) { + $this->datadog = $config; + $config = []; + } else { + throw new \LogicException('The config must be either an array of options, a DSN string or null'); + } + + return array_replace([ + 'host' => 'localhost', + 'port' => 8125, + 'global_tags' => 'enqueue', + 'batched' => true, + 'metric.messages.sent' => 'enqueue.messages.sent', + 'metric.messages.consumed' => 'enqueue.messages.consumed', + 'metric.messages.redelivered' => 'enqueue.messages.redelivered', + 'metric.messages.failed' => 'enqueue.messages.failed', + 'metric.consumers.started' => 'enqueue.consumers.started', + 'metric.consumers.finished' => 'enqueue.consumers.finished', + 'metric.consumers.failed' => 'enqueue.consumers.failed', + 'metric.consumers.received' => 'enqueue.consumers.received', + 'metric.consumers.acknowledged' => 'enqueue.consumers.acknowledged', + 'metric.consumers.rejected' => 'enqueue.consumers.rejected', + 'metric.consumers.requeued' => 'enqueue.consumers.requeued', + 'metric.consumers.memoryUsage' => 'enqueue.consumers.memoryUsage', + ], $config); + } +} diff --git a/pkg/monitoring/GenericStatsStorageFactory.php b/pkg/monitoring/GenericStatsStorageFactory.php index 3fc94a4a6..55475f953 100644 --- a/pkg/monitoring/GenericStatsStorageFactory.php +++ b/pkg/monitoring/GenericStatsStorageFactory.php @@ -10,22 +10,22 @@ class GenericStatsStorageFactory implements StatsStorageFactory { public function create($config): StatsStorage { - if (is_string($config)) { + if (\is_string($config)) { $config = ['dsn' => $config]; } - if (false == is_array($config)) { + if (false === \is_array($config)) { throw new \InvalidArgumentException('The config must be either array or DSN string.'); } - if (false == array_key_exists('dsn', $config)) { + if (false === array_key_exists('dsn', $config)) { throw new \InvalidArgumentException('The config must have dsn key set.'); } $dsn = Dsn::parseFirst($config['dsn']); if ($storageClass = $this->findStorageClass($dsn, Resources::getKnownStorages())) { - return new $storageClass(1 === count($config) ? $config['dsn'] : $config); + return new $storageClass(1 === \count($config) ? $config['dsn'] : $config); } throw new \LogicException(sprintf('A given scheme "%s" is not supported.', $dsn->getScheme())); @@ -41,7 +41,7 @@ private function findStorageClass(Dsn $dsn, array $factories): ?string continue; } - if (false == in_array($protocol, $info['schemes'], true)) { + if (false === \in_array($protocol, $info['schemes'], true)) { continue; } @@ -53,7 +53,7 @@ private function findStorageClass(Dsn $dsn, array $factories): ?string } foreach ($factories as $storageClass => $info) { - if (false == in_array($protocol, $info['schemes'], true)) { + if (false === \in_array($protocol, $info['schemes'], true)) { continue; } diff --git a/pkg/monitoring/README.md b/pkg/monitoring/README.md index 3e020efc1..0942a4dbc 100644 --- a/pkg/monitoring/README.md +++ b/pkg/monitoring/README.md @@ -14,7 +14,7 @@ Queue Monitoring tool. Track sent, consumed messages. Consumers performances. * Could be used with any message queue library. * Could be intergrated to any PHP framework * Could send stats to any analytical platform -* Supports Grafana and WAMP out of the box. +* Supports Datadog, InfluxDb, Grafana and WAMP out of the box. * Provides integration for Enqueue [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) diff --git a/pkg/monitoring/Resources.php b/pkg/monitoring/Resources.php index 013559aef..2a5995fa3 100644 --- a/pkg/monitoring/Resources.php +++ b/pkg/monitoring/Resources.php @@ -42,6 +42,11 @@ public static function getKnownStorages(): array 'supportedSchemeExtensions' => [], ]; + $map[DatadogStorage::class] = [ + 'schemes' => ['datadog'], + 'supportedSchemeExtensions' => [], + ]; + self::$knownStorages = $map; } diff --git a/pkg/monitoring/Symfony/DependencyInjection/MonitoringFactory.php b/pkg/monitoring/Symfony/DependencyInjection/MonitoringFactory.php index f32946d77..c9a902d5d 100644 --- a/pkg/monitoring/Symfony/DependencyInjection/MonitoringFactory.php +++ b/pkg/monitoring/Symfony/DependencyInjection/MonitoringFactory.php @@ -42,8 +42,8 @@ public static function getConfiguration(string $name = 'monitoring'): ArrayNodeD ->info(sprintf('The "%s" option could accept a string DSN, an array with DSN key, or null. It accept extra options. To find out what option you can set, look at stats storage constructor doc block.', $name)) ->beforeNormalization() ->always(function ($v) { - if (is_array($v)) { - if (isset($v['storage_factory_class']) && isset($v['storage_factory_service'])) { + if (\is_array($v)) { + if (isset($v['storage_factory_class'], $v['storage_factory_service'])) { throw new \LogicException('Both options storage_factory_class and storage_factory_service are set. Please choose one.'); } diff --git a/pkg/monitoring/Tests/GenericStatsStorageFactoryTest.php b/pkg/monitoring/Tests/GenericStatsStorageFactoryTest.php index 5fd606d5a..fe7c2c759 100644 --- a/pkg/monitoring/Tests/GenericStatsStorageFactoryTest.php +++ b/pkg/monitoring/Tests/GenericStatsStorageFactoryTest.php @@ -1,7 +1,10 @@ assertClassImplements(StatsStorageFactory::class, GenericStatsStorageFactory::class); } - public function testShouldCreateInfluxDbStorage() + public function testShouldCreateInfluxDbStorage(): void { $storage = (new GenericStatsStorageFactory())->create('influxdb:'); $this->assertInstanceOf(InfluxDbStorage::class, $storage); } - public function testShouldCreateWampStorage() + public function testShouldCreateWampStorage(): void { $storage = (new GenericStatsStorageFactory())->create('wamp:'); $this->assertInstanceOf(WampStorage::class, $storage); } - public function testShouldThrowIfStorageIsNotSupported() + public function testShouldCreateDatadogStorage(): void + { + $storage = (new GenericStatsStorageFactory())->create('datadog:'); + + $this->assertInstanceOf(DatadogStorage::class, $storage); + } + + public function testShouldThrowIfStorageIsNotSupported(): void { $this->expectException(\LogicException::class); $this->expectExceptionMessage('A given scheme "unsupported" is not supported.'); diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index f77c56033..df5da85ce 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -15,13 +15,15 @@ "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", "influxdb/influxdb-php": "^1.14", + "datadog/php-datadogstatsd": "^1.3", "thruway/client": "^0.5", "thruway/pawl-transport": "^0.5" }, "suggest": { "thruway/client": "Client for Thruway and the WAMP (Web Application Messaging Protocol).", "thruway/pawl-transport": "Pawl WebSocket Transport for Thruway Client", - "influxdb/influxdb-php": "A PHP Client for InfluxDB, a time series database" + "influxdb/influxdb-php": "A PHP Client for InfluxDB, a time series database", + "datadog/php-datadogstatsd": "Datadog monitoring tool PHP integration" }, "support": { "email": "opensource@forma-pro.com", From 53c2ffeaa57acbd6c96465ae2fc802a6e3420745 Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Fri, 4 Jan 2019 17:37:43 +0100 Subject: [PATCH 0515/1142] Add monitoring to testsuite --- phpunit.xml.dist | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index f1c8f205f..91a1ef407 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -108,6 +108,10 @@ pkg/wamp/Tests + + + pkg/monitoring/Tests + From 1d4a46a7d26d0dc27a1282454c35ea61f9cbbf2f Mon Sep 17 00:00:00 2001 From: GCalmels Date: Mon, 7 Jan 2019 14:24:31 +0100 Subject: [PATCH 0516/1142] Fix async command/event pkgs --- pkg/async-command/DependencyInjection/AsyncCommandExtension.php | 2 +- .../DependencyInjection/AsyncEventDispatcherExtension.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php index 9bf17a124..2cfdf261c 100644 --- a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php +++ b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php @@ -19,7 +19,7 @@ public function load(array $configs, ContainerBuilder $container) 'client' => $client, 'command' => Commands::RUN_COMMAND, 'queue' => Commands::RUN_COMMAND, - 'queue_prefixed' => false, + 'prefix_queue' => false, 'exclusive' => true, ]) ->addTag('enqueue.transport.processor') diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventDispatcherExtension.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventDispatcherExtension.php index 8cb79ee98..0b16ca650 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventDispatcherExtension.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventDispatcherExtension.php @@ -28,7 +28,7 @@ public function load(array $configs, ContainerBuilder $container) ->addTag('enqueue.processor', [ 'command' => Commands::DISPATCH_ASYNC_EVENTS, 'queue' => '%enqueue_events_queue%', - 'queue_prefixed' => false, + 'prefix_queue' => false, 'exclusive' => true, ]) ->addTag('enqueue.transport.processor') From b06ebddf99fe4a888816463a5b12d8dd6e473c07 Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Mon, 7 Jan 2019 17:30:41 +0100 Subject: [PATCH 0517/1142] Fix issue with types and pre-created client --- pkg/monitoring/DatadogStorage.php | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/pkg/monitoring/DatadogStorage.php b/pkg/monitoring/DatadogStorage.php index dd150ad68..82e841a3f 100644 --- a/pkg/monitoring/DatadogStorage.php +++ b/pkg/monitoring/DatadogStorage.php @@ -8,7 +8,6 @@ use DataDog\DogStatsd; use Enqueue\Client\Config; use Enqueue\Dsn\Dsn; -use Interop\Queue\Queue; class DatadogStorage implements StatsStorage { @@ -30,8 +29,8 @@ public function __construct($config = 'datadog:') $this->config = $this->prepareConfig($config); - if (false === $this->datadog) { - if (true === $this->config['batched']) { + if (null === $this->datadog) { + if (true === filter_var($this->config['batched'], FILTER_VALIDATE_BOOLEAN)) { $this->datadog = new BatchedDogStatsd($this->config); } else { $this->datadog = new DogStatsd($this->config); @@ -42,26 +41,19 @@ public function __construct($config = 'datadog:') public function pushConsumerStats(ConsumerStats $stats): void { $queues = $stats->getQueues(); - array_walk($queues, function (Queue $queue) use ($stats) { + array_walk($queues, function (string $queue) use ($stats) { $tags = [ 'queue' => $queue, 'consumerId' => $stats->getConsumerId(), ]; - $values = [ - 'startedAtMs' => $stats->getStartedAtMs(), - 'started' => $stats->isStarted(), - 'finished' => $stats->isFinished(), - 'failed' => $stats->isFailed(), - ]; - if ($stats->getFinishedAtMs()) { $values['finishedAtMs'] = $stats->getFinishedAtMs(); } - $this->datadog->gauge($this->config['metric.consumers.started'], $stats->isStarted(), 1, $tags); - $this->datadog->gauge($this->config['metric.consumers.finished'], $stats->isFinished(), 1, $tags); - $this->datadog->gauge($this->config['metric.consumers.failed'], $stats->isFailed(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.started'], (int) $stats->isStarted(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.finished'], (int) $stats->isFinished(), 1, $tags); + $this->datadog->gauge($this->config['metric.consumers.failed'], (int) $stats->isFailed(), 1, $tags); $this->datadog->gauge($this->config['metric.consumers.received'], $stats->getReceived(), 1, $tags); $this->datadog->gauge($this->config['metric.consumers.acknowledged'], $stats->getAcknowledged(), 1, $tags); $this->datadog->gauge($this->config['metric.consumers.rejected'], $stats->getRejected(), 1, $tags); @@ -163,7 +155,6 @@ private function prepareConfig($config): array return array_replace([ 'host' => 'localhost', 'port' => 8125, - 'global_tags' => 'enqueue', 'batched' => true, 'metric.messages.sent' => 'enqueue.messages.sent', 'metric.messages.consumed' => 'enqueue.messages.consumed', From da5dd53a7bd52cae1a15c14c07abded3c1e21086 Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Tue, 8 Jan 2019 19:32:32 +0100 Subject: [PATCH 0518/1142] Add documentation part --- docs/images/datadog_monitoring.png | Bin 0 -> 327258 bytes docs/monitoring.md | 52 ++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 docs/images/datadog_monitoring.png diff --git a/docs/images/datadog_monitoring.png b/docs/images/datadog_monitoring.png new file mode 100644 index 0000000000000000000000000000000000000000..731aff3b3a960d1237a53c4822a0340fdbd4d905 GIT binary patch literal 327258 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 %8 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 BTrvOv literal 0 HcmV?d00001 diff --git a/docs/monitoring.md b/docs/monitoring.md index 6e1dd4414..12fa85fd1 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -14,9 +14,9 @@ With it, you can control how many messages were sent, how many processed success How many consumers are working, their up time, processed messages stats, memory usage and system load. The tool could be integrated with virtually any analytics and monitoring platform. There are several integration: + * [Datadog StatsD](https://datadoghq.com) * [InfluxDB](https://www.influxdata.com/) and [Grafana](https://grafana.com/) * [WAMP (Web Application Messaging Protocol)](https://wamp-proto.org/) - We are working on a JS\WAMP based real-time UI tool, for more information please [contact us](opensource@forma-pro.com). ![Grafana Monitoring](images/grafana_monitoring.jpg) @@ -30,6 +30,7 @@ We are working on a JS\WAMP based real-time UI tool, for more information please * [Consumption extension](#consumption-extension) * [Enqueue Client Extension](#enqueue-client-extension) * [InfluxDB Storage](#influxdb-storage) +* [Datadog Storage](#datadog-storage) * [WAMP (Web Socket Messaging Protocol) Storage](#wamp-(web-socket-messaging-protocol)-storage) * [Symfony App](#symfony-app) @@ -237,6 +238,50 @@ There are available options: * 'measurementConsumers' => 'consumers', ``` +## Datadog storage + +Install additional packages: + +``` +composer req datadog/php-datadogstatsd:^1.3 +``` + +```php +create('datadog://127.0.0.1:8125'); +``` + +For best experience please adjust units and types in metric summary. + +Example dashboard: + +![Datadog monitoring](images/datadog_monitoring.png) + + +There are available options (and all available metrics): + +``` +* 'host' => '127.0.0.1', +* 'port' => '8125', +* 'batched' => true, // performance boost +* 'global_tags' => '', // should contain keys and values +* 'metric.messages.sent' => 'enqueue.messages.sent', +* 'metric.messages.consumed' => 'enqueue.messages.consumed', +* 'metric.messages.redelivered' => 'enqueue.messages.redelivered', +* 'metric.messages.failed' => 'enqueue.messages.failed', +* 'metric.consumers.started' => 'enqueue.consumers.started', +* 'metric.consumers.finished' => 'enqueue.consumers.finished', +* 'metric.consumers.failed' => 'enqueue.consumers.failed', +* 'metric.consumers.received' => 'enqueue.consumers.received', +* 'metric.consumers.acknowledged' => 'enqueue.consumers.acknowledged', +* 'metric.consumers.rejected' => 'enqueue.consumers.rejected', +* 'metric.consumers.requeued' => 'enqueue.consumers.requeued', +* 'metric.consumers.memoryUsage' => 'enqueue.consumers.memoryUsage', +``` + + ## WAMP (Web Socket Messaging Protocol) Storage Install additional packages: @@ -280,6 +325,11 @@ enqueue: transport: 'amqp://guest:guest@foo:5672/%2f' monitoring: 'wamp://127.0.0.1:9090?topic=stats' client: ~ + + datadog: + transport: 'amqp://guest:guest@foo:5672/%2f' + monitoring: 'datadog://127.0.0.1:8125?batched=false' + client: ~ ``` [back to index](index.md) From 892f57957eeeefb64b76ab6d1df75f2dbe48b4db Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 9 Jan 2019 16:16:50 +0200 Subject: [PATCH 0519/1142] Release 0.9.6 --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e25206b8c..81aa3b4ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## [0.9.6](https://github.com/php-enqueue/enqueue-dev/tree/0.9.6) (2019-01-09) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.5...0.9.6) + +**Merged pull requests:** + +- Fix async command/event pkgs [\#717](https://github.com/php-enqueue/enqueue-dev/pull/717) ([GCalmels](https://github.com/GCalmels)) +- Use database from config in PRedis driver [\#715](https://github.com/php-enqueue/enqueue-dev/pull/715) ([lalov](https://github.com/lalov)) +- \[monitoring\] Add support of Datadog [\#716](https://github.com/php-enqueue/enqueue-dev/pull/716) ([uro](https://github.com/uro)) +- \[monitoring\] Fixed influxdb write on sentMessageStats [\#712](https://github.com/php-enqueue/enqueue-dev/pull/712) ([uro](https://github.com/uro)) +- \[monitoring\] Add support for minimum stability - stable [\#711](https://github.com/php-enqueue/enqueue-dev/pull/711) ([uro](https://github.com/uro)) +- \[consumption\] fix wrong niceness extension param [\#709](https://github.com/php-enqueue/enqueue-dev/pull/709) ([ramunasd](https://github.com/ramunasd)) + ## [0.9.5](https://github.com/php-enqueue/enqueue-dev/tree/0.9.5) (2018-12-21) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.4...0.9.5) From 257fdb5fbcb95d141ced3de2fc0d1dfd2a53fb3d Mon Sep 17 00:00:00 2001 From: Adrian Shum Date: Fri, 11 Jan 2019 23:16:24 +0800 Subject: [PATCH 0520/1142] SQS requeue: terminate visibility timeout instead of recreate message --- pkg/sqs/SqsConsumer.php | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index b6ded7e20..99929623a 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -133,14 +133,19 @@ public function reject(Message $message, bool $requeue = false): void { InvalidMessageException::assertMessageInstanceOf($message, SqsMessage::class); - $this->context->getSqsClient()->deleteMessage([ - '@region' => $this->queue->getRegion(), - 'QueueUrl' => $this->context->getQueueUrl($this->queue), - 'ReceiptHandle' => $message->getReceiptHandle(), - ]); - if ($requeue) { - $this->context->createProducer()->send($this->queue, $message); + $this->context->getAwsSqsClient()->changeMessageVisibility([ + '@region' => $this->queue->getRegion(), + 'QueueUrl' => $this->context->getQueueUrl($this->queue), + 'ReceiptHandle' => $message->getReceiptHandle(), + 'VisibilityTimeout' => 0, + ]); + } else { + $this->context->getSqsClient()->deleteMessage([ + '@region' => $this->queue->getRegion(), + 'QueueUrl' => $this->context->getQueueUrl($this->queue), + 'ReceiptHandle' => $message->getReceiptHandle(), + ]); } } From 69fba8c890355e8844a6deccda671bb04cfd6c50 Mon Sep 17 00:00:00 2001 From: Adrian Shum Date: Fri, 11 Jan 2019 23:20:07 +0800 Subject: [PATCH 0521/1142] update SqsClient --- pkg/sqs/SqsClient.php | 5 +++++ pkg/sqs/SqsConsumer.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/sqs/SqsClient.php b/pkg/sqs/SqsClient.php index 65cf2fb29..4fc87fabb 100644 --- a/pkg/sqs/SqsClient.php +++ b/pkg/sqs/SqsClient.php @@ -43,6 +43,11 @@ public function receiveMessage(array $args): Result return $this->callApi('receiveMessage', $args); } + public function changeMessageVisibility(array $args): Result + { + return $this->callApi('changeMessageVisibility', $args); + } + public function purgeQueue(array $args): Result { return $this->callApi('purgeQueue', $args); diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index 99929623a..3c8714e3d 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -134,7 +134,7 @@ public function reject(Message $message, bool $requeue = false): void InvalidMessageException::assertMessageInstanceOf($message, SqsMessage::class); if ($requeue) { - $this->context->getAwsSqsClient()->changeMessageVisibility([ + $this->context->getSqsClient()->changeMessageVisibility([ '@region' => $this->queue->getRegion(), 'QueueUrl' => $this->context->getQueueUrl($this->queue), 'ReceiptHandle' => $message->getReceiptHandle(), From 6c1cf35b96b17cb6459cef655807c80ab73321e5 Mon Sep 17 00:00:00 2001 From: Adrian Shum Date: Mon, 14 Jan 2019 16:13:26 +0800 Subject: [PATCH 0522/1142] attempt fix test --- pkg/sqs/Tests/SqsConsumerTest.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index 5d1f1cdeb..61e336771 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -203,19 +203,15 @@ public function testShouldRejectMessageAndRequeue() $client = $this->createSqsClientMock(); $client ->expects($this->once()) - ->method('deleteMessage') + ->method('changeMessageVisibility') ->with($this->identicalTo([ '@region' => null, 'QueueUrl' => 'theQueueUrl', 'ReceiptHandle' => 'theReceipt', + 'VisibilityTimeout' => 0, ])) ; - $message = new SqsMessage(); - $message->setReceiptHandle('theReceipt'); - - $destination = new SqsDestination('queue'); - $producer = $this->createProducerMock(); $producer ->expects($this->once()) @@ -235,11 +231,15 @@ public function testShouldRejectMessageAndRequeue() ->willReturn('theQueueUrl') ; $context - ->expects($this->once()) + ->expects($this->never()) ->method('createProducer') - ->willReturn($producer) ; + $message = new SqsMessage(); + $message->setReceiptHandle('theReceipt'); + + $destination = new SqsDestination('queue'); + $consumer = new SqsConsumer($context, $destination); $consumer->reject($message, true); } From 128d926a85bf4479debdebf754041727f18256ea Mon Sep 17 00:00:00 2001 From: Adrian Shum Date: Mon, 14 Jan 2019 16:26:12 +0800 Subject: [PATCH 0523/1142] attempt fix test --- pkg/sqs/Tests/SqsConsumerTest.php | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index 61e336771..67e6f8fc4 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -205,20 +205,13 @@ public function testShouldRejectMessageAndRequeue() ->expects($this->once()) ->method('changeMessageVisibility') ->with($this->identicalTo([ - '@region' => null, + '@region' => 'theRegion', 'QueueUrl' => 'theQueueUrl', 'ReceiptHandle' => 'theReceipt', 'VisibilityTimeout' => 0, ])) ; - $producer = $this->createProducerMock(); - $producer - ->expects($this->once()) - ->method('send') - ->with($this->identicalTo($destination), $this->identicalTo($message)) - ; - $context = $this->createContextMock(); $context ->expects($this->once()) @@ -239,6 +232,7 @@ public function testShouldRejectMessageAndRequeue() $message->setReceiptHandle('theReceipt'); $destination = new SqsDestination('queue'); + $destination->setRegion('theRegion'); $consumer = new SqsConsumer($context, $destination); $consumer->reject($message, true); From 21c62d2bfffc7394278b64345213688fa761f1bd Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Mon, 14 Jan 2019 15:46:25 +0100 Subject: [PATCH 0524/1142] Requeuing a message should not acknowledge it beforehand --- pkg/pheanstalk/PheanstalkConsumer.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/pheanstalk/PheanstalkConsumer.php b/pkg/pheanstalk/PheanstalkConsumer.php index 337b77d9d..bfd9fb3b0 100644 --- a/pkg/pheanstalk/PheanstalkConsumer.php +++ b/pkg/pheanstalk/PheanstalkConsumer.php @@ -88,11 +88,13 @@ public function acknowledge(Message $message): void */ public function reject(Message $message, bool $requeue = false): void { - $this->acknowledge($message); - if ($requeue) { $this->pheanstalk->release($message->getJob(), $message->getPriority(), $message->getDelay()); + + return; } + + $this->acknowledge($message); } private function convertJobToMessage(Job $job): PheanstalkMessage From 1fdb9dae0acf08cae74cfe02452d44471f32b5ad Mon Sep 17 00:00:00 2001 From: Anton Date: Tue, 15 Jan 2019 13:52:07 +0200 Subject: [PATCH 0525/1142] Update redis.md Fixed example of configuration. Current expression is `in_array('phpredis', $this->config['scheme_extensions'], true)` (https://github.com/php-enqueue/redis/blob/0.9.6/RedisConnectionFactory.php#L99) --- docs/transport/redis.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/transport/redis.md b/docs/transport/redis.md index f4c84e29a..df324484c 100644 --- a/docs/transport/redis.md +++ b/docs/transport/redis.md @@ -71,7 +71,7 @@ $factory = new RedisConnectionFactory([]); $factory = new RedisConnectionFactory([ 'host' => 'example.com', 'port' => 1000, - 'vendor' => 'phpredis', + 'scheme_extensions' => ['phpredis'], ]); // same as above but given as DSN string @@ -101,7 +101,7 @@ use Enqueue\Redis\RedisConnectionFactory; $connectionFactory = new RedisConnectionFactory([ 'host' => 'localhost', 'port' => 6379, - 'scheme_extensions' => 'predis', + 'scheme_extensions' => ['predis'], ]); $context = $connectionFactory->createContext(); @@ -232,4 +232,4 @@ To use it with Enqueue Redis you have to pass REDIS_URL to RedisConnectionFactor $connection = new \Enqueue\Redis\RedisConnectionFactory(getenv('REDIS_URL')); ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) From c076598d8f0d8c84a2841a4b5b2ee42e80336060 Mon Sep 17 00:00:00 2001 From: Anton Date: Tue, 15 Jan 2019 16:13:09 +0200 Subject: [PATCH 0526/1142] Update redis.md Updated example for setup custom options of PRedis provider --- docs/transport/redis.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/transport/redis.md b/docs/transport/redis.md index df324484c..de9c5d62d 100644 --- a/docs/transport/redis.md +++ b/docs/transport/redis.md @@ -107,7 +107,7 @@ $connectionFactory = new RedisConnectionFactory([ $context = $connectionFactory->createContext(); ``` -* With custom redis instance: +* With predis and custom [options](https://github.com/nrk/predis/wiki/Client-Options): It gives you more control over vendor specific features. @@ -116,10 +116,15 @@ It gives you more control over vendor specific features. use Enqueue\Redis\RedisConnectionFactory; use Enqueue\Redis\PRedis; -$config = []; -$options = []; +$config = [ + 'host' => 'localhost', + 'port' => 6379, + 'predis_options' => [ + 'prefix' => 'ns:' + ] +]; -$redis = new PRedis(new \PRedis\Client($config, $options)); +$redis = new PRedis($config); $factory = new RedisConnectionFactory($redis); ``` From b3e4a6a4c4923083143a4072e922e5afcb2ce29d Mon Sep 17 00:00:00 2001 From: Damien Harper Date: Tue, 15 Jan 2019 15:23:41 +0100 Subject: [PATCH 0527/1142] Avoid OutOfMemory exception `previous` attribute should not reference itself --- pkg/enqueue/Consumption/QueueConsumer.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 7ba927696..3454b302d 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -323,9 +323,11 @@ private function onProcessorException(ExtensionInterface $extension, Consumer $c } } - $prev = new \ReflectionProperty('Exception', 'previous'); - $prev->setAccessible(true); - $prev->setValue($wrapper, $exception); + if ($exception !== $wrapper) { + $prev = new \ReflectionProperty('Exception', 'previous'); + $prev->setAccessible(true); + $prev->setValue($wrapper, $exception); + } throw $e; } From 8cb976b9c676878a0e7b9685597809f4b72c174b Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Tue, 15 Jan 2019 17:14:02 +0100 Subject: [PATCH 0528/1142] Add unit tests for PheanstalkConsumer --- pkg/pheanstalk/PheanstalkConsumer.php | 9 ++ .../Tests/PheanstalkConsumerTest.php | 105 +++++++++++++++++- 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/pkg/pheanstalk/PheanstalkConsumer.php b/pkg/pheanstalk/PheanstalkConsumer.php index bfd9fb3b0..d8460f58a 100644 --- a/pkg/pheanstalk/PheanstalkConsumer.php +++ b/pkg/pheanstalk/PheanstalkConsumer.php @@ -88,6 +88,15 @@ public function acknowledge(Message $message): void */ public function reject(Message $message, bool $requeue = false): void { + InvalidMessageException::assertMessageInstanceOf($message, PheanstalkMessage::class); + + if (false == $message->getJob()) { + throw new \LogicException(sprintf( + 'The message could not be %s because it does not have job set.', + $requeue ? 'requeued' : 'rejected' + )); + } + if ($requeue) { $this->pheanstalk->release($message->getJob(), $message->getPriority(), $message->getDelay()); diff --git a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php index 60015dc99..7600e9921 100644 --- a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php @@ -96,7 +96,7 @@ public function testShouldReceiveNoWaitFromQueueAndReturnNullIfNoMessageInQueue( public function testShouldReceiveNoWaitFromQueueAndReturnMessageIfMessageInQueue() { $destination = new PheanstalkDestination('theQueueName'); - $message = new PheanstalkMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); + $message = new PheanstalkMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); $job = new Job('theJobId', json_encode($message)); @@ -118,6 +118,109 @@ public function testShouldReceiveNoWaitFromQueueAndReturnMessageIfMessageInQueue $this->assertSame($job, $actualMessage->getJob()); } + public function testShouldAcknowledgeMessage() + { + $destination = new PheanstalkDestination('theQueueName'); + $message = new PheanstalkMessage(); + + $job = new Job('theJobId', json_encode($message)); + $message->setJob($job); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('delete') + ->with($job) + ; + + $consumer = new PheanstalkConsumer($destination, $pheanstalk); + + $consumer->acknowledge($message); + } + + public function testAcknowledgeShouldThrowExceptionIfMessageHasNoJob() + { + $destination = new PheanstalkDestination('theQueueName'); + $pheanstalk = $this->createPheanstalkMock(); + + $consumer = new PheanstalkConsumer($destination, $pheanstalk); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The message could not be acknowledged because it does not have job set.'); + + $consumer->acknowledge(new PheanstalkMessage()); + } + + public function testShouldRejectMessage() + { + $destination = new PheanstalkDestination('theQueueName'); + $message = new PheanstalkMessage(); + + $job = new Job('theJobId', json_encode($message)); + $message->setJob($job); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('delete') + ->with($job) + ; + + $consumer = new PheanstalkConsumer($destination, $pheanstalk); + + $consumer->reject($message); + } + + public function testRejectShouldThrowExceptionIfMessageHasNoJob() + { + $destination = new PheanstalkDestination('theQueueName'); + $pheanstalk = $this->createPheanstalkMock(); + + $consumer = new PheanstalkConsumer($destination, $pheanstalk); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The message could not be rejected because it does not have job set.'); + + $consumer->reject(new PheanstalkMessage()); + } + + public function testShouldRequeueMessage() + { + $destination = new PheanstalkDestination('theQueueName'); + $message = new PheanstalkMessage(); + + $job = new Job('theJobId', json_encode($message)); + $message->setJob($job); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('release') + ->with($job, Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY) + ; + $pheanstalk + ->expects($this->never()) + ->method('delete') + ; + + $consumer = new PheanstalkConsumer($destination, $pheanstalk); + + $consumer->reject($message, true); + } + + public function testRequeueShouldThrowExceptionIfMessageHasNoJob() + { + $destination = new PheanstalkDestination('theQueueName'); + $pheanstalk = $this->createPheanstalkMock(); + + $consumer = new PheanstalkConsumer($destination, $pheanstalk); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The message could not be requeued because it does not have job set.'); + + $consumer->reject(new PheanstalkMessage(), true); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject|Pheanstalk */ From 80beadc971c2a04a9dc7e79d296ae91e1fdece2e Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Mon, 21 Jan 2019 11:08:30 +0200 Subject: [PATCH 0529/1142] doctrine schema --- .../DoctrineConnectionFactoryFactory.php | 54 +++++++++++++++++++ .../DoctrineSchema/DoctrineDriverFactory.php | 41 ++++++++++++++ .../DoctrineSchemaCompilerPass.php | 39 ++++++++++++++ pkg/enqueue-bundle/EnqueueBundle.php | 3 ++ .../Functional/App/config/custom-config.yml | 8 +++ .../Tests/Functional/UseCasesTest.php | 7 +++ 6 files changed, 152 insertions(+) create mode 100644 pkg/enqueue-bundle/DoctrineSchema/DoctrineConnectionFactoryFactory.php create mode 100644 pkg/enqueue-bundle/DoctrineSchema/DoctrineDriverFactory.php create mode 100644 pkg/enqueue-bundle/DoctrineSchema/DoctrineSchemaCompilerPass.php diff --git a/pkg/enqueue-bundle/DoctrineSchema/DoctrineConnectionFactoryFactory.php b/pkg/enqueue-bundle/DoctrineSchema/DoctrineConnectionFactoryFactory.php new file mode 100644 index 000000000..43b2aeab4 --- /dev/null +++ b/pkg/enqueue-bundle/DoctrineSchema/DoctrineConnectionFactoryFactory.php @@ -0,0 +1,54 @@ +doctrine = $doctrine; + $this->parentFactory = $parentFactory; + } + + public function create($config): ConnectionFactory + { + if (is_string($config)) { + $config = ['dsn' => $config]; + } + + if (false == is_array($config)) { + throw new \InvalidArgumentException('The config must be either array or DSN string.'); + } + + if (false == array_key_exists('dsn', $config)) { + throw new \InvalidArgumentException('The config must have dsn key set.'); + } + + $dsn = Dsn::parseFirst($config['dsn']); + + if ($dsn->getScheme() === 'doctrine') { + $config = $dsn->getQuery(); + $config['connection_name'] = $dsn->getHost(); + + return new ManagerRegistryConnectionFactory($this->doctrine, $config); + } + + return $this->parentFactory->create($config); + } +} diff --git a/pkg/enqueue-bundle/DoctrineSchema/DoctrineDriverFactory.php b/pkg/enqueue-bundle/DoctrineSchema/DoctrineDriverFactory.php new file mode 100644 index 000000000..0fce50038 --- /dev/null +++ b/pkg/enqueue-bundle/DoctrineSchema/DoctrineDriverFactory.php @@ -0,0 +1,41 @@ +parentFactory = $parentFactory; + } + + public function create(ConnectionFactory $factory, Config $config, RouteCollection $collection): DriverInterface + { + $dsn = $config->getTransportOption('dsn'); + + if (empty($dsn)) { + throw new \LogicException('This driver factory relies on dsn option from transport config. The option is empty or not set.'); + } + + $dsn = Dsn::parseFirst($dsn); + + if ($dsn->getScheme() === 'doctrine') { + return new DbalDriver($factory->createContext(), $config, $collection); + } + + return $this->parentFactory->create($factory, $config, $collection); + } +} diff --git a/pkg/enqueue-bundle/DoctrineSchema/DoctrineSchemaCompilerPass.php b/pkg/enqueue-bundle/DoctrineSchema/DoctrineSchemaCompilerPass.php new file mode 100644 index 000000000..221d6392a --- /dev/null +++ b/pkg/enqueue-bundle/DoctrineSchema/DoctrineSchemaCompilerPass.php @@ -0,0 +1,39 @@ +hasDefinition('doctrine')) { + return; + } + + foreach ($container->getParameter('enqueue.transports') as $name) { + $diUtils = DiUtils::create(TransportFactory::MODULE, $name); + + $container->register($diUtils->format('connection_factory_factory.outer'), DoctrineConnectionFactoryFactory::class) + ->setDecoratedService($diUtils->format('connection_factory_factory'), $diUtils->format('connection_factory_factory.inner')) + ->addArgument(new Reference('doctrine')) + ->addArgument(new Reference($diUtils->format('connection_factory_factory.inner'))) + ; + } + + foreach ($container->getParameter('enqueue.clients') as $name) { + $diUtils = DiUtils::create(ClientFactory::MODULE, $name); + + $container->register($diUtils->format('driver_factory.outer'), DoctrineDriverFactory::class) + ->setDecoratedService($diUtils->format('driver_factory'), $diUtils->format('driver_factory.inner')) + ->addArgument(new Reference($diUtils->format('driver_factory.inner'))) + ; + } + } +} diff --git a/pkg/enqueue-bundle/EnqueueBundle.php b/pkg/enqueue-bundle/EnqueueBundle.php index 6db17e15d..042a76c0d 100644 --- a/pkg/enqueue-bundle/EnqueueBundle.php +++ b/pkg/enqueue-bundle/EnqueueBundle.php @@ -5,6 +5,7 @@ use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncEventDispatcherExtension; use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncEventsPass; use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncTransformersPass; +use Enqueue\Bundle\DoctrineSchema\DoctrineSchemaCompilerPass; use Enqueue\Symfony\Client\DependencyInjection\AnalyzeRouteCollectionPass; use Enqueue\Symfony\Client\DependencyInjection\BuildClientExtensionsPass; use Enqueue\Symfony\Client\DependencyInjection\BuildCommandSubscriberRoutesPass as BuildClientCommandSubscriberRoutesPass; @@ -39,5 +40,7 @@ public function build(ContainerBuilder $container): void $container->addCompilerPass(new AsyncEventsPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 100); $container->addCompilerPass(new AsyncTransformersPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 100); } + + $container->addCompilerPass(new DoctrineSchemaCompilerPass()); } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml index 978da5d18..eab956cc4 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml @@ -14,6 +14,14 @@ framework: router: { resource: '%kernel.root_dir%/config/routing.yml' } default_locale: '%locale%' +doctrine: + dbal: + connections: + custom: + url: "%env(DOCTRINE_DSN)%" + driver: pdo_mysql + charset: UTF8 + services: test_enqueue.client.default.driver: alias: 'enqueue.client.default.driver' diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 163527175..ee464080f 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -136,6 +136,13 @@ public function provideEnqueueConfigs() 'transport' => getenv('MONGO_DSN'), ], ]]; + + yield 'doctrine' => [[ + 'default' => [ + 'transport' => 'doctrine://custom', + ], + ]]; + // // yield 'gps' => [[ // 'transport' => [ From 828127672a8a1a57723f83369adc9f5f8e2b6967 Mon Sep 17 00:00:00 2001 From: Evgeny Mazovetskiy Date: Mon, 21 Jan 2019 10:23:16 +0100 Subject: [PATCH 0530/1142] Exception on affected record !=1. additional exception; avoid using Type::BOOLEAN. --- pkg/dbal/DbalProducer.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index f1666de24..9ed2c66e3 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -115,7 +115,7 @@ public function send(Destination $destination, Message $message): void } try { - $this->context->getDbalConnection()->insert($this->context->getTableName(), $dbalMessage, [ + $rowsAffected = $this->context->getDbalConnection()->insert($this->context->getTableName(), $dbalMessage, [ 'id' => Type::GUID, 'published_at' => Type::INTEGER, 'body' => Type::TEXT, @@ -125,10 +125,14 @@ public function send(Destination $destination, Message $message): void 'queue' => Type::STRING, 'time_to_live' => Type::INTEGER, 'delayed_until' => Type::INTEGER, - 'redelivered' => Type::BOOLEAN, + 'redelivered' => Type::SMALLINT, 'delivery_id' => Type::STRING, 'redeliver_after' => Type::BIGINT, ]); + + if ($rowsAffected !== 1) { + throw new Exception('The message was not enqueued. Dbal did not confirm that record inserted.'); + } } catch (\Exception $e) { throw new Exception('The transport fails to send the message due to some internal error.', 0, $e); } From d09cf84f01b0d3c0eca9bb78ced5e4d688acd62a Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Mon, 21 Jan 2019 12:03:01 +0200 Subject: [PATCH 0531/1142] doctrine schema --- pkg/enqueue-bundle/EnqueueBundle.php | 2 +- .../Doctrine}/DoctrineConnectionFactoryFactory.php | 10 +++++----- .../Doctrine}/DoctrineDriverFactory.php | 10 +++++----- .../Doctrine}/DoctrineSchemaCompilerPass.php | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) rename pkg/{enqueue-bundle/DoctrineSchema => enqueue/Doctrine}/DoctrineConnectionFactoryFactory.php (85%) rename pkg/{enqueue-bundle/DoctrineSchema => enqueue/Doctrine}/DoctrineDriverFactory.php (77%) rename pkg/{enqueue-bundle/DoctrineSchema => enqueue/Doctrine}/DoctrineSchemaCompilerPass.php (97%) diff --git a/pkg/enqueue-bundle/EnqueueBundle.php b/pkg/enqueue-bundle/EnqueueBundle.php index 042a76c0d..195013578 100644 --- a/pkg/enqueue-bundle/EnqueueBundle.php +++ b/pkg/enqueue-bundle/EnqueueBundle.php @@ -5,7 +5,7 @@ use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncEventDispatcherExtension; use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncEventsPass; use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncTransformersPass; -use Enqueue\Bundle\DoctrineSchema\DoctrineSchemaCompilerPass; +use Enqueue\Doctrine\DoctrineSchemaCompilerPass; use Enqueue\Symfony\Client\DependencyInjection\AnalyzeRouteCollectionPass; use Enqueue\Symfony\Client\DependencyInjection\BuildClientExtensionsPass; use Enqueue\Symfony\Client\DependencyInjection\BuildCommandSubscriberRoutesPass as BuildClientCommandSubscriberRoutesPass; diff --git a/pkg/enqueue-bundle/DoctrineSchema/DoctrineConnectionFactoryFactory.php b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php similarity index 85% rename from pkg/enqueue-bundle/DoctrineSchema/DoctrineConnectionFactoryFactory.php rename to pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php index 43b2aeab4..14f39f9da 100644 --- a/pkg/enqueue-bundle/DoctrineSchema/DoctrineConnectionFactoryFactory.php +++ b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php @@ -1,6 +1,6 @@ doctrine = $doctrine; - $this->parentFactory = $parentFactory; + $this->fallbackFactory = $fallbackFactory; } public function create($config): ConnectionFactory @@ -49,6 +49,6 @@ public function create($config): ConnectionFactory return new ManagerRegistryConnectionFactory($this->doctrine, $config); } - return $this->parentFactory->create($config); + return $this->fallbackFactory->create($config); } } diff --git a/pkg/enqueue-bundle/DoctrineSchema/DoctrineDriverFactory.php b/pkg/enqueue/Doctrine/DoctrineDriverFactory.php similarity index 77% rename from pkg/enqueue-bundle/DoctrineSchema/DoctrineDriverFactory.php rename to pkg/enqueue/Doctrine/DoctrineDriverFactory.php index 0fce50038..a1c977cdc 100644 --- a/pkg/enqueue-bundle/DoctrineSchema/DoctrineDriverFactory.php +++ b/pkg/enqueue/Doctrine/DoctrineDriverFactory.php @@ -1,6 +1,6 @@ parentFactory = $parentFactory; + $this->fallbackFactory = $fallbackFactory; } public function create(ConnectionFactory $factory, Config $config, RouteCollection $collection): DriverInterface @@ -36,6 +36,6 @@ public function create(ConnectionFactory $factory, Config $config, RouteCollecti return new DbalDriver($factory->createContext(), $config, $collection); } - return $this->parentFactory->create($factory, $config, $collection); + return $this->fallbackFactory->create($factory, $config, $collection); } } diff --git a/pkg/enqueue-bundle/DoctrineSchema/DoctrineSchemaCompilerPass.php b/pkg/enqueue/Doctrine/DoctrineSchemaCompilerPass.php similarity index 97% rename from pkg/enqueue-bundle/DoctrineSchema/DoctrineSchemaCompilerPass.php rename to pkg/enqueue/Doctrine/DoctrineSchemaCompilerPass.php index 221d6392a..25016a761 100644 --- a/pkg/enqueue-bundle/DoctrineSchema/DoctrineSchemaCompilerPass.php +++ b/pkg/enqueue/Doctrine/DoctrineSchemaCompilerPass.php @@ -1,6 +1,6 @@ Date: Mon, 21 Jan 2019 12:15:40 +0200 Subject: [PATCH 0532/1142] doctrine schema --- pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php | 2 +- pkg/enqueue/Doctrine/DoctrineDriverFactory.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php index 14f39f9da..db8f0dd76 100644 --- a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php +++ b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php @@ -42,7 +42,7 @@ public function create($config): ConnectionFactory $dsn = Dsn::parseFirst($config['dsn']); - if ($dsn->getScheme() === 'doctrine') { + if ('doctrine' === $dsn->getScheme()) { $config = $dsn->getQuery(); $config['connection_name'] = $dsn->getHost(); diff --git a/pkg/enqueue/Doctrine/DoctrineDriverFactory.php b/pkg/enqueue/Doctrine/DoctrineDriverFactory.php index a1c977cdc..aab6489aa 100644 --- a/pkg/enqueue/Doctrine/DoctrineDriverFactory.php +++ b/pkg/enqueue/Doctrine/DoctrineDriverFactory.php @@ -32,7 +32,7 @@ public function create(ConnectionFactory $factory, Config $config, RouteCollecti $dsn = Dsn::parseFirst($dsn); - if ($dsn->getScheme() === 'doctrine') { + if ('doctrine' === $dsn->getScheme()) { return new DbalDriver($factory->createContext(), $config, $collection); } From 9801e4c17628b9ab0596f740f63632b3dc249733 Mon Sep 17 00:00:00 2001 From: Evgeny Mazovetskiy Date: Mon, 21 Jan 2019 11:23:55 +0100 Subject: [PATCH 0533/1142] style --- pkg/dbal/DbalProducer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index 9ed2c66e3..d550c9acc 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -130,8 +130,8 @@ public function send(Destination $destination, Message $message): void 'redeliver_after' => Type::BIGINT, ]); - if ($rowsAffected !== 1) { - throw new Exception('The message was not enqueued. Dbal did not confirm that record inserted.'); + if (1 !== $rowsAffected) { + throw new Exception('The message was not enqueued. Dbal did not confirm that the record is inserted.'); } } catch (\Exception $e) { throw new Exception('The transport fails to send the message due to some internal error.', 0, $e); From 7d9ecdbf58886b8d4f7e6fc3aaa34fc356134991 Mon Sep 17 00:00:00 2001 From: Evgeny Mazovetskiy Date: Mon, 21 Jan 2019 12:07:12 +0100 Subject: [PATCH 0534/1142] style fix --- pkg/dbal/DbalProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index d550c9acc..5435629eb 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -129,7 +129,7 @@ public function send(Destination $destination, Message $message): void 'delivery_id' => Type::STRING, 'redeliver_after' => Type::BIGINT, ]); - + if (1 !== $rowsAffected) { throw new Exception('The message was not enqueued. Dbal did not confirm that the record is inserted.'); } From 356b3ad5f9ceacdc187461f3c193bd497ce95730 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Mon, 21 Jan 2019 13:40:39 +0200 Subject: [PATCH 0535/1142] fix job status processor --- pkg/job-queue/JobProcessor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/job-queue/JobProcessor.php b/pkg/job-queue/JobProcessor.php index 77c03eefe..8f197f742 100644 --- a/pkg/job-queue/JobProcessor.php +++ b/pkg/job-queue/JobProcessor.php @@ -260,7 +260,7 @@ protected function saveJob(Job $job) */ protected function sendCalculateRootJobStatusEvent(Job $job) { - $this->producer->sendEvent(Commands::CALCULATE_ROOT_JOB_STATUS, [ + $this->producer->sendCommand(Commands::CALCULATE_ROOT_JOB_STATUS, [ 'jobId' => $job->getId(), ]); } From 345e162d24e4b65c725247f5acf973b2f1994924 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Mon, 21 Jan 2019 14:30:39 +0200 Subject: [PATCH 0536/1142] fix job status processor --- pkg/job-queue/Tests/JobProcessorTest.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/job-queue/Tests/JobProcessorTest.php b/pkg/job-queue/Tests/JobProcessorTest.php index 483e8ef2d..5ee8159a1 100644 --- a/pkg/job-queue/Tests/JobProcessorTest.php +++ b/pkg/job-queue/Tests/JobProcessorTest.php @@ -169,7 +169,7 @@ public function testCreateChildJobShouldCreateAndSaveJobAndPublishRecalculateRoo $producer = $this->createProducerMock(); $producer ->expects($this->once()) - ->method('sendEvent') + ->method('sendCommand') ->with(Commands::CALCULATE_ROOT_JOB_STATUS, ['jobId' => 12345]) ; @@ -246,7 +246,7 @@ public function testStartJobShouldUpdateJobWithRunningStatusAndStartAtTime() $producer = $this->createProducerMock(); $producer ->expects($this->once()) - ->method('sendEvent') + ->method('sendCommand') ; $processor = new JobProcessor($storage, $producer); @@ -316,7 +316,7 @@ public function testSuccessJobShouldUpdateJobWithSuccessStatusAndStopAtTime() $producer = $this->createProducerMock(); $producer ->expects($this->once()) - ->method('sendEvent') + ->method('sendCommand') ; $processor = new JobProcessor($storage, $producer); @@ -386,7 +386,7 @@ public function testFailJobShouldUpdateJobWithFailStatusAndStopAtTime() $producer = $this->createProducerMock(); $producer ->expects($this->once()) - ->method('sendEvent') + ->method('sendCommand') ; $processor = new JobProcessor($storage, $producer); @@ -456,7 +456,7 @@ public function testCancelJobShouldUpdateJobWithCancelStatusAndStoppedAtTimeAndS $producer = $this->createProducerMock(); $producer ->expects($this->once()) - ->method('sendEvent') + ->method('sendCommand') ; $processor = new JobProcessor($storage, $producer); From de668438f4821f76b313fd887619696dd48b586e Mon Sep 17 00:00:00 2001 From: Samuel NELA Date: Mon, 21 Jan 2019 14:01:06 +0100 Subject: [PATCH 0537/1142] Fixed param on EventTransformer --- pkg/async-event-dispatcher/EventTransformer.php | 2 +- .../Tests/Functional/App/TestAsyncEventTransformer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/async-event-dispatcher/EventTransformer.php b/pkg/async-event-dispatcher/EventTransformer.php index 6b6aa0f39..abb67566f 100644 --- a/pkg/async-event-dispatcher/EventTransformer.php +++ b/pkg/async-event-dispatcher/EventTransformer.php @@ -13,7 +13,7 @@ interface EventTransformer * * @return Message */ - public function toMessage($eventName, Event $event); + public function toMessage($eventName, Event $event = null); /** * If you able to transform message back to event return it. diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php index 63d6df75a..4293ab85e 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php @@ -24,7 +24,7 @@ public function __construct(Context $context) $this->context = $context; } - public function toMessage($eventName, Event $event) + public function toMessage($eventName, Event $event = null) { if (Event::class === get_class($event)) { return $this->context->createMessage(json_encode('')); From 9f15659fac341a248464ac3c6f4b44d64048268d Mon Sep 17 00:00:00 2001 From: Niels Nijens Date: Tue, 22 Jan 2019 14:05:29 +0100 Subject: [PATCH 0538/1142] Add test for Redis::zadd call within RedisProducer::send --- pkg/redis/Tests/RedisProducerTest.php | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/pkg/redis/Tests/RedisProducerTest.php b/pkg/redis/Tests/RedisProducerTest.php index 12082734c..daef46b61 100644 --- a/pkg/redis/Tests/RedisProducerTest.php +++ b/pkg/redis/Tests/RedisProducerTest.php @@ -88,6 +88,45 @@ public function testShouldCallLPushOnSend() $producer->send($destination, new RedisMessage()); } + /** + * Tests if Redis::zadd is called with the expected 'score' (used as delivery timestamp). + * + * @depends testShouldCallLPushOnSend + */ + public function testShouldCallZaddOnSendWithDeliveryDelay() + { + $destination = new RedisDestination('aDestination'); + + $redisMock = $this->createRedisMock(); + $redisMock + ->expects($this->once()) + ->method('zadd') + ->with( + 'aDestination:delayed', + $this->isJson(), + $this->equalTo(time() + 5) + ) + ; + + $context = $this->createContextMock(); + $context + ->expects($this->once()) + ->method('getRedis') + ->willReturn($redisMock) + ; + $context + ->expects($this->once()) + ->method('getSerializer') + ->willReturn(new JsonSerializer()) + ; + + $message = new RedisMessage(); + $message->setDeliveryDelay(5000); // 5 seconds in milliseconds + + $producer = new RedisProducer($context); + $producer->send($destination, $message); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject|RedisContext */ From 01e35cdd835a6913ebc1b99fd16084cef347e522 Mon Sep 17 00:00:00 2001 From: Niels Nijens Date: Tue, 22 Jan 2019 14:07:42 +0100 Subject: [PATCH 0539/1142] Fix $deliveryAt in RedisProducer::send by converting deliveryDelay milliseconds to seconds --- pkg/redis/RedisProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/redis/RedisProducer.php b/pkg/redis/RedisProducer.php index 3721ed20a..cc7d63230 100644 --- a/pkg/redis/RedisProducer.php +++ b/pkg/redis/RedisProducer.php @@ -64,7 +64,7 @@ public function send(Destination $destination, Message $message): void $payload = $this->context->getSerializer()->toString($message); if ($message->getDeliveryDelay()) { - $deliveryAt = time() + $message->getDeliveryDelay(); + $deliveryAt = time() + $message->getDeliveryDelay() / 1000; $this->context->getRedis()->zadd($destination->getName().':delayed', $payload, $deliveryAt); } else { $this->context->getRedis()->lpush($destination->getName(), $payload); From f3ef75a6d8019a7b50044e61b44848d8008d9347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Babi=C4=87?= Date: Wed, 30 Jan 2019 17:38:26 +0100 Subject: [PATCH 0540/1142] Install stable dependencies --- pkg/job-queue/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 0dab189f1..4581d6cee 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "enqueue/enqueue": "^0.9", - "enqueue/null": "0.9.x-dev", + "enqueue/null": "^0.9", "queue-interop/queue-interop": "^0.7|^0.8", "doctrine/orm": "~2.4" }, From 90a4d8fd84f91e9b6555947b389c516afadf0857 Mon Sep 17 00:00:00 2001 From: GCalmels Date: Fri, 1 Feb 2019 09:06:16 +0100 Subject: [PATCH 0541/1142] Add default to php_serializer_event_transformer --- .../DependencyInjection/AsyncTransformersPass.php | 14 ++++++++++++-- .../Resources/config/services.yml | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php index 0adcfcb45..dfd457ef0 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php @@ -18,6 +18,7 @@ public function process(ContainerBuilder $container) $transformerIdsMap = []; $eventNamesMap = []; + $defaultTransformer = null; foreach ($container->findTaggedServiceIds('enqueue.event_transformer') as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { if (false == isset($tagAttribute['eventName'])) { @@ -28,11 +29,20 @@ public function process(ContainerBuilder $container) $transformerName = isset($tagAttribute['transformerName']) ? $tagAttribute['transformerName'] : $serviceId; - $eventNamesMap[$eventName] = $transformerName; - $transformerIdsMap[$transformerName] = $serviceId; + if (isset($tagAttribute['default']) && $tagAttribute['default']) { + $defaultTransformer = ['id' => $serviceId, 'transformerName' => $transformerName]; + } else { + $eventNamesMap[] = $transformerName; + $transformerIdsMap[] = $serviceId; + } } } + if ($defaultTransformer) { + $eventNamesMap[] = $defaultTransformer['transformerName']; + $transformerIdsMap[] = $defaultTransformer['id']; + } + $container->getDefinition('enqueue.events.registry') ->replaceArgument(0, $eventNamesMap) ->replaceArgument(1, $transformerIdsMap) diff --git a/pkg/async-event-dispatcher/Resources/config/services.yml b/pkg/async-event-dispatcher/Resources/config/services.yml index 2cef52714..2b3fbc0b0 100644 --- a/pkg/async-event-dispatcher/Resources/config/services.yml +++ b/pkg/async-event-dispatcher/Resources/config/services.yml @@ -25,10 +25,10 @@ services: - '@event_dispatcher' - '@enqueue.events.async_listener' - enqueue.events.php_serializer_event_transofrmer: + enqueue.events.php_serializer_event_transformer: class: 'Enqueue\AsyncEventDispatcher\PhpSerializerEventTransformer' public: public arguments: - '@enqueue.events.context' tags: - - {name: 'enqueue.event_transformer', eventName: '/.*/', transformerName: 'php_serializer' } + - {name: 'enqueue.event_transformer', eventName: '/.*/', transformerName: 'php_serializer', default: true } From d70ae70ad120d6fa65da454c77493cebb9abc36f Mon Sep 17 00:00:00 2001 From: GCalmels Date: Fri, 1 Feb 2019 10:04:23 +0100 Subject: [PATCH 0542/1142] Fix error with eventName in AsyncTransformersPass.php --- .../DependencyInjection/AsyncTransformersPass.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php index dfd457ef0..d93b5976a 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php @@ -30,17 +30,21 @@ public function process(ContainerBuilder $container) $transformerName = isset($tagAttribute['transformerName']) ? $tagAttribute['transformerName'] : $serviceId; if (isset($tagAttribute['default']) && $tagAttribute['default']) { - $defaultTransformer = ['id' => $serviceId, 'transformerName' => $transformerName]; + $defaultTransformer = [ + 'id' => $serviceId, + 'transformerName' => $transformerName, + 'eventName' => $eventName + ]; } else { - $eventNamesMap[] = $transformerName; - $transformerIdsMap[] = $serviceId; + $eventNamesMap[$eventName] = $transformerName; + $transformerIdsMap[$transformerName] = $serviceId; } } } if ($defaultTransformer) { - $eventNamesMap[] = $defaultTransformer['transformerName']; - $transformerIdsMap[] = $defaultTransformer['id']; + $eventNamesMap[$defaultTransformer['eventName']] = $defaultTransformer['transformerName']; + $transformerIdsMap[$defaultTransformer['transformerName']] = $defaultTransformer['id']; } $container->getDefinition('enqueue.events.registry') From 937e3ddb0f8f6de4db7253e4ab48bcfeff235fca Mon Sep 17 00:00:00 2001 From: GCalmels Date: Fri, 1 Feb 2019 10:51:39 +0100 Subject: [PATCH 0543/1142] Add comma to array last element to fix php fixer --- .../DependencyInjection/AsyncTransformersPass.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php index d93b5976a..afe10217d 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php @@ -33,7 +33,7 @@ public function process(ContainerBuilder $container) $defaultTransformer = [ 'id' => $serviceId, 'transformerName' => $transformerName, - 'eventName' => $eventName + 'eventName' => $eventName, ]; } else { $eventNamesMap[$eventName] = $transformerName; From 90c83ff6bcd9c5ab73e503a2b0fb8bcb05eb57fb Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 1 Feb 2019 13:26:26 +0200 Subject: [PATCH 0544/1142] Release 0.9.7 --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81aa3b4ca..8f08f1443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Change Log +## [0.9.7](https://github.com/php-enqueue/enqueue-dev/tree/0.9.7) (2019-02-01) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.6...0.9.7) + +**Merged pull requests:** + +- Avoid OutOfMemoryException [\#725](https://github.com/php-enqueue/enqueue-dev/pull/725) ([DamienHarper](https://github.com/DamienHarper)) +- \[async-event-dispatcher\] Add default to php\_serializer\_event\_transformer [\#748](https://github.com/php-enqueue/enqueue-dev/pull/748) ([GCalmels](https://github.com/GCalmels)) +- \[async-event-dispatcher\] Fixed param on EventTransformer [\#736](https://github.com/php-enqueue/enqueue-dev/pull/736) ([samnela](https://github.com/samnela)) +- \[job-queue\] Install stable dependencies [\#745](https://github.com/php-enqueue/enqueue-dev/pull/745) ([mbabic131](https://github.com/mbabic131)) +- \[job-queue\] Fix job status processor [\#735](https://github.com/php-enqueue/enqueue-dev/pull/735) ([ASKozienko](https://github.com/ASKozienko)) +- \[redis\] Fix messages sent with incorrect delivery delay [\#738](https://github.com/php-enqueue/enqueue-dev/pull/738) ([niels-nijens](https://github.com/niels-nijens)) +- \[dbal\] Exception on affected record !=1 [\#733](https://github.com/php-enqueue/enqueue-dev/pull/733) ([otzy](https://github.com/otzy)) +- \[bundle\]\[dbal\] Use doctrine bundle configured connections [\#732](https://github.com/php-enqueue/enqueue-dev/pull/732) ([ASKozienko](https://github.com/ASKozienko)) +- \[pheanstalk\] Add unit tests for PheanstalkConsumer [\#726](https://github.com/php-enqueue/enqueue-dev/pull/726) ([alanpoulain](https://github.com/alanpoulain)) +- \[pheanstalk\] Requeuing a message should not acknowledge it beforehand [\#722](https://github.com/php-enqueue/enqueue-dev/pull/722) ([alanpoulain](https://github.com/alanpoulain)) +- \[sqs\] Dead Letter Queue Adoption [\#720](https://github.com/php-enqueue/enqueue-dev/pull/720) ([cshum](https://github.com/cshum)) + ## [0.9.6](https://github.com/php-enqueue/enqueue-dev/tree/0.9.6) (2019-01-09) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.5...0.9.6) From cd4bd47eac0b2f40ffa8c283fa049b217412f1a2 Mon Sep 17 00:00:00 2001 From: Florent Blaison Date: Fri, 1 Feb 2019 17:48:29 +0100 Subject: [PATCH 0545/1142] Update SqsConnectionFactory.php Fix break phpstan coverage --- pkg/sqs/SqsConnectionFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sqs/SqsConnectionFactory.php b/pkg/sqs/SqsConnectionFactory.php index 4a99c752e..1a8a967c7 100644 --- a/pkg/sqs/SqsConnectionFactory.php +++ b/pkg/sqs/SqsConnectionFactory.php @@ -40,7 +40,7 @@ class SqsConnectionFactory implements ConnectionFactory * sqs: * sqs::?key=aKey&secret=aSecret&token=aToken * - * @param array|string|SqsClient|null $config + * @param array|string|AwsSqsClient|null $config */ public function __construct($config = 'sqs:') { From 665a5a589025e7194580cd1bccc1fdebd2761371 Mon Sep 17 00:00:00 2001 From: Aaron Bonner Date: Fri, 1 Feb 2019 21:39:55 +0000 Subject: [PATCH 0546/1142] Fix typo --- pkg/simple-client/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/simple-client/README.md b/pkg/simple-client/README.md index d7054f1be..ddc024f0f 100644 --- a/pkg/simple-client/README.md +++ b/pkg/simple-client/README.md @@ -14,7 +14,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Total Downloads](https://poser.pugx.org/enqueue/simple-client/d/total.png)](https://packagist.org/packages/enqueue/simple-client) [![Latest Stable Version](https://poser.pugx.org/enqueue/simple-client/version.png)](https://packagist.org/packages/enqueue/simple-client) -The simple client takes Enqueue client classes and Symfony components and combines it to easy to use facade called `SimpleCLient`. +The simple client takes Enqueue client classes and Symfony components and combines it to easy to use facade called `SimpleClient`. ## Resources From 7ec9ca779856e33820e65ee56e6300314b7d9daa Mon Sep 17 00:00:00 2001 From: Aaron Bonner Date: Fri, 1 Feb 2019 21:40:26 +0000 Subject: [PATCH 0547/1142] Ensure logger assigned before initialising objects If the logger isn't assigned in the SimpleClient's constructor before the object graph is initialised, dependencies will get a NullLogger rather than the LoggerInterface passed in. --- pkg/simple-client/SimpleClient.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/simple-client/SimpleClient.php b/pkg/simple-client/SimpleClient.php index 52329a6c7..9158364b9 100644 --- a/pkg/simple-client/SimpleClient.php +++ b/pkg/simple-client/SimpleClient.php @@ -126,9 +126,9 @@ public function __construct($config, LoggerInterface $logger = null) ]; } - $this->build(['enqueue' => $config]); - $this->logger = $logger ?: new NullLogger(); + + $this->build(['enqueue' => $config]); } /** From 5d03bfe4a29d59079d1c36a02c31d60f4a2cc6de Mon Sep 17 00:00:00 2001 From: Derek Chan Date: Mon, 4 Feb 2019 16:04:39 +0800 Subject: [PATCH 0548/1142] supporting amqp-lib's channel_rpc_timeout option --- pkg/amqp-lib/AmqpConnectionFactory.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pkg/amqp-lib/AmqpConnectionFactory.php b/pkg/amqp-lib/AmqpConnectionFactory.php index 169671d12..3cb1c29b7 100644 --- a/pkg/amqp-lib/AmqpConnectionFactory.php +++ b/pkg/amqp-lib/AmqpConnectionFactory.php @@ -47,6 +47,7 @@ public function __construct($config = 'amqp:') ->addDefaultOption('login_response', null) ->addDefaultOption('locale', 'en_US') ->addDefaultOption('keepalive', false) + ->addDefaultOption('channel_rpc_timeout', 0.) ->addDefaultOption('heartbeat_on_tick', true) ->parse() ; @@ -120,7 +121,8 @@ private function establishConnection(): AbstractConnection (int) round(min($this->config->getReadTimeout(), $this->config->getWriteTimeout())), null, $this->config->getOption('keepalive'), - (int) round($this->config->getHeartbeat()) + (int) round($this->config->getHeartbeat()), + $this->config->getOption('channel_rpc_timeout') ); } else { $con = new AMQPStreamConnection( @@ -137,7 +139,8 @@ private function establishConnection(): AbstractConnection (int) round(min($this->config->getReadTimeout(), $this->config->getWriteTimeout())), null, $this->config->getOption('keepalive'), - (int) round($this->config->getHeartbeat()) + (int) round($this->config->getHeartbeat()), + $this->config->getOption('channel_rpc_timeout') ); } } else { @@ -159,7 +162,8 @@ private function establishConnection(): AbstractConnection (int) round($this->config->getReadTimeout()), $this->config->getOption('keepalive'), (int) round($this->config->getWriteTimeout()), - (int) round($this->config->getHeartbeat()) + (int) round($this->config->getHeartbeat()), + $this->config->getOption('channel_rpc_timeout') ); } else { $con = new AMQPSocketConnection( @@ -175,7 +179,8 @@ private function establishConnection(): AbstractConnection (int) round($this->config->getReadTimeout()), $this->config->getOption('keepalive'), (int) round($this->config->getWriteTimeout()), - (int) round($this->config->getHeartbeat()) + (int) round($this->config->getHeartbeat()), + $this->config->getOption('channel_rpc_timeout') ); } } From 565f0f74962aa62b5cc7c066da6b566dae63fecc Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Thu, 7 Feb 2019 14:01:18 +0200 Subject: [PATCH 0549/1142] Update extensions.md --- docs/consumption/extensions.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/consumption/extensions.md b/docs/consumption/extensions.md index aa09b5701..ff59d09b6 100644 --- a/docs/consumption/extensions.md +++ b/docs/consumption/extensions.md @@ -59,4 +59,8 @@ The extension catch process signals and gracefully stops consumption. Works only The extension checks whether the received message is redelivered (There was attempt to process message but it failed). If so the extension reject the origin message and creates a copy message with a delay. +## [ConsumerMonitoringExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/monitoring.md#consumption-extension) + +There is an extension ConsumerMonitoringExtension for Enqueue QueueConsumer. It could collect consumed messages and consumer stats for you and send them to Grafana, InfluxDB or Datadog. + [back to index](../index.md) From 69e7755a24a842e5adca80cd19bd56f49783866b Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Wed, 13 Feb 2019 18:20:17 +0200 Subject: [PATCH 0550/1142] add exit status flow --- pkg/enqueue/Consumption/Context/End.php | 20 +++++++++++++++++-- .../Consumption/Context/PostConsume.php | 13 +++++++++++- .../Context/PostMessageReceived.php | 13 +++++++++++- .../Consumption/Context/PreConsume.php | 13 +++++++++++- pkg/enqueue/Consumption/Context/Start.php | 13 +++++++++++- pkg/enqueue/Consumption/QueueConsumer.php | 11 +++++----- 6 files changed, 72 insertions(+), 11 deletions(-) diff --git a/pkg/enqueue/Consumption/Context/End.php b/pkg/enqueue/Consumption/Context/End.php index 467f6d38c..ec8c1f7df 100644 --- a/pkg/enqueue/Consumption/Context/End.php +++ b/pkg/enqueue/Consumption/Context/End.php @@ -27,12 +27,23 @@ final class End */ private $logger; - public function __construct(Context $context, int $startTime, int $endTime, LoggerInterface $logger) - { + /** + * @var int + */ + private $exitStatus; + + public function __construct( + Context $context, + int $startTime, + int $endTime, + LoggerInterface $logger, + ?int $exitStatus = null + ) { $this->context = $context; $this->logger = $logger; $this->startTime = $startTime; $this->endTime = $endTime; + $this->exitStatus = $exitStatus; } public function getContext(): Context @@ -60,4 +71,9 @@ public function getEndTime(): int { return $this->startTime; } + + public function getExitStatus(): ?int + { + return $this->exitStatus; + } } diff --git a/pkg/enqueue/Consumption/Context/PostConsume.php b/pkg/enqueue/Consumption/Context/PostConsume.php index 0add00336..a6f1d8375 100644 --- a/pkg/enqueue/Consumption/Context/PostConsume.php +++ b/pkg/enqueue/Consumption/Context/PostConsume.php @@ -43,6 +43,11 @@ final class PostConsume */ private $executionInterrupted; + /** + * @var int + */ + private $exitStatus; + public function __construct(Context $context, SubscriptionConsumer $subscriptionConsumer, int $receivedMessagesCount, int $cycle, int $startTime, LoggerInterface $logger) { $this->context = $context; @@ -85,13 +90,19 @@ public function getLogger(): LoggerInterface return $this->logger; } + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + public function isExecutionInterrupted(): bool { return $this->executionInterrupted; } - public function interruptExecution(): void + public function interruptExecution(?int $exitStatus = null): void { + $this->exitStatus = $exitStatus; $this->executionInterrupted = true; } } diff --git a/pkg/enqueue/Consumption/Context/PostMessageReceived.php b/pkg/enqueue/Consumption/Context/PostMessageReceived.php index 423830e3d..1e312da10 100644 --- a/pkg/enqueue/Consumption/Context/PostMessageReceived.php +++ b/pkg/enqueue/Consumption/Context/PostMessageReceived.php @@ -45,6 +45,11 @@ final class PostMessageReceived */ private $executionInterrupted; + /** + * @var int + */ + private $exitStatus; + public function __construct( Context $context, Consumer $consumer, @@ -96,13 +101,19 @@ public function getResult() return $this->result; } + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + public function isExecutionInterrupted(): bool { return $this->executionInterrupted; } - public function interruptExecution(): void + public function interruptExecution(?int $exitStatus = null): void { + $this->exitStatus = $exitStatus; $this->executionInterrupted = true; } } diff --git a/pkg/enqueue/Consumption/Context/PreConsume.php b/pkg/enqueue/Consumption/Context/PreConsume.php index a6d83d534..77cc7d030 100644 --- a/pkg/enqueue/Consumption/Context/PreConsume.php +++ b/pkg/enqueue/Consumption/Context/PreConsume.php @@ -43,6 +43,11 @@ final class PreConsume */ private $executionInterrupted; + /** + * @var int + */ + private $exitStatus; + public function __construct(Context $context, SubscriptionConsumer $subscriptionConsumer, LoggerInterface $logger, int $cycle, int $receiveTimeout, int $startTime) { $this->context = $context; @@ -85,13 +90,19 @@ public function getStartTime(): int return $this->startTime; } + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + public function isExecutionInterrupted(): bool { return $this->executionInterrupted; } - public function interruptExecution(): void + public function interruptExecution(?int $exitStatus = null): void { + $this->exitStatus = $exitStatus; $this->executionInterrupted = true; } } diff --git a/pkg/enqueue/Consumption/Context/Start.php b/pkg/enqueue/Consumption/Context/Start.php index cd9f2108e..84db29c44 100644 --- a/pkg/enqueue/Consumption/Context/Start.php +++ b/pkg/enqueue/Consumption/Context/Start.php @@ -38,6 +38,11 @@ final class Start */ private $executionInterrupted; + /** + * @var int + */ + private $exitStatus; + /** * @param BoundProcessor[] $processors */ @@ -105,13 +110,19 @@ public function changeBoundProcessors(array $processors): void }); } + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + public function isExecutionInterrupted(): bool { return $this->executionInterrupted; } - public function interruptExecution(): void + public function interruptExecution(?int $exitStatus = null): void { + $this->exitStatus = $exitStatus; $this->executionInterrupted = true; } } diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 3454b302d..58b8fa06c 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -147,7 +147,7 @@ public function consume(ExtensionInterface $runtimeExtension = null): void $extension->onStart($start); if ($start->isExecutionInterrupted()) { - $this->onEnd($extension, $startTime); + $this->onEnd($extension, $startTime, $start->getExitStatus()); return; } @@ -256,7 +256,7 @@ public function consume(ExtensionInterface $runtimeExtension = null): void $extension->onPreConsume($preConsume); if ($preConsume->isExecutionInterrupted()) { - $this->onEnd($extension, $startTime, $subscriptionConsumer); + $this->onEnd($extension, $startTime, $preConsume->getExitStatus(), $subscriptionConsumer); return; } @@ -267,7 +267,7 @@ public function consume(ExtensionInterface $runtimeExtension = null): void $extension->onPostConsume($postConsume); if ($interruptExecution || $postConsume->isExecutionInterrupted()) { - $this->onEnd($extension, $startTime, $subscriptionConsumer); + $this->onEnd($extension, $startTime, $postConsume->getExitStatus(), $subscriptionConsumer); return; } @@ -286,11 +286,12 @@ public function setFallbackSubscriptionConsumer(SubscriptionConsumer $fallbackSu $this->fallbackSubscriptionConsumer = $fallbackSubscriptionConsumer; } - private function onEnd(ExtensionInterface $extension, int $startTime, SubscriptionConsumer $subscriptionConsumer = null): void + private function onEnd(ExtensionInterface $extension, int $startTime, ?int $exitStatus = null, SubscriptionConsumer $subscriptionConsumer = null): void { $endTime = (int) (microtime(true) * 1000); - $extension->onEnd(new End($this->interopContext, $startTime, $endTime, $this->logger)); + $endContext = new End($this->interopContext, $startTime, $endTime, $this->logger, $exitStatus); + $extension->onEnd($endContext); if ($subscriptionConsumer) { $subscriptionConsumer->unsubscribeAll(); From d1960a2fe47161611d74f0a00fc447051a5cf7a5 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Wed, 13 Feb 2019 19:11:00 +0200 Subject: [PATCH 0551/1142] capture exit status extension --- .../Extension/CaptureExitStatusExtension.php | 35 +++++++++++++++++++ .../Symfony/Consumption/ConsumeCommand.php | 6 +++- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php diff --git a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php new file mode 100644 index 000000000..49d8981bb --- /dev/null +++ b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php @@ -0,0 +1,35 @@ +exitStatus = $context->getExitStatus(); + $this->isExitStatusCaptured = true; + } + + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + + public function isExitStatusCaptured(): bool + { + return $this->isExitStatusCaptured; + } +} diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index e65acc314..22187a15d 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -3,6 +3,7 @@ namespace Enqueue\Symfony\Consumption; use Enqueue\Consumption\ChainExtension; +use Enqueue\Consumption\Extension\CaptureExitStatusExtension; use Enqueue\Consumption\QueueConsumerInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; @@ -75,9 +76,12 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int array_unshift($extensions, $loggerExtension); } + $captureExitStatusExtension = new CaptureExitStatusExtension(); + array_unshift($extensions, $captureExitStatusExtension); + $consumer->consume(new ChainExtension($extensions)); - return null; + return $captureExitStatusExtension->getExitStatus(); } private function getQueueConsumer(string $name): QueueConsumerInterface From 7794f6db013ef793fd7367f367609b4c0adb2db5 Mon Sep 17 00:00:00 2001 From: Lars Greiss Date: Thu, 14 Feb 2019 03:49:32 +0100 Subject: [PATCH 0552/1142] [fs] polling_interval config should be milliseconds not microseconds regression from this commit https://github.com/php-enqueue/fs/commit/c5199ca5bac5c661aed86d6b2f751630af42378d config should be milliseconds like in docs stated.....$this->pollingInterval is holding milliseconds which is correct. But usleep is using microseconds. To fix it just convert milliseconds to microseconds --- pkg/fs/FsConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/fs/FsConsumer.php b/pkg/fs/FsConsumer.php index 65ff12e61..46e7b96ba 100644 --- a/pkg/fs/FsConsumer.php +++ b/pkg/fs/FsConsumer.php @@ -90,7 +90,7 @@ public function receive(int $timeout = 0): ?Message return null; } - usleep($this->pollingInterval); + usleep($this->pollingInterval * 1000); if ($timeout && (microtime(true) - $startAt) >= $timeout) { return null; From b8c5901e8c17cc45b0db13d2aaf2ceefeb5fe0c3 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Thu, 14 Feb 2019 11:24:18 +0200 Subject: [PATCH 0553/1142] test capture exit status --- .../Extension/CaptureExitStatusExtension.php | 40 ++++++++++++++++++- .../Tests/Consumption/QueueConsumerTest.php | 25 ++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php index 49d8981bb..f4d967ee6 100644 --- a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php +++ b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php @@ -3,9 +3,9 @@ namespace Enqueue\Consumption\Extension; use Enqueue\Consumption\Context\End; -use Enqueue\Consumption\EndExtensionInterface; +use Enqueue\Consumption\ExtensionInterface; -class CaptureExitStatusExtension implements EndExtensionInterface +class CaptureExitStatusExtension implements ExtensionInterface { /** * @var int @@ -32,4 +32,40 @@ public function isExitStatusCaptured(): bool { return $this->isExitStatusCaptured; } + + public function onInitLogger(\Enqueue\Consumption\Context\InitLogger $context): void + { + } + + public function onMessageReceived(\Enqueue\Consumption\Context\MessageReceived $context): void + { + } + + public function onPostConsume(\Enqueue\Consumption\Context\PostConsume $context): void + { + } + + public function onPostMessageReceived(\Enqueue\Consumption\Context\PostMessageReceived $context): void + { + } + + public function onPreConsume(\Enqueue\Consumption\Context\PreConsume $context): void + { + } + + public function onPreSubscribe(\Enqueue\Consumption\Context\PreSubscribe $context): void + { + } + + public function onProcessorException(\Enqueue\Consumption\Context\ProcessorException $context): void + { + } + + public function onResult(\Enqueue\Consumption\Context\MessageResult $context): void + { + } + + public function onStart(\Enqueue\Consumption\Context\Start $context): void + { + } } diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 9b0111fda..94361b522 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -16,6 +16,7 @@ use Enqueue\Consumption\Context\ProcessorException; use Enqueue\Consumption\Context\Start; use Enqueue\Consumption\Exception\InvalidArgumentException; +use Enqueue\Consumption\Extension\CaptureExitStatusExtension; use Enqueue\Consumption\ExtensionInterface; use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\Result; @@ -1429,6 +1430,30 @@ public function testShouldCallProcessorAsMessageComeAlong() $this->assertSame($fooConsumerStub, $actualContexts[2]->getConsumer()); } + public function testCaptureExitStatus() + { + $testExitCode = 5; + + $stubExtension = $this->createExtension(); + + $stubExtension + ->expects($this->once()) + ->method('onStart') + ->with($this->isInstanceOf(Start::class)) + ->willReturnCallback(function (Start $context) use ($testExitCode) { + $context->interruptExecution($testExitCode); + }) + ; + + $exitExtension = new CaptureExitStatusExtension(); + + $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); + $consumer->consume($exitExtension); + + $this->assertEquals($testExitCode, $exitExtension->getExitStatus()); + $this->assertTrue($exitExtension->isExitStatusCaptured()); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject */ From 954450a2f28961caf71c6ca59815660f1c558596 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Thu, 14 Feb 2019 11:38:51 +0200 Subject: [PATCH 0554/1142] revert to end extension --- .../Extension/CaptureExitStatusExtension.php | 40 +------------------ .../Tests/Consumption/QueueConsumerTest.php | 2 +- 2 files changed, 3 insertions(+), 39 deletions(-) diff --git a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php index f4d967ee6..49d8981bb 100644 --- a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php +++ b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php @@ -3,9 +3,9 @@ namespace Enqueue\Consumption\Extension; use Enqueue\Consumption\Context\End; -use Enqueue\Consumption\ExtensionInterface; +use Enqueue\Consumption\EndExtensionInterface; -class CaptureExitStatusExtension implements ExtensionInterface +class CaptureExitStatusExtension implements EndExtensionInterface { /** * @var int @@ -32,40 +32,4 @@ public function isExitStatusCaptured(): bool { return $this->isExitStatusCaptured; } - - public function onInitLogger(\Enqueue\Consumption\Context\InitLogger $context): void - { - } - - public function onMessageReceived(\Enqueue\Consumption\Context\MessageReceived $context): void - { - } - - public function onPostConsume(\Enqueue\Consumption\Context\PostConsume $context): void - { - } - - public function onPostMessageReceived(\Enqueue\Consumption\Context\PostMessageReceived $context): void - { - } - - public function onPreConsume(\Enqueue\Consumption\Context\PreConsume $context): void - { - } - - public function onPreSubscribe(\Enqueue\Consumption\Context\PreSubscribe $context): void - { - } - - public function onProcessorException(\Enqueue\Consumption\Context\ProcessorException $context): void - { - } - - public function onResult(\Enqueue\Consumption\Context\MessageResult $context): void - { - } - - public function onStart(\Enqueue\Consumption\Context\Start $context): void - { - } } diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 94361b522..5e4564496 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -1448,7 +1448,7 @@ public function testCaptureExitStatus() $exitExtension = new CaptureExitStatusExtension(); $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); - $consumer->consume($exitExtension); + $consumer->consume(new ChainExtension([$exitExtension])); $this->assertEquals($testExitCode, $exitExtension->getExitStatus()); $this->assertTrue($exitExtension->isExitStatusCaptured()); From 342127cae2e2c3949c5ef0b8095cb28d9e230735 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Thu, 14 Feb 2019 14:40:44 +0200 Subject: [PATCH 0555/1142] refactoring and consume command tests --- ...sExtension.php => ExitStatusExtension.php} | 13 +- pkg/enqueue/Symfony/Client/ConsumeCommand.php | 8 +- .../Symfony/Consumption/ConsumeCommand.php | 8 +- .../Tests/Consumption/QueueConsumerTest.php | 5 +- .../Symfony/Client/ConsumeCommandTest.php | 118 ++++++++++++++++++ .../Consumption/ConsumeCommandTest.php | 104 +++++++++++++++ 6 files changed, 235 insertions(+), 21 deletions(-) rename pkg/enqueue/Consumption/Extension/{CaptureExitStatusExtension.php => ExitStatusExtension.php} (57%) diff --git a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php b/pkg/enqueue/Consumption/Extension/ExitStatusExtension.php similarity index 57% rename from pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php rename to pkg/enqueue/Consumption/Extension/ExitStatusExtension.php index 49d8981bb..a43071241 100644 --- a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php +++ b/pkg/enqueue/Consumption/Extension/ExitStatusExtension.php @@ -5,31 +5,20 @@ use Enqueue\Consumption\Context\End; use Enqueue\Consumption\EndExtensionInterface; -class CaptureExitStatusExtension implements EndExtensionInterface +class ExitStatusExtension implements EndExtensionInterface { /** * @var int */ private $exitStatus; - /** - * @var bool - */ - private $isExitStatusCaptured = false; - public function onEnd(End $context): void { $this->exitStatus = $context->getExitStatus(); - $this->isExitStatusCaptured = true; } public function getExitStatus(): ?int { return $this->exitStatus; } - - public function isExitStatusCaptured(): bool - { - return $this->isExitStatusCaptured; - } } diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index e6b25fc4f..ee8b394f6 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -4,6 +4,7 @@ use Enqueue\Client\DriverInterface; use Enqueue\Consumption\ChainExtension; +use Enqueue\Consumption\Extension\ExitStatusExtension; use Enqueue\Consumption\Extension\LoggerExtension; use Enqueue\Consumption\ExtensionInterface; use Enqueue\Consumption\QueueConsumerInterface; @@ -143,9 +144,12 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $consumer->bind($queue, $processor); } - $consumer->consume($this->getRuntimeExtensions($input, $output)); + $runtimeExtensionChain = $this->getRuntimeExtensions($input, $output); + $exitStatusExtension = new ExitStatusExtension(); - return null; + $consumer->consume(new ChainExtension([$runtimeExtensionChain, $exitStatusExtension])); + + return $exitStatusExtension->getExitStatus(); } protected function getRuntimeExtensions(InputInterface $input, OutputInterface $output): ExtensionInterface diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index 22187a15d..b10d19f68 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -3,7 +3,7 @@ namespace Enqueue\Symfony\Consumption; use Enqueue\Consumption\ChainExtension; -use Enqueue\Consumption\Extension\CaptureExitStatusExtension; +use Enqueue\Consumption\Extension\ExitStatusExtension; use Enqueue\Consumption\QueueConsumerInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; @@ -76,12 +76,12 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int array_unshift($extensions, $loggerExtension); } - $captureExitStatusExtension = new CaptureExitStatusExtension(); - array_unshift($extensions, $captureExitStatusExtension); + $exitStatusExtension = new ExitStatusExtension(); + array_unshift($extensions, $exitStatusExtension); $consumer->consume(new ChainExtension($extensions)); - return $captureExitStatusExtension->getExitStatus(); + return $exitStatusExtension->getExitStatus(); } private function getQueueConsumer(string $name): QueueConsumerInterface diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 5e4564496..f466c19cd 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -16,7 +16,7 @@ use Enqueue\Consumption\Context\ProcessorException; use Enqueue\Consumption\Context\Start; use Enqueue\Consumption\Exception\InvalidArgumentException; -use Enqueue\Consumption\Extension\CaptureExitStatusExtension; +use Enqueue\Consumption\Extension\ExitStatusExtension; use Enqueue\Consumption\ExtensionInterface; use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\Result; @@ -1445,13 +1445,12 @@ public function testCaptureExitStatus() }) ; - $exitExtension = new CaptureExitStatusExtension(); + $exitExtension = new ExitStatusExtension(); $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); $consumer->consume(new ChainExtension([$exitExtension])); $this->assertEquals($testExitCode, $exitExtension->getExitStatus()); - $this->assertTrue($exitExtension->isExitStatusCaptured()); } /** diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 9a45d424d..6f50844e6 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -8,11 +8,18 @@ use Enqueue\Client\Route; use Enqueue\Client\RouteCollection; use Enqueue\Consumption\ChainExtension; +use Enqueue\Consumption\Context\Start; +use Enqueue\Consumption\ExtensionInterface; +use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\QueueConsumerInterface; use Enqueue\Container\Container; use Enqueue\Null\NullQueue; use Enqueue\Symfony\Client\ConsumeCommand; use Enqueue\Test\ClassExtensionTrait; +use Interop\Queue\Consumer; +use Interop\Queue\Context as InteropContext; +use Interop\Queue\Exception\SubscriptionConsumerNotSupportedException; +use Interop\Queue\Queue; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use Symfony\Component\Console\Command\Command; @@ -536,6 +543,49 @@ public function testShouldSkipQueueConsumptionAndUseCustomClientDestinationName( ]); } + public function testShouldReturnExitStatusIfSet() + { + $testExitCode = 678; + + $stubExtension = $this->createExtension(); + + $stubExtension + ->expects($this->once()) + ->method('onStart') + ->with($this->isInstanceOf(Start::class)) + ->willReturnCallback(function (Start $context) use ($testExitCode) { + $context->interruptExecution($testExitCode); + }) + ; + + $defaultQueue = new NullQueue('default'); + + $routeCollection = new RouteCollection([]); + + $processor = $this->createDelegateProcessorMock(); + + $driver = $this->createDriverStub($routeCollection); + $driver + ->expects($this->exactly(1)) + ->method('createQueue') + ->with('default', true) + ->willReturn($defaultQueue) + ; + + $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); + + $command = new ConsumeCommand(new Container([ + 'enqueue.client.default.queue_consumer' => $consumer, + 'enqueue.client.default.driver' => $driver, + 'enqueue.client.default.delegate_processor' => $processor, + ]), 'default'); + + $tester = new CommandTester($command); + $tester->execute([]); + + $this->assertEquals($testExitCode, $tester->getStatusCode()); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject|DelegateProcessor */ @@ -572,4 +622,72 @@ private function createDriverStub(RouteCollection $routeCollection = null): Driv return $driverMock; } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function createContextWithoutSubscriptionConsumerMock(): InteropContext + { + $contextMock = $this->createMock(InteropContext::class); + $contextMock + ->expects($this->any()) + ->method('createSubscriptionConsumer') + ->willThrowException(SubscriptionConsumerNotSupportedException::providerDoestNotSupportIt()) + ; + + return $contextMock; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + */ + private function createContextStub(Consumer $consumer = null): InteropContext + { + $context = $this->createContextWithoutSubscriptionConsumerMock(); + $context + ->expects($this->any()) + ->method('createQueue') + ->willReturnCallback(function (string $queueName) { + return new NullQueue($queueName); + }) + ; + $context + ->expects($this->any()) + ->method('createConsumer') + ->willReturnCallback(function (Queue $queue) use ($consumer) { + return $consumer ?: $this->createConsumerStub($queue); + }) + ; + + return $context; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + */ + private function createExtension() + { + return $this->createMock(ExtensionInterface::class); + } + + /** + * @param null|mixed $queue + * + * @return \PHPUnit_Framework_MockObject_MockObject|Consumer + */ + private function createConsumerStub($queue = null): Consumer + { + if (is_string($queue)) { + $queue = new NullQueue($queue); + } + + $consumerMock = $this->createMock(Consumer::class); + $consumerMock + ->expects($this->any()) + ->method('getQueue') + ->willReturn($queue) + ; + + return $consumerMock; + } } diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index 6396568cb..37ca32fd5 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -3,10 +3,18 @@ namespace Enqueue\Tests\Symfony\Consumption; use Enqueue\Consumption\ChainExtension; +use Enqueue\Consumption\Context\Start; +use Enqueue\Consumption\ExtensionInterface; +use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\QueueConsumerInterface; use Enqueue\Container\Container; +use Enqueue\Null\NullQueue; use Enqueue\Symfony\Consumption\ConsumeCommand; use Enqueue\Test\ClassExtensionTrait; +use Interop\Queue\Consumer; +use Interop\Queue\Context as InteropContext; +use Interop\Queue\Exception\SubscriptionConsumerNotSupportedException; +use Interop\Queue\Queue; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use Symfony\Component\Console\Command\Command; @@ -123,6 +131,34 @@ public function testThrowIfNotDefinedTransportRequested() $tester->execute(['--transport' => 'not-defined']); } + public function testShouldReturnExitStatusIfSet() + { + $testExitCode = 678; + + $stubExtension = $this->createExtension(); + + $stubExtension + ->expects($this->once()) + ->method('onStart') + ->with($this->isInstanceOf(Start::class)) + ->willReturnCallback(function (Start $context) use ($testExitCode) { + $context->interruptExecution($testExitCode); + }) + ; + + $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); + + $command = new ConsumeCommand(new Container([ + 'enqueue.transport.default.queue_consumer' => $consumer, + ]), 'default'); + + $tester = new CommandTester($command); + + $tester->execute([]); + + $this->assertEquals($testExitCode, $tester->getStatusCode()); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface */ @@ -130,4 +166,72 @@ private function createQueueConsumerMock() { return $this->createMock(QueueConsumerInterface::class); } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function createContextWithoutSubscriptionConsumerMock(): InteropContext + { + $contextMock = $this->createMock(InteropContext::class); + $contextMock + ->expects($this->any()) + ->method('createSubscriptionConsumer') + ->willThrowException(SubscriptionConsumerNotSupportedException::providerDoestNotSupportIt()) + ; + + return $contextMock; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + */ + private function createContextStub(Consumer $consumer = null): InteropContext + { + $context = $this->createContextWithoutSubscriptionConsumerMock(); + $context + ->expects($this->any()) + ->method('createQueue') + ->willReturnCallback(function (string $queueName) { + return new NullQueue($queueName); + }) + ; + $context + ->expects($this->any()) + ->method('createConsumer') + ->willReturnCallback(function (Queue $queue) use ($consumer) { + return $consumer ?: $this->createConsumerStub($queue); + }) + ; + + return $context; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + */ + private function createExtension() + { + return $this->createMock(ExtensionInterface::class); + } + + /** + * @param null|mixed $queue + * + * @return \PHPUnit_Framework_MockObject_MockObject|Consumer + */ + private function createConsumerStub($queue = null): Consumer + { + if (is_string($queue)) { + $queue = new NullQueue($queue); + } + + $consumerMock = $this->createMock(Consumer::class); + $consumerMock + ->expects($this->any()) + ->method('getQueue') + ->willReturn($queue) + ; + + return $consumerMock; + } } From cd1ac762c4775f264375310a1992bb81b8ad4342 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Thu, 14 Feb 2019 15:05:46 +0200 Subject: [PATCH 0556/1142] manual cs fix --- pkg/enqueue/Consumption/Context/PostMessageReceived.php | 2 +- pkg/enqueue/Tests/Consumption/QueueConsumerTest.php | 2 +- pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php | 2 +- pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue/Consumption/Context/PostMessageReceived.php b/pkg/enqueue/Consumption/Context/PostMessageReceived.php index 1e312da10..91b532656 100644 --- a/pkg/enqueue/Consumption/Context/PostMessageReceived.php +++ b/pkg/enqueue/Consumption/Context/PostMessageReceived.php @@ -94,7 +94,7 @@ public function getReceivedAt(): int } /** - * @return Result|null|object|string + * @return Result|object|string|null */ public function getResult() { diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index f466c19cd..b10339304 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -1532,7 +1532,7 @@ private function createExtension() } /** - * @param null|mixed $queue + * @param mixed|null $queue * * @return \PHPUnit_Framework_MockObject_MockObject|Consumer */ diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 6f50844e6..52bcd9a1e 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -671,7 +671,7 @@ private function createExtension() } /** - * @param null|mixed $queue + * @param mixed|null $queue * * @return \PHPUnit_Framework_MockObject_MockObject|Consumer */ diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index 37ca32fd5..88b826725 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -215,7 +215,7 @@ private function createExtension() } /** - * @param null|mixed $queue + * @param mixed|null $queue * * @return \PHPUnit_Framework_MockObject_MockObject|Consumer */ From 0ac6218edc80e912830e966b16d515e8f4bda7d2 Mon Sep 17 00:00:00 2001 From: Lars Greiss Date: Thu, 14 Feb 2019 09:53:15 +0100 Subject: [PATCH 0557/1142] [dbal]: make dbal connection config usable again right now user cannot declare connection options. Reason is that always 'connection' => 'url' was set which dbal always prefers over other connection settings. With this fix connection can be defined dbal compliant like this: connection: host: 'localhost' port: '3306' dbname: 'app' user: 'app' password: '' 'dsn only' works like before. PS3-4: - added config tests PS5: - if a fq dsn and connection is set dsn should be prefered PS6: - better naming for dbname in tests --- pkg/dbal/DbalConnectionFactory.php | 26 +++++++- .../Tests/DbalConnectionFactoryConfigTest.php | 66 +++++++++++++++++++ 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/pkg/dbal/DbalConnectionFactory.php b/pkg/dbal/DbalConnectionFactory.php index 7e0f65c45..077bd0e3c 100644 --- a/pkg/dbal/DbalConnectionFactory.php +++ b/pkg/dbal/DbalConnectionFactory.php @@ -45,8 +45,7 @@ public function __construct($config = 'mysql:') $config = $this->parseDsn($config); } elseif (is_array($config)) { if (array_key_exists('dsn', $config)) { - $config = array_replace_recursive($config, $this->parseDsn($config['dsn'])); - + $config = array_replace_recursive($config, $this->parseDsn($config['dsn'], $config)); unset($config['dsn']); } } else { @@ -92,7 +91,13 @@ private function establishConnection(): Connection return $this->connection; } - private function parseDsn(string $dsn): array + /** + * @param string $dsn + * @param array|null $config + * + * @return array + */ + private function parseDsn(string $dsn, array $config = null): array { if (false === strpos($dsn, ':')) { throw new \LogicException(sprintf('The DSN is invalid. It does not have scheme separator ":".')); @@ -135,6 +140,21 @@ private function parseDsn(string $dsn): array $doctrineScheme = $supported[$scheme]; + if ($scheme.':' === $dsn && is_array($config) && array_key_exists('connection', $config)) { + $default = [ + 'driver' => $doctrineScheme, + 'host' => 'localhost', + 'port' => '3306', + 'user' => 'root', + 'password' => '', + ]; + + return [ + 'lazy' => true, + 'connection' => array_replace_recursive($default, $config['connection']), + ]; + } + return [ 'lazy' => true, 'connection' => [ diff --git a/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php b/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php index 1b9d8634c..fb5cae5d5 100644 --- a/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php +++ b/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php @@ -101,6 +101,72 @@ public static function provideConfigs() ], ]; + yield [ + [ + 'dsn' => 'mysql+pdo:', + 'connection' => [ + 'dbname' => 'customDbName', + ], + ], + [ + 'connection' => [ + 'dbname' => 'customDbName', + 'driver' => 'pdo_mysql', + 'host' => 'localhost', + 'port' => '3306', + 'user' => 'root', + 'password' => '', + ], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, + ], + ]; + + yield [ + [ + 'dsn' => 'mysql+pdo:', + 'connection' => [ + 'dbname' => 'customDbName', + 'host' => 'host', + 'port' => '10000', + 'user' => 'user', + 'password' => 'pass', + ], + ], + [ + 'connection' => [ + 'dbname' => 'customDbName', + 'host' => 'host', + 'port' => '10000', + 'user' => 'user', + 'password' => 'pass', + 'driver' => 'pdo_mysql', + ], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, + ], + ]; + + yield [ + [ + 'dsn' => 'mysql+pdo://user:pass@host:10000/db', + 'connection' => [ + 'foo' => 'fooValue', + ], + ], + [ + 'connection' => [ + 'foo' => 'fooValue', + 'url' => 'pdo_mysql://user:pass@host:10000/db', + ], + 'table_name' => 'enqueue', + 'polling_interval' => 1000, + 'lazy' => true, + ], + ]; + yield [ 'mysql://user:pass@host:10000/db', [ From 93fcdcab0802a2f13f168341a32aec87241e10a8 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Fri, 15 Feb 2019 10:27:16 +0200 Subject: [PATCH 0558/1142] correct phrase --- pkg/enqueue/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 05dd1df2c..29cd7a847 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -41,7 +41,7 @@ "enqueue/dsn": "0.9.x-dev" }, "suggest": { - "symfony/console": "^2.8|^3|^4 If you want to use li commands", + "symfony/console": "^2.8|^3|^4 If you want to use cli commands", "symfony/dependency-injection": "^3.4|^4", "symfony/config": "^3.4|^4", "enqueue/amqp-ext": "AMQP transport (based on php extension)", From a35a32390f77c81389192f5772561052b276a50c Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Mon, 18 Feb 2019 14:24:26 +0200 Subject: [PATCH 0559/1142] senses --- composer.json | 1 + pkg/sns/SnsClient.php | 10 ++ pkg/sns/SnsContext.php | 53 ++++++- pkg/sns/SnsSubscribe.php | 49 ++++++- pkg/sns/SnsUnsubscribe.php | 48 +++++++ pkg/snsqs/.gitattributes | 5 + pkg/snsqs/.gitignore | 6 + pkg/snsqs/.travis.yml | 21 +++ pkg/snsqs/LICENSE | 20 +++ pkg/snsqs/README.md | 28 ++++ pkg/snsqs/SnsQsConnectionFactory.php | 97 +++++++++++++ pkg/snsqs/SnsQsConsumer.php | 102 +++++++++++++ pkg/snsqs/SnsQsContext.php | 208 +++++++++++++++++++++++++++ pkg/snsqs/SnsQsMessage.php | 37 +++++ pkg/snsqs/SnsQsProducer.php | 90 ++++++++++++ pkg/snsqs/SnsQsQueue.php | 11 ++ pkg/snsqs/SnsQsTopic.php | 11 ++ pkg/snsqs/composer.json | 39 +++++ pkg/snsqs/examples/consumer.php | 40 ++++++ pkg/snsqs/examples/produce.php | 40 ++++++ pkg/snsqs/phpunit.xml.dist | 30 ++++ pkg/sqs/SqsContext.php | 4 +- 22 files changed, 937 insertions(+), 13 deletions(-) create mode 100644 pkg/sns/SnsUnsubscribe.php create mode 100644 pkg/snsqs/.gitattributes create mode 100644 pkg/snsqs/.gitignore create mode 100644 pkg/snsqs/.travis.yml create mode 100644 pkg/snsqs/LICENSE create mode 100644 pkg/snsqs/README.md create mode 100644 pkg/snsqs/SnsQsConnectionFactory.php create mode 100644 pkg/snsqs/SnsQsConsumer.php create mode 100644 pkg/snsqs/SnsQsContext.php create mode 100644 pkg/snsqs/SnsQsMessage.php create mode 100644 pkg/snsqs/SnsQsProducer.php create mode 100644 pkg/snsqs/SnsQsQueue.php create mode 100644 pkg/snsqs/SnsQsTopic.php create mode 100644 pkg/snsqs/composer.json create mode 100644 pkg/snsqs/examples/consumer.php create mode 100644 pkg/snsqs/examples/produce.php create mode 100644 pkg/snsqs/phpunit.xml.dist diff --git a/composer.json b/composer.json index 500ff2d06..b04c52d23 100644 --- a/composer.json +++ b/composer.json @@ -76,6 +76,7 @@ "Enqueue\\SimpleClient\\": "pkg/simple-client/", "Enqueue\\Sqs\\": "pkg/sqs/", "Enqueue\\Sns\\": "pkg/sns/", + "Enqueue\\SnsQs\\": "pkg/snsqs/", "Enqueue\\Stomp\\": "pkg/stomp/", "Enqueue\\Test\\": "pkg/test/", "Enqueue\\Dsn\\": "pkg/dsn/", diff --git a/pkg/sns/SnsClient.php b/pkg/sns/SnsClient.php index 6b5f6a337..133f43fb9 100644 --- a/pkg/sns/SnsClient.php +++ b/pkg/sns/SnsClient.php @@ -48,6 +48,16 @@ public function subscribe(array $args): Result return $this->callApi('subscribe', $args); } + public function unsubscribe(array $args): Result + { + return $this->callApi('unsubscribe', $args); + } + + public function listSubscriptionsByTopic(array $args): Result + { + return $this->callApi('ListSubscriptionsByTopic', $args); + } + public function getAWSClient(): AwsSnsClient { $this->resolveClient(); diff --git a/pkg/sns/SnsContext.php b/pkg/sns/SnsContext.php index 818eda4a7..02bcfd173 100644 --- a/pkg/sns/SnsContext.php +++ b/pkg/sns/SnsContext.php @@ -79,16 +79,61 @@ public function declareTopic(SnsDestination $destination): void public function subscribe(SnsSubscribe $subscribe): void { + foreach ($this->getSubscriptions($subscribe->getTopic()) as $subscription) { + if ($subscription['Protocol'] === $subscribe->getProtocol() + && $subscription['Endpoint'] === $subscribe->getEndpoint()) { + return; + } + } + $this->client->subscribe([ 'Attributes' => $subscribe->getAttributes(), 'Endpoint' => $subscribe->getEndpoint(), - //'Protocol' => '', // REQUIRED -//'ReturnSubscriptionArn' => true || false, -//'TopicArn' => '', // REQUIRED -//]); + 'Protocol' => $subscribe->getProtocol(), + 'ReturnSubscriptionArn' => $subscribe->isReturnSubscriptionArn(), + 'TopicArn' => $this->getTopicArn($subscribe->getTopic()), ]); } + public function unsubscibe(SnsUnsubscribe $unsubscribe): void + { + foreach ($this->getSubscriptions($unsubscribe->getTopic()) as $subscription) { + if ($subscription['Protocol'] != $unsubscribe->getProtocol()) { + continue; + } + + if ($subscription['Endpoint'] != $unsubscribe->getEndpoint()) { + continue; + } + + $this->client->unsubscribe([ + 'SubscriptionArn' => $subscription['SubscriptionArn'], + ]); + } + } + + public function getSubscriptions(SnsDestination $destination): array + { + $args = [ + 'TopicArn' => $this->getTopicArn($destination), + ]; + + $subscriptions = []; + while (true) { + $result = $this->client->listSubscriptionsByTopic($args); + + $subscriptions = array_merge($subscriptions, $result->get('Subscriptions')); + + if (false == $result->hasKey('NextToken')) { + break; + } + + $args['NextToken'] = $result->get('NextToken'); + } + + return $subscriptions; + } + public function getTopicArn(SnsDestination $destination): string { if (false == array_key_exists($destination->getTopicName(), $this->topicArns)) { diff --git a/pkg/sns/SnsSubscribe.php b/pkg/sns/SnsSubscribe.php index 94d457d55..70addb7e0 100644 --- a/pkg/sns/SnsSubscribe.php +++ b/pkg/sns/SnsSubscribe.php @@ -6,25 +6,50 @@ class SnsSubscribe { - private $destination; + const PROTOCOL_SQS = 'sqs'; + /** + * @var SnsDestination + */ + private $topic; + + /** + * @var string + */ private $endpoint; + /** + * @var string + */ private $protocol; + /** + * @var + */ + private $returnSubscriptionArn; + + /** + * @var + */ private $attributes; - public function __construct(SnsDestination $destination, string $endpoint, string $protocol, array $arguments) - { - $this->destination = $destination; + public function __construct( + SnsDestination $topic, + string $endpoint, + string $protocol, + bool $returnSubscriptionArn = false, + array $attributes = [] + ) { + $this->topic = $topic; $this->endpoint = $endpoint; $this->protocol = $protocol; - $this->attributes = $arguments; + $this->returnSubscriptionArn = $returnSubscriptionArn; + $this->attributes = $attributes; } - public function getDestination(): SnsDestination + public function getTopic(): SnsDestination { - return $this->destination; + return $this->topic; } public function getEndpoint(): string @@ -32,6 +57,16 @@ public function getEndpoint(): string return $this->endpoint; } + public function getProtocol(): string + { + return $this->protocol; + } + + public function isReturnSubscriptionArn(): bool + { + return $this->returnSubscriptionArn; + } + public function getAttributes(): array { return $this->attributes; diff --git a/pkg/sns/SnsUnsubscribe.php b/pkg/sns/SnsUnsubscribe.php new file mode 100644 index 000000000..cd5733651 --- /dev/null +++ b/pkg/sns/SnsUnsubscribe.php @@ -0,0 +1,48 @@ +topic = $topic; + $this->endpoint = $endpoint; + $this->protocol = $protocol; + } + + public function getTopic(): SnsDestination + { + return $this->topic; + } + + public function getEndpoint(): string + { + return $this->endpoint; + } + + public function getProtocol(): string + { + return $this->protocol; + } +} diff --git a/pkg/snsqs/.gitattributes b/pkg/snsqs/.gitattributes new file mode 100644 index 000000000..bdf2dcb14 --- /dev/null +++ b/pkg/snsqs/.gitattributes @@ -0,0 +1,5 @@ +/Tests export-ignore +.gitattributes export-ignore +.gitignore export-ignore +.travis.yml export-ignore +phpunit.xml.dist export-ignore diff --git a/pkg/snsqs/.gitignore b/pkg/snsqs/.gitignore new file mode 100644 index 000000000..a770439e5 --- /dev/null +++ b/pkg/snsqs/.gitignore @@ -0,0 +1,6 @@ +*~ +/composer.lock +/composer.phar +/phpunit.xml +/vendor/ +/.idea/ diff --git a/pkg/snsqs/.travis.yml b/pkg/snsqs/.travis.yml new file mode 100644 index 000000000..9ed4fa123 --- /dev/null +++ b/pkg/snsqs/.travis.yml @@ -0,0 +1,21 @@ +sudo: false + +git: + depth: 10 + +language: php + +php: + - '7.1' + - '7.2' + +cache: + directories: + - $HOME/.composer/cache + +install: + - composer self-update + - composer install --prefer-source + +script: + - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/snsqs/LICENSE b/pkg/snsqs/LICENSE new file mode 100644 index 000000000..20211e5fd --- /dev/null +++ b/pkg/snsqs/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) +Copyright (c) 2018 Max Kotliar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pkg/snsqs/README.md b/pkg/snsqs/README.md new file mode 100644 index 000000000..b944e6c7e --- /dev/null +++ b/pkg/snsqs/README.md @@ -0,0 +1,28 @@ +

Supporting Enqueue

+ +Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: + +- [Become a sponsor](https://www.patreon.com/makasim) +- [Become our client](http://forma-pro.com/) + +--- + +# Amazon SNS-SQS Transport + +[![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) +[![Build Status](https://travis-ci.org/php-enqueue/snsqs.png?branch=master)](https://travis-ci.org/php-enqueue/snsqs) +[![Total Downloads](https://poser.pugx.org/enqueue/snsqs/d/total.png)](https://packagist.org/packages/enqueue/snsqs) +[![Latest Stable Version](https://poser.pugx.org/enqueue/snsqs/version.png)](https://packagist.org/packages/enqueue/snsqs) + +This is an implementation of Queue Interop specification. It allows you to send and consume message using [Amazon SNS-SQS](https://aws.amazon.com/snsqs/) service. + +## Resources + +* [Site](https://enqueue.forma-pro.com/) +* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/transport/snsqs.md) +* [Questions](https://gitter.im/php-enqueue/Lobby) +* [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) + +## License + +It is released under the [MIT License](LICENSE). \ No newline at end of file diff --git a/pkg/snsqs/SnsQsConnectionFactory.php b/pkg/snsqs/SnsQsConnectionFactory.php new file mode 100644 index 000000000..9c272d82f --- /dev/null +++ b/pkg/snsqs/SnsQsConnectionFactory.php @@ -0,0 +1,97 @@ + null AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'secret' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'token' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'region' => null, (string, required) Region to connect to. See http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of available regions. + * 'version' => '2012-11-05', (string, required) The version of the webservice to utilize + * 'lazy' => true, Enable lazy connection (boolean) + * 'endpoint' => null (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack + * ]. + * + * or + * + * snsqs: + * snsqs:?key=aKey&secret=aSecret&token=aToken + * + * @param array|string|null $config + */ + public function __construct($config = 'snsqs:') + { + if (empty($config)) { + $this->snsConfig = []; + $this->sqsConfig = []; + } elseif (is_string($config)) { + $this->parseDsn($config); + } elseif (is_array($config)) { + if (array_key_exists('dsn', $config)) { + $this->parseDsn($config['dsn']); + } else { + if (array_key_exists('sns', $config)) { + $this->snsConfig = $config['sns']; + } else { + $this->snsConfig = $config; + } + + if (array_key_exists('sqs', $config)) { + $this->sqsConfig = $config['sqs']; + } else { + $this->sqsConfig = $config; + } + } + } else { + throw new \LogicException(sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSnsClient::class)); + } + } + + /** + * @return SnsQsContext + */ + public function createContext(): Context + { + return new SnsQsContext(function() { + return (new SnsConnectionFactory($this->snsConfig))->createContext(); + }, function() { + return (new SqsConnectionFactory($this->sqsConfig))->createContext(); + }); + } + + private function parseDsn(string $dsn): void + { + $dsn = Dsn::parseFirst($dsn); + + if ('snsqs' !== $dsn->getSchemeProtocol()) { + throw new \LogicException(sprintf( + 'The given scheme protocol "%s" is not supported. It must be "snsqs"', + $dsn->getSchemeProtocol() + )); + } + + $this->snsConfig = 'sns:?'.$dsn->getQueryString(); + $this->sqsConfig = 'sqs:?'.$dsn->getQueryString(); + } +} diff --git a/pkg/snsqs/SnsQsConsumer.php b/pkg/snsqs/SnsQsConsumer.php new file mode 100644 index 000000000..362905370 --- /dev/null +++ b/pkg/snsqs/SnsQsConsumer.php @@ -0,0 +1,102 @@ +context = $context; + $this->consumer = $consumer; + $this->queue = $queue; + } + + public function getQueue(): Queue + { + return $this->queue; + } + + public function receive(int $timeout = 0): ?Message + { + if ($sqsMessage = $this->consumer->receive($timeout)) { + return $this->convertMessage($sqsMessage); + } + + return null; + } + + public function receiveNoWait(): ?Message + { + if ($sqsMessage = $this->consumer->receiveNoWait()) { + return $this->convertMessage($sqsMessage); + } + + return null; + } + + /** + * @param SnsQsMessage $message + */ + public function acknowledge(Message $message): void + { + InvalidMessageException::assertMessageInstanceOf($message, SnsQsMessage::class); + + $this->consumer->acknowledge($message->getSqsMessage()); + } + + /** + * @param SnsQsMessage $message + */ + public function reject(Message $message, bool $requeue = false): void + { + InvalidMessageException::assertMessageInstanceOf($message, SnsQsMessage::class); + + $this->consumer->reject($message->getSqsMessage(), $requeue); + } + + private function convertMessage(SqsMessage $sqsMessage): SnsQsMessage + { + $message = $this->context->createMessage(); + $message->setRedelivered($sqsMessage->isRedelivered()); + $message->setSqsMessage($sqsMessage); + + $data = json_decode($sqsMessage->getBody(), true); + + if (isset($data['Message'])) { + $message->setBody((string) $data['Message']); + } + + if (isset($data['MessageAttributes']['Headers'])) { + $headersData = json_decode($data['MessageAttributes']['Headers']['Value'], true); + + $message->setHeaders($headersData[0]); + $message->setProperties($headersData[1]); + } + + return $message; + } +} diff --git a/pkg/snsqs/SnsQsContext.php b/pkg/snsqs/SnsQsContext.php new file mode 100644 index 000000000..a878add1d --- /dev/null +++ b/pkg/snsqs/SnsQsContext.php @@ -0,0 +1,208 @@ +snsContext = $snsContext; + } elseif (is_callable($snsContext)) { + $this->snsContextFactory = $snsContext; + } else { + throw new \InvalidArgumentException(sprintf( + 'The $snsContext argument must be either %s or callable that returns %s once called.', + SnsContext::class, + SnsContext::class + )); + } + + if ($sqsContext instanceof SqsContext) { + $this->sqsContext = $sqsContext; + } elseif (is_callable($sqsContext)) { + $this->sqsContextFactory = $sqsContext; + } else { + throw new \InvalidArgumentException(sprintf( + 'The $sqsContext argument must be either %s or callable that returns %s once called.', + SqsContext::class, + SqsContext::class + )); + } + } + + /** + * @return SnsQsMessage + */ + public function createMessage(string $body = '', array $properties = [], array $headers = []): Message + { + return new SnsQsMessage($body, $properties, $headers); + } + + /** + * @return SnsQsTopic + */ + public function createTopic(string $topicName): Topic + { + return new SnsQsTopic($topicName); + } + + /** + * @return SnsQsQueue + */ + public function createQueue(string $queueName): Queue + { + return new SnsQsQueue($queueName); + } + + public function createTemporaryQueue(): Queue + { + throw TemporaryQueueNotSupportedException::providerDoestNotSupportIt(); + } + + public function createProducer(): Producer + { + return new SnsQsProducer($this->getSnsContext()); + } + + /** + * @param SnsQsQueue $destination + */ + public function createConsumer(Destination $destination): Consumer + { + InvalidDestinationException::assertDestinationInstanceOf($destination, SnsQsQueue::class); + + return new SnsQsConsumer($this, $this->getSqsContext()->createConsumer($destination), $destination); + } + + /** + * @param SnsQsQueue $queue + */ + public function purgeQueue(Queue $queue): void + { + InvalidDestinationException::assertDestinationInstanceOf($queue, SnsQsQueue::class); + + $this->getSqsContext()->purgeQueue($queue); + } + + public function createSubscriptionConsumer(): SubscriptionConsumer + { + throw SubscriptionConsumerNotSupportedException::providerDoestNotSupportIt(); + } + + public function declareTopic(SnsQsTopic $topic): void + { + InvalidDestinationException::assertDestinationInstanceOf($topic, SnsQsTopic::class); + + $this->getSnsContext()->declareTopic($topic); + } + + public function declareQueue(SnsQsQueue $queue): void + { + InvalidDestinationException::assertDestinationInstanceOf($queue, SnsQsQueue::class); + + $this->getSqsContext()->declareQueue($queue); + } + + public function bind(SnsQsTopic $topic, SnsQsQueue $queue): void + { + $this->getSnsContext()->subscribe(new SnsSubscribe( + $topic, + $this->getSqsContext()->getQueueArn($queue), + SnsSubscribe::PROTOCOL_SQS + )); + } + + public function unbind(SnsQsTopic $topic, SnsQsQueue $queue): void + { + $this->getSnsContext()->unsubscibe(new SnsUnsubscribe( + $topic, + $this->getSqsContext()->getQueueArn($queue), + SnsSubscribe::PROTOCOL_SQS + )); + } + + public function close(): void + { + $this->getSnsContext()->close(); + $this->getSqsContext()->close(); + } + + private function getSnsContext(): SnsContext + { + if (null === $this->snsContext) { + $context = call_user_func($this->snsContextFactory); + if (false == $context instanceof SnsContext) { + throw new \LogicException(sprintf( + 'The factory must return instance of %s. It returned %s', + SnsContext::class, + is_object($context) ? get_class($context) : gettype($context) + )); + } + + $this->snsContext = $context; + } + + return $this->snsContext; + } + + private function getSqsContext(): SqsContext + { + if (null === $this->sqsContext) { + $context = call_user_func($this->sqsContextFactory); + if (false == $context instanceof SqsContext) { + throw new \LogicException(sprintf( + 'The factory must return instance of %s. It returned %s', + SqsContext::class, + is_object($context) ? get_class($context) : gettype($context) + )); + } + + $this->sqsContext = $context; + } + + return $this->sqsContext; + } +} diff --git a/pkg/snsqs/SnsQsMessage.php b/pkg/snsqs/SnsQsMessage.php new file mode 100644 index 000000000..e34a103ff --- /dev/null +++ b/pkg/snsqs/SnsQsMessage.php @@ -0,0 +1,37 @@ +body = $body; + $this->properties = $properties; + $this->headers = $headers; + $this->redelivered = false; + } + + public function setSqsMessage(SqsMessage $message): void + { + $this->sqsMessage = $message; + } + + public function getSqsMessage(): SqsMessage + { + return $this->sqsMessage; + } +} diff --git a/pkg/snsqs/SnsQsProducer.php b/pkg/snsqs/SnsQsProducer.php new file mode 100644 index 000000000..bde0cde1b --- /dev/null +++ b/pkg/snsqs/SnsQsProducer.php @@ -0,0 +1,90 @@ +context = $context; + } + + /** + * @param SnsQsTopic $destination + * @param SnsQsMessage $message + */ + public function send(Destination $destination, Message $message): void + { + InvalidDestinationException::assertDestinationInstanceOf($destination, SnsQsTopic::class); + InvalidMessageException::assertMessageInstanceOf($message, SnsQsMessage::class); + + $snsMessage = $this->context->createMessage($message->getBody(), $message->getProperties(), $message->getHeaders()); + + $this->getProducer()->send($destination, $snsMessage); + } + + public function setDeliveryDelay(int $deliveryDelay = null): Producer + { + $this->getProducer()->setDeliveryDelay($deliveryDelay); + + return $this; + } + + public function getDeliveryDelay(): ?int + { + return $this->getProducer()->getDeliveryDelay(); + } + + public function setPriority(int $priority = null): Producer + { + $this->getProducer()->setPriority($priority); + + return $this; + } + + public function getPriority(): ?int + { + return $this->getProducer()->getPriority(); + } + + public function setTimeToLive(int $timeToLive = null): Producer + { + $this->getProducer()->setTimeToLive($timeToLive); + + return $this; + } + + public function getTimeToLive(): ?int + { + return $this->getProducer()->getTimeToLive(); + } + + private function getProducer(): SnsProducer + { + if (null === $this->producer) { + $this->producer = $this->context->createProducer(); + } + + return $this->producer; + } +} diff --git a/pkg/snsqs/SnsQsQueue.php b/pkg/snsqs/SnsQsQueue.php new file mode 100644 index 000000000..92c3a542b --- /dev/null +++ b/pkg/snsqs/SnsQsQueue.php @@ -0,0 +1,11 @@ + getenv('SNS_DSN'), + 'sqs' => getenv('SQS_DSN'), +]))->createContext(); + +$topic = $context->createTopic('topic'); +$queue = $context->createQueue('queue'); + +$context->declareTopic($topic); +$context->declareQueue($queue); +$context->bind($topic, $queue); + +$consumer = $context->createConsumer($queue); + +while (true) { + if ($m = $consumer->receive(20000)) { + $consumer->acknowledge($m); + echo 'Received message: '.$m->getBody().' '.json_encode($m->getHeaders()).' '.json_encode($m->getProperties()).PHP_EOL; + } +} +echo 'Done'."\n"; diff --git a/pkg/snsqs/examples/produce.php b/pkg/snsqs/examples/produce.php new file mode 100644 index 000000000..0396d9cd0 --- /dev/null +++ b/pkg/snsqs/examples/produce.php @@ -0,0 +1,40 @@ + getenv('SNS_DSN'), + 'sqs' => getenv('SQS_DSN'), +]))->createContext(); + +$topic = $context->createTopic('topic'); +$queue = $context->createQueue('queue'); + +$context->declareTopic($topic); +$context->declareQueue($queue); +$context->bind($topic, $queue); + +$message = $context->createMessage('Hello Bar!', ['key' => 'value'], ['key2' => 'value2']); + +while (true) { + $context->createProducer()->send($topic, $message); + echo 'Sent message: '.$message->getBody().PHP_EOL; + sleep(1); +} + +echo 'Done'."\n"; diff --git a/pkg/snsqs/phpunit.xml.dist b/pkg/snsqs/phpunit.xml.dist new file mode 100644 index 000000000..e9b3b30e8 --- /dev/null +++ b/pkg/snsqs/phpunit.xml.dist @@ -0,0 +1,30 @@ + + + + + + + ./Tests + + + + + + . + + ./vendor + ./Tests + + + + diff --git a/pkg/sqs/SqsContext.php b/pkg/sqs/SqsContext.php index 4860bbefe..60906f72f 100644 --- a/pkg/sqs/SqsContext.php +++ b/pkg/sqs/SqsContext.php @@ -179,11 +179,11 @@ public function getQueueArn(SqsDestination $destination): string $result = $this->client->getQueueAttributes($arguments); - if (false == $result->hasKey('QueueArn')) { + if (false == $arn = $result->search('Attributes.QueueArn')) { throw new \RuntimeException(sprintf('QueueArn cannot be resolved. queueName: "%s"', $destination->getQueueName())); } - return $this->queueArns[$destination->getQueueName()] = (string) $result->get('QueueArn'); + return $this->queueArns[$destination->getQueueName()] = (string) $arn; } public function declareQueue(SqsDestination $dest): void From 159de1982c01193817deb90788e0629108314d3e Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Tue, 19 Feb 2019 13:24:41 +0200 Subject: [PATCH 0560/1142] snsqs tests --- bin/subtree-split | 2 + pkg/sns/SnsClient.php | 7 ++ pkg/sns/SnsContext.php | 7 ++ pkg/snsqs/SnsQsConsumer.php | 28 +++++-- pkg/snsqs/SnsQsContext.php | 16 ++-- pkg/snsqs/SnsQsProducer.php | 80 +++++++++++++++---- .../Tests/Spec/SnsQsConnectionFactoryTest.php | 18 +++++ pkg/snsqs/Tests/Spec/SnsQsContextTest.php | 27 +++++++ pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php | 68 ++++++++++++++++ pkg/snsqs/Tests/Spec/SnsQsMessageTest.php | 14 ++++ pkg/snsqs/Tests/Spec/SnsQsProducerTest.php | 19 +++++ pkg/snsqs/Tests/Spec/SnsQsQueueTest.php | 14 ++++ .../SnsQsSendToAndReceiveFromQueueTest.php | 34 ++++++++ ...sQsSendToAndReceiveNoWaitFromQueueTest.php | 34 ++++++++ ...nsQsSendToTopicAndReceiveFromQueueSpec.php | 39 +++++++++ ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 39 +++++++++ pkg/snsqs/Tests/Spec/SnsQsTopicTest.php | 14 ++++ pkg/test/SnsQsExtension.php | 21 +++++ 18 files changed, 451 insertions(+), 30 deletions(-) create mode 100644 pkg/snsqs/Tests/Spec/SnsQsConnectionFactoryTest.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsContextTest.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsMessageTest.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsProducerTest.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsQueueTest.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php create mode 100644 pkg/snsqs/Tests/Spec/SnsQsTopicTest.php create mode 100644 pkg/test/SnsQsExtension.php diff --git a/bin/subtree-split b/bin/subtree-split index c52f15a8e..1ccc74383 100755 --- a/bin/subtree-split +++ b/bin/subtree-split @@ -84,6 +84,8 @@ split 'pkg/redis' redis split 'pkg/dbal' dbal split 'pkg/null' null split 'pkg/sqs' sqs +split 'pkg/sns' sns +split 'pkg/snsqs' snsqs split 'pkg/gps' gps split 'pkg/enqueue-bundle' enqueue-bundle split 'pkg/job-queue' job-queue diff --git a/pkg/sns/SnsClient.php b/pkg/sns/SnsClient.php index 133f43fb9..2d33faf25 100644 --- a/pkg/sns/SnsClient.php +++ b/pkg/sns/SnsClient.php @@ -38,6 +38,13 @@ public function createTopic(array $args): Result return $this->callApi('createTopic', $args); } + public function deleteTopic(string $topicArn): Result + { + return $this->callApi('DeleteTopic', [ + 'TopicArn' => $topicArn, + ]); + } + public function publish(array $args): Result { return $this->callApi('publish', $args); diff --git a/pkg/sns/SnsContext.php b/pkg/sns/SnsContext.php index 02bcfd173..b489f8d57 100644 --- a/pkg/sns/SnsContext.php +++ b/pkg/sns/SnsContext.php @@ -77,6 +77,13 @@ public function declareTopic(SnsDestination $destination): void $this->topicArns[$destination->getTopicName()] = (string) $result->get('TopicArn'); } + public function deleteTopic(SnsDestination $destination): void + { + $this->client->deleteTopic($this->getTopicArn($destination)); + + unset($this->topicArns[$destination->getTopicName()]); + } + public function subscribe(SnsSubscribe $subscribe): void { foreach ($this->getSubscriptions($subscribe->getTopic()) as $subscription) { diff --git a/pkg/snsqs/SnsQsConsumer.php b/pkg/snsqs/SnsQsConsumer.php index 362905370..77051d364 100644 --- a/pkg/snsqs/SnsQsConsumer.php +++ b/pkg/snsqs/SnsQsConsumer.php @@ -84,19 +84,31 @@ private function convertMessage(SqsMessage $sqsMessage): SnsQsMessage $message->setRedelivered($sqsMessage->isRedelivered()); $message->setSqsMessage($sqsMessage); - $data = json_decode($sqsMessage->getBody(), true); + $body = $sqsMessage->getBody(); - if (isset($data['Message'])) { - $message->setBody((string) $data['Message']); - } + if (isset($body[0]) && $body[0] === '{') { + $data = json_decode($sqsMessage->getBody(), true); + + if (isset($data['TopicArn']) && isset($data['Type']) && $data['Type'] === 'Notification') { + // SNS message conversion + if (isset($data['Message'])) { + $message->setBody((string) $data['Message']); + } - if (isset($data['MessageAttributes']['Headers'])) { - $headersData = json_decode($data['MessageAttributes']['Headers']['Value'], true); + if (isset($data['MessageAttributes']['Headers'])) { + $headersData = json_decode($data['MessageAttributes']['Headers']['Value'], true); - $message->setHeaders($headersData[0]); - $message->setProperties($headersData[1]); + $message->setHeaders($headersData[0]); + $message->setProperties($headersData[1]); + } + + return $message; + } } + $message->setBody($sqsMessage->getBody()); + $message->setProperties($sqsMessage->getProperties()); + return $message; } } diff --git a/pkg/snsqs/SnsQsContext.php b/pkg/snsqs/SnsQsContext.php index a878add1d..d520cdb10 100644 --- a/pkg/snsqs/SnsQsContext.php +++ b/pkg/snsqs/SnsQsContext.php @@ -104,7 +104,7 @@ public function createTemporaryQueue(): Queue public function createProducer(): Producer { - return new SnsQsProducer($this->getSnsContext()); + return new SnsQsProducer($this->getSnsContext(), $this->getSqsContext()); } /** @@ -134,18 +134,24 @@ public function createSubscriptionConsumer(): SubscriptionConsumer public function declareTopic(SnsQsTopic $topic): void { - InvalidDestinationException::assertDestinationInstanceOf($topic, SnsQsTopic::class); - $this->getSnsContext()->declareTopic($topic); } - public function declareQueue(SnsQsQueue $queue): void + public function deleteTopic(SnsQsTopic $topic): void { - InvalidDestinationException::assertDestinationInstanceOf($queue, SnsQsQueue::class); + $this->getSnsContext()->deleteTopic($topic); + } + public function declareQueue(SnsQsQueue $queue): void + { $this->getSqsContext()->declareQueue($queue); } + public function deleteQueue(SnsQsQueue $queue): void + { + $this->getSqsContext()->deleteQueue($queue); + } + public function bind(SnsQsTopic $topic, SnsQsQueue $queue): void { $this->getSnsContext()->subscribe(new SnsSubscribe( diff --git a/pkg/snsqs/SnsQsProducer.php b/pkg/snsqs/SnsQsProducer.php index bde0cde1b..f77b861e6 100644 --- a/pkg/snsqs/SnsQsProducer.php +++ b/pkg/snsqs/SnsQsProducer.php @@ -6,6 +6,8 @@ use Enqueue\Sns\SnsContext; use Enqueue\Sns\SnsProducer; +use Enqueue\Sqs\SqsContext; +use Enqueue\Sqs\SqsProducer; use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; @@ -17,16 +19,27 @@ class SnsQsProducer implements Producer /** * @var SnsContext */ - private $context; + private $snsContext; /** * @var SnsProducer */ - private $producer; + private $snsProducer; - public function __construct(SnsContext $context) + /** + * @var SqsContext + */ + private $sqsContext; + + /** + * @var SqsProducer + */ + private $sqsProducer; + + public function __construct(SnsContext $snsContext, SqsContext $sqsContext) { - $this->context = $context; + $this->snsContext = $snsContext; + $this->sqsContext = $sqsContext; } /** @@ -35,56 +48,89 @@ public function __construct(SnsContext $context) */ public function send(Destination $destination, Message $message): void { - InvalidDestinationException::assertDestinationInstanceOf($destination, SnsQsTopic::class); InvalidMessageException::assertMessageInstanceOf($message, SnsQsMessage::class); - $snsMessage = $this->context->createMessage($message->getBody(), $message->getProperties(), $message->getHeaders()); + if (false == $destination instanceof SnsQsTopic && false == $destination instanceof SnsQsQueue) { + throw new InvalidDestinationException(sprintf( + 'The destination must be an instance of [%s|%s] but got %s.', + SnsQsTopic::class, SnsQsQueue::class, + is_object($destination) ? get_class($destination) : gettype($destination) + )); + } - $this->getProducer()->send($destination, $snsMessage); + if ($destination instanceof SnsQsTopic) { + $snsMessage = $this->snsContext->createMessage( + $message->getBody(), + $message->getProperties(), + $message->getHeaders() + ); + + $this->getSnsProducer()->send($destination, $snsMessage); + } else { + $sqsMessage = $this->sqsContext->createMessage( + $message->getBody(), + $message->getProperties(), + $message->getHeaders() + ); + + $this->getSqsProducer()->send($destination, $sqsMessage); + } } public function setDeliveryDelay(int $deliveryDelay = null): Producer { - $this->getProducer()->setDeliveryDelay($deliveryDelay); + $this->getSnsProducer()->setDeliveryDelay($deliveryDelay); + $this->getSqsProducer()->setDeliveryDelay($deliveryDelay); return $this; } public function getDeliveryDelay(): ?int { - return $this->getProducer()->getDeliveryDelay(); + return $this->getSnsProducer()->getDeliveryDelay(); } public function setPriority(int $priority = null): Producer { - $this->getProducer()->setPriority($priority); + $this->getSnsProducer()->setPriority($priority); + $this->getSqsProducer()->setPriority($priority); return $this; } public function getPriority(): ?int { - return $this->getProducer()->getPriority(); + return $this->getSnsProducer()->getPriority(); } public function setTimeToLive(int $timeToLive = null): Producer { - $this->getProducer()->setTimeToLive($timeToLive); + $this->getSnsProducer()->setTimeToLive($timeToLive); + $this->getSqsProducer()->setTimeToLive($timeToLive); return $this; } public function getTimeToLive(): ?int { - return $this->getProducer()->getTimeToLive(); + return $this->getSnsProducer()->getTimeToLive(); + } + + private function getSnsProducer(): SnsProducer + { + if (null === $this->snsProducer) { + $this->snsProducer = $this->snsContext->createProducer(); + } + + return $this->snsProducer; } - private function getProducer(): SnsProducer + private function getSqsProducer(): SqsProducer { - if (null === $this->producer) { - $this->producer = $this->context->createProducer(); + if (null === $this->sqsProducer) { + $this->sqsProducer = $this->sqsContext->createProducer(); } - return $this->producer; + return $this->sqsProducer; } } diff --git a/pkg/snsqs/Tests/Spec/SnsQsConnectionFactoryTest.php b/pkg/snsqs/Tests/Spec/SnsQsConnectionFactoryTest.php new file mode 100644 index 000000000..f00c350da --- /dev/null +++ b/pkg/snsqs/Tests/Spec/SnsQsConnectionFactoryTest.php @@ -0,0 +1,18 @@ +createMock(SqsContext::class); + $sqsContext + ->expects($this->any()) + ->method('createConsumer') + ->willReturn($this->createMock(SqsConsumer::class)) + ; + + return new SnsQsContext( + $this->createMock(SnsContext::class), + $sqsContext + ); + } +} diff --git a/pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php b/pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php new file mode 100644 index 000000000..efc4a7046 --- /dev/null +++ b/pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php @@ -0,0 +1,68 @@ +snsQsContext = $this->buildSnsQsContext(); + } + + protected function createSnsQsQueue(string $queueName): SnsQsQueue + { + $queueName = $queueName.time(); + + $this->snsQsQueue = $this->snsQsContext->createQueue($queueName); + $this->snsQsContext->declareQueue($this->snsQsQueue); + + if ($this->snsQsTopic) { + $this->snsQsContext->bind($this->snsQsTopic, $this->snsQsQueue); + } + + return $this->snsQsQueue; + } + + protected function createSnsQsTopic(string $topicName): SnsQsTopic + { + $topicName = $topicName.time(); + + $this->snsQsTopic = $this->snsQsContext->createTopic($topicName); + $this->snsQsContext->declareTopic($this->snsQsTopic); + + return $this->snsQsTopic; + } + + protected function cleanUpSnsQs(): void + { + if ($this->snsQsTopic) { + $this->snsQsContext->deleteTopic($this->snsQsTopic); + } + + if ($this->snsQsQueue) { + $this->snsQsContext->deleteQueue($this->snsQsQueue); + } + } +} diff --git a/pkg/snsqs/Tests/Spec/SnsQsMessageTest.php b/pkg/snsqs/Tests/Spec/SnsQsMessageTest.php new file mode 100644 index 000000000..a2815cde5 --- /dev/null +++ b/pkg/snsqs/Tests/Spec/SnsQsMessageTest.php @@ -0,0 +1,14 @@ +createMock(SnsContext::class), + $this->createMock(SqsContext::class) + ); + } +} diff --git a/pkg/snsqs/Tests/Spec/SnsQsQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsQueueTest.php new file mode 100644 index 000000000..6a6bd4dfd --- /dev/null +++ b/pkg/snsqs/Tests/Spec/SnsQsQueueTest.php @@ -0,0 +1,14 @@ +cleanUpSnsQs(); + } + + protected function createContext() + { + return $this->createSnsQsContext(); + } + + protected function createQueue(Context $context, $queueName) + { + return $this->createSnsQsQueue($queueName); + } +} diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php new file mode 100644 index 000000000..4ec916bd1 --- /dev/null +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php @@ -0,0 +1,34 @@ +cleanUpSnsQs(); + } + + protected function createContext() + { + return $this->createSnsQsContext(); + } + + protected function createQueue(Context $context, $queueName) + { + return $this->createSnsQsQueue($queueName); + } +} diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php new file mode 100644 index 000000000..f32e37a94 --- /dev/null +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php @@ -0,0 +1,39 @@ +cleanUpSnsQs(); + } + + protected function createContext() + { + return $this->createSnsQsContext(); + } + + protected function createTopic(Context $context, $topicName) + { + return $this->createSnsQsTopic($topicName); + } + + protected function createQueue(Context $context, $queueName) + { + return $this->createSnsQsQueue($queueName); + } +} diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php new file mode 100644 index 000000000..5d404e4a3 --- /dev/null +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -0,0 +1,39 @@ +cleanUpSnsQs(); + } + + protected function createContext() + { + return $this->createSnsQsContext(); + } + + protected function createTopic(Context $context, $topicName) + { + return $this->createSnsQsTopic($topicName); + } + + protected function createQueue(Context $context, $queueName) + { + return $this->createSnsQsQueue($queueName); + } +} diff --git a/pkg/snsqs/Tests/Spec/SnsQsTopicTest.php b/pkg/snsqs/Tests/Spec/SnsQsTopicTest.php new file mode 100644 index 000000000..94a455987 --- /dev/null +++ b/pkg/snsqs/Tests/Spec/SnsQsTopicTest.php @@ -0,0 +1,14 @@ + $snsDsn, 'sqs' => $sqsDsn]))->createContext(); + } +} From 8c0e3c62d2a0602b0f4b229c3bb289e97f821c5e Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Tue, 19 Feb 2019 15:35:48 +0200 Subject: [PATCH 0561/1142] snsqs client driver --- phpunit.xml.dist | 4 + pkg/enqueue/Client/Driver/SnsQsDriver.php | 90 +++++++++++++++++++++++ pkg/enqueue/Client/Resources.php | 7 ++ pkg/enqueue/Resources.php | 4 + 4 files changed, 105 insertions(+) create mode 100644 pkg/enqueue/Client/Driver/SnsQsDriver.php diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 5c5501702..37d8ec56b 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -65,6 +65,10 @@ pkg/sns/Tests + + pkg/snsqs/Tests + + pkg/pheanstalk/Tests diff --git a/pkg/enqueue/Client/Driver/SnsQsDriver.php b/pkg/enqueue/Client/Driver/SnsQsDriver.php new file mode 100644 index 000000000..0720699cb --- /dev/null +++ b/pkg/enqueue/Client/Driver/SnsQsDriver.php @@ -0,0 +1,90 @@ +debug(sprintf('[SqsQsDriver] '.$text, ...$args)); + }; + + // setup router + $routerTopic = $this->createRouterTopic(); + $log('Declare router topic: %s', $routerTopic->getTopicName()); + $this->getContext()->declareTopic($routerTopic); + + $routerQueue = $this->createQueue($this->getConfig()->getRouterQueue()); + $log('Declare router queue: %s', $routerQueue->getQueueName()); + $this->getContext()->declareQueue($routerQueue); + + $log('Bind router queue to topic: %s -> %s', $routerQueue->getQueueName(), $routerTopic->getTopicName()); + $this->getContext()->bind($routerTopic, $routerQueue); + + // setup queues + $declaredQueues = []; + $declaredTopics = []; + foreach ($this->getRouteCollection()->all() as $route) { + $queue = $this->createRouteQueue($route); + if (false === array_key_exists($queue->getQueueName(), $declaredQueues)) { + $log('Declare processor queue: %s', $queue->getQueueName()); + $this->getContext()->declareQueue($queue); + + $declaredQueues[$queue->getQueueName()] = true; + } + + if ($route->isCommand()) { + continue; + } + + $topic = $this->doCreateTopic($this->createTransportQueueName($route->getSource(), true)); + if (false === array_key_exists($topic->getTopicName(), $declaredTopics)) { + $log('Declare processor topic: %s', $topic->getTopicName()); + $this->getContext()->declareTopic($topic); + + $declaredTopics[$topic->getTopicName()] = true; + } + + $log('Bind processor queue to topic: %s -> %s', $queue->getQueueName(), $topic->getTopicName()); + $this->getContext()->bind($topic, $queue); + } + } + + protected function createRouterTopic(): Destination + { + return $this->doCreateTopic( + $this->createTransportRouterTopicName($this->getConfig()->getRouterTopic(), true) + ); + } + + protected function createTransportRouterTopicName(string $name, bool $prefix): string + { + $name = parent::createTransportRouterTopicName($name, $prefix); + + return str_replace('.', '_dot_', $name); + } + + protected function createTransportQueueName(string $name, bool $prefix): string + { + $name = parent::createTransportQueueName($name, $prefix); + + return str_replace('.', '_dot_', $name); + } +} diff --git a/pkg/enqueue/Client/Resources.php b/pkg/enqueue/Client/Resources.php index b88b8227b..1207b64f8 100644 --- a/pkg/enqueue/Client/Resources.php +++ b/pkg/enqueue/Client/Resources.php @@ -12,6 +12,7 @@ use Enqueue\Client\Driver\RabbitMqStompDriver; use Enqueue\Client\Driver\RdKafkaDriver; use Enqueue\Client\Driver\RedisDriver; +use Enqueue\Client\Driver\SnsQsDriver; use Enqueue\Client\Driver\SqsDriver; use Enqueue\Client\Driver\StompDriver; @@ -92,6 +93,12 @@ public static function getKnownDrivers(): array 'requiredSchemeExtensions' => [], 'packages' => ['enqueue/enqueue', 'enqueue/sqs'], ]; + $map[] = [ + 'schemes' => ['snsqs'], + 'driverClass' => SnsQsDriver::class, + 'requiredSchemeExtensions' => [], + 'packages' => ['enqueue/enqueue', 'enqueue/sqs', 'enqueue/sns', 'enqueue/snsqs'], + ]; $map[] = [ 'schemes' => ['stomp'], 'driverClass' => StompDriver::class, diff --git a/pkg/enqueue/Resources.php b/pkg/enqueue/Resources.php index a3d94da66..0c804d917 100644 --- a/pkg/enqueue/Resources.php +++ b/pkg/enqueue/Resources.php @@ -155,6 +155,10 @@ public static function getKnownConnections(): array 'schemes' => ['sqs'], 'supportedSchemeExtensions' => [], 'package' => 'enqueue/sqs', ]; + $map[SqsConnectionFactory::class] = [ + 'schemes' => ['snsqs'], + 'supportedSchemeExtensions' => [], + 'package' => 'enqueue/snsqs', ]; $map[GpsConnectionFactory::class] = [ 'schemes' => ['gps'], 'supportedSchemeExtensions' => [], From d9fa5f4de2e33a27f75f67d261262ba16e4b5637 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Tue, 19 Feb 2019 18:15:00 +0200 Subject: [PATCH 0562/1142] snsqs client driver --- docker-compose.yml | 1 + .../Tests/Functional/UseCasesTest.php | 9 ++++ pkg/enqueue/Resources.php | 3 +- pkg/snsqs/SnsQsConnectionFactory.php | 48 +++++++++++++------ pkg/test/SnsQsExtension.php | 7 +-- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3d50a6940..c46bfc472 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,6 +32,7 @@ services: - GPS_DSN=gps:?projectId=mqdev&emulatorHost=http://google-pubsub:8085 - SQS_DSN=sqs:?key=key&secret=secret®ion=us-east-1&endpoint=http://localstack:4576&version=latest - SNS_DSN=sns:?key=key&secret=secret®ion=us-east-1&endpoint=http://localstack:4575&version=latest + - SNSQS_DSN=snsqs:?key=key&secret=secret®ion=us-east-1&sns_endpoint=http://localstack:4575&sqs_endpoint=http://localstack:4576&version=latest - WAMP_DSN=wamp://thruway:9090 - REDIS_HOST=redis - REDIS_PORT=6379 diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 474cb8710..7b9045b75 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -136,6 +136,15 @@ public function provideEnqueueConfigs() 'transport' => getenv('MONGO_DSN'), ], ]]; + + yield 'snsqs' => [[ + 'default' => [ + 'transport' => [ + 'dsn' => getenv('SNSQS_DSN'), + ], + ], + ]]; + // // yield 'gps' => [[ // 'transport' => [ diff --git a/pkg/enqueue/Resources.php b/pkg/enqueue/Resources.php index 0c804d917..75884bab6 100644 --- a/pkg/enqueue/Resources.php +++ b/pkg/enqueue/Resources.php @@ -14,6 +14,7 @@ use Enqueue\Pheanstalk\PheanstalkConnectionFactory; use Enqueue\RdKafka\RdKafkaConnectionFactory; use Enqueue\Redis\RedisConnectionFactory; +use Enqueue\SnsQs\SnsQsConnectionFactory; use Enqueue\Sqs\SqsConnectionFactory; use Enqueue\Stomp\StompConnectionFactory; use Enqueue\Wamp\WampConnectionFactory; @@ -155,7 +156,7 @@ public static function getKnownConnections(): array 'schemes' => ['sqs'], 'supportedSchemeExtensions' => [], 'package' => 'enqueue/sqs', ]; - $map[SqsConnectionFactory::class] = [ + $map[SnsQsConnectionFactory::class] = [ 'schemes' => ['snsqs'], 'supportedSchemeExtensions' => [], 'package' => 'enqueue/snsqs', ]; diff --git a/pkg/snsqs/SnsQsConnectionFactory.php b/pkg/snsqs/SnsQsConnectionFactory.php index 9c272d82f..42e200d2f 100644 --- a/pkg/snsqs/SnsQsConnectionFactory.php +++ b/pkg/snsqs/SnsQsConnectionFactory.php @@ -35,8 +35,16 @@ class SnsQsConnectionFactory implements ConnectionFactory * * or * + * $config = [ + * 'sns_key' => null, SNS option + * 'sqs_secret' => null, SQS option + * 'token' Option for both SNS and SQS + * ]. + * + * or + * * snsqs: - * snsqs:?key=aKey&secret=aSecret&token=aToken + * snsqs:?key=aKey&secret=aSecret&sns_token=aSnsToken&sqs_token=aSqsToken * * @param array|string|null $config */ @@ -51,17 +59,7 @@ public function __construct($config = 'snsqs:') if (array_key_exists('dsn', $config)) { $this->parseDsn($config['dsn']); } else { - if (array_key_exists('sns', $config)) { - $this->snsConfig = $config['sns']; - } else { - $this->snsConfig = $config; - } - - if (array_key_exists('sqs', $config)) { - $this->sqsConfig = $config['sqs']; - } else { - $this->sqsConfig = $config; - } + $this->parseOptions($config); } } else { throw new \LogicException(sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSnsClient::class)); @@ -91,7 +89,29 @@ private function parseDsn(string $dsn): void )); } - $this->snsConfig = 'sns:?'.$dsn->getQueryString(); - $this->sqsConfig = 'sqs:?'.$dsn->getQueryString(); + $this->parseOptions($dsn->getQuery()); + } + + private function parseOptions(array $options): void + { + // set default options + foreach ($options as $key => $value) { + if (false === in_array(substr($key, 0, 4), ['sns_', 'sqs_'])) { + $this->snsConfig[$key] = $value; + $this->sqsConfig[$key] = $value; + } + } + + // set transport specific options + foreach ($options as $key => $value) { + switch (substr($key, 0, 4)) { + case 'sns_': + $this->snsConfig[substr($key, 4)] = $value; + break; + case 'sqs_': + $this->sqsConfig[substr($key, 4)] = $value; + break; + } + } } } diff --git a/pkg/test/SnsQsExtension.php b/pkg/test/SnsQsExtension.php index 8bbc2d7e7..719f5ce58 100644 --- a/pkg/test/SnsQsExtension.php +++ b/pkg/test/SnsQsExtension.php @@ -9,13 +9,10 @@ trait SnsQsExtension { private function buildSnsQsContext(): SnsQsContext { - $snsDsn = getenv('SNS_DSN'); - $sqsDsn = getenv('SQS_DSN'); - - if (false == $snsDsn || false == $sqsDsn) { + if (false == $dsn = getenv('SNSQS_DSN')) { throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); } - return (new SnsQsConnectionFactory(['sns' => $snsDsn, 'sqs' => $sqsDsn]))->createContext(); + return (new SnsQsConnectionFactory($dsn))->createContext(); } } From 7e0767ece390677879dd01f81251e7a673222e9e Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Wed, 20 Feb 2019 09:48:49 +0200 Subject: [PATCH 0563/1142] snsqs client driver --- pkg/snsqs/SnsQsConnectionFactory.php | 2 +- .../Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/snsqs/SnsQsConnectionFactory.php b/pkg/snsqs/SnsQsConnectionFactory.php index 42e200d2f..e5bd59a4b 100644 --- a/pkg/snsqs/SnsQsConnectionFactory.php +++ b/pkg/snsqs/SnsQsConnectionFactory.php @@ -62,7 +62,7 @@ public function __construct($config = 'snsqs:') $this->parseOptions($config); } } else { - throw new \LogicException(sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSnsClient::class)); + throw new \LogicException('The config must be either an array of options, a DSN string or null'); } } diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php index 4ec916bd1..3738af03e 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php @@ -10,7 +10,7 @@ * @group functional * @retry 5 */ -class SqsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec +class SqsQsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { use RetryTrait; use SnsQsFactoryTrait; From b0e3da4a413530cef453bf04911ccc462d4f60af Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Wed, 20 Feb 2019 09:56:06 +0200 Subject: [PATCH 0564/1142] snsqs fix typo --- pkg/enqueue/Client/Driver/SnsQsDriver.php | 2 +- pkg/snsqs/SnsQsConnectionFactory.php | 6 +++--- pkg/snsqs/SnsQsConsumer.php | 4 ++-- pkg/snsqs/SnsQsProducer.php | 2 +- .../Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/enqueue/Client/Driver/SnsQsDriver.php b/pkg/enqueue/Client/Driver/SnsQsDriver.php index 0720699cb..2b1d4f233 100644 --- a/pkg/enqueue/Client/Driver/SnsQsDriver.php +++ b/pkg/enqueue/Client/Driver/SnsQsDriver.php @@ -10,7 +10,7 @@ /** * @method SnsQsContext getContext() - * @method SnsQsTopic createRouterTopic() + * @method SnsQsTopic createRouterTopic() */ class SnsQsDriver extends GenericDriver { diff --git a/pkg/snsqs/SnsQsConnectionFactory.php b/pkg/snsqs/SnsQsConnectionFactory.php index e5bd59a4b..abb154a9b 100644 --- a/pkg/snsqs/SnsQsConnectionFactory.php +++ b/pkg/snsqs/SnsQsConnectionFactory.php @@ -71,9 +71,9 @@ public function __construct($config = 'snsqs:') */ public function createContext(): Context { - return new SnsQsContext(function() { + return new SnsQsContext(function () { return (new SnsConnectionFactory($this->snsConfig))->createContext(); - }, function() { + }, function () { return (new SqsConnectionFactory($this->sqsConfig))->createContext(); }); } @@ -96,7 +96,7 @@ private function parseOptions(array $options): void { // set default options foreach ($options as $key => $value) { - if (false === in_array(substr($key, 0, 4), ['sns_', 'sqs_'])) { + if (false === in_array(substr($key, 0, 4), ['sns_', 'sqs_'], true)) { $this->snsConfig[$key] = $value; $this->sqsConfig[$key] = $value; } diff --git a/pkg/snsqs/SnsQsConsumer.php b/pkg/snsqs/SnsQsConsumer.php index 77051d364..82209896e 100644 --- a/pkg/snsqs/SnsQsConsumer.php +++ b/pkg/snsqs/SnsQsConsumer.php @@ -86,10 +86,10 @@ private function convertMessage(SqsMessage $sqsMessage): SnsQsMessage $body = $sqsMessage->getBody(); - if (isset($body[0]) && $body[0] === '{') { + if (isset($body[0]) && '{' === $body[0]) { $data = json_decode($sqsMessage->getBody(), true); - if (isset($data['TopicArn']) && isset($data['Type']) && $data['Type'] === 'Notification') { + if (isset($data['TopicArn']) && isset($data['Type']) && 'Notification' === $data['Type']) { // SNS message conversion if (isset($data['Message'])) { $message->setBody((string) $data['Message']); diff --git a/pkg/snsqs/SnsQsProducer.php b/pkg/snsqs/SnsQsProducer.php index f77b861e6..1baeef307 100644 --- a/pkg/snsqs/SnsQsProducer.php +++ b/pkg/snsqs/SnsQsProducer.php @@ -43,7 +43,7 @@ public function __construct(SnsContext $snsContext, SqsContext $sqsContext) } /** - * @param SnsQsTopic $destination + * @param SnsQsTopic $destination * @param SnsQsMessage $message */ public function send(Destination $destination, Message $message): void diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php index 3738af03e..72e29eeae 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php @@ -10,7 +10,7 @@ * @group functional * @retry 5 */ -class SqsQsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec +class SnsQsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { use RetryTrait; use SnsQsFactoryTrait; From 3f043adffc43774e26de0e4c407383750bcd6f43 Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Wed, 20 Feb 2019 10:09:20 +0200 Subject: [PATCH 0565/1142] snsqs fix tests --- pkg/sqs/Tests/SqsContextTest.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/sqs/Tests/SqsContextTest.php b/pkg/sqs/Tests/SqsContextTest.php index 204e5d87a..1f5fcf239 100644 --- a/pkg/sqs/Tests/SqsContextTest.php +++ b/pkg/sqs/Tests/SqsContextTest.php @@ -328,12 +328,17 @@ public function testShouldAllowGetQueueArn() 'QueueUrl' => 'theQueueUrl', 'AttributeNames' => ['QueueArn'], ])) - ->willReturn(new Result(['QueueArn' => 'theQueueArn'])) + ->willReturn(new Result([ + 'Attributes' => [ + 'QueueArn' => 'theQueueArn', + ], + ])) ; $context = new SqsContext($sqsClient, []); $queue = $context->createQueue('aQueueName'); + $queue->setRegion('theRegion'); $this->assertSame('theQueueArn', $context->getQueueArn($queue)); } From 905c471b81830ad202a795a9faf2b637257bca2f Mon Sep 17 00:00:00 2001 From: Alexander Kozienko Date: Wed, 20 Feb 2019 11:38:49 +0200 Subject: [PATCH 0566/1142] snsqs docs --- bin/subtree-split | 2 + docs/index.md | 1 + docs/transport/snsqs.md | 182 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 docs/transport/snsqs.md diff --git a/bin/subtree-split b/bin/subtree-split index 1ccc74383..e8aa1ed4c 100755 --- a/bin/subtree-split +++ b/bin/subtree-split @@ -58,6 +58,8 @@ remote rdkafka git@github.com:php-enqueue/rdkafka.git remote dbal git@github.com:php-enqueue/dbal.git remote null git@github.com:php-enqueue/null.git remote sqs git@github.com:php-enqueue/sqs.git +remote sns git@github.com:php-enqueue/sns.git +remote snsqs git@github.com:php-enqueue/snsqs.git remote gps git@github.com:php-enqueue/gps.git remote enqueue-bundle git@github.com:php-enqueue/enqueue-bundle.git remote job-queue git@github.com:php-enqueue/job-queue.git diff --git a/docs/index.md b/docs/index.md index c369d6b9f..521e642fa 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,6 +12,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made * [Quick tour](quick_tour.md) * [Transports](#transports) - Amqp based on [the ext](transport/amqp.md), [bunny](transport/amqp_bunny.md), [the lib](transport/amqp_lib.md) + - [Amazon SNS-SQS](transport/snsqs.md) - [Amazon SQS](transport/sqs.md) - [Google PubSub](transport/gps.md) - [Beanstalk (Pheanstalk)](transport/pheanstalk.md) diff --git a/docs/transport/snsqs.md b/docs/transport/snsqs.md new file mode 100644 index 000000000..330f091a1 --- /dev/null +++ b/docs/transport/snsqs.md @@ -0,0 +1,182 @@ +

Supporting Enqueue

+ +Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: + +- [Become a sponsor](https://www.patreon.com/makasim) +- [Become our client](http://forma-pro.com/) + +--- + +# Amazon SNS-SQS transport + +Utilize two Amazon services [SNS-SQS](https://docs.aws.amazon.com/sns/latest/dg/sns-sqs-as-subscriber.html) to +implement [Publish-Subscribe](https://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.html) +enterprise integration pattern. As opposed to single SQS transport this adds ability to use [MessageBus](https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageBus.html) +with enqueue. + +A transport for [Amazon SQS](https://aws.amazon.com/sqs/) broker. +It uses internally official [aws sdk library](https://packagist.org/packages/aws/aws-sdk-php) + +* [Installation](#installation) +* [Create context](#create-context) +* [Declare topic, queue and bind them together](#declare-topic-queue-and-bind-them-together) +* [Send message to topic](#send-message-to-topic) +* [Send message to queue](#send-message-to-queue) +* [Consume message](#consume-message) +* [Purge queue messages](#purge-queue-messages) +* [Queue from another AWS account](#queue-from-another-aws-account) + +## Installation + +```bash +$ composer require enqueue/sqs +``` + +## Create context + +```php + 'aKey', + 'secret' => 'aSecret', + 'region' => 'aRegion', + + // or you can segregate options using prefixes "sns_", "sqs_" + 'key' => 'aKey', // common option for both SNS and SQS + 'sns_region' => 'aSnsRegion', // SNS transport option + 'sqs_region' => 'aSqsRegion', // SQS transport option +]); + +// same as above but given as DSN string. You may need to url encode secret if it contains special char (like +) +$factory = new SnsQsConnectionFactory('snsqs:?key=aKey&secret=aSecret®ion=aRegion'); + +$context = $factory->createContext(); + +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +$context = (new \Enqueue\ConnectionFactoryFactory())->create('snsqs:')->createContext(); +``` + +## Declare topic, queue and bind them together + +Declare topic, queue operation creates a topic, queue on a broker side. +Bind creates connection between topic and queue. You publish message to +the topic and topic sends message to each queue connected to the topic. + + +```php +createTopic('in'); +$context->declareTopic($inTopic); + +$out1Queue = $context->createQueue('out1'); +$context->declareQueue($out1Queue); + +$out2Queue = $context->createQueue('out2'); +$context->declareQueue($out2Queue); + +$context->bind($inTopic, $out1Queue); +$context->bind($inTopic, $out2Queue); + +// to remove topic/queue use deleteTopic/deleteQueue method +//$context->deleteTopic($inTopic); +//$context->deleteQueue($out1Queue); +//$context->unbind(inTopic, $out1Queue); +``` + +## Send message to topic + +```php +createTopic('in'); +$message = $context->createMessage('Hello world!'); + +$context->createProducer()->send($inTopic, $message); +``` + +## Send message to queue + +You can bypass topic and publish message directly to the queue + +```php +createQueue('foo'); +$message = $context->createMessage('Hello world!'); + +$context->createProducer()->send($fooQueue, $message); +``` + + +## Consume message: + +```php +createQueue('out1'); +$consumer = $context->createConsumer($out1Queue); + +$message = $consumer->receive(); + +// process a message + +$consumer->acknowledge($message); +// $consumer->reject($message); +``` + +## Purge queue messages: + +```php +createQueue('foo'); + +$context->purgeQueue($fooQueue); +``` + +## Queue from another AWS account + +SQS allows to use queues from another account. You could set it globally for all queues via option `queue_owner_aws_account_id` or +per queue using `SnsQsQueue::setQueueOwnerAWSAccountId` method. + +```php +createContext(); + +// per queue. +$queue = $context->createQueue('foo'); +$queue->setQueueOwnerAWSAccountId('awsAccountId'); +``` + +## Multi region examples + +Enqueue SNSQS provides a generic multi-region support. This enables users to specify which AWS Region to send a command to by setting region on SnsQsQueue. +If not specified the default region is used. + +```php +createContext(); + +$queue = $context->createQueue('foo'); +$queue->setRegion('us-west-2'); + +// the request goes to US West (Oregon) Region +$context->declareQueue($queue); +``` + +[back to index](../index.md) From 38ed92545f80e4a964db0510a2c0ee6dcf9b22d7 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Wed, 20 Feb 2019 16:57:52 +0100 Subject: [PATCH 0567/1142] Catch signal in Bunny adapter --- pkg/amqp-bunny/AmqpSubscriptionConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/amqp-bunny/AmqpSubscriptionConsumer.php b/pkg/amqp-bunny/AmqpSubscriptionConsumer.php index 6d7a49469..b8b8922de 100644 --- a/pkg/amqp-bunny/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-bunny/AmqpSubscriptionConsumer.php @@ -47,7 +47,7 @@ public function consume(int $timeout = 0): void try { $this->context->getBunnyChannel()->getClient()->run(0 !== $timeout ? $timeout / 1000 : null); } catch (ClientException $e) { - if ('stream_select() failed.' == $e->getMessage() && $signalHandler->wasThereSignal()) { + if ('stream_select() failed' === substr($e->getMessage(), 0, 22) && $signalHandler->wasThereSignal()) { return; } From 62cb94953ce1b870e1c3682f241fe385322a93d9 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 21 Feb 2019 00:33:31 +0100 Subject: [PATCH 0568/1142] CR fix --- pkg/amqp-bunny/AmqpSubscriptionConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/amqp-bunny/AmqpSubscriptionConsumer.php b/pkg/amqp-bunny/AmqpSubscriptionConsumer.php index b8b8922de..4fff4f8ab 100644 --- a/pkg/amqp-bunny/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-bunny/AmqpSubscriptionConsumer.php @@ -47,7 +47,7 @@ public function consume(int $timeout = 0): void try { $this->context->getBunnyChannel()->getClient()->run(0 !== $timeout ? $timeout / 1000 : null); } catch (ClientException $e) { - if ('stream_select() failed' === substr($e->getMessage(), 0, 22) && $signalHandler->wasThereSignal()) { + if (0 === strpos($e->getMessage(), 'stream_select() failed') && $signalHandler->wasThereSignal()) { return; } From 8878877cf978be650e5d256c7ab02bc0ff21adfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Tou=C5=A1ek?= Date: Thu, 21 Feb 2019 12:55:04 +0100 Subject: [PATCH 0569/1142] Fix exception loop in QueueConsumer --- pkg/enqueue/Consumption/QueueConsumer.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 58b8fa06c..19871599c 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -317,18 +317,16 @@ private function onProcessorException(ExtensionInterface $extension, Consumer $c return $result; } catch (\Exception $e) { - $wrapper = $e; - while ($prev = $wrapper->getPrevious()) { + $prev = $e; + do { if ($exception === $wrapper = $prev) { throw $e; } - } + } while ($prev = $wrapper->getPrevious()); - if ($exception !== $wrapper) { - $prev = new \ReflectionProperty('Exception', 'previous'); - $prev->setAccessible(true); - $prev->setValue($wrapper, $exception); - } + $prev = new \ReflectionProperty($wrapper instanceof \Exception ? \Exception::class : \Error::class, 'previous'); + $prev->setAccessible(true); + $prev->setValue($wrapper, $exception); throw $e; } From 274aa0fdd41c00dbcc4529f88f2d580fb973c4d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Tou=C5=A1ek?= Date: Thu, 21 Feb 2019 13:06:01 +0100 Subject: [PATCH 0570/1142] Improve comment --- pkg/enqueue/Consumption/QueueConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 19871599c..30d438dcd 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -299,7 +299,7 @@ private function onEnd(ExtensionInterface $extension, int $startTime, ?int $exit } /** - * The logic is similar to one in Symfony's ExceptionListener::. + * The logic is similar to one in Symfony's ExceptionListener::onKernelException(). * * https://github.com/symfony/symfony/blob/cbe289517470eeea27162fd2d523eb29c95f775f/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php#L77 */ From 8c8f03a97ff9a9888f25902546e60714004b69ff Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Fri, 22 Feb 2019 10:43:55 +0200 Subject: [PATCH 0571/1142] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index e08bdfcf9..df5b154aa 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,14 @@ Features: [![Build Status](https://travis-ci.org/php-enqueue/sqs.png?branch=master)](https://travis-ci.org/php-enqueue/sqs) [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) + * [Amazon SNS](docs/transport/sns.md) +[![Build Status](https://travis-ci.org/php-enqueue/sns.png?branch=master)](https://travis-ci.org/php-enqueue/sns) +[![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns/stats) +[![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) + * [Amazon SNS\SQS](docs/transport/snsqs.md) +[![Build Status](https://travis-ci.org/php-enqueue/snsqs.png?branch=master)](https://travis-ci.org/php-enqueue/snsqs) +[![Total Downloads](https://poser.pugx.org/enqueue/snsqs/d/total.png)](https://packagist.org/packages/enqueue/snsqs/stats) +[![Latest Stable Version](https://poser.pugx.org/enqueue/snsqs/version.png)](https://packagist.org/packages/enqueue/snsqs) * [Google PubSub](docs/transport/gps.md) [![Build Status](https://travis-ci.org/php-enqueue/gps.png?branch=master)](https://travis-ci.org/php-enqueue/gps) [![Total Downloads](https://poser.pugx.org/enqueue/gps/d/total.png)](https://packagist.org/packages/enqueue/gps/stats) From 6fb2b5604afdc84942495a7bdb5a7e3287b38fb6 Mon Sep 17 00:00:00 2001 From: Andrei Tcaci Date: Sun, 24 Feb 2019 22:44:58 +0100 Subject: [PATCH 0572/1142] Enable 'ssl_on' param for 'ssl' scheme extension --- pkg/amqp-tools/ConnectionConfig.php | 5 +++- pkg/amqp-tools/Tests/ConnectionConfigTest.php | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/pkg/amqp-tools/ConnectionConfig.php b/pkg/amqp-tools/ConnectionConfig.php index 5d52891e9..9f4d749d6 100644 --- a/pkg/amqp-tools/ConnectionConfig.php +++ b/pkg/amqp-tools/ConnectionConfig.php @@ -391,7 +391,10 @@ private function parseDsn($dsn) } $sslOn = false; - if ('amqps' === $dsn->getSchemeProtocol() || in_array('tls', $dsn->getSchemeExtensions(), true)) { + $isAmqps = 'amqps' === $dsn->getSchemeProtocol(); + $isTls = in_array('tls', $dsn->getSchemeExtensions(), true); + $isSsl = in_array('ssl', $dsn->getSchemeExtensions(), true); + if ($isAmqps || $isTls || $isSsl) { $sslOn = true; } diff --git a/pkg/amqp-tools/Tests/ConnectionConfigTest.php b/pkg/amqp-tools/Tests/ConnectionConfigTest.php index d45b847b3..67a3f624b 100644 --- a/pkg/amqp-tools/Tests/ConnectionConfigTest.php +++ b/pkg/amqp-tools/Tests/ConnectionConfigTest.php @@ -266,6 +266,32 @@ public static function provideConfigs() ], ]; + yield [ + 'amqp+ssl:', + [ + 'host' => 'localhost', + 'port' => 5672, + 'vhost' => '/', + 'user' => 'guest', + 'pass' => 'guest', + 'read_timeout' => 3., + 'write_timeout' => 3., + 'connection_timeout' => 3., + 'persisted' => false, + 'lazy' => true, + 'qos_prefetch_size' => 0, + 'qos_prefetch_count' => 1, + 'qos_global' => false, + 'heartbeat' => 0.0, + 'ssl_on' => true, + 'ssl_verify' => true, + 'ssl_cacert' => '', + 'ssl_cert' => '', + 'ssl_key' => '', + 'ssl_passphrase' => '', + ], + ]; + yield [ 'amqp://user:pass@host:10000/vhost', [ From 2c67c772b0c82fa4452642e72cc3b5fee6e09b0f Mon Sep 17 00:00:00 2001 From: Andrei Tcaci Date: Tue, 26 Feb 2019 09:44:07 +0100 Subject: [PATCH 0573/1142] php-cs-fixer changes --- pkg/amqp-tools/ConnectionConfig.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/amqp-tools/ConnectionConfig.php b/pkg/amqp-tools/ConnectionConfig.php index 9f4d749d6..224d54b9d 100644 --- a/pkg/amqp-tools/ConnectionConfig.php +++ b/pkg/amqp-tools/ConnectionConfig.php @@ -49,7 +49,7 @@ class ConnectionConfig private $config; /** - * @var array|null|string + * @var array|string|null */ private $inputConfig; From 16856b13310dbac939eb7055b5551d46f63a8d48 Mon Sep 17 00:00:00 2001 From: Tom Pradat Date: Tue, 26 Feb 2019 10:29:40 +0100 Subject: [PATCH 0574/1142] :bug: Fix amqp-tools dependency The enqueue/dsn must be required and not only for dev because ConnectionConfig uses it. --- pkg/amqp-tools/composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index aba5b5af3..ef2ae274d 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -8,13 +8,13 @@ "require": { "php": "^7.1.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8" + "queue-interop/queue-interop": "^0.7|^0.8", + "enqueue/dsn": "^0.9.2" }, "require-dev": { "phpunit/phpunit": "~5.4.0", "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", - "enqueue/dsn": "0.9.x-dev" + "enqueue/null": "0.9.x-dev" }, "support": { "email": "opensource@forma-pro.com", From 2a08cb19ece96a56eed9640d8671adc02197ad05 Mon Sep 17 00:00:00 2001 From: Kai Date: Tue, 26 Feb 2019 14:47:20 +0100 Subject: [PATCH 0575/1142] Added upgrade instructions --- UPGRADE.md | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 UPGRADE.md diff --git a/UPGRADE.md b/UPGRADE.md new file mode 100644 index 000000000..43624a68c --- /dev/null +++ b/UPGRADE.md @@ -0,0 +1,89 @@ +#Upgrading Enqueue: + +From `0.8.x` to `0.9.x`: + +##Processor declaration + +`Interop\Queue\PsrProcessor` interface has been replaced by `Interop\Queue\Processor` +`Interop\Queue\PsrMessage` interface has been replaced by `Interop\Queue\Message` +`Interop\Queue\PsrContext` interface has been replaced by `Interop\Queue\Context` + + + +##Symfony Bundle + +###Configuration changes: + +`0.8.x` + + +``` +enqueue: + transport: + default: ... +``` + +`0.9.x` + + +``` +enqueue: + default: + transport: ... +``` + +In `0.9.x` the client name is a root config node. + +The `default_processor_queue` Client option was removed. + +###Service declarations: + +`0.8.x` + + +``` +tags: + - { name: 'enqueue.client.processor' } +``` + +`0.9.x` + + +``` +tags: + - { name: 'enqueue.command_subscriber' } + - { name: 'enqueue.topic_subscriber' } + - { name: 'enqueue.processor' } +``` + +The tag to register message processors has changed and is now split into processor sub types. + +###CommandSubscriberInterface `getSubscribedCommand` + + +`0.8.x` + +return `aCommandName` or +``` + [ + 'processorName' => 'aCommandName', + 'queueName' => 'a_client_queue_name', + 'queueNameHardcoded' => true, + 'exclusive' => true, + ] +``` + +`0.9.x` + + +return `aCommandName` or +``` + [ + 'command' => 'aSubscribedCommand', + 'processor' => 'aProcessorName', + 'queue' => 'a_client_queue_name', + 'prefix_queue' => true, + 'exclusive' => true, + ] +``` + From e20ad2b292fb0b5a3b1733bf76756293deece1f6 Mon Sep 17 00:00:00 2001 From: Kai Date: Tue, 26 Feb 2019 14:48:55 +0100 Subject: [PATCH 0576/1142] Fix markdown --- UPGRADE.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/UPGRADE.md b/UPGRADE.md index 43624a68c..6b64e44d9 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -1,8 +1,8 @@ -#Upgrading Enqueue: +# Upgrading Enqueue: From `0.8.x` to `0.9.x`: -##Processor declaration +## Processor declaration `Interop\Queue\PsrProcessor` interface has been replaced by `Interop\Queue\Processor` `Interop\Queue\PsrMessage` interface has been replaced by `Interop\Queue\Message` @@ -10,9 +10,9 @@ From `0.8.x` to `0.9.x`: -##Symfony Bundle +## Symfony Bundle -###Configuration changes: +### Configuration changes: `0.8.x` @@ -36,7 +36,7 @@ In `0.9.x` the client name is a root config node. The `default_processor_queue` Client option was removed. -###Service declarations: +### Service declarations: `0.8.x` @@ -58,7 +58,7 @@ tags: The tag to register message processors has changed and is now split into processor sub types. -###CommandSubscriberInterface `getSubscribedCommand` +### CommandSubscriberInterface `getSubscribedCommand` `0.8.x` From 55d567abcef88a43c1778d058cf359b32d716af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20Gr=C4=99da?= Date: Wed, 27 Feb 2019 11:01:34 +0100 Subject: [PATCH 0577/1142] Corrected the installation part in the docs/transport/snsqs.md --- docs/transport/snsqs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/transport/snsqs.md b/docs/transport/snsqs.md index 330f091a1..4f5b31ae5 100644 --- a/docs/transport/snsqs.md +++ b/docs/transport/snsqs.md @@ -29,7 +29,7 @@ It uses internally official [aws sdk library](https://packagist.org/packages/aws ## Installation ```bash -$ composer require enqueue/sqs +$ composer require enqueue/snsqs ``` ## Create context From 5b4df9ea4038b715b0c6ba489f9136bcd71d42cf Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 27 Feb 2019 22:12:42 +0200 Subject: [PATCH 0578/1142] Release 0.9.8 --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f08f1443..e446d49c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Change Log +## [0.9.8](https://github.com/php-enqueue/enqueue-dev/tree/0.9.8) (2019-02-27) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.7...0.9.8) + +**Merged pull requests:** + +- Add upgrade instructions [\#787](https://github.com/php-enqueue/enqueue-dev/pull/787) ([KDederichs](https://github.com/KDederichs)) +- \[consumption\] Fix exception loop in QueueConsumer [\#776](https://github.com/php-enqueue/enqueue-dev/pull/776) ([enumag](https://github.com/enumag)) +- \[consumption\] Add ability to change process exit status from within queue consumer extension [\#766](https://github.com/php-enqueue/enqueue-dev/pull/766) ([greblov](https://github.com/greblov)) +- \[amqp-tools\] Fix amqp-tools dependency [\#785](https://github.com/php-enqueue/enqueue-dev/pull/785) ([TomPradat](https://github.com/TomPradat)) +- \[amqp-tools\] Enable 'ssl\_on' param for 'ssl' scheme extension [\#781](https://github.com/php-enqueue/enqueue-dev/pull/781) ([Leprechaunz](https://github.com/Leprechaunz)) +- \[amqp-bunny\] Catch signal in Bunny adapter [\#771](https://github.com/php-enqueue/enqueue-dev/pull/771) ([snapshotpl](https://github.com/snapshotpl)) +- \[amqp-lib\] supporting channel\_rpc\_timeout option [\#755](https://github.com/php-enqueue/enqueue-dev/pull/755) ([derek9gag](https://github.com/derek9gag)) +- \[dbal\]: make dbal connection config usable again [\#765](https://github.com/php-enqueue/enqueue-dev/pull/765) ([ssiergl](https://github.com/ssiergl)) +- \[fs\] polling\_interval config should be milliseconds not microseconds [\#764](https://github.com/php-enqueue/enqueue-dev/pull/764) ([ssiergl](https://github.com/ssiergl)) +- \[simple-client\] Fix Logger Initialisation [\#752](https://github.com/php-enqueue/enqueue-dev/pull/752) ([ajbonner](https://github.com/ajbonner)) +- \[snsqs\] Corrected the installation part in the docs/transport/snsqs.md [\#791](https://github.com/php-enqueue/enqueue-dev/pull/791) ([dgreda](https://github.com/dgreda)) +- \[sqs\] Update SqsConnectionFactory.php [\#751](https://github.com/php-enqueue/enqueue-dev/pull/751) ([Orkin](https://github.com/Orkin)) +- correct typo in composer.json [\#767](https://github.com/php-enqueue/enqueue-dev/pull/767) ([greblov](https://github.com/greblov)) + ## [0.9.7](https://github.com/php-enqueue/enqueue-dev/tree/0.9.7) (2019-02-01) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.6...0.9.7) From 2bfa42e4661e6f298e4cecd4ef3a2d66ff7d533f Mon Sep 17 00:00:00 2001 From: Marko Kaznovac Date: Wed, 6 Mar 2019 21:23:12 +0100 Subject: [PATCH 0579/1142] fix comment on QueueConsumer constructor default timeout is 10000 milliseconds and this constructor will not accept float --- pkg/enqueue/Consumption/QueueConsumer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 30d438dcd..6cb90290e 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -43,7 +43,7 @@ final class QueueConsumer implements QueueConsumerInterface private $boundProcessors; /** - * @var int|float in milliseconds + * @var int in milliseconds */ private $receiveTimeout; @@ -59,7 +59,7 @@ final class QueueConsumer implements QueueConsumerInterface /** * @param BoundProcessor[] $boundProcessors - * @param int|float $receiveTimeout the time in milliseconds queue consumer waits for a message (10 ms by default) + * @param int $receiveTimeout the time in milliseconds queue consumer waits for a message (10000 ms by default) */ public function __construct( InteropContext $interopContext, From f40b0397aef42d46cfd5f8cdf24cd89306869270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Tou=C5=A1ek?= Date: Mon, 11 Mar 2019 16:01:17 +0100 Subject: [PATCH 0580/1142] Update amqp_bunny.md --- docs/transport/amqp_bunny.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/transport/amqp_bunny.md b/docs/transport/amqp_bunny.md index a87245b36..cf0361f80 100644 --- a/docs/transport/amqp_bunny.md +++ b/docs/transport/amqp_bunny.md @@ -15,7 +15,7 @@ Build on top of [bunny lib](https://github.com/jakubkulhan/bunny). * [Installation](#installation) * [Create context](#create-context) * [Declare topic](#declare-topic) -* [Declare queue](#decalre-queue) +* [Declare queue](#declare-queue) * [Bind queue to topic](#bind-queue-to-topic) * [Send message to topic](#send-message-to-topic) * [Send message to queue](#send-message-to-queue) @@ -267,4 +267,4 @@ $queue = $context->createQueue('aQueue'); $context->purgeQueue($queue); ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) From 4d134f286276e1d2c68b78fa1f80f93d898d997e Mon Sep 17 00:00:00 2001 From: "f.kulakov" Date: Wed, 13 Mar 2019 10:42:04 +0300 Subject: [PATCH 0581/1142] stats_cb support --- pkg/rdkafka/RdKafkaContext.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index cfe8e0eb1..22d4a8e47 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -186,6 +186,10 @@ private function getConf(): Conf $this->conf->setRebalanceCb($this->config['rebalance_cb']); } + if (isset($this->config['stats_cb'])) { + $this->conf->setStatsCb($this->config['stats_cb']); + } + $this->conf->setDefaultTopicConf($topicConf); } From ce8388a2797508bd69bc72d7a1892e0479bc007a Mon Sep 17 00:00:00 2001 From: Alden Weddleton Date: Wed, 13 Mar 2019 11:01:52 -0400 Subject: [PATCH 0582/1142] allow setting sns message attributes, other fields --- pkg/sns/SnsMessage.php | 194 +++++++++++++++++++++++++++++- pkg/sns/SnsProducer.php | 20 +++ pkg/sns/Tests/SnsProducerTest.php | 61 ++++++++++ 3 files changed, 273 insertions(+), 2 deletions(-) diff --git a/pkg/sns/SnsMessage.php b/pkg/sns/SnsMessage.php index 7eb3c0d83..f7311d0b0 100644 --- a/pkg/sns/SnsMessage.php +++ b/pkg/sns/SnsMessage.php @@ -6,28 +6,218 @@ use Interop\Queue\Impl\MessageTrait; use Interop\Queue\Message; +use Psr\Http\Message\StreamInterface; class SnsMessage implements Message { use MessageTrait; + /** + * @var string|null + */ private $snsMessageId; - public function __construct(string $body = '', array $properties = [], array $headers = []) - { + /** + * @var string|null + */ + private $messageStructure; + + /** + * @var string|null + */ + private $phoneNumber; + + /** + * @var string|null + */ + private $subject; + + /** + * @var array|null + */ + private $messageAttributes; + + /** + * @var string|null + */ + private $targetArn; + + /** + * SnsMessage constructor. + * + * See AWS documentation for message attribute structure. + * + * @see https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#shape-messageattributevalue + * + * @param string $body + * @param array $properties + * @param array $headers + * @param array|null $messageAttributes + * @param string|null $messageStructure + * @param string|null $phoneNumber + * @param string|null $subject + * @param string|null $targetArn + */ + public function __construct( + string $body = '', + array $properties = [], + array $headers = [], + array $messageAttributes = null, + string $messageStructure = null, + string $phoneNumber = null, + string $subject = null, + string $targetArn = null + ) { $this->body = $body; $this->properties = $properties; $this->headers = $headers; + $this->messageAttributes = $messageAttributes; + $this->messageStructure = $messageStructure; + $this->phoneNumber = $phoneNumber; + $this->subject = $subject; + $this->targetArn = $targetArn; $this->redelivered = false; } + /** + * @return string|null + */ public function getSnsMessageId(): ?string { return $this->snsMessageId; } + /** + * @param string|null $snsMessageId + */ public function setSnsMessageId(?string $snsMessageId): void { $this->snsMessageId = $snsMessageId; } + + /** + * @return string|null + */ + public function getMessageStructure(): ?string + { + return $this->messageStructure; + } + + /** + * @param string|null $messageStructure + */ + public function setMessageStructure(?string $messageStructure): void + { + $this->messageStructure = $messageStructure; + } + + /** + * @return string|null + */ + public function getPhoneNumber(): ?string + { + return $this->phoneNumber; + } + + /** + * @param string|null $phoneNumber + */ + public function setPhoneNumber(?string $phoneNumber): void + { + $this->phoneNumber = $phoneNumber; + } + + /** + * @return string|null + */ + public function getSubject(): ?string + { + return $this->subject; + } + + /** + * @param string|null $subject + */ + public function setSubject(?string $subject): void + { + $this->subject = $subject; + } + + /** + * @return array|null + */ + public function getMessageAttributes(): ?array + { + return $this->messageAttributes; + } + + /** + * @param array|null $messageAttributes + */ + public function setMessageAttributes(?array $messageAttributes): void + { + $this->messageAttributes = $messageAttributes; + } + + /** + * @param string $name + * @param null $default + * + * @return array|null + */ + public function getAttribute(string $name, $default = null) + { + return array_key_exists($name, $this->messageAttributes) ? $this->messageAttributes[$name] : $default; + } + + /** + * Attribute array format: + * [ + * 'BinaryValue' => , + * 'DataType' => '', // REQUIRED + * 'StringValue' => '', + * ]. + * + * @param string $name + * @param array|null $attribute + */ + public function setAttribute(string $name, ?array $attribute): void + { + if (null === $attribute) { + unset($this->messageAttributes[$name]); + } else { + $this->messageAttributes[$name] = $attribute; + } + } + + /** + * @param string $name + * @param string $dataType String, String.Array, Number, or Binary + * @param string|resource|StreamInterface $value + */ + public function addAttribute(string $name, string $dataType, $value): void + { + $valueKey = 'Binary' === $dataType ? 'BinaryValue' : 'StringValue'; + + $this->messageAttributes[$name] = [ + 'DataType' => $dataType, + $valueKey => $value, + ]; + } + + /** + * @return string|null + */ + public function getTargetArn(): ?string + { + return $this->targetArn; + } + + /** + * @param string|null $targetArn + */ + public function setTargetArn(?string $targetArn): void + { + $this->targetArn = $targetArn; + } } diff --git a/pkg/sns/SnsProducer.php b/pkg/sns/SnsProducer.php index b702d10c3..7f440c77b 100644 --- a/pkg/sns/SnsProducer.php +++ b/pkg/sns/SnsProducer.php @@ -57,6 +57,26 @@ public function send(Destination $destination, Message $message): void 'TopicArn' => $topicArn, ]; + if (null !== $message->getMessageAttributes()) { + $arguments['MessageAttributes'] = array_merge( + $arguments['MessageAttributes'], + $message->getMessageAttributes() + ); + } + + if (null !== ($structure = $message->getMessageStructure())) { + $arguments['MessageStructure'] = $structure; + } + if (null !== ($phone = $message->getPhoneNumber())) { + $arguments['PhoneNumber'] = $phone; + } + if (null !== ($subject = $message->getSubject())) { + $arguments['Subject'] = $subject; + } + if (null !== ($targetArn = $message->getTargetArn())) { + $arguments['TargetArn'] = $targetArn; + } + $result = $this->context->getSnsClient()->publish($arguments); if (false == $result->hasKey('MessageId')) { diff --git a/pkg/sns/Tests/SnsProducerTest.php b/pkg/sns/Tests/SnsProducerTest.php index f5a039702..4850b5c1d 100644 --- a/pkg/sns/Tests/SnsProducerTest.php +++ b/pkg/sns/Tests/SnsProducerTest.php @@ -126,6 +126,67 @@ public function testShouldPublish() $producer->send($destination, $message); } + /** + * @throws InvalidMessageException + */ + public function testShouldPublishWithMergedAttributes() + { + $context = $this->createSnsContextMock(); + $client = $this->createSnsClientMock(); + + $context + ->expects($this->once()) + ->method('getSnsClient') + ->will($this->returnValue($client)); + + $expectedArgument = [ + 'Message' => 'message', + 'MessageAttributes' => [ + 'Headers' => [ + 'DataType' => 'String', + 'StringValue' => '[[],[]]', + ], + 'Foo' => [ + 'DataType' => 'String', + 'StringValue' => 'foo-value', + ], + 'Bar' => [ + 'DataType' => 'Binary', + 'BinaryValue' => 'bar-val', + ], + ], + 'TopicArn' => '', + 'MessageStructure' => 'structure', + 'PhoneNumber' => 'phone', + 'Subject' => 'subject', + 'TargetArn' => 'target_arn', + ]; + + $client + ->expects($this->once()) + ->method('publish') + ->with($this->identicalTo($expectedArgument)) + ->willReturn(new Result(['MessageId' => 'theMessageId'])); + + $attributes = [ + 'Foo' => [ + 'DataType' => 'String', + 'StringValue' => 'foo-value', + ], + ]; + + $message = new SnsMessage( + 'message', [], [], $attributes, 'structure', 'phone', + 'subject', 'target_arn' + ); + $message->addAttribute('Bar', 'Binary', 'bar-val'); + + $destination = new SnsDestination('queue-name'); + + $producer = new SnsProducer($context); + $producer->send($destination, $message); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject|SnsContext */ From 35f7aec6fb7da59e9e05e5a89017d332224c0571 Mon Sep 17 00:00:00 2001 From: gpenverne Date: Thu, 21 Mar 2019 16:54:44 +0100 Subject: [PATCH 0583/1142] Minor typo fix in docblock --- pkg/enqueue/Consumption/Result.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue/Consumption/Result.php b/pkg/enqueue/Consumption/Result.php index b94b7447c..c5659bc92 100644 --- a/pkg/enqueue/Consumption/Result.php +++ b/pkg/enqueue/Consumption/Result.php @@ -13,12 +13,12 @@ class Result const ACK = Processor::ACK; /** - * @see Processor::ACK for more details + * @see Processor::REJECT for more details */ const REJECT = Processor::REJECT; /** - * @see Processor::ACK for more details + * @see Processor::REQUEUE for more details */ const REQUEUE = Processor::REQUEUE; From dfe055ccb64f4738eb0988dc3a68c1d77d93ca60 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Thu, 28 Mar 2019 15:14:15 +0200 Subject: [PATCH 0584/1142] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index df5b154aa..0c8bbbc46 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: -- [Become a sponsor](https://www.patreon.com/makasim) - [Become our client](http://forma-pro.com/) --- From a46c6067a2135c359e2f185eb15e664fbdad04b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Thu, 28 Mar 2019 23:09:05 +0100 Subject: [PATCH 0585/1142] Allow passing Client as configuration option. Prevent calling database creation if Client driver does not support QueryDriverInterface --- pkg/monitoring/InfluxDbStorage.php | 73 +++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 12 deletions(-) diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index d1e8e7c00..011837c38 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -6,6 +6,8 @@ use Enqueue\Dsn\Dsn; use InfluxDB\Client; use InfluxDB\Database; +use InfluxDB\Driver\QueryDriverInterface; +use InfluxDB\Exception as InfluxDBException; use InfluxDB\Point; class InfluxDbStorage implements StatsStorage @@ -38,6 +40,8 @@ class InfluxDbStorage implements StatsStorage * 'measurementSentMessages' => 'sent-messages', * 'measurementConsumedMessages' => 'consumed-messages', * 'measurementConsumers' => 'consumers', + * 'client' => null, # Client instance. Null by default. + * 'retentionPolicy' => null, * ] * * or @@ -59,6 +63,13 @@ public function __construct($config = 'influxdb:') } elseif (is_array($config)) { $config = empty($config['dsn']) ? $config : $this->parseDsn($config['dsn']); } elseif ($config instanceof Client) { + // Passing Client instead of array config is deprecated because it prevents setting any configuration values + // and causes library to use defaults. + @trigger_error( + sprintf('Passing %s as %s argument is deprecated. Pass it as "client" array property instead', + Client::class, + __METHOD__ + ), E_USER_DEPRECATED); $this->client = $config; $config = []; } else { @@ -74,8 +85,22 @@ public function __construct($config = 'influxdb:') 'measurementSentMessages' => 'sent-messages', 'measurementConsumedMessages' => 'consumed-messages', 'measurementConsumers' => 'consumers', + 'client' => null, + 'retentionPolicy' => null, ], $config); + if (null !== $config['client']) { + if (!$config['client'] instanceof Client) { + throw new \InvalidArgumentException(sprintf( + '%s configuration property is expected to be an instance of %s class. %s was passed instead.', + 'client', + Client::class, + gettype($config['client']) + )); + } + $this->client = $config['client']; + } + $this->config = $config; } @@ -109,7 +134,7 @@ public function pushConsumerStats(ConsumerStats $stats): void $points[] = new Point($this->config['measurementConsumers'], null, $tags, $values, $stats->getTimestampMs()); } - $this->getDb()->writePoints($points, Database::PRECISION_MILLISECONDS); + $this->doWrite($points); } public function pushConsumedMessageStats(ConsumedMessageStats $stats): void @@ -135,7 +160,7 @@ public function pushConsumedMessageStats(ConsumedMessageStats $stats): void new Point($this->config['measurementConsumedMessages'], $runtime, $tags, $values, $stats->getTimestampMs()), ]; - $this->getDb()->writePoints($points, Database::PRECISION_MILLISECONDS); + $this->doWrite($points); } public function pushSentMessageStats(SentMessageStats $stats): void @@ -158,21 +183,44 @@ public function pushSentMessageStats(SentMessageStats $stats): void new Point($this->config['measurementSentMessages'], 1, $tags, [], $stats->getTimestampMs()), ]; - $this->getDb()->writePoints($points, Database::PRECISION_MILLISECONDS); + $this->doWrite($points); } - private function getDb(): Database + private function doWrite(array $points): void { - if (null === $this->database) { - if (null === $this->client) { - $this->client = new Client( - $this->config['host'], - $this->config['port'], - $this->config['user'], - $this->config['password'] - ); + if (!$this->client || $this->client->getDriver() instanceof QueryDriverInterface) { + $this->getDb()->writePoints($points, Database::PRECISION_MILLISECONDS, $this->config['retentionPolicy']); + } else { + // Code below mirrors what `writePoints` method of Database does. + try { + $parameters = [ + 'url' => sprintf('write?db=%s&precision=%s', $this->config['db'], Database::PRECISION_MILLISECONDS), + 'database' => $this->config['db'], + 'method' => 'post', + ]; + if (null !== $this->config['retentionPolicy']) { + $parameters['url'] .= sprintf('&rp=%s', $this->config['retentionPolicy']); + } + + $this->client->write($parameters, $points); + } catch (\Exception $e) { + throw new InfluxDBException($e->getMessage(), $e->getCode()); } + } + } + + private function getDb(): Database + { + if (null === $this->client) { + $this->client = new Client( + $this->config['host'], + $this->config['port'], + $this->config['user'], + $this->config['password'] + ); + } + if (null === $this->database) { $this->database = $this->client->selectDB($this->config['db']); $this->database->create(); } @@ -200,6 +248,7 @@ private function parseDsn(string $dsn): array 'measurementSentMessages' => $dsn->getString('measurementSentMessages'), 'measurementConsumedMessages' => $dsn->getString('measurementConsumedMessages'), 'measurementConsumers' => $dsn->getString('measurementConsumers'), + 'retentionPolicy' => $dsn->getString('retentionPolicy'), ]), function ($value) { return null !== $value; }); } } From 9fbc27b7644149c002ad771ff5a9ea9a6e2e774d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 29 Mar 2019 00:04:50 +0100 Subject: [PATCH 0586/1142] Set commit_async as true by default for Kafka Provide addition configuration documentation for integrating with Symfony bundle Fixes #580 --- docs/transport/kafka.md | 56 ++++++++++++++++++++++++++++----- pkg/rdkafka/RdKafkaConsumer.php | 2 +- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/docs/transport/kafka.md b/docs/transport/kafka.md index 78ba998dc..4fefb6914 100644 --- a/docs/transport/kafka.md +++ b/docs/transport/kafka.md @@ -41,7 +41,7 @@ $connectionFactory = new RdKafkaConnectionFactory('kafka:'); $connectionFactory = new RdKafkaConnectionFactory([]); // connect to Kafka broker at example.com:1000 plus custom options -$connectionFactory = new RdKafkaConnectionFactory([ +$connectionFactory = new RdKafkaConnectionFactory([ 'global' => [ 'group.id' => uniqid('', true), 'metadata.broker.list' => 'example.com:1000', @@ -54,11 +54,11 @@ $connectionFactory = new RdKafkaConnectionFactory([ $context = $connectionFactory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('kafka:')->createContext(); ``` -## Send message to topic +## Send message to topic ```php createTopic('foo'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createQueue('foo'); $consumer = $context->createConsumer($fooQueue); -// Enable async commit to gain better performance. +// Enable async commit to gain better performance (true by default since version 0.9.9). //$consumer->setCommitAsync(true); $message = $consumer->receive(); @@ -108,7 +108,7 @@ $consumer->acknowledge($message); ## Serialize message By default the transport serializes messages to json format but you might want to use another format such as [Apache Avro](https://avro.apache.org/docs/1.2.0/). -For that you have to implement Serializer interface and set it to the context, producer or consumer. +For that you have to implement Serializer interface and set it to the context, producer or consumer. If a serializer set to context it will be injected to all consumers and producers created by the context. ```php @@ -119,7 +119,7 @@ use Enqueue\RdKafka\RdKafkaMessage; class FooSerializer implements Serializer { public function toMessage($string) {} - + public function toString(RdKafkaMessage $message) {} } @@ -145,4 +145,44 @@ $consumer->setOffset(123); $message = $consumer->receive(2000); ``` -[back to index](index.md) \ No newline at end of file +## Usage with Symfony bundle + +Set your enqueue to use rdkafka as your transport + +```yaml +# app/config/config.yml + +enqueue: + default: + transport: "rdkafka:" + client: ~ +``` + +You can also you extended configuration to pass additional options, if you don't want to pass them via DSN string or +need to pass specific options. Since rdkafka uses librdkafka (being basically a wrapper around it) most configuration +options are identical to those found at https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md. + +```yaml +# app/config/config.yml + +enqueue: + default: + transport: + dsn: "rdkafka://" + global: + ### Make sure this is unique for each application / consumer group and does not change + ### Otherwise, Kafka won't be able to track your last offset and will always start according to + ### `auto.offset.reset` setting. + ### See Kafka documentation regarding `group.id` property if you want to know more + group.id: 'foo-app' + metadata.broker.list: 'example.com:1000' + topic: + auto.offset.reset: beginning + ### Commit async is true by default since version 0.9.9. + ### It is suggested to set it to true in earlier versions since otherwise consumers become extremely slow, + ### waiting for offset to be stored on Kafka before continuing. + commit_async: true + client: ~ +``` + +[back to index](index.md) diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index 5e89f3d34..9522b32ee 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -51,7 +51,7 @@ public function __construct(KafkaConsumer $consumer, RdKafkaContext $context, Rd $this->context = $context; $this->topic = $topic; $this->subscribed = false; - $this->commitAsync = false; + $this->commitAsync = true; $this->setSerializer($serializer); } From ac396d7fd3bc2b01f687dc0415c7c1fe449ee927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 29 Mar 2019 17:49:30 +0100 Subject: [PATCH 0587/1142] Allow passing Client as configuration option. Prevent calling database creation if Client driver does not support QueryDriverInterface --- pkg/monitoring/InfluxDbStorage.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index 011837c38..ae105fec3 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -63,13 +63,6 @@ public function __construct($config = 'influxdb:') } elseif (is_array($config)) { $config = empty($config['dsn']) ? $config : $this->parseDsn($config['dsn']); } elseif ($config instanceof Client) { - // Passing Client instead of array config is deprecated because it prevents setting any configuration values - // and causes library to use defaults. - @trigger_error( - sprintf('Passing %s as %s argument is deprecated. Pass it as "client" array property instead', - Client::class, - __METHOD__ - ), E_USER_DEPRECATED); $this->client = $config; $config = []; } else { From a1a958590f9b50c75407cf7685993beb449b79c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 29 Mar 2019 20:19:34 +0100 Subject: [PATCH 0588/1142] Allow passing Client as configuration option. Prevent calling database creation if Client driver does not support QueryDriverInterface --- pkg/monitoring/InfluxDbStorage.php | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index ae105fec3..e63341943 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -59,10 +59,17 @@ public function __construct($config = 'influxdb:') if (empty($config)) { $config = []; } elseif (is_string($config)) { - $config = $this->parseDsn($config); + $config = self::parseDsn($config); } elseif (is_array($config)) { - $config = empty($config['dsn']) ? $config : $this->parseDsn($config['dsn']); + $config = empty($config['dsn']) ? $config : self::parseDsn($config['dsn']); } elseif ($config instanceof Client) { + // Passing Client instead of array config is deprecated because it prevents setting any configuration values + // and causes library to use defaults. + @trigger_error( + sprintf('Passing %s as %s argument is deprecated. Pass it as "client" array property or use createWithClient instead', + Client::class, + __METHOD__ + ), E_USER_DEPRECATED); $this->client = $config; $config = []; } else { @@ -97,6 +104,22 @@ public function __construct($config = 'influxdb:') $this->config = $config; } + /** + * @param Client $client + * @param string $config + * + * @return InfluxDbStorage + */ + public static function createWithClient(Client $client, $config = 'influxdb:'): self + { + if (is_string($config)) { + $config = self::parseDsn($config); + } + $config['client'] = $client; + + return new static($config); + } + public function pushConsumerStats(ConsumerStats $stats): void { $points = []; @@ -221,7 +244,7 @@ private function getDb(): Database return $this->database; } - private function parseDsn(string $dsn): array + private static function parseDsn(string $dsn): array { $dsn = Dsn::parseFirst($dsn); From 81845abd0172739d305088450db898a44dd73e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 29 Mar 2019 20:37:07 +0100 Subject: [PATCH 0589/1142] Allow passing Client as configuration option. Prevent calling database creation if Client driver does not support QueryDriverInterface --- pkg/monitoring/InfluxDbStorage.php | 37 +++++++++++++----------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index e63341943..401d79ddb 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -204,8 +204,22 @@ public function pushSentMessageStats(SentMessageStats $stats): void private function doWrite(array $points): void { - if (!$this->client || $this->client->getDriver() instanceof QueryDriverInterface) { - $this->getDb()->writePoints($points, Database::PRECISION_MILLISECONDS, $this->config['retentionPolicy']); + if (null === $this->client) { + $this->client = new Client( + $this->config['host'], + $this->config['port'], + $this->config['user'], + $this->config['password'] + ); + } + + if ($this->client->getDriver() instanceof QueryDriverInterface) { + if (null === $this->database) { + $this->database = $this->client->selectDB($this->config['db']); + $this->database->create(); + } + + $this->database->writePoints($points, Database::PRECISION_MILLISECONDS, $this->config['retentionPolicy']); } else { // Code below mirrors what `writePoints` method of Database does. try { @@ -225,25 +239,6 @@ private function doWrite(array $points): void } } - private function getDb(): Database - { - if (null === $this->client) { - $this->client = new Client( - $this->config['host'], - $this->config['port'], - $this->config['user'], - $this->config['password'] - ); - } - - if (null === $this->database) { - $this->database = $this->client->selectDB($this->config['db']); - $this->database->create(); - } - - return $this->database; - } - private static function parseDsn(string $dsn): array { $dsn = Dsn::parseFirst($dsn); From 68c47fd410ca638b54193f606c57aa4f960b56d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 29 Mar 2019 20:55:34 +0100 Subject: [PATCH 0590/1142] Allow passing Client as configuration option. Prevent calling database creation if Client driver does not support QueryDriverInterface --- docs/monitoring.md | 52 ++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/docs/monitoring.md b/docs/monitoring.md index 12fa85fd1..93ea8876e 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -9,19 +9,19 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Monitoring. -Enqueue provides a tool for monitoring message queues. +Enqueue provides a tool for monitoring message queues. With it, you can control how many messages were sent, how many processed successfuly or failed. -How many consumers are working, their up time, processed messages stats, memory usage and system load. +How many consumers are working, their up time, processed messages stats, memory usage and system load. The tool could be integrated with virtually any analytics and monitoring platform. -There are several integration: +There are several integration: * [Datadog StatsD](https://datadoghq.com) * [InfluxDB](https://www.influxdata.com/) and [Grafana](https://grafana.com/) - * [WAMP (Web Application Messaging Protocol)](https://wamp-proto.org/) + * [WAMP (Web Application Messaging Protocol)](https://wamp-proto.org/) We are working on a JS\WAMP based real-time UI tool, for more information please [contact us](opensource@forma-pro.com). ![Grafana Monitoring](images/grafana_monitoring.jpg) -[contact us](opensource@forma-pro.com) if need a Grafana template such as on the picture. +[contact us](opensource@forma-pro.com) if need a Grafana template such as on the picture. * [Installation](#installation) * [Track sent messages](#track-sent-messages) @@ -40,7 +40,7 @@ We are working on a JS\WAMP based real-time UI tool, for more information please composer req enqueue/monitoring:0.9.x-dev ``` -## Track sent messages +## Track sent messages ```php create('influxdb://127.0.0.1:8086?db=foo'); $statsStorage->pushSentMessageStats(new SentMessageStats( (int) (microtime(true) * 1000), // timestamp - 'queue_name', // queue + 'queue_name', // queue 'aMessageId', 'aCorrelationId', [], // headers @@ -76,7 +76,7 @@ $context->createProducer()->send($queue, $message); $statsStorage = (new GenericStatsStorageFactory())->create('influxdb://127.0.0.1:8086?db=foo'); $statsStorage->pushSentMessageStats(new SentMessageStats( (int) (microtime(true) * 1000), - $queue->getQueueName(), + $queue->getQueueName(), $message->getMessageId(), $message->getCorrelationId(), $message->getHeaders()[], @@ -99,7 +99,7 @@ $statsStorage = (new GenericStatsStorageFactory())->create('influxdb://127.0.0.1 $statsStorage->pushConsumedMessageStats(new ConsumedMessageStats( 'consumerId', (int) (microtime(true) * 1000), // now - $receivedAt, + $receivedAt, 'aQueue', 'aMessageId', 'aCorrelationId', @@ -127,16 +127,16 @@ $consumer = $context->createConsumer($queue); $consumerId = uniqid('consumer-id', true); // we suggest using UUID here if ($message = $consumer->receiveNoWait()) { $receivedAt = (int) (microtime(true) * 1000); - + // heavy processing here. - + $consumer->acknowledge($message); - + $statsStorage = (new GenericStatsStorageFactory())->create('influxdb://127.0.0.1:8086?db=foo'); $statsStorage->pushConsumedMessageStats(new ConsumedMessageStats( $consumerId, (int) (microtime(true) * 1000), // now - $receivedAt, + $receivedAt, $queue->getQueueName(), $message->getMessageId(), $message->getCorrelationId(), @@ -151,7 +151,7 @@ if ($message = $consumer->receiveNoWait()) { ## Track consumer metrics Consumers are long running processes. It vital to know how many of them are running right now, how they perform, how much memory do they use and so. -This example shows how you can send such metrics. +This example shows how you can send such metrics. Call this code from time to time between processing messages. ```php @@ -165,13 +165,13 @@ $statsStorage = (new GenericStatsStorageFactory())->create('influxdb://127.0.0.1 $statsStorage->pushConsumerStats(new ConsumerStats( 'consumerId', (int) (microtime(true) * 1000), // now - $startedAt, + $startedAt, null, // finished at - true, // is started? + true, // is started? false, // is finished? false, // is failed ['foo'], // consume from queues - 123, // received messages + 123, // received messages 120, // acknowledged messages 1, // rejected messages 1, // requeued messages @@ -182,7 +182,7 @@ $statsStorage->pushConsumerStats(new ConsumerStats( ## Consumption extension -There is an extension `ConsumerMonitoringExtension` for Enqueue [QueueConsumer](quick_tour.md#consumption). +There is an extension `ConsumerMonitoringExtension` for Enqueue [QueueConsumer](quick_tour.md#consumption). It could collect consumed messages and consumer stats for you. ```php @@ -236,8 +236,16 @@ There are available options: * 'measurementSentMessages' => 'sent-messages', * 'measurementConsumedMessages' => 'consumed-messages', * 'measurementConsumers' => 'consumers', +* 'client' => null, +* 'retentionPolicy' => null, ``` +You can pass InfluxDB\Client instance in `client` option. Otherwise, it will be created on first use according to other +options. + +If your InfluxDB\Client uses driver that implements InfluxDB\Driver\QueryDriverInterface, then database will be +automatically created for you if it doesn't exist. Default InfluxDB\Client will also do that. + ## Datadog storage Install additional packages: @@ -256,7 +264,7 @@ $statsStorage = (new GenericStatsStorageFactory())->create('datadog://127.0.0.1: For best experience please adjust units and types in metric summary. Example dashboard: - + ![Datadog monitoring](images/datadog_monitoring.png) @@ -311,7 +319,7 @@ There are available options: ## Symfony App -You have to register some services in order to incorporate monitoring facilities into your Symfony application. +You have to register some services in order to incorporate monitoring facilities into your Symfony application. ```yaml # config/packages/enqueue.yaml @@ -325,11 +333,11 @@ enqueue: transport: 'amqp://guest:guest@foo:5672/%2f' monitoring: 'wamp://127.0.0.1:9090?topic=stats' client: ~ - + datadog: transport: 'amqp://guest:guest@foo:5672/%2f' monitoring: 'datadog://127.0.0.1:8125?batched=false' client: ~ ``` -[back to index](index.md) +[back to index](index.md) From 21e89260d1b5145a6f8190ab631fd3f269bc7b26 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Mon, 1 Apr 2019 17:59:31 +0200 Subject: [PATCH 0591/1142] better doc for traceable message producer --- docs/bundle/functional_testing.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/bundle/functional_testing.md b/docs/bundle/functional_testing.md index 6afa4f4c9..ae25293a9 100644 --- a/docs/bundle/functional_testing.md +++ b/docs/bundle/functional_testing.md @@ -34,7 +34,7 @@ enqueue: ## Traceable message producer -Imagine you have a service that internally sends a message and you have to find out was the message sent or not. +Imagine you have a service `my_service` with a method `someMethod()` that internally sends a message and you have to find out was the message sent or not. There is a solution for that. You have to enable traceable message producer in test environment. ```yaml @@ -65,10 +65,11 @@ class FooTest extends WebTestCase public function testMessageSentToFooTopic() { - $service = $this->client->getContainer()->get('a_service'); + // Use your own business logic here: + $service = $this->client->getContainer()->get('my_service'); - // the method calls inside $producer->send('fooTopic', 'messageBody'); - $service->do(); + // someMethod() is part of your business logic and is calling somewhere $producer->send('fooTopic', 'messageBody'); + $service->someMethod(); $traces = $this->getProducer()->getTopicTraces('fooTopic'); @@ -86,4 +87,4 @@ class FooTest extends WebTestCase } ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) From 421e6cf3c2ad854e99a37662d1d7a1c0fd5a432b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 1 Apr 2019 23:17:24 +0200 Subject: [PATCH 0592/1142] Fix DBAL Consumer duplicating messages when rejecting with requeue --- pkg/dbal/DbalConsumer.php | 6 ++--- .../Tests/Functional/DbalConsumerTest.php | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/pkg/dbal/DbalConsumer.php b/pkg/dbal/DbalConsumer.php index e95a8f513..9d99d5a58 100644 --- a/pkg/dbal/DbalConsumer.php +++ b/pkg/dbal/DbalConsumer.php @@ -100,16 +100,14 @@ public function reject(Message $message, bool $requeue = false): void { InvalidMessageException::assertMessageInstanceOf($message, DbalMessage::class); + $this->acknowledge($message); + if ($requeue) { $message = clone $message; $message->setRedelivered(false); $this->getContext()->createProducer()->send($this->queue, $message); - - return; } - - $this->deleteMessage($message->getDeliveryId()); } protected function getContext(): DbalContext diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index 1f8757e15..fa74ae781 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -144,6 +144,31 @@ public function testShouldDeleteExpiredMessage() $this->assertSame(0, $this->getQuerySize()); } + public function testShouldRemoveOriginalMessageThatHaveBeenRejectedWithRequeu() + { + $context = $this->context; + $queue = $context->createQueue(__METHOD__); + + $consumer = $context->createConsumer($queue); + + // guard + $this->assertSame(0, $this->getQuerySize()); + + $producer = $context->createProducer(); + + /** @var DbalMessage $message */ + $message = $context->createMessage(__CLASS__); + $producer->send($queue, $message); + + $this->assertCount(1, $this->getQuerySize()); + + $message = $consumer->receive(100); // 100ms + + $this->assertInstanceOf(DbalMessage::class, $message); + $consumer->reject($message, true); + $this->assertCount(1, $this->getQuerySize()); + } + private function getQuerySize(): int { return (int) $this->context->getDbalConnection() From a3d741503bb38a66a77f8592b7ae2c584bfc1d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 1 Apr 2019 23:25:22 +0200 Subject: [PATCH 0593/1142] Fix DBAL Consumer duplicating messages when rejecting with requeue --- pkg/dbal/Tests/Functional/DbalConsumerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index fa74ae781..fc6f54927 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -144,7 +144,7 @@ public function testShouldDeleteExpiredMessage() $this->assertSame(0, $this->getQuerySize()); } - public function testShouldRemoveOriginalMessageThatHaveBeenRejectedWithRequeu() + public function testShouldRemoveOriginalMessageThatHaveBeenRejectedWithRequeue() { $context = $this->context; $queue = $context->createQueue(__METHOD__); From 6967a04c32a253595b69d5f1b91df7b1c8e5dbe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 1 Apr 2019 23:38:54 +0200 Subject: [PATCH 0594/1142] Fix DbalConsumer message expecting to have delivery ID when rejecting --- pkg/dbal/Tests/DbalConsumerTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index 85130893d..c042c5c86 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -169,6 +169,7 @@ public function testRejectShouldReSendMessageToSameQueueOnRequeue() $message = new DbalMessage(); $message->setBody('theBody'); + $message->setDeliveryId(__METHOD__); $producerMock = $this->createProducerMock(); $producerMock From 4e42a9cc42f6854659373bc5318cf5638b7b7389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Tue, 2 Apr 2019 00:01:55 +0200 Subject: [PATCH 0595/1142] Fix DBAL Consumer duplicating messages when rejecting with requeue Fix test because I'm dumb. --- pkg/dbal/Tests/Functional/DbalConsumerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index fc6f54927..0cca7c42e 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -166,7 +166,7 @@ public function testShouldRemoveOriginalMessageThatHaveBeenRejectedWithRequeue() $this->assertInstanceOf(DbalMessage::class, $message); $consumer->reject($message, true); - $this->assertCount(1, $this->getQuerySize()); + $this->assertSame(1, $this->getQuerySize()); } private function getQuerySize(): int From 270aa2879b218744abefd5028113548c1ca4b0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Tue, 2 Apr 2019 00:06:45 +0200 Subject: [PATCH 0596/1142] Fix DBAL Consumer duplicating messages when rejecting with requeue Fix test because I'm dumb. Now it's good. Seriously... --- pkg/dbal/Tests/Functional/DbalConsumerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index 0cca7c42e..686f87d16 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -160,7 +160,7 @@ public function testShouldRemoveOriginalMessageThatHaveBeenRejectedWithRequeue() $message = $context->createMessage(__CLASS__); $producer->send($queue, $message); - $this->assertCount(1, $this->getQuerySize()); + $this->assertSame(1, $this->getQuerySize()); $message = $consumer->receive(100); // 100ms From 858e8a78a8cd5c22abc5003880e105c038f014cf Mon Sep 17 00:00:00 2001 From: nightlinus Date: Thu, 4 Apr 2019 12:51:00 +0300 Subject: [PATCH 0597/1142] Fix bunny producer to properly map headers to expected by bunny headers --- pkg/amqp-bunny/AmqpContext.php | 103 ++++++++++++++++++++++ pkg/amqp-bunny/AmqpProducer.php | 1 + pkg/amqp-bunny/Tests/AmqpProducerTest.php | 34 ++++++- 3 files changed, 135 insertions(+), 3 deletions(-) diff --git a/pkg/amqp-bunny/AmqpContext.php b/pkg/amqp-bunny/AmqpContext.php index 9338e12b0..f57554335 100644 --- a/pkg/amqp-bunny/AmqpContext.php +++ b/pkg/amqp-bunny/AmqpContext.php @@ -312,6 +312,7 @@ public function getBunnyChannel(): Channel public function convertMessage(BunnyMessage $bunnyMessage): InteropAmqpMessage { $headers = $bunnyMessage->headers; + $headers = $this->convertHeadersFromBunnyNotation($headers); $properties = []; if (isset($headers['application_headers'])) { @@ -333,4 +334,106 @@ public function convertMessage(BunnyMessage $bunnyMessage): InteropAmqpMessage return $message; } + + /** @internal It must be used here and in the producer only */ + public function convertHeadersToBunnyNotation(array $headers): array + { + if (isset($headers['content_type'])) { + $headers['content-type'] = $headers['content_type']; + unset($headers['content_type']); + } + + if (isset($headers['content_encoding'])) { + $headers['content-encoding'] = $headers['content_encoding']; + unset($headers['content_encoding']); + } + + if (isset($headers['delivery_mode'])) { + $headers['delivery-mode'] = $headers['delivery_mode']; + unset($headers['delivery_mode']); + } + + if (isset($headers['correlation_id'])) { + $headers['correlation-id'] = $headers['correlation_id']; + unset($headers['correlation_id']); + } + + if (isset($headers['reply_to'])) { + $headers['reply-to'] = $headers['reply_to']; + unset($headers['reply_to']); + } + + if (isset($headers['message_id'])) { + $headers['message-id'] = $headers['message_id']; + unset($headers['message_id']); + } + + if (isset($headers['user_id'])) { + $headers['user-id'] = $headers['user_id']; + unset($headers['user_id']); + } + + if (isset($headers['app_id'])) { + $headers['app-id'] = $headers['app_id']; + unset($headers['app_id']); + } + + if (isset($headers['cluster_id'])) { + $headers['cluster-id'] = $headers['cluster_id']; + unset($headers['cluster_id']); + } + + return $headers; + } + + /** @internal It must be used here and in the consumer only */ + public function convertHeadersFromBunnyNotation(array $bunnyHeaders): array + { + if (isset($bunnyHeaders['content-type'])) { + $bunnyHeaders['content_type'] = $bunnyHeaders['content-type']; + unset($bunnyHeaders['content-type']); + } + + if (isset($bunnyHeaders['content-encoding'])) { + $bunnyHeaders['content_encoding'] = $bunnyHeaders['content-encoding']; + unset($bunnyHeaders['content-encoding']); + } + + if (isset($bunnyHeaders['delivery-mode'])) { + $bunnyHeaders['delivery_mode'] = $bunnyHeaders['delivery-mode']; + unset($bunnyHeaders['delivery-mode']); + } + + if (isset($bunnyHeaders['correlation-id'])) { + $bunnyHeaders['correlation_id'] = $bunnyHeaders['correlation-id']; + unset($bunnyHeaders['correlation-id']); + } + + if (isset($bunnyHeaders['reply-to'])) { + $bunnyHeaders['reply_to'] = $bunnyHeaders['reply-to']; + unset($bunnyHeaders['reply-to']); + } + + if (isset($bunnyHeaders['message-id'])) { + $bunnyHeaders['message_id'] = $bunnyHeaders['message-id']; + unset($bunnyHeaders['message-id']); + } + + if (isset($bunnyHeaders['user-id'])) { + $bunnyHeaders['user_id'] = $bunnyHeaders['user-id']; + unset($bunnyHeaders['user-id']); + } + + if (isset($bunnyHeaders['app-id'])) { + $bunnyHeaders['app_id'] = $bunnyHeaders['app-id']; + unset($bunnyHeaders['app-id']); + } + + if (isset($bunnyHeaders['cluster-id'])) { + $bunnyHeaders['cluster_id'] = $bunnyHeaders['cluster-id']; + unset($bunnyHeaders['cluster-id']); + } + + return $bunnyHeaders; + } } diff --git a/pkg/amqp-bunny/AmqpProducer.php b/pkg/amqp-bunny/AmqpProducer.php index e052cd312..76892ebeb 100644 --- a/pkg/amqp-bunny/AmqpProducer.php +++ b/pkg/amqp-bunny/AmqpProducer.php @@ -136,6 +136,7 @@ private function doSend(InteropAmqpDestination $destination, InteropAmqpMessage } $amqpProperties = $message->getHeaders(); + $amqpProperties = $this->context->convertHeadersToBunnyNotation($amqpProperties); if (array_key_exists('timestamp', $amqpProperties) && null !== $amqpProperties['timestamp']) { $amqpProperties['timestamp'] = \DateTime::createFromFormat('U', (string) $amqpProperties['timestamp']); diff --git a/pkg/amqp-bunny/Tests/AmqpProducerTest.php b/pkg/amqp-bunny/Tests/AmqpProducerTest.php index 6a476790b..df33598b2 100644 --- a/pkg/amqp-bunny/Tests/AmqpProducerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpProducerTest.php @@ -134,11 +134,39 @@ public function testShouldSetMessageHeaders() $channel ->expects($this->once()) ->method('publish') - ->with($this->anything(), ['content_type' => 'text/plain']) + ->with($this->anything(), ['misc' => 'text/plain']) ; $producer = new AmqpProducer($channel, $this->createContextMock()); - $producer->send(new AmqpTopic('name'), new AmqpMessage('body', [], ['content_type' => 'text/plain'])); + $producer->send(new AmqpTopic('name'), new AmqpMessage('body', [], ['misc' => 'text/plain'])); + } + + public function testShouldConvertStandartHeadersToBunnyFormat() + { + $channel = $this->createBunnyChannelMock(); + $expectedHeaders = [ + 'content-encoding' => 'utf8', + 'content-type' => 'text/plain', + 'message-id' => 'id', + 'correlation-id' => 'correlation', + 'reply-to' => 'reply', + 'delivery-mode' => 2, + ]; + $channel + ->expects($this->once()) + ->method('publish') + ->with($this->anything(), $expectedHeaders); + + $producer = new AmqpProducer($channel, $this->createContextMock()); + $message = new AmqpMessage('body', []); + $message->setMessageId('id'); + $message->setReplyTo('reply'); + $message->setDeliveryMode(2); + $message->setContentType('text/plain'); + $message->setContentEncoding('utf8'); + $message->setCorrelationId('correlation'); + + $producer->send(new AmqpTopic('name'), $message); } public function testShouldSetMessageProperties() @@ -200,7 +228,7 @@ private function createBunnyChannelMock() */ private function createContextMock() { - return $this->createMock(AmqpContext::class); + return $this->createPartialMock(AmqpContext::class, []); } /** From d80a75876203e42da251e84493c1d0d25c6e236c Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 4 Apr 2019 15:31:53 +0300 Subject: [PATCH 0598/1142] Release 0.9.9 --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e446d49c2..b5f026489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Change Log +## [0.9.9](https://github.com/php-enqueue/enqueue-dev/tree/0.9.9) (2019-04-04) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.8...0.9.9) + +**Merged pull requests:** + +- \[amqp-bunny\] Fix bunny producer to properly map headers to expected by bunny headers [\#816](https://github.com/php-enqueue/enqueue-dev/pull/816) ([nightlinus](https://github.com/nightlinus)) +- \[amqp-bunny\]\[doc\] Update amqp\_bunny.md [\#797](https://github.com/php-enqueue/enqueue-dev/pull/797) ([enumag](https://github.com/enumag)) +- \[dbal\] Fix DBAL Consumer duplicating messages when rejecting with requeue [\#815](https://github.com/php-enqueue/enqueue-dev/pull/815) ([Steveb-p](https://github.com/Steveb-p)) +- \[rdkafka\] Set `commit\_async` as true by default for Kafka, update docs [\#810](https://github.com/php-enqueue/enqueue-dev/pull/810) ([Steveb-p](https://github.com/Steveb-p)) +- \[rdkafka\] stats\_cb support [\#798](https://github.com/php-enqueue/enqueue-dev/pull/798) ([fkulakov](https://github.com/fkulakov)) +- \[Monitoring\]\[InfluxDB\] Allow passing Client as configuration option. [\#809](https://github.com/php-enqueue/enqueue-dev/pull/809) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] better doc for traceable message producer [\#813](https://github.com/php-enqueue/enqueue-dev/pull/813) ([sylfabre](https://github.com/sylfabre)) +- \[doc\] Minor typo fix in docblock [\#805](https://github.com/php-enqueue/enqueue-dev/pull/805) ([gpenverne](https://github.com/gpenverne)) +- fix comment on QueueConsumer constructor [\#796](https://github.com/php-enqueue/enqueue-dev/pull/796) ([kaznovac](https://github.com/kaznovac)) + ## [0.9.8](https://github.com/php-enqueue/enqueue-dev/tree/0.9.8) (2019-02-27) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.7...0.9.8) From e399498922ed4d0a0056208bf10f0f1abfa989d8 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 4 Apr 2019 15:33:09 +0300 Subject: [PATCH 0599/1142] fix release --- bin/release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/release b/bin/release index 41735ff64..c4179d307 100755 --- a/bin/release +++ b/bin/release @@ -22,7 +22,7 @@ git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRE ./bin/subtree-split -for REMOTE in origin stomp amqp-ext amqp-lib amqp-bunny amqp-tools pheanstalk gearman sqs gps fs redis dbal null rdkafka enqueue simple-client enqueue-bundle job-queue test async-event-dispatcher async-command mongodb wamp monitoring dsn +for REMOTE in origin stomp amqp-ext amqp-lib amqp-bunny amqp-tools pheanstalk gearman sqs sns snsqs gps fs redis dbal null rdkafka enqueue simple-client enqueue-bundle job-queue test async-event-dispatcher async-command mongodb wamp monitoring dsn do echo "" echo "" From e68edbf6e3393a081acc9601ae83719e98c0e532 Mon Sep 17 00:00:00 2001 From: Piet Bijl Date: Mon, 8 Apr 2019 09:18:28 +0200 Subject: [PATCH 0600/1142] Typo on the tag --- docs/client/extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/client/extensions.md b/docs/client/extensions.md index 19f40fc78..979d13d60 100644 --- a/docs/client/extensions.md +++ b/docs/client/extensions.md @@ -46,7 +46,7 @@ services: timestamp_message_extension: class: Acme\TimestampMessageExtension tags: - - { name: 'enqueue.client.extensions' } + - { name: 'enqueue.client.extension' } ``` You can add `priority` attribute with a number. The higher value you set the earlier the extension is called. From 298db0ab507b989a72c1b092bdf407197f373712 Mon Sep 17 00:00:00 2001 From: nightlinus Date: Tue, 9 Apr 2019 12:37:22 +0300 Subject: [PATCH 0601/1142] Fix heartbeat configuration in bunny with 0 (off) value When bunny doesn't see heartbeat key in bunnyConfig it set default value to 60 seconds. So when one set hearbeat to zero, code ignore setting this key to bunnyConfig --- pkg/amqp-bunny/AmqpConnectionFactory.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/amqp-bunny/AmqpConnectionFactory.php b/pkg/amqp-bunny/AmqpConnectionFactory.php index 241929abe..ca56d428c 100644 --- a/pkg/amqp-bunny/AmqpConnectionFactory.php +++ b/pkg/amqp-bunny/AmqpConnectionFactory.php @@ -87,6 +87,7 @@ private function establishConnection(): BunnyClient $bunnyConfig['password'] = $this->config->getPass(); $bunnyConfig['read_write_timeout'] = min($this->config->getReadTimeout(), $this->config->getWriteTimeout()); $bunnyConfig['timeout'] = $this->config->getConnectionTimeout(); + $bunnyConfig['heartbeat'] = $this->config->getHeartbeat(); // @see https://github.com/php-enqueue/enqueue-dev/issues/229 // $bunnyConfig['persistent'] = $this->config->isPersisted(); @@ -94,10 +95,6 @@ private function establishConnection(): BunnyClient // $bunnyConfig['path'] = 'enqueue';//$this->config->getOption('path', $this->config->getOption('vhost')); // } - if ($this->config->getHeartbeat()) { - $bunnyConfig['heartbeat'] = $this->config->getHeartbeat(); - } - if (null !== $this->config->getOption('tcp_nodelay')) { $bunnyConfig['tcp_nodelay'] = $this->config->getOption('tcp_nodelay'); } From 8b40959e97ed22eff98aa876db67760cb930c833 Mon Sep 17 00:00:00 2001 From: Yanick Witschi Date: Wed, 10 Apr 2019 16:56:18 +0200 Subject: [PATCH 0602/1142] Fixed docs --- pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php b/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php index 5cc1a6507..54dba4bf7 100644 --- a/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php +++ b/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php @@ -117,7 +117,7 @@ public static function getQueueConsumerConfiguration(string $name = 'consumption ->integerNode('receive_timeout') ->min(0) ->defaultValue(10000) - ->info('the time in milliseconds queue consumer waits for a message (100 ms by default)') + ->info('the time in milliseconds queue consumer waits for a message (10000 ms by default)') ->end() ; From d9a4006e17f2efaae15522c32df15eff29b191d0 Mon Sep 17 00:00:00 2001 From: Alessandro Niciforo Date: Fri, 19 Apr 2019 16:57:19 +0200 Subject: [PATCH 0603/1142] Add support for using the /topic prefix instead of /exchange. RabbitMQ needs the /exchange prefix for publishing on an exchange, while ActiveMQ needs the /topic prefix for publishing on a topic --- pkg/stomp/StompContext.php | 12 ++++++++++-- pkg/stomp/Tests/StompContextTest.php | 14 +++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index e03b11cb6..6ecac0d9c 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -23,6 +23,11 @@ class StompContext implements Context */ private $stomp; + /** + * @var bool + */ + private $useExchangePrefix; + /** * @var callable */ @@ -30,8 +35,9 @@ class StompContext implements Context /** * @param BufferedStompClient|callable $stomp + * @param bool $useExchangePrefix */ - public function __construct($stomp) + public function __construct($stomp, $useExchangePrefix = true) { if ($stomp instanceof BufferedStompClient) { $this->stomp = $stomp; @@ -40,6 +46,8 @@ public function __construct($stomp) } else { throw new \InvalidArgumentException('The stomp argument must be either BufferedStompClient or callable that return BufferedStompClient.'); } + + $this->useExchangePrefix = $useExchangePrefix; } /** @@ -84,7 +92,7 @@ public function createTopic(string $name): Topic { if (0 !== strpos($name, '/')) { $destination = new StompDestination(); - $destination->setType(StompDestination::TYPE_EXCHANGE); + $destination->setType($this->useExchangePrefix ? StompDestination::TYPE_EXCHANGE : StompDestination::TYPE_TOPIC); $destination->setStompName($name); return $destination; diff --git a/pkg/stomp/Tests/StompContextTest.php b/pkg/stomp/Tests/StompContextTest.php index 49297d3e1..69b577e85 100644 --- a/pkg/stomp/Tests/StompContextTest.php +++ b/pkg/stomp/Tests/StompContextTest.php @@ -79,7 +79,7 @@ public function testCreateQueueShouldCreateDestinationIfNameIsFullDestinationStr $this->assertEquals('/amq/queue/name/routing-key', $destination->getQueueName()); } - public function testShouldCreateTopicInstance() + public function testShouldCreateTopicInstanceWithExchangePrefix() { $context = new StompContext($this->createStompClientMock()); @@ -91,6 +91,18 @@ public function testShouldCreateTopicInstance() $this->assertSame(StompDestination::TYPE_EXCHANGE, $topic->getType()); } + public function testShouldCreateTopicInstanceWithTopicPrefix() + { + $context = new StompContext($this->createStompClientMock(), false); + + $topic = $context->createTopic('the name'); + + $this->assertInstanceOf(StompDestination::class, $topic); + $this->assertSame('/topic/the name', $topic->getQueueName()); + $this->assertSame('/topic/the name', $topic->getTopicName()); + $this->assertSame(StompDestination::TYPE_TOPIC, $topic->getType()); + } + public function testCreateTopicShouldCreateDestinationIfNameIsFullDestinationString() { $context = new StompContext($this->createStompClientMock()); From ff5daa91434fb772fda9b2ee4d9b7227b1bc91ee Mon Sep 17 00:00:00 2001 From: Alessandro Niciforo Date: Fri, 19 Apr 2019 17:36:12 +0200 Subject: [PATCH 0604/1142] fix style --- pkg/stomp/StompContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index 6ecac0d9c..2824e0b27 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -35,7 +35,7 @@ class StompContext implements Context /** * @param BufferedStompClient|callable $stomp - * @param bool $useExchangePrefix + * @param bool $useExchangePrefix */ public function __construct($stomp, $useExchangePrefix = true) { From 47f8bcf6d115129f3d4e4ea41272153405f9f973 Mon Sep 17 00:00:00 2001 From: Alessandro Niciforo Date: Sat, 20 Apr 2019 00:03:04 +0200 Subject: [PATCH 0605/1142] use the scheme extension to distinguish an ActiveMQ target from a RabbitMQ target --- docs/transport/stomp.md | 6 +++ pkg/stomp/StompConnectionFactory.php | 19 +++++++- .../StompConnectionFactoryConfigTest.php | 43 +++++++++++++++++++ .../Tests/StompConnectionFactoryTest.php | 25 +++++++++++ 4 files changed, 91 insertions(+), 2 deletions(-) diff --git a/docs/transport/stomp.md b/docs/transport/stomp.md index c7b460dc5..d5cc79868 100644 --- a/docs/transport/stomp.md +++ b/docs/transport/stomp.md @@ -36,6 +36,12 @@ $factory = new StompConnectionFactory('stomp:'); // same as above $factory = new StompConnectionFactory([]); +// connect via stomp to RabbitMQ (default) - the topic names are prefixed with /exchange +$factory = new StompConnectionFactory('stomp+rabbitmq:'); + +// connect via stomp to ActiveMQ - the topic names are prefixed with /topic +$factory = new StompConnectionFactory('stomp+activemq:'); + // connect to stomp broker at example.com port 1000 using $factory = new StompConnectionFactory([ 'host' => 'example.com', diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index c88716308..764145ca2 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -11,6 +11,9 @@ class StompConnectionFactory implements ConnectionFactory { + const SCHEME_EXT_ACTIVEMQ = 'activemq'; + const SCHEME_EXT_RABBITMQ = 'rabbitmq'; + /** * @var array */ @@ -66,13 +69,15 @@ public function __construct($config = 'stomp:') */ public function createContext(): Context { + $useExchangePrefix = self::SCHEME_EXT_RABBITMQ === $this->config['target'] ? true : false; + if ($this->config['lazy']) { return new StompContext(function () { return $this->establishConnection(); - }); + }, $useExchangePrefix); } - return new StompContext($this->establishConnection()); + return new StompContext($this->establishConnection(), $useExchangePrefix); } private function establishConnection(): BufferedStompClient @@ -103,7 +108,16 @@ private function parseDsn(string $dsn): array throw new \LogicException(sprintf('The given DSN is not supported. Must start with "stomp:".')); } + $schemeExtension = current($dsn->getSchemeExtensions()); + if (false === $schemeExtension) { + $schemeExtension = self::SCHEME_EXT_RABBITMQ; + } + if (self::SCHEME_EXT_ACTIVEMQ !== $schemeExtension && self::SCHEME_EXT_RABBITMQ !== $schemeExtension) { + throw new \LogicException(sprintf('The given DSN is not supported. The scheme extension "%s" provided is invalid. It must be one of "%s" or "%s".', $schemeExtension, self::SCHEME_EXT_ACTIVEMQ, self::SCHEME_EXT_RABBITMQ)); + } + return array_filter(array_replace($dsn->getQuery(), [ + 'target' => $schemeExtension, 'host' => $dsn->getHost(), 'port' => $dsn->getPort(), 'login' => $dsn->getUser(), @@ -120,6 +134,7 @@ private function parseDsn(string $dsn): array private function defaultConfig(): array { return [ + 'target' => self::SCHEME_EXT_RABBITMQ, 'host' => 'localhost', 'port' => 61613, 'login' => 'guest', diff --git a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php index e8705a010..af8e71bd7 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php @@ -55,6 +55,7 @@ public static function provideConfigs() yield [ null, [ + 'target' => 'rabbitmq', 'host' => 'localhost', 'port' => 61613, 'login' => 'guest', @@ -71,6 +72,7 @@ public static function provideConfigs() yield [ 'stomp:', [ + 'target' => 'rabbitmq', 'host' => 'localhost', 'port' => 61613, 'login' => 'guest', @@ -87,6 +89,7 @@ public static function provideConfigs() yield [ [], [ + 'target' => 'rabbitmq', 'host' => 'localhost', 'port' => 61613, 'login' => 'guest', @@ -103,6 +106,43 @@ public static function provideConfigs() yield [ 'stomp://localhost:1234?foo=bar&lazy=0&sync=true', [ + 'target' => 'rabbitmq', + 'host' => 'localhost', + 'port' => 1234, + 'login' => 'guest', + 'password' => 'guest', + 'vhost' => '/', + 'buffer_size' => 1000, + 'connection_timeout' => 1, + 'sync' => true, + 'lazy' => false, + 'foo' => 'bar', + 'ssl_on' => false, + ], + ]; + + yield [ + 'stomp+activemq://localhost:1234?foo=bar&lazy=0&sync=true', + [ + 'target' => 'activemq', + 'host' => 'localhost', + 'port' => 1234, + 'login' => 'guest', + 'password' => 'guest', + 'vhost' => '/', + 'buffer_size' => 1000, + 'connection_timeout' => 1, + 'sync' => true, + 'lazy' => false, + 'foo' => 'bar', + 'ssl_on' => false, + ], + ]; + + yield [ + 'stomp+rabbitmq://localhost:1234?foo=bar&lazy=0&sync=true', + [ + 'target' => 'rabbitmq', 'host' => 'localhost', 'port' => 1234, 'login' => 'guest', @@ -120,6 +160,7 @@ public static function provideConfigs() yield [ ['dsn' => 'stomp://localhost:1234/theVhost?foo=bar&lazy=0&sync=true', 'baz' => 'bazVal', 'foo' => 'fooVal'], [ + 'target' => 'rabbitmq', 'host' => 'localhost', 'port' => 1234, 'login' => 'guest', @@ -138,6 +179,7 @@ public static function provideConfigs() yield [ ['dsn' => 'stomp:///%2f'], [ + 'target' => 'rabbitmq', 'host' => 'localhost', 'port' => 61613, 'login' => 'guest', @@ -154,6 +196,7 @@ public static function provideConfigs() yield [ ['host' => 'localhost', 'port' => 1234, 'foo' => 'bar'], [ + 'target' => 'rabbitmq', 'host' => 'localhost', 'port' => 1234, 'login' => 'guest', diff --git a/pkg/stomp/Tests/StompConnectionFactoryTest.php b/pkg/stomp/Tests/StompConnectionFactoryTest.php index 18a13463f..91986e6d0 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryTest.php @@ -25,6 +25,31 @@ public function testShouldCreateLazyContext() $this->assertInstanceOf(StompContext::class, $context); $this->assertAttributeEquals(null, 'stomp', $context); + $this->assertAttributeEquals(true, 'useExchangePrefix', $context); $this->assertInternalType('callable', $this->readAttribute($context, 'stompFactory')); } + + public function testShouldCreateRabbitMQContext() + { + $factory = new StompConnectionFactory('stomp+rabbitmq://'); + + $context = $factory->createContext(); + + $this->assertInstanceOf(StompContext::class, $context); + + $this->assertAttributeEquals(null, 'stomp', $context); + $this->assertAttributeEquals(true, 'useExchangePrefix', $context); + } + + public function testShouldCreateActiveMQContext() + { + $factory = new StompConnectionFactory('stomp+activemq://'); + + $context = $factory->createContext(); + + $this->assertInstanceOf(StompContext::class, $context); + + $this->assertAttributeEquals(null, 'stomp', $context); + $this->assertAttributeEquals(false, 'useExchangePrefix', $context); + } } From 8ffb5ed4bd7ed85acd01e356209850ad07337a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 3 May 2019 17:15:18 +0200 Subject: [PATCH 0606/1142] Fix un-initialized property use Resolves #833 --- pkg/amqp-lib/AmqpSubscriptionConsumer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/amqp-lib/AmqpSubscriptionConsumer.php b/pkg/amqp-lib/AmqpSubscriptionConsumer.php index 694c134dc..a5917dbed 100644 --- a/pkg/amqp-lib/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-lib/AmqpSubscriptionConsumer.php @@ -34,6 +34,7 @@ class AmqpSubscriptionConsumer implements InteropAmqpSubscriptionConsumer public function __construct(AmqpContext $context, bool $heartbeatOnTick) { + $this->subscribers = []; $this->context = $context; $this->heartbeatOnTick = $heartbeatOnTick; } From f8ae494ad588a54fcb4dbce66c2739db4cdc580c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 13 May 2019 16:50:04 +0200 Subject: [PATCH 0607/1142] Fix consumption errors in kafka against recent versions in librdkafka/phprdkafka Recent versions may no longer return error message when reaching end of partition (RD_KAFKA_RESP_ERR__PARTITION_EOF - due to change in `enable.partition.eof`). This is especially true for librdkafka >=1.0.0. see https://github.com/arnaud-lb/php-rdkafka/issues/220#issuecomment-491162230 --- pkg/rdkafka/RdKafkaConsumer.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index 9522b32ee..d7016a946 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -155,6 +155,10 @@ private function doReceive(int $timeout): ?RdKafkaMessage { $kafkaMessage = $this->consumer->consume($timeout); + if (null === $kafkaMessage) { + return null; + } + switch ($kafkaMessage->err) { case RD_KAFKA_RESP_ERR__PARTITION_EOF: case RD_KAFKA_RESP_ERR__TIMED_OUT: From 033cf7b34d5ea27688e258dab795e60f0de0636a Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 14 May 2019 16:03:21 +0300 Subject: [PATCH 0608/1142] [client] Lazy producer. --- composer.json | 24 ++-- .../Functional/App/config/custom-config.yml | 4 + .../Tests/Functional/LazyProducerTest.php | 79 +++++++++++ .../Tests/Functional/UseCasesTest.php | 6 +- .../Tests/Functional/WebTestCase.php | 4 +- .../DependencyInjection/ClientFactory.php | 15 +- pkg/enqueue/Symfony/Client/LazyProducer.php | 37 +++++ .../BuildProcessorRegistryPassTest.php | 4 +- .../BuildProcessorRegistryPassTest.php | 4 +- .../Tests/Symfony/LazyProducerTest.php | 133 ++++++++++++++++++ 10 files changed, 286 insertions(+), 24 deletions(-) create mode 100644 pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php create mode 100644 pkg/enqueue/Symfony/Client/LazyProducer.php create mode 100644 pkg/enqueue/Tests/Symfony/LazyProducerTest.php diff --git a/composer.json b/composer.json index 639b274b6..4dbb1423d 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,6 @@ "ramsey/uuid": "^2|^3.5", "psr/log": "^1", "psr/container": "^1", - "symfony/event-dispatcher": "4.0.*", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^0.6.1|^1.0", "doctrine/orm": "~2.4", @@ -40,20 +39,20 @@ "phpunit/phpunit": "^5.5", "phpstan/phpstan": "^0.10", "queue-interop/queue-spec": "^0.6", - "symfony/browser-kit": "4.0.*", - "symfony/config": "4.0.*", - "symfony/process": "4.0.*", - "symfony/console": "4.0.*", - "symfony/dependency-injection": "4.0.*", - "symfony/event-dispatcher": "4.0.*", - "symfony/expression-language": "4.0.*", - "symfony/http-kernel": "4.0.*", - "symfony/filesystem": "4.0.*", - "symfony/framework-bundle": "4.0.*", + "symfony/browser-kit": "^4", + "symfony/config": "^4", + "symfony/process": "^4", + "symfony/console": "^3.4|^4", + "symfony/dependency-injection": "^4", + "symfony/event-dispatcher": "^3.4|^4", + "symfony/expression-language": "^4", + "symfony/http-kernel": "^4", + "symfony/filesystem": "^4", + "symfony/framework-bundle": "^4", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2", "kwn/php-rdkafka-stubs": "^1.0.2", - "friendsofphp/php-cs-fixer": "^2" + "friendsofphp/php-cs-fixer": "^2.15" }, "autoload": { "psr-4": { @@ -103,6 +102,7 @@ "config": { "bin-dir": "bin", "platform": { + "php": "7.3", "ext-amqp": "1.9.3", "ext-gearman": "2.0.3", "ext-rdkafka": "3.3", diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml index eab956cc4..eda14e00c 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml @@ -31,6 +31,10 @@ services: alias: 'enqueue.client.default.producer' public: true + test_enqueue.client.default.lazy_producer: + alias: 'enqueue.client.default.lazy_producer' + public: true + test_enqueue.transport.default.context: alias: 'enqueue.transport.default.context' public: true diff --git a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php new file mode 100644 index 000000000..cf9af030e --- /dev/null +++ b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php @@ -0,0 +1,79 @@ +remove(static::$kernel->getLogDir()); + $fs->remove(static::$kernel->getCacheDir()); + } + + parent::tearDown(); + } + + public function testShouldAllowGetLazyProducerWithoutError() + { + $this->customSetUp([ + 'default' => [ + 'transport' => [ + 'dsn' => 'invalidDSN', + ], + ], + ]); + + /** @var LazyProducer $producer */ + $producer = static::$container->get('test_enqueue.client.default.lazy_producer'); + $this->assertInstanceOf(LazyProducer::class, $producer); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('The DSN is invalid.'); + $producer->sendEvent('foo', 'foo'); + } + + /** + * @return string + */ + public static function getKernelClass() + { + include_once __DIR__.'/App/CustomAppKernel.php'; + + return CustomAppKernel::class; + } + + protected function customSetUp(array $enqueueConfig) + { + static::$class = null; + + static::$client = static::createClient(['enqueue_config' => $enqueueConfig]); + static::$client->getKernel()->boot(); + static::$kernel = static::$client->getKernel(); + static::$container = static::$kernel->getContainer(); + } + + protected static function createKernel(array $options = []): CustomAppKernel + { + /** @var CustomAppKernel $kernel */ + $kernel = parent::createKernel($options); + + $kernel->setEnqueueConfig(isset($options['enqueue_config']) ? $options['enqueue_config'] : []); + + return $kernel; + } +} diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 0a5f38325..f4f11abb1 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -372,9 +372,9 @@ protected function customSetUp(array $enqueueConfig) { static::$class = null; - $this->client = static::createClient(['enqueue_config' => $enqueueConfig]); - $this->client->getKernel()->boot(); - static::$kernel = $this->client->getKernel(); + static::$client = static::createClient(['enqueue_config' => $enqueueConfig]); + static::$client->getKernel()->boot(); + static::$kernel = static::$client->getKernel(); static::$container = static::$kernel->getContainer(); /** @var DriverInterface $driver */ diff --git a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php index 0cf1a0723..fa4eb3e5a 100644 --- a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php +++ b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php @@ -13,7 +13,7 @@ abstract class WebTestCase extends BaseWebTestCase /** * @var Client */ - protected $client; + protected static $client; /** * @var ContainerInterface @@ -26,7 +26,7 @@ protected function setUp() static::$class = null; - $this->client = static::createClient(); + static::$client = static::createClient(); if (false == static::$container) { static::$container = static::$kernel->getContainer(); diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php index e69311e36..bdae6f3b5 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php @@ -21,12 +21,14 @@ use Enqueue\Consumption\QueueConsumer; use Enqueue\Rpc\RpcFactory; use Enqueue\Symfony\Client\FlushSpoolProducerListener; +use Enqueue\Symfony\Client\LazyProducer; use Enqueue\Symfony\ContainerProcessorRegistry; use Enqueue\Symfony\DependencyInjection\TransportFactory; use Enqueue\Symfony\DiUtils; use Interop\Queue\Context; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\NodeDefinition; +use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Reference; @@ -119,14 +121,21 @@ public function build(ContainerBuilder $container, array $config): void ; $container->register($this->diUtils->format('producer'), Producer::class) + // @deprecated ->setPublic(true) ->addArgument($this->diUtils->reference('driver')) ->addArgument($this->diUtils->reference('rpc_factory')) ->addArgument($this->diUtils->reference('client_extensions')) ; + $lazyProducer = $container->register($this->diUtils->format('lazy_producer'), LazyProducer::class); + $lazyProducer->addArgument(ServiceLocatorTagPass::register($container, [ + $this->diUtils->format('producer') => new Reference($this->diUtils->format('producer')), + ])); + $lazyProducer->addArgument($this->diUtils->format('producer')); + $container->register($this->diUtils->format('spool_producer'), SpoolProducer::class) - ->addArgument($this->diUtils->reference('producer')) + ->addArgument($this->diUtils->reference('lazy_producer')) ; $container->register($this->diUtils->format('client_extensions'), ChainExtension::class) @@ -200,12 +209,12 @@ public function build(ContainerBuilder $container, array $config): void $this->diUtils->format('queue_consumer') => $this->diUtils->reference('queue_consumer'), $this->diUtils->format('driver') => $this->diUtils->reference('driver'), $this->diUtils->format('delegate_processor') => $this->diUtils->reference('delegate_processor'), - $this->diUtils->format('producer') => $this->diUtils->reference('producer'), + $this->diUtils->format('producer') => $this->diUtils->reference('lazy_producer'), ])); } if ($this->default) { - $container->setAlias(ProducerInterface::class, $this->diUtils->format('producer')); + $container->setAlias(ProducerInterface::class, $this->diUtils->format('lazy_producer')); $container->setAlias(SpoolProducer::class, $this->diUtils->format('spool_producer')); if (DiUtils::DEFAULT_CONFIG !== $this->diUtils->getConfigName()) { diff --git a/pkg/enqueue/Symfony/Client/LazyProducer.php b/pkg/enqueue/Symfony/Client/LazyProducer.php new file mode 100644 index 000000000..8dd3aadba --- /dev/null +++ b/pkg/enqueue/Symfony/Client/LazyProducer.php @@ -0,0 +1,37 @@ +container = $container; + $this->producerId = $producerId; + } + + public function sendEvent(string $topic, $message): void + { + $this->getRealProducer()->sendEvent($topic, $message); + } + + public function sendCommand(string $command, $message, bool $needReply = false): ?Promise + { + return $this->getRealProducer()->sendCommand($command, $message, $needReply); + } + + private function getRealProducer(): ProducerInterface + { + return $this->container->get($this->producerId); + } +} diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php index c0142f0e3..4d95ca07d 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -136,10 +136,10 @@ private function assertLocatorServices(ContainerBuilder $container, $locatorId, $locatorId = (string) $locatorId; $this->assertTrue($container->hasDefinition($locatorId)); - $this->assertRegExp('/service_locator\..*?\.enqueue\./', $locatorId); + $this->assertRegExp('/\.?service_locator\..*?\.enqueue\./', $locatorId); $match = []; - if (false == preg_match('/(service_locator\..*?)\.enqueue\./', $locatorId, $match)) { + if (false == preg_match('/(\.?service_locator\..*?)\.enqueue\./', $locatorId, $match)) { $this->fail('preg_match should not failed'); } diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php index d122e044c..989d048cf 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -199,10 +199,10 @@ private function assertLocatorServices(ContainerBuilder $container, $locatorId, $locatorId = (string) $locatorId; $this->assertTrue($container->hasDefinition($locatorId)); - $this->assertRegExp('/service_locator\..*?\.enqueue\./', $locatorId); + $this->assertRegExp('/\.?service_locator\..*?\.enqueue\./', $locatorId); $match = []; - if (false == preg_match('/(service_locator\..*?)\.enqueue\./', $locatorId, $match)) { + if (false == preg_match('/(\.?service_locator\..*?)\.enqueue\./', $locatorId, $match)) { $this->fail('preg_match should not failed'); } diff --git a/pkg/enqueue/Tests/Symfony/LazyProducerTest.php b/pkg/enqueue/Tests/Symfony/LazyProducerTest.php new file mode 100644 index 000000000..b574414c7 --- /dev/null +++ b/pkg/enqueue/Tests/Symfony/LazyProducerTest.php @@ -0,0 +1,133 @@ +assertClassImplements(ProducerInterface::class, LazyProducer::class); + } + + public function testCouldBeConstructedWithContainerAndServiceId() + { + new LazyProducer($this->createContainerMock(), 'realProducerId'); + } + + public function testShouldNotCallRealProducerInConstructor() + { + $containerMock = $this->createContainerMock(); + $containerMock + ->expects($this->never()) + ->method('get') + ; + + new LazyProducer($containerMock, 'realProducerId'); + } + + public function testShouldProxyAllArgumentOnSendEvent() + { + $topic = 'theTopic'; + $message = 'theMessage'; + + $realProducerMock = $this->createProducerMock(); + $realProducerMock + ->expects($this->once()) + ->method('sendEvent') + ->with($topic, $message) + ; + + $containerMock = $this->createContainerMock(); + $containerMock + ->expects($this->once()) + ->method('get') + ->with('realProducerId') + ->willReturn($realProducerMock) + ; + + $lazyProducer = new LazyProducer($containerMock, 'realProducerId'); + + $lazyProducer->sendEvent($topic, $message); + } + + public function testShouldProxyAllArgumentOnSendCommand() + { + $command = 'theCommand'; + $message = 'theMessage'; + $needReply = false; + + $realProducerMock = $this->createProducerMock(); + $realProducerMock + ->expects($this->once()) + ->method('sendCommand') + ->with($command, $message, $needReply) + ; + + $containerMock = $this->createContainerMock(); + $containerMock + ->expects($this->once()) + ->method('get') + ->with('realProducerId') + ->willReturn($realProducerMock) + ; + + $lazyProducer = new LazyProducer($containerMock, 'realProducerId'); + + $result = $lazyProducer->sendCommand($command, $message, $needReply); + + $this->assertNull($result); + } + + public function testShouldProxyReturnedPromiseBackOnSendCommand() + { + $expectedPromise = $this->createMock(Promise::class); + + $realProducerMock = $this->createProducerMock(); + $realProducerMock + ->expects($this->once()) + ->method('sendCommand') + ->willReturn($expectedPromise) + ; + + $containerMock = $this->createContainerMock(); + $containerMock + ->expects($this->once()) + ->method('get') + ->with('realProducerId') + ->willReturn($realProducerMock) + ; + + $lazyProducer = new LazyProducer($containerMock, 'realProducerId'); + + $actualPromise = $lazyProducer->sendCommand('aCommand', 'aMessage', true); + + $this->assertSame($expectedPromise, $actualPromise); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + */ + private function createProducerMock(): ProducerInterface + { + return $this->createMock(ProducerInterface::class); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ContainerInterface + */ + private function createContainerMock(): ContainerInterface + { + return $this->createMock(ContainerInterface::class); + } +} From 5920b78a9c275a7c8383b1a398eebe52b4b5866f Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 14 May 2019 16:14:38 +0300 Subject: [PATCH 0609/1142] remove php from composer platform --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 4dbb1423d..1465ada7b 100644 --- a/composer.json +++ b/composer.json @@ -102,7 +102,6 @@ "config": { "bin-dir": "bin", "platform": { - "php": "7.3", "ext-amqp": "1.9.3", "ext-gearman": "2.0.3", "ext-rdkafka": "3.3", From aaab015fca50dcba5edfd847a7c16bb9e6920d65 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 14 May 2019 16:20:57 +0300 Subject: [PATCH 0610/1142] upd --- composer.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 1465ada7b..cb9751df8 100644 --- a/composer.json +++ b/composer.json @@ -39,20 +39,20 @@ "phpunit/phpunit": "^5.5", "phpstan/phpstan": "^0.10", "queue-interop/queue-spec": "^0.6", - "symfony/browser-kit": "^4", - "symfony/config": "^4", - "symfony/process": "^4", + "symfony/browser-kit": "^3.4|^4", + "symfony/config": "^3.4|^4", + "symfony/process": "^3.4|^4", "symfony/console": "^3.4|^4", - "symfony/dependency-injection": "^4", + "symfony/dependency-injection": "^3.4|^4", "symfony/event-dispatcher": "^3.4|^4", - "symfony/expression-language": "^4", - "symfony/http-kernel": "^4", - "symfony/filesystem": "^4", - "symfony/framework-bundle": "^4", + "symfony/expression-language": "^3.4|^4", + "symfony/http-kernel": "^3.4|^4", + "symfony/filesystem": "^3.4|^4", + "symfony/framework-bundle": "^3.4|^4", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2", "kwn/php-rdkafka-stubs": "^1.0.2", - "friendsofphp/php-cs-fixer": "^2.15" + "friendsofphp/php-cs-fixer": "^2" }, "autoload": { "psr-4": { From a951b52f273ffc443a019738af9dcf243ba7b3db Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 14 May 2019 16:28:08 +0300 Subject: [PATCH 0611/1142] run tests on php 7.3 and for symfony 4.1 and 4.2 --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index f358a00cf..ecc11eaf0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,12 @@ matrix: - php: 7.2 sudo: false env: SYMFONY_VERSION=4.0.* UNIT_TESTS=true + - php: 7.3 + sudo: false + env: SYMFONY_VERSION=4.1.* UNIT_TESTS=true + - php: 7.3 + sudo: false + env: SYMFONY_VERSION=4.2.* UNIT_TESTS=true - php: 7.1 services: docker sudo: required From a3848391dd46affe26b1c28df1356d06fa71f5ba Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 14 May 2019 16:44:27 +0300 Subject: [PATCH 0612/1142] fix test --- pkg/job-queue/Tests/Functional/WebTestCase.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/job-queue/Tests/Functional/WebTestCase.php b/pkg/job-queue/Tests/Functional/WebTestCase.php index 329762004..ecb6e5af9 100644 --- a/pkg/job-queue/Tests/Functional/WebTestCase.php +++ b/pkg/job-queue/Tests/Functional/WebTestCase.php @@ -11,7 +11,7 @@ abstract class WebTestCase extends BaseWebTestCase /** * @var Client */ - protected $client; + protected static $client; /** * @var ContainerInterface @@ -24,7 +24,7 @@ protected function setUp() static::$class = null; - $this->client = static::createClient(); + static::$client = static::createClient(); if (false == static::$container) { static::$container = static::$kernel->getContainer(); From 665891d6ed16022975796b1c3111474d373d93e7 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 14 May 2019 17:01:51 +0300 Subject: [PATCH 0613/1142] fix tests --- pkg/enqueue-bundle/Tests/Functional/WebTestCase.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php index fa4eb3e5a..2b4f58173 100644 --- a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php +++ b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php @@ -25,18 +25,21 @@ protected function setUp() parent::setUp(); static::$class = null; - static::$client = static::createClient(); - - if (false == static::$container) { - static::$container = static::$kernel->getContainer(); - } + static::$container = static::$kernel->getContainer(); /** @var TraceableProducer $producer */ $producer = static::$container->get('test_enqueue.client.default.traceable_producer'); $producer->clearTraces(); } + protected function tearDown() + { + static::$client = null; + static::$kernel = null; + static::$container = null; + } + /** * @return string */ From 446eb4042f18fd7c645aaf64c24d6bf7078e885b Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 14 May 2019 17:41:06 +0300 Subject: [PATCH 0614/1142] Release 0.9.10 --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5f026489..cc4f53ec6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## [0.9.10](https://github.com/php-enqueue/enqueue-dev/tree/0.9.10) (2019-05-14) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.9...0.9.10) + +**Merged pull requests:** + +- \[client\] Lazy producer. [\#845](https://github.com/php-enqueue/enqueue-dev/pull/845) ([makasim](https://github.com/makasim)) +- \[kafka\] Fix consumption errors in kafka against recent versions in librdkafka/phprdkafka [\#842](https://github.com/php-enqueue/enqueue-dev/pull/842) ([Steveb-p](https://github.com/Steveb-p)) +- \[amqp-lib\] Fix un-initialized property use [\#836](https://github.com/php-enqueue/enqueue-dev/pull/836) ([Steveb-p](https://github.com/Steveb-p)) +- \[amqp-bunny\] Fix heartbeat configuration in bunny with 0 \(off\) value [\#820](https://github.com/php-enqueue/enqueue-dev/pull/820) ([nightlinus](https://github.com/nightlinus)) +- \[stomp\] Add support for using the /topic prefix instead of /exchange. [\#826](https://github.com/php-enqueue/enqueue-dev/pull/826) ([alessandroniciforo](https://github.com/alessandroniciforo)) +- \[sns\] Allow setting SNS message attributes, other fields [\#799](https://github.com/php-enqueue/enqueue-dev/pull/799) ([aldenw](https://github.com/aldenw)) +- Fixed docs [\#822](https://github.com/php-enqueue/enqueue-dev/pull/822) ([Toflar](https://github.com/Toflar)) +- Typo on the tag [\#818](https://github.com/php-enqueue/enqueue-dev/pull/818) ([appeltaert](https://github.com/appeltaert)) + ## [0.9.9](https://github.com/php-enqueue/enqueue-dev/tree/0.9.9) (2019-04-04) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.8...0.9.9) From c4b9cb2fba2200b812e58114d98252f6cf334148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marius=20Bal=C4=8Dytis?= Date: Wed, 15 May 2019 23:54:40 +0300 Subject: [PATCH 0615/1142] Send topic and command for consumed messages --- pkg/monitoring/InfluxDbStorage.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index 401d79ddb..ff5f6c3b0 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -160,6 +160,16 @@ public function pushConsumedMessageStats(ConsumedMessageStats $stats): void 'status' => $stats->getStatus(), ]; + $properties = $stats->getProperties(); + + if (false === empty($properties[Config::TOPIC])) { + $tags['topic'] = $properties[Config::TOPIC]; + } + + if (false === empty($properties[Config::COMMAND])) { + $tags['command'] = $properties[Config::COMMAND]; + } + $values = [ 'receivedAt' => $stats->getReceivedAtMs(), 'processedAt' => $stats->getTimestampMs(), From 4811339a02074fec5e6939cd478b791e6cd4cb2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20de=20Guillebon?= Date: Fri, 17 May 2019 14:27:38 +0200 Subject: [PATCH 0616/1142] Requeue with a custom visibility timeout --- pkg/sqs/SqsConsumer.php | 2 +- pkg/sqs/SqsMessage.php | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index 3c8714e3d..4b89eb7ff 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -138,7 +138,7 @@ public function reject(Message $message, bool $requeue = false): void '@region' => $this->queue->getRegion(), 'QueueUrl' => $this->context->getQueueUrl($this->queue), 'ReceiptHandle' => $message->getReceiptHandle(), - 'VisibilityTimeout' => 0, + 'VisibilityTimeout' => $message->getRequeueVisibilityTimeout(), ]); } else { $this->context->getSqsClient()->deleteMessage([ diff --git a/pkg/sqs/SqsMessage.php b/pkg/sqs/SqsMessage.php index 1d9d26bec..3b0f46bd9 100644 --- a/pkg/sqs/SqsMessage.php +++ b/pkg/sqs/SqsMessage.php @@ -48,6 +48,11 @@ class SqsMessage implements Message */ private $receiptHandle; + /** + * @var int + */ + private $requeueVisibilityTimeout; + public function __construct(string $body = '', array $properties = [], array $headers = []) { $this->body = $body; @@ -55,6 +60,7 @@ public function __construct(string $body = '', array $properties = [], array $he $this->headers = $headers; $this->redelivered = false; $this->delaySeconds = 0; + $this->requeueVisibilityTimeout = 0; } public function setBody(string $body): void @@ -229,4 +235,19 @@ public function getReceiptHandle(): ?string { return $this->receiptHandle; } + + /** + * The number of seconds before the message can be visible again when requeuing. Valid values: 0 to 43200. Maximum: 12 hours. + * + * Set requeue visibility timeout + */ + public function setRequeueVisibilityTimeout(int $seconds): void + { + $this->requeueVisibilityTimeout = $seconds; + } + + public function getRequeueVisibilityTimeout(): int + { + return $this->requeueVisibilityTimeout; + } } From c8d78f260fa102d5b5b26f0a24df85165d2ebfd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20de=20Guillebon?= Date: Fri, 17 May 2019 14:29:33 +0200 Subject: [PATCH 0617/1142] Add test --- pkg/sqs/Tests/SqsConsumerTest.php | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index 67e6f8fc4..ea5c557b5 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -238,6 +238,47 @@ public function testShouldRejectMessageAndRequeue() $consumer->reject($message, true); } + public function testShouldRejectMessageAndRequeueWithVisibilityTimeout() + { + $client = $this->createSqsClientMock(); + $client + ->expects($this->once()) + ->method('changeMessageVisibility') + ->with($this->identicalTo([ + '@region' => 'theRegion', + 'QueueUrl' => 'theQueueUrl', + 'ReceiptHandle' => 'theReceipt', + 'VisibilityTimeout' => 30, + ])) + ; + + $context = $this->createContextMock(); + $context + ->expects($this->once()) + ->method('getSqsClient') + ->willReturn($client) + ; + $context + ->expects($this->once()) + ->method('getQueueUrl') + ->willReturn('theQueueUrl') + ; + $context + ->expects($this->never()) + ->method('createProducer') + ; + + $message = new SqsMessage(); + $message->setReceiptHandle('theReceipt'); + $message->setRequeueVisibilityTimeout(30); + + $destination = new SqsDestination('queue'); + $destination->setRegion('theRegion'); + + $consumer = new SqsConsumer($context, $destination); + $consumer->reject($message, true); + } + public function testShouldReceiveMessage() { $expectedAttributes = [ From 0a488ca5c2872831c4f9b344aa2c5ee9d89dc72c Mon Sep 17 00:00:00 2001 From: Damien Harper Date: Tue, 21 May 2019 11:35:26 +0200 Subject: [PATCH 0618/1142] Revert "Fix heartbeat configuration in bunny with 0 (off) value" --- pkg/amqp-bunny/AmqpConnectionFactory.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/amqp-bunny/AmqpConnectionFactory.php b/pkg/amqp-bunny/AmqpConnectionFactory.php index ca56d428c..241929abe 100644 --- a/pkg/amqp-bunny/AmqpConnectionFactory.php +++ b/pkg/amqp-bunny/AmqpConnectionFactory.php @@ -87,7 +87,6 @@ private function establishConnection(): BunnyClient $bunnyConfig['password'] = $this->config->getPass(); $bunnyConfig['read_write_timeout'] = min($this->config->getReadTimeout(), $this->config->getWriteTimeout()); $bunnyConfig['timeout'] = $this->config->getConnectionTimeout(); - $bunnyConfig['heartbeat'] = $this->config->getHeartbeat(); // @see https://github.com/php-enqueue/enqueue-dev/issues/229 // $bunnyConfig['persistent'] = $this->config->isPersisted(); @@ -95,6 +94,10 @@ private function establishConnection(): BunnyClient // $bunnyConfig['path'] = 'enqueue';//$this->config->getOption('path', $this->config->getOption('vhost')); // } + if ($this->config->getHeartbeat()) { + $bunnyConfig['heartbeat'] = $this->config->getHeartbeat(); + } + if (null !== $this->config->getOption('tcp_nodelay')) { $bunnyConfig['tcp_nodelay'] = $this->config->getOption('tcp_nodelay'); } From d70dbbd294e2fdafef513b634ac67e363bd2d945 Mon Sep 17 00:00:00 2001 From: SAMUEL NELA Date: Tue, 21 May 2019 15:31:10 +0200 Subject: [PATCH 0619/1142] Fixed typo --- docs/monolog/send-messages-to-mq.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/monolog/send-messages-to-mq.md b/docs/monolog/send-messages-to-mq.md index c6cac342c..bbfea16ab 100644 --- a/docs/monolog/send-messages-to-mq.md +++ b/docs/monolog/send-messages-to-mq.md @@ -18,7 +18,7 @@ You have to install monolog itself, queue interop handlers and one of [the trans For the simplicity we are going to install the filesystem based MQ. ``` -composer require enqueue/monolog-queue-handler monolog/monlog enqueue/fs +composer require enqueue/monolog-queue-handler monolog/monolog enqueue/fs ``` ## Usage @@ -66,4 +66,4 @@ $consumer->consume(); ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) From 5d1fa8596d7bbf6c4f31c2d33e396c6f0ae91c9e Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 24 May 2019 16:42:09 +0300 Subject: [PATCH 0620/1142] Fix deprecation notice: The method bindCallback will require a new argument in next major version back_consumer_1 | consumer1 | [2019-05-24 12:57:13] php.INFO: User Deprecated: The "Enqueue\Consumption\QueueConsumer::bindCallback()" method will require a new "string|InteropQueue $queueName" argument in the next major version of its parent class "Enqueue\Consumption\QueueConsumerInterface", not defining it is deprecated. {"exception":"[object] (ErrorException(code: 0): User Deprecated: The \"Enqueue\\Consumption\\QueueConsumer::bindCallback()\" method will require a new \"string|InteropQueue $queueName\" argument in the next major version of its parent class \"Enqueue\\Consumption\\QueueConsumerInterface\", not defining it is deprecated. at /app/vendor/symfony/debug/DebugClassLoader.php:199)"} [] --- pkg/enqueue/Consumption/QueueConsumerInterface.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/enqueue/Consumption/QueueConsumerInterface.php b/pkg/enqueue/Consumption/QueueConsumerInterface.php index c9c99ef15..430aa8786 100644 --- a/pkg/enqueue/Consumption/QueueConsumerInterface.php +++ b/pkg/enqueue/Consumption/QueueConsumerInterface.php @@ -27,9 +27,8 @@ public function bind($queueName, Processor $processor): self; /** * @param string|InteropQueue $queueName - * @param mixed $queue */ - public function bindCallback($queue, callable $processor): self; + public function bindCallback($queueName, callable $processor): self; /** * Runtime extension - is an extension or a collection of extensions which could be set on runtime. From 10d85e49563061d99669525077981b22c9090aff Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 24 May 2019 16:49:05 +0300 Subject: [PATCH 0621/1142] [client] Fix reference to logger service. --- .../Symfony/Client/DependencyInjection/ClientFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php index bdae6f3b5..2eede31b7 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php @@ -165,7 +165,7 @@ public function build(ContainerBuilder $container, array $config): void ->addArgument($this->diUtils->reference('context')) ->addArgument($this->diUtils->reference('consumption_extensions')) ->addArgument([]) - ->addArgument($this->diUtils->reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE)) + ->addArgument(new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE)) ->addArgument($config['consumption']['receive_timeout']) ; From b7b6b8158950b116dbff65ade4ee579c3958105c Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 24 May 2019 17:07:00 +0300 Subject: [PATCH 0622/1142] [client] Fix --logger option. Removed unintentionally set console logger. --- pkg/enqueue/Symfony/Client/ConsumeCommand.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index ee8b394f6..fee54e1b5 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -5,7 +5,6 @@ use Enqueue\Client\DriverInterface; use Enqueue\Consumption\ChainExtension; use Enqueue\Consumption\Extension\ExitStatusExtension; -use Enqueue\Consumption\Extension\LoggerExtension; use Enqueue\Consumption\ExtensionInterface; use Enqueue\Consumption\QueueConsumerInterface; use Enqueue\Symfony\Consumption\ChooseLoggerCommandTrait; @@ -18,7 +17,6 @@ use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Logger\ConsoleLogger; use Symfony\Component\Console\Output\OutputInterface; class ConsumeCommand extends Command @@ -154,7 +152,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int protected function getRuntimeExtensions(InputInterface $input, OutputInterface $output): ExtensionInterface { - $extensions = [new LoggerExtension(new ConsoleLogger($output))]; + $extensions = []; $extensions = array_merge($extensions, $this->getLimitsExtensions($input, $output)); $driver = $this->getDriver($input->getOption('client')); From b1e0beca0a159743a8d3469dd0b738f89b96527c Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 24 May 2019 17:44:54 +0300 Subject: [PATCH 0623/1142] Release 0.9.11 --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc4f53ec6..243408045 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## [0.9.11](https://github.com/php-enqueue/enqueue-dev/tree/0.9.11) (2019-05-24) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.10...0.9.11) + +**Merged pull requests:** + +- \[client\] Fix --logger option. Removed unintentionally set console logger. [\#861](https://github.com/php-enqueue/enqueue-dev/pull/861) ([makasim](https://github.com/makasim)) +- \[client\] Fix reference to logger service. [\#860](https://github.com/php-enqueue/enqueue-dev/pull/860) ([makasim](https://github.com/makasim)) +- \[consumption\] Fix bindCallback method will require new arg deprecation notice [\#859](https://github.com/php-enqueue/enqueue-dev/pull/859) ([makasim](https://github.com/makasim)) +- \[amqp-bunny\] Revert "Fix heartbeat configuration in bunny with 0 \(off\) value" [\#855](https://github.com/php-enqueue/enqueue-dev/pull/855) ([DamienHarper](https://github.com/DamienHarper)) +- \[sqs\] Requeue with a visibility timeout [\#852](https://github.com/php-enqueue/enqueue-dev/pull/852) ([deguif](https://github.com/deguif)) +- \[monitoring\] Send topic and command for consumed messages [\#849](https://github.com/php-enqueue/enqueue-dev/pull/849) ([mariusbalcytis](https://github.com/mariusbalcytis)) +- Fixed typo [\#856](https://github.com/php-enqueue/enqueue-dev/pull/856) ([samnela](https://github.com/samnela)) + ## [0.9.10](https://github.com/php-enqueue/enqueue-dev/tree/0.9.10) (2019-05-14) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.9...0.9.10) From 619b8e4d6f7c563dc0458a6890a81fb4bbfb4c30 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Fri, 24 May 2019 23:32:31 +0200 Subject: [PATCH 0624/1142] Link to the Symfony bundle --- docs/bundle/async_commands.md | 2 +- docs/bundle/async_events.md | 2 +- docs/bundle/cli_commands.md | 2 +- docs/bundle/config_reference.md | 2 +- docs/bundle/consumption_extension.md | 2 +- docs/bundle/debugging.md | 2 +- docs/bundle/functional_testing.md | 2 +- docs/bundle/index.md | 16 ++++++++++++++++ docs/bundle/job_queue.md | 2 +- docs/bundle/message_processor.md | 2 +- docs/bundle/message_producer.md | 2 +- docs/bundle/production_settings.md | 2 +- docs/bundle/quick_tour.md | 2 +- docs/index.md | 2 +- docs/quick_tour.md | 5 +++++ 15 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 docs/bundle/index.md diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md index 21299911c..da567c057 100644 --- a/docs/bundle/async_commands.md +++ b/docs/bundle/async_commands.md @@ -70,4 +70,4 @@ if ($replyMessage = $promise->receive(5000)) { } ``` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/async_events.md b/docs/bundle/async_events.md index 7c20381bc..58d573577 100644 --- a/docs/bundle/async_events.md +++ b/docs/bundle/async_events.md @@ -174,4 +174,4 @@ services: The `eventName` attribute accepts a regexp. You can do next `eventName: '/foo\..*?/'`. It uses this transformer for all event with the name beginning with `foo.` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/cli_commands.md b/docs/bundle/cli_commands.md index 9bb114aba..d3a471040 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/bundle/cli_commands.md @@ -166,4 +166,4 @@ Help: A worker that consumes message from a broker. To use this broker you have to explicitly set a queue to consume from and a message processor service ``` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index 1d57875d5..a7860c0eb 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -74,4 +74,4 @@ enqueue: reply_extension: true ``` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/consumption_extension.md b/docs/bundle/consumption_extension.md index 1caf82a53..a574cd56b 100644 --- a/docs/bundle/consumption_extension.md +++ b/docs/bundle/consumption_extension.md @@ -41,4 +41,4 @@ services: - { name: 'enqueue.consumption.extension', priority: 10 } ``` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/debugging.md b/docs/bundle/debugging.md index 4dd16f05e..2bd989e80 100644 --- a/docs/bundle/debugging.md +++ b/docs/bundle/debugging.md @@ -78,4 +78,4 @@ You can add `-vvv` to see more information. ![Consume command verbosity](../images/consume_command_verbosity.png) -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/functional_testing.md b/docs/bundle/functional_testing.md index ae25293a9..d6171b2ba 100644 --- a/docs/bundle/functional_testing.md +++ b/docs/bundle/functional_testing.md @@ -87,4 +87,4 @@ class FooTest extends WebTestCase } ``` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/index.md b/docs/bundle/index.md new file mode 100644 index 000000000..c04d46a08 --- /dev/null +++ b/docs/bundle/index.md @@ -0,0 +1,16 @@ +# Symfony Bundle + +* [Quick tour](quick_tour.md) +* [Config reference](config_reference.md) +* [Cli commands](cli_commands.md) +* [Message producer](message_producer.md) +* [Message processor](message_processor.md) +* [Async events](async_events.md) +* [Async commands](async_commands.md) +* [Job queue](job_queue.md) +* [Consumption extension](consumption_extension.md) +* [Production settings](production_settings.md) +* [Debugging](debugging.md) +* [Functional testing](functional_testing.md) + +[back to index](../index.md) diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index bc574e05b..907a82e33 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -297,4 +297,4 @@ class ReindexProcessor implements Processor } ``` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/message_processor.md b/docs/bundle/message_processor.md index bb89f2fc1..8c4b0db17 100644 --- a/docs/bundle/message_processor.md +++ b/docs/bundle/message_processor.md @@ -181,4 +181,4 @@ Now you can run a command and tell it to consume from a given queue and process $ ./bin/console enqueue:transport:consume say_hello foo_queue -vvv ``` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/message_producer.md b/docs/bundle/message_producer.md index bda5152d2..5dd566553 100644 --- a/docs/bundle/message_producer.md +++ b/docs/bundle/message_producer.md @@ -94,4 +94,4 @@ $spoolProducer->sendCommand('a_processor_name', 'Hello there!'); $spoolProducer->flush(); ``` -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/bundle/production_settings.md b/docs/bundle/production_settings.md index 2f74ee7ec..520e508fb 100644 --- a/docs/bundle/production_settings.md +++ b/docs/bundle/production_settings.md @@ -36,4 +36,4 @@ redirect_stderr=true _**Note**: Pay attention to `--time-limit` it tells the command to exit after 5 minutes._ -[back to index](../index.md) \ No newline at end of file +[back to index](index.md) \ No newline at end of file diff --git a/docs/bundle/quick_tour.md b/docs/bundle/quick_tour.md index 4e5f57d94..76ca158bb 100644 --- a/docs/bundle/quick_tour.md +++ b/docs/bundle/quick_tour.md @@ -125,4 +125,4 @@ $ ./bin/console enqueue:consume --setup-broker -vvv _**Note**: Add -vvv to find out what is going while you are consuming messages. There is a lot of valuable debug info there._ -[back to index](../index.md) +[back to index](index.md) diff --git a/docs/index.md b/docs/index.md index 521e642fa..161ed3c7b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -37,7 +37,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made * [Job queue](#job-queue) - [Run unique job](job_queue/run_unique_job.md) - [Run sub job(s)](job_queue/run_sub_job.md) -* [EnqueueBundle (Symfony)](#enqueue-bundle-symfony). +* [EnqueueBundle (Symfony)](bundle/index.md) - [Quick tour](bundle/quick_tour.md) - [Config reference](bundle/config_reference.md) - [Cli commands](bundle/cli_commands.md) diff --git a/docs/quick_tour.md b/docs/quick_tour.md index 9c3e6b5d1..063168299 100644 --- a/docs/quick_tour.md +++ b/docs/quick_tour.md @@ -15,6 +15,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made * [Client](#client) * [Cli commands](#cli-commands) * [Monitoring](#monitoring) +* [Symfony bundle](#symfony) ## Transport @@ -287,3 +288,7 @@ $ app.php consume There is a tool that can track sent\consumed messages as well as consumer performance. Read more [here](monitoring.md) [back to index](index.md) + +## Symfony + +Read more [here](bundle/quick_tour.md) about using Enqueue as a Symfony Bundle. From 88deb76847fa5ba164d1ea1693114db565a0d816 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Sat, 25 May 2019 13:09:56 +0200 Subject: [PATCH 0625/1142] Key concepts --- docs/concepts.md | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ docs/index.md | 1 + 2 files changed, 70 insertions(+) create mode 100644 docs/concepts.md diff --git a/docs/concepts.md b/docs/concepts.md new file mode 100644 index 000000000..e29778cdc --- /dev/null +++ b/docs/concepts.md @@ -0,0 +1,69 @@ +# Key concepts + +If you are new to queuing system, there are some key concepts to understand to make the most of this lib. + +## Messages and queues + +The queue is where messages are sent to for later processing. Once in the queue, they wait to be fetched, processed and removed from the queue. +A queue may provide the following features: +- *receive and delete delivery*: the queue deletes the message when it's fetched. If processing fails, then the message is lost and won't be processed again. This is called _at most once_ processing. +- *peek and lock delivery*: the queue locks for a short amount of time a message when it's fetched, making it invisible to other processes, in order to prevent duplicate processing. If there is no acknowledgment before the lock times out, failure is assumed and then the message is made visible again in the queue for another try. This is called _at least once_ processing. +- *delayed or scheduled messages*: messages are sent to the queue but won't be visible right away to processes to fetch them. You may need it to plan an action at a specific time. +- *first in first out*: messages are processed in the same order than they have entered the queue. + +## Topic and subscription + +These are are advanced features: +- a message goes to a queue and is sent to multiple recipients +- a message is routing to different queues depending on some rules + +## Transport + +The transport is the underlying vendor-specific system providing the queue features: most famous ones are RabbitMQ, Amazon SQS, ... +Enqueue uses https://github.com/queue-interop/queue-interop PHP interfaces to provide a common way for programs to create, send, read messages in queues without worrying about vendor-specific internals. + +## Destination + +This is where a message goes, like a queue for a basic scenario but it may also be a topic or a command (understand a Symfony Console command). + +## Connection factory, Driver and Context + +The Connection factory creates a connection to the vendor service with vendor-specific config and theses are wrapped into a Context. +The Context will then provides the Producer, the Consumer and helps creates Messages. + +The Driver handles the routing of a Message. + +## Producer & Consumer + +The Producer sends the Message to the queue and the Consumer fetches Message from the queue. + +Both the Producer and the Consumer implement vendor-specific logic and are in charge to convert messages between Enqueue common standard and vendor-specific message format. + +## Processor + +It handles the processing of the Message once received. It implements your business logic. + +## Lifecycle + +A queuing system is divided in two main parts: producing and consuming. + +The [transport section of the Quick Start](quick_tour.md#transport) shows some code example for both parts. + +### Producing part +1. The application creates a Context with a Connection factory +2. The Context helps the application to create a Message +3. The application gets a Producer from the Context +4. The application uses the Producer to send the Message to the queue + +### Consuming part +1. The application gets a Consumer from the Context +2. The Consumer receives Messages from the queue +3. The Consumer uses a Processor to process a Message +4. The Processor returns a status (like `Interop\Queue\Processor::ACK`) to the Consumer +5. The Consumer requeue or remove the Message from the queue depending on the Processor returned status + +## How to use Enqueue? + +There are different ways to use Enqueue: both reduce the boiler plate code you have to write to start using the Enqueue feature. +- as a [Client](client/quick_tour.md): relies on a [DSN](client/supported_brokers.md) to connect +- as a [Symfony Bundle](bundle/index.md): recommended if you are using the Symfony framework diff --git a/docs/index.md b/docs/index.md index 521e642fa..31789c15b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -10,6 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made ## Documentation. * [Quick tour](quick_tour.md) +* [Key concepts](concepts.md) * [Transports](#transports) - Amqp based on [the ext](transport/amqp.md), [bunny](transport/amqp_bunny.md), [the lib](transport/amqp_lib.md) - [Amazon SNS-SQS](transport/snsqs.md) From 802c975eef93ede91522baec6f70ee847bdde09f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sat, 25 May 2019 17:49:26 +0200 Subject: [PATCH 0626/1142] jekyll gh-pages --- docs/_config.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 000000000..7952a85ff --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,23 @@ +title: enqueue-dev +description: A Jekyll theme for documentation +baseurl: "/enqueue-dev/" # the subpath of your site, e.g. /blog +url: "https://steveb-p.github.io/" # the base hostname & protocol for your site, e.g. http://example.com + +permalink: pretty +exclude: ["node_modules/", "*.gemspec", "*.gem", "Gemfile", "Gemfile.lock", "package.json", "package-lock.json", "script/", "LICENSE.txt", "lib/", "bin/", "README.md", "Rakefile"] + +# Enable or disable the site search +search_enabled: true + +# Aux links for the upper right navigation +aux_links: + "enqueue-dev on GitHub": + - "//github.com/enqueue-dev/enqueue-dev" + +# Color scheme currently only supports "dark" or nil (default) +color_scheme: dark + +remote_theme: pmarsceill/just-the-docs + +plugins: + - jekyll-seo-tag From 40f02f4c049104a7a29c1bed1eafbc042097b8e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sat, 25 May 2019 19:05:10 +0200 Subject: [PATCH 0627/1142] WIP --- docs/Gemfile | 31 +++++++++++++++++++++++++++++++ docs/_config.yml | 8 +++++--- docs/index.md | 11 +++++++++-- 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 docs/Gemfile diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 000000000..93bfdf9a5 --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,31 @@ +source "https://rubygems.org/" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "~> 3.8.5" + +# This is the default theme for new Jekyll sites. You may change this to anything you like. +# gem "minima", "~> 2.0" +gem "just-the-docs" + +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +# group :jekyll_plugins do +# gem "jekyll-feed", "~> 0.6" +# end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +# Performance-booster for watching directories on Windows +gem "wdm", "~> 0.1.0" if Gem.win_platform? + diff --git a/docs/_config.yml b/docs/_config.yml index 7952a85ff..7ae441011 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,11 +1,13 @@ title: enqueue-dev description: A Jekyll theme for documentation -baseurl: "/enqueue-dev/" # the subpath of your site, e.g. /blog -url: "https://steveb-p.github.io/" # the base hostname & protocol for your site, e.g. http://example.com +baseurl: "" # the subpath of your site, e.g. /blog +url: "" # the base hostname & protocol for your site, e.g. http://example.com permalink: pretty exclude: ["node_modules/", "*.gemspec", "*.gem", "Gemfile", "Gemfile.lock", "package.json", "package-lock.json", "script/", "LICENSE.txt", "lib/", "bin/", "README.md", "Rakefile"] +markdown: kramdown + # Enable or disable the site search search_enabled: true @@ -15,7 +17,7 @@ aux_links: - "//github.com/enqueue-dev/enqueue-dev" # Color scheme currently only supports "dark" or nil (default) -color_scheme: dark +color_scheme: nil remote_theme: pmarsceill/just-the-docs diff --git a/docs/index.md b/docs/index.md index 521e642fa..a33582272 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,10 @@ +--- +# Feel free to add content and custom Front Matter to this file. +# To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults + +layout: home +--- +

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -37,7 +44,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made * [Job queue](#job-queue) - [Run unique job](job_queue/run_unique_job.md) - [Run sub job(s)](job_queue/run_sub_job.md) -* [EnqueueBundle (Symfony)](#enqueue-bundle-symfony). +* [EnqueueBundle (Symfony)](#enqueue-bundle-symfony). - [Quick tour](bundle/quick_tour.md) - [Config reference](bundle/config_reference.md) - [Cli commands](bundle/cli_commands.md) @@ -49,7 +56,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made - [Consumption extension](bundle/consumption_extension.md) - [Production settings](bundle/production_settings.md) - [Debugging](bundle/debugging.md) - - [Functional testing](bundle/functional_testing.md) + - [Functional testing](bundle/functional_testing.md) * [Laravel](#laravel) - [Quick tour](laravel/quick_tour.md) - [Queues](laravel/queues.md) From e21cfb5162e7533e3bd46c94e14b1ddcee161b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sat, 25 May 2019 19:06:18 +0200 Subject: [PATCH 0628/1142] Prefer stable dependencies for development See https://getcomposer.org/doc/04-schema.md#prefer-stable --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index cb9751df8..04213c776 100644 --- a/composer.json +++ b/composer.json @@ -108,6 +108,7 @@ "ext-mongodb": "1.3", "ext-bcmath": "1", "ext-mbstring": "1" - } + }, + "prefer-stable": true } } From 509da7cbdfdc8718d1ac16b1d18c80cae80a19cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sat, 25 May 2019 19:45:33 +0200 Subject: [PATCH 0629/1142] Add instructions on how to easily build documentation locally --- docs/.gitignore | 2 ++ docs/Gemfile | 9 +++------ docs/_config.yml | 19 ++++++++++++++++--- docs/index.md | 11 ++++++++++- 4 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 docs/.gitignore diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..29949d465 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +/_site +/Gemfile.lock diff --git a/docs/Gemfile b/docs/Gemfile index 93bfdf9a5..5b4694d54 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -14,14 +14,11 @@ gem "jekyll", "~> 3.8.5" # gem "minima", "~> 2.0" gem "just-the-docs" -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -gem "github-pages", group: :jekyll_plugins - # If you have any plugins, put them here! -# group :jekyll_plugins do +group :jekyll_plugins do + gem "github-pages" # gem "jekyll-feed", "~> 0.6" -# end +end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/docs/_config.yml b/docs/_config.yml index 7ae441011..7ab62a76f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,10 +1,23 @@ title: enqueue-dev description: A Jekyll theme for documentation baseurl: "" # the subpath of your site, e.g. /blog -url: "" # the base hostname & protocol for your site, e.g. http://example.com +url: "http://localhost/" # the base hostname & protocol for your site, e.g. http://example.com permalink: pretty -exclude: ["node_modules/", "*.gemspec", "*.gem", "Gemfile", "Gemfile.lock", "package.json", "package-lock.json", "script/", "LICENSE.txt", "lib/", "bin/", "README.md", "Rakefile"] +exclude: + - "node_modules/" + - "*.gemspec" + - "*.gem" + - "Gemfile" + - "Gemfile.lock" + - "package.json" + - "package-lock.json" + - "script/" + - "LICENSE.txt" + - "lib/" + - "bin/" + - "README.md" + - "Rakefile" markdown: kramdown @@ -14,7 +27,7 @@ search_enabled: true # Aux links for the upper right navigation aux_links: "enqueue-dev on GitHub": - - "//github.com/enqueue-dev/enqueue-dev" + - "//github.com/php-enqueue/enqueue-dev" # Color scheme currently only supports "dark" or nil (default) color_scheme: nil diff --git a/docs/index.md b/docs/index.md index a33582272..90480af56 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,7 +2,7 @@ # Feel free to add content and custom Front Matter to this file. # To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults -layout: home +layout: default ---

Supporting Enqueue

@@ -98,3 +98,12 @@ Enqueue is an MIT-licensed open source project with its ongoing development made * [Yii PHP Framework has adopted AMQP Interop.](https://blog.forma-pro.com/yii-php-framework-has-adopted-amqp-interop-85ab47c9869f) * [(En)queue Symfony console commands](http://tech.yappa.be/enqueue-symfony-console-commands) * [From RabbitMq to PhpEnqueue via Symfony Messenger](https://medium.com/@stefanoalletti_40357/from-rabbitmq-to-phpenqueue-via-symfony-messenger-b8260d0e506c) + +## Contributing to this documentation + +To run this documentation locally, you can either create Jekyll environment on your local computer or use docker container. +To run docker container you can use a command from repository root directory: +```shell +docker run -p 4000:4000 --rm --volume="${PWD}/docs:/srv/jekyll" -it jekyll/jekyll jekyll serve --watch +``` +Documentation will then be available for you on http://localhost:4000/ once build completes and rebuild automatically on changes. From fce750a3e2f77e5c90156a5c6e9007ad231c9a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sat, 25 May 2019 19:57:06 +0200 Subject: [PATCH 0630/1142] Fix assets --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 7ab62a76f..0e457d2e6 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,7 +1,7 @@ title: enqueue-dev description: A Jekyll theme for documentation baseurl: "" # the subpath of your site, e.g. /blog -url: "http://localhost/" # the base hostname & protocol for your site, e.g. http://example.com +url: "" # the base hostname & protocol for your site, e.g. http://example.com permalink: pretty exclude: From 1fd00227afdaa9fc6d731ed98648309dac3f0c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sat, 25 May 2019 20:00:29 +0200 Subject: [PATCH 0631/1142] Fix assets --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 0e457d2e6..4145394fe 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,6 @@ title: enqueue-dev description: A Jekyll theme for documentation -baseurl: "" # the subpath of your site, e.g. /blog +baseurl: "/enqueue-dev" # the subpath of your site, e.g. /blog url: "" # the base hostname & protocol for your site, e.g. http://example.com permalink: pretty From 55e9a8a1fe585730aaa15dc023baeb8ca290bf96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sat, 25 May 2019 20:24:23 +0200 Subject: [PATCH 0632/1142] Add button for switching to dark mode. At least for now. --- docs/_includes/nav.html | 62 +++++++++++++++++++++++++++++++++++++++++ docs/index.md | 1 + 2 files changed, 63 insertions(+) create mode 100644 docs/_includes/nav.html diff --git a/docs/_includes/nav.html b/docs/_includes/nav.html new file mode 100644 index 000000000..fa2492acc --- /dev/null +++ b/docs/_includes/nav.html @@ -0,0 +1,62 @@ + diff --git a/docs/index.md b/docs/index.md index 90480af56..6fda30bee 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,6 +3,7 @@ # To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults layout: default +title: Index ---

Supporting Enqueue

From 15adffd91cb23b5d0cd02d8a7fddccdd5d696165 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Sun, 26 May 2019 13:20:35 +0300 Subject: [PATCH 0633/1142] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c8bbbc46..a3920f4b3 100644 --- a/README.md +++ b/README.md @@ -114,9 +114,9 @@ Features: ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Quick tour](docs/quick_tour.md) -* [Documentation](docs/index.md) -* [Blog](docs/index.md#blogs) +* [Quick tour](https://php-enqueue.github.io/enqueue-dev/quick_tour/) +* [Documentation](https://php-enqueue.github.io/enqueue-dev/) +* [Blog](https://php-enqueue.github.io/enqueue-dev/#blogs) * [Chat\Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) From 6deb8f9077fa9173b98fa2b36afcb0643d607789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sun, 26 May 2019 19:21:01 +0200 Subject: [PATCH 0634/1142] Use organization repository for doc hosting --- README.md | 6 +++--- bin/subtree-split | 2 ++ docs/_config.yml | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a3920f4b3..47a6174a5 100644 --- a/README.md +++ b/README.md @@ -114,9 +114,9 @@ Features: ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Quick tour](https://php-enqueue.github.io/enqueue-dev/quick_tour/) -* [Documentation](https://php-enqueue.github.io/enqueue-dev/) -* [Blog](https://php-enqueue.github.io/enqueue-dev/#blogs) +* [Quick tour](https://php-enqueue.github.io/quick_tour/) +* [Documentation](https://php-enqueue.github.io/) +* [Blog](https://php-enqueue.github.io/#blogs) * [Chat\Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/bin/subtree-split b/bin/subtree-split index e8aa1ed4c..9ab17cd58 100755 --- a/bin/subtree-split +++ b/bin/subtree-split @@ -44,6 +44,7 @@ function remote() } remote enqueue git@github.com:php-enqueue/enqueue.git +remote php-enqueue git@github.com:php-enqueue/php-enqueue.git remote simple-client git@github.com:php-enqueue/simple-client.git remote stomp git@github.com:php-enqueue/stomp.git remote amqp-ext git@github.com:php-enqueue/amqp-ext.git @@ -72,6 +73,7 @@ remote wamp git@github.com:php-enqueue/wamp.git remote monitoring git@github.com:php-enqueue/monitoring.git split 'pkg/enqueue' enqueue +split 'docs' php-enqueue split 'pkg/simple-client' simple-client split 'pkg/stomp' stomp split 'pkg/amqp-ext' amqp-ext diff --git a/docs/_config.yml b/docs/_config.yml index 4145394fe..0e457d2e6 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,6 @@ title: enqueue-dev description: A Jekyll theme for documentation -baseurl: "/enqueue-dev" # the subpath of your site, e.g. /blog +baseurl: "" # the subpath of your site, e.g. /blog url: "" # the base hostname & protocol for your site, e.g. http://example.com permalink: pretty From baf3135a837566d35d4e0ee539acc6977212dcc8 Mon Sep 17 00:00:00 2001 From: SAMUEL NELA Date: Sun, 26 May 2019 19:52:28 +0200 Subject: [PATCH 0635/1142] Fixed the service id for Transport --- docs/bundle/message_producer.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/bundle/message_producer.md b/docs/bundle/message_producer.md index bda5152d2..ecb0603e2 100644 --- a/docs/bundle/message_producer.md +++ b/docs/bundle/message_producer.md @@ -9,18 +9,18 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message producer -You can choose how to send messages either using a transport directly or with the client. +You can choose how to send messages either using a transport directly or with the client. Transport gives you the access to all transport specific features so you can tune things where the client provides you with easy to use abstraction. - + ## Transport - + ```php get('enqueue.transport.context'); +$context = $container->get('enqueue.transport.[transport_name].context'); $context->createProducer()->send( $context->createQueue('a_queue'), @@ -30,15 +30,15 @@ $context->createProducer()->send( ## Client -The client is shipped with two types of producers. The first one sends messages immediately +The client is shipped with two types of producers. The first one sends messages immediately where another one (it is called spool producer) collects them in memory and sends them `onTerminate` event (the response is already sent). -The producer has two types on send methods: +The producer has two types on send methods: * `sendEvent` - Message is sent to topic and many consumers can subscribe to it. It is "fire and forget" strategy. The event could be sent to "message bus" to other applications. * `sendCommand` - Message is to ONE exact consumer. It could be used as "fire and forget" or as RPC. The command message is always sent in scope of current application. - -### Send event + +### Send event ```php get(SpoolProducer::class); // message is being sent on console.terminate or kernel.terminate event $spoolProducer->sendEvent('a_topic', 'Hello there!'); -// you could send queued messages manually by calling flush method +// you could send queued messages manually by calling flush method $spoolProducer->flush(); ``` -### Send command +### Send command ```php get(SpoolProducer::class); // message is being sent on console.terminate or kernel.terminate event $spoolProducer->sendCommand('a_processor_name', 'Hello there!'); -// you could send queued messages manually by calling flush method +// you could send queued messages manually by calling flush method $spoolProducer->flush(); ``` From 8e7a0f11770f320429db420e84327f1ddb7d4420 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Mon, 27 May 2019 10:08:59 +0300 Subject: [PATCH 0636/1142] Update subtree-split --- bin/subtree-split | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/subtree-split b/bin/subtree-split index 9ab17cd58..c4caa3485 100755 --- a/bin/subtree-split +++ b/bin/subtree-split @@ -44,7 +44,7 @@ function remote() } remote enqueue git@github.com:php-enqueue/enqueue.git -remote php-enqueue git@github.com:php-enqueue/php-enqueue.git +remote php-enqueue git@github.com:php-enqueue/php-enqueue.github.io.git remote simple-client git@github.com:php-enqueue/simple-client.git remote stomp git@github.com:php-enqueue/stomp.git remote amqp-ext git@github.com:php-enqueue/amqp-ext.git From ce6ca697a8d2de232041f309b6b5448c4e02da48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sun, 26 May 2019 19:55:54 +0200 Subject: [PATCH 0637/1142] Start preparing navigation structure --- docs/async_event_dispatcher/quick_tour.md | 10 ++- docs/bundle/async_commands.md | 8 ++- docs/bundle/async_events.md | 34 +++++----- docs/bundle/cli_commands.md | 8 ++- docs/bundle/config_reference.md | 4 ++ docs/bundle/consumption_extension.md | 6 +- docs/bundle/debugging.md | 26 ++++--- docs/bundle/functional_testing.md | 34 +++++----- docs/bundle/job_queue.md | 32 +++++---- docs/bundle/message_processor.md | 50 +++++++------- docs/bundle/message_producer.md | 24 ++++--- docs/bundle/production_settings.md | 14 ++-- docs/bundle/quick_tour.md | 4 ++ docs/client/extensions.md | 18 +++-- docs/client/message_bus.md | 12 ++-- docs/client/message_examples.md | 26 ++++--- docs/client/quick_tour.md | 18 +++-- docs/client/rpc_call.md | 20 +++--- docs/client/supported_brokers.md | 8 ++- docs/consumption/extensions.md | 24 ++++--- docs/consumption/message_processor.md | 60 +++++++++-------- .../how-to-change-consume-command-logger.md | 10 ++- docs/dsn.md | 17 +++-- docs/elastica-bundle/overview.md | 4 ++ docs/index.md | 1 + docs/job_queue/run_sub_job.md | 14 ++-- docs/job_queue/run_unique_job.md | 14 ++-- docs/laravel/queues.md | 16 +++-- docs/laravel/quick_tour.md | 12 ++-- docs/magento/cli_commands.md | 6 +- docs/magento/quick_tour.md | 12 ++-- docs/magento2/cli_commands.md | 6 +- docs/magento2/quick_tour.md | 12 ++-- docs/messages.md | 9 ++- docs/monolog/send-messages-to-mq.md | 14 ++-- docs/quick_tour.md | 67 ++++++++++--------- docs/transport/amqp.md | 42 +++++++----- docs/transport/amqp_bunny.md | 38 ++++++----- docs/transport/amqp_lib.md | 58 +++++++++------- docs/transport/dbal.md | 28 +++++--- docs/transport/filesystem.md | 20 ++++-- docs/transport/gearman.md | 18 +++-- docs/transport/gps.md | 28 +++++--- docs/transport/index.md | 9 +++ docs/transport/kafka.md | 6 ++ docs/transport/mongodb.md | 30 +++++---- docs/transport/null.md | 10 ++- docs/transport/pheanstalk.md | 18 +++-- docs/transport/redis.md | 34 ++++++---- docs/transport/snsqs.md | 30 +++++---- docs/transport/sqs.md | 26 ++++--- docs/transport/stomp.md | 16 +++-- docs/transport/wamp.md | 14 ++-- 53 files changed, 664 insertions(+), 415 deletions(-) create mode 100644 docs/transport/index.md diff --git a/docs/async_event_dispatcher/quick_tour.md b/docs/async_event_dispatcher/quick_tour.md index 894c4a099..7f3fc6a78 100644 --- a/docs/async_event_dispatcher/quick_tour.md +++ b/docs/async_event_dispatcher/quick_tour.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,9 +13,9 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Async event dispatcher (Symfony) -The doc shows how you can setup async event dispatching in plain PHP. +The doc shows how you can setup async event dispatching in plain PHP. If you are looking for the ways to use it in Symfony application [read this post instead](../bundle/async_events.md) - + * [Installation](#installation) * [Configuration](#configuration) * [Dispatch event](#dispatch-event) @@ -47,7 +51,7 @@ $context = (new FsConnectionFactory('file://'.__DIR__.'/queues'))->createContext $eventQueue = $context->createQueue('symfony_events'); $registry = new SimpleRegistry( - ['the_event' => 'default'], + ['the_event' => 'default'], ['default' => new PhpSerializerEventTransformer($context)] ); diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md index 21299911c..883758642 100644 --- a/docs/bundle/async_commands.md +++ b/docs/bundle/async_commands.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -63,9 +67,9 @@ $promise = $producer->sendCommand(Commands::RUN_COMMAND, new RunCommand('debug:c // do other stuff. -if ($replyMessage = $promise->receive(5000)) { +if ($replyMessage = $promise->receive(5000)) { $result = CommandResult::jsonUnserialize($replyMessage->getBody()); - + echo $result->getOutput(); } ``` diff --git a/docs/bundle/async_events.md b/docs/bundle/async_events.md index 7c20381bc..2e6d1e630 100644 --- a/docs/bundle/async_events.md +++ b/docs/bundle/async_events.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,9 +13,9 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Async events -The EnqueueBundle allows you to dispatch events asynchronously. -Behind the scene it replaces your listener with one that sends a message to MQ. -The message contains the event object. +The EnqueueBundle allows you to dispatch events asynchronously. +Behind the scene it replaces your listener with one that sends a message to MQ. +The message contains the event object. The consumer, once it receives the message, restores the event and dispatches it to only async listeners. Async listeners benefits: @@ -57,14 +61,14 @@ or to `kernel.event_subscriber`: ```yaml # app/config/config.yml -services: +services: test_async_subscriber: class: 'AcmeBundle\Listener\TestAsyncSubscriber' tags: - { name: 'kernel.event_subscriber', async: true } ``` -That's basically it. The rest of the doc describes advanced features. +That's basically it. The rest of the doc describes advanced features. ## Advanced Usage. @@ -87,8 +91,8 @@ services: The bundle uses [php serializer](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue-bundle/Events/PhpSerializerEventTransformer.php) transformer by default to pass events through MQ. You can write a transformer for each event type by implementing the `Enqueue\AsyncEventDispatcher\EventTransformer` interface. -Consider the next example. It shows how to send an event that contains Doctrine entity as a subject - +Consider the next example. It shows how to send an event that contains Doctrine entity as a subject + ```php getSubject(); $entityClass = get_class($entity); - + $manager = $this->doctrine->getManagerForClass($entityClass); $meta = $manager->getClassMetadata($entityClass); $id = $meta->getIdentifierValues($entity); - + $message = new Message(); $message->setBody([ - 'entityClass' => $entityClass, + 'entityClass' => $entityClass, 'entityId' => $id, 'arguments' => $event->getArguments() ]); @@ -145,14 +149,14 @@ class FooEventTransformer implements EventTransformer public function toEvent($eventName, QueueMessage $message) { $data = JSON::decode($message->getBody()); - + $entityClass = $data['entityClass']; - + $manager = $this->doctrine->getManagerForClass($entityClass); if (false == $entity = $manager->find($entityClass, $data['entityId'])) { return Result::reject('The entity could not be found.'); } - + return new GenericEvent($entity, $data['arguments']); } } @@ -171,7 +175,7 @@ services: - {name: 'enqueue.event_transformer', eventName: 'foo' } ``` -The `eventName` attribute accepts a regexp. You can do next `eventName: '/foo\..*?/'`. +The `eventName` attribute accepts a regexp. You can do next `eventName: '/foo\..*?/'`. It uses this transformer for all event with the name beginning with `foo.` [back to index](../index.md) diff --git a/docs/bundle/cli_commands.md b/docs/bundle/cli_commands.md index 9bb114aba..f4fd8a724 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/bundle/cli_commands.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,7 +13,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Cli commands -The EnqueueBundle provides several commands. +The EnqueueBundle provides several commands. The most useful one `enqueue:consume` connects to the broker and process the messages. Other commands could be useful during debugging (like `enqueue:topics`) or deployment (like `enqueue:setup-broker`). @@ -134,7 +138,7 @@ Help: ``` ## enqueue:transport:consume - + ``` ./bin/console enqueue:transport:consume --help Usage: diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index 1d57875d5..c146ee058 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: diff --git a/docs/bundle/consumption_extension.md b/docs/bundle/consumption_extension.md index 1caf82a53..216218551 100644 --- a/docs/bundle/consumption_extension.md +++ b/docs/bundle/consumption_extension.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -23,7 +27,7 @@ use Enqueue\Consumption\Context\PostMessageReceived; class CountProcessedMessagesExtension implements PostMessageReceivedExtensionInterface { private $processedMessages = 0; - + public function onPostMessageReceived(PostMessageReceived $context): void { $this->processedMessages += 1; diff --git a/docs/bundle/debugging.md b/docs/bundle/debugging.md index 4dd16f05e..70cd5e7b2 100644 --- a/docs/bundle/debugging.md +++ b/docs/bundle/debugging.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -11,7 +15,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made ## Profiler -It may be useful to see what messages were sent during a http request. +It may be useful to see what messages were sent during a http request. The bundle provides a collector for Symfony [profiler](http://symfony.com/doc/current/profiler.html). The extension collects all sent messages @@ -36,17 +40,17 @@ use Symfony\Component\HttpFoundation\Request; use Enqueue\Client\Message; use Enqueue\Client\ProducerInterface; -class DefaultController extends Controller +class DefaultController extends Controller /** * @Route("/", name="homepage") */ public function indexAction(Request $request) { /** @var ProducerInterface $producer */ - $producer = $this->get('enqueue.producer'); - + $producer = $this->get('enqueue.producer'); + $producer->sendEvent('foo_topic', 'Hello world'); - + $producer->sendEvent('bar_topic', ['bar' => 'val']); $message = new Message(); @@ -59,10 +63,10 @@ class DefaultController extends Controller ``` For this action you may see something like this in the profiler: - + ![Symfony profiler](../images/symfony_profiler.png) - -## Queues and topics available + +## Queues and topics available There are two console commands `./bin/console enqueue:queues` and `./bin/console enqueue:topics`. They are here to help you to learn more about existing topics and queues. @@ -71,11 +75,11 @@ Here's the result: ![Cli debug commands](../images/cli_debug_commands.png) -## Consume command verbosity +## Consume command verbosity -By default the commands `enqueue:consume` or `enqueue:transport:consume` does not output anything. +By default the commands `enqueue:consume` or `enqueue:transport:consume` does not output anything. You can add `-vvv` to see more information. - + ![Consume command verbosity](../images/consume_command_verbosity.png) [back to index](../index.md) diff --git a/docs/bundle/functional_testing.md b/docs/bundle/functional_testing.md index ae25293a9..c7ef36e60 100644 --- a/docs/bundle/functional_testing.md +++ b/docs/bundle/functional_testing.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -10,17 +14,17 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Functional testing In this chapter we give some advices on how to test message queue related logic. - + * [NULL transport](#null-transport) * [Traceable message producer](#traceable-message-producer) ## NULL transport -While testing the application you don't usually need to send real message to real broker. -Or even have a dependency on a MQ broker. -Here's the purpose of the NULL transport. -It simple do nothing when you ask it to send a message. -Pretty useful in tests. +While testing the application you don't usually need to send real message to real broker. +Or even have a dependency on a MQ broker. +Here's the purpose of the NULL transport. +It simple do nothing when you ask it to send a message. +Pretty useful in tests. Here's how you can configure it. ```yaml @@ -35,7 +39,7 @@ enqueue: ## Traceable message producer Imagine you have a service `my_service` with a method `someMethod()` that internally sends a message and you have to find out was the message sent or not. -There is a solution for that. You have to enable traceable message producer in test environment. +There is a solution for that. You have to enable traceable message producer in test environment. ```yaml # app/config/config_test.yml @@ -57,28 +61,28 @@ class FooTest extends WebTestCase { /** @var \Symfony\Bundle\FrameworkBundle\Client */ private $client; - + public function setUp() { - $this->client = static::createClient(); + $this->client = static::createClient(); } - + public function testMessageSentToFooTopic() { // Use your own business logic here: $service = $this->client->getContainer()->get('my_service'); - + // someMethod() is part of your business logic and is calling somewhere $producer->send('fooTopic', 'messageBody'); $service->someMethod(); - + $traces = $this->getProducer()->getTopicTraces('fooTopic'); - + $this->assertCount(1, $traces); $this->assertEquals('messageBody', $traces[0]['message']); } - + /** - * @return TraceableProducer + * @return TraceableProducer */ private function getProducer() { diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index bc574e05b..c98a4635c 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -20,9 +24,9 @@ until previous job has finished. ## Installation -The easiest way to install Enqueue's job queues is to by requiring a `enqueue/job-queue-pack` pack. +The easiest way to install Enqueue's job queues is to by requiring a `enqueue/job-queue-pack` pack. It installs installs everything you need. It also configures everything for you If you are on Symfony Flex. - + ```bash $ composer require enqueue/job-queue-pack=^0.8 ``` @@ -45,7 +49,7 @@ class AppKernel extends Kernel new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), new Enqueue\Bundle\EnqueueBundle(), ]; - + return $bundles; } } @@ -59,7 +63,7 @@ class AppKernel extends Kernel enqueue: default: # plus basic bundle configuration - + job: true doctrine: @@ -84,14 +88,14 @@ $ bin/console doctrine:schema:update ## Unique job Guarantee that there is only one job with such name running at a time. -For example you have a task that builds a search index. +For example you have a task that builds a search index. It takes quite a lot of time and you don't want another instance of same task working at the same time. -Here's how to do it: +Here's how to do it: * Write a job processor class: ```php -jobRunner = $jobRunner; } @@ -127,8 +131,8 @@ class SearchReindexProcessor implements Processor, CommandSubscriberInterface return $result ? self::ACK : self::REJECT; } - - public static function getSubscribedCommand() + + public static function getSubscribedCommand() { return 'search_reindex'; } @@ -174,7 +178,7 @@ use Interop\Queue\Message; use Interop\Queue\Context; use Interop\Queue\Processor; -class Step1Processor implements Processor +class Step1Processor implements Processor { /** * @var JobRunner @@ -217,7 +221,7 @@ class Step1Processor implements Processor } } -class Step2Processor implements Processor +class Step2Processor implements Processor { /** * @var JobRunner @@ -258,7 +262,7 @@ use Interop\Queue\Message; use Interop\Queue\Context; use Interop\Queue\Processor; -class ReindexProcessor implements Processor +class ReindexProcessor implements Processor { /** * @var JobRunner diff --git a/docs/bundle/message_processor.md b/docs/bundle/message_processor.md index bb89f2fc1..ba40e888f 100644 --- a/docs/bundle/message_processor.md +++ b/docs/bundle/message_processor.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,7 +13,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message processor -A processor is responsible for processing consumed messages. +A processor is responsible for processing consumed messages. Message processors and usage examples described in [consumption/message_processor](../consumption/message_processor.md) Here we just show how to register a message processor service to enqueue. @@ -17,16 +21,16 @@ Here we just show how to register a message processor service to enqueue. * [Register a transport processor](#register-a-transport-processor) -* Client: +* Client: * [Register a topic subscriber processor](#register-a-topic-subscriber-processor) * [Register a command subscriber processor](#register-a-command-subscriber-processor) * [Register a custom processor](#register-a-custom-processor) - + ## Register a topic subscriber processor -There is a `TopicSubscriberInterface` interface (like [EventSubscriberInterface](https://github.com/symfony/symfony/blob/master/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php)). -It is handy to subscribe on event messages. +There is a `TopicSubscriberInterface` interface (like [EventSubscriberInterface](https://github.com/symfony/symfony/blob/master/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php)). +It is handy to subscribe on event messages. Check interface description for more possible ways to configure it. It allows to keep subscription and processing logic in one place. @@ -55,15 +59,15 @@ services: App\Queue\SayHelloProcessor: tags: - { name: 'enqueue.topic_subscriber' } - + # registers to no default client - - { name: 'enqueue.topic_subscriber', client: 'foo' } + - { name: 'enqueue.topic_subscriber', client: 'foo' } ``` ## Register a command subscriber processor -There is a `CommandSubscriberInterface` interface. -It is handy to register a command processor. +There is a `CommandSubscriberInterface` interface. +It is handy to register a command processor. Check interface description for more possible ways to configure it. It allows to keep subscription and processing logic in one place. @@ -92,14 +96,14 @@ services: App\Queue\SendEmailProcessor: tags: - { name: 'enqueue.command_subscriber' } - + # registers to no default client - - { name: 'enqueue.command_subscriber', client: 'foo' } + - { name: 'enqueue.command_subscriber', client: 'foo' } ``` There is a possibility to register a command processor which works exclusively on the queue (no other processors bound to it). -In this case you can send messages without setting any message properties at all. -It might be handy if you want to process messages that are sent by another application. +In this case you can send messages without setting any message properties at all. +It might be handy if you want to process messages that are sent by another application. Here's a configuration example: @@ -127,7 +131,7 @@ The service has to be tagged with `enqueue.command_subscriber` tag. # Register a custom processor You could register a processor that does not implement neither `CommandSubscriberInterface` not `TopicSubscriberInterface`. -There is a tag `enqueue.processor` for it. You must define either `topic` or `command` tag attribute. +There is a tag `enqueue.processor` for it. You must define either `topic` or `command` tag attribute. It is possible to define a client you would like to register the processor to. By default, it is registered to default client (first configured or named `default` one ). ```yaml @@ -136,11 +140,11 @@ It is possible to define a client you would like to register the processor to. B services: AppBundle\Async\SayHelloProcessor: tags: - # registers as topic processor + # registers as topic processor - { name: 'enqueue.processor', topic: 'aTopic' } # registers as command processor - { name: 'enqueue.processor', command: 'aCommand' } - + # registers to no default client - { name: 'enqueue.processor', command: 'aCommand', client: 'foo' } ``` @@ -148,13 +152,13 @@ services: The tag has some additional options: * queue -* prefix_queue +* prefix_queue * processor * exclusive You could add your own attributes. They will be accessible through `Route::getOption` later. -# Register a transport processor +# Register a transport processor If you want to use a processor with `enqueue:transport:consume` it should be tagged `enqueue.transport.processor`. It is possible to define a transport you would like to register the processor to. By default, it is registered to default transport (first configured or named `default` one ). @@ -166,19 +170,19 @@ services: App\Queue\SayHelloProcessor: tags: - { name: 'enqueue.transport.processor', processor: 'say_hello' } - + # registers to no default transport - - { name: 'enqueue.processor', transport: 'foo' } -``` + - { name: 'enqueue.processor', transport: 'foo' } +``` The tag has some additional options: - + * processor Now you can run a command and tell it to consume from a given queue and process messages with given processor: ```bash -$ ./bin/console enqueue:transport:consume say_hello foo_queue -vvv +$ ./bin/console enqueue:transport:consume say_hello foo_queue -vvv ``` [back to index](../index.md) diff --git a/docs/bundle/message_producer.md b/docs/bundle/message_producer.md index bda5152d2..93577137c 100644 --- a/docs/bundle/message_producer.md +++ b/docs/bundle/message_producer.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,11 +13,11 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message producer -You can choose how to send messages either using a transport directly or with the client. +You can choose how to send messages either using a transport directly or with the client. Transport gives you the access to all transport specific features so you can tune things where the client provides you with easy to use abstraction. - + ## Transport - + ```php createProducer()->send( ## Client -The client is shipped with two types of producers. The first one sends messages immediately +The client is shipped with two types of producers. The first one sends messages immediately where another one (it is called spool producer) collects them in memory and sends them `onTerminate` event (the response is already sent). -The producer has two types on send methods: +The producer has two types on send methods: * `sendEvent` - Message is sent to topic and many consumers can subscribe to it. It is "fire and forget" strategy. The event could be sent to "message bus" to other applications. * `sendCommand` - Message is to ONE exact consumer. It could be used as "fire and forget" or as RPC. The command message is always sent in scope of current application. - -### Send event + +### Send event ```php get(SpoolProducer::class); // message is being sent on console.terminate or kernel.terminate event $spoolProducer->sendEvent('a_topic', 'Hello there!'); -// you could send queued messages manually by calling flush method +// you could send queued messages manually by calling flush method $spoolProducer->flush(); ``` -### Send command +### Send command ```php get(SpoolProducer::class); // message is being sent on console.terminate or kernel.terminate event $spoolProducer->sendCommand('a_processor_name', 'Hello there!'); -// you could send queued messages manually by calling flush method +// you could send queued messages manually by calling flush method $spoolProducer->flush(); ``` diff --git a/docs/bundle/production_settings.md b/docs/bundle/production_settings.md index 2f74ee7ec..72eb4582c 100644 --- a/docs/bundle/production_settings.md +++ b/docs/bundle/production_settings.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -11,12 +15,12 @@ Enqueue is an MIT-licensed open source project with its ongoing development made ## Supervisord -As you may read in [quick tour](quick_tour.md) you have to run `enqueue:consume` in order to process messages +As you may read in [quick tour](quick_tour.md) you have to run `enqueue:consume` in order to process messages The php process is not designed to work for a long time. So it has to quit periodically. -Or, the command may exit because of error or exception. +Or, the command may exit because of error or exception. Something has to bring it back and continue message consumption. -We advise you to use [Supervisord](http://supervisord.org/) for that. -It starts processes and keep an eye on them while they are working. +We advise you to use [Supervisord](http://supervisord.org/) for that. +It starts processes and keep an eye on them while they are working. Here an example of supervisord configuration. @@ -36,4 +40,4 @@ redirect_stderr=true _**Note**: Pay attention to `--time-limit` it tells the command to exit after 5 minutes._ -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) diff --git a/docs/bundle/quick_tour.md b/docs/bundle/quick_tour.md index 4e5f57d94..55ee5117f 100644 --- a/docs/bundle/quick_tour.md +++ b/docs/bundle/quick_tour.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: diff --git a/docs/client/extensions.md b/docs/client/extensions.md index 979d13d60..b4d3df89b 100644 --- a/docs/client/extensions.md +++ b/docs/client/extensions.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -10,7 +14,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Client extensions. There is an ability to hook into sending process. You have to create an extension class that implements `Enqueue\Client\ExtensionInterface` interface. -For example, `TimestampMessageExtension` extension adds timestamps every message before sending it to MQ. +For example, `TimestampMessageExtension` extension adds timestamps every message before sending it to MQ. ```php setTimestamp(time()); } } - + public function onPostSend($topic, Message $message) { - + } -} +} ``` ## Symfony -To use the extension in Symfony, you have to register it as a container service with a special tag. +To use the extension in Symfony, you have to register it as a container service with a special tag. ```yaml # config/services.yaml @@ -46,9 +50,9 @@ services: timestamp_message_extension: class: Acme\TimestampMessageExtension tags: - - { name: 'enqueue.client.extension' } + - { name: 'enqueue.client.extension' } ``` -You can add `priority` attribute with a number. The higher value you set the earlier the extension is called. +You can add `priority` attribute with a number. The higher value you set the earlier the extension is called. [back to index](../index.md) diff --git a/docs/client/message_bus.md b/docs/client/message_bus.md index 3a2a9a401..56019f6f5 100644 --- a/docs/client/message_bus.md +++ b/docs/client/message_bus.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -8,18 +12,18 @@ Enqueue is an MIT-licensed open source project with its ongoing development made --- # Client. Message bus - + Here's a description of message bus from [Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageBus.html) > A Message Bus is a combination of a common data model, a common command set, and a messaging infrastructure to allow different systems to communicate through a shared set of interfaces. -If all your applications built on top of Enqueue Client you have to only make sure they send message to a shared topic. +If all your applications built on top of Enqueue Client you have to only make sure they send message to a shared topic. The rest is done under the hood. If you'd like to connect another application (written on Python for example ) you have to follow these rules: -* An application defines its own queue that is connected to the topic as fanout. -* A message sent to message bus topic must have a header `enqueue.topic_name`. +* An application defines its own queue that is connected to the topic as fanout. +* A message sent to message bus topic must have a header `enqueue.topic_name`. * Once a message is received it could be routed internally. `enqueue.topic_name` header could be used for that. [back to index](../index.md) diff --git a/docs/client/message_examples.md b/docs/client/message_examples.md index 9a3747b19..5c882588e 100644 --- a/docs/client/message_examples.md +++ b/docs/client/message_examples.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -15,11 +19,11 @@ Enqueue is an MIT-licensed open source project with its ongoing development made * [Priority](#priority) * [Timestamp, Content type, Message id](#timestamp-content-type-message-id) -## Scope +## Scope -There are two two types possible scopes: `Message:SCOPE_MESSAGE_BUS` and `Message::SCOPE_APP`. +There are two two types possible scopes: `Message:SCOPE_MESSAGE_BUS` and `Message::SCOPE_APP`. The first one instructs the client send messages (if driver supports) to the message bus so other apps can consume those messages. -The second in turns limits the message to the application that sent it. No other apps could receive it. +The second in turns limits the message to the application that sent it. No other apps could receive it. ```php setScope(Message::SCOPE_MESSAGE_BUS); /** @var \Enqueue\Client\ProducerInterface $producer */ $producer->sendEvent('aTopic', $message); ``` - -## Delay + +## Delay Message sent with a delay set is processed after the delay time exceed. -Some brokers may not support it from scratch. +Some brokers may not support it from scratch. In order to use delay feature with [RabbitMQ](https://www.rabbitmq.com/) you have to install a [delay plugin](https://github.com/rabbitmq/rabbitmq-delayed-message-exchange). ```php @@ -53,7 +57,7 @@ $producer->sendEvent('aTopic', $message); ## Expiration (TTL) -The message may have an expiration or TTL (time to live). +The message may have an expiration or TTL (time to live). The message is removed from the queue if the expiration exceeded but the message has not been consumed. For example it make sense to send a forgot password email within first few minutes, nobody needs it in an hour. @@ -69,7 +73,7 @@ $message->setExpire(60); // seconds $producer->sendEvent('aTopic', $message); ``` -## Priority +## Priority You can set a priority If you want a message to be processed quicker than other messages in the queue. Client defines five priority constants: @@ -95,10 +99,10 @@ $producer->sendEvent('aTopic', $message); ## Timestamp, Content type, Message id -Those are self describing things. -Usually they are set by Client so you don't have to worry about them. +Those are self describing things. +Usually they are set by Client so you don't have to worry about them. If you do not like what Client set you can always set custom values: - + ```php Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -42,12 +46,12 @@ There two types of message a client can produce: events and commands. Events are used to notify others about something, in other words it is an implementation of [publish-subscribe pattern](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern), sometimes called "fire-and-forget" too. With events there is no way to get a reply as a producer is not aware of any subscribed consumers. Commands are used to request a job to be done. It is an implementation of one-to-one messaging pattern. -A producer can request a reply from the consumer though it is up to the consumer whether send it or not. +A producer can request a reply from the consumer though it is up to the consumer whether send it or not. -Commands work inside the app [scope](message_examples.md#scope) where events work inside the app scope as well as on [message bus](message_bus.md) scope. +Commands work inside the app [scope](message_examples.md#scope) where events work inside the app scope as well as on [message bus](message_bus.md) scope. Send event examples: - + ```php sendEvent('user_activated', new class() implements \JsonSerializable { ``` Send command examples: - + ```php bindTopic('a_bar_topic', function(Message $psrMessage) { // processing logic here - + return Processor::ACK; }); @@ -140,13 +144,13 @@ $application->run(); and run to see what is there: ```bash -$ php bin/enqueue.php +$ php bin/enqueue.php ``` or consume messages ```bash -$ php bin/enqueue.php enqueue:consume -vvv --setup-broker +$ php bin/enqueue.php enqueue:consume -vvv --setup-broker ``` [back to index](../index.md) diff --git a/docs/client/rpc_call.md b/docs/client/rpc_call.md index 4cb5b5669..2f57e4833 100644 --- a/docs/client/rpc_call.md +++ b/docs/client/rpc_call.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,7 +13,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Client. RPC call -The client's [quick tour](quick_tour.md) describes how to get the client object. +The client's [quick tour](quick_tour.md) describes how to get the client object. Here we'll show you how to use Enqueue Client to perform a [RPC call](https://en.wikipedia.org/wiki/Remote_procedure_call). You can do it by defining a command which returns something. @@ -18,7 +22,7 @@ You can do it by defining a command which returns something. On the consumer side we have to register a command processor which computes the result and send it back to the sender. Pay attention that you have to add reply extension. It wont work without it. -Of course it is possible to implement rpc server side based on transport classes only. That would require a bit more work to do. +Of course it is possible to implement rpc server side based on transport classes only. That would require a bit more work to do. ```php bindCommand('square', function (Message $message, Context $context) use (&$requestMessage) { $number = (int) $message->getBody(); - + return Result::reply($context->createMessage($number ^ 2)); }); @@ -48,8 +52,8 @@ $client->consume(new ChainExtension([new ReplyExtension()])); ## The sender side -On the sender's side we need a client which send a command and wait for reply messages. - +On the sender's side we need a client which send a command and wait for reply messages. + ```php sendCommand('square', 5, true)->receive(5000 /* 5 sec */)->getBody ``` You can perform several requests asynchronously with `sendCommand` and ask for replays later. - + ```php $promise) { if ($replyMessage = $promise->receiveNoWait()) { $replyMessages[$index] = $replyMessage; - + unset($promises[$index]); } } } -``` \ No newline at end of file +``` diff --git a/docs/client/supported_brokers.md b/docs/client/supported_brokers.md index ddc8a3968..6e06a62ae 100644 --- a/docs/client/supported_brokers.md +++ b/docs/client/supported_brokers.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -25,11 +29,11 @@ Here's the list of transports supported by Enqueue Client: | Kafka | [enqueue/rdkafka](../transport/kafka.md) | kafka: | | Null | [enqueue/null](../transport/null.md) | null: | -Here's the list of protocols and Client features supported by them +Here's the list of protocols and Client features supported by them | Protocol | Priority | Delay | Expiration | Setup broker | Message bus | |:--------------:|:--------:|:--------:|:----------:|:------------:|:-----------:| -| AMQP | No | No | Yes | Yes | Yes | +| AMQP | No | No | Yes | Yes | Yes | | RabbitMQ AMQP | Yes | Yes | Yes | Yes | Yes | | STOMP | No | No | Yes | No | Yes** | | RabbitMQ STOMP | Yes | Yes | Yes | Yes*** | Yes** | diff --git a/docs/consumption/extensions.md b/docs/consumption/extensions.md index ff59d09b6..080f12664 100644 --- a/docs/consumption/extensions.md +++ b/docs/consumption/extensions.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -12,11 +16,11 @@ Enqueue is an MIT-licensed open source project with its ongoing development made You can learn how to register extensions in [quick tour](../quick_tour.md#consumption). There's dedicated [chapter](../bundle/consumption_extension.md) for how to add extension in Symfony app. -## [LoggerExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/LoggerExtension.php) +## [LoggerExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/LoggerExtension.php) It sets logger to queue consumer context. All log messages will go to it. -## [DoctrineClearIdentityMapExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php) +## [DoctrineClearIdentityMapExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php) It clears Doctrine's identity map after a message is processed. It reduce memory usage. @@ -26,12 +30,12 @@ It test a database connection and if it is lost it does reconnect. Fixes "MySQL ## [ReplyExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/ReplyExtension.php) -It comes with RPC code and simplifies reply logic. +It comes with RPC code and simplifies reply logic. It takes care of sending a reply message to reply queue. ## [SetupBrokerExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Client/ConsumptionExtension/SetupBrokerExtension.php) -It responsible for configuring everything at a broker side. queues, topics, bindings and so on. +It responsible for configuring everything at a broker side. queues, topics, bindings and so on. The extension is added at runtime when `--setup-broker` option is used. ## [LimitConsumedMessagesExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/LimitConsumedMessagesExtension.php) @@ -42,8 +46,8 @@ The extension is added at runtime when `--message-limit=10` option is used. ## [LimitConsumerMemoryExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/LimitConsumerMemoryExtension.php) The extension interrupts consumption once a memory limit is reached. -The extension is added at runtime when `--memory-limit=512` option is used. -The value is Mb. +The extension is added at runtime when `--memory-limit=512` option is used. +The value is Mb. ## [LimitConsumptionTimeExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/LimitConsumptionTimeExtension.php) @@ -53,14 +57,14 @@ The extension is added at runtime when `--time-limit="now + 2 minutes"` option i ## [SignalExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/SignalExtension.php) The extension catch process signals and gracefully stops consumption. Works only on NIX platforms. - + ## [DelayRedeliveredMessageExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Client/ConsumptionExtension/DelayRedeliveredMessageExtension.php) -The extension checks whether the received message is redelivered (There was attempt to process message but it failed). -If so the extension reject the origin message and creates a copy message with a delay. +The extension checks whether the received message is redelivered (There was attempt to process message but it failed). +If so the extension reject the origin message and creates a copy message with a delay. ## [ConsumerMonitoringExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/monitoring.md#consumption-extension) -There is an extension ConsumerMonitoringExtension for Enqueue QueueConsumer. It could collect consumed messages and consumer stats for you and send them to Grafana, InfluxDB or Datadog. +There is an extension ConsumerMonitoringExtension for Enqueue QueueConsumer. It could collect consumed messages and consumer stats for you and send them to Grafana, InfluxDB or Datadog. [back to index](../index.md) diff --git a/docs/consumption/message_processor.md b/docs/consumption/message_processor.md index 956cf47f7..911d6f9d1 100644 --- a/docs/consumption/message_processor.md +++ b/docs/consumption/message_processor.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -28,24 +32,24 @@ use Interop\Queue\Context; class SendMailProcessor implements Processor { - public function process(Message $message, Context $context) + public function process(Message $message, Context $context) { $this->mailer->send('foo@example.com', $message->getBody()); - + return self::ACK; } } ``` -By returning `self::ACK` a processor tells a broker that the message has been processed correctly. +By returning `self::ACK` a processor tells a broker that the message has been processed correctly. There are other statuses: * `self::ACK` - Use this constant when the message is processed successfully and the message could be removed from the queue. * `self::REJECT` - Use this constant when the message is not valid or could not be processed. The message is removed from the queue. -* `self::REQUEUE` - Use this constant when the message is not valid or could not be processed right now but we can try again later +* `self::REQUEUE` - Use this constant when the message is not valid or could not be processed right now but we can try again later -Look at the next example that shows the message validation before sending a mail. If the message is not valid a processor rejects it. +Look at the next example that shows the message validation before sending a mail. If the message is not valid a processor rejects it. ```php getBody()); if ($user = $this->userRepository->find($data['userId'])) { return self::REJECT; } - + $this->mailer->send($user->getEmail(), $data['text']); - + return self::ACK; } } ``` -It is possible to find out whether the message failed previously or not. -There is `isRedelivered` method for that. -If it returns true than there was attempt to process message. - +It is possible to find out whether the message failed previously or not. +There is `isRedelivered` method for that. +If it returns true than there was attempt to process message. + ```php isRedelivered()) { return self::REQUEUE; } - + $this->mailer->send('foo@example.com', $message->getBody()); - + return self::ACK; } } ``` The second argument is your context. You can use it to send messages to other queues\topics. - + ```php mailer->send('foo@example.com', $message->getBody()); - + $queue = $context->createQueue('anotherQueue'); $message = $context->createMessage('Message has been sent'); $context->createProducer()->send($queue, $message); - + return self::ACK; } } ``` -## Reply result +## Reply result The consumption component provide some useful extensions, for example there is an extension that makes RPC processing simpler. The producer might wait for a reply from a consumer and in order to send it a processor has to return a reply result. Don't forget to add `ReplyExtension`. - + ```php mailer->send('foo@example.com', $message->getBody()); - + $replyMessage = $context->createMessage('Message has been sent'); - + return Result::reply($replyMessage); } } @@ -160,14 +164,14 @@ $queueConsumer->consume(); ## On exceptions -It is advised to not catch exceptions and [fail fast](https://en.wikipedia.org/wiki/Fail-fast). -Also consider using [supervisord](supervisord.org) or similar process manager to restart exited consumers. +It is advised to not catch exceptions and [fail fast](https://en.wikipedia.org/wiki/Fail-fast). +Also consider using [supervisord](supervisord.org) or similar process manager to restart exited consumers. Despite advising to fail there are some cases where you might want to catch exceptions. * A message validator throws an exception on invalid message. It is better to catch it and return `REJECT`. -* Some transports ([Doctrine DBAL](../transport/dbal.md), [Filesystem](../transport/filesystem.md), [Redis](../transport/redis.md)) does notice an error, -and therefor won't be able to redeliver the message. The message is completely lost. You might want to catch an exception to properly redelivery\requeue the message. +* Some transports ([Doctrine DBAL](../transport/dbal.md), [Filesystem](../transport/filesystem.md), [Redis](../transport/redis.md)) does notice an error, +and therefor won't be able to redeliver the message. The message is completely lost. You might want to catch an exception to properly redelivery\requeue the message. # Examples diff --git a/docs/cookbook/symfony/how-to-change-consume-command-logger.md b/docs/cookbook/symfony/how-to-change-consume-command-logger.md index 83fa9aa32..8d518bb2a 100644 --- a/docs/cookbook/symfony/how-to-change-consume-command-logger.md +++ b/docs/cookbook/symfony/how-to-change-consume-command-logger.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -13,8 +17,8 @@ By default `bin/console enqueue:consume` (or `bin/console enqueue:transport:cons The amount of info could be controlled by verbosity option (-v, -vv, -vvv). In order to change the default logger used by a command you have to register a `LoggerExtension` just before the default one. -The extension asks you for a logger service, so just pass the one you want to use. -Here's how you can do it. +The extension asks you for a logger service, so just pass the one you want to use. +Here's how you can do it. ```yaml // config/services.yaml @@ -31,7 +35,7 @@ services: The logger extension with the highest priority will set its logger. -[back to index](../../index.md) +[back to index](../../index.md) diff --git a/docs/dsn.md b/docs/dsn.md index 701208a02..71fb3574a 100644 --- a/docs/dsn.md +++ b/docs/dsn.md @@ -1,3 +1,8 @@ +--- +layout: default +title: DSN +nav_order: 98 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,12 +14,12 @@ Enqueue is an MIT-licensed open source project with its ongoing development made ## DSN Parser. -The [enqueue/dsn](https://github.com/php-enqueue/dsn) tool helps to parse DSN\URI string. -The tool is used by Enqueue transports to parse DSNs. +The [enqueue/dsn](https://github.com/php-enqueue/dsn) tool helps to parse DSN\URI string. +The tool is used by Enqueue transports to parse DSNs. ## Installation -```bash +```bash composer req enqueue/dsn 0.9.x ``` @@ -40,7 +45,7 @@ $dsn->getPort(); // 3306 $dsn->getQueryString(); // 'connection_timeout=123' $dsn->getQuery(); // ['connection_timeout' => '123'] $dsn->getString('connection_timeout'); // '123' -$dsn->getDecimal('connection_timeout'); // 123 +$dsn->getDecimal('connection_timeout'); // 123 ``` Parse Cluster DSN: @@ -62,7 +67,7 @@ $dsns[0]->getPort(); // 3306 $dsns[1]->getUser(); // 'user' $dsns[1]->getPassword(); // 'password' $dsns[1]->getHost(); // 'bar' -$dsns[1]->getPort(); // 5678 +$dsns[1]->getPort(); // 5678 ``` Some parts could be omitted: @@ -122,4 +127,4 @@ $dsn = Dsn::parseFirst('mysql:?connection_timeout=notInt'); $dsn->getDecimal('connection_timeout'); // throws exception here ``` -[back to index](index.md) \ No newline at end of file +[back to index](index.md) diff --git a/docs/elastica-bundle/overview.md b/docs/elastica-bundle/overview.md index 40b0ea23a..9fa9c9473 100644 --- a/docs/elastica-bundle/overview.md +++ b/docs/elastica-bundle/overview.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: diff --git a/docs/index.md b/docs/index.md index 6fda30bee..54665bb76 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,6 +4,7 @@ layout: default title: Index +nav_order: 1 ---

Supporting Enqueue

diff --git a/docs/job_queue/run_sub_job.md b/docs/job_queue/run_sub_job.md index 325c5ccd7..4944f4a23 100644 --- a/docs/job_queue/run_sub_job.md +++ b/docs/job_queue/run_sub_job.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,9 +13,9 @@ Enqueue is an MIT-licensed open source project with its ongoing development made ## Job queue. Run sub job -It shows how you can create and run a sub job, which it is executed separately. -You can create as many sub jobs as you like. -They will be executed in parallel. +It shows how you can create and run a sub job, which it is executed separately. +You can create as many sub jobs as you like. +They will be executed in parallel. ```php Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -15,18 +19,18 @@ There is job queue component build on top of a transport. It provides some addit * Run unique job feature. If used guarantee that there is not any job with the same name running same time. * Sub jobs. If used allow split a big job into smaller pieces and process them asynchronously and in parallel. * Depended job. If used allow send a message when the whole job is finished (including sub jobs). - + Here's some examples. -It shows how you can run unique job using job queue (The configuration is described in a dedicated chapter). +It shows how you can run unique job using job queue (The configuration is described in a dedicated chapter). ```php -Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -10,7 +14,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Laravel Queue. Quick tour. The [LaravelQueue](https://github.com/php-enqueue/laravel-queue) package allows to use [queue-interop](https://github.com/queue-interop/queue-interop) compatible transports [the Laravel way](https://laravel.com/docs/5.4/queues). -I suppose you already [installed and configured](quick_tour.md) the package so let's look what you have to do to make queue work. +I suppose you already [installed and configured](quick_tour.md) the package so let's look what you have to do to make queue work. ## Configure @@ -64,16 +68,16 @@ $ php artisan queue:work interop return [ // uncomment to set it as default // 'default' => env('QUEUE_DRIVER', 'interop'), - + 'connections' => [ 'interop' => [ 'driver' => 'interop', - + // connects to localhost 'dsn' => 'amqp:', // - - // could be "rabbitmq_dlx", "rabbitmq_delay_plugin", instance of DelayStrategy interface or null - // 'delay_strategy' => 'rabbitmq_dlx' + + // could be "rabbitmq_dlx", "rabbitmq_delay_plugin", instance of DelayStrategy interface or null + // 'delay_strategy' => 'rabbitmq_dlx' ], ], ]; diff --git a/docs/laravel/quick_tour.md b/docs/laravel/quick_tour.md index 970a06e29..cee8dec4b 100644 --- a/docs/laravel/quick_tour.md +++ b/docs/laravel/quick_tour.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,11 +13,11 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Laravel Queue. Quick tour. -The [enqueue/laravel-queue](https://github.com/php-enqueue/laravel-queue) is message queue bridge for Enqueue. You can use all transports built on top of [queue-interop](https://github.com/queue-interop/queue-interop) including [all supported](https://github.com/php-enqueue/enqueue-dev/tree/master/docs/transport) by Enqueue. +The [enqueue/laravel-queue](https://github.com/php-enqueue/laravel-queue) is message queue bridge for Enqueue. You can use all transports built on top of [queue-interop](https://github.com/queue-interop/queue-interop) including [all supported](https://github.com/php-enqueue/enqueue-dev/tree/master/docs/transport) by Enqueue. The package allows you to use queue interop transport the [laravel way](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/laravel/queues.md) as well as integrates the [enqueue simple client](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/laravel/quick_tour.md#enqueue-simple-client). -**NOTE:** The part of this code was originally proposed as a PR to [laravel/framework#20148](https://github.com/laravel/framework/pull/20148). It was closed without much explanations, so I decided to open source it as a stand alone package. +**NOTE:** The part of this code was originally proposed as a PR to [laravel/framework#20148](https://github.com/laravel/framework/pull/20148). It was closed without much explanations, so I decided to open source it as a stand alone package. ## Install @@ -40,7 +44,7 @@ return [ ## Laravel queues At this stage you are already able to use [laravel queues](queues.md). - + ## Enqueue Simple client If you want to use [enqueue/simple-client](https://github.com/php-enqueue/simple-client) in your Laravel application you have perform additional steps . @@ -92,7 +96,7 @@ $app->resolving(SimpleClient::class, function (SimpleClient $client, $app) { ``` -Send message: +Send message: ```php Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,7 +13,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Magento. Cli commands -The enqueue Magento extension provides several commands. +The enqueue Magento extension provides several commands. The most useful one `enqueue:consume` connects to the broker and process the messages. Other commands could be useful during debugging (like `enqueue:topics`) or deployment (like `enqueue:setup-broker`). diff --git a/docs/magento/quick_tour.md b/docs/magento/quick_tour.md index d1bbf1387..42921a480 100644 --- a/docs/magento/quick_tour.md +++ b/docs/magento/quick_tour.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -27,10 +31,10 @@ _**Note**: You could use not only AMQP transport but any other [available](../tr ## Configuration -At this stage we have configure the Enqueue extension in Magento backend. +At this stage we have configure the Enqueue extension in Magento backend. The config is here: `System -> Configuration -> Enqueue Message Queue`. Here's the example of Amqp transport that connects to RabbitMQ broker on localhost: - + ![Сonfiguration](../images/magento_enqueue_configuration.jpeg) @@ -46,8 +50,8 @@ Mage::helper('enqueue')->send('a_topic', 'aMessage'); ## Message Consumption -I assume you have `acme` Magento module properly created, configured and registered. -To consume messages you have to define a processor class first: +I assume you have `acme` Magento module properly created, configured and registered. +To consume messages you have to define a processor class first: ```php Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,7 +13,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Magento2. Cli commands -The enqueue Magento extension provides several commands. +The enqueue Magento extension provides several commands. The most useful one `enqueue:consume` connects to the broker and process the messages. Other commands could be useful during debugging (like `enqueue:topics`) or deployment (like `enqueue:setup-broker`). diff --git a/docs/magento2/quick_tour.md b/docs/magento2/quick_tour.md index 61942e8d5..8c5fd3bdc 100644 --- a/docs/magento2/quick_tour.md +++ b/docs/magento2/quick_tour.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -23,12 +27,12 @@ composer require "enqueue/magento2-enqueue:*@dev" "enqueue/amqp-ext" Run setup:upgrade so Magento2 picks up the installed module. ```bash -php bin/magento setup:upgrade +php bin/magento setup:upgrade ``` ## Configuration -At this stage we have configure the Enqueue extension in Magento backend. +At this stage we have configure the Enqueue extension in Magento backend. The config is here: `Stores -> Configuration -> General -> Enqueue Message Queue`. Here's the example of Amqp transport that connects to RabbitMQ broker on localhost: @@ -53,8 +57,8 @@ $replyMessage = $reply->receive(5000); // wait for 5 sec ## Message Consumption -I assume you have `acme` Magento module properly created, configured and registered. -To consume messages you have to define a processor class first: +I assume you have `acme` Magento module properly created, configured and registered. +To consume messages you have to define a processor class first: ```php Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -7,7 +12,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made --- -## Pull request to readonly repo. +## Pull request to readonly repo. Thanks for your pull request! We love contributions. @@ -19,6 +24,6 @@ https://github.com/php-enqueue/enqueue-dev Read the contribution guide -https://github.com/php-enqueue/enqueue-dev/blob/master/docs/contribution.md +https://github.com/php-enqueue/enqueue-dev/blob/master/docs/contribution.md Thank you for your contribution! diff --git a/docs/monolog/send-messages-to-mq.md b/docs/monolog/send-messages-to-mq.md index bbfea16ab..19af115e6 100644 --- a/docs/monolog/send-messages-to-mq.md +++ b/docs/monolog/send-messages-to-mq.md @@ -1,3 +1,7 @@ +--- +layout: default +nav_exclude: true +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -7,15 +11,15 @@ Enqueue is an MIT-licensed open source project with its ongoing development made --- -# Enqueue Monolog Handlers +# Enqueue Monolog Handlers -The package provides handlers for [Monolog](https://github.com/Seldaek/monolog). -These handler allows to send logs to MQ using any [queue-interop](https://github.com/queue-interop/queue-interop) compatible transports. +The package provides handlers for [Monolog](https://github.com/Seldaek/monolog). +These handler allows to send logs to MQ using any [queue-interop](https://github.com/queue-interop/queue-interop) compatible transports. ## Installation You have to install monolog itself, queue interop handlers and one of [the transports](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md#transports). -For the simplicity we are going to install the filesystem based MQ. +For the simplicity we are going to install the filesystem based MQ. ``` composer require enqueue/monolog-queue-handler monolog/monolog enqueue/fs @@ -42,7 +46,7 @@ $log->warning('Foo'); $log->error('Bar'); ``` -the consumer may look like this: +the consumer may look like this: ```php Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -8,7 +13,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made --- # Quick tour - + * [Transport](#transport) * [Consumption](#consumption) * [Remote Procedure Call (RPC)](#remote-procedure-call-rpc) @@ -18,13 +23,13 @@ Enqueue is an MIT-licensed open source project with its ongoing development made ## Transport -The transport layer or PSR (Enqueue message service) is a Message Oriented Middleware for sending messages between two or more clients. -It is a messaging component that allows applications to create, send, receive, and read messages. +The transport layer or PSR (Enqueue message service) is a Message Oriented Middleware for sending messages between two or more clients. +It is a messaging component that allows applications to create, send, receive, and read messages. It allows the communication between different components of a distributed application to be loosely coupled, reliable, and asynchronous. PSR is inspired by JMS (Java Message Service). We tried to stay as close as possible to the [JSR 914](https://docs.oracle.com/javaee/7/api/javax/jms/package-summary.html) specification. For now it supports [AMQP](https://www.rabbitmq.com/tutorials/amqp-concepts.html) and [STOMP](https://stomp.github.io/) message queue protocols. -You can connect to many modern brokers such as [RabbitMQ](https://www.rabbitmq.com/), [ActiveMQ](http://activemq.apache.org/) and others. +You can connect to many modern brokers such as [RabbitMQ](https://www.rabbitmq.com/), [ActiveMQ](http://activemq.apache.org/) and others. Produce a message: @@ -65,11 +70,11 @@ $consumer->acknowledge($message); // $consumer->reject($message); ``` -## Consumption +## Consumption -Consumption is a layer built on top of a transport functionality. -The goal of the component is to simply consume messages. -The `QueueConsumer` is main piece of the component it allows binding of message processors (or callbacks) to queues. +Consumption is a layer built on top of a transport functionality. +The goal of the component is to simply consume messages. +The `QueueConsumer` is main piece of the component it allows binding of message processors (or callbacks) to queues. The `consume` method starts the consumption process which last as long as it is not interrupted. ```php @@ -85,22 +90,22 @@ $queueConsumer = new QueueConsumer($context); $queueConsumer->bindCallback('foo_queue', function(Message $message) { // process message - + return Processor::ACK; }); $queueConsumer->bindCallback('bar_queue', function(Message $message) { // process message - + return Processor::ACK; }); $queueConsumer->consume(); ``` -There are bunch of [extensions](consumption/extensions.md) available. -This is an example of how you can add them. +There are bunch of [extensions](consumption/extensions.md) available. +This is an example of how you can add them. The `SignalExtension` provides support of process signals, whenever you send SIGTERM for example it will correctly managed. -The `LimitConsumptionTimeExtension` interrupts the consumption after given time. +The `LimitConsumptionTimeExtension` interrupts the consumption after given time. ```php callAsync($queue, $message, 1); $replyMessage = $promise->receive(); ``` -There is also extensions for the consumption component. +There is also extensions for the consumption component. It simplifies a server side of RPC. ```php @@ -157,7 +162,7 @@ $queueConsumer = new QueueConsumer($context, new ChainExtension([ $queueConsumer->bindCallback('foo', function(Message $message, Context $context) { $replyMessage = $context->createMessage('Hello'); - + return Result::reply($replyMessage); }); @@ -167,14 +172,14 @@ $queueConsumer->consume(); ## Client It provides an easy to use high level abstraction. -The goal of the component is to hide as much as possible low level details so you can concentrate on things that really matter. +The goal of the component is to hide as much as possible low level details so you can concentrate on things that really matter. For example, it configures a broker for you by creating queues, exchanges and bind them. -It provides easy to use services for producing and processing messages. +It provides easy to use services for producing and processing messages. It supports unified format for setting message expiration, delay, timestamp, correlation id. It supports [message bus](http://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageBus.html) so different applications can talk to each other. - + Here's an example of how you can send and consume **event messages**. - + ```php bindTopic('a_foo_topic', function(Message $message) { echo $message->getBody().PHP_EOL; - + // your event processor logic here }); @@ -195,11 +200,11 @@ $client->setupBroker(); $client->sendEvent('a_foo_topic', 'message'); -// this is a blocking call, it'll consume message until it is interrupted +// this is a blocking call, it'll consume message until it is interrupted $client->consume(); ``` -and **command messages**: +and **command messages**: ```php bindCommand('bar_command', function(Message $message) { $client->bindCommand('baz_reply_command', function(Message $message, Context $context) { // your baz reply command processor logic here - + return Result::reply($context->createMessage('theReplyBody')); }); $client->setupBroker(); -// It is sent to one consumer. +// It is sent to one consumer. $client->sendCommand('bar_command', 'aMessageData'); // It is possible to get reply @@ -238,16 +243,16 @@ $promise = $client->sendCommand('bar_command', 'aMessageData', true); $replyMessage = $promise->receive(2000); // 2 sec -// this is a blocking call, it'll consume message until it is interrupted +// this is a blocking call, it'll consume message until it is interrupted $client->consume([new ReplyExtension()]); ``` -Read more about events and commands [here](client/quick_tour.md#produce-message). +Read more about events and commands [here](client/quick_tour.md#produce-message). ## Cli commands -The library provides handy commands out of the box. -They all build on top of [Symfony Console component](http://symfony.com/doc/current/components/console.html). +The library provides handy commands out of the box. +They all build on top of [Symfony Console component](http://symfony.com/doc/current/components/console.html). The most useful is a consume command. There are two of them one from consumption component and the other from client one. Let's see how you can use consumption one: @@ -265,7 +270,7 @@ use Enqueue\Symfony\Consumption\SimpleConsumeCommand; /** @var QueueConsumer $queueConsumer */ $queueConsumer->bindCallback('a_queue', function(Message $message) { - // process message + // process message }); $consumeCommand = new SimpleConsumeCommand($queueConsumer); @@ -277,7 +282,7 @@ $app->run(); ``` and starts the consumption from the console: - + ```bash $ app.php consume ``` diff --git a/docs/transport/amqp.md b/docs/transport/amqp.md index 52f70d77a..e93f377d6 100644 --- a/docs/transport/amqp.md +++ b/docs/transport/amqp.md @@ -1,3 +1,9 @@ +--- +layout: default +title: AMQP +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -62,7 +68,7 @@ $factory = new AmqpConnectionFactory([ // same as above but given as DSN string $factory = new AmqpConnectionFactory('amqp://user:pass@example.com:10000/%2f'); -// SSL or secure connection +// SSL or secure connection $factory = new AmqpConnectionFactory([ 'dsn' => 'amqps:', 'ssl_cacert' => '/path/to/cacert.pem', @@ -72,15 +78,15 @@ $factory = new AmqpConnectionFactory([ $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('amqp:')->createContext(); $context = (new \Enqueue\ConnectionFactoryFactory())->create('amqp+ext:')->createContext(); ``` ## Declare topic. -Declare topic operation creates a topic on a broker side. - +Declare topic operation creates a topic on a broker side. + ```php declareTopic($fooTopic); ## Declare queue. -Declare queue operation creates a queue on a broker side. - +Declare queue operation creates a queue on a broker side. + ```php declareQueue($fooQueue); ## Bind queue to topic -Connects a queue to the topic. So messages from that topic comes to the queue and could be processed. +Connects a queue to the topic. So messages from that topic comes to the queue and could be processed. ```php bind(new AmqpBind($fooTopic, $fooQueue)); ``` -## Send message to topic +## Send message to topic ```php createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createMessage('Hello world!'); $context->createProducer() ->setPriority(5) // the higher priority the sooner a message gets to a consumer - // + // ->send($fooQueue, $message) ; ``` @@ -183,14 +189,14 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setTimeToLive(60000) // 60 sec - // + // ->send($fooQueue, $message) ; ``` ## Send delayed message -AMQP specification says nothing about message delaying hence the producer throws `DeliveryDelayNotSupportedException`. +AMQP specification says nothing about message delaying hence the producer throws `DeliveryDelayNotSupportedException`. Though the producer (and the context) accepts a delivery delay strategy and if it is set it uses it to send delayed message. The `enqueue/amqp-tools` package provides two RabbitMQ delay strategies, to use them you have to install that package @@ -208,10 +214,10 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setDelayStrategy(new RabbitMqDlxDelayStrategy()) ->setDeliveryDelay(5000) // 5 sec - + ->send($fooQueue, $message) ; -```` +```` ## Consume message: @@ -247,16 +253,16 @@ $barConsumer = $context->createConsumer($barQueue); $subscriptionConsumer = $context->createSubscriptionConsumer(); $subscriptionConsumer->subscribe($fooConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); $subscriptionConsumer->subscribe($barConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); diff --git a/docs/transport/amqp_bunny.md b/docs/transport/amqp_bunny.md index cf0361f80..c5b6162f9 100644 --- a/docs/transport/amqp_bunny.md +++ b/docs/transport/amqp_bunny.md @@ -1,3 +1,9 @@ +--- +layout: default +title: AMQP Bunny +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -62,15 +68,15 @@ $factory = new AmqpConnectionFactory('amqp://user:pass@example.com:10000/%2f'); $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('amqp:')->createContext(); $context = (new \Enqueue\ConnectionFactoryFactory())->create('amqp+bunny:')->createContext(); ``` ## Declare topic. -Declare topic operation creates a topic on a broker side. - +Declare topic operation creates a topic on a broker side. + ```php declareTopic($fooTopic); ## Declare queue. -Declare queue operation creates a queue on a broker side. - +Declare queue operation creates a queue on a broker side. + ```php declareQueue($fooQueue); ## Bind queue to topic -Connects a queue to the topic. So messages from that topic comes to the queue and could be processed. +Connects a queue to the topic. So messages from that topic comes to the queue and could be processed. ```php bind(new AmqpBind($fooTopic, $fooQueue)); ``` -## Send message to topic +## Send message to topic ```php createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createMessage('Hello world!'); $context->createProducer() ->setPriority(5) // the higher priority the sooner a message gets to a consumer - // + // ->send($fooQueue, $message) ; ``` @@ -175,14 +181,14 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setTimeToLive(60000) // 60 sec - // + // ->send($fooQueue, $message) ; ``` ## Send delayed message -AMQP specification says nothing about message delaying hence the producer throws `DeliveryDelayNotSupportedException`. +AMQP specification says nothing about message delaying hence the producer throws `DeliveryDelayNotSupportedException`. Though the producer (and the context) accepts a delivery delay strategy and if it is set it uses it to send delayed message. The `enqueue/amqp-tools` package provides two RabbitMQ delay strategies, to use them you have to install that package @@ -200,7 +206,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setDelayStrategy(new RabbitMqDlxDelayStrategy()) ->setDeliveryDelay(5000) // 5 sec - + ->send($fooQueue, $message) ; ```` @@ -239,16 +245,16 @@ $barConsumer = $context->createConsumer($barQueue); $subscriptionConsumer = $context->createSubscriptionConsumer(); $subscriptionConsumer->subscribe($fooConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); $subscriptionConsumer->subscribe($barConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); diff --git a/docs/transport/amqp_lib.md b/docs/transport/amqp_lib.md index cd0f7e9e1..bdab29d47 100644 --- a/docs/transport/amqp_lib.md +++ b/docs/transport/amqp_lib.md @@ -1,3 +1,9 @@ +--- +layout: default +title: AMQP Lib +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -17,7 +23,7 @@ Features: * Delay strategies out of the box * Interchangeable with other AMQP Interop implementations * Fixes AMQPIOWaitException when signal is sent. -* More reliable heartbeat implementations. +* More reliable heartbeat implementations. * Supports Subscription consumer Parts: @@ -70,7 +76,7 @@ $factory = new AmqpConnectionFactory([ // same as above but given as DSN string $factory = new AmqpConnectionFactory('amqp://user:pass@example.com:10000/%2f'); -// SSL or secure connection +// SSL or secure connection $factory = new AmqpConnectionFactory([ 'dsn' => 'amqps:', 'ssl_cacert' => '/path/to/cacert.pem', @@ -80,15 +86,15 @@ $factory = new AmqpConnectionFactory([ $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('amqp:')->createContext(); $context = (new \Enqueue\ConnectionFactoryFactory())->create('amqp+lib:')->createContext(); ``` ## Declare topic. -Declare topic operation creates a topic on a broker side. - +Declare topic operation creates a topic on a broker side. + ```php declareTopic($fooTopic); ## Declare queue. -Declare queue operation creates a queue on a broker side. - +Declare queue operation creates a queue on a broker side. + ```php declareQueue($fooQueue); ## Bind queue to topic -Connects a queue to the topic. So messages from that topic comes to the queue and could be processed. +Connects a queue to the topic. So messages from that topic comes to the queue and could be processed. ```php bind(new AmqpBind($fooTopic, $fooQueue)); ``` -## Send message to topic +## Send message to topic ```php createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createMessage('Hello world!'); $context->createProducer() ->setPriority(5) // the higher priority the sooner a message gets to a consumer - // + // ->send($fooQueue, $message) ; ``` @@ -193,14 +199,14 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setTimeToLive(60000) // 60 sec - // + // ->send($fooQueue, $message) ; ``` ## Send delayed message -AMQP specification says nothing about message delaying hence the producer throws `DeliveryDelayNotSupportedException`. +AMQP specification says nothing about message delaying hence the producer throws `DeliveryDelayNotSupportedException`. Though the producer (and the context) accepts a delivery delay strategy and if it is set it uses it to send delayed message. The `enqueue/amqp-tools` package provides two RabbitMQ delay strategies, to use them you have to install that package @@ -218,7 +224,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setDelayStrategy(new RabbitMqDlxDelayStrategy()) ->setDeliveryDelay(5000) // 5 sec - + ->send($fooQueue, $message) ; ```` @@ -257,16 +263,16 @@ $barConsumer = $context->createConsumer($barQueue); $subscriptionConsumer = $context->createSubscriptionConsumer(); $subscriptionConsumer->subscribe($fooConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); $subscriptionConsumer->subscribe($barConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); @@ -287,15 +293,15 @@ $context->purgeQueue($queue); ## Long running task and heartbeat and timeouts -AMQP relies on heartbeat feature to make sure consumer is still there. +AMQP relies on heartbeat feature to make sure consumer is still there. Basically consumer is expected to send heartbeat frames from time to time to RabbitMQ broker so the broker does not close the connection. -It is not possible to implement heartbeat feature in PHP, due to its synchronous nature. +It is not possible to implement heartbeat feature in PHP, due to its synchronous nature. You could read more about the issues in post: [Keeping RabbitMQ connections alive in PHP](https://blog.mollie.com/keeping-rabbitmq-connections-alive-in-php-b11cb657d5fb). `enqueue/amqp-lib` address the issue by registering heartbeat call as a [tick callbacks](http://php.net/manual/en/function.register-tick-function.php). -To make it work you have to wrapp your long running task by `decalre(ticks=1) {}`. -The number of ticks could be adjusted to your needs. -Calling it at every tick is not good. +To make it work you have to wrapp your long running task by `decalre(ticks=1) {}`. +The number of ticks could be adjusted to your needs. +Calling it at every tick is not good. Please note that it does not fix heartbeat issue if you spent most of the time on IO operation. @@ -331,9 +337,9 @@ $subscriptionConsumer->consume(10000); function fetchHugeSet(): array {}; -``` +``` -Fixes partly `Invalid frame type 65` issue. +Fixes partly `Invalid frame type 65` issue. ``` Error: Uncaught PhpAmqpLib\Exception\AMQPRuntimeException: Invalid frame type 65 in /some/path/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Connection/AbstractConnection.php:528 @@ -345,4 +351,4 @@ Fixes partly `Broken pipe or closed connection` issue. PHP Fatal error: Uncaught exception 'PhpAmqpLib\Exception\AMQPRuntimeException' with message 'Broken pipe or closed connection' in /some/path/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php:190 ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) diff --git a/docs/transport/dbal.md b/docs/transport/dbal.md index d74cc88ef..58f827dfd 100644 --- a/docs/transport/dbal.md +++ b/docs/transport/dbal.md @@ -1,3 +1,9 @@ +--- +layout: default +title: DBAL +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,8 +15,8 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Doctrine DBAL transport -The transport uses [Doctrine DBAL](http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/) library and SQL like server as a broker. -It creates a table there. Pushes and pops messages to\from that table. +The transport uses [Doctrine DBAL](http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/) library and SQL like server as a broker. +It creates a table there. Pushes and pops messages to\from that table. * [Installation](#installation) * [Init database](#init-database) @@ -59,7 +65,7 @@ $factory = new ManagerRegistryConnectionFactory($registry, [ $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('mysql:')->createContext(); ``` @@ -87,7 +93,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createMessage('Hello world!'); $psrContext->createProducer() ->setTimeToLive(60000) // 60 sec - // + // ->send($fooQueue, $message) ; ``` @@ -126,7 +132,7 @@ $message = $psrContext->createMessage('Hello world!'); $psrContext->createProducer() ->setDeliveryDelay(5000) // 5 sec - // + // ->send($fooQueue, $message) ; ```` @@ -165,20 +171,20 @@ $barConsumer = $context->createConsumer($barQueue); $subscriptionConsumer = $context->createSubscriptionConsumer(); $subscriptionConsumer->subscribe($fooConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); $subscriptionConsumer->subscribe($barConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); $subscriptionConsumer->consume(2000); // 2 sec ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) diff --git a/docs/transport/filesystem.md b/docs/transport/filesystem.md index a2c246ab0..b6d27f81b 100644 --- a/docs/transport/filesystem.md +++ b/docs/transport/filesystem.md @@ -1,3 +1,9 @@ +--- +layout: default +title: Filesystem +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,10 +15,10 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Filesystem transport -Use files on local filesystem as queues. -It creates a file per queue\topic. +Use files on local filesystem as queues. +It creates a file per queue\topic. A message is a line inside the file. -**Limitations** It works only in auto ack mode hence If consumer crashes the message is lost. Local by nature therefor messages are not visible on other servers. +**Limitations** It works only in auto ack mode hence If consumer crashes the message is lost. Local by nature therefor messages are not visible on other servers. * [Installation](#installation) * [Create context](#create-context) @@ -57,7 +63,7 @@ $connectionFactory = new FsConnectionFactory([ $context = $connectionFactory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('file:')->createContext(); ``` @@ -73,7 +79,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createMessage('Hello world!'); $context->createProducer() ->setTimeToLive(60000) // 60 sec - // + // ->send($fooQueue, $message) ; ``` @@ -129,4 +135,4 @@ $fooQueue = $context->createQueue('aQueue'); $context->purge($fooQueue); ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) diff --git a/docs/transport/gearman.md b/docs/transport/gearman.md index 18735eb9c..e6343c0ee 100644 --- a/docs/transport/gearman.md +++ b/docs/transport/gearman.md @@ -1,3 +1,9 @@ +--- +layout: default +title: Gearman +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,8 +15,8 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Gearman transport -The transport uses [Gearman](http://gearman.org/) job manager. -The transport uses [Gearman PHP extension](http://php.net/manual/en/book.gearman.php) internally. +The transport uses [Gearman](http://gearman.org/) job manager. +The transport uses [Gearman PHP extension](http://php.net/manual/en/book.gearman.php) internally. * [Installation](#installation) * [Create context](#create-context) @@ -48,7 +54,7 @@ $factory = new GearmanConnectionFactory([ $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('gearman:')->createContext(); ``` @@ -64,7 +70,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createConsumer($fooQueue); $message = $consumer->receive(2000); // wait for 2 seconds -$message = $consumer->receiveNoWait(); // fetch message or return null immediately +$message = $consumer->receiveNoWait(); // fetch message or return null immediately // process a message @@ -95,4 +101,4 @@ $consumer->acknowledge($message); // $consumer->reject($message); ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) diff --git a/docs/transport/gps.md b/docs/transport/gps.md index 49f9d67ee..6338fde59 100644 --- a/docs/transport/gps.md +++ b/docs/transport/gps.md @@ -1,3 +1,9 @@ +--- +layout: default +title: GPS +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -10,7 +16,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Google Pub Sub transport A transport for [Google Pub Sub](https://cloud.google.com/pubsub/docs/) cloud MQ. -It uses internally official google sdk library [google/cloud-pubsub](https://packagist.org/packages/google/cloud-pubsub) +It uses internally official google sdk library [google/cloud-pubsub](https://packagist.org/packages/google/cloud-pubsub) * [Installation](#installation) * [Create context](#create-context) @@ -25,8 +31,8 @@ $ composer require enqueue/gps ## Create context -To enable the Google Cloud Pub/Sub Emulator, set the `PUBSUB_EMULATOR_HOST` environment variable. -There is a handy docker container [google/cloud-sdk](https://hub.docker.com/r/google/cloud-sdk/). +To enable the Google Cloud Pub/Sub Emulator, set the `PUBSUB_EMULATOR_HOST` environment variable. +There is a handy docker container [google/cloud-sdk](https://hub.docker.com/r/google/cloud-sdk/). ```php createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('gps:')->createContext(); ``` ## Send message to topic -Before you can send message you have to declare a topic. -The operation creates a topic on a broker side. -Google allows messages to be sent only to topic. +Before you can send message you have to declare a topic. +The operation creates a topic on a broker side. +Google allows messages to be sent only to topic. ```php createProducer()->send($fooTopic, $message); ## Consume message: -Before you can consume message you have to subscribe a queue to the topic. -Google does not allow consuming message from the topic directly. +Before you can consume message you have to subscribe a queue to the topic. +Google does not allow consuming message from the topic directly. ```php acknowledge($message); // $consumer->reject($message); ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) diff --git a/docs/transport/index.md b/docs/transport/index.md new file mode 100644 index 000000000..df7755e83 --- /dev/null +++ b/docs/transport/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Transports +nav_order: 3 +has_children: true +permalink: /transport +--- + +{:toc} diff --git a/docs/transport/kafka.md b/docs/transport/kafka.md index 4fefb6914..f35982992 100644 --- a/docs/transport/kafka.md +++ b/docs/transport/kafka.md @@ -1,3 +1,9 @@ +--- +layout: default +title: Kafka +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: diff --git a/docs/transport/mongodb.md b/docs/transport/mongodb.md index 5fc43c8d8..6ff46ca65 100644 --- a/docs/transport/mongodb.md +++ b/docs/transport/mongodb.md @@ -1,3 +1,9 @@ +--- +layout: default +title: MongoDB +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,7 +15,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Enqueue Mongodb message queue transport -Allows to use [MongoDB](https://www.mongodb.com/) as a message queue broker. +Allows to use [MongoDB](https://www.mongodb.com/) as a message queue broker. * [Installation](#installation) * [Create context](#create-context) @@ -51,11 +57,11 @@ $factory = new MongodbConnectionFactory([ $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('mongodb:')->createContext(); ``` -## Send message to topic +## Send message to topic ```php createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createMessage('Hello world!'); $context->createProducer() ->setPriority(5) // the higher priority the sooner a message gets to a consumer - // + // ->send($fooQueue, $message) ; ``` @@ -107,7 +113,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setTimeToLive(60000) // 60 sec - // + // ->send($fooQueue, $message) ; ``` @@ -127,10 +133,10 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setDeliveryDelay(5000) // 5 sec - + ->send($fooQueue, $message) ; -```` +```` ## Consume message: @@ -166,16 +172,16 @@ $barConsumer = $context->createConsumer($barQueue); $subscriptionConsumer = $context->createSubscriptionConsumer(); $subscriptionConsumer->subscribe($fooConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); $subscriptionConsumer->subscribe($barConsumer, function(Message $message, Consumer $consumer) { // process message - + $consumer->acknowledge($message); - + return true; }); diff --git a/docs/transport/null.md b/docs/transport/null.md index fe907017e..cfbdb97a2 100644 --- a/docs/transport/null.md +++ b/docs/transport/null.md @@ -1,3 +1,9 @@ +--- +layout: default +title: "Null" +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,7 +15,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # NULL transport -This a special transport implementation, kind of stub. +This a special transport implementation, kind of stub. It does not send nor receive anything. Useful in tests for example. @@ -33,4 +39,4 @@ $connectionFactory = new NullConnectionFactory(); $context = $connectionFactory->createContext(); ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) diff --git a/docs/transport/pheanstalk.md b/docs/transport/pheanstalk.md index 42b2b1f70..7e9b1a0fd 100644 --- a/docs/transport/pheanstalk.md +++ b/docs/transport/pheanstalk.md @@ -1,3 +1,9 @@ +--- +layout: default +title: Pheanstalk +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,8 +15,8 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Beanstalk (Pheanstalk) transport -The transport uses [Beanstalkd](http://kr.github.io/beanstalkd/) job manager. -The transport uses [Pheanstalk](https://github.com/pda/pheanstalk) library internally. +The transport uses [Beanstalkd](http://kr.github.io/beanstalkd/) job manager. +The transport uses [Pheanstalk](https://github.com/pda/pheanstalk) library internally. * [Installation](#installation) * [Create context](#create-context) @@ -48,7 +54,7 @@ $factory = new PheanstalkConnectionFactory([ $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('beanstalk:')->createContext(); ``` @@ -64,7 +70,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createConsumer($fooQueue); $message = $consumer->receive(2000); // wait for 2 seconds -$message = $consumer->receiveNoWait(); // fetch message or return null immediately +$message = $consumer->receiveNoWait(); // fetch message or return null immediately // process a message @@ -95,4 +101,4 @@ $consumer->acknowledge($message); // $consumer->reject($message); ``` -[back to index](../index.md) \ No newline at end of file +[back to index](../index.md) diff --git a/docs/transport/redis.md b/docs/transport/redis.md index de9c5d62d..717916364 100644 --- a/docs/transport/redis.md +++ b/docs/transport/redis.md @@ -1,3 +1,9 @@ +--- +layout: default +title: Redis +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,9 +15,9 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Redis transport -The transport uses [Redis](https://redis.io/) as a message broker. +The transport uses [Redis](https://redis.io/) as a message broker. It creates a collection (a queue or topic) there. Pushes messages to the tail of the collection and pops from the head. -The transport works with [phpredis](https://github.com/phpredis/phpredis) php extension or [predis](https://github.com/nrk/predis) library. +The transport works with [phpredis](https://github.com/phpredis/phpredis) php extension or [predis](https://github.com/nrk/predis) library. Make sure you installed either of them Features: @@ -20,10 +26,10 @@ Features: * Recovery&Redelivery support * Expiration support * Delaying support -* Interchangeable with other Queue Interop implementations +* Interchangeable with other Queue Interop implementations * Supports Subscription consumer - -Parts: + +Parts: * [Installation](#installation) * [Create context](#create-context) * [Send message to topic](#send-message-to-topic) @@ -67,7 +73,7 @@ $factory = new RedisConnectionFactory('redis:'); // same as above $factory = new RedisConnectionFactory([]); -// connect to Redis at example.com port 1000 using phpredis extension +// connect to Redis at example.com port 1000 using phpredis extension $factory = new RedisConnectionFactory([ 'host' => 'example.com', 'port' => 1000, @@ -79,7 +85,7 @@ $factory = new RedisConnectionFactory('redis+phpredis://example.com:1000'); $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('redis:')->createContext(); // pass redis instance directly @@ -87,7 +93,7 @@ $redis = new \Enqueue\Redis\PhpRedis([ /** redis connection options */ ]); $redis->connect(); // Secure\TLS connection. Works only with predis library. Note second "S" in scheme. -$factory = new RedisConnectionFactory('rediss+predis://user:pass@host/0'); +$factory = new RedisConnectionFactory('rediss+predis://user:pass@host/0'); $factory = new RedisConnectionFactory($redis); ``` @@ -115,14 +121,14 @@ It gives you more control over vendor specific features. 'localhost', 'port' => 6379, 'predis_options' => [ 'prefix' => 'ns:' ] -]; +]; $redis = new PRedis($config); @@ -141,7 +147,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php createMessage('Hello world!'); $context->createProducer() ->setTimeToLive(60000) // 60 sec - // + // ->send($fooQueue, $message) ; ``` @@ -180,7 +186,7 @@ $message = $context->createMessage('Hello world!'); $context->createProducer() ->setDeliveryDelay(5000) // 5 sec - + ->send($fooQueue, $message) ; ```` @@ -227,7 +233,7 @@ $context->deleteTopic($fooTopic); ## Connect Heroku Redis [Heroku Redis](https://devcenter.heroku.com/articles/heroku-redis) describes how to setup Redis instance on Heroku. -To use it with Enqueue Redis you have to pass REDIS_URL to RedisConnectionFactory constructor. +To use it with Enqueue Redis you have to pass REDIS_URL to RedisConnectionFactory constructor. ```php Supporting Enqueue +--- +layout: default +title: Amazon SNS-SQS +parent: Transports +nav_order: 3 +--- +

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -15,7 +21,7 @@ enterprise integration pattern. As opposed to single SQS transport this adds abi with enqueue. A transport for [Amazon SQS](https://aws.amazon.com/sqs/) broker. -It uses internally official [aws sdk library](https://packagist.org/packages/aws/aws-sdk-php) +It uses internally official [aws sdk library](https://packagist.org/packages/aws/aws-sdk-php) * [Installation](#installation) * [Create context](#create-context) @@ -37,12 +43,12 @@ $ composer require enqueue/snsqs ```php 'aKey', - 'secret' => 'aSecret', + 'key' => 'aKey', + 'secret' => 'aSecret', 'region' => 'aRegion', - + // or you can segregate options using prefixes "sns_", "sqs_" 'key' => 'aKey', // common option for both SNS and SQS 'sns_region' => 'aSnsRegion', // SNS transport option @@ -54,7 +60,7 @@ $factory = new SnsQsConnectionFactory('snsqs:?key=aKey&secret=aSecret®ion=aRe $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('snsqs:')->createContext(); ``` @@ -64,7 +70,7 @@ Declare topic, queue operation creates a topic, queue on a broker side. Bind creates connection between topic and queue. You publish message to the topic and topic sends message to each queue connected to the topic. - + ```php bind($inTopic, $out2Queue); //$context->unbind(inTopic, $out1Queue); ``` -## Send message to topic +## Send message to topic ```php createMessage('Hello world!'); $context->createProducer()->send($inTopic, $message); ``` -## Send message to queue +## Send message to queue You can bypass topic and publish message directly to the queue @@ -144,7 +150,7 @@ $context->purgeQueue($fooQueue); ## Queue from another AWS account -SQS allows to use queues from another account. You could set it globally for all queues via option `queue_owner_aws_account_id` or +SQS allows to use queues from another account. You could set it globally for all queues via option `queue_owner_aws_account_id` or per queue using `SnsQsQueue::setQueueOwnerAWSAccountId` method. ```php @@ -164,7 +170,7 @@ $queue->setQueueOwnerAWSAccountId('awsAccountId'); ## Multi region examples Enqueue SNSQS provides a generic multi-region support. This enables users to specify which AWS Region to send a command to by setting region on SnsQsQueue. -If not specified the default region is used. +If not specified the default region is used. ```php Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -10,7 +16,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Amazon SQS transport A transport for [Amazon SQS](https://aws.amazon.com/sqs/) broker. -It uses internally official [aws sdk library](https://packagist.org/packages/aws/aws-sdk-php) +It uses internally official [aws sdk library](https://packagist.org/packages/aws/aws-sdk-php) * [Installation](#installation) * [Create context](#create-context) @@ -32,7 +38,7 @@ $ composer require enqueue/sqs ```php 'aKey', 'secret' => 'aSecret', @@ -48,14 +54,14 @@ $context = $factory->createContext(); $client = new Aws\Sqs\SqsClient([ /* ... */ ]); $factory = new SqsConnectionFactory($client); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('sqs:')->createContext(); ``` ## Declare queue. -Declare queue operation creates a queue on a broker side. - +Declare queue operation creates a queue on a broker side. + ```php declareQueue($fooQueue); //$context->deleteQueue($fooQueue); ``` -## Send message to queue +## Send message to queue ```php createMessage('Hello world!'); $context->createProducer() ->setDeliveryDelay(60000) // 60 sec - + ->send($fooQueue, $message) ; ``` @@ -125,7 +131,7 @@ $context->purgeQueue($fooQueue); ## Queue from another AWS account -SQS allows to use queues from another account. You could set it globally for all queues via option `queue_owner_aws_account_id` or +SQS allows to use queues from another account. You could set it globally for all queues via option `queue_owner_aws_account_id` or per queue using `SqsDestination::setQueueOwnerAWSAccountId` method. ```php @@ -145,8 +151,8 @@ $queue->setQueueOwnerAWSAccountId('awsAccountId'); ## Multi region examples Enqueue SQS provides a generic multi-region support. This enables users to specify which AWS Region to send a command to by setting region on SqsDestination. -You might need it to access SQS FIFO queue because they are not available for all regions. -If not specified the default region is used. +You might need it to access SQS FIFO queue because they are not available for all regions. +If not specified the default region is used. ```php Supporting Enqueue Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -42,7 +48,7 @@ $factory = new StompConnectionFactory('stomp+rabbitmq:'); // connect via stomp to ActiveMQ - the topic names are prefixed with /topic $factory = new StompConnectionFactory('stomp+activemq:'); -// connect to stomp broker at example.com port 1000 using +// connect to stomp broker at example.com port 1000 using $factory = new StompConnectionFactory([ 'host' => 'example.com', 'port' => 1000, @@ -54,11 +60,11 @@ $factory = new StompConnectionFactory('stomp://example.com:1000?login=theLogin') $context = $factory->createContext(); -// if you have enqueue/enqueue library installed you can use a factory to build context from DSN +// if you have enqueue/enqueue library installed you can use a factory to build context from DSN $context = (new \Enqueue\ConnectionFactoryFactory())->create('stomp:')->createContext(); ``` -## Send message to topic +## Send message to topic ```php createTopic('foo'); $context->createProducer()->send($fooTopic, $message); ``` -## Send message to queue +## Send message to queue ```php acknowledge($message); // $consumer->reject($message); ``` -[back to index](index.md) \ No newline at end of file +[back to index](index.md) diff --git a/docs/transport/wamp.md b/docs/transport/wamp.md index 6d114b279..742d52370 100644 --- a/docs/transport/wamp.md +++ b/docs/transport/wamp.md @@ -1,3 +1,9 @@ +--- +layout: default +title: WAMP +parent: Transports +nav_order: 3 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -11,7 +17,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made A transport for [Web Application Messaging Protocol](https://wamp-proto.org/). WAMP is an open standard WebSocket subprotocol. -It uses internally Thruway PHP library [voryx/thruway](https://github.com/voryx/Thruway) +It uses internally Thruway PHP library [voryx/thruway](https://github.com/voryx/Thruway) * [Installation](#installation) * [Start the WAMP router](#start-the-wamp-router) @@ -32,7 +38,7 @@ $ composer require enqueue/wamp $ php vendor/voryx/thruway/Examples/SimpleWsRouter.php ``` -Thruway is now running on 127.0.0.1 port 9090 +Thruway is now running on 127.0.0.1 port 9090 ## Create context @@ -87,12 +93,12 @@ $barConsumer = $context->createConsumer($barQueue); $subscriptionConsumer = $context->createSubscriptionConsumer(); $subscriptionConsumer->subscribe($fooConsumer, function(Message $message, Consumer $consumer) { // process message - + return true; }); $subscriptionConsumer->subscribe($barConsumer, function(Message $message, Consumer $consumer) { // process message - + return true; }); From 00d57238606927183bb01223c7a02ad0b5f81dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sun, 26 May 2019 20:12:47 +0200 Subject: [PATCH 0638/1142] Start preparing navigation structure --- docs/elastica-bundle/overview.md | 3 ++- docs/job_queue/index.md | 9 +++++++++ docs/job_queue/run_sub_job.md | 3 ++- docs/job_queue/run_unique_job.md | 3 ++- docs/laravel/queues.md | 3 ++- docs/laravel/quick_tour.md | 4 +++- docs/magento/cli_commands.md | 3 ++- docs/magento/quick_tour.md | 4 +++- docs/magento2/cli_commands.md | 3 ++- docs/magento2/quick_tour.md | 4 +++- 10 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 docs/job_queue/index.md diff --git a/docs/elastica-bundle/overview.md b/docs/elastica-bundle/overview.md index 9fa9c9473..a8a711d16 100644 --- a/docs/elastica-bundle/overview.md +++ b/docs/elastica-bundle/overview.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +title: Elastica bundle +nav_order: 4 ---

Supporting Enqueue

diff --git a/docs/job_queue/index.md b/docs/job_queue/index.md new file mode 100644 index 000000000..cd3a2c419 --- /dev/null +++ b/docs/job_queue/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Job Queue +nav_order: 6 +has_children: true +permalink: /job-queue +--- + +{:toc} diff --git a/docs/job_queue/run_sub_job.md b/docs/job_queue/run_sub_job.md index 4944f4a23..7121b1d9f 100644 --- a/docs/job_queue/run_sub_job.md +++ b/docs/job_queue/run_sub_job.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: Job Queue +title: Run sub job ---

Supporting Enqueue

diff --git a/docs/job_queue/run_unique_job.md b/docs/job_queue/run_unique_job.md index 8d8dafded..7218ae386 100644 --- a/docs/job_queue/run_unique_job.md +++ b/docs/job_queue/run_unique_job.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: Job Queue +title: Run unique job ---

Supporting Enqueue

diff --git a/docs/laravel/queues.md b/docs/laravel/queues.md index be70fbe14..2deef9e61 100644 --- a/docs/laravel/queues.md +++ b/docs/laravel/queues.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: Laravel +title: Queues ---

Supporting Enqueue

diff --git a/docs/laravel/quick_tour.md b/docs/laravel/quick_tour.md index cee8dec4b..4c9f522c6 100644 --- a/docs/laravel/quick_tour.md +++ b/docs/laravel/quick_tour.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +title: Laravel +has_children: true +nav_order: 4 ---

Supporting Enqueue

diff --git a/docs/magento/cli_commands.md b/docs/magento/cli_commands.md index b8be05d83..070bf46d3 100644 --- a/docs/magento/cli_commands.md +++ b/docs/magento/cli_commands.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: Magento +title: CLI commands ---

Supporting Enqueue

diff --git a/docs/magento/quick_tour.md b/docs/magento/quick_tour.md index 42921a480..3461a5bc2 100644 --- a/docs/magento/quick_tour.md +++ b/docs/magento/quick_tour.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +has_children: true +title: Magento +nav_order: 4 ---

Supporting Enqueue

diff --git a/docs/magento2/cli_commands.md b/docs/magento2/cli_commands.md index 3d3905ab5..649ff29d9 100644 --- a/docs/magento2/cli_commands.md +++ b/docs/magento2/cli_commands.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: Magento 2 +title: CLI commands ---

Supporting Enqueue

diff --git a/docs/magento2/quick_tour.md b/docs/magento2/quick_tour.md index 8c5fd3bdc..c7029f502 100644 --- a/docs/magento2/quick_tour.md +++ b/docs/magento2/quick_tour.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +title: Magento 2 +has_children: true +nav_order: 4 ---

Supporting Enqueue

From 8d0f73d33e99ae32e9bd026b440ed597ce853c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sun, 26 May 2019 20:32:50 +0200 Subject: [PATCH 0639/1142] Start preparing navigation structure --- docs/async_event_dispatcher/quick_tour.md | 2 +- docs/consumption/extensions.md | 5 ++-- docs/consumption/index.md | 9 +++++++ docs/consumption/message_processor.md | 3 ++- docs/index.md | 24 +++++++++---------- docs/{bundle => symfony}/async_commands.md | 3 ++- docs/{bundle => symfony}/async_events.md | 3 ++- docs/{bundle => symfony}/cli_commands.md | 3 ++- docs/{bundle => symfony}/config_reference.md | 3 ++- .../consumption_extension.md | 3 ++- docs/{bundle => symfony}/debugging.md | 3 ++- .../{bundle => symfony}/functional_testing.md | 3 ++- docs/symfony/index.md | 9 +++++++ docs/{bundle => symfony}/job_queue.md | 3 ++- docs/{bundle => symfony}/message_processor.md | 3 ++- docs/{bundle => symfony}/message_producer.md | 3 ++- .../production_settings.md | 3 ++- docs/{bundle => symfony}/quick_tour.md | 4 +++- 18 files changed, 61 insertions(+), 28 deletions(-) create mode 100644 docs/consumption/index.md rename docs/{bundle => symfony}/async_commands.md (97%) rename docs/{bundle => symfony}/async_events.md (99%) rename docs/{bundle => symfony}/cli_commands.md (99%) rename docs/{bundle => symfony}/config_reference.md (98%) rename docs/{bundle => symfony}/consumption_extension.md (95%) rename docs/{bundle => symfony}/debugging.md (98%) rename docs/{bundle => symfony}/functional_testing.md (98%) create mode 100644 docs/symfony/index.md rename docs/{bundle => symfony}/job_queue.md (99%) rename docs/{bundle => symfony}/message_processor.md (99%) rename docs/{bundle => symfony}/message_producer.md (98%) rename docs/{bundle => symfony}/production_settings.md (96%) rename docs/{bundle => symfony}/quick_tour.md (98%) diff --git a/docs/async_event_dispatcher/quick_tour.md b/docs/async_event_dispatcher/quick_tour.md index 7f3fc6a78..eba466fd9 100644 --- a/docs/async_event_dispatcher/quick_tour.md +++ b/docs/async_event_dispatcher/quick_tour.md @@ -14,7 +14,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Async event dispatcher (Symfony) The doc shows how you can setup async event dispatching in plain PHP. -If you are looking for the ways to use it in Symfony application [read this post instead](../bundle/async_events.md) +If you are looking for the ways to use it in Symfony application [read this post instead](../symfony/async_events.md) * [Installation](#installation) * [Configuration](#configuration) diff --git a/docs/consumption/extensions.md b/docs/consumption/extensions.md index 080f12664..91819ae35 100644 --- a/docs/consumption/extensions.md +++ b/docs/consumption/extensions.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: Consumption +title: Extensions ---

Supporting Enqueue

@@ -14,7 +15,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Consumption extensions. You can learn how to register extensions in [quick tour](../quick_tour.md#consumption). -There's dedicated [chapter](../bundle/consumption_extension.md) for how to add extension in Symfony app. +There's dedicated [chapter](../symfony/consumption_extension.md) for how to add extension in Symfony app. ## [LoggerExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/LoggerExtension.php) diff --git a/docs/consumption/index.md b/docs/consumption/index.md new file mode 100644 index 000000000..eefe58f7b --- /dev/null +++ b/docs/consumption/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Consumption +nav_order: 2 +has_children: true +permalink: /consumption +--- + +{:toc} diff --git a/docs/consumption/message_processor.md b/docs/consumption/message_processor.md index 911d6f9d1..6cc5ecb86 100644 --- a/docs/consumption/message_processor.md +++ b/docs/consumption/message_processor.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: Consumption +title: Message processors ---

Supporting Enqueue

diff --git a/docs/index.md b/docs/index.md index 54665bb76..6476d3397 100644 --- a/docs/index.md +++ b/docs/index.md @@ -47,18 +47,18 @@ Enqueue is an MIT-licensed open source project with its ongoing development made - [Run unique job](job_queue/run_unique_job.md) - [Run sub job(s)](job_queue/run_sub_job.md) * [EnqueueBundle (Symfony)](#enqueue-bundle-symfony). - - [Quick tour](bundle/quick_tour.md) - - [Config reference](bundle/config_reference.md) - - [Cli commands](bundle/cli_commands.md) - - [Message producer](bundle/message_producer.md) - - [Message processor](bundle/message_processor.md) - - [Async events](bundle/async_events.md) - - [Async commands](bundle/async_commands.md) - - [Job queue](bundle/job_queue.md) - - [Consumption extension](bundle/consumption_extension.md) - - [Production settings](bundle/production_settings.md) - - [Debugging](bundle/debugging.md) - - [Functional testing](bundle/functional_testing.md) + - [Quick tour](symfony/quick_tour.md) + - [Config reference](symfony/config_reference.md) + - [Cli commands](symfony/cli_commands.md) + - [Message producer](symfony/message_producer.md) + - [Message processor](symfony/message_processor.md) + - [Async events](symfony/async_events.md) + - [Async commands](symfony/async_commands.md) + - [Job queue](symfony/job_queue.md) + - [Consumption extension](symfony/consumption_extension.md) + - [Production settings](symfony/production_settings.md) + - [Debugging](symfony/debugging.md) + - [Functional testing](symfony/functional_testing.md) * [Laravel](#laravel) - [Quick tour](laravel/quick_tour.md) - [Queues](laravel/queues.md) diff --git a/docs/bundle/async_commands.md b/docs/symfony/async_commands.md similarity index 97% rename from docs/bundle/async_commands.md rename to docs/symfony/async_commands.md index 883758642..def5a873c 100644 --- a/docs/bundle/async_commands.md +++ b/docs/symfony/async_commands.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Async commands ---

Supporting Enqueue

diff --git a/docs/bundle/async_events.md b/docs/symfony/async_events.md similarity index 99% rename from docs/bundle/async_events.md rename to docs/symfony/async_events.md index 2e6d1e630..707341dce 100644 --- a/docs/bundle/async_events.md +++ b/docs/symfony/async_events.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Async events ---

Supporting Enqueue

diff --git a/docs/bundle/cli_commands.md b/docs/symfony/cli_commands.md similarity index 99% rename from docs/bundle/cli_commands.md rename to docs/symfony/cli_commands.md index f4fd8a724..677d48db6 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/symfony/cli_commands.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: CLI commands ---

Supporting Enqueue

diff --git a/docs/bundle/config_reference.md b/docs/symfony/config_reference.md similarity index 98% rename from docs/bundle/config_reference.md rename to docs/symfony/config_reference.md index c146ee058..f3abfb884 100644 --- a/docs/bundle/config_reference.md +++ b/docs/symfony/config_reference.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Config reference ---

Supporting Enqueue

diff --git a/docs/bundle/consumption_extension.md b/docs/symfony/consumption_extension.md similarity index 95% rename from docs/bundle/consumption_extension.md rename to docs/symfony/consumption_extension.md index 216218551..7be347e81 100644 --- a/docs/bundle/consumption_extension.md +++ b/docs/symfony/consumption_extension.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Consumption extension ---

Supporting Enqueue

diff --git a/docs/bundle/debugging.md b/docs/symfony/debugging.md similarity index 98% rename from docs/bundle/debugging.md rename to docs/symfony/debugging.md index 70cd5e7b2..28bee8c77 100644 --- a/docs/bundle/debugging.md +++ b/docs/symfony/debugging.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Debugging ---

Supporting Enqueue

diff --git a/docs/bundle/functional_testing.md b/docs/symfony/functional_testing.md similarity index 98% rename from docs/bundle/functional_testing.md rename to docs/symfony/functional_testing.md index c7ef36e60..db7367a0d 100644 --- a/docs/bundle/functional_testing.md +++ b/docs/symfony/functional_testing.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Functional testing ---

Supporting Enqueue

diff --git a/docs/symfony/index.md b/docs/symfony/index.md new file mode 100644 index 000000000..61bc70bcd --- /dev/null +++ b/docs/symfony/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: "Symfony bundle" +nav_order: 8 +has_children: true +permalink: /symfony +--- + +{:toc} diff --git a/docs/bundle/job_queue.md b/docs/symfony/job_queue.md similarity index 99% rename from docs/bundle/job_queue.md rename to docs/symfony/job_queue.md index c98a4635c..617e6e91a 100644 --- a/docs/bundle/job_queue.md +++ b/docs/symfony/job_queue.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Job queue ---

Supporting Enqueue

diff --git a/docs/bundle/message_processor.md b/docs/symfony/message_processor.md similarity index 99% rename from docs/bundle/message_processor.md rename to docs/symfony/message_processor.md index ba40e888f..8e852c4eb 100644 --- a/docs/bundle/message_processor.md +++ b/docs/symfony/message_processor.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Message processor ---

Supporting Enqueue

diff --git a/docs/bundle/message_producer.md b/docs/symfony/message_producer.md similarity index 98% rename from docs/bundle/message_producer.md rename to docs/symfony/message_producer.md index 93577137c..01317b225 100644 --- a/docs/bundle/message_producer.md +++ b/docs/symfony/message_producer.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Message producer ---

Supporting Enqueue

diff --git a/docs/bundle/production_settings.md b/docs/symfony/production_settings.md similarity index 96% rename from docs/bundle/production_settings.md rename to docs/symfony/production_settings.md index 72eb4582c..85af44b66 100644 --- a/docs/bundle/production_settings.md +++ b/docs/symfony/production_settings.md @@ -1,6 +1,7 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Production settings ---

Supporting Enqueue

diff --git a/docs/bundle/quick_tour.md b/docs/symfony/quick_tour.md similarity index 98% rename from docs/bundle/quick_tour.md rename to docs/symfony/quick_tour.md index 55ee5117f..9cb74ca92 100644 --- a/docs/bundle/quick_tour.md +++ b/docs/symfony/quick_tour.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +parent: "Symfony bundle" +title: Quick tour +nav_order: -1 ---

Supporting Enqueue

From ace203ca1f8712f7eb4fdb689e7c4c9c1584a3c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 27 May 2019 09:34:57 +0200 Subject: [PATCH 0640/1142] Revert directory rename for the time being --- docs/async_event_dispatcher/quick_tour.md | 2 +- docs/{symfony => bundle}/async_commands.md | 0 docs/{symfony => bundle}/async_events.md | 0 docs/{symfony => bundle}/cli_commands.md | 0 docs/{symfony => bundle}/config_reference.md | 0 .../consumption_extension.md | 0 docs/{symfony => bundle}/debugging.md | 0 .../{symfony => bundle}/functional_testing.md | 0 docs/{symfony => bundle}/index.md | 0 docs/{symfony => bundle}/job_queue.md | 0 docs/{symfony => bundle}/message_processor.md | 0 docs/{symfony => bundle}/message_producer.md | 0 .../production_settings.md | 0 docs/{symfony => bundle}/quick_tour.md | 0 docs/consumption/extensions.md | 2 +- docs/index.md | 24 +++++++++---------- 16 files changed, 14 insertions(+), 14 deletions(-) rename docs/{symfony => bundle}/async_commands.md (100%) rename docs/{symfony => bundle}/async_events.md (100%) rename docs/{symfony => bundle}/cli_commands.md (100%) rename docs/{symfony => bundle}/config_reference.md (100%) rename docs/{symfony => bundle}/consumption_extension.md (100%) rename docs/{symfony => bundle}/debugging.md (100%) rename docs/{symfony => bundle}/functional_testing.md (100%) rename docs/{symfony => bundle}/index.md (100%) rename docs/{symfony => bundle}/job_queue.md (100%) rename docs/{symfony => bundle}/message_processor.md (100%) rename docs/{symfony => bundle}/message_producer.md (100%) rename docs/{symfony => bundle}/production_settings.md (100%) rename docs/{symfony => bundle}/quick_tour.md (100%) diff --git a/docs/async_event_dispatcher/quick_tour.md b/docs/async_event_dispatcher/quick_tour.md index eba466fd9..7f3fc6a78 100644 --- a/docs/async_event_dispatcher/quick_tour.md +++ b/docs/async_event_dispatcher/quick_tour.md @@ -14,7 +14,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Async event dispatcher (Symfony) The doc shows how you can setup async event dispatching in plain PHP. -If you are looking for the ways to use it in Symfony application [read this post instead](../symfony/async_events.md) +If you are looking for the ways to use it in Symfony application [read this post instead](../bundle/async_events.md) * [Installation](#installation) * [Configuration](#configuration) diff --git a/docs/symfony/async_commands.md b/docs/bundle/async_commands.md similarity index 100% rename from docs/symfony/async_commands.md rename to docs/bundle/async_commands.md diff --git a/docs/symfony/async_events.md b/docs/bundle/async_events.md similarity index 100% rename from docs/symfony/async_events.md rename to docs/bundle/async_events.md diff --git a/docs/symfony/cli_commands.md b/docs/bundle/cli_commands.md similarity index 100% rename from docs/symfony/cli_commands.md rename to docs/bundle/cli_commands.md diff --git a/docs/symfony/config_reference.md b/docs/bundle/config_reference.md similarity index 100% rename from docs/symfony/config_reference.md rename to docs/bundle/config_reference.md diff --git a/docs/symfony/consumption_extension.md b/docs/bundle/consumption_extension.md similarity index 100% rename from docs/symfony/consumption_extension.md rename to docs/bundle/consumption_extension.md diff --git a/docs/symfony/debugging.md b/docs/bundle/debugging.md similarity index 100% rename from docs/symfony/debugging.md rename to docs/bundle/debugging.md diff --git a/docs/symfony/functional_testing.md b/docs/bundle/functional_testing.md similarity index 100% rename from docs/symfony/functional_testing.md rename to docs/bundle/functional_testing.md diff --git a/docs/symfony/index.md b/docs/bundle/index.md similarity index 100% rename from docs/symfony/index.md rename to docs/bundle/index.md diff --git a/docs/symfony/job_queue.md b/docs/bundle/job_queue.md similarity index 100% rename from docs/symfony/job_queue.md rename to docs/bundle/job_queue.md diff --git a/docs/symfony/message_processor.md b/docs/bundle/message_processor.md similarity index 100% rename from docs/symfony/message_processor.md rename to docs/bundle/message_processor.md diff --git a/docs/symfony/message_producer.md b/docs/bundle/message_producer.md similarity index 100% rename from docs/symfony/message_producer.md rename to docs/bundle/message_producer.md diff --git a/docs/symfony/production_settings.md b/docs/bundle/production_settings.md similarity index 100% rename from docs/symfony/production_settings.md rename to docs/bundle/production_settings.md diff --git a/docs/symfony/quick_tour.md b/docs/bundle/quick_tour.md similarity index 100% rename from docs/symfony/quick_tour.md rename to docs/bundle/quick_tour.md diff --git a/docs/consumption/extensions.md b/docs/consumption/extensions.md index 91819ae35..d2018fbd5 100644 --- a/docs/consumption/extensions.md +++ b/docs/consumption/extensions.md @@ -15,7 +15,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Consumption extensions. You can learn how to register extensions in [quick tour](../quick_tour.md#consumption). -There's dedicated [chapter](../symfony/consumption_extension.md) for how to add extension in Symfony app. +There's dedicated [chapter](../bundle/consumption_extension.md) for how to add extension in Symfony app. ## [LoggerExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/LoggerExtension.php) diff --git a/docs/index.md b/docs/index.md index 6476d3397..54665bb76 100644 --- a/docs/index.md +++ b/docs/index.md @@ -47,18 +47,18 @@ Enqueue is an MIT-licensed open source project with its ongoing development made - [Run unique job](job_queue/run_unique_job.md) - [Run sub job(s)](job_queue/run_sub_job.md) * [EnqueueBundle (Symfony)](#enqueue-bundle-symfony). - - [Quick tour](symfony/quick_tour.md) - - [Config reference](symfony/config_reference.md) - - [Cli commands](symfony/cli_commands.md) - - [Message producer](symfony/message_producer.md) - - [Message processor](symfony/message_processor.md) - - [Async events](symfony/async_events.md) - - [Async commands](symfony/async_commands.md) - - [Job queue](symfony/job_queue.md) - - [Consumption extension](symfony/consumption_extension.md) - - [Production settings](symfony/production_settings.md) - - [Debugging](symfony/debugging.md) - - [Functional testing](symfony/functional_testing.md) + - [Quick tour](bundle/quick_tour.md) + - [Config reference](bundle/config_reference.md) + - [Cli commands](bundle/cli_commands.md) + - [Message producer](bundle/message_producer.md) + - [Message processor](bundle/message_processor.md) + - [Async events](bundle/async_events.md) + - [Async commands](bundle/async_commands.md) + - [Job queue](bundle/job_queue.md) + - [Consumption extension](bundle/consumption_extension.md) + - [Production settings](bundle/production_settings.md) + - [Debugging](bundle/debugging.md) + - [Functional testing](bundle/functional_testing.md) * [Laravel](#laravel) - [Quick tour](laravel/quick_tour.md) - [Queues](laravel/queues.md) From ee23b9d4d57da55f842db8d21790eadbaaf1da20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 27 May 2019 12:18:10 +0200 Subject: [PATCH 0641/1142] Match topic order from index.md --- docs/bundle/async_commands.md | 1 + docs/bundle/async_events.md | 1 + docs/bundle/cli_commands.md | 1 + docs/bundle/config_reference.md | 1 + docs/bundle/consumption_extension.md | 1 + docs/bundle/debugging.md | 1 + docs/bundle/functional_testing.md | 1 + docs/bundle/index.md | 2 +- docs/bundle/job_queue.md | 1 + docs/bundle/message_processor.md | 1 + docs/bundle/message_producer.md | 1 + docs/bundle/production_settings.md | 1 + docs/bundle/quick_tour.md | 2 +- docs/client/extensions.md | 4 +++- docs/client/index.md | 9 +++++++++ docs/client/message_bus.md | 4 +++- docs/client/message_examples.md | 4 +++- docs/client/quick_tour.md | 4 +++- docs/client/rpc_call.md | 4 +++- docs/client/supported_brokers.md | 4 +++- docs/consumption/index.md | 2 +- docs/contribution.md | 14 ++++++++++---- docs/dsn.md | 4 ++-- docs/job_queue/index.md | 2 +- docs/job_queue/run_sub_job.md | 1 + docs/job_queue/run_unique_job.md | 1 + docs/laravel/index.md | 9 +++++++++ docs/laravel/queues.md | 1 + docs/laravel/quick_tour.md | 6 +++--- docs/magento/cli_commands.md | 1 + docs/magento/index.md | 9 +++++++++ docs/magento/quick_tour.md | 6 +++--- docs/magento2/cli_commands.md | 1 + docs/magento2/index.md | 9 +++++++++ docs/magento2/quick_tour.md | 6 +++--- docs/messages.md | 2 +- docs/monitoring.md | 6 ++++++ docs/yii/amqp_driver.md | 14 ++++++++++---- docs/yii/index.md | 9 +++++++++ 39 files changed, 121 insertions(+), 30 deletions(-) create mode 100644 docs/client/index.md create mode 100644 docs/laravel/index.md create mode 100644 docs/magento/index.md create mode 100644 docs/magento2/index.md create mode 100644 docs/yii/index.md diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md index def5a873c..f5e615351 100644 --- a/docs/bundle/async_commands.md +++ b/docs/bundle/async_commands.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Async commands +nav_order: 7 ---

Supporting Enqueue

diff --git a/docs/bundle/async_events.md b/docs/bundle/async_events.md index 707341dce..185cfbcf8 100644 --- a/docs/bundle/async_events.md +++ b/docs/bundle/async_events.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Async events +nav_order: 6 ---

Supporting Enqueue

diff --git a/docs/bundle/cli_commands.md b/docs/bundle/cli_commands.md index 677d48db6..23639386c 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/bundle/cli_commands.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: CLI commands +nav_order: 3 ---

Supporting Enqueue

diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index f3abfb884..f5b4f95e2 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Config reference +nav_order: 2 ---

Supporting Enqueue

diff --git a/docs/bundle/consumption_extension.md b/docs/bundle/consumption_extension.md index 7be347e81..64165f100 100644 --- a/docs/bundle/consumption_extension.md +++ b/docs/bundle/consumption_extension.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Consumption extension +nav_order: 9 ---

Supporting Enqueue

diff --git a/docs/bundle/debugging.md b/docs/bundle/debugging.md index 28bee8c77..8b1868e65 100644 --- a/docs/bundle/debugging.md +++ b/docs/bundle/debugging.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Debugging +nav_order: 11 ---

Supporting Enqueue

diff --git a/docs/bundle/functional_testing.md b/docs/bundle/functional_testing.md index db7367a0d..20d7f59f0 100644 --- a/docs/bundle/functional_testing.md +++ b/docs/bundle/functional_testing.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Functional testing +nav_order: 12 ---

Supporting Enqueue

diff --git a/docs/bundle/index.md b/docs/bundle/index.md index 61bc70bcd..0e18e8b91 100644 --- a/docs/bundle/index.md +++ b/docs/bundle/index.md @@ -1,7 +1,7 @@ --- layout: default title: "Symfony bundle" -nav_order: 8 +nav_order: 6 has_children: true permalink: /symfony --- diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index 617e6e91a..5a2b174e5 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Job queue +nav_order: 8 ---

Supporting Enqueue

diff --git a/docs/bundle/message_processor.md b/docs/bundle/message_processor.md index 8e852c4eb..74b3ead1c 100644 --- a/docs/bundle/message_processor.md +++ b/docs/bundle/message_processor.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Message processor +nav_order: 5 ---

Supporting Enqueue

diff --git a/docs/bundle/message_producer.md b/docs/bundle/message_producer.md index ccd04bffb..fae1e8c68 100644 --- a/docs/bundle/message_producer.md +++ b/docs/bundle/message_producer.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Message producer +nav_order: 4 ---

Supporting Enqueue

diff --git a/docs/bundle/production_settings.md b/docs/bundle/production_settings.md index 85af44b66..372f5159e 100644 --- a/docs/bundle/production_settings.md +++ b/docs/bundle/production_settings.md @@ -2,6 +2,7 @@ layout: default parent: "Symfony bundle" title: Production settings +nav_order: 10 ---

Supporting Enqueue

diff --git a/docs/bundle/quick_tour.md b/docs/bundle/quick_tour.md index 9cb74ca92..ac5dabeeb 100644 --- a/docs/bundle/quick_tour.md +++ b/docs/bundle/quick_tour.md @@ -2,7 +2,7 @@ layout: default parent: "Symfony bundle" title: Quick tour -nav_order: -1 +nav_order: 1 ---

Supporting Enqueue

diff --git a/docs/client/extensions.md b/docs/client/extensions.md index b4d3df89b..4bef0739c 100644 --- a/docs/client/extensions.md +++ b/docs/client/extensions.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +parent: Client +title: Extensions +nav_order: 6 ---

Supporting Enqueue

diff --git a/docs/client/index.md b/docs/client/index.md new file mode 100644 index 000000000..aa222138f --- /dev/null +++ b/docs/client/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Client +nav_order: 4 +has_children: true +permalink: /client +--- + +{:toc} diff --git a/docs/client/message_bus.md b/docs/client/message_bus.md index 56019f6f5..24a9087fa 100644 --- a/docs/client/message_bus.md +++ b/docs/client/message_bus.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +parent: Client +title: Message bus +nav_order: 4 ---

Supporting Enqueue

diff --git a/docs/client/message_examples.md b/docs/client/message_examples.md index 5c882588e..8b195a591 100644 --- a/docs/client/message_examples.md +++ b/docs/client/message_examples.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +parent: Client +title: Message examples +nav_order: 2 ---

Supporting Enqueue

diff --git a/docs/client/quick_tour.md b/docs/client/quick_tour.md index f5dbcbcf3..07647f91e 100644 --- a/docs/client/quick_tour.md +++ b/docs/client/quick_tour.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +parent: Client +title: Quick tour +nav_order: 1 ---

Supporting Enqueue

diff --git a/docs/client/rpc_call.md b/docs/client/rpc_call.md index 2f57e4833..44982ecf1 100644 --- a/docs/client/rpc_call.md +++ b/docs/client/rpc_call.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +parent: Client +title: RPC call +nav_order: 5 ---

Supporting Enqueue

diff --git a/docs/client/supported_brokers.md b/docs/client/supported_brokers.md index 6e06a62ae..b090787be 100644 --- a/docs/client/supported_brokers.md +++ b/docs/client/supported_brokers.md @@ -1,6 +1,8 @@ --- layout: default -nav_exclude: true +parent: Client +title: Supported brokers +nav_order: 3 ---

Supporting Enqueue

diff --git a/docs/consumption/index.md b/docs/consumption/index.md index eefe58f7b..4ecf99d9c 100644 --- a/docs/consumption/index.md +++ b/docs/consumption/index.md @@ -1,7 +1,7 @@ --- layout: default title: Consumption -nav_order: 2 +nav_order: 3 has_children: true permalink: /consumption --- diff --git a/docs/contribution.md b/docs/contribution.md index 6521fea4f..34d6324ec 100644 --- a/docs/contribution.md +++ b/docs/contribution.md @@ -1,3 +1,9 @@ +--- +layout: default +title: Contribution +nav_order: 99 +--- +

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -9,8 +15,8 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Contribution -To contribute you have to send a pull request to [enqueue-dev](https://github.com/php-enqueue/enqueue-dev) repository. -The pull requests to read only subtree split [repositories](https://github.com/php-enqueue/enqueue-dev/blob/master/bin/subtree-split#L46) will be closed. +To contribute you have to send a pull request to [enqueue-dev](https://github.com/php-enqueue/enqueue-dev) repository. +The pull requests to read only subtree split [repositories](https://github.com/php-enqueue/enqueue-dev/blob/master/bin/subtree-split#L46) will be closed. ## Setup environment @@ -37,10 +43,10 @@ or for a package only: ./bin/test.sh pkg/enqueue ``` -## Commit +## Commit When you try to commit changes `php-cs-fixer` is run. It fixes all coding style issues. Don't forget to stage them and commit everything. -Once everything is done open a pull request on official repository. +Once everything is done open a pull request on official repository. ## WTF?! diff --git a/docs/dsn.md b/docs/dsn.md index 71fb3574a..5062ce03c 100644 --- a/docs/dsn.md +++ b/docs/dsn.md @@ -1,7 +1,7 @@ --- layout: default -title: DSN -nav_order: 98 +title: DSN Parser +nav_order: 92 ---

Supporting Enqueue

diff --git a/docs/job_queue/index.md b/docs/job_queue/index.md index cd3a2c419..f29a8a97a 100644 --- a/docs/job_queue/index.md +++ b/docs/job_queue/index.md @@ -1,7 +1,7 @@ --- layout: default title: Job Queue -nav_order: 6 +nav_order: 5 has_children: true permalink: /job-queue --- diff --git a/docs/job_queue/run_sub_job.md b/docs/job_queue/run_sub_job.md index 7121b1d9f..88397a580 100644 --- a/docs/job_queue/run_sub_job.md +++ b/docs/job_queue/run_sub_job.md @@ -2,6 +2,7 @@ layout: default parent: Job Queue title: Run sub job +nav_order: 2 ---

Supporting Enqueue

diff --git a/docs/job_queue/run_unique_job.md b/docs/job_queue/run_unique_job.md index 7218ae386..1dc9937dd 100644 --- a/docs/job_queue/run_unique_job.md +++ b/docs/job_queue/run_unique_job.md @@ -2,6 +2,7 @@ layout: default parent: Job Queue title: Run unique job +nav_order: 1 ---

Supporting Enqueue

diff --git a/docs/laravel/index.md b/docs/laravel/index.md new file mode 100644 index 000000000..74f2a9fd4 --- /dev/null +++ b/docs/laravel/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Laravel +has_children: true +nav_order: 6 +permalink: /laravel +--- + +{:toc} diff --git a/docs/laravel/queues.md b/docs/laravel/queues.md index 2deef9e61..1aca7a0dd 100644 --- a/docs/laravel/queues.md +++ b/docs/laravel/queues.md @@ -2,6 +2,7 @@ layout: default parent: Laravel title: Queues +nav_order: 2 ---

Supporting Enqueue

diff --git a/docs/laravel/quick_tour.md b/docs/laravel/quick_tour.md index 4c9f522c6..848424a25 100644 --- a/docs/laravel/quick_tour.md +++ b/docs/laravel/quick_tour.md @@ -1,8 +1,8 @@ --- layout: default -title: Laravel -has_children: true -nav_order: 4 +parent: Laravel +title: Quick tour +nav_order: 1 ---

Supporting Enqueue

diff --git a/docs/magento/cli_commands.md b/docs/magento/cli_commands.md index 070bf46d3..2cc0c847d 100644 --- a/docs/magento/cli_commands.md +++ b/docs/magento/cli_commands.md @@ -2,6 +2,7 @@ layout: default parent: Magento title: CLI commands +nav_order: 2 ---

Supporting Enqueue

diff --git a/docs/magento/index.md b/docs/magento/index.md new file mode 100644 index 000000000..291ddf549 --- /dev/null +++ b/docs/magento/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Magento +has_children: true +nav_order: 7 +permalink: /magento +--- + +{:toc} diff --git a/docs/magento/quick_tour.md b/docs/magento/quick_tour.md index 3461a5bc2..df14f2350 100644 --- a/docs/magento/quick_tour.md +++ b/docs/magento/quick_tour.md @@ -1,8 +1,8 @@ --- layout: default -has_children: true -title: Magento -nav_order: 4 +parent: Magento +title: Quick tour +nav_order: 1 ---

Supporting Enqueue

diff --git a/docs/magento2/cli_commands.md b/docs/magento2/cli_commands.md index 649ff29d9..9931b0b1f 100644 --- a/docs/magento2/cli_commands.md +++ b/docs/magento2/cli_commands.md @@ -2,6 +2,7 @@ layout: default parent: Magento 2 title: CLI commands +nav_order: 2 ---

Supporting Enqueue

diff --git a/docs/magento2/index.md b/docs/magento2/index.md new file mode 100644 index 000000000..9ae85803a --- /dev/null +++ b/docs/magento2/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Magento 2 +has_children: true +nav_order: 8 +permalink: /magento2 +--- + +{:toc} diff --git a/docs/magento2/quick_tour.md b/docs/magento2/quick_tour.md index c7029f502..4c2957702 100644 --- a/docs/magento2/quick_tour.md +++ b/docs/magento2/quick_tour.md @@ -1,8 +1,8 @@ --- layout: default -title: Magento 2 -has_children: true -nav_order: 4 +parent: Magento 2 +title: Quick tour +nav_order: 1 ---

Supporting Enqueue

diff --git a/docs/messages.md b/docs/messages.md index e81d6fbe6..42be99361 100644 --- a/docs/messages.md +++ b/docs/messages.md @@ -1,7 +1,7 @@ --- layout: default title: Messages -nav_exclude: true +nav_order: 90 ---

Supporting Enqueue

diff --git a/docs/monitoring.md b/docs/monitoring.md index 93ea8876e..f053c8c15 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -1,3 +1,9 @@ +--- +layout: default +title: Monitoring +nav_order: 95 +--- +

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: diff --git a/docs/yii/amqp_driver.md b/docs/yii/amqp_driver.md index 27890ed25..3dc17f055 100644 --- a/docs/yii/amqp_driver.md +++ b/docs/yii/amqp_driver.md @@ -1,3 +1,9 @@ +--- +layout: default +parent: Yii +title: AMQP Interop driver +nav_order: 1 +---

Supporting Enqueue

Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: @@ -18,12 +24,12 @@ In order for it to work you should add any [amqp interop](https://github.com/que Advantages: -* It would work with any amqp interop compatible transports, such as +* It would work with any amqp interop compatible transports, such as * [enqueue/amqp-ext](https://github.com/php-enqueue/amqp-ext) based on [PHP amqp extension](https://github.com/pdezwart/php-amqp) * [enqueue/amqp-lib](https://github.com/php-enqueue/amqp-lib) based on [php-amqplib/php-amqplib](https://github.com/php-amqplib/php-amqplib) * [enqueue/amqp-bunny](https://github.com/php-enqueue/amqp-bunny) based on [bunny](https://github.com/jakubkulhan/bunny) - + * Supports priorities * Supports delays * Supports ttr @@ -47,10 +53,10 @@ return [ 'password' => 'guest', 'queueName' => 'queue', 'driver' => yii\queue\amqp_interop\Queue::ENQUEUE_AMQP_LIB, - + // or 'dsn' => 'amqp://guest:guest@localhost:5672/%2F', - + // or, same as above 'dsn' => 'amqp:', ], diff --git a/docs/yii/index.md b/docs/yii/index.md new file mode 100644 index 000000000..943059db5 --- /dev/null +++ b/docs/yii/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Yii +has_children: true +nav_order: 9 +permalink: /yii +--- + +{:toc} From 027fc41647efcb56212db648fcca9c98e9156b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 27 May 2019 14:27:49 +0200 Subject: [PATCH 0642/1142] Prefer github pages in readme --- README.md | 60 +++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 47a6174a5..22ad41ea8 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made ## Introduction -**Enqueue** is production ready, battle-tested messaging solution for PHP. Provides a common way for programs to create, send, read messages. +**Enqueue** is production ready, battle-tested messaging solution for PHP. Provides a common way for programs to create, send, read messages. This is a main development repository. It provides a friendly environment for productive development and testing of all Enqueue related features&packages. @@ -28,88 +28,88 @@ Features: * Adopts [queue interoperable](https://github.com/queue-interop/queue-interop) interfaces (inspired by [Java JMS](https://docs.oracle.com/javaee/7/api/javax/jms/package-summary.html)). * Battle-tested. Used in production. -* Supported transports - * [AMQP(s)](docs/transport/amqp.md) based on [PHP AMQP extension](https://github.com/pdezwart/php-amqp) +* Supported transports + * [AMQP(s)](https://php-enqueue.github.io/transport/amqp/) based on [PHP AMQP extension](https://github.com/pdezwart/php-amqp) [![Build Status](https://travis-ci.org/php-enqueue/amqp-ext.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-ext) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-ext/d/total.png)](https://packagist.org/packages/enqueue/amqp-ext/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-ext/version.png)](https://packagist.org/packages/enqueue/amqp-ext) - * [AMQP](docs/transport/amqp_bunny.md) based on [bunny](https://github.com/jakubkulhan/bunny) + * [AMQP](https://php-enqueue.github.io/transport/amqp_bunny/) based on [bunny](https://github.com/jakubkulhan/bunny) [![Build Status](https://travis-ci.org/php-enqueue/amqp-bunny.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-bunny) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-bunny/d/total.png)](https://packagist.org/packages/enqueue/amqp-bunny/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-bunny/version.png)](https://packagist.org/packages/enqueue/amqp-bunny) - * [AMQP(s)](docs/transport/amqp_lib.md) based on [php-amqplib](https://github.com/php-amqplib/php-amqplib) + * [AMQP(s)](https://php-enqueue.github.io/transport/amqp_lib/) based on [php-amqplib](https://github.com/php-amqplib/php-amqplib) [![Build Status](https://travis-ci.org/php-enqueue/amqp-lib.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-lib) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-lib/d/total.png)](https://packagist.org/packages/enqueue/amqp-lib/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-lib/version.png)](https://packagist.org/packages/enqueue/amqp-lib) - * [Beanstalk](docs/transport/pheanstalk.md) + * [Beanstalk](https://php-enqueue.github.io/transport/pheanstalk/) [![Build Status](https://travis-ci.org/php-enqueue/pheanstalk.png?branch=master)](https://travis-ci.org/php-enqueue/pheanstalk) [![Total Downloads](https://poser.pugx.org/enqueue/pheanstalk/d/total.png)](https://packagist.org/packages/enqueue/pheanstalk/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/pheanstalk/version.png)](https://packagist.org/packages/enqueue/pheanstalk) - * [STOMP](docs/transport/stomp.md) + * [STOMP](https://php-enqueue.github.io/transport/stomp/) [![Build Status](https://travis-ci.org/php-enqueue/stomp.png?branch=master)](https://travis-ci.org/php-enqueue/stomp) [![Total Downloads](https://poser.pugx.org/enqueue/stomp/d/total.png)](https://packagist.org/packages/enqueue/stomp/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/stomp/version.png)](https://packagist.org/packages/enqueue/stomp) - * [Amazon SQS](docs/transport/sqs.md) + * [Amazon SQS](https://php-enqueue.github.io/transport/sqs/) [![Build Status](https://travis-ci.org/php-enqueue/sqs.png?branch=master)](https://travis-ci.org/php-enqueue/sqs) [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) - * [Amazon SNS](docs/transport/sns.md) + * [Amazon SNS](https://php-enqueue.github.io/transport/snsqs/) [![Build Status](https://travis-ci.org/php-enqueue/sns.png?branch=master)](https://travis-ci.org/php-enqueue/sns) [![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) - * [Amazon SNS\SQS](docs/transport/snsqs.md) + * [Amazon SNS\SQS](https://php-enqueue.github.io/transport/snsqs/) [![Build Status](https://travis-ci.org/php-enqueue/snsqs.png?branch=master)](https://travis-ci.org/php-enqueue/snsqs) [![Total Downloads](https://poser.pugx.org/enqueue/snsqs/d/total.png)](https://packagist.org/packages/enqueue/snsqs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/snsqs/version.png)](https://packagist.org/packages/enqueue/snsqs) - * [Google PubSub](docs/transport/gps.md) + * [Google PubSub](https://php-enqueue.github.io/transport/gps/) [![Build Status](https://travis-ci.org/php-enqueue/gps.png?branch=master)](https://travis-ci.org/php-enqueue/gps) [![Total Downloads](https://poser.pugx.org/enqueue/gps/d/total.png)](https://packagist.org/packages/enqueue/gps/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/gps/version.png)](https://packagist.org/packages/enqueue/gps) - * [Kafka](docs/transport/kafka.md) + * [Kafka](https://php-enqueue.github.io/transport/kafka/) [![Build Status](https://travis-ci.org/php-enqueue/rdkafka.png?branch=master)](https://travis-ci.org/php-enqueue/rdkafka) [![Total Downloads](https://poser.pugx.org/enqueue/rdkafka/d/total.png)](https://packagist.org/packages/enqueue/rdkafka/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/rdkafka/version.png)](https://packagist.org/packages/enqueue/rdkafka) - * [Redis](docs/transport/redis.md) + * [Redis](https://php-enqueue.github.io/transport/redis/) [![Build Status](https://travis-ci.org/php-enqueue/redis.png?branch=master)](https://travis-ci.org/php-enqueue/redis) [![Total Downloads](https://poser.pugx.org/enqueue/redis/d/total.png)](https://packagist.org/packages/enqueue/redis/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/redis/version.png)](https://packagist.org/packages/enqueue/redis) - * [Gearman](docs/transport/gearman.md) + * [Gearman](https://php-enqueue.github.io/transport/gearman/) [![Build Status](https://travis-ci.org/php-enqueue/gearman.png?branch=master)](https://travis-ci.org/php-enqueue/gearman) [![Total Downloads](https://poser.pugx.org/enqueue/gearman/d/total.png)](https://packagist.org/packages/enqueue/gearman/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/gearman/version.png)](https://packagist.org/packages/enqueue/gearman) - * [Doctrine DBAL](docs/transport/dbal.md) + * [Doctrine DBAL](https://php-enqueue.github.io/transport/dbal/) [![Build Status](https://travis-ci.org/php-enqueue/dbal.png?branch=master)](https://travis-ci.org/php-enqueue/dbal) [![Total Downloads](https://poser.pugx.org/enqueue/dbal/d/total.png)](https://packagist.org/packages/enqueue/dbal/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/dbal/version.png)](https://packagist.org/packages/enqueue/dbal) - * [Filesystem](docs/transport/filesystem.md) + * [Filesystem](https://php-enqueue.github.io/transport/filesystem/) [![Build Status](https://travis-ci.org/php-enqueue/fs.png?branch=master)](https://travis-ci.org/php-enqueue/fs) [![Total Downloads](https://poser.pugx.org/enqueue/fs/d/total.png)](https://packagist.org/packages/enqueue/fs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/fs/version.png)](https://packagist.org/packages/enqueue/fs) - * [Mongodb](docs/transport/mongodb.md) + * [Mongodb](https://php-enqueue.github.io/transport/mongodb/) [![Build Status](https://travis-ci.org/php-enqueue/mongodb.png?branch=master)](https://travis-ci.org/php-enqueue/mongodb) [![Total Downloads](https://poser.pugx.org/enqueue/mongodb/d/total.png)](https://packagist.org/packages/enqueue/mongodb/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/mongodb/version.png)](https://packagist.org/packages/enqueue/mongodb) - * [WAMP](docs/transport/wamp.md) + * [WAMP](https://php-enqueue.github.io/transport/wamp/) [![Build Status](https://travis-ci.org/php-enqueue/wamp.png?branch=master)](https://travis-ci.org/php-enqueue/wamp) [![Total Downloads](https://poser.pugx.org/enqueue/wamp/d/total.png)](https://packagist.org/packages/enqueue/wamp/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/wamp/version.png)](https://packagist.org/packages/enqueue/wamp) - * [Null](docs/transport/null.md) + * [Null](https://php-enqueue.github.io/transport/null/) [![Build Status](https://travis-ci.org/php-enqueue/null.png?branch=master)](https://travis-ci.org/php-enqueue/null) [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) * [the others are coming](https://github.com/php-enqueue/enqueue-dev/issues/284) -* [Symfony bundle](docs/bundle/quick_tour.md) -* [Magento1 extension](docs/magento/quick_tour.md) -* [Magento2 module](docs/magento2/quick_tour.md) -* [Laravel extension](docs/laravel/quick_tour.md) -* [Yii2. Amqp driver](docs/yii/amqp_driver.md) -* [Message bus](docs/quick_tour.md#client) support. -* [RPC over MQ](docs/quick_tour.md#remote-procedure-call-rpc) support. -* [Monitoring](docs/monitoring.md) +* [Symfony bundle](https://php-enqueue.github.io/symfony/quick_tour/) +* [Magento1 extension](https://php-enqueue.github.io/magento/quick_tour/) +* [Magento2 module](https://php-enqueue.github.io/magento2/quick_tour/) +* [Laravel extension](https://php-enqueue.github.io/laravel/quick_tour/) +* [Yii2. Amqp driver](https://php-enqueue.github.io/yii/amqp_driver/) +* [Message bus](https://php-enqueue.github.io/quick_tour/#client) support. +* [RPC over MQ](https://php-enqueue.github.io/quick_tour/#remote-procedure-call-rpc) support. +* [Monitoring](https://php-enqueue.github.io/monitoring/) * Temporary queues support. * Well designed, decoupled and reusable components. * Carefully tested (unit & functional). -* For more visit [quick tour](docs/quick_tour.md). +* For more visit [quick tour](https://php-enqueue.github.io/quick_tour/). ## Resources @@ -122,8 +122,8 @@ Features: ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com From ca8a3c982fd75bf2d7e6fd64a5db1b5f0b1aa431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 27 May 2019 15:10:21 +0200 Subject: [PATCH 0643/1142] Add Amazon SNS documentation placeholder --- README.md | 2 +- docs/transport/sns.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 docs/transport/sns.md diff --git a/README.md b/README.md index 22ad41ea8..82b45a881 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Features: [![Build Status](https://travis-ci.org/php-enqueue/sqs.png?branch=master)](https://travis-ci.org/php-enqueue/sqs) [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) - * [Amazon SNS](https://php-enqueue.github.io/transport/snsqs/) + * [Amazon SNS](https://php-enqueue.github.io/transport/sns/) [![Build Status](https://travis-ci.org/php-enqueue/sns.png?branch=master)](https://travis-ci.org/php-enqueue/sns) [![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) diff --git a/docs/transport/sns.md b/docs/transport/sns.md new file mode 100644 index 000000000..8c367aef9 --- /dev/null +++ b/docs/transport/sns.md @@ -0,0 +1,21 @@ +--- +layout: default +title: Amazon SNS +parent: Transports +nav_order: 3 +--- +

Supporting Enqueue

+ +Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: + +- [Become a sponsor](https://www.patreon.com/makasim) +- [Become our client](http://forma-pro.com/) + +--- + +# Amazon SNS transport + +SNS documentation is under construction. +See: [#769](https://github.com/php-enqueue/enqueue-dev/issues/769) + +[back to index](../index.md) From 0249cacfc7ab6b16fdb0181c11502a88c64dffcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 27 May 2019 15:12:22 +0200 Subject: [PATCH 0644/1142] Prefer github pages in packages' readme files --- pkg/amqp-bunny/README.md | 12 ++++++------ pkg/amqp-ext/README.md | 12 ++++++------ pkg/amqp-lib/README.md | 12 ++++++------ pkg/amqp-tools/README.md | 14 +++++++------- pkg/async-command/README.md | 12 ++++++------ pkg/async-event-dispatcher/README.md | 12 ++++++------ pkg/dbal/README.md | 12 ++++++------ pkg/enqueue-bundle/README.md | 12 ++++++------ pkg/enqueue/README.md | 14 +++++++------- pkg/fs/README.md | 8 ++++---- pkg/gearman/README.md | 12 ++++++------ pkg/gps/README.md | 8 ++++---- pkg/job-queue/README.md | 14 +++++++------- pkg/mongodb/README.md | 12 ++++++------ pkg/null/README.md | 8 ++++---- pkg/pheanstalk/README.md | 12 ++++++------ pkg/rdkafka/README.md | 10 +++++----- pkg/redis/README.md | 12 ++++++------ pkg/simple-client/README.md | 10 +++++----- pkg/sns/README.md | 6 +++--- pkg/snsqs/README.md | 6 +++--- pkg/sqs/README.md | 8 ++++---- pkg/stomp/README.md | 10 +++++----- pkg/test/README.md | 12 ++++++------ pkg/wamp/README.md | 12 ++++++------ 25 files changed, 136 insertions(+), 136 deletions(-) diff --git a/pkg/amqp-bunny/README.md b/pkg/amqp-bunny/README.md index c88ac197b..9efcfa531 100644 --- a/pkg/amqp-bunny/README.md +++ b/pkg/amqp-bunny/README.md @@ -13,24 +13,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/amqp-bunny.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-bunny) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-bunny/d/total.png)](https://packagist.org/packages/enqueue/amqp-bunny) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-bunny/version.png)](https://packagist.org/packages/enqueue/amqp-bunny) - -This is an implementation of [amqp interop](https://github.com/queue-interop/amqp-interop). It uses [bunny](https://github.com/jakubkulhan/bunny) internally. + +This is an implementation of [amqp interop](https://github.com/queue-interop/amqp-interop). It uses [bunny](https://github.com/jakubkulhan/bunny) internally. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/amqp_bunny/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/amqp-ext/README.md b/pkg/amqp-ext/README.md index aaed7564f..e750d3c36 100644 --- a/pkg/amqp-ext/README.md +++ b/pkg/amqp-ext/README.md @@ -11,24 +11,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/amqp-ext.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-ext) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-ext/d/total.png)](https://packagist.org/packages/enqueue/amqp-ext) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-ext/version.png)](https://packagist.org/packages/enqueue/amqp-ext) - -This is an implementation of [amqp interop](https://github.com/queue-interop/amqp-interop). It uses PHP [amqp extension](https://github.com/pdezwart/php-amqp) internally. + +This is an implementation of [amqp interop](https://github.com/queue-interop/amqp-interop). It uses PHP [amqp extension](https://github.com/pdezwart/php-amqp) internally. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/amqp/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/amqp-lib/README.md b/pkg/amqp-lib/README.md index 11081ecd2..1a7be690a 100644 --- a/pkg/amqp-lib/README.md +++ b/pkg/amqp-lib/README.md @@ -13,24 +13,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/amqp-lib.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-lib) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-lib/d/total.png)](https://packagist.org/packages/enqueue/amqp-lib) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-lib/version.png)](https://packagist.org/packages/enqueue/amqp-lib) - -This is an implementation of [amqp interop](https://github.com/queue-interop/amqp-interop). It uses [php-amqplib](https://github.com/php-amqplib/php-amqplib) internally. + +This is an implementation of [amqp interop](https://github.com/queue-interop/amqp-interop). It uses [php-amqplib](https://github.com/php-amqplib/php-amqplib) internally. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/amqp_lib/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/amqp-tools/README.md b/pkg/amqp-tools/README.md index c3e469f45..b4b7f2249 100644 --- a/pkg/amqp-tools/README.md +++ b/pkg/amqp-tools/README.md @@ -13,25 +13,25 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/amqp-tools.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-tools) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-tools/d/total.png)](https://packagist.org/packages/enqueue/amqp-tools) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-tools/version.png)](https://packagist.org/packages/enqueue/amqp-tools) - -Provides features that are not part of the AMQP spec but could be built on top of. -The tools could be used with any [amqp interop](https://github.com/queue-interop/queue-interop#amqp-interop) compatible transport. + +Provides features that are not part of the AMQP spec but could be built on top of. +The tools could be used with any [amqp interop](https://github.com/queue-interop/queue-interop#amqp-interop) compatible transport. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.com/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/async-command/README.md b/pkg/async-command/README.md index 09af3be97..7ac95ffcd 100644 --- a/pkg/async-command/README.md +++ b/pkg/async-command/README.md @@ -13,21 +13,21 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/async-command.png?branch=master)](https://travis-ci.org/php-enqueue/async-command) [![Total Downloads](https://poser.pugx.org/enqueue/async-command/d/total.png)](https://packagist.org/packages/enqueue/async-command) [![Latest Stable Version](https://poser.pugx.org/enqueue/async-command/version.png)](https://packagist.org/packages/enqueue/async-command) - -It contains an extension to Symfony's [Console](https://symfony.com/doc/current/components/console.html) component. -It allows to execute Symfony's command async by sending the request to message queue. + +It contains an extension to Symfony's [Console](https://symfony.com/doc/current/components/console.html) component. +It allows to execute Symfony's command async by sending the request to message queue. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.com/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com diff --git a/pkg/async-event-dispatcher/README.md b/pkg/async-event-dispatcher/README.md index 8554df774..7e7fdc056 100644 --- a/pkg/async-event-dispatcher/README.md +++ b/pkg/async-event-dispatcher/README.md @@ -13,21 +13,21 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/async-event-dispathcer.png?branch=master)](https://travis-ci.org/php-enqueue/async-event-dispathcer) [![Total Downloads](https://poser.pugx.org/enqueue/async-event-dispathcer/d/total.png)](https://packagist.org/packages/enqueue/async-event-dispathcer) [![Latest Stable Version](https://poser.pugx.org/enqueue/async-event-dispathcer/version.png)](https://packagist.org/packages/enqueue/async-event-dispathcer) - -It contains an extension to Symfony's [EventDispatcher](https://symfony.com/doc/current/components/event_dispatcher.html) component. -It allows to processes events in background by sending them to MQ. + +It contains an extension to Symfony's [EventDispatcher](https://symfony.com/doc/current/components/event_dispatcher.html) component. +It allows to processes events in background by sending them to MQ. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.com/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com diff --git a/pkg/dbal/README.md b/pkg/dbal/README.md index 0cd88a167..77af52655 100644 --- a/pkg/dbal/README.md +++ b/pkg/dbal/README.md @@ -13,24 +13,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/dbal.png?branch=master)](https://travis-ci.org/php-enqueue/dbal) [![Total Downloads](https://poser.pugx.org/enqueue/dbal/d/total.png)](https://packagist.org/packages/enqueue/dbal) [![Latest Stable Version](https://poser.pugx.org/enqueue/dbal/version.png)](https://packagist.org/packages/enqueue/dbal) - -This is an implementation of Queue Interop specification. It allows you to send and consume message through Doctrine DBAL library and SQL like database as broker. + +This is an implementation of Queue Interop specification. It allows you to send and consume message through Doctrine DBAL library and SQL like database as broker. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/dbal/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/enqueue-bundle/README.md b/pkg/enqueue-bundle/README.md index d09941d42..13c3c4065 100644 --- a/pkg/enqueue-bundle/README.md +++ b/pkg/enqueue-bundle/README.md @@ -13,25 +13,25 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/enqueue-bundle.png?branch=master)](https://travis-ci.org/php-enqueue/enqueue-bundle) [![Total Downloads](https://poser.pugx.org/enqueue/enqueue-bundle/d/total.png)](https://packagist.org/packages/enqueue/enqueue-bundle) [![Latest Stable Version](https://poser.pugx.org/enqueue/enqueue-bundle/version.png)](https://packagist.org/packages/enqueue/enqueue-bundle) - -Integrates message queue components to Symfony application. + +Integrates message queue components to Symfony application. ## Resources * [Site](https://enqueue.forma-pro.com/) * [Quick tour](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/bundle/quick_tour.md) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.com/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/enqueue/README.md b/pkg/enqueue/README.md index 0b7fb8aa2..a1e076e1c 100644 --- a/pkg/enqueue/README.md +++ b/pkg/enqueue/README.md @@ -13,26 +13,26 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/enqueue.png?branch=master)](https://travis-ci.org/php-enqueue/enqueue) [![Total Downloads](https://poser.pugx.org/enqueue/enqueue/d/total.png)](https://packagist.org/packages/enqueue/enqueue) [![Latest Stable Version](https://poser.pugx.org/enqueue/enqueue/version.png)](https://packagist.org/packages/enqueue/enqueue) - -It contains advanced features build on top of a transport component. + +It contains advanced features build on top of a transport component. Client component kind of plug and play things or consumption component that simplify message processing a lot. -Read more about it in documentation. +Read more about it in documentation. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.com/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/fs/README.md b/pkg/fs/README.md index 5f0e2c56c..b1e5411d5 100644 --- a/pkg/fs/README.md +++ b/pkg/fs/README.md @@ -13,20 +13,20 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/fs.png?branch=master)](https://travis-ci.org/php-enqueue/fs) [![Total Downloads](https://poser.pugx.org/enqueue/fs/d/total.png)](https://packagist.org/packages/enqueue/fs) [![Latest Stable Version](https://poser.pugx.org/enqueue/fs/version.png)](https://packagist.org/packages/enqueue/fs) - + This is an implementation of Queue Interop specification. It allows you to send and consume message stored locally in files. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/filesystem/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com diff --git a/pkg/gearman/README.md b/pkg/gearman/README.md index 159bfba0f..9c6efde8a 100644 --- a/pkg/gearman/README.md +++ b/pkg/gearman/README.md @@ -13,24 +13,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/gearman.png?branch=master)](https://travis-ci.org/php-enqueue/gearman) [![Total Downloads](https://poser.pugx.org/enqueue/gearman/d/total.png)](https://packagist.org/packages/enqueue/gearman) [![Latest Stable Version](https://poser.pugx.org/enqueue/gearman/version.png)](https://packagist.org/packages/enqueue/gearman) - -This is an implementation of the queue specification. It allows you to send and consume message from Gearman broker. + +This is an implementation of the queue specification. It allows you to send and consume message from Gearman broker. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/gearman/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/gps/README.md b/pkg/gps/README.md index 83fbcecb3..fc80363ae 100644 --- a/pkg/gps/README.md +++ b/pkg/gps/README.md @@ -13,16 +13,16 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/gps.png?branch=master)](https://travis-ci.org/php-enqueue/gps) [![Total Downloads](https://poser.pugx.org/enqueue/gps/d/total.png)](https://packagist.org/packages/enqueue/gps) [![Latest Stable Version](https://poser.pugx.org/enqueue/gps/version.png)](https://packagist.org/packages/enqueue/gps) - -This is an implementation of Queue Interop specification. It allows you to send and consume message through Google Pub/Sub library. + +This is an implementation of Queue Interop specification. It allows you to send and consume message through Google Pub/Sub library. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/gps/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/job-queue/README.md b/pkg/job-queue/README.md index ba381120f..1826ac5e2 100644 --- a/pkg/job-queue/README.md +++ b/pkg/job-queue/README.md @@ -13,26 +13,26 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/job-queue.png?branch=master)](https://travis-ci.org/php-enqueue/job-queue) [![Total Downloads](https://poser.pugx.org/enqueue/job-queue/d/total.png)](https://packagist.org/packages/enqueue/job-queue) [![Latest Stable Version](https://poser.pugx.org/enqueue/job-queue/version.png)](https://packagist.org/packages/enqueue/job-queue) - -There is job queue component build on top of a transport. -It provides some additional features like: unique job, sub jobs, dependent job and so. + +There is job queue component build on top of a transport. +It provides some additional features like: unique job, sub jobs, dependent job and so. Read more about it in documentation ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.com/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/mongodb/README.md b/pkg/mongodb/README.md index a741fdb62..c57f15fc7 100644 --- a/pkg/mongodb/README.md +++ b/pkg/mongodb/README.md @@ -13,24 +13,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/mongodb.png?branch=master)](https://travis-ci.org/php-enqueue/mongodb) [![Total Downloads](https://poser.pugx.org/enqueue/mongodb/d/total.png)](https://packagist.org/packages/enqueue/mongodb) [![Latest Stable Version](https://poser.pugx.org/enqueue/mongodb/version.png)](https://packagist.org/packages/enqueue/mongodb) - -This is an implementation of the queue specification. It allows you to use MongoDB database as a message broker. + +This is an implementation of the queue specification. It allows you to use MongoDB database as a message broker. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/mongodb/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/null/README.md b/pkg/null/README.md index 02eadb859..46a57b650 100644 --- a/pkg/null/README.md +++ b/pkg/null/README.md @@ -13,20 +13,20 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/null.png?branch=master)](https://travis-ci.org/php-enqueue/null) [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) - + This is an implementation of Queue Interop specification. It does not send messages any where and could be used as mock. Suitable in tests. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/null/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com diff --git a/pkg/pheanstalk/README.md b/pkg/pheanstalk/README.md index 009c13dfe..d7beebdf8 100644 --- a/pkg/pheanstalk/README.md +++ b/pkg/pheanstalk/README.md @@ -13,24 +13,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/pheanstalk.png?branch=master)](https://travis-ci.org/php-enqueue/pheanstalk) [![Total Downloads](https://poser.pugx.org/enqueue/pheanstalk/d/total.png)](https://packagist.org/packages/enqueue/pheanstalk) [![Latest Stable Version](https://poser.pugx.org/enqueue/pheanstalk/version.png)](https://packagist.org/packages/enqueue/pheanstalk) - -This is an implementation of the queue specification. It allows you to send and consume message from Beanstalkd broker. + +This is an implementation of the queue specification. It allows you to send and consume message from Beanstalkd broker. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/pheanstalk/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/rdkafka/README.md b/pkg/rdkafka/README.md index cb0f9c45b..1502f35c7 100644 --- a/pkg/rdkafka/README.md +++ b/pkg/rdkafka/README.md @@ -13,20 +13,20 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/rdkafka.png?branch=master)](https://travis-ci.org/php-enqueue/rdkafka) [![Total Downloads](https://poser.pugx.org/enqueue/rdkafka/d/total.png)](https://packagist.org/packages/enqueue/rdkafka) [![Latest Stable Version](https://poser.pugx.org/enqueue/rdkafka/version.png)](https://packagist.org/packages/enqueue/rdkafka) - -This is an implementation of Queue Interop specification. It allows you to send and consume message via Kafka protocol. + +This is an implementation of Queue Interop specification. It allows you to send and consume message via Kafka protocol. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/kafka/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com diff --git a/pkg/redis/README.md b/pkg/redis/README.md index 54ec9b588..0206e1e5b 100644 --- a/pkg/redis/README.md +++ b/pkg/redis/README.md @@ -13,24 +13,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/redis.png?branch=master)](https://travis-ci.org/php-enqueue/redis) [![Total Downloads](https://poser.pugx.org/enqueue/redis/d/total.png)](https://packagist.org/packages/enqueue/redis) [![Latest Stable Version](https://poser.pugx.org/enqueue/redis/version.png)](https://packagist.org/packages/enqueue/redis) - -This is an implementation of Queue Interop specification. It allows you to send and consume message with Redis store as a broker. + +This is an implementation of Queue Interop specification. It allows you to send and consume message with Redis store as a broker. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/redis/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/simple-client/README.md b/pkg/simple-client/README.md index ddc024f0f..0c4dc45ae 100644 --- a/pkg/simple-client/README.md +++ b/pkg/simple-client/README.md @@ -13,20 +13,20 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/simple-client.png?branch=master)](https://travis-ci.org/php-enqueue/simple-client) [![Total Downloads](https://poser.pugx.org/enqueue/simple-client/d/total.png)](https://packagist.org/packages/enqueue/simple-client) [![Latest Stable Version](https://poser.pugx.org/enqueue/simple-client/version.png)](https://packagist.org/packages/enqueue/simple-client) - -The simple client takes Enqueue client classes and Symfony components and combines it to easy to use facade called `SimpleClient`. + +The simple client takes Enqueue client classes and Symfony components and combines it to easy to use facade called `SimpleClient`. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.com/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com diff --git a/pkg/sns/README.md b/pkg/sns/README.md index bcec08c1e..62fa9986c 100644 --- a/pkg/sns/README.md +++ b/pkg/sns/README.md @@ -13,16 +13,16 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/sns.png?branch=master)](https://travis-ci.org/php-enqueue/sns) [![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns) [![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) - + This is an implementation of Queue Interop specification. It allows you to send and consume message using [Amazon SNS](https://aws.amazon.com/sns/) service. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/transport/sns.md) +* [Documentation](https://php-enqueue.github.io/transport/sns/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/snsqs/README.md b/pkg/snsqs/README.md index b944e6c7e..ec5151f01 100644 --- a/pkg/snsqs/README.md +++ b/pkg/snsqs/README.md @@ -13,16 +13,16 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/snsqs.png?branch=master)](https://travis-ci.org/php-enqueue/snsqs) [![Total Downloads](https://poser.pugx.org/enqueue/snsqs/d/total.png)](https://packagist.org/packages/enqueue/snsqs) [![Latest Stable Version](https://poser.pugx.org/enqueue/snsqs/version.png)](https://packagist.org/packages/enqueue/snsqs) - + This is an implementation of Queue Interop specification. It allows you to send and consume message using [Amazon SNS-SQS](https://aws.amazon.com/snsqs/) service. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/transport/snsqs.md) +* [Documentation](https://php-enqueue.github.io/transport/snsqs/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/sqs/README.md b/pkg/sqs/README.md index 1c7d7da08..bcc1e83ac 100644 --- a/pkg/sqs/README.md +++ b/pkg/sqs/README.md @@ -13,16 +13,16 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/sqs.png?branch=master)](https://travis-ci.org/php-enqueue/sqs) [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) - -This is an implementation of Queue Interop specification. It allows you to send and consume message using [Amazon SQS](https://aws.amazon.com/sqs/) service. + +This is an implementation of Queue Interop specification. It allows you to send and consume message using [Amazon SQS](https://aws.amazon.com/sqs/) service. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/transport/sqs.md) +* [Documentation](https://php-enqueue.github.io/transport/sqs/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/stomp/README.md b/pkg/stomp/README.md index bb868dbc3..5fbe0d19d 100644 --- a/pkg/stomp/README.md +++ b/pkg/stomp/README.md @@ -14,23 +14,23 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Total Downloads](https://poser.pugx.org/enqueue/stomp/d/total.png)](https://packagist.org/packages/enqueue/stomp) [![Latest Stable Version](https://poser.pugx.org/enqueue/stomp/version.png)](https://packagist.org/packages/enqueue/stomp) -This is an implementation of Queue Interop specification. It allows you to send and consume message via STOMP protocol. +This is an implementation of Queue Interop specification. It allows you to send and consume message via STOMP protocol. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/stomp/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/test/README.md b/pkg/test/README.md index b9bb44f4d..0695ba975 100644 --- a/pkg/test/README.md +++ b/pkg/test/README.md @@ -10,24 +10,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message Queue. Test utils [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) - -Contains stuff needed in tests. Shared among different packages. + +Contains stuff needed in tests. Shared among different packages. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.com/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). diff --git a/pkg/wamp/README.md b/pkg/wamp/README.md index aefcd6e12..22b32d4e2 100644 --- a/pkg/wamp/README.md +++ b/pkg/wamp/README.md @@ -13,24 +13,24 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Build Status](https://travis-ci.org/php-enqueue/wamp.png?branch=master)](https://travis-ci.org/php-enqueue/wamp) [![Total Downloads](https://poser.pugx.org/enqueue/wamp/d/total.png)](https://packagist.org/packages/enqueue/wamp) [![Latest Stable Version](https://poser.pugx.org/enqueue/wamp/version.png)](https://packagist.org/packages/enqueue/wamp) - -This is an implementation of [queue interop](https://github.com/queue-interop/queue-interop). It uses [Thruway](https://github.com/voryx/Thruway) internally. + +This is an implementation of [queue interop](https://github.com/queue-interop/queue-interop). It uses [Thruway](https://github.com/voryx/Thruway) internally. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md) +* [Documentation](https://php-enqueue.github.io/transport/wamp/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) ## Developed by Forma-Pro -Forma-Pro is a full stack development company which interests also spread to open source development. -Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. +Forma-Pro is a full stack development company which interests also spread to open source development. +Being a team of strong professionals we have an aim an ability to help community by developing cutting edge solutions in the areas of e-commerce, docker & microservice oriented architecture where we have accumulated a huge many-years experience. Our main specialization is Symfony framework based solution, but we are always looking to the technologies that allow us to do our job the best way. We are committed to creating solutions that revolutionize the way how things are developed in aspects of architecture & scalability. If you have any questions and inquires about our open source development, this product particularly or any other matter feel free to contact at opensource@forma-pro.com ## License -It is released under the [MIT License](LICENSE). \ No newline at end of file +It is released under the [MIT License](LICENSE). From 0353be1ea58e7fffdf0be76bfc764b82c6f13a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 27 May 2019 15:21:56 +0200 Subject: [PATCH 0645/1142] Add editor config settings for IDE's that support it see https://editorconfig.org/ --- .editorconfig | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..a19e39d81 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true + +[*.js] +indent_style = space +indent_size = 2 + +[*.php] +indent_style = space +indent_size = 4 + +[{package.json, *.yml}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false From 35efd3ee335e5ad6fa20f051d0e6b5fb8cebe674 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Mon, 27 May 2019 21:13:35 +0300 Subject: [PATCH 0646/1142] Create .stale.yml --- .stale.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .stale.yml diff --git a/.stale.yml b/.stale.yml new file mode 100644 index 000000000..9d23fb5a9 --- /dev/null +++ b/.stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 30 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false From e1e7d45ff14f88a346a44b0b00396224a06aa503 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Mon, 27 May 2019 21:14:43 +0300 Subject: [PATCH 0647/1142] Rename .stale.yml to stale.yml --- .stale.yml => stale.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .stale.yml => stale.yml (100%) diff --git a/.stale.yml b/stale.yml similarity index 100% rename from .stale.yml rename to stale.yml From 749a4c568f6aa040322f7830c1b76b8bfdbf21e7 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Mon, 27 May 2019 21:16:32 +0300 Subject: [PATCH 0648/1142] Delete stale.yml --- stale.yml | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 stale.yml diff --git a/stale.yml b/stale.yml deleted file mode 100644 index 9d23fb5a9..000000000 --- a/stale.yml +++ /dev/null @@ -1,17 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 30 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - pinned - - security -# Label to use when marking an issue as stale -staleLabel: wontfix -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false From e355dbaec39940905026388831974e97519bfea4 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 27 May 2019 21:20:21 +0300 Subject: [PATCH 0649/1142] add stale cfg --- .github/stale.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 000000000..9d23fb5a9 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 30 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false From 5dcf4bdeae7ae517c6764747c6d72257119518bd Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 28 May 2019 11:21:31 +0300 Subject: [PATCH 0650/1142] [docs] concepts --- docs/concepts.md | 100 +++++++++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/docs/concepts.md b/docs/concepts.md index e29778cdc..bdc70846b 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -2,68 +2,82 @@ If you are new to queuing system, there are some key concepts to understand to make the most of this lib. -## Messages and queues - -The queue is where messages are sent to for later processing. Once in the queue, they wait to be fetched, processed and removed from the queue. -A queue may provide the following features: -- *receive and delete delivery*: the queue deletes the message when it's fetched. If processing fails, then the message is lost and won't be processed again. This is called _at most once_ processing. -- *peek and lock delivery*: the queue locks for a short amount of time a message when it's fetched, making it invisible to other processes, in order to prevent duplicate processing. If there is no acknowledgment before the lock times out, failure is assumed and then the message is made visible again in the queue for another try. This is called _at least once_ processing. -- *delayed or scheduled messages*: messages are sent to the queue but won't be visible right away to processes to fetch them. You may need it to plan an action at a specific time. +The library consist of several components. The components could be used independently or as integral part. + +## Components + +### Transport + +The transport is the underlying vendor-specific library that provides the queuing features: a way for programs to create, send, read messages. +Based on [queue interop](https://github.com/queue-interop/queue-interop) interfaces. Use transport directly if you need full control or access to vendor specific features. + +The most famous transports are [RabbitMQ](transport/amqp_lib.md), [Amazon SQS](transport/sqs.md), [Redis](transport/redis.md), [Filesyste](transport/filesystem.md). + +- *connection factory* creates a connection to the vendor service with vendor-specific config. +- *context* provides the Producer, the Consumer and helps creates Messages. It is the most commonly used object and an implementation of [abstract factory](https://en.wikipedia.org/wiki/Abstract_factory_pattern) pattern. +- *destination* is a concept of a destination to which messages can be sent. Choose queue or topic. Destination represents broker state so expect to see same names at broker side. +- *queue* is a named destination to which messages can be sent. Messages accumulate on queues until they are retrieved by programs (called consumer) that service those queues. +- *topic* implements [publish and subscribe](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) semantics. When you publish a message it goes to all the subscribers who are interested - so zero to many subscribers will receive a copy of the message. Some brokers do not support Pub\Sub. +- *message* describes data sent to (or received from) a destination. It has body, headers, properties. +- *producer* sends a message to the destination. The producer implements vendor-specific logic and in charge of converting messages between Enqueue and vendor-specific message format. +- *consumer* fetches a message from a destination. The consumer implements vendor-specific logic and in charge of converting messages between vendor-specific message format and Enqueue. +- *subscription consumer* provides a way to consume messages from several destinations simultaneity. Some brokers do not support this feature. +- *processor* is an optional concept useful for sharing message processing logic. Vendor independent. Implements your business logic. + +Additional terms we might refer to: +- *receive and delete delivery*: the queue deletes the message when it's fetched by consumer. If processing fails, then the message is lost and won't be processed again. This is called _at most once_ processing. +- *peek and lock delivery*: the queue locks for a short amount of time a message when it's fetched by consumer, making it invisible to other consumers, in order to prevent duplicate processing and message lost. If there is no acknowledgment before the lock times out, failure is assumed and then the message is made visible again in the queue for another try. This is called _at least once_ processing. +- *an explicit acknowledgement*: the queue locks a message when it's fetched by consumer, making it invisible to other consumers, in order to prevent duplicate processing and message lost. If there is no explicit acknowledgment received before the connection is closed, failure is assumed and then the message is made visible again in the queue for another try. This is called _at least once_ processing. +- *message delivery delay*: messages are sent to the queue but won't be visible right away to consumers to fetch them. You may need it to plan an action at a specific time. +- *message expiration*: messages could be dropped of a queue within some period of time without processing. You may need it to not process stale messages. Some transports do not support the feature. +- *message priority*: message could be sent with higher priority, therefor being consumed faster. It violates first in first out concept and should be used with precautions. Some transports do not support the feature. - *first in first out*: messages are processed in the same order than they have entered the queue. -## Topic and subscription - -These are are advanced features: -- a message goes to a queue and is sent to multiple recipients -- a message is routing to different queues depending on some rules - -## Transport - -The transport is the underlying vendor-specific system providing the queue features: most famous ones are RabbitMQ, Amazon SQS, ... -Enqueue uses https://github.com/queue-interop/queue-interop PHP interfaces to provide a common way for programs to create, send, read messages in queues without worrying about vendor-specific internals. - -## Destination - -This is where a message goes, like a queue for a basic scenario but it may also be a topic or a command (understand a Symfony Console command). - -## Connection factory, Driver and Context - -The Connection factory creates a connection to the vendor service with vendor-specific config and theses are wrapped into a Context. -The Context will then provides the Producer, the Consumer and helps creates Messages. - -The Driver handles the routing of a Message. - -## Producer & Consumer - -The Producer sends the Message to the queue and the Consumer fetches Message from the queue. - -Both the Producer and the Consumer implement vendor-specific logic and are in charge to convert messages between Enqueue common standard and vendor-specific message format. - -## Processor - -It handles the processing of the Message once received. It implements your business logic. - -## Lifecycle +Lifecycle A queuing system is divided in two main parts: producing and consuming. - The [transport section of the Quick Start](quick_tour.md#transport) shows some code example for both parts. -### Producing part +Producing part 1. The application creates a Context with a Connection factory 2. The Context helps the application to create a Message 3. The application gets a Producer from the Context 4. The application uses the Producer to send the Message to the queue -### Consuming part +Consuming part 1. The application gets a Consumer from the Context 2. The Consumer receives Messages from the queue 3. The Consumer uses a Processor to process a Message 4. The Processor returns a status (like `Interop\Queue\Processor::ACK`) to the Consumer 5. The Consumer requeue or remove the Message from the queue depending on the Processor returned status +### Consumption + +The consumption component is based on top of transport. +The most important class is [QueueConsumer](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/QueueConsumer.php). +Could be used with any queue interop compatible transport. +It provides extension points which could be ad-hoc into processing flow. You can register [existing extensions](consumption/extensions.md) or write a custom one. + +### Client + +Enqueue Client is designed for as simple as possible developer experience. +It provides high-level, very opinionated API. +It manage all transport differences internally and even emulate missing features (like publish-subscribe). + +_*Note:* The client topic is NOT the same thing as transport one._ + +- *Topic:* Send a message to the topic when you want to notify several subscribers that something has happened. There is no way to get subscriber results. Uses the router internally to deliver messages. +- *Command:* guaranty that there is exactly one command processor\subscriber. Optionally, you can get a result. If there is not a command subscriber an exception is thrown. +- *Router:* copy a message sent to the topic and duplicate it for every subscriber and send. +- *Driver* contains vendor specific logic. +- *Producer* is responsible for sending messages to the topic or command. It has nothing to do with transport's producer. +- *Message* contains data to be sent. Please note that on consumer side you have to deal with transport message. +- *Consumption:* rely on consumption component. + ## How to use Enqueue? There are different ways to use Enqueue: both reduce the boiler plate code you have to write to start using the Enqueue feature. - as a [Client](client/quick_tour.md): relies on a [DSN](client/supported_brokers.md) to connect - as a [Symfony Bundle](bundle/index.md): recommended if you are using the Symfony framework + +[back to index](index.md) From 124679bba4b12237f2cd4c1d9f76458d15fd6147 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 28 May 2019 11:32:19 +0300 Subject: [PATCH 0651/1142] [docs] concepts. add note about difference between transport queue name and client --- docs/concepts.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/concepts.md b/docs/concepts.md index bdc70846b..1051a75c2 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -63,8 +63,7 @@ It provides extension points which could be ad-hoc into processing flow. You can Enqueue Client is designed for as simple as possible developer experience. It provides high-level, very opinionated API. It manage all transport differences internally and even emulate missing features (like publish-subscribe). - -_*Note:* The client topic is NOT the same thing as transport one._ +Please note: Client has own logic for naming transport destinations. Expect a different transport queue\topic name from the Client topic, command name. The prefix behavior could be disabled. - *Topic:* Send a message to the topic when you want to notify several subscribers that something has happened. There is no way to get subscriber results. Uses the router internally to deliver messages. - *Command:* guaranty that there is exactly one command processor\subscriber. Optionally, you can get a result. If there is not a command subscriber an exception is thrown. From 61390feeeaa74df95fd62e6ddeca72523cfb8cbe Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 28 May 2019 12:38:49 +0200 Subject: [PATCH 0652/1142] Update docs/concepts.md Co-Authored-By: Lctrs --- docs/concepts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts.md b/docs/concepts.md index 1051a75c2..d0f8f9e0c 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -11,7 +11,7 @@ The library consist of several components. The components could be used independ The transport is the underlying vendor-specific library that provides the queuing features: a way for programs to create, send, read messages. Based on [queue interop](https://github.com/queue-interop/queue-interop) interfaces. Use transport directly if you need full control or access to vendor specific features. -The most famous transports are [RabbitMQ](transport/amqp_lib.md), [Amazon SQS](transport/sqs.md), [Redis](transport/redis.md), [Filesyste](transport/filesystem.md). +The most famous transports are [RabbitMQ](transport/amqp_lib.md), [Amazon SQS](transport/sqs.md), [Redis](transport/redis.md), [Filesystem](transport/filesystem.md). - *connection factory* creates a connection to the vendor service with vendor-specific config. - *context* provides the Producer, the Consumer and helps creates Messages. It is the most commonly used object and an implementation of [abstract factory](https://en.wikipedia.org/wiki/Abstract_factory_pattern) pattern. From 74305e72b3d1b1c3d1d3926edd74b08a417c0d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Wed, 29 May 2019 17:08:39 +0200 Subject: [PATCH 0653/1142] Fix documentation links Whoops. --- pkg/amqp-tools/README.md | 2 +- pkg/async-command/README.md | 2 +- pkg/async-event-dispatcher/README.md | 2 +- pkg/enqueue-bundle/README.md | 2 +- pkg/enqueue/README.md | 2 +- pkg/job-queue/README.md | 2 +- pkg/simple-client/README.md | 2 +- pkg/test/README.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/amqp-tools/README.md b/pkg/amqp-tools/README.md index b4b7f2249..14f007cbb 100644 --- a/pkg/amqp-tools/README.md +++ b/pkg/amqp-tools/README.md @@ -20,7 +20,7 @@ The tools could be used with any [amqp interop](https://github.com/queue-interop ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://php-enqueue.github.com/) +* [Documentation](https://php-enqueue.github.io/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/pkg/async-command/README.md b/pkg/async-command/README.md index 7ac95ffcd..bd895676d 100644 --- a/pkg/async-command/README.md +++ b/pkg/async-command/README.md @@ -20,7 +20,7 @@ It allows to execute Symfony's command async by sending the request to message q ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://php-enqueue.github.com/) +* [Documentation](https://php-enqueue.github.io/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/pkg/async-event-dispatcher/README.md b/pkg/async-event-dispatcher/README.md index 7e7fdc056..93cee308e 100644 --- a/pkg/async-event-dispatcher/README.md +++ b/pkg/async-event-dispatcher/README.md @@ -20,7 +20,7 @@ It allows to processes events in background by sending them to MQ. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://php-enqueue.github.com/) +* [Documentation](https://php-enqueue.github.io/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/pkg/enqueue-bundle/README.md b/pkg/enqueue-bundle/README.md index 13c3c4065..54c242600 100644 --- a/pkg/enqueue-bundle/README.md +++ b/pkg/enqueue-bundle/README.md @@ -20,7 +20,7 @@ Integrates message queue components to Symfony application. * [Site](https://enqueue.forma-pro.com/) * [Quick tour](https://github.com/php-enqueue/enqueue-dev/blob/master/docs/bundle/quick_tour.md) -* [Documentation](https://php-enqueue.github.com/) +* [Documentation](https://php-enqueue.github.io/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/pkg/enqueue/README.md b/pkg/enqueue/README.md index a1e076e1c..2e5aa5a00 100644 --- a/pkg/enqueue/README.md +++ b/pkg/enqueue/README.md @@ -21,7 +21,7 @@ Read more about it in documentation. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://php-enqueue.github.com/) +* [Documentation](https://php-enqueue.github.io/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/pkg/job-queue/README.md b/pkg/job-queue/README.md index 1826ac5e2..e02a724aa 100644 --- a/pkg/job-queue/README.md +++ b/pkg/job-queue/README.md @@ -21,7 +21,7 @@ Read more about it in documentation ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://php-enqueue.github.com/) +* [Documentation](https://php-enqueue.github.io/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/pkg/simple-client/README.md b/pkg/simple-client/README.md index 0c4dc45ae..c9e0b4fa7 100644 --- a/pkg/simple-client/README.md +++ b/pkg/simple-client/README.md @@ -19,7 +19,7 @@ The simple client takes Enqueue client classes and Symfony components and combin ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://php-enqueue.github.com/) +* [Documentation](https://php-enqueue.github.io/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) diff --git a/pkg/test/README.md b/pkg/test/README.md index 0695ba975..a2411c1b3 100644 --- a/pkg/test/README.md +++ b/pkg/test/README.md @@ -16,7 +16,7 @@ Contains stuff needed in tests. Shared among different packages. ## Resources * [Site](https://enqueue.forma-pro.com/) -* [Documentation](https://php-enqueue.github.com/) +* [Documentation](https://php-enqueue.github.io/) * [Questions](https://gitter.im/php-enqueue/Lobby) * [Issue Tracker](https://github.com/php-enqueue/enqueue-dev/issues) From b6cd4b6bc2c30b39c5e127f81f204196ada00f3a Mon Sep 17 00:00:00 2001 From: SAMUEL NELA Date: Thu, 30 May 2019 18:35:09 +0200 Subject: [PATCH 0654/1142] Fixed quick tour link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 82b45a881..e73c0623f 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ Features: [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) * [the others are coming](https://github.com/php-enqueue/enqueue-dev/issues/284) -* [Symfony bundle](https://php-enqueue.github.io/symfony/quick_tour/) +* [Symfony bundle](https://php-enqueue.github.io/bundle/quick_tour/) * [Magento1 extension](https://php-enqueue.github.io/magento/quick_tour/) * [Magento2 module](https://php-enqueue.github.io/magento2/quick_tour/) * [Laravel extension](https://php-enqueue.github.io/laravel/quick_tour/) From f43cab21ae778e02e3d252b5aa3c6646099ed648 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Mon, 3 Jun 2019 14:38:16 +0300 Subject: [PATCH 0655/1142] Update ChainExtension.php --- pkg/enqueue/Consumption/ChainExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Consumption/ChainExtension.php b/pkg/enqueue/Consumption/ChainExtension.php index 6911b5b6b..e2c11a1f6 100644 --- a/pkg/enqueue/Consumption/ChainExtension.php +++ b/pkg/enqueue/Consumption/ChainExtension.php @@ -117,7 +117,7 @@ public function __construct(array $extensions) } if (false == $extensionValid) { - throw new \LogicException('Invalid extension given'); + throw new \LogicException(sprintf('Invalid extension given %s', get_class($extension))); } }); } From 8bbe923dbd417157d099a3b18dd4663e38505a1a Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Mon, 3 Jun 2019 14:38:39 +0300 Subject: [PATCH 0656/1142] Update ChainExtension.php --- pkg/enqueue/Client/ChainExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Client/ChainExtension.php b/pkg/enqueue/Client/ChainExtension.php index c5606cefe..d01da379f 100644 --- a/pkg/enqueue/Client/ChainExtension.php +++ b/pkg/enqueue/Client/ChainExtension.php @@ -67,7 +67,7 @@ public function __construct(array $extensions) } if (false == $extensionValid) { - throw new \LogicException('Invalid extension given'); + throw new \LogicException(sprintf('Invalid extension given %s', get_class($extension))); } }); } From 311a881350d75199a8c256e0d81b24e13ec6780b Mon Sep 17 00:00:00 2001 From: SAMUEL NELA Date: Wed, 5 Jun 2019 21:25:03 +0200 Subject: [PATCH 0657/1142] Fix link for cli commands --- docs/bundle/cli_commands.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/bundle/cli_commands.md b/docs/bundle/cli_commands.md index 59c12704d..65ed00825 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/bundle/cli_commands.md @@ -22,8 +22,7 @@ Other commands could be useful during debugging (like `enqueue:topics`) or deplo * [enqueue:consume](#enqueueconsume) * [enqueue:produce](#enqueueproduce) * [enqueue:setup-broker](#enqueuesetup-broker) -* [enqueue:queues](#enqueuequeues) -* [enqueue:topics](#enqueuetopics) +* [enqueue:routes](#enqueueroutes) * [enqueue:transport:consume](#enqueuetransportconsume) ## enqueue:consume From d8ccbe529dba600559e8087cab1bbdee75ac2ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Thu, 6 Jun 2019 20:45:17 +0200 Subject: [PATCH 0658/1142] Expand quick tour for Symfony Bundle According to comments in #884. --- docs/bundle/quick_tour.md | 46 +++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/docs/bundle/quick_tour.md b/docs/bundle/quick_tour.md index 08d22529a..4c54f262c 100644 --- a/docs/bundle/quick_tour.md +++ b/docs/bundle/quick_tour.md @@ -58,7 +58,14 @@ class Kernel extends BaseKernel ## Usage -First, you have to configure a transport layer and set one to be default. +First, you have to configure a transport layer. +You can optionally configure multiple transports if you want to. One of them will automatically become the default, +based on the following: +1. If there is a transport named `default`, then it will become the default. +2. First one specified otherwise. + +Default transport's services will be available to you in the usual Symfony container under their respective class +interfaces (see below) ```yaml # app/config/config.yml @@ -67,26 +74,47 @@ enqueue: default: transport: "amqp:" client: ~ + some_other_transport: + transport: "amqp:" + client: ~ ``` -Once you configured everything you can start producing messages: +Once you configured everything you can start producing messages. +As stated previously, default transport services are available in container. Here we are using `ProducerInterface` to +produce message to the `default` transport. ```php get(ProducerInterface::class); +// If you want a different producer than default (for example the other specified in sample above) then use +// $producer = $container->get('enqueue.client.some_other_transport.producer'); // send event to many consumers $producer->sendEvent('aFooTopic', 'Something has happened'); +// You can also pass an instance of Enqueue\Client\Message as second argument if you need more flexibility. +$properties = []; +$headers = []; +$message = new Message('Message body', $properties, $headers); +$producer->sendEvent('aBarTopic', $message); // send command to ONE consumer $producer->sendCommand('aProcessorName', 'Something has happened'); ``` -To consume messages you have to first create a message processor: +To consume messages you have to first create a message processor. + +Example below shows how to create a Processor that will receive messages from `aFooTopic` topic (and only that one). +It assumes that you're using default Symfony services configuration and this class is +[autoconfigured](https://symfony.com/doc/current/service_container.html#the-autoconfigure-option). Otherwise you'll +have to tag it manually. This is especially true if you're using multiple transports: if left autoconfigured, processor +will be attached to the default transport only. + +Note: Topic in enqueue and topic on some transports (for example Kafka) are two different things. ```php Date: Thu, 6 Jun 2019 21:32:28 +0200 Subject: [PATCH 0659/1142] Move "key concepts" to second position in menu. Fix typos. --- docs/concepts.md | 52 +++++++++++++++++++++++++++--------------------- docs/index.md | 2 +- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/docs/concepts.md b/docs/concepts.md index d0f8f9e0c..5ea14d244 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -1,3 +1,9 @@ +--- +layout: default +title: Key concepts +nav_order: 1 +--- + # Key concepts If you are new to queuing system, there are some key concepts to understand to make the most of this lib. @@ -9,28 +15,28 @@ The library consist of several components. The components could be used independ ### Transport The transport is the underlying vendor-specific library that provides the queuing features: a way for programs to create, send, read messages. -Based on [queue interop](https://github.com/queue-interop/queue-interop) interfaces. Use transport directly if you need full control or access to vendor specific features. +Based on [queue interop](https://github.com/queue-interop/queue-interop) interfaces. Use transport directly if you need full control or access to vendor specific features. The most famous transports are [RabbitMQ](transport/amqp_lib.md), [Amazon SQS](transport/sqs.md), [Redis](transport/redis.md), [Filesystem](transport/filesystem.md). - *connection factory* creates a connection to the vendor service with vendor-specific config. -- *context* provides the Producer, the Consumer and helps creates Messages. It is the most commonly used object and an implementation of [abstract factory](https://en.wikipedia.org/wiki/Abstract_factory_pattern) pattern. -- *destination* is a concept of a destination to which messages can be sent. Choose queue or topic. Destination represents broker state so expect to see same names at broker side. -- *queue* is a named destination to which messages can be sent. Messages accumulate on queues until they are retrieved by programs (called consumer) that service those queues. -- *topic* implements [publish and subscribe](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) semantics. When you publish a message it goes to all the subscribers who are interested - so zero to many subscribers will receive a copy of the message. Some brokers do not support Pub\Sub. -- *message* describes data sent to (or received from) a destination. It has body, headers, properties. -- *producer* sends a message to the destination. The producer implements vendor-specific logic and in charge of converting messages between Enqueue and vendor-specific message format. -- *consumer* fetches a message from a destination. The consumer implements vendor-specific logic and in charge of converting messages between vendor-specific message format and Enqueue. -- *subscription consumer* provides a way to consume messages from several destinations simultaneity. Some brokers do not support this feature. +- *context* provides the Producer, the Consumer and helps create Messages. It is the most commonly used object and an implementation of [abstract factory](https://en.wikipedia.org/wiki/Abstract_factory_pattern) pattern. +- *destination* is a concept of a destination to which messages can be sent. Choose queue or topic. Destination represents broker state so expect to see same names at broker side. +- *queue* is a named destination to which messages can be sent to. Messages accumulate on queues until they are retrieved by programs (called consumers) that service those queues. +- *topic* implements [publish and subscribe](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) semantics. When you publish a message it goes to all the subscribers that are interested - so zero to many subscribers will receive a copy of the message. Some brokers do not support Pub\Sub. +- *message* describes data sent to (or received from) a destination. It has a body, headers and properties. +- *producer* sends a message to the destination. The producer implements vendor-specific logic and is in charge of converting messages between Enqueue and vendor-specific message format. +- *consumer* fetches a message from a destination. The consumer implements vendor-specific logic and is in charge of converting messages between vendor-specific message format and Enqueue. +- *subscription consumer* provides a way to consume messages from several destinations simultaneously. Some brokers do not support this feature. - *processor* is an optional concept useful for sharing message processing logic. Vendor independent. Implements your business logic. -Additional terms we might refer to: +Additional terms we might refer to: - *receive and delete delivery*: the queue deletes the message when it's fetched by consumer. If processing fails, then the message is lost and won't be processed again. This is called _at most once_ processing. - *peek and lock delivery*: the queue locks for a short amount of time a message when it's fetched by consumer, making it invisible to other consumers, in order to prevent duplicate processing and message lost. If there is no acknowledgment before the lock times out, failure is assumed and then the message is made visible again in the queue for another try. This is called _at least once_ processing. - *an explicit acknowledgement*: the queue locks a message when it's fetched by consumer, making it invisible to other consumers, in order to prevent duplicate processing and message lost. If there is no explicit acknowledgment received before the connection is closed, failure is assumed and then the message is made visible again in the queue for another try. This is called _at least once_ processing. - *message delivery delay*: messages are sent to the queue but won't be visible right away to consumers to fetch them. You may need it to plan an action at a specific time. - *message expiration*: messages could be dropped of a queue within some period of time without processing. You may need it to not process stale messages. Some transports do not support the feature. -- *message priority*: message could be sent with higher priority, therefor being consumed faster. It violates first in first out concept and should be used with precautions. Some transports do not support the feature. +- *message priority*: message could be sent with higher priority, therefor being consumed faster. It violates first in first out concept and should be used with precautions. Some transports do not support the feature. - *first in first out*: messages are processed in the same order than they have entered the queue. Lifecycle @@ -49,29 +55,29 @@ Consuming part 2. The Consumer receives Messages from the queue 3. The Consumer uses a Processor to process a Message 4. The Processor returns a status (like `Interop\Queue\Processor::ACK`) to the Consumer -5. The Consumer requeue or remove the Message from the queue depending on the Processor returned status +5. The Consumer requeues or removes the Message from the queue depending on the Processor returned status ### Consumption -The consumption component is based on top of transport. +The consumption component is based on top of transport. The most important class is [QueueConsumer](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/QueueConsumer.php). -Could be used with any queue interop compatible transport. -It provides extension points which could be ad-hoc into processing flow. You can register [existing extensions](consumption/extensions.md) or write a custom one. +Could be used with any queue interop compatible transport. +It provides extension points which could be ad-hoc into processing flow. You can register [existing extensions](consumption/extensions.md) or write a custom one. ### Client -Enqueue Client is designed for as simple as possible developer experience. -It provides high-level, very opinionated API. -It manage all transport differences internally and even emulate missing features (like publish-subscribe). -Please note: Client has own logic for naming transport destinations. Expect a different transport queue\topic name from the Client topic, command name. The prefix behavior could be disabled. +Enqueue Client is designed for as simple as possible developer experience. +It provides high-level, very opinionated API. +It manages all transport differences internally and even emulate missing features (like publish-subscribe). +Please note: Client has own logic for naming transport destinations. Expect a different transport queue\topic name from the Client topic, command name. The prefix behavior could be disabled. - *Topic:* Send a message to the topic when you want to notify several subscribers that something has happened. There is no way to get subscriber results. Uses the router internally to deliver messages. -- *Command:* guaranty that there is exactly one command processor\subscriber. Optionally, you can get a result. If there is not a command subscriber an exception is thrown. +- *Command:* guarantees that there is exactly one command processor\subscriber. Optionally, you can get a result. If there is no command subscriber an exception is thrown. - *Router:* copy a message sent to the topic and duplicate it for every subscriber and send. -- *Driver* contains vendor specific logic. -- *Producer* is responsible for sending messages to the topic or command. It has nothing to do with transport's producer. +- *Driver* contains vendor specific logic. +- *Producer* is responsible for sending messages to the topic or command. It has nothing to do with transport's producer. - *Message* contains data to be sent. Please note that on consumer side you have to deal with transport message. -- *Consumption:* rely on consumption component. +- *Consumption:* rely on consumption component. ## How to use Enqueue? diff --git a/docs/index.md b/docs/index.md index 69e2f2007..06bc6b507 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,7 @@ layout: default title: Index -nav_order: 1 +nav_order: 0 ---

Supporting Enqueue

From 07b6a1b5be139a1ae1edd5b5747b84b8bbd6d813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 7 Jun 2019 02:32:02 +0200 Subject: [PATCH 0660/1142] Fix Code Style in all files --- pkg/amqp-lib/Tests/AmqpProducerTest.php | 16 +-- pkg/dbal/DbalConsumer.php | 4 +- pkg/dbal/DbalMessage.php | 2 +- pkg/dbal/Tests/DbalConsumerTest.php | 10 +- .../Tests/DbalSubscriptionConsumerTest.php | 2 +- .../DoctrineClearIdentityMapExtensionTest.php | 2 +- .../DoctrinePingConnectionExtensionTest.php | 20 ++-- pkg/enqueue/Client/Message.php | 4 +- .../Consumption/Context/MessageResult.php | 2 +- .../Tests/Client/DelegateProcessorTest.php | 4 +- .../Extension/PrepareBodyExtensionTest.php | 2 +- .../FallbackSubscriptionConsumerTest.php | 4 +- .../CalculateRootJobStatusProcessorTest.php | 6 +- .../CalculateRootJobStatusServiceTest.php | 40 +++---- .../Tests/DependentJobProcessorTest.php | 20 ++-- .../Tests/DependentJobServiceTest.php | 4 +- .../Tests/Doctrine/JobStorageTest.php | 108 +++++++++--------- pkg/job-queue/Tests/JobProcessorTest.php | 40 +++---- pkg/job-queue/Tests/JobRunnerTest.php | 46 ++++---- pkg/mongodb/Tests/MongodbConsumerTest.php | 2 +- .../Tests/MongodbSubscriptionConsumerTest.php | 2 +- .../Tests/RedisSubscriptionConsumerTest.php | 2 +- pkg/redis/Tests/Spec/JsonSerializerTest.php | 2 +- pkg/sns/Tests/SnsProducerTest.php | 6 +- pkg/sqs/Tests/SqsProducerTest.php | 8 +- pkg/wamp/Tests/Spec/JsonSerializerTest.php | 2 +- 26 files changed, 180 insertions(+), 180 deletions(-) diff --git a/pkg/amqp-lib/Tests/AmqpProducerTest.php b/pkg/amqp-lib/Tests/AmqpProducerTest.php index 44c68b757..59fc82155 100644 --- a/pkg/amqp-lib/Tests/AmqpProducerTest.php +++ b/pkg/amqp-lib/Tests/AmqpProducerTest.php @@ -61,9 +61,9 @@ public function testShouldPublishMessageToTopic() ->expects($this->once()) ->method('basic_publish') ->with($this->isInstanceOf(LibAMQPMessage::class), 'topic', 'routing-key') - ->will($this->returnCallback(function (LibAMQPMessage $message) use (&$amqpMessage) { + ->willReturnCallback(function (LibAMQPMessage $message) use (&$amqpMessage) { $amqpMessage = $message; - })) + }) ; $topic = new AmqpTopic('topic'); @@ -86,9 +86,9 @@ public function testShouldPublishMessageToQueue() ->expects($this->once()) ->method('basic_publish') ->with($this->isInstanceOf(LibAMQPMessage::class), $this->isEmpty(), 'queue') - ->will($this->returnCallback(function (LibAMQPMessage $message) use (&$amqpMessage) { + ->willReturnCallback(function (LibAMQPMessage $message) use (&$amqpMessage) { $amqpMessage = $message; - })) + }) ; $queue = new AmqpQueue('queue'); @@ -107,9 +107,9 @@ public function testShouldSetMessageHeaders() $channel ->expects($this->once()) ->method('basic_publish') - ->will($this->returnCallback(function (LibAMQPMessage $message) use (&$amqpMessage) { + ->willReturnCallback(function (LibAMQPMessage $message) use (&$amqpMessage) { $amqpMessage = $message; - })) + }) ; $producer = new AmqpProducer($channel, $this->createContextMock()); @@ -126,9 +126,9 @@ public function testShouldSetMessageProperties() $channel ->expects($this->once()) ->method('basic_publish') - ->will($this->returnCallback(function (LibAMQPMessage $message) use (&$amqpMessage) { + ->willReturnCallback(function (LibAMQPMessage $message) use (&$amqpMessage) { $amqpMessage = $message; - })) + }) ; $producer = new AmqpProducer($channel, $this->createContextMock()); diff --git a/pkg/dbal/DbalConsumer.php b/pkg/dbal/DbalConsumer.php index 9d99d5a58..98d348996 100644 --- a/pkg/dbal/DbalConsumer.php +++ b/pkg/dbal/DbalConsumer.php @@ -13,8 +13,8 @@ class DbalConsumer implements Consumer { - use ConsumerPollingTrait, - DbalConsumerHelperTrait; + use ConsumerPollingTrait; + use DbalConsumerHelperTrait; /** * @var DbalContext diff --git a/pkg/dbal/DbalMessage.php b/pkg/dbal/DbalMessage.php index af62c1079..dc5435b17 100644 --- a/pkg/dbal/DbalMessage.php +++ b/pkg/dbal/DbalMessage.php @@ -49,7 +49,7 @@ class DbalMessage implements Message private $timeToLive; /** - * @var null|string + * @var string|null */ private $deliveryId; diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index c042c5c86..cca4d2380 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -79,12 +79,12 @@ public function testShouldDeleteMessageOnAcknowledge() $context ->expects($this->once()) ->method('getDbalConnection') - ->will($this->returnValue($dbal)) + ->willReturn($dbal) ; $context ->expects($this->once()) ->method('getTableName') - ->will($this->returnValue('some-table-name')) + ->willReturn('some-table-name') ; $consumer = new DbalConsumer($context, $queue); @@ -150,12 +150,12 @@ public function testShouldDeleteMessageFromQueueOnReject() $context ->expects($this->once()) ->method('getDbalConnection') - ->will($this->returnValue($dbal)) + ->willReturn($dbal) ; $context ->expects($this->once()) ->method('getTableName') - ->will($this->returnValue('some-table-name')) + ->willReturn('some-table-name') ; $consumer = new DbalConsumer($context, $queue); @@ -182,7 +182,7 @@ public function testRejectShouldReSendMessageToSameQueueOnRequeue() $context ->expects($this->once()) ->method('createProducer') - ->will($this->returnValue($producerMock)) + ->willReturn($producerMock) ; $consumer = new DbalConsumer($context, $queue); diff --git a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php index 2d3a29d79..2f762c2eb 100644 --- a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php +++ b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php @@ -153,7 +153,7 @@ private function createDbalContextMock() } /** - * @param null|mixed $queueName + * @param mixed|null $queueName * * @return Consumer|\PHPUnit_Framework_MockObject_MockObject */ diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php index 518b40f2d..db3f28e00 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php @@ -32,7 +32,7 @@ public function testShouldClearIdentityMap() $registry ->expects($this->once()) ->method('getManagers') - ->will($this->returnValue(['manager-name' => $manager])) + ->willReturn(['manager-name' => $manager]) ; $context = $this->createContext(); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index d7f16dd57..e38c34d52 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -26,12 +26,12 @@ public function testShouldNotReconnectIfConnectionIsOK() $connection ->expects($this->once()) ->method('isConnected') - ->will($this->returnValue(true)) + ->willReturn(true) ; $connection ->expects($this->once()) ->method('ping') - ->will($this->returnValue(true)) + ->willReturn(true) ; $connection ->expects($this->never()) @@ -52,7 +52,7 @@ public function testShouldNotReconnectIfConnectionIsOK() $registry ->expects($this->once()) ->method('getConnections') - ->will($this->returnValue([$connection])) + ->willReturn([$connection]) ; $extension = new DoctrinePingConnectionExtension($registry); @@ -65,12 +65,12 @@ public function testShouldDoesReconnectIfConnectionFailed() $connection ->expects($this->once()) ->method('isConnected') - ->will($this->returnValue(true)) + ->willReturn(true) ; $connection ->expects($this->once()) ->method('ping') - ->will($this->returnValue(false)) + ->willReturn(false) ; $connection ->expects($this->once()) @@ -97,7 +97,7 @@ public function testShouldDoesReconnectIfConnectionFailed() $registry ->expects($this->once()) ->method('getConnections') - ->will($this->returnValue([$connection])) + ->willReturn([$connection]) ; $extension = new DoctrinePingConnectionExtension($registry); @@ -110,7 +110,7 @@ public function testShouldSkipIfConnectionWasNotOpened() $connection1 ->expects($this->once()) ->method('isConnected') - ->will($this->returnValue(false)) + ->willReturn(false) ; $connection1 ->expects($this->never()) @@ -122,12 +122,12 @@ public function testShouldSkipIfConnectionWasNotOpened() $connection2 ->expects($this->once()) ->method('isConnected') - ->will($this->returnValue(true)) + ->willReturn(true) ; $connection2 ->expects($this->once()) ->method('ping') - ->will($this->returnValue(true)) + ->willReturn(true) ; $context = $this->createContext(); @@ -140,7 +140,7 @@ public function testShouldSkipIfConnectionWasNotOpened() $registry ->expects($this->once()) ->method('getConnections') - ->will($this->returnValue([$connection1, $connection2])) + ->willReturn([$connection1, $connection2]) ; $extension = new DoctrinePingConnectionExtension($registry); diff --git a/pkg/enqueue/Client/Message.php b/pkg/enqueue/Client/Message.php index 6f1186dcc..b1cc9c27a 100644 --- a/pkg/enqueue/Client/Message.php +++ b/pkg/enqueue/Client/Message.php @@ -88,7 +88,7 @@ public function __construct($body = '', array $properties = [], array $headers = } /** - * @return null|string + * @return string|null */ public function getBody() { @@ -96,7 +96,7 @@ public function getBody() } /** - * @param null|string|int|float|array|\JsonSerializable $body + * @param string|int|float|array|\JsonSerializable|null $body */ public function setBody($body) { diff --git a/pkg/enqueue/Consumption/Context/MessageResult.php b/pkg/enqueue/Consumption/Context/MessageResult.php index 302899c9f..4fa8f7de0 100644 --- a/pkg/enqueue/Consumption/Context/MessageResult.php +++ b/pkg/enqueue/Consumption/Context/MessageResult.php @@ -76,7 +76,7 @@ public function getReceivedAt(): int } /** - * @return Result|null|object|string + * @return Result|object|string|null */ public function getResult() { diff --git a/pkg/enqueue/Tests/Client/DelegateProcessorTest.php b/pkg/enqueue/Tests/Client/DelegateProcessorTest.php index 5ed49d8bc..4fe6bd570 100644 --- a/pkg/enqueue/Tests/Client/DelegateProcessorTest.php +++ b/pkg/enqueue/Tests/Client/DelegateProcessorTest.php @@ -39,7 +39,7 @@ public function testShouldProcessMessage() ->expects($this->once()) ->method('process') ->with($this->identicalTo($message), $this->identicalTo($session)) - ->will($this->returnValue('return-value')) + ->willReturn('return-value') ; $processorRegistry = $this->createProcessorRegistryMock(); @@ -47,7 +47,7 @@ public function testShouldProcessMessage() ->expects($this->once()) ->method('get') ->with('processor-name') - ->will($this->returnValue($processor)) + ->willReturn($processor) ; $processor = new DelegateProcessor($processorRegistry); diff --git a/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php b/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php index 1b385c17a..454034abb 100644 --- a/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php +++ b/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php @@ -31,7 +31,7 @@ public function testCouldConstructedWithoutAnyArguments() * @dataProvider provideMessages * * @param mixed $body - * @param null|mixed $contentType + * @param mixed|null $contentType */ public function testShouldSendStringUnchangedAndAddPlainTextContentTypeIfEmpty( $body, diff --git a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php index 588237c92..dce6081ef 100644 --- a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php @@ -227,7 +227,7 @@ public function testShouldConsumeTillTimeoutIsReached() } /** - * @param null|mixed $body + * @param mixed|null $body * * @return InteropMessage|\PHPUnit_Framework_MockObject_MockObject */ @@ -244,7 +244,7 @@ private function createMessageStub($body = null) } /** - * @param null|mixed $queueName + * @param mixed|null $queueName * * @return Consumer|\PHPUnit_Framework_MockObject_MockObject */ diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php index fe260bad9..ff5e97c48 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php @@ -103,7 +103,7 @@ public function testShouldCallCalculateJobRootStatusAndACKMessage() ->expects($this->once()) ->method('findJobById') ->with('12345') - ->will($this->returnValue($job)) + ->willReturn($job) ; $logger = $this->createLoggerMock(); @@ -146,7 +146,7 @@ public function testShouldSendRootJobStoppedMessageIfJobHasStopped() ->expects($this->once()) ->method('findJobById') ->with('12345') - ->will($this->returnValue($job)) + ->willReturn($job) ; $logger = $this->createLoggerMock(); @@ -156,7 +156,7 @@ public function testShouldSendRootJobStoppedMessageIfJobHasStopped() ->expects($this->once()) ->method('calculate') ->with($this->identicalTo($job)) - ->will($this->returnValue(true)) + ->willReturn(true) ; $producer = $this->createProducerMock(); diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php index 01f0d10ce..bf16d81ff 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php @@ -60,9 +60,9 @@ public function testShouldCalculateRootJobStatus() $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); @@ -92,9 +92,9 @@ public function testShouldCalculateRootJobStatusAndSetStoppedAtTimeIfGotStopStat $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); @@ -120,9 +120,9 @@ public function testShouldSetStoppedAtOnlyIfWasNotSet() $em ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($em); @@ -146,9 +146,9 @@ public function testShouldThrowIfInvalidStatus() $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); @@ -179,9 +179,9 @@ public function testShouldSetStatusNewIfAllChildAreNew() $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); @@ -212,9 +212,9 @@ public function testShouldSetStatusRunningIfAnyOneIsRunning() $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); @@ -245,9 +245,9 @@ public function testShouldSetStatusRunningIfThereIsNoRunningButNewAndAnyOfStopSt $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); @@ -278,9 +278,9 @@ public function testShouldSetStatusCancelledIfAllIsStopButOneIsCancelled() $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); @@ -311,9 +311,9 @@ public function testShouldSetStatusFailedIfThereIsAnyOneIsFailedButIsNotCancelle $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); @@ -344,9 +344,9 @@ public function testShouldSetStatusSuccessIfAllAreSuccess() $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $case = new CalculateRootJobStatusService($storage); diff --git a/pkg/job-queue/Tests/DependentJobProcessorTest.php b/pkg/job-queue/Tests/DependentJobProcessorTest.php index 6ae4163f1..fe0980714 100644 --- a/pkg/job-queue/Tests/DependentJobProcessorTest.php +++ b/pkg/job-queue/Tests/DependentJobProcessorTest.php @@ -84,7 +84,7 @@ public function testShouldLogCriticalAndRejectMessageIfJobIsNotRoot() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -115,7 +115,7 @@ public function testShouldDoNothingIfDependentJobsAreMissing() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -151,7 +151,7 @@ public function testShouldLogCriticalAndRejectMessageIfDependentJobTopicIsMissin ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -194,7 +194,7 @@ public function testShouldLogCriticalAndRejectMessageIfDependentJobMessageIsMiss ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -239,7 +239,7 @@ public function testShouldPublishDependentMessage() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $expectedMessage = null; @@ -248,9 +248,9 @@ public function testShouldPublishDependentMessage() ->expects($this->once()) ->method('sendEvent') ->with('topic-name', $this->isInstanceOf(Message::class)) - ->will($this->returnCallback(function ($topic, Message $message) use (&$expectedMessage) { + ->willReturnCallback(function ($topic, Message $message) use (&$expectedMessage) { $expectedMessage = $message; - })) + }) ; $logger = $this->createLoggerMock(); @@ -287,7 +287,7 @@ public function testShouldPublishDependentMessageWithPriority() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $expectedMessage = null; @@ -296,9 +296,9 @@ public function testShouldPublishDependentMessageWithPriority() ->expects($this->once()) ->method('sendEvent') ->with('topic-name', $this->isInstanceOf(Message::class)) - ->will($this->returnCallback(function ($topic, Message $message) use (&$expectedMessage) { + ->willReturnCallback(function ($topic, Message $message) use (&$expectedMessage) { $expectedMessage = $message; - })) + }) ; $logger = $this->createLoggerMock(); diff --git a/pkg/job-queue/Tests/DependentJobServiceTest.php b/pkg/job-queue/Tests/DependentJobServiceTest.php index 7469b9fb8..ed0f79519 100644 --- a/pkg/job-queue/Tests/DependentJobServiceTest.php +++ b/pkg/job-queue/Tests/DependentJobServiceTest.php @@ -38,11 +38,11 @@ public function testShouldSaveDependentJobs() $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); return true; - })) + }) ; $context = new DependentJobContext($job); diff --git a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php index 97fbc750c..8344fd0b6 100644 --- a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php +++ b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php @@ -25,7 +25,7 @@ public function testShouldCreateJobObject() $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $em = $this->createEntityManagerMock(); @@ -33,12 +33,12 @@ public function testShouldCreateJobObject() ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -46,7 +46,7 @@ public function testShouldCreateJobObject() ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) @@ -65,7 +65,7 @@ public function testShouldResetManagerAndCreateJobObject() $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $em = $this->createEntityManagerMock(); @@ -73,12 +73,12 @@ public function testShouldResetManagerAndCreateJobObject() ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(false)) + ->willReturn(false) ; $doctrine = $this->createDoctrineMock(); @@ -86,12 +86,12 @@ public function testShouldResetManagerAndCreateJobObject() ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->any()) ->method('resetManager') - ->will($this->returnValue($em)) + ->willReturn($em) ; $storage = new JobStorage($doctrine, 'entity-class', 'unique_table'); @@ -106,7 +106,7 @@ public function testShouldThrowIfGotUnexpectedJobInstance() $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue('expected\class\name')) + ->willReturn('expected\class\name') ; $em = $this->createEntityManagerMock(); @@ -114,12 +114,12 @@ public function testShouldThrowIfGotUnexpectedJobInstance() ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -127,7 +127,7 @@ public function testShouldThrowIfGotUnexpectedJobInstance() ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) @@ -156,7 +156,7 @@ public function testShouldSaveJobWithoutLockIfThereIsNoCallbackAndChildJob() $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $em = $this->createEntityManagerMock(); @@ -164,7 +164,7 @@ public function testShouldSaveJobWithoutLockIfThereIsNoCallbackAndChildJob() ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->once()) @@ -182,7 +182,7 @@ public function testShouldSaveJobWithoutLockIfThereIsNoCallbackAndChildJob() $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -190,7 +190,7 @@ public function testShouldSaveJobWithoutLockIfThereIsNoCallbackAndChildJob() ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) @@ -210,7 +210,7 @@ public function testShouldSaveJobWithLockIfWithCallback() $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $em = $this->createEntityManagerMock(); @@ -218,7 +218,7 @@ public function testShouldSaveJobWithLockIfWithCallback() ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->never()) @@ -236,7 +236,7 @@ public function testShouldSaveJobWithLockIfWithCallback() $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -244,7 +244,7 @@ public function testShouldSaveJobWithLockIfWithCallback() ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) @@ -267,16 +267,16 @@ public function testShouldCatchUniqueConstraintViolationExceptionAndThrowDuplica $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $connection = $this->createConnectionMock(); $connection ->expects($this->once()) ->method('transactional') - ->will($this->returnCallback(function ($callback) use ($connection) { + ->willReturnCallback(function ($callback) use ($connection) { $callback($connection); - })) + }) ; $connection ->expects($this->once()) @@ -289,17 +289,17 @@ public function testShouldCatchUniqueConstraintViolationExceptionAndThrowDuplica ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->once()) ->method('getConnection') - ->will($this->returnValue($connection)) + ->willReturn($connection) ; $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -307,7 +307,7 @@ public function testShouldCatchUniqueConstraintViolationExceptionAndThrowDuplica ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) @@ -329,7 +329,7 @@ public function testShouldThrowIfTryToSaveNewEntityWithLock() $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $em = $this->createEntityManagerMock(); @@ -337,12 +337,12 @@ public function testShouldThrowIfTryToSaveNewEntityWithLock() ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -350,7 +350,7 @@ public function testShouldThrowIfTryToSaveNewEntityWithLock() ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) @@ -378,13 +378,13 @@ public function testShouldLockEntityAndPassNewInstanceIntoCallback() $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $repository ->expects($this->once()) ->method('find') ->with(12345, LockMode::PESSIMISTIC_WRITE) - ->will($this->returnValue($lockedJob)) + ->willReturn($lockedJob) ; $em = $this->createEntityManagerMock(); @@ -392,19 +392,19 @@ public function testShouldLockEntityAndPassNewInstanceIntoCallback() ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->once()) ->method('transactional') - ->will($this->returnCallback(function ($callback) use ($em) { + ->willReturnCallback(function ($callback) use ($em) { $callback($em); - })) + }) ; $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -412,7 +412,7 @@ public function testShouldLockEntityAndPassNewInstanceIntoCallback() ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) @@ -439,9 +439,9 @@ public function testShouldInsertIntoUniqueTableIfJobIsUniqueAndNew() $connection ->expects($this->once()) ->method('transactional') - ->will($this->returnCallback(function ($callback) use ($connection) { + ->willReturnCallback(function ($callback) use ($connection) { $callback($connection); - })) + }) ; $connection ->expects($this->at(0)) @@ -458,7 +458,7 @@ public function testShouldInsertIntoUniqueTableIfJobIsUniqueAndNew() $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $em = $this->createEntityManagerMock(); @@ -466,12 +466,12 @@ public function testShouldInsertIntoUniqueTableIfJobIsUniqueAndNew() ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->once()) ->method('getConnection') - ->will($this->returnValue($connection)) + ->willReturn($connection) ; $em ->expects($this->once()) @@ -484,7 +484,7 @@ public function testShouldInsertIntoUniqueTableIfJobIsUniqueAndNew() $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -492,7 +492,7 @@ public function testShouldInsertIntoUniqueTableIfJobIsUniqueAndNew() ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) @@ -528,12 +528,12 @@ public function testShouldDeleteRecordFromUniqueTableIfJobIsUniqueAndStoppedAtIs $repository ->expects($this->once()) ->method('getClassName') - ->will($this->returnValue(Job::class)) + ->willReturn(Job::class) ; $repository ->expects($this->once()) ->method('find') - ->will($this->returnValue($job)) + ->willReturn($job) ; $em = $this->createEntityManagerMock(); @@ -541,24 +541,24 @@ public function testShouldDeleteRecordFromUniqueTableIfJobIsUniqueAndStoppedAtIs ->expects($this->once()) ->method('getRepository') ->with('entity-class') - ->will($this->returnValue($repository)) + ->willReturn($repository) ; $em ->expects($this->once()) ->method('transactional') - ->will($this->returnCallback(function ($callback) use ($em) { + ->willReturnCallback(function ($callback) use ($em) { $callback($em); - })) + }) ; $em ->expects($this->exactly(2)) ->method('getConnection') - ->will($this->returnValue($connection)) + ->willReturn($connection) ; $em ->expects($this->any()) ->method('isOpen') - ->will($this->returnValue(true)) + ->willReturn(true) ; $doctrine = $this->createDoctrineMock(); @@ -566,7 +566,7 @@ public function testShouldDeleteRecordFromUniqueTableIfJobIsUniqueAndStoppedAtIs ->expects($this->once()) ->method('getManagerForClass') ->with('entity-class') - ->will($this->returnValue($em)) + ->willReturn($em) ; $doctrine ->expects($this->never()) diff --git a/pkg/job-queue/Tests/JobProcessorTest.php b/pkg/job-queue/Tests/JobProcessorTest.php index 5ee8159a1..b91a23a97 100644 --- a/pkg/job-queue/Tests/JobProcessorTest.php +++ b/pkg/job-queue/Tests/JobProcessorTest.php @@ -43,7 +43,7 @@ public function testShouldCreateRootJobAndReturnIt() $storage ->expects($this->once()) ->method('createJob') - ->will($this->returnValue($job)) + ->willReturn($job) ; $storage ->expects($this->once()) @@ -72,7 +72,7 @@ public function testShouldCatchDuplicateJobAndTryToFindJobByOwnerId() $storage ->expects($this->once()) ->method('createJob') - ->will($this->returnValue($job)) + ->willReturn($job) ; $storage ->expects($this->once()) @@ -84,7 +84,7 @@ public function testShouldCatchDuplicateJobAndTryToFindJobByOwnerId() ->expects($this->once()) ->method('findRootJobByOwnerIdAndJobName') ->with('owner-id', 'job-name') - ->will($this->returnValue($job)) + ->willReturn($job) ; $processor = new JobProcessor($storage, $this->createProducerMock()); @@ -121,13 +121,13 @@ public function testCreateChildJobShouldFindAndReturnAlreadyCreatedJob() ->expects($this->once()) ->method('findChildJobByName') ->with('job-name', $this->identicalTo($job)) - ->will($this->returnValue($job)) + ->willReturn($job) ; $storage ->expects($this->once()) ->method('findJobById') ->with(123) - ->will($this->returnValue($job)) + ->willReturn($job) ; $processor = new JobProcessor($storage, $this->createProducerMock()); @@ -146,7 +146,7 @@ public function testCreateChildJobShouldCreateAndSaveJobAndPublishRecalculateRoo $storage ->expects($this->once()) ->method('createJob') - ->will($this->returnValue($job)) + ->willReturn($job) ; $storage ->expects($this->once()) @@ -157,13 +157,13 @@ public function testCreateChildJobShouldCreateAndSaveJobAndPublishRecalculateRoo ->expects($this->once()) ->method('findChildJobByName') ->with('job-name', $this->identicalTo($job)) - ->will($this->returnValue(null)) + ->willReturn(null) ; $storage ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -210,7 +210,7 @@ public function testStartChildJobShouldThrowIfJobHasNotNewStatus() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $processor = new JobProcessor($storage, $this->createProducerMock()); @@ -240,7 +240,7 @@ public function testStartJobShouldUpdateJobWithRunningStatusAndStartAtTime() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -280,7 +280,7 @@ public function testSuccessChildJobShouldThrowIfJobHasNotRunningStatus() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $processor = new JobProcessor($storage, $this->createProducerMock()); @@ -310,7 +310,7 @@ public function testSuccessJobShouldUpdateJobWithSuccessStatusAndStopAtTime() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -350,7 +350,7 @@ public function testFailChildJobShouldThrowIfJobHasNotRunningStatus() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $processor = new JobProcessor($storage, $this->createProducerMock()); @@ -380,7 +380,7 @@ public function testFailJobShouldUpdateJobWithFailStatusAndStopAtTime() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -420,7 +420,7 @@ public function testCancelChildJobShouldThrowIfJobHasNotNewOrRunningStatus() ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $processor = new JobProcessor($storage, $this->createProducerMock()); @@ -450,7 +450,7 @@ public function testCancelJobShouldUpdateJobWithCancelStatusAndStoppedAtTimeAndS ->expects($this->once()) ->method('findJobById') ->with(12345) - ->will($this->returnValue($job)) + ->willReturn($job) ; $producer = $this->createProducerMock(); @@ -505,9 +505,9 @@ public function testInterruptRootJobShouldUpdateJobAndSetInterruptedTrue() $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $processor = new JobProcessor($storage, $this->createProducerMock()); @@ -526,9 +526,9 @@ public function testInterruptRootJobShouldUpdateJobAndSetInterruptedTrueAndStopp $storage ->expects($this->once()) ->method('saveJob') - ->will($this->returnCallback(function (Job $job, $callback) { + ->willReturnCallback(function (Job $job, $callback) { $callback($job); - })) + }) ; $processor = new JobProcessor($storage, $this->createProducerMock()); diff --git a/pkg/job-queue/Tests/JobRunnerTest.php b/pkg/job-queue/Tests/JobRunnerTest.php index 07961b35f..aa7a7f49e 100644 --- a/pkg/job-queue/Tests/JobRunnerTest.php +++ b/pkg/job-queue/Tests/JobRunnerTest.php @@ -19,13 +19,13 @@ public function testRunUniqueShouldCreateRootAndChildJobAndCallCallback() ->expects($this->once()) ->method('findOrCreateRootJob') ->with('owner-id', 'job-name', true) - ->will($this->returnValue($root)) + ->willReturn($root) ; $jobProcessor ->expects($this->once()) ->method('findOrCreateChildJob') ->with('job-name') - ->will($this->returnValue($child)) + ->willReturn($child) ; $expChild = null; @@ -57,12 +57,12 @@ public function testRunUniqueShouldStartChildJobIfNotStarted() $jobProcessor ->expects($this->once()) ->method('findOrCreateRootJob') - ->will($this->returnValue($root)) + ->willReturn($root) ; $jobProcessor ->expects($this->once()) ->method('findOrCreateChildJob') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->once()) @@ -85,12 +85,12 @@ public function testRunUniqueShouldNotStartChildJobIfAlreadyStarted() $jobProcessor ->expects($this->once()) ->method('findOrCreateRootJob') - ->will($this->returnValue($root)) + ->willReturn($root) ; $jobProcessor ->expects($this->once()) ->method('findOrCreateChildJob') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->never()) @@ -111,12 +111,12 @@ public function testRunUniqueShouldSuccessJobIfCallbackReturnValueIsTrue() $jobProcessor ->expects($this->once()) ->method('findOrCreateRootJob') - ->will($this->returnValue($root)) + ->willReturn($root) ; $jobProcessor ->expects($this->once()) ->method('findOrCreateChildJob') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->once()) @@ -142,12 +142,12 @@ public function testRunUniqueShouldFailJobIfCallbackReturnValueIsFalse() $jobProcessor ->expects($this->once()) ->method('findOrCreateRootJob') - ->will($this->returnValue($root)) + ->willReturn($root) ; $jobProcessor ->expects($this->once()) ->method('findOrCreateChildJob') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->never()) @@ -173,12 +173,12 @@ public function testRunUniqueShouldFailJobIfCallbackThrowsException() $jobProcessor ->expects($this->once()) ->method('findOrCreateRootJob') - ->will($this->returnValue($root)) + ->willReturn($root) ; $jobProcessor ->expects($this->once()) ->method('findOrCreateChildJob') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->never()) @@ -205,12 +205,12 @@ public function testRunUniqueShouldThrowOrphanJobExceptionIfChildCleanupFails() $jobProcessor ->expects($this->once()) ->method('findOrCreateRootJob') - ->will($this->returnValue($root)) + ->willReturn($root) ; $jobProcessor ->expects($this->once()) ->method('findOrCreateChildJob') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->never()) @@ -239,12 +239,12 @@ public function testRunUniqueShouldNotSuccessJobIfJobIsAlreadyStopped() $jobProcessor ->expects($this->once()) ->method('findOrCreateRootJob') - ->will($this->returnValue($root)) + ->willReturn($root) ; $jobProcessor ->expects($this->once()) ->method('findOrCreateChildJob') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->never()) @@ -271,7 +271,7 @@ public function testCreateDelayedShouldCreateChildJobAndCallCallback() ->expects($this->once()) ->method('findOrCreateChildJob') ->with('job-name', $this->identicalTo($root)) - ->will($this->returnValue($child)) + ->willReturn($child) ; $expRunner = null; @@ -296,7 +296,7 @@ public function testRunDelayedShouldThrowExceptionIfJobWasNotFoundById() ->expects($this->once()) ->method('findJobById') ->with('job-id') - ->will($this->returnValue(null)) + ->willReturn(null) ; $jobRunner = new JobRunner($jobProcessor); @@ -318,7 +318,7 @@ public function testRunDelayedShouldFindJobAndCallCallback() ->expects($this->once()) ->method('findJobById') ->with('job-id') - ->will($this->returnValue($child)) + ->willReturn($child) ; $expRunner = null; @@ -348,7 +348,7 @@ public function testRunDelayedShouldCancelJobIfRootJobIsInterrupted() ->expects($this->once()) ->method('findJobById') ->with('job-id') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->once()) @@ -373,7 +373,7 @@ public function testRunDelayedShouldSuccessJobIfCallbackReturnValueIsTrue() ->expects($this->once()) ->method('findJobById') ->with('job-id') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->once()) @@ -402,7 +402,7 @@ public function testRunDelayedShouldFailJobIfCallbackReturnValueIsFalse() ->expects($this->once()) ->method('findJobById') ->with('job-id') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->never()) @@ -432,7 +432,7 @@ public function testRunDelayedShouldNotSuccessJobIfAlreadyStopped() ->expects($this->once()) ->method('findJobById') ->with('job-id') - ->will($this->returnValue($child)) + ->willReturn($child) ; $jobProcessor ->expects($this->never()) diff --git a/pkg/mongodb/Tests/MongodbConsumerTest.php b/pkg/mongodb/Tests/MongodbConsumerTest.php index e41681256..b1b98e0cd 100644 --- a/pkg/mongodb/Tests/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbConsumerTest.php @@ -104,7 +104,7 @@ public function testRejectShouldReSendMessageToSameQueueOnRequeue() $context ->expects($this->once()) ->method('createProducer') - ->will($this->returnValue($producerMock)) + ->willReturn($producerMock) ; $consumer = new MongodbConsumer($context, $queue); diff --git a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php index 88899c7bb..a7d1d8d8a 100644 --- a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php @@ -153,7 +153,7 @@ private function createMongodbContextMock() } /** - * @param null|mixed $queueName + * @param mixed|null $queueName * * @return Consumer|\PHPUnit_Framework_MockObject_MockObject */ diff --git a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php index 12c377500..3698ad2ea 100644 --- a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php +++ b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php @@ -150,7 +150,7 @@ private function createRedisContextMock() } /** - * @param null|mixed $queueName + * @param mixed|null $queueName * * @return Consumer|\PHPUnit_Framework_MockObject_MockObject */ diff --git a/pkg/redis/Tests/Spec/JsonSerializerTest.php b/pkg/redis/Tests/Spec/JsonSerializerTest.php index fd244b17c..7516090a9 100644 --- a/pkg/redis/Tests/Spec/JsonSerializerTest.php +++ b/pkg/redis/Tests/Spec/JsonSerializerTest.php @@ -40,7 +40,7 @@ public function testThrowIfFailedToEncodeMessageToJson() { $serializer = new JsonSerializer(); - $resource = fopen(__FILE__, 'rb'); + $resource = fopen(__FILE__, 'r'); //guard $this->assertInternalType('resource', $resource); diff --git a/pkg/sns/Tests/SnsProducerTest.php b/pkg/sns/Tests/SnsProducerTest.php index 4850b5c1d..647988b70 100644 --- a/pkg/sns/Tests/SnsProducerTest.php +++ b/pkg/sns/Tests/SnsProducerTest.php @@ -72,7 +72,7 @@ public function testShouldThrowIfPublishFailed() $context ->expects($this->once()) ->method('getSnsClient') - ->will($this->returnValue($client)) + ->willReturn($client) ; $message = new SnsMessage('foo'); @@ -117,7 +117,7 @@ public function testShouldPublish() $context ->expects($this->once()) ->method('getSnsClient') - ->will($this->returnValue($client)) + ->willReturn($client) ; $message = new SnsMessage('theBody', ['key' => 'value'], ['hkey' => 'hvaleu']); @@ -137,7 +137,7 @@ public function testShouldPublishWithMergedAttributes() $context ->expects($this->once()) ->method('getSnsClient') - ->will($this->returnValue($client)); + ->willReturn($client); $expectedArgument = [ 'Message' => 'message', diff --git a/pkg/sqs/Tests/SqsProducerTest.php b/pkg/sqs/Tests/SqsProducerTest.php index a33b98f76..54729adbd 100644 --- a/pkg/sqs/Tests/SqsProducerTest.php +++ b/pkg/sqs/Tests/SqsProducerTest.php @@ -69,7 +69,7 @@ public function testShouldThrowIfSendMessageFailed() $context ->expects($this->once()) ->method('getSqsClient') - ->will($this->returnValue($client)) + ->willReturn($client) ; $destination = new SqsDestination('queue-name'); @@ -116,7 +116,7 @@ public function testShouldSendMessage() $context ->expects($this->once()) ->method('getSqsClient') - ->will($this->returnValue($client)) + ->willReturn($client) ; $destination = new SqsDestination('queue-name'); @@ -160,7 +160,7 @@ public function testShouldSendMessageWithCustomRegion() $context ->expects($this->once()) ->method('getSqsClient') - ->will($this->returnValue($client)) + ->willReturn($client) ; $destination = new SqsDestination('queue-name'); @@ -206,7 +206,7 @@ public function testShouldSendDelayedMessage() $context ->expects($this->once()) ->method('getSqsClient') - ->will($this->returnValue($client)) + ->willReturn($client) ; $destination = new SqsDestination('queue-name'); diff --git a/pkg/wamp/Tests/Spec/JsonSerializerTest.php b/pkg/wamp/Tests/Spec/JsonSerializerTest.php index 4bc49c599..1e7e29413 100644 --- a/pkg/wamp/Tests/Spec/JsonSerializerTest.php +++ b/pkg/wamp/Tests/Spec/JsonSerializerTest.php @@ -40,7 +40,7 @@ public function testThrowIfFailedToEncodeMessageToJson() { $serializer = new JsonSerializer(); - $resource = fopen(__FILE__, 'rb'); + $resource = fopen(__FILE__, 'r'); //guard $this->assertInternalType('resource', $resource); From b0f9101b37daa61782f7e67afca7fd8adb5014be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 7 Jun 2019 02:40:15 +0200 Subject: [PATCH 0661/1142] Allow reading headers from Kafka Message headers A simpler part of #843, adds just the consumption part. This makes headers accessible in the consumer in case another application makes use of those, be it PHP or not. --- pkg/rdkafka/RdKafkaConsumer.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index d7016a946..241ee3841 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -169,6 +169,12 @@ private function doReceive(int $timeout): ?RdKafkaMessage $message->setPartition($kafkaMessage->partition); $message->setKafkaMessage($kafkaMessage); + // Merge headers passed from Kafka with possible earlier serialized payload headers. Prefer Kafka's. + // Note: Requires phprdkafka >= 3.1.0 + if (isset($kafkaMessage->headers)) { + $message->setHeaders(array_merge($message->getHeaders(), $kafkaMessage->headers)); + } + return $message; default: throw new \LogicException($kafkaMessage->errstr(), $kafkaMessage->err); From 4403014fa55149cb636386dddff2b6f203dea1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 7 Jun 2019 03:05:16 +0200 Subject: [PATCH 0662/1142] Move support note to an external include file --- docs/_includes/support.md | 8 ++++++++ docs/async_event_dispatcher/quick_tour.md | 9 +-------- docs/bundle/async_commands.md | 9 +-------- docs/bundle/async_events.md | 9 +-------- docs/bundle/cli_commands.md | 9 +-------- docs/bundle/config_reference.md | 9 +-------- docs/bundle/consumption_extension.md | 9 +-------- docs/bundle/debugging.md | 9 +-------- docs/bundle/functional_testing.md | 9 +-------- docs/bundle/job_queue.md | 9 +-------- docs/bundle/message_processor.md | 9 +-------- docs/bundle/message_producer.md | 9 +-------- docs/bundle/production_settings.md | 9 +-------- docs/bundle/quick_tour.md | 9 +-------- docs/client/extensions.md | 9 +-------- docs/client/message_bus.md | 9 +-------- docs/client/message_examples.md | 9 +-------- docs/client/quick_tour.md | 9 +-------- docs/client/rpc_call.md | 9 +-------- docs/client/supported_brokers.md | 9 +-------- docs/consumption/extensions.md | 9 +-------- docs/consumption/message_processor.md | 9 +-------- docs/contribution.md | 9 +-------- .../symfony/how-to-change-consume-command-logger.md | 9 +-------- docs/dsn.md | 9 +-------- docs/elastica-bundle/overview.md | 9 +-------- docs/index.md | 9 +-------- docs/job_queue/run_sub_job.md | 9 +-------- docs/job_queue/run_unique_job.md | 9 +-------- docs/laravel/queues.md | 9 +-------- docs/laravel/quick_tour.md | 9 +-------- docs/magento/cli_commands.md | 9 +-------- docs/magento/quick_tour.md | 9 +-------- docs/magento2/cli_commands.md | 9 +-------- docs/magento2/quick_tour.md | 9 +-------- docs/messages.md | 9 +-------- docs/monitoring.md | 9 +-------- docs/monolog/send-messages-to-mq.md | 9 +-------- docs/quick_tour.md | 9 +-------- docs/transport/amqp.md | 9 +-------- docs/transport/amqp_bunny.md | 9 +-------- docs/transport/amqp_lib.md | 9 +-------- docs/transport/dbal.md | 9 +-------- docs/transport/filesystem.md | 9 +-------- docs/transport/gearman.md | 9 +-------- docs/transport/gps.md | 9 +-------- docs/transport/kafka.md | 8 +------- docs/transport/mongodb.md | 9 +-------- docs/transport/null.md | 9 +-------- docs/transport/pheanstalk.md | 9 +-------- docs/transport/redis.md | 9 +-------- docs/transport/sns.md | 9 +-------- docs/transport/snsqs.md | 9 +-------- docs/transport/sqs.md | 9 +-------- docs/transport/stomp.md | 9 +-------- docs/transport/wamp.md | 9 +-------- docs/yii/amqp_driver.md | 9 +-------- 57 files changed, 64 insertions(+), 447 deletions(-) create mode 100644 docs/_includes/support.md diff --git a/docs/_includes/support.md b/docs/_includes/support.md new file mode 100644 index 000000000..98bc48700 --- /dev/null +++ b/docs/_includes/support.md @@ -0,0 +1,8 @@ +

Supporting Enqueue

+ +Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: + +- [Become a sponsor](https://www.patreon.com/makasim) +- [Become our client](http://forma-pro.com/) + +--- diff --git a/docs/async_event_dispatcher/quick_tour.md b/docs/async_event_dispatcher/quick_tour.md index 7f3fc6a78..c9eb0e0a9 100644 --- a/docs/async_event_dispatcher/quick_tour.md +++ b/docs/async_event_dispatcher/quick_tour.md @@ -2,14 +2,7 @@ layout: default nav_exclude: true --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Async event dispatcher (Symfony) diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md index 3e5cb7e87..c82024110 100644 --- a/docs/bundle/async_commands.md +++ b/docs/bundle/async_commands.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Async commands nav_order: 7 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Async commands diff --git a/docs/bundle/async_events.md b/docs/bundle/async_events.md index 7cad12448..7264f5f20 100644 --- a/docs/bundle/async_events.md +++ b/docs/bundle/async_events.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Async events nav_order: 6 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Async events diff --git a/docs/bundle/cli_commands.md b/docs/bundle/cli_commands.md index 65ed00825..3033c41a2 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/bundle/cli_commands.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: CLI commands nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Cli commands diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index 61cb81c34..edbd917f2 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Config reference nav_order: 2 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Config reference diff --git a/docs/bundle/consumption_extension.md b/docs/bundle/consumption_extension.md index 52d82711f..cad372103 100644 --- a/docs/bundle/consumption_extension.md +++ b/docs/bundle/consumption_extension.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Consumption extension nav_order: 9 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Consumption extension diff --git a/docs/bundle/debugging.md b/docs/bundle/debugging.md index 7084ddcf0..6ae79b3a0 100644 --- a/docs/bundle/debugging.md +++ b/docs/bundle/debugging.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Debugging nav_order: 11 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Debugging diff --git a/docs/bundle/functional_testing.md b/docs/bundle/functional_testing.md index f8a28f690..7e81f8eaa 100644 --- a/docs/bundle/functional_testing.md +++ b/docs/bundle/functional_testing.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Functional testing nav_order: 12 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Functional testing diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index 3cdfc89fa..eb1e25281 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Job queue nav_order: 8 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Jobs diff --git a/docs/bundle/message_processor.md b/docs/bundle/message_processor.md index 4c623ed19..7d10c837d 100644 --- a/docs/bundle/message_processor.md +++ b/docs/bundle/message_processor.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Message processor nav_order: 5 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Message processor diff --git a/docs/bundle/message_producer.md b/docs/bundle/message_producer.md index dd36e49b5..a4448bd7e 100644 --- a/docs/bundle/message_producer.md +++ b/docs/bundle/message_producer.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Message producer nav_order: 4 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Message producer diff --git a/docs/bundle/production_settings.md b/docs/bundle/production_settings.md index 820e561c2..7f07abed9 100644 --- a/docs/bundle/production_settings.md +++ b/docs/bundle/production_settings.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Production settings nav_order: 10 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Production settings diff --git a/docs/bundle/quick_tour.md b/docs/bundle/quick_tour.md index 08d22529a..e56b9b370 100644 --- a/docs/bundle/quick_tour.md +++ b/docs/bundle/quick_tour.md @@ -4,14 +4,7 @@ parent: "Symfony bundle" title: Quick tour nav_order: 1 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # EnqueueBundle. Quick tour. diff --git a/docs/client/extensions.md b/docs/client/extensions.md index 4bef0739c..d70921cc1 100644 --- a/docs/client/extensions.md +++ b/docs/client/extensions.md @@ -4,14 +4,7 @@ parent: Client title: Extensions nav_order: 6 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Client extensions. diff --git a/docs/client/message_bus.md b/docs/client/message_bus.md index 24a9087fa..0a5a3aa1c 100644 --- a/docs/client/message_bus.md +++ b/docs/client/message_bus.md @@ -4,14 +4,7 @@ parent: Client title: Message bus nav_order: 4 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Client. Message bus diff --git a/docs/client/message_examples.md b/docs/client/message_examples.md index 8b195a591..30efda7d1 100644 --- a/docs/client/message_examples.md +++ b/docs/client/message_examples.md @@ -4,14 +4,7 @@ parent: Client title: Message examples nav_order: 2 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Client. Message examples diff --git a/docs/client/quick_tour.md b/docs/client/quick_tour.md index 07647f91e..84d6986e8 100644 --- a/docs/client/quick_tour.md +++ b/docs/client/quick_tour.md @@ -4,14 +4,7 @@ parent: Client title: Quick tour nav_order: 1 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Simple client. Quick tour. diff --git a/docs/client/rpc_call.md b/docs/client/rpc_call.md index 44982ecf1..ff07c6dbe 100644 --- a/docs/client/rpc_call.md +++ b/docs/client/rpc_call.md @@ -4,14 +4,7 @@ parent: Client title: RPC call nav_order: 5 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Client. RPC call diff --git a/docs/client/supported_brokers.md b/docs/client/supported_brokers.md index b090787be..d6b065ccf 100644 --- a/docs/client/supported_brokers.md +++ b/docs/client/supported_brokers.md @@ -4,14 +4,7 @@ parent: Client title: Supported brokers nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Client. Supported brokers diff --git a/docs/consumption/extensions.md b/docs/consumption/extensions.md index d2018fbd5..58ea0402a 100644 --- a/docs/consumption/extensions.md +++ b/docs/consumption/extensions.md @@ -3,14 +3,7 @@ layout: default parent: Consumption title: Extensions --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Consumption extensions. diff --git a/docs/consumption/message_processor.md b/docs/consumption/message_processor.md index 6cc5ecb86..07d01cdae 100644 --- a/docs/consumption/message_processor.md +++ b/docs/consumption/message_processor.md @@ -3,14 +3,7 @@ layout: default parent: Consumption title: Message processors --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Message processor diff --git a/docs/contribution.md b/docs/contribution.md index 34d6324ec..ec381ee8a 100644 --- a/docs/contribution.md +++ b/docs/contribution.md @@ -4,14 +4,7 @@ title: Contribution nav_order: 99 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Contribution diff --git a/docs/cookbook/symfony/how-to-change-consume-command-logger.md b/docs/cookbook/symfony/how-to-change-consume-command-logger.md index 8d518bb2a..c2c281753 100644 --- a/docs/cookbook/symfony/how-to-change-consume-command-logger.md +++ b/docs/cookbook/symfony/how-to-change-consume-command-logger.md @@ -2,14 +2,7 @@ layout: default nav_exclude: true --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # How to change consume command logger diff --git a/docs/dsn.md b/docs/dsn.md index 5062ce03c..bd6cf2c0c 100644 --- a/docs/dsn.md +++ b/docs/dsn.md @@ -3,14 +3,7 @@ layout: default title: DSN Parser nav_order: 92 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} ## DSN Parser. diff --git a/docs/elastica-bundle/overview.md b/docs/elastica-bundle/overview.md index a8a711d16..22702a813 100644 --- a/docs/elastica-bundle/overview.md +++ b/docs/elastica-bundle/overview.md @@ -3,14 +3,7 @@ layout: default title: Elastica bundle nav_order: 4 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Enqueue Elastica Bundle diff --git a/docs/index.md b/docs/index.md index 69e2f2007..123fed696 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,14 +7,7 @@ title: Index nav_order: 1 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} ## Documentation. diff --git a/docs/job_queue/run_sub_job.md b/docs/job_queue/run_sub_job.md index 88397a580..98f2938b3 100644 --- a/docs/job_queue/run_sub_job.md +++ b/docs/job_queue/run_sub_job.md @@ -4,14 +4,7 @@ parent: Job Queue title: Run sub job nav_order: 2 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} ## Job queue. Run sub job diff --git a/docs/job_queue/run_unique_job.md b/docs/job_queue/run_unique_job.md index 1dc9937dd..c6869ece4 100644 --- a/docs/job_queue/run_unique_job.md +++ b/docs/job_queue/run_unique_job.md @@ -4,14 +4,7 @@ parent: Job Queue title: Run unique job nav_order: 1 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} ## Job queue. Run unique job diff --git a/docs/laravel/queues.md b/docs/laravel/queues.md index 1aca7a0dd..8a6df4566 100644 --- a/docs/laravel/queues.md +++ b/docs/laravel/queues.md @@ -4,14 +4,7 @@ parent: Laravel title: Queues nav_order: 2 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Laravel Queue. Quick tour. diff --git a/docs/laravel/quick_tour.md b/docs/laravel/quick_tour.md index 848424a25..c57ad9e7d 100644 --- a/docs/laravel/quick_tour.md +++ b/docs/laravel/quick_tour.md @@ -4,14 +4,7 @@ parent: Laravel title: Quick tour nav_order: 1 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Laravel Queue. Quick tour. diff --git a/docs/magento/cli_commands.md b/docs/magento/cli_commands.md index 2cc0c847d..4829b31b5 100644 --- a/docs/magento/cli_commands.md +++ b/docs/magento/cli_commands.md @@ -4,14 +4,7 @@ parent: Magento title: CLI commands nav_order: 2 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Magento. Cli commands diff --git a/docs/magento/quick_tour.md b/docs/magento/quick_tour.md index df14f2350..95a013a43 100644 --- a/docs/magento/quick_tour.md +++ b/docs/magento/quick_tour.md @@ -4,14 +4,7 @@ parent: Magento title: Quick tour nav_order: 1 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Magento Enqueue. Quick tour diff --git a/docs/magento2/cli_commands.md b/docs/magento2/cli_commands.md index 9931b0b1f..3f72093b9 100644 --- a/docs/magento2/cli_commands.md +++ b/docs/magento2/cli_commands.md @@ -4,14 +4,7 @@ parent: Magento 2 title: CLI commands nav_order: 2 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Magento2. Cli commands diff --git a/docs/magento2/quick_tour.md b/docs/magento2/quick_tour.md index 4c2957702..a14836b33 100644 --- a/docs/magento2/quick_tour.md +++ b/docs/magento2/quick_tour.md @@ -4,14 +4,7 @@ parent: Magento 2 title: Quick tour nav_order: 1 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Magento2 EnqueueModule diff --git a/docs/messages.md b/docs/messages.md index 42be99361..362991ba8 100644 --- a/docs/messages.md +++ b/docs/messages.md @@ -3,14 +3,7 @@ layout: default title: Messages nav_order: 90 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} ## Pull request to readonly repo. diff --git a/docs/monitoring.md b/docs/monitoring.md index f053c8c15..ae5c3b402 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -4,14 +4,7 @@ title: Monitoring nav_order: 95 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Monitoring. diff --git a/docs/monolog/send-messages-to-mq.md b/docs/monolog/send-messages-to-mq.md index 19af115e6..dbcb90eb5 100644 --- a/docs/monolog/send-messages-to-mq.md +++ b/docs/monolog/send-messages-to-mq.md @@ -2,14 +2,7 @@ layout: default nav_exclude: true --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Enqueue Monolog Handlers diff --git a/docs/quick_tour.md b/docs/quick_tour.md index 546a2f242..4e6bfccec 100644 --- a/docs/quick_tour.md +++ b/docs/quick_tour.md @@ -3,14 +3,7 @@ layout: default title: Quick tour nav_order: 2 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Quick tour diff --git a/docs/transport/amqp.md b/docs/transport/amqp.md index e93f377d6..ab22ed044 100644 --- a/docs/transport/amqp.md +++ b/docs/transport/amqp.md @@ -4,14 +4,7 @@ title: AMQP parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # AMQP transport diff --git a/docs/transport/amqp_bunny.md b/docs/transport/amqp_bunny.md index c5b6162f9..066a023cd 100644 --- a/docs/transport/amqp_bunny.md +++ b/docs/transport/amqp_bunny.md @@ -4,14 +4,7 @@ title: AMQP Bunny parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # AMQP transport diff --git a/docs/transport/amqp_lib.md b/docs/transport/amqp_lib.md index bdab29d47..ab0418e73 100644 --- a/docs/transport/amqp_lib.md +++ b/docs/transport/amqp_lib.md @@ -4,14 +4,7 @@ title: AMQP Lib parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # AMQP transport diff --git a/docs/transport/dbal.md b/docs/transport/dbal.md index 58f827dfd..ab1107b60 100644 --- a/docs/transport/dbal.md +++ b/docs/transport/dbal.md @@ -4,14 +4,7 @@ title: DBAL parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Doctrine DBAL transport diff --git a/docs/transport/filesystem.md b/docs/transport/filesystem.md index b6d27f81b..768ee50b7 100644 --- a/docs/transport/filesystem.md +++ b/docs/transport/filesystem.md @@ -4,14 +4,7 @@ title: Filesystem parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Filesystem transport diff --git a/docs/transport/gearman.md b/docs/transport/gearman.md index e6343c0ee..8ed6da021 100644 --- a/docs/transport/gearman.md +++ b/docs/transport/gearman.md @@ -4,14 +4,7 @@ title: Gearman parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Gearman transport diff --git a/docs/transport/gps.md b/docs/transport/gps.md index 6338fde59..b56f5c949 100644 --- a/docs/transport/gps.md +++ b/docs/transport/gps.md @@ -4,14 +4,7 @@ title: GPS parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Google Pub Sub transport diff --git a/docs/transport/kafka.md b/docs/transport/kafka.md index f35982992..1009034ba 100644 --- a/docs/transport/kafka.md +++ b/docs/transport/kafka.md @@ -4,14 +4,8 @@ title: Kafka parent: Transports nav_order: 3 --- -

Supporting Enqueue

-Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Kafka transport diff --git a/docs/transport/mongodb.md b/docs/transport/mongodb.md index 6ff46ca65..9e97872aa 100644 --- a/docs/transport/mongodb.md +++ b/docs/transport/mongodb.md @@ -4,14 +4,7 @@ title: MongoDB parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Enqueue Mongodb message queue transport diff --git a/docs/transport/null.md b/docs/transport/null.md index cfbdb97a2..aa77b5e72 100644 --- a/docs/transport/null.md +++ b/docs/transport/null.md @@ -4,14 +4,7 @@ title: "Null" parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # NULL transport diff --git a/docs/transport/pheanstalk.md b/docs/transport/pheanstalk.md index 7e9b1a0fd..9d3af572b 100644 --- a/docs/transport/pheanstalk.md +++ b/docs/transport/pheanstalk.md @@ -4,14 +4,7 @@ title: Pheanstalk parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Beanstalk (Pheanstalk) transport diff --git a/docs/transport/redis.md b/docs/transport/redis.md index 717916364..c357fd083 100644 --- a/docs/transport/redis.md +++ b/docs/transport/redis.md @@ -4,14 +4,7 @@ title: Redis parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Redis transport diff --git a/docs/transport/sns.md b/docs/transport/sns.md index 8c367aef9..41e2ad04c 100644 --- a/docs/transport/sns.md +++ b/docs/transport/sns.md @@ -4,14 +4,7 @@ title: Amazon SNS parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Amazon SNS transport diff --git a/docs/transport/snsqs.md b/docs/transport/snsqs.md index e87979ef2..86d929f4e 100644 --- a/docs/transport/snsqs.md +++ b/docs/transport/snsqs.md @@ -4,14 +4,7 @@ title: Amazon SNS-SQS parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Amazon SNS-SQS transport diff --git a/docs/transport/sqs.md b/docs/transport/sqs.md index dc464df94..3ead089e8 100644 --- a/docs/transport/sqs.md +++ b/docs/transport/sqs.md @@ -4,14 +4,7 @@ title: Amazon SQS parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Amazon SQS transport diff --git a/docs/transport/stomp.md b/docs/transport/stomp.md index 1c8617914..053765d67 100644 --- a/docs/transport/stomp.md +++ b/docs/transport/stomp.md @@ -4,14 +4,7 @@ title: STOMP parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # STOMP transport diff --git a/docs/transport/wamp.md b/docs/transport/wamp.md index 742d52370..aeb757035 100644 --- a/docs/transport/wamp.md +++ b/docs/transport/wamp.md @@ -4,14 +4,7 @@ title: WAMP parent: Transports nav_order: 3 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Web Application Messaging Protocol (WAMP) Transport diff --git a/docs/yii/amqp_driver.md b/docs/yii/amqp_driver.md index 3dc17f055..49798b331 100644 --- a/docs/yii/amqp_driver.md +++ b/docs/yii/amqp_driver.md @@ -4,14 +4,7 @@ parent: Yii title: AMQP Interop driver nav_order: 1 --- -

Supporting Enqueue

- -Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: - -- [Become a sponsor](https://www.patreon.com/makasim) -- [Become our client](http://forma-pro.com/) - ---- +{% include support.md %} # Yii2Queue. AMQP Interop driver From e37dac6f8724f4a6a01fda9856986d5268f694a9 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Sat, 8 Jun 2019 19:10:41 +0300 Subject: [PATCH 0663/1142] Update support.md --- docs/_includes/support.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/_includes/support.md b/docs/_includes/support.md index 98bc48700..3f8cf322a 100644 --- a/docs/_includes/support.md +++ b/docs/_includes/support.md @@ -2,7 +2,6 @@ Enqueue is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider: -- [Become a sponsor](https://www.patreon.com/makasim) - [Become our client](http://forma-pro.com/) --- From a1e72e2a41748e086eb60e3ab3fc55278a479d6b Mon Sep 17 00:00:00 2001 From: "linh.nguyen.duy" Date: Mon, 10 Jun 2019 07:11:29 +0700 Subject: [PATCH 0664/1142] Cast int for redelivery_delay and polling_interval --- pkg/dbal/DbalContext.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index f6119481c..c775efc02 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -113,11 +113,11 @@ public function createConsumer(Destination $destination): Consumer $consumer = new DbalConsumer($this, $destination); if (isset($this->config['polling_interval'])) { - $consumer->setPollingInterval($this->config['polling_interval']); + $consumer->setPollingInterval((int) $this->config['polling_interval']); } if (isset($this->config['redelivery_delay'])) { - $consumer->setRedeliveryDelay($this->config['redelivery_delay']); + $consumer->setRedeliveryDelay((int) $this->config['redelivery_delay']); } return $consumer; From 9d5acc09e8a72f70cf8d7cce88a886f0584aaa4e Mon Sep 17 00:00:00 2001 From: Xavier Coureau Date: Thu, 13 Jun 2019 13:42:17 +0200 Subject: [PATCH 0665/1142] Updates dependencies requirements --- pkg/sns/composer.json | 2 +- pkg/snsqs/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index ab76fb4a6..81dab9e24 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", "aws/aws-sdk-php": "~3.26" }, diff --git a/pkg/snsqs/composer.json b/pkg/snsqs/composer.json index 9e291bc9f..05eda07bd 100644 --- a/pkg/snsqs/composer.json +++ b/pkg/snsqs/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7", + "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", "enqueue/sns": "^0.9", "enqueue/sqs": "^0.9" From 8fae557807737d300abd4194632263c47486966c Mon Sep 17 00:00:00 2001 From: Ben Davies Date: Fri, 14 Jun 2019 12:53:44 +0100 Subject: [PATCH 0666/1142] deserialize sqs message attributes --- pkg/sqs/SqsConsumer.php | 4 ++++ pkg/sqs/SqsMessage.php | 21 +++++++++++++++++++++ pkg/sqs/Tests/SqsConsumerTest.php | 11 ++++++++++- pkg/sqs/Tests/SqsMessageTest.php | 15 +++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index 4b89eb7ff..aa91f3df3 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -188,6 +188,10 @@ protected function convertMessage(array $sqsMessage): SqsMessage $message->setBody($sqsMessage['Body']); $message->setReceiptHandle($sqsMessage['ReceiptHandle']); + if (isset($sqsMessage['Attributes'])) { + $message->setAttributes($sqsMessage['Attributes']); + } + if (isset($sqsMessage['Attributes']['ApproximateReceiveCount'])) { $message->setRedelivered(((int) $sqsMessage['Attributes']['ApproximateReceiveCount']) > 1); } diff --git a/pkg/sqs/SqsMessage.php b/pkg/sqs/SqsMessage.php index 3b0f46bd9..cd2b1bdfe 100644 --- a/pkg/sqs/SqsMessage.php +++ b/pkg/sqs/SqsMessage.php @@ -23,6 +23,11 @@ class SqsMessage implements Message */ private $headers; + /** + * @var array + */ + private $attributes; + /** * @var bool */ @@ -58,6 +63,7 @@ public function __construct(string $body = '', array $properties = [], array $he $this->body = $body; $this->properties = $properties; $this->headers = $headers; + $this->attributes = []; $this->redelivered = false; $this->delaySeconds = 0; $this->requeueVisibilityTimeout = 0; @@ -113,6 +119,21 @@ public function getHeader(string $name, $default = null) return array_key_exists($name, $this->headers) ? $this->headers[$name] : $default; } + public function setAttributes(array $attributes): void + { + $this->attributes = $attributes; + } + + public function getAttributes(): array + { + return $this->attributes; + } + + public function getAttribute(string $name, $default = null) + { + return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default; + } + public function isRedelivered(): bool { return $this->redelivered; diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index ea5c557b5..9fdded9e2 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -294,7 +294,10 @@ public function testShouldReceiveMessage() 'Body' => 'The Body', 'ReceiptHandle' => 'The Receipt', 'Attributes' => [ - 'ApproximateReceiveCount' => 3, + 'SenderId' => 'AROAX5IAWYILCTYIS3OZ5:foo@bar.com', + 'ApproximateFirstReceiveTimestamp' => '1560512269481', + 'ApproximateReceiveCount' => '3', + 'SentTimestamp' => '1560512260079', ], 'MessageAttributes' => [ 'Headers' => [ @@ -336,6 +339,12 @@ public function testShouldReceiveMessage() $this->assertEquals('The Body', $result->getBody()); $this->assertEquals(['hkey' => 'hvalue'], $result->getHeaders()); $this->assertEquals(['key' => 'value'], $result->getProperties()); + $this->assertEquals([ + 'SenderId' => 'AROAX5IAWYILCTYIS3OZ5:foo@bar.com', + 'ApproximateFirstReceiveTimestamp' => '1560512269481', + 'ApproximateReceiveCount' => '3', + 'SentTimestamp' => '1560512260079', + ], $result->getAttributes()); $this->assertTrue($result->isRedelivered()); $this->assertEquals('The Receipt', $result->getReceiptHandle()); } diff --git a/pkg/sqs/Tests/SqsMessageTest.php b/pkg/sqs/Tests/SqsMessageTest.php index a6d4e25fb..5da37b531 100644 --- a/pkg/sqs/Tests/SqsMessageTest.php +++ b/pkg/sqs/Tests/SqsMessageTest.php @@ -16,6 +16,7 @@ public function testCouldBeConstructedWithoutArguments() $this->assertSame('', $message->getBody()); $this->assertSame([], $message->getProperties()); $this->assertSame([], $message->getHeaders()); + $this->assertSame([], $message->getAttributes()); } public function testCouldBeConstructedWithOptionalArguments() @@ -90,4 +91,18 @@ public function testShouldAllowGetReceiptHandle() $this->assertSame('theId', $message->getReceiptHandle()); } + + public function testShouldAllowSettingAndGettingAttributes() + { + $message = new SqsMessage(); + $message->setAttributes($attributes = [ + 'SenderId' => 'AROAX5IAWYILCTYIS3OZ5:foo@bar.com', + 'ApproximateFirstReceiveTimestamp' => '1560512269481', + 'ApproximateReceiveCount' => '2', + 'SentTimestamp' => '1560512260079', + ]); + + $this->assertSame($attributes, $message->getAttributes()); + $this->assertSame($attributes['SenderId'], $message->getAttribute('SenderId')); + } } From 2fe7b9f3a3d52e46aa7e0bccdd6e2a7095b97f91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Sat, 1 Jun 2019 14:58:01 +0200 Subject: [PATCH 0667/1142] Add runnable commands to compose.json --- composer.json | 5 +++++ docs/contribution.md | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/composer.json b/composer.json index 04213c776..c238f3148 100644 --- a/composer.json +++ b/composer.json @@ -3,6 +3,11 @@ "type": "project", "minimum-stability": "beta", "homepage": "https://enqueue.forma-pro.com/", + "scripts": { + "cs-fix": "bin/php-cs-fixer fix --config=.php_cs.php", + "cs-lint": "bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff", + "phpstan": "bin/phpstan analyse --memory-limit=512M -c phpstan.neon" + }, "require": { "php": "^7.1.3", diff --git a/docs/contribution.md b/docs/contribution.md index ec381ee8a..455f6950e 100644 --- a/docs/contribution.md +++ b/docs/contribution.md @@ -21,6 +21,12 @@ composer install Once you did it you can work on a feature or bug fix. +If you need, you can also use composer scripts to run code linting and static analysis: +* For code style linting, run `composer run cs-lint`. Optionally add file names: +`composer run cs-lint pkg/null/NullTopic.php` for example. +* You can also fix your code style with `composer run cs-fix`. +* Static code analysis can be run using `composer run phpstan`. As above, you can pass specific files. + ## Testing To run tests From 2b51c7e0a8797bd7c6c712d20d57e30d62a3cefc Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Fri, 21 Jun 2019 08:27:36 +0200 Subject: [PATCH 0668/1142] Adding generic driver for schema SNS --- pkg/enqueue/Client/Resources.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/enqueue/Client/Resources.php b/pkg/enqueue/Client/Resources.php index 1207b64f8..6ea5988a1 100644 --- a/pkg/enqueue/Client/Resources.php +++ b/pkg/enqueue/Client/Resources.php @@ -93,6 +93,12 @@ public static function getKnownDrivers(): array 'requiredSchemeExtensions' => [], 'packages' => ['enqueue/enqueue', 'enqueue/sqs'], ]; + $map[] = [ + 'schemes' => ['sns'], + 'driverClass' => GenericDriver::class, + 'requiredSchemeExtensions' => [], + 'packages' => ['enqueue/enqueue', 'enqueue/sns'], + ]; $map[] = [ 'schemes' => ['snsqs'], 'driverClass' => SnsQsDriver::class, From 648001dd7b0c91ffc26c287981b62bbd0ebeb721 Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Tue, 25 Jun 2019 16:01:42 +0100 Subject: [PATCH 0669/1142] SNS Fix: Missing throw issue --- pkg/sns/SnsProducer.php | 8 +++++- pkg/sns/Tests/SnsProducerTest.php | 45 +++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/pkg/sns/SnsProducer.php b/pkg/sns/SnsProducer.php index 7f440c77b..d4eba04d0 100644 --- a/pkg/sns/SnsProducer.php +++ b/pkg/sns/SnsProducer.php @@ -87,6 +87,8 @@ public function send(Destination $destination, Message $message): void } /** + * @throws DeliveryDelayNotSupportedException + * * @return SnsProducer */ public function setDeliveryDelay(int $deliveryDelay = null): Producer @@ -95,7 +97,7 @@ public function setDeliveryDelay(int $deliveryDelay = null): Producer return $this; } - DeliveryDelayNotSupportedException::providerDoestNotSupportIt(); + throw DeliveryDelayNotSupportedException::providerDoestNotSupportIt(); } public function getDeliveryDelay(): ?int @@ -104,6 +106,8 @@ public function getDeliveryDelay(): ?int } /** + * @throws PriorityNotSupportedException + * * @return SnsProducer */ public function setPriority(int $priority = null): Producer @@ -121,6 +125,8 @@ public function getPriority(): ?int } /** + * @throws TimeToLiveNotSupportedException + * * @return SnsProducer */ public function setTimeToLive(int $timeToLive = null): Producer diff --git a/pkg/sns/Tests/SnsProducerTest.php b/pkg/sns/Tests/SnsProducerTest.php index 647988b70..62f8ae4cf 100644 --- a/pkg/sns/Tests/SnsProducerTest.php +++ b/pkg/sns/Tests/SnsProducerTest.php @@ -10,8 +10,11 @@ use Enqueue\Sns\SnsProducer; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Destination; +use Interop\Queue\Exception\DeliveryDelayNotSupportedException; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; +use Interop\Queue\Exception\PriorityNotSupportedException; +use Interop\Queue\Exception\TimeToLiveNotSupportedException; use Interop\Queue\Producer; use PHPUnit\Framework\TestCase; @@ -84,6 +87,48 @@ public function testShouldThrowIfPublishFailed() $producer->send($destination, $message); } + public function testShouldThrowIfsetTimeToLiveIsNotNull() + { + $this->expectException(TimeToLiveNotSupportedException::class); + + $producer = new SnsProducer($this->createSnsContextMock()); + $result = $producer->setTimeToLive(); + + $this->assertInstanceOf(SnsProducer::class, $result); + + $this->expectExceptionMessage('The provider does not support time to live feature'); + + $producer->setTimeToLive(200); + } + + public function testShouldThrowIfsetPriorityIsNotNull() + { + $this->expectException(PriorityNotSupportedException::class); + + $producer = new SnsProducer($this->createSnsContextMock()); + $result = $producer->setPriority(); + + $this->assertInstanceOf(SnsProducer::class, $result); + + $this->expectExceptionMessage('The provider does not support priority feature'); + + $producer->setPriority(200); + } + + public function testShouldThrowIfsetDeliveryDelayIsNotNull() + { + $this->expectException(DeliveryDelayNotSupportedException::class); + + $producer = new SnsProducer($this->createSnsContextMock()); + $result = $producer->setDeliveryDelay(); + + $this->assertInstanceOf(SnsProducer::class, $result); + + $this->expectExceptionMessage('The provider does not support delivery delay feature'); + + $producer->setDeliveryDelay(200); + } + public function testShouldPublish() { $destination = new SnsDestination('queue-name'); From 9b497ccd07e4da51da98ac6df7b1ce5f35138ecc Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Tue, 25 Jun 2019 16:51:32 +0100 Subject: [PATCH 0670/1142] SNSQS Fix issue with delay --- pkg/snsqs/SnsQsProducer.php | 15 ++- pkg/snsqs/Tests/SnsQsProducerTest.php | 132 ++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 pkg/snsqs/Tests/SnsQsProducerTest.php diff --git a/pkg/snsqs/SnsQsProducer.php b/pkg/snsqs/SnsQsProducer.php index 1baeef307..bdce7f895 100644 --- a/pkg/snsqs/SnsQsProducer.php +++ b/pkg/snsqs/SnsQsProducer.php @@ -77,17 +77,28 @@ public function send(Destination $destination, Message $message): void } } + /** + * Delivery delay is supported by SQSProducer. + * + * @param int|null $deliveryDelay + * + * @return Producer + */ public function setDeliveryDelay(int $deliveryDelay = null): Producer { - $this->getSnsProducer()->setDeliveryDelay($deliveryDelay); $this->getSqsProducer()->setDeliveryDelay($deliveryDelay); return $this; } + /** + * Delivery delay is supported by SQSProducer. + * + * @return int|null + */ public function getDeliveryDelay(): ?int { - return $this->getSnsProducer()->getDeliveryDelay(); + return $this->getSqsProducer()->getDeliveryDelay(); } public function setPriority(int $priority = null): Producer diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php new file mode 100644 index 000000000..336e32033 --- /dev/null +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -0,0 +1,132 @@ +assertClassImplements(Producer::class, SnsQsProducer::class); + } + + public function testCouldBeConstructedWithRequiredArguments() + { + new SnsQsProducer($this->createSnsContextMock(), $this->createSqsContextMock()); + } + + public function testShouldThrowIfMessageIsInvalidType() + { + $this->expectException(InvalidMessageException::class); + $this->expectExceptionMessage('The message must be an instance of Enqueue\SnsQs\SnsQsMessage but it is Double\Message\P1'); + + $producer = new SnsQsProducer($this->createSnsContextMock(), $this->createSqsContextMock()); + + $message = $this->prophesize(Message::class)->reveal(); + + $producer->send(new SnsQsTopic(''), $message); + } + + public function testShouldThrowIfDestinationOfInvalidType() + { + $this->expectException(InvalidDestinationException::class); + + $producer = new SnsQsProducer($this->createSnsContextMock(), $this->createSqsContextMock()); + + $destination = $this->prophesize(Destination::class)->reveal(); + + $producer->send($destination, new SnsQsMessage()); + } + + public function testShouldSetDeliveryDelayToSQSProducer() + { + $delay = 10; + + $sqsProducerStub = $this->prophesize(SqsProducer::class); + $sqsProducerStub->setDeliveryDelay(Argument::is($delay))->shouldBeCalledTimes(1); + + $sqsMock = $this->createSqsContextMock(); + $sqsMock->method('createProducer')->willReturn($sqsProducerStub->reveal()); + + $producer = new SnsQsProducer($this->createSnsContextMock(), $sqsMock); + + $producer->setDeliveryDelay($delay); + } + + public function testShouldGetDeliveryDelayFromSQSProducer() + { + $delay = 10; + + $sqsProducerStub = $this->prophesize(SqsProducer::class); + $sqsProducerStub->getDeliveryDelay()->willReturn($delay); + + $sqsMock = $this->createSqsContextMock(); + $sqsMock->method('createProducer')->willReturn($sqsProducerStub->reveal()); + + $producer = new SnsQsProducer($this->createSnsContextMock(), $sqsMock); + + $this->assertEquals($delay, $producer->getDeliveryDelay()); + } + + public function testShouldSendSnsTopicMessageToSnsProducer() + { + $snsMock = $this->createSnsContextMock(); + $destination = new SnsQsTopic(''); + + $snsProducerStub = $this->prophesize(SnsProducer::class); + $snsProducerStub->send($destination, Argument::any())->shouldBeCalledOnce(); + + $snsMock->method('createProducer')->willReturn($snsProducerStub->reveal()); + + $producer = new SnsQsProducer($snsMock, $this->createSqsContextMock()); + $producer->send($destination, new SnsQsMessage()); + } + + public function testShouldSendSqsMessageToSqsProducer() + { + $sqsMock = $this->createSqsContextMock(); + $destination = new SnsQsQueue(''); + + $snsProducerStub = $this->prophesize(SqsProducer::class); + $snsProducerStub->send($destination, Argument::any())->shouldBeCalledOnce(); + + $sqsMock->method('createProducer')->willReturn($snsProducerStub->reveal()); + + $producer = new SnsQsProducer($this->createSnsContextMock(), $sqsMock); + $producer->send($destination, new SnsQsMessage()); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|SnsContext + */ + private function createSnsContextMock(): SnsContext + { + return $this->createMock(SnsContext::class); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|SqsContext + */ + private function createSqsContextMock(): SqsContext + { + return $this->createMock(SqsContext::class); + } +} From 594e87877eb9470cef6c3af49c335826b50a9953 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 25 Jun 2019 21:01:18 +0300 Subject: [PATCH 0671/1142] Release 0.9.12 --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 243408045..8231b95d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,38 @@ # Change Log +## [0.9.12](https://github.com/php-enqueue/enqueue-dev/tree/0.9.12) (2019-06-25) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.11...0.9.12) + +**Merged pull requests:** + +- \[SNSQS\] Fix issue with delay [\#909](https://github.com/php-enqueue/enqueue-dev/pull/909) ([uro](https://github.com/uro)) +- \[SNS\] Fix: Missing throw issue [\#908](https://github.com/php-enqueue/enqueue-dev/pull/908) ([uro](https://github.com/uro)) +- \[SNS\] Adding generic driver for schema SNS [\#906](https://github.com/php-enqueue/enqueue-dev/pull/906) ([Nyholm](https://github.com/Nyholm)) +- \[SQS\] deserialize sqs message attributes [\#901](https://github.com/php-enqueue/enqueue-dev/pull/901) ([bendavies](https://github.com/bendavies)) +- \[SNS\] Updates dependencies requirements for sns\(qs\) [\#899](https://github.com/php-enqueue/enqueue-dev/pull/899) ([xavismeh](https://github.com/xavismeh)) +- Cast int for redelivery\_delay and polling\_interval [\#896](https://github.com/php-enqueue/enqueue-dev/pull/896) ([linh4github](https://github.com/linh4github)) +- \[doc\] Move support note to an external include file [\#892](https://github.com/php-enqueue/enqueue-dev/pull/892) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Allow reading headers from Kafka Message headers [\#891](https://github.com/php-enqueue/enqueue-dev/pull/891) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Fix Code Style in all files [\#889](https://github.com/php-enqueue/enqueue-dev/pull/889) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Move "key concepts" to second position in menu. Fix typos. [\#886](https://github.com/php-enqueue/enqueue-dev/pull/886) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\]\[Bundle\] Expand quick tour for Symfony Bundle [\#885](https://github.com/php-enqueue/enqueue-dev/pull/885) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Fix link for cli commands [\#882](https://github.com/php-enqueue/enqueue-dev/pull/882) ([samnela](https://github.com/samnela)) +- Add composer runnable scripts for PHPStan & PHP-CS [\#881](https://github.com/php-enqueue/enqueue-dev/pull/881) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Fixed quick tour link [\#878](https://github.com/php-enqueue/enqueue-dev/pull/878) ([samnela](https://github.com/samnela)) +- \[doc\] Fix documentation links [\#877](https://github.com/php-enqueue/enqueue-dev/pull/877) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Add editor config settings for IDE's that support it [\#875](https://github.com/php-enqueue/enqueue-dev/pull/875) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Prefer github pages in packages' readme files [\#874](https://github.com/php-enqueue/enqueue-dev/pull/874) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Add Amazon SNS documentation placeholder [\#873](https://github.com/php-enqueue/enqueue-dev/pull/873) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Prefer github pages in readme [\#872](https://github.com/php-enqueue/enqueue-dev/pull/872) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Github Pages - Match topic order from index.md [\#870](https://github.com/php-enqueue/enqueue-dev/pull/870) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Github pages navigation structure [\#869](https://github.com/php-enqueue/enqueue-dev/pull/869) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Fixed the service id for Transport [\#868](https://github.com/php-enqueue/enqueue-dev/pull/868) ([samnela](https://github.com/samnela)) +- \[doc\] Use organization repository for doc hosting [\#867](https://github.com/php-enqueue/enqueue-dev/pull/867) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Switch documentation to github pages [\#866](https://github.com/php-enqueue/enqueue-dev/pull/866) ([Steveb-p](https://github.com/Steveb-p)) +- Prefer stable dependencies for development [\#865](https://github.com/php-enqueue/enqueue-dev/pull/865) ([Steveb-p](https://github.com/Steveb-p)) +- \[doc\] Key concepts [\#863](https://github.com/php-enqueue/enqueue-dev/pull/863) ([sylfabre](https://github.com/sylfabre)) +- \[doc\] Better Symfony doc nav [\#862](https://github.com/php-enqueue/enqueue-dev/pull/862) ([sylfabre](https://github.com/sylfabre)) + ## [0.9.11](https://github.com/php-enqueue/enqueue-dev/tree/0.9.11) (2019-05-24) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.10...0.9.11) From a9435929c1387ecc45832a8eb81eb8fe2326b94f Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Thu, 11 Jul 2019 12:10:00 +0100 Subject: [PATCH 0672/1142] Async commands extended --- docs/bundle/async_commands.md | 5 ++++- docs/bundle/config_reference.md | 2 ++ .../AsyncCommandExtension.php | 19 ++++++++++++++----- pkg/async-command/RunCommandProcessor.php | 10 ++++++++-- .../Tests/RunCommandProcessorTest.php | 7 +++++++ .../DependencyInjection/Configuration.php | 5 +++++ .../DependencyInjection/EnqueueExtension.php | 12 ++++++++---- .../Tests/Functional/App/config/config.yml | 7 +++++-- 8 files changed, 53 insertions(+), 14 deletions(-) diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md index c82024110..b5e8265be 100644 --- a/docs/bundle/async_commands.md +++ b/docs/bundle/async_commands.md @@ -21,7 +21,10 @@ $ composer require enqueue/async-command:0.9.x-dev enqueue: default: - async_commands: true + async_commands: + enabled: true + timeout: 60 + prefix: ~ ``` ## Usage diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index edbd917f2..d277cdc5c 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -62,6 +62,8 @@ enqueue: storage_factory_class: ~ async_commands: enabled: false + timeout: 60 + prefix: ~ job: enabled: false async_events: diff --git a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php index 2cfdf261c..51c66e4be 100644 --- a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php +++ b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php @@ -12,13 +12,22 @@ class AsyncCommandExtension extends Extension public function load(array $configs, ContainerBuilder $container) { foreach ($configs['clients'] as $client) { - $id = sprintf('enqueue.async_command.%s.run_command_processor', $client); + // BC compatibility + if (!is_array($client)) { + $client = [ + 'name' => $client, + 'prefix' => '', + 'timeout' => 60, + ]; + } + + $id = sprintf('enqueue.async_command.%s.run_command_processor', $client['name']); $container->register($id, RunCommandProcessor::class) - ->addArgument('%kernel.project_dir%') + ->addArgument('%kernel.project_dir%', $client['timeout']) ->addTag('enqueue.processor', [ - 'client' => $client, - 'command' => Commands::RUN_COMMAND, - 'queue' => Commands::RUN_COMMAND, + 'client' => $client['name'], + 'command' => $client['prefix'].Commands::RUN_COMMAND, + 'queue' => $client['prefix'].Commands::RUN_COMMAND, 'prefix_queue' => false, 'exclusive' => true, ]) diff --git a/pkg/async-command/RunCommandProcessor.php b/pkg/async-command/RunCommandProcessor.php index 7925d658c..f1495f399 100644 --- a/pkg/async-command/RunCommandProcessor.php +++ b/pkg/async-command/RunCommandProcessor.php @@ -11,14 +11,20 @@ final class RunCommandProcessor implements Processor { + /** + * @var int + */ + private $timeout; + /** * @var string */ private $projectDir; - public function __construct(string $projectDir) + public function __construct(string $projectDir, int $timeout = 60) { $this->projectDir = $projectDir; + $this->timeout = $timeout; } public function process(Message $message, Context $context): Result @@ -29,7 +35,7 @@ public function process(Message $message, Context $context): Result $consoleBin = file_exists($this->projectDir.'/bin/console') ? './bin/console' : './app/console'; $process = new Process($phpBin.' '.$consoleBin.' '.$this->getCommandLine($command), $this->projectDir); - + $process->setTimeout($this->timeout); $process->run(); if ($message->getReplyTo()) { diff --git a/pkg/async-command/Tests/RunCommandProcessorTest.php b/pkg/async-command/Tests/RunCommandProcessorTest.php index 83274e2c0..3065ec315 100644 --- a/pkg/async-command/Tests/RunCommandProcessorTest.php +++ b/pkg/async-command/Tests/RunCommandProcessorTest.php @@ -28,4 +28,11 @@ public function testCouldBeConstructedWithProjectDirAsFirstArgument() $this->assertAttributeSame('aProjectDir', 'projectDir', $processor); } + + public function testCouldBeConstructedWithTimeoutAsSecondArgument() + { + $processor = new RunCommandProcessor('aProjectDir', 60); + + $this->assertAttributeSame(60, 'timeout', $processor); + } } diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 6257fa4f1..e2d290348 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -73,6 +73,11 @@ private function getAsyncCommandsConfiguration(): ArrayNodeDefinition } return (new ArrayNodeDefinition('async_commands')) + ->children() + ->booleanNode('enabled')->defaultFalse()->end() + ->integerNode('timeout')->min(0)->defaultValue(60)->end() + ->scalarNode('prefix')->defaultValue('')->end() + ->end() ->addDefaultsIfNotSet() ->canBeEnabled() ; diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index b5ae10ab9..48acc85dc 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -291,14 +291,18 @@ private function loadReplyExtension(array $config, ContainerBuilder $container): private function loadAsyncCommands(array $config, ContainerBuilder $container): void { - $configNames = []; + $configs = []; foreach ($config as $name => $modules) { if (false === empty($modules['async_commands']['enabled'])) { - $configNames[] = $name; + $configs[] = [ + 'name' => $name, + 'timeout' => $modules['async_commands']['timeout'], + 'prefix' => $modules['async_commands']['prefix'], + ]; } } - if (false == $configNames) { + if (false == $configs) { return; } @@ -307,7 +311,7 @@ private function loadAsyncCommands(array $config, ContainerBuilder $container): } $extension = new AsyncCommandExtension(); - $extension->load(['clients' => $configNames], $container); + $extension->load(['clients' => $configs], $container); } private function loadMessageQueueCollector(array $config, ContainerBuilder $container) diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 1198e60d2..3e43b628e 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -28,7 +28,10 @@ enqueue: traceable_producer: true job: true async_events: true - async_commands: true + async_commands: + enabled: true + timeout: 60 + prefix: '' services: test_enqueue.client.default.traceable_producer: @@ -122,4 +125,4 @@ services: enqueue.events.async_listener: class: 'Enqueue\Bundle\Tests\Functional\App\AsyncListener' public: true - arguments: ['@enqueue.client.default.producer', '@enqueue.events.registry'] \ No newline at end of file + arguments: ['@enqueue.client.default.producer', '@enqueue.events.registry'] From a44f4f0755abae44bc82696f1ad1057e74b1ab03 Mon Sep 17 00:00:00 2001 From: Nevo Date: Tue, 16 Jul 2019 13:31:57 +0300 Subject: [PATCH 0673/1142] DBAL Change ParameterType class to Type class Doctrine DBAL version 2.6 not have ParameterType class. --- pkg/dbal/DbalConsumerHelperTrait.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 87e720dac..31fa52b5c 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -6,7 +6,6 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\RetryableException; -use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Types\Type; use Ramsey\Uuid\Uuid; @@ -40,7 +39,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->addOrderBy('priority', 'asc') ->addOrderBy('published_at', 'asc') ->setParameter('queues', $queues, Connection::PARAM_STR_ARRAY) - ->setParameter('delayedUntil', $now, ParameterType::INTEGER) + ->setParameter('delayedUntil', $now, Type::INTEGER) ->setMaxResults(1); $update = $this->getConnection()->createQueryBuilder() From 3586983301ec38789d57e67882bbf180769877a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 29 Jul 2019 21:25:27 +0200 Subject: [PATCH 0674/1142] Link to forma-pro website --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e73c0623f..08f693a53 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

Enqueue logo

+

Enqueue logo

Enqueue Chat From 86fb4ea41601a8f0c1ae9ee8db0d075d97cd0944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 29 Jul 2019 21:32:56 +0200 Subject: [PATCH 0675/1142] Switch to link from forma-pro to documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08f693a53..1d1cccb5f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

Enqueue logo

+

Enqueue logo

Enqueue Chat From 64cdba07d4de448845f80ea55d5af578020bc661 Mon Sep 17 00:00:00 2001 From: Lctrs Date: Mon, 5 Aug 2019 10:30:21 +0200 Subject: [PATCH 0676/1142] [DoctrineClearIdentityMapExtension] allow instances of ManagerRegistry We only use the method `getManagers()` which comes from this interface, and not the RegistryInterface from Sf's doctrine bridge. So it makes sense to allow passing implementations of parent interfaces. This will also allow us to use this class with Doctrine ODM. --- .../Extension/DoctrineClearIdentityMapExtension.php | 8 ++++---- .../Extension/DoctrineClearIdentityMapExtensionTest.php | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php index 3a973d6b2..a8f258f21 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php @@ -2,21 +2,21 @@ namespace Enqueue\Bundle\Consumption\Extension; +use Doctrine\Common\Persistence\ManagerRegistry; use Enqueue\Consumption\Context\MessageReceived; use Enqueue\Consumption\MessageReceivedExtensionInterface; -use Symfony\Bridge\Doctrine\RegistryInterface; class DoctrineClearIdentityMapExtension implements MessageReceivedExtensionInterface { /** - * @var RegistryInterface + * @var ManagerRegistry */ protected $registry; /** - * @param RegistryInterface $registry + * @param ManagerRegistry $registry */ - public function __construct(RegistryInterface $registry) + public function __construct(ManagerRegistry $registry) { $this->registry = $registry; } diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php index db3f28e00..47dceeb36 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; +use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\Common\Persistence\ObjectManager; use Enqueue\Bundle\Consumption\Extension\DoctrineClearIdentityMapExtension; use Enqueue\Consumption\Context\MessageReceived; @@ -11,7 +12,6 @@ use Interop\Queue\Processor; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; -use Symfony\Bridge\Doctrine\RegistryInterface; class DoctrineClearIdentityMapExtensionTest extends TestCase { @@ -59,11 +59,11 @@ protected function createContext(): MessageReceived } /** - * @return \PHPUnit_Framework_MockObject_MockObject|RegistryInterface + * @return \PHPUnit_Framework_MockObject_MockObject|ManagerRegistry */ - protected function createRegistryMock(): RegistryInterface + protected function createRegistryMock(): ManagerRegistry { - return $this->createMock(RegistryInterface::class); + return $this->createMock(ManagerRegistry::class); } /** From 584054bea1ed8975d3d814f555d073835f87c161 Mon Sep 17 00:00:00 2001 From: Lctrs Date: Tue, 6 Aug 2019 10:28:54 +0200 Subject: [PATCH 0677/1142] Add an extension to reset services Reset services tagged by "kernel.reset". --- docs/bundle/config_reference.md | 1 + docs/consumption/extensions.md | 6 ++ .../Extension/ResetServicesExtension.php | 27 ++++++++ .../DependencyInjection/Configuration.php | 1 + .../DependencyInjection/EnqueueExtension.php | 32 ++++++++-- .../Extension/ResetServicesExtensionTest.php | 61 +++++++++++++++++++ .../DependencyInjection/ConfigurationTest.php | 43 +++++++++++++ .../EnqueueExtensionTest.php | 36 +++++++++++ 8 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php create mode 100644 pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index edbd917f2..47f193fcc 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -69,6 +69,7 @@ enqueue: extensions: doctrine_ping_connection_extension: false doctrine_clear_identity_map_extension: false + reset_services_extension: false signal_extension: true reply_extension: true ``` diff --git a/docs/consumption/extensions.md b/docs/consumption/extensions.md index 58ea0402a..7cddb2e3d 100644 --- a/docs/consumption/extensions.md +++ b/docs/consumption/extensions.md @@ -22,6 +22,12 @@ It clears Doctrine's identity map after a message is processed. It reduce memory It test a database connection and if it is lost it does reconnect. Fixes "MySQL has gone away" errors. +## [ResetServicesExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php) + +It resets all services with tag "kernel.reset". +For example, this includes all monolog loggers if installed and will flush/clean all buffers, +reset internal state, and get them back to a state in which they can receive log records again. + ## [ReplyExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue/Consumption/Extension/ReplyExtension.php) It comes with RPC code and simplifies reply logic. diff --git a/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php b/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php new file mode 100644 index 000000000..36eb21782 --- /dev/null +++ b/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php @@ -0,0 +1,27 @@ +resetter = $resetter; + } + + public function onMessageReceived(MessageReceived $context): void + { + $context->getLogger()->debug('[ResetServicesExtension] Resetting services.'); + + $this->resetter->reset(); + } +} diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 6257fa4f1..d0e1e1fdf 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -47,6 +47,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->arrayNode('extensions')->addDefaultsIfNotSet()->children() ->booleanNode('doctrine_ping_connection_extension')->defaultFalse()->end() ->booleanNode('doctrine_clear_identity_map_extension')->defaultFalse()->end() + ->booleanNode('reset_services_extension')->defaultFalse()->end() ->booleanNode('signal_extension')->defaultValue(function_exists('pcntl_signal_dispatch'))->end() ->booleanNode('reply_extension')->defaultTrue()->end() ->end()->end() diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index b5ae10ab9..623be15c4 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -6,6 +6,7 @@ use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncEventDispatcherExtension; use Enqueue\Bundle\Consumption\Extension\DoctrineClearIdentityMapExtension; use Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension; +use Enqueue\Bundle\Consumption\Extension\ResetServicesExtension; use Enqueue\Bundle\Profiler\MessageQueueCollector; use Enqueue\Client\CommandSubscriberInterface; use Enqueue\Client\TopicSubscriberInterface; @@ -136,6 +137,7 @@ public function load(array $configs, ContainerBuilder $container): void // extensions $this->loadDoctrinePingConnectionExtension($config, $container); $this->loadDoctrineClearIdentityMapExtension($config, $container); + $this->loadResetServicesExtension($config, $container); $this->loadSignalExtension($config, $container); $this->loadReplyExtension($config, $container); } @@ -210,7 +212,7 @@ private function loadDoctrinePingConnectionExtension(array $config, ContainerBui } } - if (false == $configNames) { + if ([] === $configNames) { return; } @@ -233,7 +235,7 @@ private function loadDoctrineClearIdentityMapExtension(array $config, ContainerB } } - if (false == $configNames) { + if ([] === $configNames) { return; } @@ -247,6 +249,28 @@ private function loadDoctrineClearIdentityMapExtension(array $config, ContainerB } } + private function loadResetServicesExtension(array $config, ContainerBuilder $container) + { + $configNames = []; + foreach ($config as $name => $modules) { + if ($modules['extensions']['reset_services_extension']) { + $configNames[] = $name; + } + } + + if ([] === $configNames) { + return; + } + + $extension = $container->register('enqueue.consumption.reset_services_extension', ResetServicesExtension::class) + ->addArgument(new Reference('services_resetter')); + + foreach ($configNames as $name) { + $extension->addTag('enqueue.consumption_extension', ['client' => $name]); + $extension->addTag('enqueue.transport.consumption_extension', ['transport' => $name]); + } + } + private function loadSignalExtension(array $config, ContainerBuilder $container): void { $configNames = []; @@ -256,7 +280,7 @@ private function loadSignalExtension(array $config, ContainerBuilder $container) } } - if (false == $configNames) { + if ([] === $configNames) { return; } @@ -277,7 +301,7 @@ private function loadReplyExtension(array $config, ContainerBuilder $container): } } - if (false == $configNames) { + if ([] === $configNames) { return; } diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php new file mode 100644 index 000000000..e5f787420 --- /dev/null +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php @@ -0,0 +1,61 @@ +createResetterMock()); + } + + public function testItShouldResetServices() + { + $resetter = $this->createResetterMock(); + $resetter + ->expects($this->once()) + ->method('reset') + ; + + $context = $this->createContext(); + $context->getLogger() + ->expects($this->once()) + ->method('debug') + ->with('[ResetServicesExtension] Resetting services.') + ; + + $extension = new ResetServicesExtension($resetter); + $extension->onMessageReceived($context); + } + + protected function createContext(): MessageReceived + { + return new MessageReceived( + $this->createMock(InteropContext::class), + $this->createMock(Consumer::class), + $this->createMock(Message::class), + $this->createMock(Processor::class), + 1, + $this->createMock(LoggerInterface::class) + ); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ManagerRegistry + */ + protected function createResetterMock(): ServicesResetter + { + return $this->createMock(ServicesResetter::class); + } +} diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index d33d9e0e3..e3073a820 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -336,6 +336,49 @@ public function testDoctrineClearIdentityMapExtensionCouldBeEnabled() ], $config); } + public function testResetServicesExtensionShouldBeDisabledByDefault() + { + $configuration = new Configuration(true); + + $processor = new Processor(); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => null, + ], + ]]); + + $this->assertArraySubset([ + 'default' => [ + 'extensions' => [ + 'reset_services_extension' => false, + ], + ], + ], $config); + } + + public function testResetServicesExtensionCouldBeEnabled() + { + $configuration = new Configuration(true); + + $processor = new Processor(); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => [], + 'extensions' => [ + 'reset_services_extension' => true, + ], + ], + ]]); + + $this->assertArraySubset([ + 'default' => [ + 'extensions' => [ + 'reset_services_extension' => true, + ], + ], + ], $config); + } + public function testSignalExtensionShouldBeEnabledIfPcntlExtensionIsLoaded() { $isLoaded = function_exists('pcntl_signal_dispatch'); diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index b17d6a949..0365feb1d 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -384,6 +384,42 @@ public function testShouldNotLoadDoctrineClearIdentityMapExtensionServiceIfDisab self::assertFalse($container->hasDefinition('enqueue.consumption.doctrine_clear_identity_map_extension')); } + public function testShouldLoadResetServicesExtensionServiceIfEnabled() + { + $container = $this->getContainerBuilder(true); + + $extension = new EnqueueExtension(); + + $extension->load([[ + 'default' => [ + 'transport' => [], + 'extensions' => [ + 'reset_services_extension' => true, + ], + ], + ]], $container); + + self::assertTrue($container->hasDefinition('enqueue.consumption.reset_services_extension')); + } + + public function testShouldNotLoadResetServicesExtensionServiceIfDisabled() + { + $container = $this->getContainerBuilder(true); + + $extension = new EnqueueExtension(); + + $extension->load([[ + 'default' => [ + 'transport' => [], + 'extensions' => [ + 'reset_services_extension' => false, + ], + ], + ]], $container); + + self::assertFalse($container->hasDefinition('enqueue.consumption.reset_services_extension')); + } + public function testShouldLoadSignalExtensionServiceIfEnabled() { $container = $this->getContainerBuilder(true); From b4a909cfdb12b2631fc0454263bc6dfab026f05e Mon Sep 17 00:00:00 2001 From: Lctrs Date: Thu, 8 Aug 2019 12:01:55 +0200 Subject: [PATCH 0678/1142] Add a service to reset doctrine/odm identity maps --- composer.json | 5 ++- docs/bundle/config_reference.md | 1 + .../DependencyInjection/Configuration.php | 1 + .../DependencyInjection/EnqueueExtension.php | 24 +++++++++++ .../DependencyInjection/ConfigurationTest.php | 43 +++++++++++++++++++ .../EnqueueExtensionTest.php | 36 ++++++++++++++++ .../Tests/fix_composer_json.php | 1 + pkg/enqueue-bundle/composer.json | 2 + 8 files changed, 112 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c238f3148..6a115bf02 100644 --- a/composer.json +++ b/composer.json @@ -56,6 +56,8 @@ "symfony/framework-bundle": "^3.4|^4", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2", + "doctrine/mongodb-odm-bundle": "^3.5", + "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^1.0.2", "friendsofphp/php-cs-fixer": "^2" }, @@ -112,7 +114,8 @@ "ext-rdkafka": "3.3", "ext-mongodb": "1.3", "ext-bcmath": "1", - "ext-mbstring": "1" + "ext-mbstring": "1", + "ext-mongo": "1.6.14" }, "prefer-stable": true } diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index 47f193fcc..a549ceda1 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -69,6 +69,7 @@ enqueue: extensions: doctrine_ping_connection_extension: false doctrine_clear_identity_map_extension: false + doctrine_odm_clear_identity_map_extension: false reset_services_extension: false signal_extension: true reply_extension: true diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index d0e1e1fdf..3b26f5ad4 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -47,6 +47,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->arrayNode('extensions')->addDefaultsIfNotSet()->children() ->booleanNode('doctrine_ping_connection_extension')->defaultFalse()->end() ->booleanNode('doctrine_clear_identity_map_extension')->defaultFalse()->end() + ->booleanNode('doctrine_odm_clear_identity_map_extension')->defaultFalse()->end() ->booleanNode('reset_services_extension')->defaultFalse()->end() ->booleanNode('signal_extension')->defaultValue(function_exists('pcntl_signal_dispatch'))->end() ->booleanNode('reply_extension')->defaultTrue()->end() diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 623be15c4..620e71925 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -137,6 +137,7 @@ public function load(array $configs, ContainerBuilder $container): void // extensions $this->loadDoctrinePingConnectionExtension($config, $container); $this->loadDoctrineClearIdentityMapExtension($config, $container); + $this->loadDoctrineOdmClearIdentityMapExtension($config, $container); $this->loadResetServicesExtension($config, $container); $this->loadSignalExtension($config, $container); $this->loadReplyExtension($config, $container); @@ -249,6 +250,29 @@ private function loadDoctrineClearIdentityMapExtension(array $config, ContainerB } } + private function loadDoctrineOdmClearIdentityMapExtension(array $config, ContainerBuilder $container): void + { + $configNames = []; + foreach ($config as $name => $modules) { + if ($modules['extensions']['doctrine_odm_clear_identity_map_extension']) { + $configNames[] = $name; + } + } + + if ([] === $configNames) { + return; + } + + $extension = $container->register('enqueue.consumption.doctrine_odm_clear_identity_map_extension', DoctrineClearIdentityMapExtension::class) + ->addArgument(new Reference('doctrine_mongodb')) + ; + + foreach ($configNames as $name) { + $extension->addTag('enqueue.consumption_extension', ['client' => $name]); + $extension->addTag('enqueue.transport.consumption_extension', ['transport' => $name]); + } + } + private function loadResetServicesExtension(array $config, ContainerBuilder $container) { $configNames = []; diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index e3073a820..6e2b47dcf 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -336,6 +336,49 @@ public function testDoctrineClearIdentityMapExtensionCouldBeEnabled() ], $config); } + public function testDoctrineOdmClearIdentityMapExtensionShouldBeDisabledByDefault() + { + $configuration = new Configuration(true); + + $processor = new Processor(); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => null, + ], + ]]); + + $this->assertArraySubset([ + 'default' => [ + 'extensions' => [ + 'doctrine_odm_clear_identity_map_extension' => false, + ], + ], + ], $config); + } + + public function testDoctrineOdmClearIdentityMapExtensionCouldBeEnabled() + { + $configuration = new Configuration(true); + + $processor = new Processor(); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => [], + 'extensions' => [ + 'doctrine_odm_clear_identity_map_extension' => true, + ], + ], + ]]); + + $this->assertArraySubset([ + 'default' => [ + 'extensions' => [ + 'doctrine_odm_clear_identity_map_extension' => true, + ], + ], + ], $config); + } + public function testResetServicesExtensionShouldBeDisabledByDefault() { $configuration = new Configuration(true); diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index 0365feb1d..ab1eb2967 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -384,6 +384,42 @@ public function testShouldNotLoadDoctrineClearIdentityMapExtensionServiceIfDisab self::assertFalse($container->hasDefinition('enqueue.consumption.doctrine_clear_identity_map_extension')); } + public function testShouldLoadDoctrineOdmClearIdentityMapExtensionServiceIfEnabled() + { + $container = $this->getContainerBuilder(true); + + $extension = new EnqueueExtension(); + + $extension->load([[ + 'default' => [ + 'transport' => [], + 'extensions' => [ + 'doctrine_odm_clear_identity_map_extension' => true, + ], + ], + ]], $container); + + self::assertTrue($container->hasDefinition('enqueue.consumption.doctrine_odm_clear_identity_map_extension')); + } + + public function testShouldNotLoadDoctrineOdmClearIdentityMapExtensionServiceIfDisabled() + { + $container = $this->getContainerBuilder(true); + + $extension = new EnqueueExtension(); + + $extension->load([[ + 'default' => [ + 'transport' => [], + 'extensions' => [ + 'doctrine_odm_clear_identity_map_extension' => false, + ], + ], + ]], $container); + + self::assertFalse($container->hasDefinition('enqueue.consumption.doctrine_odm_clear_identity_map_extension')); + } + public function testShouldLoadResetServicesExtensionServiceIfEnabled() { $container = $this->getContainerBuilder(true); diff --git a/pkg/enqueue-bundle/Tests/fix_composer_json.php b/pkg/enqueue-bundle/Tests/fix_composer_json.php index f025f6081..6cc24aa03 100644 --- a/pkg/enqueue-bundle/Tests/fix_composer_json.php +++ b/pkg/enqueue-bundle/Tests/fix_composer_json.php @@ -5,5 +5,6 @@ $composerJson = json_decode(file_get_contents(__DIR__.'/../composer.json'), true); $composerJson['config']['platform']['ext-amqp'] = '1.9.3'; +$composerJson['config']['platform']['ext-mongo'] = '1.6.14'; file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, JSON_PRETTY_PRINT)); diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 63620a3b5..49a637ab3 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -37,6 +37,8 @@ "enqueue/async-command": "0.9.x-dev", "php-amqplib/php-amqplib": "^2.7", "doctrine/doctrine-bundle": "~1.2", + "doctrine/mongodb-odm-bundle": "^3.5", + "alcaeus/mongo-php-adapter": "^1.0", "symfony/browser-kit": "^3.4|^4", "symfony/expression-language": "^3.4|^4" }, From 05951433953b858140902bdfd11cc2a0552b64dc Mon Sep 17 00:00:00 2001 From: Lctrs Date: Thu, 8 Aug 2019 16:07:03 +0200 Subject: [PATCH 0679/1142] Add an extension to stop consumption on closed entity manager --- docs/bundle/config_reference.md | 1 + docs/consumption/extensions.md | 4 + .../DoctrineClosedEntityManagerExtension.php | 65 +++++ .../DependencyInjection/Configuration.php | 1 + .../DependencyInjection/EnqueueExtension.php | 24 ++ ...ctrineClosedEntityManagerExtensionTest.php | 222 ++++++++++++++++++ .../DependencyInjection/ConfigurationTest.php | 43 ++++ .../EnqueueExtensionTest.php | 36 +++ 8 files changed, 396 insertions(+) create mode 100644 pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php create mode 100644 pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index a549ceda1..ce115336e 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -70,6 +70,7 @@ enqueue: doctrine_ping_connection_extension: false doctrine_clear_identity_map_extension: false doctrine_odm_clear_identity_map_extension: false + doctrine_closed_entity_manager_extension: false reset_services_extension: false signal_extension: true reply_extension: true diff --git a/docs/consumption/extensions.md b/docs/consumption/extensions.md index 7cddb2e3d..8afd61e8b 100644 --- a/docs/consumption/extensions.md +++ b/docs/consumption/extensions.md @@ -22,6 +22,10 @@ It clears Doctrine's identity map after a message is processed. It reduce memory It test a database connection and if it is lost it does reconnect. Fixes "MySQL has gone away" errors. +## [DoctrineClosedEntityManagerExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php) + +The extension interrupts consumption if an entity manager has been closed. + ## [ResetServicesExtension](https://github.com/php-enqueue/enqueue-dev/blob/master/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php) It resets all services with tag "kernel.reset". diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php new file mode 100644 index 000000000..d2765231a --- /dev/null +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php @@ -0,0 +1,65 @@ +registry = $registry; + } + + public function onPreConsume(PreConsume $context): void + { + if ($this->shouldBeStopped($context->getLogger())) { + $context->interruptExecution(); + } + } + + public function onPostConsume(PostConsume $context): void + { + if ($this->shouldBeStopped($context->getLogger())) { + $context->interruptExecution(); + } + } + + public function onPostMessageReceived(PostMessageReceived $context): void + { + if ($this->shouldBeStopped($context->getLogger())) { + $context->interruptExecution(); + } + } + + private function shouldBeStopped(LoggerInterface $logger): bool + { + foreach ($this->registry->getManagers() as $name => $manager) { + if (!$manager instanceof EntityManagerInterface || $manager->isOpen()) { + continue; + } + + $logger->debug(sprintf( + '[DoctrineClosedEntityManagerExtension] Interrupt execution as entity manager "%s" has been closed', + $name + )); + + return true; + } + + return false; + } +} diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 3b26f5ad4..3fe3ec76d 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -48,6 +48,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->booleanNode('doctrine_ping_connection_extension')->defaultFalse()->end() ->booleanNode('doctrine_clear_identity_map_extension')->defaultFalse()->end() ->booleanNode('doctrine_odm_clear_identity_map_extension')->defaultFalse()->end() + ->booleanNode('doctrine_closed_entity_manager_extension')->defaultFalse()->end() ->booleanNode('reset_services_extension')->defaultFalse()->end() ->booleanNode('signal_extension')->defaultValue(function_exists('pcntl_signal_dispatch'))->end() ->booleanNode('reply_extension')->defaultTrue()->end() diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 620e71925..fd6ccae86 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -5,6 +5,7 @@ use Enqueue\AsyncCommand\DependencyInjection\AsyncCommandExtension; use Enqueue\AsyncEventDispatcher\DependencyInjection\AsyncEventDispatcherExtension; use Enqueue\Bundle\Consumption\Extension\DoctrineClearIdentityMapExtension; +use Enqueue\Bundle\Consumption\Extension\DoctrineClosedEntityManagerExtension; use Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension; use Enqueue\Bundle\Consumption\Extension\ResetServicesExtension; use Enqueue\Bundle\Profiler\MessageQueueCollector; @@ -138,6 +139,7 @@ public function load(array $configs, ContainerBuilder $container): void $this->loadDoctrinePingConnectionExtension($config, $container); $this->loadDoctrineClearIdentityMapExtension($config, $container); $this->loadDoctrineOdmClearIdentityMapExtension($config, $container); + $this->loadDoctrineClosedEntityManagerExtension($config, $container); $this->loadResetServicesExtension($config, $container); $this->loadSignalExtension($config, $container); $this->loadReplyExtension($config, $container); @@ -273,6 +275,28 @@ private function loadDoctrineOdmClearIdentityMapExtension(array $config, Contain } } + private function loadDoctrineClosedEntityManagerExtension(array $config, ContainerBuilder $container) + { + $configNames = []; + foreach ($config as $name => $modules) { + if ($modules['extensions']['doctrine_closed_entity_manager_extension']) { + $configNames[] = $name; + } + } + + if ([] === $configNames) { + return; + } + + $extension = $container->register('enqueue.consumption.doctrine_closed_entity_manager_extension', DoctrineClosedEntityManagerExtension::class) + ->addArgument(new Reference('doctrine')); + + foreach ($configNames as $name) { + $extension->addTag('enqueue.consumption_extension', ['client' => $name]); + $extension->addTag('enqueue.transport.consumption_extension', ['transport' => $name]); + } + } + private function loadResetServicesExtension(array $config, ContainerBuilder $container) { $configNames = []; diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php new file mode 100644 index 000000000..1cccb0b13 --- /dev/null +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php @@ -0,0 +1,222 @@ +createManagerMock(true); + + $registry = $this->createRegistryMock([ + 'manager' => $manager, + ]); + + $message = new PreConsume( + $this->createMock(InteropContext::class), + $this->createMock(SubscriptionConsumer::class), + $this->createMock(LoggerInterface::class), + 1, + 2, + 3 + ); + + self::assertFalse($message->isExecutionInterrupted()); + + $extension = new DoctrineClosedEntityManagerExtension($registry); + $extension->onPreConsume($message); + + self::assertFalse($message->isExecutionInterrupted()); + } + + public function testOnPreConsumeShouldInterruptExecutionIfAManagerIsClosed() + { + $manager1 = $this->createManagerMock(true); + $manager2 = $this->createManagerMock(false); + + $registry = $this->createRegistryMock([ + 'manager1' => $manager1, + 'manager2' => $manager2, + ]); + + $message = new PreConsume( + $this->createMock(InteropContext::class), + $this->createMock(SubscriptionConsumer::class), + $this->createMock(LoggerInterface::class), + 1, + 2, + 3 + ); + $message->getLogger() + ->expects($this->once()) + ->method('debug') + ->with('[DoctrineClosedEntityManagerExtension] Interrupt execution as entity manager "manager2" has been closed') + ; + + self::assertFalse($message->isExecutionInterrupted()); + + $extension = new DoctrineClosedEntityManagerExtension($registry); + $extension->onPreConsume($message); + + self::assertTrue($message->isExecutionInterrupted()); + } + + public function testOnPostConsumeShouldNotInterruptExecution() + { + $manager = $this->createManagerMock(true); + + $registry = $this->createRegistryMock([ + 'manager' => $manager, + ]); + + $message = new PostConsume( + $this->createMock(InteropContext::class), + $this->createMock(SubscriptionConsumer::class), + 1, + 1, + 1, + $this->createMock(LoggerInterface::class) + ); + + self::assertFalse($message->isExecutionInterrupted()); + + $extension = new DoctrineClosedEntityManagerExtension($registry); + $extension->onPostConsume($message); + + self::assertFalse($message->isExecutionInterrupted()); + } + + public function testOnPostConsumeShouldInterruptExecutionIfAManagerIsClosed() + { + $manager1 = $this->createManagerMock(true); + $manager2 = $this->createManagerMock(false); + + $registry = $this->createRegistryMock([ + 'manager1' => $manager1, + 'manager2' => $manager2, + ]); + + $message = new PostConsume( + $this->createMock(InteropContext::class), + $this->createMock(SubscriptionConsumer::class), + 1, + 1, + 1, + $this->createMock(LoggerInterface::class) + ); + $message->getLogger() + ->expects($this->once()) + ->method('debug') + ->with('[DoctrineClosedEntityManagerExtension] Interrupt execution as entity manager "manager2" has been closed') + ; + + self::assertFalse($message->isExecutionInterrupted()); + + $extension = new DoctrineClosedEntityManagerExtension($registry); + $extension->onPostConsume($message); + + self::assertTrue($message->isExecutionInterrupted()); + } + + public function testOnPostReceivedShouldNotInterruptExecution() + { + $manager = $this->createManagerMock(true); + + $registry = $this->createRegistryMock([ + 'manager' => $manager, + ]); + + $message = new PostMessageReceived( + $this->createMock(InteropContext::class), + $this->createMock(Consumer::class), + $this->createMock(Message::class), + 'aResult', + 1, + $this->createMock(LoggerInterface::class) + ); + + self::assertFalse($message->isExecutionInterrupted()); + + $extension = new DoctrineClosedEntityManagerExtension($registry); + $extension->onPostMessageReceived($message); + + self::assertFalse($message->isExecutionInterrupted()); + } + + public function testOnPostReceivedShouldInterruptExecutionIfAManagerIsClosed() + { + $manager1 = $this->createManagerMock(true); + $manager2 = $this->createManagerMock(false); + + $registry = $this->createRegistryMock([ + 'manager1' => $manager1, + 'manager2' => $manager2, + ]); + + $message = new PostMessageReceived( + $this->createMock(InteropContext::class), + $this->createMock(Consumer::class), + $this->createMock(Message::class), + 'aResult', + 1, + $this->createMock(LoggerInterface::class) + ); + $message->getLogger() + ->expects($this->once()) + ->method('debug') + ->with('[DoctrineClosedEntityManagerExtension] Interrupt execution as entity manager "manager2" has been closed') + ; + + self::assertFalse($message->isExecutionInterrupted()); + + $extension = new DoctrineClosedEntityManagerExtension($registry); + $extension->onPostMessageReceived($message); + + self::assertTrue($message->isExecutionInterrupted()); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ManagerRegistry + */ + protected function createRegistryMock(array $managers): ManagerRegistry + { + $mock = $this->createMock(ManagerRegistry::class); + + $mock + ->expects($this->once()) + ->method('getManagers') + ->willReturn($managers) + ; + + return $mock; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|EntityManagerInterface + */ + protected function createManagerMock(bool $open): EntityManagerInterface + { + $mock = $this->createMock(EntityManagerInterface::class); + + $mock + ->expects($this->once()) + ->method('isOpen') + ->willReturn($open) + ; + + return $mock; + } +} diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index 6e2b47dcf..3f3aae8ee 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -379,6 +379,49 @@ public function testDoctrineOdmClearIdentityMapExtensionCouldBeEnabled() ], $config); } + public function testDoctrineClosedEntityManagerExtensionShouldBeDisabledByDefault() + { + $configuration = new Configuration(true); + + $processor = new Processor(); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => null, + ], + ]]); + + $this->assertArraySubset([ + 'default' => [ + 'extensions' => [ + 'doctrine_closed_entity_manager_extension' => false, + ], + ], + ], $config); + } + + public function testDoctrineClosedEntityManagerExtensionCouldBeEnabled() + { + $configuration = new Configuration(true); + + $processor = new Processor(); + $config = $processor->processConfiguration($configuration, [[ + 'default' => [ + 'transport' => null, + 'extensions' => [ + 'doctrine_closed_entity_manager_extension' => true, + ], + ], + ]]); + + $this->assertArraySubset([ + 'default' => [ + 'extensions' => [ + 'doctrine_closed_entity_manager_extension' => true, + ], + ], + ], $config); + } + public function testResetServicesExtensionShouldBeDisabledByDefault() { $configuration = new Configuration(true); diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index ab1eb2967..51bbaa26d 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -420,6 +420,42 @@ public function testShouldNotLoadDoctrineOdmClearIdentityMapExtensionServiceIfDi self::assertFalse($container->hasDefinition('enqueue.consumption.doctrine_odm_clear_identity_map_extension')); } + public function testShouldLoadDoctrineClosedEntityManagerExtensionServiceIfEnabled() + { + $container = $this->getContainerBuilder(true); + + $extension = new EnqueueExtension(); + + $extension->load([[ + 'default' => [ + 'transport' => [], + 'extensions' => [ + 'doctrine_closed_entity_manager_extension' => true, + ], + ], + ]], $container); + + self::assertTrue($container->hasDefinition('enqueue.consumption.doctrine_closed_entity_manager_extension')); + } + + public function testShouldNotLoadDoctrineClosedEntityManagerExtensionServiceIfDisabled() + { + $container = $this->getContainerBuilder(true); + + $extension = new EnqueueExtension(); + + $extension->load([[ + 'default' => [ + 'transport' => [], + 'extensions' => [ + 'doctrine_closed_entity_manager_extension' => false, + ], + ], + ]], $container); + + self::assertFalse($container->hasDefinition('enqueue.consumption.doctrine_closed_entity_manager_extension')); + } + public function testShouldLoadResetServicesExtensionServiceIfEnabled() { $container = $this->getContainerBuilder(true); From 600ac061cb77fb32ff70dd6d96ad52cab0b5eab1 Mon Sep 17 00:00:00 2001 From: Arkadiusz Surma Date: Mon, 19 Aug 2019 17:16:56 +0100 Subject: [PATCH 0680/1142] CR fixess --- docs/bundle/async_commands.md | 3 ++- docs/bundle/config_reference.md | 3 ++- .../DependencyInjection/AsyncCommandExtension.php | 7 ++++--- pkg/enqueue-bundle/DependencyInjection/Configuration.php | 3 ++- .../DependencyInjection/EnqueueExtension.php | 3 ++- pkg/enqueue-bundle/Tests/Functional/App/config/config.yml | 3 ++- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md index b5e8265be..8c83d2b4d 100644 --- a/docs/bundle/async_commands.md +++ b/docs/bundle/async_commands.md @@ -24,7 +24,8 @@ enqueue: async_commands: enabled: true timeout: 60 - prefix: ~ + command_name: ~ + queue_name: ~ ``` ## Usage diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index d277cdc5c..95fb1ce1f 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -63,7 +63,8 @@ enqueue: async_commands: enabled: false timeout: 60 - prefix: ~ + command_name: ~ + queue_name: ~ job: enabled: false async_events: diff --git a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php index 51c66e4be..d1f4157a2 100644 --- a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php +++ b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php @@ -16,7 +16,8 @@ public function load(array $configs, ContainerBuilder $container) if (!is_array($client)) { $client = [ 'name' => $client, - 'prefix' => '', + 'command_name' => Commands::RUN_COMMAND, + 'queue_name' => Commands::RUN_COMMAND, 'timeout' => 60, ]; } @@ -26,8 +27,8 @@ public function load(array $configs, ContainerBuilder $container) ->addArgument('%kernel.project_dir%', $client['timeout']) ->addTag('enqueue.processor', [ 'client' => $client['name'], - 'command' => $client['prefix'].Commands::RUN_COMMAND, - 'queue' => $client['prefix'].Commands::RUN_COMMAND, + 'command' => $client['command_name'] ?? Commands::RUN_COMMAND, + 'queue' => $client['queue_name'] ?? Commands::RUN_COMMAND, 'prefix_queue' => false, 'exclusive' => true, ]) diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index e2d290348..996d3b60e 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -76,7 +76,8 @@ private function getAsyncCommandsConfiguration(): ArrayNodeDefinition ->children() ->booleanNode('enabled')->defaultFalse()->end() ->integerNode('timeout')->min(0)->defaultValue(60)->end() - ->scalarNode('prefix')->defaultValue('')->end() + ->scalarNode('command_name')->defaultNull()->end() + ->scalarNode('queue_name')->defaultNull()->end() ->end() ->addDefaultsIfNotSet() ->canBeEnabled() diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 48acc85dc..a9de8c9ce 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -297,7 +297,8 @@ private function loadAsyncCommands(array $config, ContainerBuilder $container): $configs[] = [ 'name' => $name, 'timeout' => $modules['async_commands']['timeout'], - 'prefix' => $modules['async_commands']['prefix'], + 'command_name' => $modules['async_commands']['command_name'], + 'queue_name' => $modules['async_commands']['queue_name'], ]; } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 3e43b628e..562647c31 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -31,7 +31,8 @@ enqueue: async_commands: enabled: true timeout: 60 - prefix: '' + command_name: ~ + queue_name: ~ services: test_enqueue.client.default.traceable_producer: From c20462b93de890cbe5ac253bc25ad858b7519979 Mon Sep 17 00:00:00 2001 From: Tobias Sette Date: Tue, 27 Aug 2019 05:48:51 -0300 Subject: [PATCH 0681/1142] docs: describe drawbacks of using amqp extension --- docs/transport/amqp.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/transport/amqp.md b/docs/transport/amqp.md index ab22ed044..f398f0043 100644 --- a/docs/transport/amqp.md +++ b/docs/transport/amqp.md @@ -11,6 +11,11 @@ nav_order: 3 Implements [AMQP specifications](https://www.rabbitmq.com/specification.html) and implements [amqp interop](https://github.com/queue-interop/amqp-interop) interfaces. Build on top of [php amqp extension](https://github.com/pdezwart/php-amqp). +Drawbacks: +* [heartbeats will not work properly](https://github.com/pdezwart/php-amqp#persistent-connection) +* [signals will not be properly handled](https://github.com/pdezwart/php-amqp#keeping-track-of-the-workers) + +Parts: * [Installation](#installation) * [Create context](#create-context) * [Declare topic](#declare-topic) From acb978a893d407f7835b3a1c00dd48f43407d86b Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 3 Sep 2019 11:28:36 +0300 Subject: [PATCH 0682/1142] Release 0.9.13 --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8231b95d1..221d4aabf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## [0.9.13](https://github.com/php-enqueue/enqueue-dev/tree/0.9.13) (2019-09-03) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.12...0.9.13) + +**Merged pull requests:** + +- docs: describe drawbacks of using amqp extension [\#942](https://github.com/php-enqueue/enqueue-dev/pull/942) ([gnumoksha](https://github.com/gnumoksha)) +- Add a service to reset doctrine/odm identity maps [\#933](https://github.com/php-enqueue/enqueue-dev/pull/933) ([Lctrs](https://github.com/Lctrs)) +- Add an extension to stop consumption on closed entity manager [\#932](https://github.com/php-enqueue/enqueue-dev/pull/932) ([Lctrs](https://github.com/Lctrs)) +- Add an extension to reset services [\#929](https://github.com/php-enqueue/enqueue-dev/pull/929) ([Lctrs](https://github.com/Lctrs)) +- \[DoctrineClearIdentityMapExtension\] allow instances of ManagerRegistry [\#927](https://github.com/php-enqueue/enqueue-dev/pull/927) ([Lctrs](https://github.com/Lctrs)) +- Link to documentation from logo [\#926](https://github.com/php-enqueue/enqueue-dev/pull/926) ([Steveb-p](https://github.com/Steveb-p)) +- DBAL Change ParameterType class to Type class [\#916](https://github.com/php-enqueue/enqueue-dev/pull/916) ([Nevoss](https://github.com/Nevoss)) +- async\_commands: extended configuration proposal [\#914](https://github.com/php-enqueue/enqueue-dev/pull/914) ([uro](https://github.com/uro)) + ## [0.9.12](https://github.com/php-enqueue/enqueue-dev/tree/0.9.12) (2019-06-25) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.11...0.9.12) From a07b0f95aecaee32816706d02f9205d0fab08945 Mon Sep 17 00:00:00 2001 From: Andrea Quintino Date: Tue, 10 Sep 2019 22:56:31 +0200 Subject: [PATCH 0683/1142] Create singleton to avoid consumer duplication --- pkg/rdkafka/RdKafkaContext.php | 31 ++++++++++++++++-------- pkg/rdkafka/Tests/RdKafkaContextTest.php | 23 ++++++++++++++++++ 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index 22d4a8e47..ace937ccf 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -45,6 +45,11 @@ class RdKafkaContext implements Context */ private $kafkaConsumers; + /** + * @var RdKafkaConsumer[] + */ + private $rdKafkaConsumers; + /** * @param array $config */ @@ -102,20 +107,26 @@ public function createConsumer(Destination $destination): Consumer { InvalidDestinationException::assertDestinationInstanceOf($destination, RdKafkaTopic::class); - $this->kafkaConsumers[] = $kafkaConsumer = new KafkaConsumer($this->getConf()); + $queueName = $destination->getQueueName(); - $consumer = new RdKafkaConsumer( - $kafkaConsumer, - $this, - $destination, - $this->getSerializer() - ); + if (!isset($this->rdKafkaConsumers[$queueName])) { + $this->kafkaConsumers[] = $kafkaConsumer = new KafkaConsumer($this->getConf()); + + $consumer = new RdKafkaConsumer( + $kafkaConsumer, + $this, + $destination, + $this->getSerializer() + ); + + if (isset($this->config['commit_async'])) { + $consumer->setCommitAsync($this->config['commit_async']); + } - if (isset($this->config['commit_async'])) { - $consumer->setCommitAsync($this->config['commit_async']); + $this->rdKafkaConsumers[$queueName] = $consumer; } - return $consumer; + return $this->rdKafkaConsumers[$queueName]; } public function close(): void diff --git a/pkg/rdkafka/Tests/RdKafkaContextTest.php b/pkg/rdkafka/Tests/RdKafkaContextTest.php index e787efb55..48900f403 100644 --- a/pkg/rdkafka/Tests/RdKafkaContextTest.php +++ b/pkg/rdkafka/Tests/RdKafkaContextTest.php @@ -69,4 +69,27 @@ public function testShouldInjectItsSerializerToConsumer() $this->assertSame($context->getSerializer(), $producer->getSerializer()); } + + public function testShouldNotCreateConsumerTwice() + { + $context = new RdKafkaContext([]); + $queue = $context->createQueue('aQueue'); + + $consumer = $context->createConsumer($queue); + $consumer2 = $context->createConsumer($queue); + + $this->assertSame($consumer, $consumer2); + } + + public function testShouldCreateTwoConsumers() + { + $context = new RdKafkaContext([]); + $queueA = $context->createQueue('aQueue'); + $queueB = $context->createQueue('aQueue'); + + $consumer = $context->createConsumer($queueA); + $consumer2 = $context->createConsumer($queueB); + + $this->assertNotSame($consumer, $consumer2); + } } From 44020f937d96c19a63151d327d3e31daeef34256 Mon Sep 17 00:00:00 2001 From: dirk39 Date: Wed, 11 Sep 2019 11:57:22 +0200 Subject: [PATCH 0684/1142] update rdKafka test --- pkg/rdkafka/Tests/RdKafkaContextTest.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/rdkafka/Tests/RdKafkaContextTest.php b/pkg/rdkafka/Tests/RdKafkaContextTest.php index 48900f403..227eea792 100644 --- a/pkg/rdkafka/Tests/RdKafkaContextTest.php +++ b/pkg/rdkafka/Tests/RdKafkaContextTest.php @@ -72,7 +72,9 @@ public function testShouldInjectItsSerializerToConsumer() public function testShouldNotCreateConsumerTwice() { - $context = new RdKafkaContext([]); + $context = new RdKafkaContext(['global' => [ + 'group.id' => uniqid('', true), + ]]); $queue = $context->createQueue('aQueue'); $consumer = $context->createConsumer($queue); @@ -83,9 +85,11 @@ public function testShouldNotCreateConsumerTwice() public function testShouldCreateTwoConsumers() { - $context = new RdKafkaContext([]); + $context = new RdKafkaContext(['global' => [ + 'group.id' => uniqid('', true), + ]]); $queueA = $context->createQueue('aQueue'); - $queueB = $context->createQueue('aQueue'); + $queueB = $context->createQueue('bQueue'); $consumer = $context->createConsumer($queueA); $consumer2 = $context->createConsumer($queueB); From 130e934d98ca69f659be2a45cbc06a8a622d9cc1 Mon Sep 17 00:00:00 2001 From: dirk39 Date: Thu, 12 Sep 2019 09:31:03 +0200 Subject: [PATCH 0685/1142] clean rdKafkaConsumers list when context is close --- pkg/rdkafka/RdKafkaContext.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index ace937ccf..cd3379515 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -133,6 +133,7 @@ public function close(): void { $kafkaConsumers = $this->kafkaConsumers; $this->kafkaConsumers = []; + $this->rdKafkaConsumers = []; foreach ($kafkaConsumers as $kafkaConsumer) { $kafkaConsumer->unsubscribe(); From c4ba70997bed4b959096ee6369dd201ee323c9c8 Mon Sep 17 00:00:00 2001 From: dirk39 Date: Thu, 12 Sep 2019 10:08:00 +0200 Subject: [PATCH 0686/1142] initialized rdKafkaConsumers attribute --- pkg/rdkafka/RdKafkaContext.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index cd3379515..cda5fc9b7 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -57,6 +57,7 @@ public function __construct(array $config) { $this->config = $config; $this->kafkaConsumers = []; + $this->rdKafkaConsumers = []; $this->setSerializer(new JsonSerializer()); } From 879e6fb4605418f27e75216f59a845dbe082daa0 Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Wed, 25 Sep 2019 08:53:05 +0200 Subject: [PATCH 0687/1142] Use producev to support headers in kafka --- pkg/rdkafka/RdKafkaProducer.php | 2 +- pkg/rdkafka/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index 3f6d1923f..facdf8879 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -42,7 +42,7 @@ public function send(Destination $destination, Message $message): void $key = $message->getKey() ?: $destination->getKey() ?: null; $topic = $this->producer->newTopic($destination->getTopicName(), $destination->getConf()); - $topic->produce($partition, 0 /* must be 0 */, $payload, $key); + $topic->producev($partition, 0 /* must be 0 */, $payload, $key, $message->getHeaders()); } /** diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index e0d55b396..d82de4909 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "ext-rdkafka": "^3.0.3", + "ext-rdkafka": "^3.1.0", "queue-interop/queue-interop": "^0.7|^0.8" }, "require-dev": { From 65134d7af52f575403245dff5df7e9aecc898e95 Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Wed, 25 Sep 2019 09:13:26 +0200 Subject: [PATCH 0688/1142] Fix tests --- pkg/rdkafka/Tests/RdKafkaProducerTest.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index be5b94a6a..1f8e7db8b 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -45,18 +45,20 @@ public function testThrowIfMessageInvalid() public function testShouldUseSerializerToEncodeMessageAndPutToExpectedTube() { - $message = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); + $messageHeaders = ['bar' => 'barVal']; + $message = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], $messageHeaders); $message->setKey('key'); $kafkaTopic = $this->createKafkaTopicMock(); $kafkaTopic ->expects($this->once()) - ->method('produce') + ->method('producev') ->with( RD_KAFKA_PARTITION_UA, 0, 'theSerializedMessage', - 'key' + 'key', + $messageHeaders ) ; @@ -87,7 +89,7 @@ public function testShouldPassNullAsTopicConfigIfNotSetOnTopic() $kafkaTopic = $this->createKafkaTopicMock(); $kafkaTopic ->expects($this->once()) - ->method('produce') + ->method('producev') ; $kafkaProducer = $this->createKafkaProducerMock(); @@ -123,7 +125,7 @@ public function testShouldPassCustomConfAsTopicConfigIfSetOnTopic() $kafkaTopic = $this->createKafkaTopicMock(); $kafkaTopic ->expects($this->once()) - ->method('produce') + ->method('producev') ; $kafkaProducer = $this->createKafkaProducerMock(); @@ -165,13 +167,14 @@ public function testShouldAllowGetPreviouslySetSerializer() public function testShouldAllowSerializersToSerializeKeys() { - $message = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); + $messageHeaders = ['bar' => 'barVal']; + $message = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], $messageHeaders); $message->setKey('key'); $kafkaTopic = $this->createKafkaTopicMock(); $kafkaTopic ->expects($this->once()) - ->method('produce') + ->method('producev') ->with( RD_KAFKA_PARTITION_UA, 0, From 733caddf549370b5aa46d2d76b4101344ac330cc Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Wed, 25 Sep 2019 11:15:29 +0200 Subject: [PATCH 0689/1142] Maintain backward compatibility --- pkg/rdkafka/RdKafkaContext.php | 11 +++++++++++ pkg/rdkafka/RdKafkaProducer.php | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index 22d4a8e47..950125296 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -138,6 +138,17 @@ public function purgeQueue(Queue $queue): void throw PurgeQueueNotSupportedException::providerDoestNotSupportIt(); } + public static function getLibrdKafkaVersion(): string + { + if (!defined('RD_KAFKA_VERSION')) { + throw new \RuntimeException('RD_KAFKA_VERSION constant is not defined. Phprdkafka is probably not installed'); + } + $major = (RD_KAFKA_VERSION & 0xFF000000) >> 24; + $minor = (RD_KAFKA_VERSION & 0x00FF0000) >> 16; + $patch = (RD_KAFKA_VERSION & 0x0000FF00) >> 8; + return "$major.$minor.$patch"; + } + private function getProducer(): VendorProducer { if (null === $this->producer) { diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index facdf8879..a6135c50c 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -42,7 +42,24 @@ public function send(Destination $destination, Message $message): void $key = $message->getKey() ?: $destination->getKey() ?: null; $topic = $this->producer->newTopic($destination->getTopicName(), $destination->getConf()); - $topic->producev($partition, 0 /* must be 0 */, $payload, $key, $message->getHeaders()); + + // Note: Topic::producev method exists in phprdkafka > 3.1.0 + // Headers in payload are maintained for backwards compatibility with apps that might run on lower phprdkafka version + if (method_exists($topic, 'producev')) { + // Phprdkafka <= 3.1.0 will fail calling `producev` on librdkafka >= 1.0.0 causing segfault + if (version_compare(RdKafkaContext::getLibrdKafkaVersion(), '1.0.0', '>=') + && version_compare(phpversion('rdkafka'), '3.1.0', '<=')) { + trigger_error( + 'Phprdkafka <= 3.1.0 is incompatible with librdkafka 1.0.0 when calling `producev`', + E_USER_WARNING + ); + } else { + $topic->producev($partition, 0 /* must be 0 */, $payload, $key, $message->getHeaders()); + return; + } + } + + $topic->produce($partition, 0 /* must be 0 */, $payload, $key); } /** From 748189d6fb9cf6cb9851737a018e197e7f93676c Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Wed, 25 Sep 2019 11:23:09 +0200 Subject: [PATCH 0690/1142] Update warning message --- pkg/rdkafka/RdKafkaProducer.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index a6135c50c..747c3ce02 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -50,7 +50,8 @@ public function send(Destination $destination, Message $message): void if (version_compare(RdKafkaContext::getLibrdKafkaVersion(), '1.0.0', '>=') && version_compare(phpversion('rdkafka'), '3.1.0', '<=')) { trigger_error( - 'Phprdkafka <= 3.1.0 is incompatible with librdkafka 1.0.0 when calling `producev`', + 'Phprdkafka <= 3.1.0 is incompatible with librdkafka 1.0.0 when calling `producev`. ' . + 'Falling back to `produce` (without message headers) instead.', E_USER_WARNING ); } else { From aa646583628684327de0e661c86a3055a3a7224b Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Wed, 25 Sep 2019 11:34:08 +0200 Subject: [PATCH 0691/1142] =?UTF-8?q?CS=C2=A0fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/rdkafka/RdKafkaContext.php | 1 + pkg/rdkafka/RdKafkaProducer.php | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index 950125296..a82770ab8 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -146,6 +146,7 @@ public static function getLibrdKafkaVersion(): string $major = (RD_KAFKA_VERSION & 0xFF000000) >> 24; $minor = (RD_KAFKA_VERSION & 0x00FF0000) >> 16; $patch = (RD_KAFKA_VERSION & 0x0000FF00) >> 8; + return "$major.$minor.$patch"; } diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index 747c3ce02..77ec9115b 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -50,12 +50,13 @@ public function send(Destination $destination, Message $message): void if (version_compare(RdKafkaContext::getLibrdKafkaVersion(), '1.0.0', '>=') && version_compare(phpversion('rdkafka'), '3.1.0', '<=')) { trigger_error( - 'Phprdkafka <= 3.1.0 is incompatible with librdkafka 1.0.0 when calling `producev`. ' . + 'Phprdkafka <= 3.1.0 is incompatible with librdkafka 1.0.0 when calling `producev`. '. 'Falling back to `produce` (without message headers) instead.', E_USER_WARNING ); } else { $topic->producev($partition, 0 /* must be 0 */, $payload, $key, $message->getHeaders()); + return; } } From 2ae46550edc00558322cab2f68a774cc4cbb5917 Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Wed, 25 Sep 2019 13:33:42 +0200 Subject: [PATCH 0692/1142] Revert version bump of rdkafka dep --- pkg/rdkafka/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index d82de4909..e0d55b396 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "ext-rdkafka": "^3.1.0", + "ext-rdkafka": "^3.0.3", "queue-interop/queue-interop": "^0.7|^0.8" }, "require-dev": { From 684e83bff93d8a4e61511af80ac256e78cea3870 Mon Sep 17 00:00:00 2001 From: Nicolas Guilloux Date: Fri, 4 Oct 2019 14:47:10 +0200 Subject: [PATCH 0693/1142] Fix empty class for autowired services (Fix #957) --- .../DependencyInjection/BuildCommandSubscriberRoutesPass.php | 2 +- .../DependencyInjection/BuildTopicSubscriberRoutesPass.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php index 1527e51d8..5eee3efdb 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php @@ -35,7 +35,7 @@ public function process(ContainerBuilder $container): void throw new \LogicException('The command subscriber tag could not be applied to a service created by factory.'); } - $processorClass = $processorDefinition->getClass(); + $processorClass = $processorDefinition->getClass() ?? $serviceId; if (false == class_exists($processorClass)) { throw new \LogicException(sprintf('The processor class "%s" could not be found.', $processorClass)); } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php index 518851150..4999921cc 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php @@ -35,7 +35,7 @@ public function process(ContainerBuilder $container): void throw new \LogicException('The topic subscriber tag could not be applied to a service created by factory.'); } - $processorClass = $processorDefinition->getClass(); + $processorClass = $processorDefinition->getClass() ?? $serviceId; if (false == class_exists($processorClass)) { throw new \LogicException(sprintf('The processor class "%s" could not be found.', $processorClass)); } From 2d439c59b4f63c57096bb477c641fd28020797c1 Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Thu, 10 Oct 2019 08:47:47 +0200 Subject: [PATCH 0694/1142] Add header support --- pkg/enqueue/Symfony/Client/ProduceCommand.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/enqueue/Symfony/Client/ProduceCommand.php b/pkg/enqueue/Symfony/Client/ProduceCommand.php index 61be6a87d..e96735ec3 100644 --- a/pkg/enqueue/Symfony/Client/ProduceCommand.php +++ b/pkg/enqueue/Symfony/Client/ProduceCommand.php @@ -2,6 +2,7 @@ namespace Enqueue\Symfony\Client; +use Enqueue\Client\Message; use Enqueue\Client\ProducerInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; @@ -44,6 +45,7 @@ protected function configure(): void $this ->setDescription('Sends an event to the topic') ->addArgument('message', InputArgument::REQUIRED, 'A message') + ->addOption('header', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'The message headers') ->addOption('client', 'c', InputOption::VALUE_OPTIONAL, 'The client to consume messages from.', $this->defaultClient) ->addOption('topic', null, InputOption::VALUE_OPTIONAL, 'The topic to send a message to') ->addOption('command', null, InputOption::VALUE_OPTIONAL, 'The command to send a message to') @@ -55,6 +57,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $topic = $input->getOption('topic'); $command = $input->getOption('command'); $message = $input->getArgument('message'); + $headers = $input->getOption('header'); $client = $input->getOption('client'); if ($topic && $command) { @@ -68,7 +71,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int } if ($topic) { - $producer->sendEvent($topic, $message); + $producer->sendEvent($topic, new Message($message, [], $headers)); $output->writeln('An event is sent'); } elseif ($command) { From 5bfc1290acbc3a98255fa7985ccfd371ee583b87 Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Thu, 10 Oct 2019 15:42:26 +0200 Subject: [PATCH 0695/1142] Add tests --- .../Symfony/Client/ProduceCommandTest.php | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php index 8e9b750a3..f6aea3656 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Tests\Symfony\Client; +use Enqueue\Client\Message; use Enqueue\Client\ProducerInterface; use Enqueue\Container\Container; use Enqueue\Symfony\Client\ProduceCommand; @@ -112,11 +113,14 @@ public function testThrowIfBothTopicAndCommandOptionsAreSet() public function testShouldSendEventToDefaultTransport() { + $header = 'Content-Type: text/plain'; + $payload = 'theMessage'; + $producerMock = $this->createProducerMock(); $producerMock ->expects($this->once()) ->method('sendEvent') - ->with('theTopic', 'theMessage') + ->with('theTopic', new Message($payload, [], [$header])) ; $producerMock ->expects($this->never()) @@ -129,18 +133,22 @@ public function testShouldSendEventToDefaultTransport() $tester = new CommandTester($command); $tester->execute([ - 'message' => 'theMessage', + 'message' => $payload, + '--header' => $header, '--topic' => 'theTopic', ]); } public function testShouldSendCommandToDefaultTransport() { + $header = 'Content-Type: text/plain'; + $payload = 'theMessage'; + $producerMock = $this->createProducerMock(); $producerMock ->expects($this->once()) ->method('sendCommand') - ->with('theCommand', 'theMessage') + ->with('theCommand', new Message($payload, [], [$header])) ; $producerMock ->expects($this->never()) @@ -153,13 +161,17 @@ public function testShouldSendCommandToDefaultTransport() $tester = new CommandTester($command); $tester->execute([ - 'message' => 'theMessage', + 'message' => $payload, + '--header' => $header, '--command' => 'theCommand', ]); } public function testShouldSendEventToFooTransport() { + $header = 'Content-Type: text/plain'; + $payload = 'theMessage'; + $defaultProducerMock = $this->createProducerMock(); $defaultProducerMock ->expects($this->never()) @@ -174,7 +186,7 @@ public function testShouldSendEventToFooTransport() $fooProducerMock ->expects($this->once()) ->method('sendEvent') - ->with('theTopic', 'theMessage') + ->with('theTopic', new Message($payload, [], [$header])) ; $fooProducerMock ->expects($this->never()) @@ -188,7 +200,8 @@ public function testShouldSendEventToFooTransport() $tester = new CommandTester($command); $tester->execute([ - 'message' => 'theMessage', + 'message' => $payload, + '--header' => $header, '--topic' => 'theTopic', '--client' => 'foo', ]); From 43713009334a4ce94803dd092e1da9d9c60fdd49 Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Thu, 10 Oct 2019 15:59:29 +0200 Subject: [PATCH 0696/1142] Fix tests --- pkg/enqueue/Symfony/Client/ProduceCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Symfony/Client/ProduceCommand.php b/pkg/enqueue/Symfony/Client/ProduceCommand.php index e96735ec3..51a365967 100644 --- a/pkg/enqueue/Symfony/Client/ProduceCommand.php +++ b/pkg/enqueue/Symfony/Client/ProduceCommand.php @@ -57,7 +57,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $topic = $input->getOption('topic'); $command = $input->getOption('command'); $message = $input->getArgument('message'); - $headers = $input->getOption('header'); + $headers = (array) $input->getOption('header'); $client = $input->getOption('client'); if ($topic && $command) { From fc36bdcdf359e580d3fe0fd1f0eab4d776cd2cc0 Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Thu, 10 Oct 2019 16:11:14 +0200 Subject: [PATCH 0697/1142] Fix tests --- .../Tests/Symfony/Client/ProduceCommandTest.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php index f6aea3656..7c50ae02c 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php @@ -43,10 +43,11 @@ public function testShouldHaveExpectedOptions() $command = new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); $options = $command->getDefinition()->getOptions(); - $this->assertCount(3, $options); + $this->assertCount(4, $options); $this->assertArrayHasKey('client', $options); $this->assertArrayHasKey('topic', $options); $this->assertArrayHasKey('command', $options); + $this->assertArrayHasKey('header', $options); } public function testShouldHaveExpectedAttributes() @@ -141,14 +142,11 @@ public function testShouldSendEventToDefaultTransport() public function testShouldSendCommandToDefaultTransport() { - $header = 'Content-Type: text/plain'; - $payload = 'theMessage'; - $producerMock = $this->createProducerMock(); $producerMock ->expects($this->once()) ->method('sendCommand') - ->with('theCommand', new Message($payload, [], [$header])) + ->with('theCommand', 'theMessage') ; $producerMock ->expects($this->never()) @@ -161,8 +159,7 @@ public function testShouldSendCommandToDefaultTransport() $tester = new CommandTester($command); $tester->execute([ - 'message' => $payload, - '--header' => $header, + 'message' => 'theMessage', '--command' => 'theCommand', ]); } From 288e90e43b8f60ef745ba82902030a63bfc3a050 Mon Sep 17 00:00:00 2001 From: TiMESPLiNTER Date: Thu, 10 Oct 2019 16:13:20 +0200 Subject: [PATCH 0698/1142] Fix tests --- pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php index 82a7e0089..84391cd3e 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php @@ -40,10 +40,11 @@ public function testShouldHaveExpectedOptions() $command = new SimpleProduceCommand($this->createProducerMock()); $options = $command->getDefinition()->getOptions(); - $this->assertCount(3, $options); + $this->assertCount(4, $options); $this->assertArrayHasKey('client', $options); $this->assertArrayHasKey('topic', $options); $this->assertArrayHasKey('command', $options); + $this->assertArrayHasKey('header', $options); } public function testShouldHaveExpectedAttributes() From ad9756935bc2c9042941adb58f921639ac0ebce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C5=ABnas=20Dronga?= Date: Fri, 11 Oct 2019 14:14:37 +0300 Subject: [PATCH 0699/1142] Add missing rabbitmq DSN example --- docs/client/supported_brokers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/client/supported_brokers.md b/docs/client/supported_brokers.md index d6b065ccf..eee6bce8c 100644 --- a/docs/client/supported_brokers.md +++ b/docs/client/supported_brokers.md @@ -13,7 +13,7 @@ Here's the list of transports supported by Enqueue Client: | Transport | Package | DSN | |:-------------------:|:----------------------------------------------------------:|:-------------------------------:| | AMQP, RabbitMQ | [enqueue/amqp-bunny](../transport/amqp_bunny.md) | amqp: amqp+bunny: | -| AMQP, RabbitMQ | [enqueue/amqp-lib](../transport/amqp_lib.md) | amqp: amqp+lib: | +| AMQP, RabbitMQ | [enqueue/amqp-lib](../transport/amqp_lib.md) | amqp: amqp+lib: amqp+rabbitmq: | | AMQP, RabbitMQ | [enqueue/amqp-ext](../transport/amqp.md) | amqp: amqp+ext: | | Doctrine DBAL | [enqueue/dbal](../transport/dbal.md) | mysql: pgsql: pdo_pgsql etc | | Filesystem | [enqueue/fs](../transport/fs.md) | file:///foo/bar | From dbaa6ce8ecafe8e9459a63fe99e0197bab6a2668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C5=ABnas=20Dronga?= Date: Sun, 13 Oct 2019 22:50:26 +0300 Subject: [PATCH 0700/1142] fix deprecated heartbeat check method --- pkg/amqp-lib/AmqpSubscriptionConsumer.php | 2 +- pkg/amqp-lib/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/amqp-lib/AmqpSubscriptionConsumer.php b/pkg/amqp-lib/AmqpSubscriptionConsumer.php index a5917dbed..e70b61a24 100644 --- a/pkg/amqp-lib/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-lib/AmqpSubscriptionConsumer.php @@ -49,7 +49,7 @@ public function consume(int $timeout = 0): void $signalHandler->beforeSocket(); $heartbeatOnTick = function (AmqpContext $context) { - $context->getLibChannel()->getConnection()->getIO()->check_heartbeat(); + $context->getLibChannel()->getConnection()->checkHeartBeat(); }; $this->heartbeatOnTick && register_tick_function($heartbeatOnTick, $this->context); diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 100dc583b..f5d29ecf6 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "php-amqplib/php-amqplib": "^2.8", + "php-amqplib/php-amqplib": "^2.10", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/amqp-tools": "^0.9" From b7b283bec5de20cfeaecb9789b55a38f573f63ac Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 14 Oct 2019 21:00:14 +0300 Subject: [PATCH 0701/1142] Release 0.9.14 --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 221d4aabf..268a95db1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## [0.9.14](https://github.com/php-enqueue/enqueue-dev/tree/0.9.14) (2019-10-14) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.13...0.9.14) + +**Merged pull requests:** + +- Fix deprecated heartbeat check method [\#967](https://github.com/php-enqueue/enqueue-dev/pull/967) ([ramunasd](https://github.com/ramunasd)) +- Add missing rabbitmq DSN example [\#966](https://github.com/php-enqueue/enqueue-dev/pull/966) ([ramunasd](https://github.com/ramunasd)) +- Fix empty class for autowired services \(Fix \#957\) [\#958](https://github.com/php-enqueue/enqueue-dev/pull/958) ([NicolasGuilloux](https://github.com/NicolasGuilloux)) +- Add header support for kafka [\#955](https://github.com/php-enqueue/enqueue-dev/pull/955) ([TiMESPLiNTER](https://github.com/TiMESPLiNTER)) +- Kafka singleton consumer [\#947](https://github.com/php-enqueue/enqueue-dev/pull/947) ([dirk39](https://github.com/dirk39)) + ## [0.9.13](https://github.com/php-enqueue/enqueue-dev/tree/0.9.13) (2019-09-03) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.12...0.9.13) From d1902c4cadf1cf012f279f56762aab2564b9a091 Mon Sep 17 00:00:00 2001 From: Neil Whitworth Date: Wed, 6 Nov 2019 13:07:32 +0000 Subject: [PATCH 0702/1142] #977 - swap redelivered flag from in-line sql constant to parameter to better work with MS-SQL server --- pkg/dbal/DbalConsumerHelperTrait.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 31fa52b5c..55ec77c00 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -129,9 +129,10 @@ protected function removeExpiredMessages(): void ->delete($this->getContext()->getTableName()) ->andWhere('(time_to_live IS NOT NULL) AND (time_to_live < :now)') ->andWhere('delivery_id IS NULL') - ->andWhere('redelivered = false') + ->andWhere('redelivered = :redelivered') ->setParameter(':now', time(), Type::BIGINT) + ->setParameter('redelivered', false, Type::BOOLEAN) ; try { From aa1c8717537af8673af572865593184d98c704ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Wed, 20 Nov 2019 11:42:01 +0100 Subject: [PATCH 0703/1142] Prefer early returns in consumer code --- pkg/rdkafka/RdKafkaConsumer.php | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index 241ee3841..88b05adac 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -99,18 +99,17 @@ public function receive(int $timeout = 0): ?Message $this->subscribed = true; } - $message = null; if ($timeout > 0) { - $message = $this->doReceive($timeout); - } else { - while (true) { - if ($message = $this->doReceive(500)) { - break; - } + return $this->doReceive($timeout); + } + + while (true) { + if ($message = $this->doReceive(500)) { + return $message; } } - return $message; + return null; } /** @@ -162,7 +161,7 @@ private function doReceive(int $timeout): ?RdKafkaMessage switch ($kafkaMessage->err) { case RD_KAFKA_RESP_ERR__PARTITION_EOF: case RD_KAFKA_RESP_ERR__TIMED_OUT: - break; + return null; case RD_KAFKA_RESP_ERR_NO_ERROR: $message = $this->serializer->toMessage($kafkaMessage->payload); $message->setKey($kafkaMessage->key); @@ -180,7 +179,5 @@ private function doReceive(int $timeout): ?RdKafkaMessage throw new \LogicException($kafkaMessage->errstr(), $kafkaMessage->err); break; } - - return null; } } From 32d2c07571e3e956c50b115539b2cc4ed577a8b8 Mon Sep 17 00:00:00 2001 From: Nicky De Maeyer Date: Fri, 22 Nov 2019 14:53:10 +0100 Subject: [PATCH 0704/1142] #984 Symfony 4.4 compatibility --- pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php index db8f0dd76..06150e97e 100644 --- a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php +++ b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php @@ -2,16 +2,16 @@ namespace Enqueue\Doctrine; +use Doctrine\Bundle\DoctrineBundle\Registry; use Enqueue\ConnectionFactoryFactoryInterface; use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Dsn\Dsn; use Interop\Queue\ConnectionFactory; -use Symfony\Bridge\Doctrine\RegistryInterface; class DoctrineConnectionFactoryFactory implements ConnectionFactoryFactoryInterface { /** - * @var RegistryInterface + * @var Registry */ private $doctrine; @@ -20,7 +20,7 @@ class DoctrineConnectionFactoryFactory implements ConnectionFactoryFactoryInterf */ private $fallbackFactory; - public function __construct(RegistryInterface $doctrine, ConnectionFactoryFactoryInterface $fallbackFactory) + public function __construct(Registry $doctrine, ConnectionFactoryFactoryInterface $fallbackFactory) { $this->doctrine = $doctrine; $this->fallbackFactory = $fallbackFactory; From 82099e3314e7d6139e2dd45141ff5f3d19279ad0 Mon Sep 17 00:00:00 2001 From: Jeroeny Date: Sat, 23 Nov 2019 11:31:39 +0100 Subject: [PATCH 0705/1142] allow symfony 5 --- pkg/async-command/composer.json | 14 +++++++------- pkg/async-event-dispatcher/composer.json | 12 ++++++------ pkg/enqueue-bundle/composer.json | 6 +++--- pkg/enqueue/composer.json | 16 ++++++++-------- pkg/fs/composer.json | 4 ++-- pkg/job-queue/composer.json | 6 +++--- pkg/simple-client/composer.json | 2 +- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 7474c8834..b4e4d90bc 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -9,15 +9,15 @@ "php": ">=7.1", "enqueue/enqueue": "^0.9", "queue-interop/queue-interop": "^0.7|^0.8", - "symfony/console": "^3.4|^4", - "symfony/process": "^3.4|^4" + "symfony/console": "^3.4|^4|^5", + "symfony/process": "^3.4|^4|^5" }, "require-dev": { "phpunit/phpunit": "~5.5", - "symfony/dependency-injection": "^3.4|^4", - "symfony/config": "^3.4|^4", - "symfony/http-kernel": "^3.4|^4", - "symfony/filesystem": "^3.4|^4", + "symfony/dependency-injection": "^3.4|^4|^5", + "symfony/config": "^3.4|^4|^5", + "symfony/http-kernel": "^3.4|^4|^5", + "symfony/filesystem": "^3.4|^4|^5", "enqueue/null": "0.9.x-dev", "enqueue/fs": "0.9.x-dev", "enqueue/test": "0.9.x-dev" @@ -30,7 +30,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "suggest": { - "symfony/dependency-injection": "^3.4|^4 If you'd like to use async event dispatcher container extension." + "symfony/dependency-injection": "^3.4|^4|^5 If you'd like to use async event dispatcher container extension." }, "autoload": { "psr-4": { "Enqueue\\AsyncCommand\\": "" }, diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index d5996f4aa..56c220808 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -9,14 +9,14 @@ "php": "^7.1.3", "enqueue/enqueue": "^0.9", "queue-interop/queue-interop": "^0.7|^0.8", - "symfony/event-dispatcher": "^3.4|^4" + "symfony/event-dispatcher": "^3.4|^4|^5" }, "require-dev": { "phpunit/phpunit": "~5.5", - "symfony/dependency-injection": "^3.4|^4", - "symfony/config": "^3.4|^4", - "symfony/http-kernel": "^3.4|^4", - "symfony/filesystem": "^3.4|^4", + "symfony/dependency-injection": "^3.4|^4|^5", + "symfony/config": "^3.4|^4|^5", + "symfony/http-kernel": "^3.4|^4|^5", + "symfony/filesystem": "^3.4|^4|^5", "enqueue/null": "0.9.x-dev", "enqueue/fs": "0.9.x-dev", "enqueue/test": "0.9.x-dev" @@ -29,7 +29,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "suggest": { - "symfony/dependency-injection": "^2.8|^3|^4 If you'd like to use async event dispatcher container extension." + "symfony/dependency-injection": "^2.8|^3|^4|^5 If you'd like to use async event dispatcher container extension." }, "autoload": { "psr-4": { "Enqueue\\AsyncEventDispatcher\\": "" }, diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 49a637ab3..819d225d1 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "symfony/framework-bundle": "^3.4|^4", + "symfony/framework-bundle": "^3.4|^4|^5", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/enqueue": "^0.9", @@ -39,8 +39,8 @@ "doctrine/doctrine-bundle": "~1.2", "doctrine/mongodb-odm-bundle": "^3.5", "alcaeus/mongo-php-adapter": "^1.0", - "symfony/browser-kit": "^3.4|^4", - "symfony/expression-language": "^3.4|^4" + "symfony/browser-kit": "^3.4|^4|^5", + "symfony/expression-language": "^3.4|^4|^5" }, "suggest": { "enqueue/async-command": "If want to run Symfony command via message queue", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 29cd7a847..a18b0a9e5 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -17,11 +17,11 @@ }, "require-dev": { "phpunit/phpunit": "~5.5", - "symfony/console": "^3.4|^4", - "symfony/dependency-injection": "^3.4|^4", - "symfony/config": "^3.4|^4", - "symfony/event-dispatcher": "^3.4|^4", - "symfony/http-kernel": "^3.4|^4", + "symfony/console": "^3.4|^4|^5", + "symfony/dependency-injection": "^3.4|^4|^5", + "symfony/config": "^3.4|^4|^5", + "symfony/event-dispatcher": "^3.4|^4|^5", + "symfony/http-kernel": "^3.4|^4|^5", "enqueue/amqp-ext": "0.9.x-dev", "enqueue/amqp-lib": "0.9.x-dev", "enqueue/amqp-bunny": "0.9.x-dev", @@ -41,9 +41,9 @@ "enqueue/dsn": "0.9.x-dev" }, "suggest": { - "symfony/console": "^2.8|^3|^4 If you want to use cli commands", - "symfony/dependency-injection": "^3.4|^4", - "symfony/config": "^3.4|^4", + "symfony/console": "^2.8|^3|^4|^5 If you want to use cli commands", + "symfony/dependency-injection": "^3.4|^4|^5", + "symfony/config": "^3.4|^4|^5", "enqueue/amqp-ext": "AMQP transport (based on php extension)", "enqueue/stomp": "STOMP transport", "enqueue/fs": "Filesystem transport", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index fb95a36f9..164227300 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", - "symfony/filesystem": "^3.4|^4", + "symfony/filesystem": "^3.4|^4|^5", "makasim/temp-file": "^0.2@stable" }, "require-dev": { @@ -17,7 +17,7 @@ "enqueue/null": "0.9.x-dev", "enqueue/test": "0.9.x-dev", "queue-interop/queue-spec": "^0.6", - "symfony/dependency-injection": "^3.4|^4" + "symfony/dependency-injection": "^3.4|^4|^5" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 4581d6cee..44268e689 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -16,9 +16,9 @@ "phpunit/phpunit": "~5.5", "enqueue/test": "0.9.x-dev", "doctrine/doctrine-bundle": "~1.2", - "symfony/browser-kit": "^3.4|^4", - "symfony/expression-language": "^3.4|^4", - "symfony/framework-bundle": "^3.4|^4" + "symfony/browser-kit": "^3.4|^4|^5", + "symfony/expression-language": "^3.4|^4|^5", + "symfony/framework-bundle": "^3.4|^4|^5" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 571cca783..604eb6988 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.9", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7|^0.8", - "symfony/config": "^3.4|^4" + "symfony/config": "^3.4|^4|^5" }, "require-dev": { "phpunit/phpunit": "~5.5", From 3943c7ec9d2b6afbe2f96483538e6b38042c04a9 Mon Sep 17 00:00:00 2001 From: Jeroeny Date: Sat, 23 Nov 2019 11:42:16 +0100 Subject: [PATCH 0706/1142] add symfony 5 to .travis.yml matrix --- .travis.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ecc11eaf0..8b8f41522 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,12 +20,24 @@ matrix: - php: 7.2 sudo: false env: SYMFONY_VERSION=4.0.* UNIT_TESTS=true + - php: 7.2 + sudo: false + env: SYMFONY_VERSION=5.0.* UNIT_TESTS=true - php: 7.3 sudo: false env: SYMFONY_VERSION=4.1.* UNIT_TESTS=true - php: 7.3 sudo: false env: SYMFONY_VERSION=4.2.* UNIT_TESTS=true + - php: 7.3 + sudo: false + env: SYMFONY_VERSION=4.3.* UNIT_TESTS=true + - php: 7.3 + sudo: false + env: SYMFONY_VERSION=4.4.* UNIT_TESTS=true + - php: 7.3 + sudo: false + env: SYMFONY_VERSION=5.0.* UNIT_TESTS=true - php: 7.1 services: docker sudo: required @@ -66,12 +78,12 @@ script: - if [ "$UNIT_TESTS" = true ]; then bin/phpunit --exclude-group=functional; fi - if [ "$FUNCTIONAL_TESTS" = true ]; then bin/test.sh --exclude-group=rdkafka; fi - if [ "RDKAFKA_TESTS" = true ]; then bin/test.sh --group=rdkafka; fi - + notifications: webhooks: urls: - https://webhooks.gitter.im/e/3f8b3668e7792de23a49 - on_success: change - on_failure: always - on_start: never + on_success: change + on_failure: always + on_start: never From 85c005f404a9a42a0d2d4f6a8d5bbb25d700e7ac Mon Sep 17 00:00:00 2001 From: Markus Bachmann Date: Sat, 23 Nov 2019 15:57:53 +0100 Subject: [PATCH 0707/1142] Fixes #984 --- .../DoctrineConnectionFactoryFactory.php | 6 +- .../DoctrineConnectionFactoryFactoryTest.php | 67 +++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php diff --git a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php index 06150e97e..b6e684cdd 100644 --- a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php +++ b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php @@ -2,7 +2,7 @@ namespace Enqueue\Doctrine; -use Doctrine\Bundle\DoctrineBundle\Registry; +use Doctrine\Common\Persistence\ManagerRegistry; use Enqueue\ConnectionFactoryFactoryInterface; use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Dsn\Dsn; @@ -11,7 +11,7 @@ class DoctrineConnectionFactoryFactory implements ConnectionFactoryFactoryInterface { /** - * @var Registry + * @var ManagerRegistry */ private $doctrine; @@ -20,7 +20,7 @@ class DoctrineConnectionFactoryFactory implements ConnectionFactoryFactoryInterf */ private $fallbackFactory; - public function __construct(Registry $doctrine, ConnectionFactoryFactoryInterface $fallbackFactory) + public function __construct(ManagerRegistry $doctrine, ConnectionFactoryFactoryInterface $fallbackFactory) { $this->doctrine = $doctrine; $this->fallbackFactory = $fallbackFactory; diff --git a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php new file mode 100644 index 000000000..5aca26dbf --- /dev/null +++ b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php @@ -0,0 +1,67 @@ +registry = $this->prophesize(ManagerRegistry::class); + $this->fallbackFactory = $this->prophesize(ConnectionFactoryFactoryInterface::class); + + $this->factory = new DoctrineConnectionFactoryFactory($this->registry->reveal(), $this->fallbackFactory->reveal()); + } + + public function testCreateWithoutArray() + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The config must be either array or DSN string.'); + + $this->factory->create(true); + } + + public function testCreateWithoutDsn() + { + $this->expectExceptionMessage(\InvalidArgumentException::class); + $this->expectExceptionMessage('The config must have dsn key set.'); + + $this->factory->create(['foo' => 'bar']); + } + + public function testCreateWithDoctrineSchema() + { + $this->assertInstanceOf( + ManagerRegistryConnectionFactory::class, + $this->factory->create('doctrine://localhost:3306') + ); + } + + public function testCreateFallback() + { + $this->fallbackFactory + ->create(['dsn' => 'fallback://']) + ->shouldBeCalled(); + + $this->factory->create(['dsn' => 'fallback://']); + } +} From d5e66403a6b2b4d5d6eac31e4c85d10e4bef0d60 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 28 Nov 2019 09:54:34 +0200 Subject: [PATCH 0708/1142] Release 0.9.15 --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 268a95db1..86f58e5e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## [0.9.15](https://github.com/php-enqueue/enqueue-dev/tree/0.9.15) (2019-11-28) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.14...0.9.15) + +**Merged pull requests:** + +- Fix Incompatibility for doctrine [\#988](https://github.com/php-enqueue/enqueue-dev/pull/988) ([Baachi](https://github.com/Baachi)) +- Prefer early returns in consumer code [\#982](https://github.com/php-enqueue/enqueue-dev/pull/982) ([Steveb-p](https://github.com/Steveb-p)) +- \#977 - Fix issues with MS SQL server and dbal transport [\#979](https://github.com/php-enqueue/enqueue-dev/pull/979) ([NeilWhitworth](https://github.com/NeilWhitworth)) +- Add header support for Symfony's produce command [\#965](https://github.com/php-enqueue/enqueue-dev/pull/965) ([TiMESPLiNTER](https://github.com/TiMESPLiNTER)) + ## [0.9.14](https://github.com/php-enqueue/enqueue-dev/tree/0.9.14) (2019-10-14) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.13...0.9.14) From 96b5e3a36d3278719c953dce3da28440dc1d2ad1 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 28 Nov 2019 21:53:25 +0100 Subject: [PATCH 0709/1142] Add support for php 7.4 --- .travis.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ecc11eaf0..994c91a98 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,12 @@ matrix: - php: 7.3 sudo: false env: SYMFONY_VERSION=4.2.* UNIT_TESTS=true + - php: 7.4snapshot + sudo: false + env: SYMFONY_VERSION=4.1.* UNIT_TESTS=true + - php: 7.4snapshot + sudo: false + env: SYMFONY_VERSION=4.2.* UNIT_TESTS=true - php: 7.1 services: docker sudo: required @@ -66,12 +72,12 @@ script: - if [ "$UNIT_TESTS" = true ]; then bin/phpunit --exclude-group=functional; fi - if [ "$FUNCTIONAL_TESTS" = true ]; then bin/test.sh --exclude-group=rdkafka; fi - if [ "RDKAFKA_TESTS" = true ]; then bin/test.sh --group=rdkafka; fi - + notifications: webhooks: urls: - https://webhooks.gitter.im/e/3f8b3668e7792de23a49 - on_success: change - on_failure: always - on_start: never + on_success: change + on_failure: always + on_start: never From af8c91c638e6e12952395175ea94fda7e6dded5c Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Tue, 3 Dec 2019 20:41:49 +0100 Subject: [PATCH 0710/1142] Use stable 7.4 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 994c91a98..5570bf4cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,10 +26,10 @@ matrix: - php: 7.3 sudo: false env: SYMFONY_VERSION=4.2.* UNIT_TESTS=true - - php: 7.4snapshot + - php: 7.4 sudo: false env: SYMFONY_VERSION=4.1.* UNIT_TESTS=true - - php: 7.4snapshot + - php: 7.4 sudo: false env: SYMFONY_VERSION=4.2.* UNIT_TESTS=true - php: 7.1 From 348563b5660f43fac72f56f381081250754a1787 Mon Sep 17 00:00:00 2001 From: Bram Gerritsen Date: Wed, 4 Dec 2019 10:20:27 +0100 Subject: [PATCH 0711/1142] Wrong parameter description --- docs/bundle/cli_commands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bundle/cli_commands.md b/docs/bundle/cli_commands.md index 3033c41a2..6c383f8c6 100644 --- a/docs/bundle/cli_commands.md +++ b/docs/bundle/cli_commands.md @@ -64,7 +64,7 @@ Arguments: message A message Options: - -c, --client[=CLIENT] The client to consume messages from. [default: "default"] + -c, --client[=CLIENT] The client to send messages to. [default: "default"] --topic[=TOPIC] The topic to send a message to --command[=COMMAND] The command to send a message to -h, --help Display this help message From 23d22f918a9bc20d1a40a1b0f186abfff1b9fae8 Mon Sep 17 00:00:00 2001 From: Mathieu Lemoine Date: Wed, 11 Dec 2019 16:32:12 +0100 Subject: [PATCH 0712/1142] Reduced dependency to voryx/Thruway --- .travis.yml | 4 + composer.json | 15 +- docker-compose.yml | 8 +- docker/thruway/Dockerfile | 13 ++ docker/thruway/WsRouter.php | 2 +- docs/monitoring.md | 2 +- docs/transport/wamp.md | 5 +- phpunit.xml.dist | 1 - pkg/amqp-bunny/Tests/AmqpConsumerTest.php | 7 +- pkg/amqp-bunny/Tests/AmqpContextTest.php | 3 +- pkg/amqp-bunny/Tests/AmqpProducerTest.php | 11 +- .../Tests/AmqpSubscriptionConsumerTest.php | 3 +- ...onConsumerConsumeUntilUnsubscribedTest.php | 2 +- pkg/amqp-bunny/phpunit.xml.dist | 1 - pkg/amqp-ext/Tests/AmqpConsumerTest.php | 3 +- pkg/amqp-ext/Tests/AmqpContextTest.php | 5 +- .../Tests/AmqpSubscriptionConsumerTest.php | 3 +- .../Functional/AmqpCommonUseCasesTest.php | 2 +- .../AmqpConsumptionUseCasesTest.php | 2 +- .../Tests/Functional/AmqpRpcUseCasesTest.php | 2 +- ...onConsumerConsumeUntilUnsubscribedTest.php | 2 +- pkg/amqp-ext/phpunit.xml.dist | 1 - pkg/amqp-lib/Tests/AmqpConsumerTest.php | 5 +- pkg/amqp-lib/Tests/AmqpContextTest.php | 5 +- pkg/amqp-lib/Tests/AmqpProducerTest.php | 9 +- .../Tests/AmqpSubscriptionConsumerTest.php | 3 +- ...riptionConsumerWithHeartbeatOnTickTest.php | 2 +- ...onConsumerConsumeUntilUnsubscribedTest.php | 2 +- pkg/amqp-lib/phpunit.xml.dist | 1 - .../RabbitMqDelayPluginDelayStrategyTest.php | 4 +- .../Tests/RabbitMqDlxDelayStrategyTest.php | 5 +- .../Tests/SignalSocketHelperTest.php | 2 +- pkg/async-command/RunCommandProcessor.php | 23 ++- pkg/async-command/composer.json | 3 +- .../AbstractAsyncEventDispatcher.php | 50 ++++++ .../AbstractAsyncListener.php | 65 ++++++++ .../AbstractPhpSerializerEventTransformer.php | 33 ++++ .../AsyncEventDispatcher.php | 82 ++++++---- pkg/async-event-dispatcher/AsyncListener.php | 130 ++++++++------- .../EventTransformer.php | 94 +++++++++-- .../PhpSerializerEventTransformer.php | 52 +++--- .../Tests/AsyncListenerTest.php | 15 +- .../Tests/AsyncProcessorTest.php | 7 +- .../Tests/Functional/UseCasesTest.php | 27 +++- .../PhpSerializerEventTransformerTest.php | 3 +- .../Tests/ProxyEventDispatcherTest.php | 13 +- pkg/async-event-dispatcher/composer.json | 3 +- pkg/async-event-dispatcher/phpunit.xml.dist | 1 - pkg/dbal/Tests/DbalConsumerTest.php | 9 +- pkg/dbal/Tests/DbalContextTest.php | 3 +- pkg/dbal/Tests/DbalProducerTest.php | 3 +- .../Tests/DbalSubscriptionConsumerTest.php | 5 +- .../Tests/Functional/DbalConsumerTest.php | 2 +- .../ManagerRegistryConnectionFactoryTest.php | 5 +- pkg/dbal/phpunit.xml.dist | 1 - pkg/dsn/phpunit.xml.dist | 1 - .../DoctrinePingConnectionExtension.php | 8 +- .../AbstractMessageQueueCollector.php | 97 +++++++++++ .../Profiler/MessageQueueCollector.php | 103 ++---------- .../Functional/App/AbstractAsyncListener.php | 52 ++++++ .../Tests/Functional/App/AsyncListener.php | 69 ++++---- .../App/TestAsyncEventTransformer.php | 151 +++++++++++++++--- .../Functional/App/TestAsyncListener.php | 3 +- .../Functional/App/TestAsyncSubscriber.php | 2 +- .../Tests/Functional/App/config/config.yml | 3 +- .../Functional/App/config/custom-config.yml | 5 +- .../Functional/Events/AsyncListenerTest.php | 27 +++- .../Functional/Events/AsyncSubscriberTest.php | 27 +++- .../Tests/Functional/LazyProducerTest.php | 2 +- .../Tests/Functional/UseCasesTest.php | 2 +- .../Tests/Functional/WebTestCase.php | 5 +- .../DoctrineClearIdentityMapExtensionTest.php | 5 +- ...ctrineClosedEntityManagerExtensionTest.php | 5 +- .../DoctrinePingConnectionExtensionTest.php | 11 +- .../Extension/ResetServicesExtensionTest.php | 3 +- .../Profiler/MessageQueueCollectorTest.php | 5 +- pkg/enqueue-bundle/composer.json | 9 +- pkg/enqueue-bundle/phpunit.xml.dist | 1 - .../DoctrineConnectionFactoryFactory.php | 6 +- pkg/enqueue/Symfony/Client/ConsumeCommand.php | 4 +- pkg/enqueue/Symfony/Client/ProduceCommand.php | 4 +- pkg/enqueue/Symfony/Client/RoutesCommand.php | 4 +- .../Symfony/Client/SetupBrokerCommand.php | 4 +- .../ConfigurableConsumeCommand.php | 4 +- .../Symfony/Consumption/ConsumeCommand.php | 4 +- .../Tests/ArrayProcessorRegistryTest.php | 3 +- .../Tests/Client/ChainExtensionTest.php | 2 +- .../DelayRedeliveredMessageExtensionTest.php | 11 +- .../ExclusiveCommandExtensionTest.php | 9 +- .../FlushSpoolProducerExtensionTest.php | 5 +- .../ConsumptionExtension/LogExtensionTest.php | 9 +- .../SetRouterPropertiesExtensionTest.php | 9 +- .../SetupBrokerExtensionTest.php | 3 +- .../Tests/Client/DelegateProcessorTest.php | 7 +- .../Client/Driver/GenericDriverTestsTrait.php | 6 +- .../Client/Driver/RabbitMqStompDriverTest.php | 4 +- .../Driver/StompManagementClientTest.php | 8 +- .../Tests/Client/DriverPreSendTest.php | 4 +- pkg/enqueue/Tests/Client/PostSendTest.php | 8 +- pkg/enqueue/Tests/Client/PreSendTest.php | 4 +- .../Tests/Client/ProducerSendCommandTest.php | 4 +- .../Tests/Client/ProducerSendEventTest.php | 4 +- pkg/enqueue/Tests/Client/ProducerTest.php | 4 +- .../Tests/Client/RouterProcessorTest.php | 2 +- .../Tests/Client/SpoolProducerTest.php | 2 +- .../Tests/Client/TraceableProducerTest.php | 2 +- .../Tests/Consumption/ChainExtensionTest.php | 13 +- .../LimitConsumedMessagesExtensionTest.php | 7 +- .../LimitConsumerMemoryExtensionTest.php | 10 +- .../LimitConsumptionTimeExtensionTest.php | 7 +- .../Extension/LogExtensionTest.php | 9 +- .../Extension/LoggerExtensionTest.php | 3 +- .../Extension/NicenessExtensionTest.php | 3 +- .../Extension/ReplyExtensionTest.php | 7 +- .../FallbackSubscriptionConsumerTest.php | 4 +- .../Tests/Consumption/QueueConsumerTest.php | 16 +- .../RouteRecipientListProcessorTest.php | 6 +- pkg/enqueue/Tests/Rpc/RpcClientTest.php | 7 +- .../Symfony/Client/ConsumeCommandTest.php | 14 +- .../Client/FlushSpoolProducerListenerTest.php | 2 +- .../Mock/SetupBrokerExtensionCommand.php | 4 +- .../Symfony/Client/ProduceCommandTest.php | 2 +- .../Symfony/Client/RoutesCommandTest.php | 2 +- .../Symfony/Client/SetupBrokerCommandTest.php | 2 +- .../Client/SimpleConsumeCommandTest.php | 6 +- .../Client/SimpleProduceCommandTest.php | 2 +- .../Client/SimpleRoutesCommandTest.php | 4 +- .../Client/SimpleSetupBrokerCommandTest.php | 2 +- .../ConfigurableConsumeCommandTest.php | 6 +- .../Consumption/ConsumeCommandTest.php | 10 +- .../Mock/LimitsExtensionsCommand.php | 4 +- .../Mock/QueueConsumerOptionsCommand.php | 4 +- .../QueueConsumerOptionsCommandTraitTest.php | 2 +- .../Consumption/SimpleConsumeCommandTest.php | 2 +- .../ContainerProcessorRegistryTest.php | 4 +- .../Tests/Symfony/LazyProducerTest.php | 4 +- pkg/enqueue/Tests/Util/JSONTest.php | 15 +- pkg/enqueue/composer.json | 3 +- pkg/enqueue/phpunit.xml.dist | 1 - pkg/fs/Tests/FsConsumerTest.php | 4 +- pkg/fs/Tests/FsProducerTest.php | 2 +- .../Tests/Functional/FsCommonUseCasesTest.php | 2 +- pkg/fs/Tests/Functional/FsConsumerTest.php | 2 +- .../Functional/FsConsumptionUseCasesTest.php | 2 +- pkg/fs/Tests/Functional/FsContextTest.php | 2 +- pkg/fs/Tests/Functional/FsProducerTest.php | 2 +- pkg/fs/Tests/Functional/FsRpcUseCasesTest.php | 2 +- pkg/fs/composer.json | 5 +- pkg/fs/phpunit.xml.dist | 1 - pkg/gearman/Tests/GearmanProducerTest.php | 3 +- pkg/gearman/phpunit.xml.dist | 1 - pkg/gps/Tests/GpsConsumerTest.php | 6 +- pkg/gps/Tests/GpsContextTest.php | 2 +- pkg/gps/Tests/GpsProducerTest.php | 6 +- pkg/gps/phpunit.xml.dist | 1 - .../CalculateRootJobStatusProcessorTest.php | 11 +- .../CalculateRootJobStatusServiceTest.php | 9 +- .../Tests/DependentJobProcessorTest.php | 9 +- .../Tests/DependentJobServiceTest.php | 6 +- .../Tests/Doctrine/JobStorageTest.php | 28 ++-- .../Tests/Functional/Job/JobStorageTest.php | 2 +- .../Tests/Functional/WebTestCase.php | 4 +- .../Tests/Functional/app/config/config.yml | 5 +- pkg/job-queue/Tests/JobProcessorTest.php | 53 +++--- pkg/job-queue/Tests/JobRunnerTest.php | 6 +- pkg/job-queue/composer.json | 7 +- pkg/job-queue/phpunit.xml.dist | 1 - .../Tests/Functional/MongodbConsumerTest.php | 2 +- pkg/mongodb/Tests/MongodbConsumerTest.php | 4 +- pkg/mongodb/Tests/MongodbContextTest.php | 2 +- pkg/mongodb/Tests/MongodbProducerTest.php | 2 +- .../Tests/MongodbSubscriptionConsumerTest.php | 4 +- pkg/mongodb/composer.json | 2 +- pkg/mongodb/phpunit.xml.dist | 1 - pkg/monitoring/phpunit.xml.dist | 1 - pkg/null/phpunit.xml.dist | 1 - .../Tests/PheanstalkConsumerTest.php | 2 +- .../Tests/PheanstalkContextTest.php | 2 +- .../Tests/PheanstalkProducerTest.php | 3 +- pkg/pheanstalk/phpunit.xml.dist | 1 - pkg/rdkafka/Tests/RdKafkaConsumerTest.php | 6 +- pkg/rdkafka/Tests/RdKafkaProducerTest.php | 6 +- pkg/rdkafka/phpunit.xml.dist | 1 - .../Functional/PRedisCommonUseCasesTest.php | 2 +- .../PRedisConsumptionUseCasesTest.php | 2 +- .../Functional/PhpRedisCommonUseCasesTest.php | 2 +- .../PhpRedisConsumptionUseCasesTest.php | 2 +- pkg/redis/Tests/RedisConsumerTest.php | 6 +- pkg/redis/Tests/RedisContextTest.php | 2 +- pkg/redis/Tests/RedisProducerTest.php | 4 +- .../Tests/RedisSubscriptionConsumerTest.php | 4 +- pkg/redis/phpunit.xml.dist | 1 - pkg/simple-client/composer.json | 5 +- pkg/simple-client/phpunit.xml.dist | 1 - pkg/sns/Tests/SnsProducerTest.php | 4 +- pkg/sns/phpunit.xml.dist | 1 - pkg/snsqs/Tests/SnsQsProducerTest.php | 4 +- .../SnsQsSendToAndReceiveFromQueueTest.php | 2 +- ...sQsSendToAndReceiveNoWaitFromQueueTest.php | 2 +- ...nsQsSendToTopicAndReceiveFromQueueSpec.php | 2 +- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 2 +- pkg/snsqs/phpunit.xml.dist | 1 - .../Functional/SqsCommonUseCasesTest.php | 2 +- ...dAndReceiveDelayedMessageFromQueueTest.php | 2 +- .../Spec/SqsSendToAndReceiveFromQueueTest.php | 2 +- .../Spec/SqsSendToAndReceiveFromTopicTest.php | 2 +- ...SqsSendToAndReceiveNoWaitFromQueueTest.php | 2 +- ...SqsSendToAndReceiveNoWaitFromTopicTest.php | 2 +- .../SqsSendToTopicAndReceiveFromQueueTest.php | 2 +- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 2 +- pkg/sqs/Tests/SqsConsumerTest.php | 6 +- pkg/sqs/Tests/SqsContextTest.php | 2 +- pkg/sqs/Tests/SqsProducerTest.php | 4 +- pkg/sqs/phpunit.xml.dist | 1 - pkg/stomp/Tests/BufferedStompClientTest.php | 2 +- .../Functional/StompCommonUseCasesTest.php | 2 +- .../StompConsumptionUseCasesTest.php | 2 +- .../Tests/Functional/StompRpcUseCasesTest.php | 2 +- pkg/stomp/Tests/StompConsumerTest.php | 4 +- pkg/stomp/Tests/StompContextTest.php | 2 +- pkg/stomp/Tests/StompProducerTest.php | 2 +- pkg/stomp/phpunit.xml.dist | 1 - pkg/test/GpsExtension.php | 3 +- pkg/test/RabbitmqAmqpExtension.php | 3 +- pkg/test/RabbitmqStompExtension.php | 3 +- pkg/test/RedisExtension.php | 5 +- pkg/test/RetryTrait.php | 9 +- pkg/test/SnsExtension.php | 3 +- pkg/test/SnsQsExtension.php | 3 +- pkg/test/SqsExtension.php | 3 +- pkg/test/WampExtension.php | 3 +- pkg/wamp/README.md | 2 +- pkg/wamp/composer.json | 4 +- pkg/wamp/phpunit.xml.dist | 1 - 234 files changed, 1288 insertions(+), 760 deletions(-) create mode 100644 docker/thruway/Dockerfile create mode 100644 pkg/async-event-dispatcher/AbstractAsyncEventDispatcher.php create mode 100644 pkg/async-event-dispatcher/AbstractAsyncListener.php create mode 100644 pkg/async-event-dispatcher/AbstractPhpSerializerEventTransformer.php create mode 100644 pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php create mode 100644 pkg/enqueue-bundle/Tests/Functional/App/AbstractAsyncListener.php diff --git a/.travis.yml b/.travis.yml index 8b8f41522..d19429608 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,6 +46,10 @@ matrix: sudo: required services: docker env: SYMFONY_VERSION=4.0.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true + - php: 7.3 + sudo: required + services: docker + env: SYMFONY_VERSION=5.0.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - php: 7.1 sudo: required services: docker diff --git a/composer.json b/composer.json index 6a115bf02..78f3d42de 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "ext-amqp": "^1.9.3", "ext-gearman": "^2.0", - "ext-mongodb": "^1.3", + "ext-mongodb": "^1.5", "ext-rdkafka": "^3.0.3", "queue-interop/amqp-interop": "^0.8", @@ -35,14 +35,14 @@ "php-http/client-common": "^1.7@dev", "richardfullmer/rabbitmq-management-api": "^2.0", "predis/predis": "^1.1", + "thruway/client": "^0.5.0", "thruway/pawl-transport": "^0.5.0", - "voryx/thruway": "^0.5.3", "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3" }, "require-dev": { - "phpunit/phpunit": "^5.5", - "phpstan/phpstan": "^0.10", + "phpunit/phpunit": "^7.5", + "phpstan/phpstan": "^0.12", "queue-interop/queue-spec": "^0.6", "symfony/browser-kit": "^3.4|^4", "symfony/config": "^3.4|^4", @@ -54,9 +54,10 @@ "symfony/http-kernel": "^3.4|^4", "symfony/filesystem": "^3.4|^4", "symfony/framework-bundle": "^3.4|^4", + "symfony/yaml": "^3.4|^4|^5", "empi89/php-amqp-stubs": "*@dev", - "doctrine/doctrine-bundle": "~1.2", - "doctrine/mongodb-odm-bundle": "^3.5", + "doctrine/doctrine-bundle": "~1.2|^2", + "doctrine/mongodb-odm-bundle": "^3.5|^4", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^1.0.2", "friendsofphp/php-cs-fixer": "^2" @@ -112,7 +113,7 @@ "ext-amqp": "1.9.3", "ext-gearman": "2.0.3", "ext-rdkafka": "3.3", - "ext-mongodb": "1.3", + "ext-mongodb": "1.5", "ext-bcmath": "1", "ext-mbstring": "1", "ext-mongo": "1.6.14" diff --git a/docker-compose.yml b/docker-compose.yml index 87260d4e0..ddae063b4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -117,15 +117,9 @@ services: - "27017:27017" thruway: - image: formapro/nginx-php-fpm:latest-all-exts + build: './docker/thruway' ports: - '9090:9090' - working_dir: '/app' - volumes: - - './:/app' - entrypoint: - - '/usr/bin/php' - - 'docker/thruway/WsRouter.php' localstack: image: 'localstack/localstack:latest' diff --git a/docker/thruway/Dockerfile b/docker/thruway/Dockerfile new file mode 100644 index 000000000..c9e795478 --- /dev/null +++ b/docker/thruway/Dockerfile @@ -0,0 +1,13 @@ +FROM formapro/nginx-php-fpm:latest-all-exts + +RUN mkdir -p /thruway +WORKDIR /thruway + +# Thruway router +COPY --from=composer /usr/bin/composer /usr/bin/composer +RUN COMPOSER_HOME=/thruway composer global require --prefer-dist --no-scripts voryx/thruway + +COPY WsRouter.php . + +CMD ["/usr/bin/php", "WsRouter.php"] + diff --git a/docker/thruway/WsRouter.php b/docker/thruway/WsRouter.php index 36b7eb0dc..ee5bb948a 100644 --- a/docker/thruway/WsRouter.php +++ b/docker/thruway/WsRouter.php @@ -1,6 +1,6 @@ diff --git a/pkg/amqp-bunny/Tests/AmqpConsumerTest.php b/pkg/amqp-bunny/Tests/AmqpConsumerTest.php index 4f1f1a4c5..a588c2e56 100644 --- a/pkg/amqp-bunny/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpConsumerTest.php @@ -14,6 +14,7 @@ use Interop\Amqp\Impl\AmqpQueue; use Interop\Queue\Consumer; use Interop\Queue\Exception\InvalidMessageException; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpConsumerTest extends TestCase @@ -205,7 +206,7 @@ public function testShouldReturnMessageOnReceiveWithReceiveMethodBasicGet() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Client + * @return MockObject|Client */ public function createClientMock() { @@ -213,7 +214,7 @@ public function createClientMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AmqpContext + * @return MockObject|AmqpContext */ public function createContextMock() { @@ -221,7 +222,7 @@ public function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Channel + * @return MockObject|Channel */ public function createBunnyChannelMock() { diff --git a/pkg/amqp-bunny/Tests/AmqpContextTest.php b/pkg/amqp-bunny/Tests/AmqpContextTest.php index 74b3534bc..69d9b5012 100644 --- a/pkg/amqp-bunny/Tests/AmqpContextTest.php +++ b/pkg/amqp-bunny/Tests/AmqpContextTest.php @@ -9,6 +9,7 @@ use Interop\Amqp\Impl\AmqpBind; use Interop\Amqp\Impl\AmqpQueue; use Interop\Amqp\Impl\AmqpTopic; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpContextTest extends TestCase @@ -244,7 +245,7 @@ public function testShouldReturnExpectedSubscriptionConsumerInstance() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Channel + * @return MockObject|Channel */ public function createChannelMock() { diff --git a/pkg/amqp-bunny/Tests/AmqpProducerTest.php b/pkg/amqp-bunny/Tests/AmqpProducerTest.php index df33598b2..e9244297c 100644 --- a/pkg/amqp-bunny/Tests/AmqpProducerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpProducerTest.php @@ -17,6 +17,7 @@ use Interop\Queue\Exception\InvalidMessageException; use Interop\Queue\Message; use Interop\Queue\Producer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpProducerTest extends TestCase @@ -200,7 +201,7 @@ public function testShouldPropagateFlags() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Message + * @return MockObject|Message */ private function createMessageMock() { @@ -208,7 +209,7 @@ private function createMessageMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Destination + * @return MockObject|Destination */ private function createDestinationMock() { @@ -216,7 +217,7 @@ private function createDestinationMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Channel + * @return MockObject|Channel */ private function createBunnyChannelMock() { @@ -224,7 +225,7 @@ private function createBunnyChannelMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AmqpContext + * @return MockObject|AmqpContext */ private function createContextMock() { @@ -232,7 +233,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DelayStrategy + * @return MockObject|DelayStrategy */ private function createDelayStrategyMock() { diff --git a/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php index fbc3bcbce..c1d056268 100644 --- a/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php @@ -5,6 +5,7 @@ use Enqueue\AmqpBunny\AmqpContext; use Enqueue\AmqpBunny\AmqpSubscriptionConsumer; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpSubscriptionConsumerTest extends TestCase @@ -22,7 +23,7 @@ public function testCouldBeConstructedWithAmqpContextAsFirstArgument() } /** - * @return AmqpContext|\PHPUnit_Framework_MockObject_MockObject + * @return AmqpContext|MockObject */ private function createAmqpContextMock() { diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php index 63a3206be..a1f4ac57f 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -13,7 +13,7 @@ */ class AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest extends SubscriptionConsumerConsumeUntilUnsubscribedSpec { - protected function tearDown() + protected function tearDown(): void { if ($this->subscriptionConsumer) { $this->subscriptionConsumer->unsubscribeAll(); diff --git a/pkg/amqp-bunny/phpunit.xml.dist b/pkg/amqp-bunny/phpunit.xml.dist index 7d6c5ed3e..0db15a427 100644 --- a/pkg/amqp-bunny/phpunit.xml.dist +++ b/pkg/amqp-bunny/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/amqp-ext/Tests/AmqpConsumerTest.php b/pkg/amqp-ext/Tests/AmqpConsumerTest.php index bb515dda5..75c49cf01 100644 --- a/pkg/amqp-ext/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-ext/Tests/AmqpConsumerTest.php @@ -7,6 +7,7 @@ use Enqueue\Test\ClassExtensionTrait; use Interop\Amqp\Impl\AmqpQueue; use Interop\Queue\Consumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpConsumerTest extends TestCase @@ -24,7 +25,7 @@ public function testCouldBeConstructedWithContextAndQueueAsArguments() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AmqpContext + * @return MockObject|AmqpContext */ private function createContext() { diff --git a/pkg/amqp-ext/Tests/AmqpContextTest.php b/pkg/amqp-ext/Tests/AmqpContextTest.php index fa5c40969..bcf3b2200 100644 --- a/pkg/amqp-ext/Tests/AmqpContextTest.php +++ b/pkg/amqp-ext/Tests/AmqpContextTest.php @@ -14,6 +14,7 @@ use Interop\Amqp\Impl\AmqpTopic; use Interop\Queue\Context; use Interop\Queue\Exception\InvalidDestinationException; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpContextTest extends TestCase @@ -243,7 +244,7 @@ public function testShouldReturnExpectedSubscriptionConsumerInstance() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|\AMQPChannel + * @return MockObject|\AMQPChannel */ private function createExtChannelMock() { @@ -251,7 +252,7 @@ private function createExtChannelMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|\AMQPChannel + * @return MockObject|\AMQPChannel */ private function createExtConnectionMock() { diff --git a/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php index 3650d6e1b..153fe275e 100644 --- a/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php @@ -5,6 +5,7 @@ use Enqueue\AmqpExt\AmqpContext; use Enqueue\AmqpExt\AmqpSubscriptionConsumer; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpSubscriptionConsumerTest extends TestCase @@ -22,7 +23,7 @@ public function testCouldBeConstructedWithAmqpContextAsFirstArgument() } /** - * @return AmqpContext|\PHPUnit_Framework_MockObject_MockObject + * @return AmqpContext|MockObject */ private function createAmqpContextMock() { diff --git a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php index 294248e4e..ee73345e9 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php @@ -30,7 +30,7 @@ public function setUp() $this->removeExchange('amqp_ext.test_exchange'); } - public function tearDown() + public function tearDown(): void { $this->amqpContext->close(); } diff --git a/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php index b480a1757..220554859 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php @@ -36,7 +36,7 @@ public function setUp() $this->removeQueue('amqp_ext.test'); } - public function tearDown() + public function tearDown(): void { $this->amqpContext->close(); } diff --git a/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php index bbc94423a..9e5dc4df3 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php @@ -31,7 +31,7 @@ public function setUp() $this->removeQueue('rpc.reply_test'); } - public function tearDown() + public function tearDown(): void { $this->amqpContext->close(); } diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php index e77f657d6..ccb13bb89 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -13,7 +13,7 @@ */ class AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest extends SubscriptionConsumerConsumeUntilUnsubscribedSpec { - protected function tearDown() + protected function tearDown(): void { if ($this->subscriptionConsumer) { $this->subscriptionConsumer->unsubscribeAll(); diff --git a/pkg/amqp-ext/phpunit.xml.dist b/pkg/amqp-ext/phpunit.xml.dist index 4dca142e1..b24485336 100644 --- a/pkg/amqp-ext/phpunit.xml.dist +++ b/pkg/amqp-ext/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/amqp-lib/Tests/AmqpConsumerTest.php b/pkg/amqp-lib/Tests/AmqpConsumerTest.php index 854f38cd6..16b59227c 100644 --- a/pkg/amqp-lib/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-lib/Tests/AmqpConsumerTest.php @@ -12,6 +12,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Exception\InvalidMessageException; use PhpAmqpLib\Channel\AMQPChannel; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpConsumerTest extends TestCase @@ -183,7 +184,7 @@ public function testShouldReturnMessageOnReceiveWithReceiveMethodBasicGet() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AmqpContext + * @return MockObject|AmqpContext */ public function createContextMock() { @@ -191,7 +192,7 @@ public function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AMQPChannel + * @return MockObject|AMQPChannel */ public function createLibChannelMock() { diff --git a/pkg/amqp-lib/Tests/AmqpContextTest.php b/pkg/amqp-lib/Tests/AmqpContextTest.php index 1fd8d8853..4cfde3c14 100644 --- a/pkg/amqp-lib/Tests/AmqpContextTest.php +++ b/pkg/amqp-lib/Tests/AmqpContextTest.php @@ -10,6 +10,7 @@ use PhpAmqpLib\Channel\AMQPChannel; use PhpAmqpLib\Connection\AbstractConnection; use PhpAmqpLib\Wire\AMQPTable; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpContextTest extends TestCase @@ -350,7 +351,7 @@ public function testShouldReturnExpectedSubscriptionConsumerInstance() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AbstractConnection + * @return MockObject|AbstractConnection */ public function createConnectionMock() { @@ -358,7 +359,7 @@ public function createConnectionMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AMQPChannel + * @return MockObject|AMQPChannel */ public function createChannelMock() { diff --git a/pkg/amqp-lib/Tests/AmqpProducerTest.php b/pkg/amqp-lib/Tests/AmqpProducerTest.php index 59fc82155..0bce53361 100644 --- a/pkg/amqp-lib/Tests/AmqpProducerTest.php +++ b/pkg/amqp-lib/Tests/AmqpProducerTest.php @@ -16,6 +16,7 @@ use PhpAmqpLib\Channel\AMQPChannel; use PhpAmqpLib\Message\AMQPMessage as LibAMQPMessage; use PhpAmqpLib\Wire\AMQPTable; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpProducerTest extends TestCase @@ -142,7 +143,7 @@ public function testShouldSetMessageProperties() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Message + * @return MockObject|Message */ private function createMessageMock() { @@ -150,7 +151,7 @@ private function createMessageMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Destination + * @return MockObject|Destination */ private function createDestinationMock() { @@ -158,7 +159,7 @@ private function createDestinationMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AMQPChannel + * @return MockObject|AMQPChannel */ private function createAmqpChannelMock() { @@ -166,7 +167,7 @@ private function createAmqpChannelMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AmqpContext + * @return MockObject|AmqpContext */ private function createContextMock() { diff --git a/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php index 028d3067e..a87349771 100644 --- a/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php @@ -5,6 +5,7 @@ use Enqueue\AmqpLib\AmqpContext; use Enqueue\AmqpLib\AmqpSubscriptionConsumer; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpSubscriptionConsumerTest extends TestCase @@ -22,7 +23,7 @@ public function testCouldBeConstructedWithAmqpContextAndHeartbeatOnTickAsArgumen } /** - * @return AmqpContext|\PHPUnit_Framework_MockObject_MockObject + * @return AmqpContext|MockObject */ private function createAmqpContextMock() { diff --git a/pkg/amqp-lib/Tests/Functional/AmqpSubscriptionConsumerWithHeartbeatOnTickTest.php b/pkg/amqp-lib/Tests/Functional/AmqpSubscriptionConsumerWithHeartbeatOnTickTest.php index aea380d17..4d5b695e5 100644 --- a/pkg/amqp-lib/Tests/Functional/AmqpSubscriptionConsumerWithHeartbeatOnTickTest.php +++ b/pkg/amqp-lib/Tests/Functional/AmqpSubscriptionConsumerWithHeartbeatOnTickTest.php @@ -20,7 +20,7 @@ class AmqpSubscriptionConsumerWithHeartbeatOnTickTest extends TestCase */ private $context; - protected function tearDown() + protected function tearDown(): void { if ($this->context) { $this->context->close(); diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php index 371e9a53c..a8bd48e01 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -13,7 +13,7 @@ */ class AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest extends SubscriptionConsumerConsumeUntilUnsubscribedSpec { - protected function tearDown() + protected function tearDown(): void { if ($this->subscriptionConsumer) { $this->subscriptionConsumer->unsubscribeAll(); diff --git a/pkg/amqp-lib/phpunit.xml.dist b/pkg/amqp-lib/phpunit.xml.dist index f6b8b173a..258e20c5e 100644 --- a/pkg/amqp-lib/phpunit.xml.dist +++ b/pkg/amqp-lib/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php b/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php index 17a8b2a5f..d3658a558 100644 --- a/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php +++ b/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php @@ -166,7 +166,7 @@ public function testShouldThrowExceptionIfInvalidDestination() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AmqpContext + * @return \PHPUnit\Framework\MockObject\MockObject|AmqpContext */ private function createContextMock() { @@ -174,7 +174,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|TestProducer + * @return \PHPUnit\Framework\MockObject\MockObject|TestProducer */ private function createProducerMock() { diff --git a/pkg/amqp-tools/Tests/RabbitMqDlxDelayStrategyTest.php b/pkg/amqp-tools/Tests/RabbitMqDlxDelayStrategyTest.php index 8a45f8963..f519f8da3 100644 --- a/pkg/amqp-tools/Tests/RabbitMqDlxDelayStrategyTest.php +++ b/pkg/amqp-tools/Tests/RabbitMqDlxDelayStrategyTest.php @@ -12,6 +12,7 @@ use Interop\Amqp\Impl\AmqpQueue; use Interop\Amqp\Impl\AmqpTopic; use Interop\Queue\Exception\InvalidDestinationException; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class RabbitMqDlxDelayStrategyTest extends TestCase @@ -181,7 +182,7 @@ public function testShouldThrowExceptionIfInvalidDestination() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AmqpContext + * @return MockObject|AmqpContext */ private function createContextMock() { @@ -189,7 +190,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AmqpProducer + * @return MockObject|AmqpProducer */ private function createProducerMock() { diff --git a/pkg/amqp-tools/Tests/SignalSocketHelperTest.php b/pkg/amqp-tools/Tests/SignalSocketHelperTest.php index c8a10d80d..d869878c9 100644 --- a/pkg/amqp-tools/Tests/SignalSocketHelperTest.php +++ b/pkg/amqp-tools/Tests/SignalSocketHelperTest.php @@ -34,7 +34,7 @@ public function setUp() $this->signalHelper = new SignalSocketHelper(); } - public function tearDown() + public function tearDown(): void { parent::tearDown(); diff --git a/pkg/async-command/RunCommandProcessor.php b/pkg/async-command/RunCommandProcessor.php index f1495f399..2c4462f90 100644 --- a/pkg/async-command/RunCommandProcessor.php +++ b/pkg/async-command/RunCommandProcessor.php @@ -34,7 +34,11 @@ public function process(Message $message, Context $context): Result $phpBin = (new PhpExecutableFinder())->find(); $consoleBin = file_exists($this->projectDir.'/bin/console') ? './bin/console' : './app/console'; - $process = new Process($phpBin.' '.$consoleBin.' '.$this->getCommandLine($command), $this->projectDir); + $process = new Process(array_merge( + [$phpBin, $consoleBin, $command->getCommand()], + $command->getArguments(), + $this->getCommandLineOptions($command) + ), $this->projectDir); $process->setTimeout($this->timeout); $process->run(); @@ -48,22 +52,15 @@ public function process(Message $message, Context $context): Result } /** - * @return string + * @return string[] */ - private function getCommandLine(RunCommand $command): string + private function getCommandLineOptions(RunCommand $command): array { - $optionsString = ''; + $options = []; foreach ($command->getOptions() as $name => $value) { - $optionsString .= " $name=$value"; + $options[] = "$name=$value"; } - $optionsString = trim($optionsString); - $argumentsString = ''; - foreach ($command->getArguments() as $value) { - $argumentsString .= " $value"; - } - $argumentsString = trim($argumentsString); - - return trim($command->getCommand().' '.$argumentsString.' '.$optionsString); + return $options; } } diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index b4e4d90bc..e886a0c09 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -13,11 +13,12 @@ "symfony/process": "^3.4|^4|^5" }, "require-dev": { - "phpunit/phpunit": "~5.5", + "phpunit/phpunit": "~7.5", "symfony/dependency-injection": "^3.4|^4|^5", "symfony/config": "^3.4|^4|^5", "symfony/http-kernel": "^3.4|^4|^5", "symfony/filesystem": "^3.4|^4|^5", + "symfony/yaml": "^3.4|^4|^5", "enqueue/null": "0.9.x-dev", "enqueue/fs": "0.9.x-dev", "enqueue/test": "0.9.x-dev" diff --git a/pkg/async-event-dispatcher/AbstractAsyncEventDispatcher.php b/pkg/async-event-dispatcher/AbstractAsyncEventDispatcher.php new file mode 100644 index 000000000..c1feb0267 --- /dev/null +++ b/pkg/async-event-dispatcher/AbstractAsyncEventDispatcher.php @@ -0,0 +1,50 @@ +trueEventDispatcher = $trueEventDispatcher; + $this->asyncListener = $asyncListener; + } + + /** + * This method dispatches only those listeners that were marked as async. + * + * @param string $eventName + * @param ContractEvent|Event|null $event + */ + public function dispatchAsyncListenersOnly($eventName, $event = null) + { + try { + $this->asyncListener->syncMode($eventName); + + $this->parentDispatch($event, $eventName); + } finally { + $this->asyncListener->resetSyncMode(); + } + } + + abstract protected function parentDispatch($event, $eventName); +} diff --git a/pkg/async-event-dispatcher/AbstractAsyncListener.php b/pkg/async-event-dispatcher/AbstractAsyncListener.php new file mode 100644 index 000000000..fbf8e1930 --- /dev/null +++ b/pkg/async-event-dispatcher/AbstractAsyncListener.php @@ -0,0 +1,65 @@ +context = $context; + $this->registry = $registry; + $this->eventQueue = $eventQueue instanceof Queue ? $eventQueue : $context->createQueue($eventQueue); + } + + public function resetSyncMode() + { + $this->syncMode = []; + } + + /** + * @param string $eventName + */ + public function syncMode($eventName) + { + $this->syncMode[$eventName] = true; + } + + /** + * @param string $eventName + * + * @return bool + */ + public function isSyncMode($eventName) + { + return isset($this->syncMode[$eventName]); + } +} diff --git a/pkg/async-event-dispatcher/AbstractPhpSerializerEventTransformer.php b/pkg/async-event-dispatcher/AbstractPhpSerializerEventTransformer.php new file mode 100644 index 000000000..d713e01c6 --- /dev/null +++ b/pkg/async-event-dispatcher/AbstractPhpSerializerEventTransformer.php @@ -0,0 +1,33 @@ +context = $context; + } + + /** + * {@inheritdoc} + */ + public function toEvent($eventName, Message $message) + { + return unserialize($message->getBody()); + } +} diff --git a/pkg/async-event-dispatcher/AsyncEventDispatcher.php b/pkg/async-event-dispatcher/AsyncEventDispatcher.php index c74d9745b..44ecd1dd9 100644 --- a/pkg/async-event-dispatcher/AsyncEventDispatcher.php +++ b/pkg/async-event-dispatcher/AsyncEventDispatcher.php @@ -3,55 +3,69 @@ namespace Enqueue\AsyncEventDispatcher; use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\EventDispatcher; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; -class AsyncEventDispatcher extends EventDispatcher -{ +if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * @var EventDispatcherInterface + * Symfony < 4.3 */ - private $trueEventDispatcher; + class AsyncEventDispatcher extends AbstractAsyncEventDispatcher + { + /** + * {@inheritdoc} + */ + public function dispatch($eventName, Event $event = null) + { + $this->parentDispatch($event, $eventName); - /** - * @var AsyncListener - */ - private $asyncListener; + $this->trueEventDispatcher->dispatch($eventName, $event); + } - /** - * @param EventDispatcherInterface $trueEventDispatcher - * @param AsyncListener $asyncListener - */ - public function __construct(EventDispatcherInterface $trueEventDispatcher, AsyncListener $asyncListener) - { - $this->trueEventDispatcher = $trueEventDispatcher; - $this->asyncListener = $asyncListener; + protected function parentDispatch($event, $eventName) + { + parent::dispatch($eventName, $event); + } } - +} elseif (class_exists(Event::class)) { /** - * This method dispatches only those listeners that were marked as async. - * - * @param string $eventName - * @param Event|null $event + * Symfony >= 4.3 and < 5.0 */ - public function dispatchAsyncListenersOnly($eventName, Event $event = null) + class AsyncEventDispatcher extends AbstractAsyncEventDispatcher { - try { - $this->asyncListener->syncMode($eventName); + /** + * {@inheritdoc} + */ + public function dispatch($event, $eventName = null) + { + $this->parentDispatch($event, $eventName); - parent::dispatch($eventName, $event); - } finally { - $this->asyncListener->resetSyncMode(); + return $this->trueEventDispatcher->dispatch($event, $eventName); } - } + protected function parentDispatch($event, $eventName) + { + parent::dispatch($event, $eventName); + } + } +} else { /** - * {@inheritdoc} + * Symfony >= 5.0 */ - public function dispatch($eventName, Event $event = null) + class AsyncEventDispatcher extends AbstractAsyncEventDispatcher { - parent::dispatch($eventName, $event); + /** + * {@inheritdoc} + */ + public function dispatch(object $event, string $eventName = null): object + { + $this->parentDispatch($event, $eventName); + + return $this->trueEventDispatcher->dispatch($event, $eventName); + } - $this->trueEventDispatcher->dispatch($eventName, $event); + protected function parentDispatch($event, $eventName) + { + return parent::dispatch($event, $eventName); + } } } diff --git a/pkg/async-event-dispatcher/AsyncListener.php b/pkg/async-event-dispatcher/AsyncListener.php index 54f4cf24c..e3ea3bec1 100644 --- a/pkg/async-event-dispatcher/AsyncListener.php +++ b/pkg/async-event-dispatcher/AsyncListener.php @@ -2,86 +2,96 @@ namespace Enqueue\AsyncEventDispatcher; -use Interop\Queue\Context; -use Interop\Queue\Queue; use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; +use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -class AsyncListener -{ +if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * @var Context + * Symfony < 4.3 */ - private $context; - - /** - * @var Registry - */ - private $registry; + class AsyncListener extends AbstractAsyncListener + { + public function __invoke(Event $event, $eventName) + { + $this->onEvent($event, $eventName); + } - /** - * @var Queue - */ - private $eventQueue; + /** + * @param Event $event + * @param string $eventName + */ + public function onEvent(Event $event, $eventName) + { + if (false == isset($this->syncMode[$eventName])) { + $transformerName = $this->registry->getTransformerNameForEvent($eventName); - /** - * @var bool - */ - private $syncMode; + $message = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); + $message->setProperty('event_name', $eventName); + $message->setProperty('transformer_name', $transformerName); + $this->context->createProducer()->send($this->eventQueue, $message); + } + } + } +} elseif (class_exists(Event::class)) { /** - * @param Context $context - * @param Registry $registry - * @param Queue|string $eventQueue + * Symfony >= 4.3 and < 5.0 */ - public function __construct(Context $context, Registry $registry, $eventQueue) + class AsyncListener extends AbstractAsyncListener { - $this->context = $context; - $this->registry = $registry; - $this->eventQueue = $eventQueue instanceof Queue ? $eventQueue : $context->createQueue($eventQueue); - } + /** + * @param Event|ContractEvent $event + * @param string $eventName + */ + public function __invoke($event, $eventName) + { + $this->onEvent($event, $eventName); + } - public function __invoke(Event $event, $eventName) - { - $this->onEvent($event, $eventName); - } + /** + * @param Event|ContractEvent $event + * @param string $eventName + */ + public function onEvent($event, $eventName) + { + if (false == isset($this->syncMode[$eventName])) { + $transformerName = $this->registry->getTransformerNameForEvent($eventName); - public function resetSyncMode() - { - $this->syncMode = []; - } + $message = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); + $message->setProperty('event_name', $eventName); + $message->setProperty('transformer_name', $transformerName); - /** - * @param string $eventName - */ - public function syncMode($eventName) - { - $this->syncMode[$eventName] = true; + $this->context->createProducer()->send($this->eventQueue, $message); + } + } } - +} else { /** - * @param string $eventName - * - * @return bool + * Symfony >= 5.0 */ - public function isSyncMode($eventName) + class AsyncListener extends AbstractAsyncListener { - return isset($this->syncMode[$eventName]); - } + public function __invoke(ContractEvent $event, $eventName) + { + $this->onEvent($event, $eventName); + } - /** - * @param Event $event - * @param string $eventName - */ - public function onEvent(Event $event, $eventName) - { - if (false == isset($this->syncMode[$eventName])) { - $transformerName = $this->registry->getTransformerNameForEvent($eventName); + /** + * @param Event $event + * @param string $eventName + */ + public function onEvent(ContractEvent $event, $eventName) + { + if (false == isset($this->syncMode[$eventName])) { + $transformerName = $this->registry->getTransformerNameForEvent($eventName); - $message = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); - $message->setProperty('event_name', $eventName); - $message->setProperty('transformer_name', $transformerName); + $message = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); + $message->setProperty('event_name', $eventName); + $message->setProperty('transformer_name', $transformerName); - $this->context->createProducer()->send($this->eventQueue, $message); + $this->context->createProducer()->send($this->eventQueue, $message); + } } } } diff --git a/pkg/async-event-dispatcher/EventTransformer.php b/pkg/async-event-dispatcher/EventTransformer.php index abb67566f..5781f5087 100644 --- a/pkg/async-event-dispatcher/EventTransformer.php +++ b/pkg/async-event-dispatcher/EventTransformer.php @@ -4,26 +4,88 @@ use Interop\Queue\Message; use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; +use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -interface EventTransformer -{ +if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * @param string $eventName - * @param Event|null $event - * - * @return Message + * Symfony < 4.3 */ - public function toMessage($eventName, Event $event = null); + interface EventTransformer + { + /** + * @param string $eventName + * @param Event|null $event + * + * @return Message + */ + public function toMessage($eventName, Event $event = null); + /** + * If you able to transform message back to event return it. + * If you failed to transform for some reason you can return a string status (@param string $eventName + * + * @param Message $message + * + * @return Event|string|object + * @see Process constants) or an object that implements __toString method. + * The object must have a __toString method is supposed to be used as Processor::process return value. + * + */ + public function toEvent($eventName, Message $message); + } +} elseif (class_exists(Event::class)) { /** - * If you able to transform message back to event return it. - * If you failed to transform for some reason you can return a string status (@see Process constants) or an object that implements __toString method. - * The object must have a __toString method is supposed to be used as Processor::process return value. - * - * @param string $eventName - * @param Message $message - * - * @return Event|string|object + * Symfony >= 4.3 and < 5.0 */ - public function toEvent($eventName, Message $message); + interface EventTransformer + { + /** + * @param string $eventName + * @param ContractEvent|Event|null $event + * + * @return Message + */ + public function toMessage($eventName, $event = null); + + /** + * If you able to transform message back to event return it. + * If you failed to transform for some reason you can return a string status (@param string $eventName + * + * @param Message $message + * + * @return ContractEvent|Event|string|object + * @see Process constants) or an object that implements __toString method. + * The object must have a __toString method is supposed to be used as Processor::process return value. + * + */ + public function toEvent($eventName, Message $message); + } +} else { + /** + * Symfony >= 5.0 + */ + interface EventTransformer + { + /** + * @param string $eventName + * @param ContractEvent|null $event + * + * @return Message + */ + public function toMessage($eventName, ContractEvent $event = null); + + /** + * If you able to transform message back to event return it. + * If you failed to transform for some reason you can return a string status (@param string $eventName + * + * @param Message $message + * + * @return ContractEvent|string|object + * @see Process constants) or an object that implements __toString method. + * The object must have a __toString method is supposed to be used as Processor::process return value. + * + */ + public function toEvent($eventName, Message $message); + } } diff --git a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php index 34392c439..c6bd4b67c 100644 --- a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php +++ b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php @@ -2,38 +2,50 @@ namespace Enqueue\AsyncEventDispatcher; -use Interop\Queue\Context; -use Interop\Queue\Message; use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; +use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -class PhpSerializerEventTransformer implements EventTransformer -{ +if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * @var Context + * Symfony < 4.3 */ - private $context; - - /** - * @param Context $context - */ - public function __construct(Context $context) + class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer { - $this->context = $context; + /** + * {@inheritdoc} + */ + public function toMessage($eventName, Event $event = null) + { + return $this->context->createMessage(serialize($event)); + } } - +} elseif (class_exists(Event::class)) { /** - * {@inheritdoc} + * Symfony >= 4.3 and < 5.0 */ - public function toMessage($eventName, Event $event = null) + class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer { - return $this->context->createMessage(serialize($event)); + /** + * {@inheritdoc} + */ + public function toMessage($eventName, $event = null) + { + return $this->context->createMessage(serialize($event)); + } } - +} else { /** - * {@inheritdoc} + * Symfony >= 5.0 */ - public function toEvent($eventName, Message $message) + class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer { - return unserialize($message->getBody()); + /** + * {@inheritdoc} + */ + public function toMessage($eventName, ContractEvent $event = null) + { + return $this->context->createMessage(serialize($event)); + } } } diff --git a/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php b/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php index 6e019f6de..c5a1c3567 100644 --- a/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php +++ b/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php @@ -10,9 +10,12 @@ use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Context; use Interop\Queue\Producer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\GenericEvent; +use Symfony\Component\HttpKernel\Kernel; +use Symfony\Contracts\EventDispatcher\Event as ContractEvent; class AsyncListenerTest extends TestCase { @@ -68,7 +71,9 @@ public function testShouldDoNothingIfSyncModeOn() $listener->syncMode('fooEvent'); - $listener->onEvent(new Event(), 'fooEvent'); + $eventClass = Kernel::VERSION_ID >= 50000 ? ContractEvent::class : Event::class; + + $listener->onEvent(new $eventClass(), 'fooEvent'); $listener->onEvent(new GenericEvent(), 'fooEvent'); } @@ -129,7 +134,7 @@ public function testShouldSendMessageIfSyncModeOff() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|EventTransformer + * @return MockObject|EventTransformer */ private function createEventTransformerMock() { @@ -137,7 +142,7 @@ private function createEventTransformerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Producer + * @return MockObject|Producer */ private function createProducerMock() { @@ -145,7 +150,7 @@ private function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Context + * @return MockObject|Context */ private function createContextMock() { @@ -153,7 +158,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Registry + * @return MockObject|Registry */ private function createRegistryMock() { diff --git a/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php b/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php index 334022e92..7237c9ae2 100644 --- a/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php +++ b/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php @@ -11,6 +11,7 @@ use Enqueue\Null\NullMessage; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Symfony\Component\EventDispatcher\GenericEvent; @@ -97,7 +98,7 @@ public function testShouldDispatchAsyncListenersOnly() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|EventTransformer + * @return MockObject|EventTransformer */ private function createEventTransformerMock() { @@ -105,7 +106,7 @@ private function createEventTransformerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AsyncEventDispatcher + * @return MockObject|AsyncEventDispatcher */ private function createProxyEventDispatcherMock() { @@ -113,7 +114,7 @@ private function createProxyEventDispatcherMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Registry + * @return MockObject|Registry */ private function createRegistryMock() { diff --git a/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php b/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php index e3848858b..41aebe559 100644 --- a/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php +++ b/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php @@ -12,6 +12,7 @@ use Interop\Queue\Processor; use Interop\Queue\Queue; use PHPUnit\Framework\TestCase; +use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\GenericEvent; @@ -103,7 +104,7 @@ public function testShouldDispatchBothAsyncEventAndSyncOne() echo "Async event\n"; }); - $this->dispatcher->dispatch('test_async', new GenericEvent()); + $this->dispatch($this->dispatcher, new GenericEvent(),'test_async'); $this->processMessages(); $this->expectOutputString("Sync event\nSend message for event: test_async\nAsync event\n"); @@ -114,7 +115,7 @@ public function testShouldDispatchBothAsyncEventAndSyncOneFromWhenDispatchedFrom $this->dispatcher->addListener('foo', function ($event, $name, EventDispatcherInterface $dispatcher) { echo "Foo event\n"; - $dispatcher->dispatch('test_async', new GenericEvent()); + $this->dispatch($dispatcher, new GenericEvent(),'test_async'); }); $this->dispatcher->addListener('test_async', function () { @@ -127,7 +128,8 @@ public function testShouldDispatchBothAsyncEventAndSyncOneFromWhenDispatchedFrom echo "Async event\n"; }); - $this->dispatcher->dispatch('foo'); + $this->dispatch($this->dispatcher, new GenericEvent(),'foo'); + $this->processMessages(); $this->expectOutputString("Foo event\nSync event\nSend message for event: test_async\nAsync event\n"); @@ -141,14 +143,14 @@ public function testShouldDispatchOtherAsyncEventFromAsyncEvent() $this->asyncDispatcher->addListener('test_async', function ($event, $eventName, EventDispatcherInterface $dispatcher) { echo "Async event\n"; - $dispatcher->dispatch('test_async_from_async'); + $this->dispatch($dispatcher, new GenericEvent(),'test_async_from_async'); }); $this->dispatcher->addListener('test_async_from_async', function ($event, $eventName, EventDispatcherInterface $dispatcher) { echo "Async event from event\n"; }); - $this->dispatcher->dispatch('test_async'); + $this->dispatch($this->dispatcher, new GenericEvent(),'test_async'); $this->processMessages(); $this->processMessages(); @@ -167,16 +169,27 @@ public function testShouldDispatchSyncListenerIfDispatchedFromAsycListner() $this->asyncDispatcher->addListener('test_async', function ($event, $eventName, EventDispatcherInterface $dispatcher) { echo "Async event\n"; - $dispatcher->dispatch('sync'); + $this->dispatch($dispatcher, new GenericEvent(),'sync'); }); - $this->dispatcher->dispatch('test_async'); + $this->dispatch($this->dispatcher, new GenericEvent(),'test_async'); $this->processMessages(); $this->expectOutputString("Send message for event: test_async\nAsync event\nSync event\n"); } + private function dispatch(EventDispatcherInterface $dispatcher, $event, $eventName): void + { + if (!class_exists(Event::class)) { + // Symfony 5 + $dispatcher->dispatch($event, $eventName); + } else { + // Symfony < 5 + $dispatcher->dispatch($eventName, $event); + } + } + private function processMessages() { $consumer = $this->context->createConsumer($this->queue); diff --git a/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php b/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php index 8e9ee8179..49f3a9371 100644 --- a/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php +++ b/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php @@ -8,6 +8,7 @@ use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Context; use Interop\Queue\Message; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Symfony\Component\EventDispatcher\GenericEvent; @@ -52,7 +53,7 @@ public function testShouldReturnEventUnserializedFromMessageBodyOnToEvent() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Context + * @return MockObject|Context */ private function createContextStub() { diff --git a/pkg/async-event-dispatcher/Tests/ProxyEventDispatcherTest.php b/pkg/async-event-dispatcher/Tests/ProxyEventDispatcherTest.php index 7c8319147..905d55a25 100644 --- a/pkg/async-event-dispatcher/Tests/ProxyEventDispatcherTest.php +++ b/pkg/async-event-dispatcher/Tests/ProxyEventDispatcherTest.php @@ -5,9 +5,12 @@ use Enqueue\AsyncEventDispatcher\AsyncEventDispatcher; use Enqueue\AsyncEventDispatcher\AsyncListener; use Enqueue\Test\ClassExtensionTrait; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\GenericEvent; +use Symfony\Component\HttpKernel\Kernel; class ProxyEventDispatcherTest extends TestCase { @@ -80,7 +83,13 @@ public function testShouldCallOtherEventIfDispatchedFromAsyncEventOnDispatchAsyn $asyncEventWasCalled = true; - func_get_arg(2)->dispatch('theOtherEvent'); + if (!class_exists(Event::class)) { + // Symfony 5 + func_get_arg(2)->dispatch(func_get_arg(0), 'theOtherEvent'); + } else { + // Symfony < 5 + func_get_arg(2)->dispatch('theOtherEvent'); + } }); $event = new GenericEvent(); @@ -113,7 +122,7 @@ public function testShouldNotCallAsyncEventIfDispatchedFromOtherEventOnDispatchA } /** - * @return \PHPUnit_Framework_MockObject_MockObject|AsyncListener + * @return MockObject|AsyncListener */ private function createAsyncListenerMock() { diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index 56c220808..ffc917b83 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -12,11 +12,12 @@ "symfony/event-dispatcher": "^3.4|^4|^5" }, "require-dev": { - "phpunit/phpunit": "~5.5", + "phpunit/phpunit": "~7.5", "symfony/dependency-injection": "^3.4|^4|^5", "symfony/config": "^3.4|^4|^5", "symfony/http-kernel": "^3.4|^4|^5", "symfony/filesystem": "^3.4|^4|^5", + "symfony/yaml": "^3.4|^4|^5", "enqueue/null": "0.9.x-dev", "enqueue/fs": "0.9.x-dev", "enqueue/test": "0.9.x-dev" diff --git a/pkg/async-event-dispatcher/phpunit.xml.dist b/pkg/async-event-dispatcher/phpunit.xml.dist index e64c86d98..b4c8fec08 100644 --- a/pkg/async-event-dispatcher/phpunit.xml.dist +++ b/pkg/async-event-dispatcher/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index cca4d2380..0155b3d6e 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -15,6 +15,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Exception\InvalidMessageException; use Interop\Queue\Message; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Ramsey\Uuid\Uuid; @@ -175,7 +176,7 @@ public function testRejectShouldReSendMessageToSameQueueOnRequeue() $producerMock ->expects($this->once()) ->method('send') - ->with($this->identicalTo($queue), $this->isInstanceOf($message)) + ->with($this->identicalTo($queue), $this->isInstanceOf(DbalMessage::class)) ; $context = $this->createContextMock(); @@ -191,7 +192,7 @@ public function testRejectShouldReSendMessageToSameQueueOnRequeue() } /** - * @return DbalProducer|\PHPUnit_Framework_MockObject_MockObject + * @return DbalProducer|MockObject */ private function createProducerMock() { @@ -199,7 +200,7 @@ private function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DbalContext + * @return MockObject|DbalContext */ private function createContextMock() { @@ -207,7 +208,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DbalContext + * @return MockObject|DbalContext */ private function createConectionMock() { diff --git a/pkg/dbal/Tests/DbalContextTest.php b/pkg/dbal/Tests/DbalContextTest.php index 4c6e83184..b89abae2e 100644 --- a/pkg/dbal/Tests/DbalContextTest.php +++ b/pkg/dbal/Tests/DbalContextTest.php @@ -13,6 +13,7 @@ use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\TemporaryQueueNotSupportedException; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class DbalContextTest extends TestCase @@ -162,7 +163,7 @@ public function testShouldThrowBadMethodCallExceptionOncreateTemporaryQueueCall( } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Connection + * @return MockObject|Connection */ private function createConnectionMock() { diff --git a/pkg/dbal/Tests/DbalProducerTest.php b/pkg/dbal/Tests/DbalProducerTest.php index 59b2db746..4dcb015e3 100644 --- a/pkg/dbal/Tests/DbalProducerTest.php +++ b/pkg/dbal/Tests/DbalProducerTest.php @@ -9,6 +9,7 @@ use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Producer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class DbalProducerTest extends TestCase @@ -40,7 +41,7 @@ public function testShouldThrowIfDestinationOfInvalidType() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DbalContext + * @return MockObject|DbalContext */ private function createContextMock() { diff --git a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php index 2f762c2eb..82787f19f 100644 --- a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php +++ b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php @@ -10,6 +10,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Queue; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class DbalSubscriptionConsumerTest extends TestCase @@ -145,7 +146,7 @@ public function testThrowsIfTryConsumeWithoutSubscribers() } /** - * @return DbalContext|\PHPUnit_Framework_MockObject_MockObject + * @return DbalContext|MockObject */ private function createDbalContextMock() { @@ -155,7 +156,7 @@ private function createDbalContextMock() /** * @param mixed|null $queueName * - * @return Consumer|\PHPUnit_Framework_MockObject_MockObject + * @return Consumer|MockObject */ private function createConsumerStub($queueName = null) { diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index 686f87d16..69b644ed4 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -26,7 +26,7 @@ public function setUp() $this->context = $this->createDbalContext(); } - protected function tearDown() + protected function tearDown(): void { if ($this->context) { $this->context->close(); diff --git a/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php b/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php index 5bc2a5c41..953921b87 100644 --- a/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php +++ b/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php @@ -8,6 +8,7 @@ use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\ConnectionFactory; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class ManagerRegistryConnectionFactoryTest extends TestCase @@ -74,7 +75,7 @@ public function testShouldCreateLazyContext() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ManagerRegistry + * @return MockObject|ManagerRegistry */ private function createManagerRegistryMock() { @@ -82,7 +83,7 @@ private function createManagerRegistryMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Connection + * @return MockObject|Connection */ private function createConnectionMock() { diff --git a/pkg/dbal/phpunit.xml.dist b/pkg/dbal/phpunit.xml.dist index 451d24a00..8b2213d34 100644 --- a/pkg/dbal/phpunit.xml.dist +++ b/pkg/dbal/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/dsn/phpunit.xml.dist b/pkg/dsn/phpunit.xml.dist index 21a14bbc3..8709cdcf6 100644 --- a/pkg/dsn/phpunit.xml.dist +++ b/pkg/dsn/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php index ab8c70f2d..fbd290461 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php @@ -2,22 +2,22 @@ namespace Enqueue\Bundle\Consumption\Extension; +use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\DBAL\Connection; use Enqueue\Consumption\Context\MessageReceived; use Enqueue\Consumption\MessageReceivedExtensionInterface; -use Symfony\Bridge\Doctrine\RegistryInterface; class DoctrinePingConnectionExtension implements MessageReceivedExtensionInterface { /** - * @var RegistryInterface + * @var ManagerRegistry */ protected $registry; /** - * @param RegistryInterface $registry + * @param ManagerRegistry $registry */ - public function __construct(RegistryInterface $registry) + public function __construct(ManagerRegistry $registry) { $this->registry = $registry; } diff --git a/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php b/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php new file mode 100644 index 000000000..871b2cb62 --- /dev/null +++ b/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php @@ -0,0 +1,97 @@ +producers[$name] = $producer; + } + + protected function collectInternal(Request $request, Response $response): void + { + $this->data = []; + + foreach ($this->producers as $name => $producer) { + if ($producer instanceof TraceableProducer) { + $this->data[$name] = $producer->getTraces(); + } + } + } + + public function getCount(): int + { + $count = 0; + foreach ($this->data as $name => $messages) { + $count += count($messages); + } + + return $count; + } + + /** + * @return array + */ + public function getSentMessages() + { + return $this->data; + } + + /** + * @param string $priority + * + * @return string + */ + public function prettyPrintPriority($priority) + { + $map = [ + MessagePriority::VERY_LOW => 'very low', + MessagePriority::LOW => 'low', + MessagePriority::NORMAL => 'normal', + MessagePriority::HIGH => 'high', + MessagePriority::VERY_HIGH => 'very high', + ]; + + return isset($map[$priority]) ? $map[$priority] : $priority; + } + + /** + * @param mixed $body + * + * @return string + */ + public function ensureString($body) + { + return is_string($body) ? $body : JSON::encode($body); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'enqueue.message_queue'; + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->data = []; + } +} diff --git a/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php b/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php index 0c369da94..e44429413 100644 --- a/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php +++ b/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php @@ -2,99 +2,30 @@ namespace Enqueue\Bundle\Profiler; -use Enqueue\Client\MessagePriority; -use Enqueue\Client\ProducerInterface; -use Enqueue\Client\TraceableProducer; -use Enqueue\Util\JSON; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\DataCollector\DataCollector; +use Symfony\Component\HttpKernel\Kernel; -class MessageQueueCollector extends DataCollector -{ - /** - * @var ProducerInterface - */ - private $producers; - - public function addProducer(string $name, ProducerInterface $producer): void - { - $this->producers[$name] = $producer; - } - - /** - * {@inheritdoc} - */ - public function collect(Request $request, Response $response, \Exception $exception = null) +if (Kernel::MAJOR_VERSION < 5) { + class MessageQueueCollector extends AbstractMessageQueueCollector { - $this->data = []; - - foreach ($this->producers as $name => $producer) { - if ($producer instanceof TraceableProducer) { - $this->data[$name] = $producer->getTraces(); - } + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Exception $exception = null) + { + $this->collectInternal($request, $response); } } - - public function getCount(): int +} else { + class MessageQueueCollector extends AbstractMessageQueueCollector { - $count = 0; - foreach ($this->data as $name => $messages) { - $count += count($messages); + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + $this->collectInternal($request, $response); } - - return $count; - } - - /** - * @return array - */ - public function getSentMessages() - { - return $this->data; - } - - /** - * @param string $priority - * - * @return string - */ - public function prettyPrintPriority($priority) - { - $map = [ - MessagePriority::VERY_LOW => 'very low', - MessagePriority::LOW => 'low', - MessagePriority::NORMAL => 'normal', - MessagePriority::HIGH => 'high', - MessagePriority::VERY_HIGH => 'very high', - ]; - - return isset($map[$priority]) ? $map[$priority] : $priority; - } - - /** - * @param mixed $body - * - * @return string - */ - public function ensureString($body) - { - return is_string($body) ? $body : JSON::encode($body); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'enqueue.message_queue'; - } - - /** - * {@inheritdoc} - */ - public function reset() - { - $this->data = []; } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/AbstractAsyncListener.php b/pkg/enqueue-bundle/Tests/Functional/App/AbstractAsyncListener.php new file mode 100644 index 000000000..1b3cd9ad9 --- /dev/null +++ b/pkg/enqueue-bundle/Tests/Functional/App/AbstractAsyncListener.php @@ -0,0 +1,52 @@ +producer = $producer; + $this->registry = $registry; + } + + /** + * @param Event|ContractEvent $event + * @param string $eventName + */ + protected function onEventInternal($event, $eventName) + { + if (false == $this->isSyncMode($eventName)) { + $transformerName = $this->registry->getTransformerNameForEvent($eventName); + + $interopMessage = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); + $message = new Message($interopMessage->getBody()); + $message->setScope(Message::SCOPE_APP); + $message->setProperty('event_name', $eventName); + $message->setProperty('transformer_name', $transformerName); + + $this->producer->sendCommand(Commands::DISPATCH_ASYNC_EVENTS, $message); + } + } +} diff --git a/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php b/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php index 9e94c2c6f..e488fc118 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php @@ -2,50 +2,53 @@ namespace Enqueue\Bundle\Tests\Functional\App; -use Enqueue\AsyncEventDispatcher\Commands; -use Enqueue\AsyncEventDispatcher\Registry; -use Enqueue\Client\Message; -use Enqueue\Client\ProducerInterface; use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; +use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -class AsyncListener extends \Enqueue\AsyncEventDispatcher\AsyncListener -{ +if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * @var ProducerInterface + * Symfony < 4.3 */ - private $producer; - - /** - * @var Registry - */ - private $registry; - + class AsyncListener extends AbstractAsyncListener + { + /** + * @param Event $event + * @param string $eventName + */ + public function onEvent(Event $event, $eventName) + { + $this->onEventInternal($event, $eventName); + } + } +} elseif (class_exists(Event::class)) { /** - * @param ProducerInterface $producer - * @param Registry $registry + * Symfony >= 4.3 and < 5.0 */ - public function __construct(ProducerInterface $producer, Registry $registry) + class AsyncListener extends AbstractAsyncListener { - $this->producer = $producer; - $this->registry = $registry; + /** + * @param Event|ContractEvent $event + * @param string $eventName + */ + public function onEvent($event, $eventName) + { + $this->onEventInternal($event, $eventName); + } } - +} else { /** - * @param Event $event - * @param string $eventName + * Symfony >= 5.0 */ - public function onEvent(Event $event = null, $eventName) + class AsyncListener extends AbstractAsyncListener { - if (false == $this->isSyncMode($eventName)) { - $transformerName = $this->registry->getTransformerNameForEvent($eventName); - - $interopMessage = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); - $message = new Message($interopMessage->getBody()); - $message->setScope(Message::SCOPE_APP); - $message->setProperty('event_name', $eventName); - $message->setProperty('transformer_name', $transformerName); - - $this->producer->sendCommand(Commands::DISPATCH_ASYNC_EVENTS, $message); + /** + * @param ContractEvent $event + * @param string $eventName + */ + public function onEvent(ContractEvent $event, $eventName) + { + $this->onEventInternal($event, $eventName); } } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php index 4293ab85e..6d2ce25b6 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php @@ -8,47 +8,148 @@ use Interop\Queue\Message; use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\GenericEvent; +use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; +use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -class TestAsyncEventTransformer implements EventTransformer -{ +if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * @var Context + * Symfony < 4.3 */ - private $context; + class TestAsyncEventTransformer implements EventTransformer + { + /** + * @var Context + */ + private $context; + + /** + * @param Context $context + */ + public function __construct(Context $context) + { + $this->context = $context; + } + + public function toMessage($eventName, Event $event = null) + { + if (Event::class === get_class($event)) { + return $this->context->createMessage(json_encode('')); + } + + /** @var GenericEvent $event */ + if (false == $event instanceof GenericEvent) { + throw new \LogicException('Must be GenericEvent'); + } + + return $this->context->createMessage(json_encode([ + 'subject' => $event->getSubject(), + 'arguments' => $event->getArguments(), + ])); + } + public function toEvent($eventName, Message $message) + { + $data = JSON::decode($message->getBody()); + + if ('' === $data) { + return new Event(); + } + + return new GenericEvent($data['subject'], $data['arguments']); + } + } +} elseif (class_exists(Event::class)) { /** - * @param Context $context + * Symfony >= 4.3 and < 5.0 */ - public function __construct(Context $context) + class TestAsyncEventTransformer implements EventTransformer { - $this->context = $context; - } + /** + * @var Context + */ + private $context; - public function toMessage($eventName, Event $event = null) - { - if (Event::class === get_class($event)) { - return $this->context->createMessage(json_encode('')); + /** + * @param Context $context + */ + public function __construct(Context $context) + { + $this->context = $context; } - /** @var GenericEvent $event */ - if (false == $event instanceof GenericEvent) { - throw new \LogicException('Must be GenericEvent'); + public function toMessage($eventName, $event = null) + { + if (Event::class === get_class($event) || ContractEvent::class === get_class($event)) { + return $this->context->createMessage(json_encode('')); + } + + /** @var GenericEvent $event */ + if (false == $event instanceof GenericEvent) { + throw new \LogicException('Must be GenericEvent'); + } + + return $this->context->createMessage(json_encode([ + 'subject' => $event->getSubject(), + 'arguments' => $event->getArguments(), + ])); } - return $this->context->createMessage(json_encode([ - 'subject' => $event->getSubject(), - 'arguments' => $event->getArguments(), - ])); - } + public function toEvent($eventName, Message $message) + { + $data = JSON::decode($message->getBody()); - public function toEvent($eventName, Message $message) + if ('' === $data) { + return new Event(); + } + + return new GenericEvent($data['subject'], $data['arguments']); + } + } +} else { + /** + * Symfony >= 5.0 + */ + class TestAsyncEventTransformer implements EventTransformer { - $data = JSON::decode($message->getBody()); + /** + * @var Context + */ + private $context; - if ('' === $data) { - return new Event(); + /** + * @param Context $context + */ + public function __construct(Context $context) + { + $this->context = $context; } - return new GenericEvent($data['subject'], $data['arguments']); + public function toMessage($eventName, ContractEvent $event = null) + { + if (ContractEvent::class === get_class($event)) { + return $this->context->createMessage(json_encode('')); + } + + /** @var GenericEvent $event */ + if (false == $event instanceof GenericEvent) { + throw new \LogicException('Must be GenericEvent'); + } + + return $this->context->createMessage(json_encode([ + 'subject' => $event->getSubject(), + 'arguments' => $event->getArguments(), + ])); + } + + public function toEvent($eventName, Message $message) + { + $data = JSON::decode($message->getBody()); + + if ('' === $data) { + return new ContractEvent(); + } + + return new GenericEvent($data['subject'], $data['arguments']); + } } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncListener.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncListener.php index aa4884bca..fd0ec1d91 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncListener.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncListener.php @@ -2,14 +2,13 @@ namespace Enqueue\Bundle\Tests\Functional\App; -use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\EventDispatcherInterface; class TestAsyncListener { public $calls = []; - public function onEvent(Event $event, $eventName, EventDispatcherInterface $dispatcher) + public function onEvent($event, $eventName, EventDispatcherInterface $dispatcher) { $this->calls[] = func_get_args(); } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncSubscriber.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncSubscriber.php index 2b45bed6e..ea8cd026e 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncSubscriber.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncSubscriber.php @@ -10,7 +10,7 @@ class TestAsyncSubscriber implements EventSubscriberInterface { public $calls = []; - public function onEvent(Event $event, $eventName, EventDispatcherInterface $dispatcher) + public function onEvent($event, $eventName, EventDispatcherInterface $dispatcher) { $this->calls[] = func_get_args(); } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 562647c31..7b04a3f30 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -8,11 +8,10 @@ framework: #translator: { fallback: "%locale%" } test: ~ assets: false - templating: false session: storage_id: session.storage.mock_file secret: '%secret%' - router: { resource: '%kernel.root_dir%/config/routing.yml' } + router: { resource: '%kernel.project_dir%/config/routing.yml' } default_locale: '%locale%' doctrine: diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml index eda14e00c..37c4660a0 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml @@ -7,11 +7,10 @@ framework: #translator: { fallback: "%locale%" } test: ~ assets: false - templating: false session: storage_id: session.storage.mock_file secret: '%secret%' - router: { resource: '%kernel.root_dir%/config/routing.yml' } + router: { resource: '%kernel.project_dir%/config/routing.yml' } default_locale: '%locale%' doctrine: @@ -82,4 +81,4 @@ services: test.sqs_custom_connection_factory_factory: class: 'Enqueue\Bundle\Tests\Functional\App\SqsCustomConnectionFactoryFactory' - arguments: ['@service_container'] \ No newline at end of file + arguments: ['@service_container'] diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php index 6e952ab28..457a0ffcd 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php @@ -33,7 +33,7 @@ public function testShouldNotCallRealListenerIfMarkedAsAsync() /** @var EventDispatcherInterface $dispatcher */ $dispatcher = static::$container->get('event_dispatcher'); - $dispatcher->dispatch('test_async', new GenericEvent('aSubject')); + $this->dispatch($dispatcher, new GenericEvent('aSubject'), 'test_async'); /** @var TestAsyncListener $listener */ $listener = static::$container->get('test_async_listener'); @@ -48,7 +48,7 @@ public function testShouldSendMessageToExpectedCommandInsteadOfCallingRealListen $event = new GenericEvent('theSubject', ['fooArg' => 'fooVal']); - $dispatcher->dispatch('test_async', $event); + $this->dispatch($dispatcher, $event, 'test_async'); /** @var TraceableProducer $producer */ $producer = static::$container->get('test_enqueue.client.default.producer'); @@ -66,9 +66,9 @@ public function testShouldSendMessageForEveryDispatchCall() /** @var EventDispatcherInterface $dispatcher */ $dispatcher = static::$container->get('event_dispatcher'); - $dispatcher->dispatch('test_async', new GenericEvent('theSubject', ['fooArg' => 'fooVal'])); - $dispatcher->dispatch('test_async', new GenericEvent('theSubject', ['fooArg' => 'fooVal'])); - $dispatcher->dispatch('test_async', new GenericEvent('theSubject', ['fooArg' => 'fooVal'])); + $this->dispatch($dispatcher, new GenericEvent('theSubject', ['fooArg' => 'fooVal']), 'test_async'); + $this->dispatch($dispatcher, new GenericEvent('theSubject', ['fooArg' => 'fooVal']), 'test_async'); + $this->dispatch($dispatcher, new GenericEvent('theSubject', ['fooArg' => 'fooVal']), 'test_async'); /** @var TraceableProducer $producer */ $producer = static::$container->get('test_enqueue.client.default.producer'); @@ -84,11 +84,11 @@ public function testShouldSendMessageIfDispatchedFromInsideListener() $dispatcher = static::$container->get('event_dispatcher'); $eventName = 'an_event_'.uniqid(); - $dispatcher->addListener($eventName, function (Event $event, $eventName, EventDispatcherInterface $dispatcher) { - $dispatcher->dispatch('test_async', new GenericEvent('theSubject', ['fooArg' => 'fooVal'])); + $dispatcher->addListener($eventName, function ($event, $eventName, EventDispatcherInterface $dispatcher) { + $this->dispatch($dispatcher, new GenericEvent('theSubject', ['fooArg' => 'fooVal']), 'test_async'); }); - $dispatcher->dispatch($eventName); + $this->dispatch($dispatcher, new GenericEvent(), $eventName); /** @var TraceableProducer $producer */ $producer = static::$container->get('test_enqueue.client.default.producer'); @@ -97,4 +97,15 @@ public function testShouldSendMessageIfDispatchedFromInsideListener() $this->assertCount(1, $traces); } + + private function dispatch(EventDispatcherInterface $dispatcher, $event, $eventName): void + { + if (!class_exists(Event::class)) { + // Symfony 5 + $dispatcher->dispatch($event, $eventName); + } else { + // Symfony < 5 + $dispatcher->dispatch($eventName, $event); + } + } } diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php index 6e00eafca..7404e6af8 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php @@ -33,7 +33,7 @@ public function testShouldNotCallRealSubscriberIfMarkedAsAsync() /** @var EventDispatcherInterface $dispatcher */ $dispatcher = static::$container->get('event_dispatcher'); - $dispatcher->dispatch('test_async_subscriber', new GenericEvent('aSubject')); + $this->dispatch($dispatcher, new GenericEvent('aSubject'), 'test_async_subscriber'); /** @var TestAsyncSubscriber $listener */ $listener = static::$container->get('test_async_subscriber'); @@ -48,7 +48,7 @@ public function testShouldSendMessageToExpectedTopicInsteadOfCallingRealSubscrib $event = new GenericEvent('theSubject', ['fooArg' => 'fooVal']); - $dispatcher->dispatch('test_async_subscriber', $event); + $this->dispatch($dispatcher, $event, 'test_async_subscriber'); /** @var TraceableProducer $producer */ $producer = static::$container->get('test_enqueue.client.default.producer'); @@ -66,9 +66,9 @@ public function testShouldSendMessageForEveryDispatchCall() /** @var EventDispatcherInterface $dispatcher */ $dispatcher = static::$container->get('event_dispatcher'); - $dispatcher->dispatch('test_async_subscriber', new GenericEvent('theSubject', ['fooArg' => 'fooVal'])); - $dispatcher->dispatch('test_async_subscriber', new GenericEvent('theSubject', ['fooArg' => 'fooVal'])); - $dispatcher->dispatch('test_async_subscriber', new GenericEvent('theSubject', ['fooArg' => 'fooVal'])); + $this->dispatch($dispatcher, new GenericEvent('theSubject', ['fooArg' => 'fooVal']), 'test_async_subscriber'); + $this->dispatch($dispatcher, new GenericEvent('theSubject', ['fooArg' => 'fooVal']), 'test_async_subscriber'); + $this->dispatch($dispatcher, new GenericEvent('theSubject', ['fooArg' => 'fooVal']), 'test_async_subscriber'); /** @var TraceableProducer $producer */ $producer = static::$container->get('test_enqueue.client.default.producer'); @@ -84,11 +84,11 @@ public function testShouldSendMessageIfDispatchedFromInsideListener() $dispatcher = static::$container->get('event_dispatcher'); $eventName = 'anEvent'.uniqid(); - $dispatcher->addListener($eventName, function (Event $event, $eventName, EventDispatcherInterface $dispatcher) { - $dispatcher->dispatch('test_async_subscriber', new GenericEvent('theSubject', ['fooArg' => 'fooVal'])); + $dispatcher->addListener($eventName, function ($event, $eventName, EventDispatcherInterface $dispatcher) { + $this->dispatch($dispatcher, new GenericEvent('theSubject', ['fooArg' => 'fooVal']), 'test_async_subscriber'); }); - $dispatcher->dispatch($eventName); + $this->dispatch($dispatcher, new GenericEvent(), $eventName); /** @var TraceableProducer $producer */ $producer = static::$container->get('test_enqueue.client.default.producer'); @@ -97,4 +97,15 @@ public function testShouldSendMessageIfDispatchedFromInsideListener() $this->assertCount(1, $traces); } + + private function dispatch(EventDispatcherInterface $dispatcher, $event, $eventName): void + { + if (!class_exists(Event::class)) { + // Symfony 5 + $dispatcher->dispatch($event, $eventName); + } else { + // Symfony < 5 + $dispatcher->dispatch($eventName, $event); + } + } } diff --git a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php index cf9af030e..fefbe882b 100644 --- a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php @@ -17,7 +17,7 @@ public function setUp() // parent::setUp(); } - public function tearDown() + public function tearDown(): void { if (static::$kernel) { $fs = new Filesystem(); diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index f4f11abb1..37b6e1b57 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -24,7 +24,7 @@ public function setUp() // parent::setUp(); } - public function tearDown() + public function tearDown(): void { if ($this->getContext()) { $this->getContext()->close(); diff --git a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php index 2b4f58173..8e3569a98 100644 --- a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php +++ b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php @@ -33,11 +33,10 @@ protected function setUp() $producer->clearTraces(); } - protected function tearDown() + protected function tearDown(): void { + static::ensureKernelShutdown(); static::$client = null; - static::$kernel = null; - static::$container = null; } /** diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php index 47dceeb36..852960458 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php @@ -10,6 +10,7 @@ use Interop\Queue\Context as InteropContext; use Interop\Queue\Message; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; @@ -59,7 +60,7 @@ protected function createContext(): MessageReceived } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ManagerRegistry + * @return MockObject|ManagerRegistry */ protected function createRegistryMock(): ManagerRegistry { @@ -67,7 +68,7 @@ protected function createRegistryMock(): ManagerRegistry } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ObjectManager + * @return MockObject|ObjectManager */ protected function createManagerMock(): ObjectManager { diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php index 1cccb0b13..59587adfb 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php @@ -12,6 +12,7 @@ use Interop\Queue\Context as InteropContext; use Interop\Queue\Message; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; @@ -189,7 +190,7 @@ public function testOnPostReceivedShouldInterruptExecutionIfAManagerIsClosed() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ManagerRegistry + * @return MockObject|ManagerRegistry */ protected function createRegistryMock(array $managers): ManagerRegistry { @@ -205,7 +206,7 @@ protected function createRegistryMock(array $managers): ManagerRegistry } /** - * @return \PHPUnit_Framework_MockObject_MockObject|EntityManagerInterface + * @return MockObject|EntityManagerInterface */ protected function createManagerMock(bool $open): EntityManagerInterface { diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index e38c34d52..829882d4f 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; +use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\DBAL\Connection; use Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension; use Enqueue\Consumption\Context\MessageReceived; @@ -9,9 +10,9 @@ use Interop\Queue\Context as InteropContext; use Interop\Queue\Message; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; -use Symfony\Bridge\Doctrine\RegistryInterface; class DoctrinePingConnectionExtensionTest extends TestCase { @@ -160,15 +161,15 @@ protected function createContext(): MessageReceived } /** - * @return \PHPUnit_Framework_MockObject_MockObject|RegistryInterface + * @return MockObject|ManagerRegistry */ - protected function createRegistryMock(): RegistryInterface + protected function createRegistryMock() { - return $this->createMock(RegistryInterface::class); + return $this->createMock(ManagerRegistry::class); } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Connection + * @return MockObject|Connection */ protected function createConnectionMock(): Connection { diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php index e5f787420..8fbe29791 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php @@ -9,6 +9,7 @@ use Interop\Queue\Context as InteropContext; use Interop\Queue\Message; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; @@ -52,7 +53,7 @@ protected function createContext(): MessageReceived } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ManagerRegistry + * @return MockObject|ManagerRegistry */ protected function createResetterMock(): ServicesResetter { diff --git a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php index 4ad12f718..96d4bc940 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php @@ -7,6 +7,7 @@ use Enqueue\Client\ProducerInterface; use Enqueue\Client\TraceableProducer; use Enqueue\Test\ClassExtensionTrait; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -138,7 +139,7 @@ public function testShouldEnsureStringEncodeArrayToJson() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + * @return MockObject|ProducerInterface */ protected function createProducerMock() { @@ -146,7 +147,7 @@ protected function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|TraceableProducer + * @return MockObject|TraceableProducer */ protected function createTraceableProducerMock() { diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 819d225d1..38db216b7 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -21,7 +21,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "require-dev": { - "phpunit/phpunit": "~5.5", + "phpunit/phpunit": "~7.5", "enqueue/stomp": "0.9.x-dev", "enqueue/amqp-ext": "0.9.x-dev", "enqueue/amqp-lib": "0.9.x-dev", @@ -36,11 +36,12 @@ "enqueue/async-event-dispatcher": "0.9.x-dev", "enqueue/async-command": "0.9.x-dev", "php-amqplib/php-amqplib": "^2.7", - "doctrine/doctrine-bundle": "~1.2", - "doctrine/mongodb-odm-bundle": "^3.5", + "doctrine/doctrine-bundle": "~1.2|^2", + "doctrine/mongodb-odm-bundle": "^3.5|^4", "alcaeus/mongo-php-adapter": "^1.0", "symfony/browser-kit": "^3.4|^4|^5", - "symfony/expression-language": "^3.4|^4|^5" + "symfony/expression-language": "^3.4|^4|^5", + "symfony/yaml": "^3.4|^4|^5" }, "suggest": { "enqueue/async-command": "If want to run Symfony command via message queue", diff --git a/pkg/enqueue-bundle/phpunit.xml.dist b/pkg/enqueue-bundle/phpunit.xml.dist index ac0770ea9..9058a1c0c 100644 --- a/pkg/enqueue-bundle/phpunit.xml.dist +++ b/pkg/enqueue-bundle/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php index db8f0dd76..b6e684cdd 100644 --- a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php +++ b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php @@ -2,16 +2,16 @@ namespace Enqueue\Doctrine; +use Doctrine\Common\Persistence\ManagerRegistry; use Enqueue\ConnectionFactoryFactoryInterface; use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Dsn\Dsn; use Interop\Queue\ConnectionFactory; -use Symfony\Bridge\Doctrine\RegistryInterface; class DoctrineConnectionFactoryFactory implements ConnectionFactoryFactoryInterface { /** - * @var RegistryInterface + * @var ManagerRegistry */ private $doctrine; @@ -20,7 +20,7 @@ class DoctrineConnectionFactoryFactory implements ConnectionFactoryFactoryInterf */ private $fallbackFactory; - public function __construct(RegistryInterface $doctrine, ConnectionFactoryFactoryInterface $fallbackFactory) + public function __construct(ManagerRegistry $doctrine, ConnectionFactoryFactoryInterface $fallbackFactory) { $this->doctrine = $doctrine; $this->fallbackFactory = $fallbackFactory; diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index fee54e1b5..4f6e5edb6 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -87,7 +87,7 @@ protected function configure(): void ; } - protected function execute(InputInterface $input, OutputInterface $output): ?int + protected function execute(InputInterface $input, OutputInterface $output): int { $client = $input->getOption('client'); @@ -147,7 +147,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $consumer->consume(new ChainExtension([$runtimeExtensionChain, $exitStatusExtension])); - return $exitStatusExtension->getExitStatus(); + return $exitStatusExtension->getExitStatus() ?? 0; } protected function getRuntimeExtensions(InputInterface $input, OutputInterface $output): ExtensionInterface diff --git a/pkg/enqueue/Symfony/Client/ProduceCommand.php b/pkg/enqueue/Symfony/Client/ProduceCommand.php index 51a365967..667871c71 100644 --- a/pkg/enqueue/Symfony/Client/ProduceCommand.php +++ b/pkg/enqueue/Symfony/Client/ProduceCommand.php @@ -52,7 +52,7 @@ protected function configure(): void ; } - protected function execute(InputInterface $input, OutputInterface $output): ?int + protected function execute(InputInterface $input, OutputInterface $output): int { $topic = $input->getOption('topic'); $command = $input->getOption('command'); @@ -82,7 +82,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int throw new \LogicException('Either topic or command option should be set, none is set.'); } - return null; + return 0; } private function getProducer(string $client): ProducerInterface diff --git a/pkg/enqueue/Symfony/Client/RoutesCommand.php b/pkg/enqueue/Symfony/Client/RoutesCommand.php index 04d404d85..5419f3beb 100644 --- a/pkg/enqueue/Symfony/Client/RoutesCommand.php +++ b/pkg/enqueue/Symfony/Client/RoutesCommand.php @@ -58,7 +58,7 @@ protected function configure(): void $this->driver = null; } - protected function execute(InputInterface $input, OutputInterface $output): ?int + protected function execute(InputInterface $input, OutputInterface $output): int { try { $this->driver = $this->getDriver($input->getOption('client')); @@ -112,7 +112,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $table->render(); } - return null; + return 0; } private function formatSourceType(Route $route): string diff --git a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php index 72215a8ba..65d52ee31 100644 --- a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php +++ b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php @@ -48,7 +48,7 @@ protected function configure(): void ; } - protected function execute(InputInterface $input, OutputInterface $output): ?int + protected function execute(InputInterface $input, OutputInterface $output): int { $client = $input->getOption('client'); @@ -60,7 +60,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $output->writeln('Broker set up'); - return null; + return 0; } private function getDriver(string $client): DriverInterface diff --git a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php index 9c47134a0..9439f7651 100644 --- a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php @@ -72,7 +72,7 @@ protected function configure(): void ; } - protected function execute(InputInterface $input, OutputInterface $output): ?int + protected function execute(InputInterface $input, OutputInterface $output): int { $transport = $input->getOption('transport'); @@ -110,7 +110,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $consumer->consume(new ChainExtension($extensions)); - return null; + return 0; } private function getQueueConsumer(string $name): QueueConsumerInterface diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index b10d19f68..b1a54c163 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -57,7 +57,7 @@ protected function configure(): void ; } - protected function execute(InputInterface $input, OutputInterface $output): ?int + protected function execute(InputInterface $input, OutputInterface $output): int { $transport = $input->getOption('transport'); @@ -81,7 +81,7 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $consumer->consume(new ChainExtension($extensions)); - return $exitStatusExtension->getExitStatus(); + return $exitStatusExtension->getExitStatus() ?? 0; } private function getQueueConsumer(string $name): QueueConsumerInterface diff --git a/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php b/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php index 50c802582..897276d62 100644 --- a/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php @@ -6,6 +6,7 @@ use Enqueue\ProcessorRegistryInterface; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class ArrayProcessorRegistryTest extends TestCase @@ -51,7 +52,7 @@ public function testShouldAllowGetProcessorAddedViaAddMethod() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Processor + * @return MockObject|Processor */ protected function createProcessorMock() { diff --git a/pkg/enqueue/Tests/Client/ChainExtensionTest.php b/pkg/enqueue/Tests/Client/ChainExtensionTest.php index 95f314423..a59005bc1 100644 --- a/pkg/enqueue/Tests/Client/ChainExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ChainExtensionTest.php @@ -151,7 +151,7 @@ public function testShouldProxyOnPostSentToAllInternalExtensions() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ExtensionInterface */ protected function createExtension() { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php index 9c8c24439..050b4f2f5 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php @@ -15,6 +15,7 @@ use Interop\Queue\Destination; use Interop\Queue\Message as TransportMessage; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; @@ -144,7 +145,7 @@ public function testShouldDoNothingIfMessageIsRedeliveredButResultWasAlreadySetO } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createDriverMock(): DriverInterface { @@ -152,7 +153,7 @@ private function createDriverMock(): DriverInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createContextMock(): InteropContext { @@ -160,7 +161,7 @@ private function createContextMock(): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createProcessorMock(): Processor { @@ -170,7 +171,7 @@ private function createProcessorMock(): Processor /** * @param mixed $queue * - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createConsumerStub($queue): Consumer { @@ -185,7 +186,7 @@ private function createConsumerStub($queue): Consumer } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createLoggerMock(): LoggerInterface { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php index 877836758..878778b30 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php @@ -15,6 +15,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Context as InteropContext; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -242,7 +243,7 @@ public function testShouldDoNothingIfAnotherQueue() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface { @@ -257,7 +258,7 @@ private function createDriverStub(RouteCollection $routeCollection = null): Driv } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createContextMock(): InteropContext { @@ -265,7 +266,7 @@ private function createContextMock(): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createProcessorMock(): Processor { @@ -275,7 +276,7 @@ private function createProcessorMock(): Processor /** * @param mixed $queue * - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createConsumerStub($queue): Consumer { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php index 53d88aa8d..63fb50c5a 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php @@ -12,6 +12,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Context; use Interop\Queue\Message; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -70,7 +71,7 @@ public function testShouldFlushSpoolProducerOnPostReceived() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createInteropContextMock(): Context { @@ -78,7 +79,7 @@ private function createInteropContextMock(): Context } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SpoolProducer + * @return MockObject|SpoolProducer */ private function createSpoolProducerMock() { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php index 0bd6514d8..063ea23af 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php @@ -21,6 +21,7 @@ use Interop\Queue\Context; use Interop\Queue\Processor; use Interop\Queue\Queue; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; @@ -500,7 +501,7 @@ public function testShouldLogProcessedTopicProcessorMessageWithReasonResultObjec } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createConsumerStub(Queue $queue): Consumer { @@ -515,7 +516,7 @@ private function createConsumerStub(Queue $queue): Consumer } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createContextMock(): Context { @@ -523,7 +524,7 @@ private function createContextMock(): Context } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createProcessorMock(): Processor { @@ -531,7 +532,7 @@ private function createProcessorMock(): Processor } /** - * @return \PHPUnit_Framework_MockObject_MockObject|LoggerInterface + * @return MockObject|LoggerInterface */ private function createLogger() { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php index 3c12de4f9..18760e9bf 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php @@ -13,6 +13,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Context as InteropContext; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -161,7 +162,7 @@ public function testShouldSkipMessagesWithoutTopicPropertySet() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + * @return MockObject|InteropContext */ protected function createContextMock(): InteropContext { @@ -169,7 +170,7 @@ protected function createContextMock(): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DriverInterface + * @return MockObject|DriverInterface */ protected function createDriverMock(): DriverInterface { @@ -177,7 +178,7 @@ protected function createDriverMock(): DriverInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createProcessorMock(): Processor { @@ -187,7 +188,7 @@ private function createProcessorMock(): Processor /** * @param mixed $queue * - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createConsumerStub($queue): Consumer { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php index 014c23289..4b241aa0e 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php @@ -8,6 +8,7 @@ use Enqueue\Consumption\StartExtensionInterface; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Context as InteropContext; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -61,7 +62,7 @@ public function testShouldSetupBrokerOnlyOnce() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DriverInterface + * @return MockObject|DriverInterface */ private function createDriverMock() { diff --git a/pkg/enqueue/Tests/Client/DelegateProcessorTest.php b/pkg/enqueue/Tests/Client/DelegateProcessorTest.php index 4fe6bd570..40ef17989 100644 --- a/pkg/enqueue/Tests/Client/DelegateProcessorTest.php +++ b/pkg/enqueue/Tests/Client/DelegateProcessorTest.php @@ -8,6 +8,7 @@ use Enqueue\ProcessorRegistryInterface; use Interop\Queue\Context; use Interop\Queue\Processor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class DelegateProcessorTest extends TestCase @@ -57,7 +58,7 @@ public function testShouldProcessMessage() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProcessorRegistryInterface + * @return MockObject|ProcessorRegistryInterface */ protected function createProcessorRegistryMock() { @@ -65,7 +66,7 @@ protected function createProcessorRegistryMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Context + * @return MockObject|Context */ protected function createContextMock() { @@ -73,7 +74,7 @@ protected function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Processor + * @return MockObject|Processor */ protected function createProcessorMock() { diff --git a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php index cb141372b..4f1c81566 100644 --- a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php +++ b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php @@ -1124,12 +1124,12 @@ public function testThrowIfNeitherTopicNorCommandAreSentOnSendToProcessor() abstract protected function createDriver(...$args): DriverInterface; /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ abstract protected function createContextMock(): Context; /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ abstract protected function createProducerMock(): InteropProducer; @@ -1140,7 +1140,7 @@ abstract protected function createTopic(string $name): InteropTopic; abstract protected function createMessage(): InteropMessage; /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ protected function createContextStub(): Context { diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php index 1378dd3a2..a55fd91a4 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php @@ -577,7 +577,7 @@ protected function getRouterTransportName(): string } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createManagementClientMock(): StompManagementClient { @@ -585,7 +585,7 @@ private function createManagementClientMock(): StompManagementClient } /** - * @return \PHPUnit_Framework_MockObject_MockObject|LoggerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|LoggerInterface */ private function createLoggerMock() { diff --git a/pkg/enqueue/Tests/Client/Driver/StompManagementClientTest.php b/pkg/enqueue/Tests/Client/Driver/StompManagementClientTest.php index 325fe2c65..081a62c5f 100644 --- a/pkg/enqueue/Tests/Client/Driver/StompManagementClientTest.php +++ b/pkg/enqueue/Tests/Client/Driver/StompManagementClientTest.php @@ -81,7 +81,7 @@ public function testCouldCreateNewInstanceUsingFactory() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Client + * @return \PHPUnit\Framework\MockObject\MockObject|Client */ private function createClientMock() { @@ -89,7 +89,7 @@ private function createClientMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Exchange + * @return \PHPUnit\Framework\MockObject\MockObject|Exchange */ private function createExchangeMock() { @@ -97,7 +97,7 @@ private function createExchangeMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Queue + * @return \PHPUnit\Framework\MockObject\MockObject|Queue */ private function createQueueMock() { @@ -105,7 +105,7 @@ private function createQueueMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Binding + * @return \PHPUnit\Framework\MockObject\MockObject|Binding */ private function createBindingMock() { diff --git a/pkg/enqueue/Tests/Client/DriverPreSendTest.php b/pkg/enqueue/Tests/Client/DriverPreSendTest.php index d31ac17f1..85686b4c1 100644 --- a/pkg/enqueue/Tests/Client/DriverPreSendTest.php +++ b/pkg/enqueue/Tests/Client/DriverPreSendTest.php @@ -76,7 +76,7 @@ public function testShouldAllowGetTopic() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverMock(): DriverInterface { @@ -84,7 +84,7 @@ private function createDriverMock(): DriverInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createProducerMock(): ProducerInterface { diff --git a/pkg/enqueue/Tests/Client/PostSendTest.php b/pkg/enqueue/Tests/Client/PostSendTest.php index 76940732e..04927700c 100644 --- a/pkg/enqueue/Tests/Client/PostSendTest.php +++ b/pkg/enqueue/Tests/Client/PostSendTest.php @@ -90,7 +90,7 @@ public function testShouldAllowGetTopic() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverMock(): DriverInterface { @@ -98,7 +98,7 @@ private function createDriverMock(): DriverInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createProducerMock(): ProducerInterface { @@ -106,7 +106,7 @@ private function createProducerMock(): ProducerInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Destination + * @return \PHPUnit\Framework\MockObject\MockObject|Destination */ private function createDestinationMock(): Destination { @@ -114,7 +114,7 @@ private function createDestinationMock(): Destination } /** - * @return \PHPUnit_Framework_MockObject_MockObject|TransportMessage + * @return \PHPUnit\Framework\MockObject\MockObject|TransportMessage */ private function createTransportMessageMock(): TransportMessage { diff --git a/pkg/enqueue/Tests/Client/PreSendTest.php b/pkg/enqueue/Tests/Client/PreSendTest.php index d1e5595ba..408be1c69 100644 --- a/pkg/enqueue/Tests/Client/PreSendTest.php +++ b/pkg/enqueue/Tests/Client/PreSendTest.php @@ -109,7 +109,7 @@ public function testCouldChangeBody() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverMock(): DriverInterface { @@ -117,7 +117,7 @@ private function createDriverMock(): DriverInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createProducerMock(): ProducerInterface { diff --git a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php index 3469c3862..8ac0704ca 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php @@ -493,7 +493,7 @@ public function testShouldCallPostSendExtensionMethod() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createRpcFactoryMock(): RpcFactory { @@ -501,7 +501,7 @@ private function createRpcFactoryMock(): RpcFactory } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverStub(): DriverInterface { diff --git a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php index 1346afe18..29a14b7d4 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php @@ -513,7 +513,7 @@ public function testShouldCallPostSendExtensionMethodWhenSendToApplicationRouter } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createRpcFactoryMock(): RpcFactory { @@ -521,7 +521,7 @@ private function createRpcFactoryMock(): RpcFactory } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverStub(): DriverInterface { diff --git a/pkg/enqueue/Tests/Client/ProducerTest.php b/pkg/enqueue/Tests/Client/ProducerTest.php index 4fbf4baea..558e70ee6 100644 --- a/pkg/enqueue/Tests/Client/ProducerTest.php +++ b/pkg/enqueue/Tests/Client/ProducerTest.php @@ -39,7 +39,7 @@ public function testCouldBeConstructedWithOptionalArguments() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createRpcFactoryMock(): RpcFactory { @@ -47,7 +47,7 @@ private function createRpcFactoryMock(): RpcFactory } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverMock(): DriverInterface { diff --git a/pkg/enqueue/Tests/Client/RouterProcessorTest.php b/pkg/enqueue/Tests/Client/RouterProcessorTest.php index d3f5039fa..cdd44df7a 100644 --- a/pkg/enqueue/Tests/Client/RouterProcessorTest.php +++ b/pkg/enqueue/Tests/Client/RouterProcessorTest.php @@ -195,7 +195,7 @@ public function testShouldDoNotModifyOriginalMessage() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface { diff --git a/pkg/enqueue/Tests/Client/SpoolProducerTest.php b/pkg/enqueue/Tests/Client/SpoolProducerTest.php index 8c00dedcd..024fd6da2 100644 --- a/pkg/enqueue/Tests/Client/SpoolProducerTest.php +++ b/pkg/enqueue/Tests/Client/SpoolProducerTest.php @@ -154,7 +154,7 @@ public function testShouldSendImmediatelyCommandMessageWithNeedReplyTrue() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ProducerInterface */ protected function createProducerMock() { diff --git a/pkg/enqueue/Tests/Client/TraceableProducerTest.php b/pkg/enqueue/Tests/Client/TraceableProducerTest.php index b25b7c18b..ff5ee83eb 100644 --- a/pkg/enqueue/Tests/Client/TraceableProducerTest.php +++ b/pkg/enqueue/Tests/Client/TraceableProducerTest.php @@ -366,7 +366,7 @@ public function testShouldAllowClearStoredTraces() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ProducerInterface */ protected function createProducerMock() { diff --git a/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php b/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php index c558424fe..23bd4f979 100644 --- a/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php @@ -19,6 +19,7 @@ use Interop\Queue\Message; use Interop\Queue\Processor; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; @@ -275,7 +276,7 @@ public function testShouldProxyOnEndToAllInternalExtensions() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ protected function createLoggerMock(): LoggerInterface { @@ -283,7 +284,7 @@ protected function createLoggerMock(): LoggerInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ protected function createInteropContextMock(): Context { @@ -291,7 +292,7 @@ protected function createInteropContextMock(): Context } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ protected function createInteropConsumerMock(): Consumer { @@ -299,7 +300,7 @@ protected function createInteropConsumerMock(): Consumer } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ protected function createInteropProcessorMock(): Processor { @@ -307,7 +308,7 @@ protected function createInteropProcessorMock(): Processor } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + * @return MockObject|ExtensionInterface */ protected function createExtension() { @@ -315,7 +316,7 @@ protected function createExtension() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createSubscriptionConsumerMock(): SubscriptionConsumer { diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php index 37d592e68..e1d4c50cd 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php @@ -9,6 +9,7 @@ use Interop\Queue\Context; use Interop\Queue\Message; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; @@ -160,7 +161,7 @@ public function testOnPostReceivedShouldInterruptExecutionIfMessageLimitExceeded } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ protected function createInteropContextMock(): Context { @@ -168,7 +169,7 @@ protected function createInteropContextMock(): Context } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createSubscriptionConsumerMock(): SubscriptionConsumer { @@ -176,7 +177,7 @@ private function createSubscriptionConsumerMock(): SubscriptionConsumer } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createLoggerMock(): LoggerInterface { diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php index de1531ea5..5a95486ec 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php @@ -10,6 +10,7 @@ use Interop\Queue\Context; use Interop\Queue\Message; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; @@ -23,7 +24,8 @@ public function testCouldBeConstructedWithRequiredArguments() public function testShouldThrowExceptionIfMemoryLimitIsNotInt() { - $this->setExpectedException(\InvalidArgumentException::class, 'Expected memory limit is int but got: "double"'); + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Expected memory limit is int but got: "double"'); new LimitConsumerMemoryExtension(0.0); } @@ -176,7 +178,7 @@ public function testOnPostMessageReceivedShouldNotInterruptExecutionIfMemoryLimi } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ protected function createInteropContextMock(): Context { @@ -184,7 +186,7 @@ protected function createInteropContextMock(): Context } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createSubscriptionConsumerMock(): SubscriptionConsumer { @@ -192,7 +194,7 @@ private function createSubscriptionConsumerMock(): SubscriptionConsumer } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createLoggerMock(): LoggerInterface { diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php index 1eaef7874..fa730e384 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php @@ -10,6 +10,7 @@ use Interop\Queue\Context; use Interop\Queue\Message; use Interop\Queue\SubscriptionConsumer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; @@ -154,7 +155,7 @@ public function testOnPostReceivedShouldNotInterruptExecutionIfConsumptionTimeIs } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ protected function createInteropContextMock(): Context { @@ -162,7 +163,7 @@ protected function createInteropContextMock(): Context } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createSubscriptionConsumerMock(): SubscriptionConsumer { @@ -170,7 +171,7 @@ private function createSubscriptionConsumerMock(): SubscriptionConsumer } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createLoggerMock(): LoggerInterface { diff --git a/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php index 8038e5504..4bc4ae95f 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php @@ -20,6 +20,7 @@ use Interop\Queue\Context; use Interop\Queue\Processor; use Interop\Queue\Queue; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; @@ -230,7 +231,7 @@ public function testShouldLogMessageProcessedWithReasonResultObject() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createConsumerStub(Queue $queue): Consumer { @@ -245,7 +246,7 @@ private function createConsumerStub(Queue $queue): Consumer } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createContextMock(): Context { @@ -253,7 +254,7 @@ private function createContextMock(): Context } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createProcessorMock(): Processor { @@ -261,7 +262,7 @@ private function createProcessorMock(): Processor } /** - * @return \PHPUnit_Framework_MockObject_MockObject|LoggerInterface + * @return MockObject|LoggerInterface */ private function createLogger() { diff --git a/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php index 674720e23..f3641adf4 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php @@ -6,6 +6,7 @@ use Enqueue\Consumption\Extension\LoggerExtension; use Enqueue\Consumption\InitLoggerExtensionInterface; use Enqueue\Test\ClassExtensionTrait; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; @@ -74,7 +75,7 @@ public function testShouldDoNothingIfSameLoggerInstanceAlreadySet() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|LoggerInterface + * @return MockObject|LoggerInterface */ protected function createLogger() { diff --git a/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php index 5b1834a88..a2937d0ca 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php @@ -5,6 +5,7 @@ use Enqueue\Consumption\Context\Start; use Enqueue\Consumption\Extension\NicenessExtension; use Interop\Queue\Context as InteropContext; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -33,7 +34,7 @@ public function testShouldThrowWarningOnInvalidArgument() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + * @return MockObject|InteropContext */ protected function createContextMock(): InteropContext { diff --git a/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php index 18e5727fd..408895638 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php @@ -12,6 +12,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Context; use Interop\Queue\Producer as InteropProducer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -103,7 +104,7 @@ public function testShouldSendReplyMessageToReplyQueueOnPostReceived() ->with($replyQueue, $replyMessage) ; - /** @var \PHPUnit_Framework_MockObject_MockObject|Context $contextMock */ + /** @var MockObject|Context $contextMock */ $contextMock = $this->createMock(Context::class); $contextMock ->expects($this->once()) @@ -129,7 +130,7 @@ public function testShouldSendReplyMessageToReplyQueueOnPostReceived() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ protected function createInteropContextMock(): Context { @@ -137,7 +138,7 @@ protected function createInteropContextMock(): Context } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createNeverUsedContextMock(): Context { diff --git a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php index dce6081ef..62066737c 100644 --- a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php @@ -229,7 +229,7 @@ public function testShouldConsumeTillTimeoutIsReached() /** * @param mixed|null $body * - * @return InteropMessage|\PHPUnit_Framework_MockObject_MockObject + * @return InteropMessage|\PHPUnit\Framework\MockObject\MockObject */ private function createMessageStub($body = null) { @@ -246,7 +246,7 @@ private function createMessageStub($body = null) /** * @param mixed|null $queueName * - * @return Consumer|\PHPUnit_Framework_MockObject_MockObject + * @return Consumer|\PHPUnit\Framework\MockObject\MockObject */ private function createConsumerStub($queueName = null) { diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index b10339304..9e25ab931 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -1454,7 +1454,7 @@ public function testCaptureExitStatus() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createContextWithoutSubscriptionConsumerMock(): InteropContext { @@ -1469,7 +1469,7 @@ private function createContextWithoutSubscriptionConsumerMock(): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + * @return \PHPUnit\Framework\MockObject\MockObject|InteropContext */ private function createContextStub(Consumer $consumer = null): InteropContext { @@ -1493,7 +1493,7 @@ private function createContextStub(Consumer $consumer = null): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Processor + * @return \PHPUnit\Framework\MockObject\MockObject|Processor */ private function createProcessorMock() { @@ -1501,7 +1501,7 @@ private function createProcessorMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Processor + * @return \PHPUnit\Framework\MockObject\MockObject|Processor */ private function createProcessorStub() { @@ -1516,7 +1516,7 @@ private function createProcessorStub() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Message + * @return \PHPUnit\Framework\MockObject\MockObject|Message */ private function createMessageMock(): Message { @@ -1524,7 +1524,7 @@ private function createMessageMock(): Message } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ExtensionInterface */ private function createExtension() { @@ -1534,7 +1534,7 @@ private function createExtension() /** * @param mixed|null $queue * - * @return \PHPUnit_Framework_MockObject_MockObject|Consumer + * @return \PHPUnit\Framework\MockObject\MockObject|Consumer */ private function createConsumerStub($queue = null): Consumer { @@ -1553,7 +1553,7 @@ private function createConsumerStub($queue = null): Consumer } /** - * @return SubscriptionConsumer|\PHPUnit_Framework_MockObject_MockObject + * @return SubscriptionConsumer|\PHPUnit\Framework\MockObject\MockObject */ private function createSubscriptionConsumerMock(): SubscriptionConsumer { diff --git a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php index 38e05806e..8a2e089f7 100644 --- a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php +++ b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php @@ -70,7 +70,7 @@ public function testShouldProduceRecipientsMessagesAndAckOriginalMessage() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|InteropProducer + * @return \PHPUnit\Framework\MockObject\MockObject|InteropProducer */ protected function createProducerMock() { @@ -78,7 +78,7 @@ protected function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Context + * @return \PHPUnit\Framework\MockObject\MockObject|Context */ protected function createContextMock() { @@ -86,7 +86,7 @@ protected function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|RecipientListRouterInterface + * @return \PHPUnit\Framework\MockObject\MockObject|RecipientListRouterInterface */ protected function createRecipientListRouterMock() { diff --git a/pkg/enqueue/Tests/Rpc/RpcClientTest.php b/pkg/enqueue/Tests/Rpc/RpcClientTest.php index 78f72bbe5..e2035c4d5 100644 --- a/pkg/enqueue/Tests/Rpc/RpcClientTest.php +++ b/pkg/enqueue/Tests/Rpc/RpcClientTest.php @@ -10,6 +10,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Context; use Interop\Queue\Producer as InteropProducer; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class RpcClientTest extends TestCase @@ -329,7 +330,7 @@ public function testShouldDoSyncCall() } /** - * @return Context|\PHPUnit_Framework_MockObject_MockObject|InteropProducer + * @return Context|MockObject|InteropProducer */ private function createInteropProducerMock() { @@ -337,7 +338,7 @@ private function createInteropProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Consumer + * @return MockObject|Consumer */ private function createConsumerMock() { @@ -345,7 +346,7 @@ private function createConsumerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Context + * @return MockObject|Context */ private function createContextMock() { diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 52bcd9a1e..be7de228e 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -587,7 +587,7 @@ public function testShouldReturnExitStatusIfSet() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DelegateProcessor + * @return \PHPUnit\Framework\MockObject\MockObject|DelegateProcessor */ private function createDelegateProcessorMock() { @@ -595,7 +595,7 @@ private function createDelegateProcessorMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|QueueConsumerInterface */ private function createQueueConsumerMock() { @@ -603,7 +603,7 @@ private function createQueueConsumerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DriverInterface + * @return \PHPUnit\Framework\MockObject\MockObject|DriverInterface */ private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface { @@ -624,7 +624,7 @@ private function createDriverStub(RouteCollection $routeCollection = null): Driv } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createContextWithoutSubscriptionConsumerMock(): InteropContext { @@ -639,7 +639,7 @@ private function createContextWithoutSubscriptionConsumerMock(): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + * @return \PHPUnit\Framework\MockObject\MockObject|InteropContext */ private function createContextStub(Consumer $consumer = null): InteropContext { @@ -663,7 +663,7 @@ private function createContextStub(Consumer $consumer = null): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ExtensionInterface */ private function createExtension() { @@ -673,7 +673,7 @@ private function createExtension() /** * @param mixed|null $queue * - * @return \PHPUnit_Framework_MockObject_MockObject|Consumer + * @return \PHPUnit\Framework\MockObject\MockObject|Consumer */ private function createConsumerStub($queue = null): Consumer { diff --git a/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php b/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php index a1fe06e7a..e7ca3ffd5 100644 --- a/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php @@ -58,7 +58,7 @@ public function testShouldFlushSpoolProducerOnFlushMessagesCall() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SpoolProducer + * @return \PHPUnit\Framework\MockObject\MockObject|SpoolProducer */ private function createSpoolProducerMock() { diff --git a/pkg/enqueue/Tests/Symfony/Client/Mock/SetupBrokerExtensionCommand.php b/pkg/enqueue/Tests/Symfony/Client/Mock/SetupBrokerExtensionCommand.php index aa0c8126a..c21750592 100644 --- a/pkg/enqueue/Tests/Symfony/Client/Mock/SetupBrokerExtensionCommand.php +++ b/pkg/enqueue/Tests/Symfony/Client/Mock/SetupBrokerExtensionCommand.php @@ -29,12 +29,14 @@ protected function configure() $this->configureSetupBrokerExtension(); } - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $this->extension = $this->getSetupBrokerExtension($input, new GenericDriver( new NullContext(), Config::create(), new RouteCollection([]) )); + + return 0; } } diff --git a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php index 7c50ae02c..0dffc3d42 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php @@ -268,7 +268,7 @@ public function testThrowIfClientNotFound() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ProducerInterface */ private function createProducerMock() { diff --git a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php index 0ed73ef1e..d9935bdf4 100644 --- a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php @@ -331,7 +331,7 @@ public function testShouldOutputRouteOptions() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverStub(Config $config, RouteCollection $routeCollection): DriverInterface { diff --git a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php index 4bbaf5534..358206dc7 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php @@ -130,7 +130,7 @@ public function testShouldThrowIfClientNotFound() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DriverInterface + * @return \PHPUnit\Framework\MockObject\MockObject|DriverInterface */ private function createClientDriverMock() { diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php index cb12fe5aa..8f23acdbc 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php @@ -104,7 +104,7 @@ public function testShouldBindDefaultQueueOnly() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DelegateProcessor + * @return \PHPUnit\Framework\MockObject\MockObject|DelegateProcessor */ private function createDelegateProcessorMock() { @@ -112,7 +112,7 @@ private function createDelegateProcessorMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|QueueConsumerInterface */ private function createQueueConsumerMock() { @@ -120,7 +120,7 @@ private function createQueueConsumerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DriverInterface + * @return \PHPUnit\Framework\MockObject\MockObject|DriverInterface */ private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface { diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php index 84391cd3e..71ac20f38 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php @@ -81,7 +81,7 @@ public function testThrowIfNeitherTopicNorCommandOptionsAreSet() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ProducerInterface */ private function createProducerMock() { diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php index ce97be1c0..469334b02 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php @@ -83,7 +83,7 @@ public function testShouldOutputEmptyRouteCollection() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverMock(): DriverInterface { @@ -91,7 +91,7 @@ private function createDriverMock(): DriverInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createDriverStub(Config $config, RouteCollection $routeCollection): DriverInterface { diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php index 240cffa9a..0d30582e1 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php @@ -78,7 +78,7 @@ public function testShouldCallDriverSetupBrokerMethod() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|DriverInterface + * @return \PHPUnit\Framework\MockObject\MockObject|DriverInterface */ private function createClientDriverMock() { diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index 4586849de..c788d5e75 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -274,7 +274,7 @@ public function testShouldExecuteConsumptionWithCustomTransportExplicitlySetQueu } /** - * @return \PHPUnit_Framework_MockObject_MockObject|InteropQueue + * @return \PHPUnit\Framework\MockObject\MockObject|InteropQueue */ protected function createQueueMock() { @@ -282,7 +282,7 @@ protected function createQueueMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Processor + * @return \PHPUnit\Framework\MockObject\MockObject|Processor */ protected function createProcessor() { @@ -290,7 +290,7 @@ protected function createProcessor() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|QueueConsumerInterface */ protected function createQueueConsumerMock() { diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index 88b826725..c2f2257c0 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -160,7 +160,7 @@ public function testShouldReturnExitStatusIfSet() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|QueueConsumerInterface */ private function createQueueConsumerMock() { @@ -168,7 +168,7 @@ private function createQueueConsumerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createContextWithoutSubscriptionConsumerMock(): InteropContext { @@ -183,7 +183,7 @@ private function createContextWithoutSubscriptionConsumerMock(): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + * @return \PHPUnit\Framework\MockObject\MockObject|InteropContext */ private function createContextStub(Consumer $consumer = null): InteropContext { @@ -207,7 +207,7 @@ private function createContextStub(Consumer $consumer = null): InteropContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ExtensionInterface */ private function createExtension() { @@ -217,7 +217,7 @@ private function createExtension() /** * @param mixed|null $queue * - * @return \PHPUnit_Framework_MockObject_MockObject|Consumer + * @return \PHPUnit\Framework\MockObject\MockObject|Consumer */ private function createConsumerStub($queue = null): Consumer { diff --git a/pkg/enqueue/Tests/Symfony/Consumption/Mock/LimitsExtensionsCommand.php b/pkg/enqueue/Tests/Symfony/Consumption/Mock/LimitsExtensionsCommand.php index 7b6722393..05e0c56ba 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/Mock/LimitsExtensionsCommand.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/Mock/LimitsExtensionsCommand.php @@ -25,8 +25,10 @@ protected function configure() $this->configureLimitsExtensions(); } - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $this->extensions = $this->getLimitsExtensions($input, $output); + + return 0; } } diff --git a/pkg/enqueue/Tests/Symfony/Consumption/Mock/QueueConsumerOptionsCommand.php b/pkg/enqueue/Tests/Symfony/Consumption/Mock/QueueConsumerOptionsCommand.php index 289a5e711..147a3b905 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/Mock/QueueConsumerOptionsCommand.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/Mock/QueueConsumerOptionsCommand.php @@ -31,8 +31,10 @@ protected function configure() $this->configureQueueConsumerOptions(); } - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $this->setQueueConsumerOptions($this->consumer, $input); + + return 0; } } diff --git a/pkg/enqueue/Tests/Symfony/Consumption/QueueConsumerOptionsCommandTraitTest.php b/pkg/enqueue/Tests/Symfony/Consumption/QueueConsumerOptionsCommandTraitTest.php index c221f0284..b44c89af9 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/QueueConsumerOptionsCommandTraitTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/QueueConsumerOptionsCommandTraitTest.php @@ -37,7 +37,7 @@ public function testShouldSetQueueConsumerOptions() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|QueueConsumerInterface */ private function createQueueConsumer() { diff --git a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php index 34d4161fb..19b9d76f8 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php @@ -77,7 +77,7 @@ public function testShouldExecuteDefaultConsumption() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|QueueConsumerInterface */ private function createQueueConsumerMock() { diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index bb3cacb53..bf6e3cd01 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -91,7 +91,7 @@ public function testShouldThrowExceptionIfProcessorIsNotSet() } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createProcessorMock(): Processor { @@ -99,7 +99,7 @@ private function createProcessorMock(): Processor } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return \PHPUnit\Framework\MockObject\MockObject */ private function createContainerMock(): ContainerInterface { diff --git a/pkg/enqueue/Tests/Symfony/LazyProducerTest.php b/pkg/enqueue/Tests/Symfony/LazyProducerTest.php index b574414c7..1b15ce2ce 100644 --- a/pkg/enqueue/Tests/Symfony/LazyProducerTest.php +++ b/pkg/enqueue/Tests/Symfony/LazyProducerTest.php @@ -116,7 +116,7 @@ public function testShouldProxyReturnedPromiseBackOnSendCommand() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ProducerInterface */ private function createProducerMock(): ProducerInterface { @@ -124,7 +124,7 @@ private function createProducerMock(): ProducerInterface } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ContainerInterface + * @return \PHPUnit\Framework\MockObject\MockObject|ContainerInterface */ private function createContainerMock(): ContainerInterface { diff --git a/pkg/enqueue/Tests/Util/JSONTest.php b/pkg/enqueue/Tests/Util/JSONTest.php index c37862eb0..a6f583387 100644 --- a/pkg/enqueue/Tests/Util/JSONTest.php +++ b/pkg/enqueue/Tests/Util/JSONTest.php @@ -16,7 +16,8 @@ public function testShouldDecodeString() public function testThrowIfMalformedJson() { - $this->setExpectedException(\InvalidArgumentException::class, 'The malformed json given. '); + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The malformed json given. '); $this->assertSame(['foo' => 'fooVal'], JSON::decode('{]')); } @@ -43,10 +44,8 @@ public function nonStringDataProvider() */ public function testShouldThrowExceptionIfInputIsNotString($value) { - $this->setExpectedException( - \InvalidArgumentException::class, - 'Accept only string argument but got:' - ); + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Accept only string argument but got:'); $this->assertSame(0, JSON::decode($value)); } @@ -96,10 +95,8 @@ public function testShouldEncodeObjectOfJsonSerializableClass() public function testThrowIfValueIsResource() { - $this->setExpectedException( - \InvalidArgumentException::class, - 'Could not encode value into json. Error 8 and message Type is not supported' - ); + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Could not encode value into json. Error 8 and message Type is not supported'); $resource = fopen('php://memory', 'r'); fclose($resource); diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index a18b0a9e5..759d7ccbd 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -16,12 +16,13 @@ "psr/container": "^1" }, "require-dev": { - "phpunit/phpunit": "~5.5", + "phpunit/phpunit": "~7.5", "symfony/console": "^3.4|^4|^5", "symfony/dependency-injection": "^3.4|^4|^5", "symfony/config": "^3.4|^4|^5", "symfony/event-dispatcher": "^3.4|^4|^5", "symfony/http-kernel": "^3.4|^4|^5", + "symfony/yaml": "^3.4|^4|^5", "enqueue/amqp-ext": "0.9.x-dev", "enqueue/amqp-lib": "0.9.x-dev", "enqueue/amqp-bunny": "0.9.x-dev", diff --git a/pkg/enqueue/phpunit.xml.dist b/pkg/enqueue/phpunit.xml.dist index 156ab4929..2b99dda0b 100644 --- a/pkg/enqueue/phpunit.xml.dist +++ b/pkg/enqueue/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/fs/Tests/FsConsumerTest.php b/pkg/fs/Tests/FsConsumerTest.php index 90048b2d0..086bb55fe 100644 --- a/pkg/fs/Tests/FsConsumerTest.php +++ b/pkg/fs/Tests/FsConsumerTest.php @@ -134,7 +134,7 @@ public function testShouldWaitTwoSecondsForMessageAndExitOnReceive() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|FsProducer + * @return \PHPUnit\Framework\MockObject\MockObject|FsProducer */ private function createProducerMock() { @@ -142,7 +142,7 @@ private function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|FsContext + * @return \PHPUnit\Framework\MockObject\MockObject|FsContext */ private function createContextMock() { diff --git a/pkg/fs/Tests/FsProducerTest.php b/pkg/fs/Tests/FsProducerTest.php index 3311287a5..28700d52f 100644 --- a/pkg/fs/Tests/FsProducerTest.php +++ b/pkg/fs/Tests/FsProducerTest.php @@ -63,7 +63,7 @@ public function testShouldCallContextWorkWithFileAndCallbackToItOnSend() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|FsContext + * @return \PHPUnit\Framework\MockObject\MockObject|FsContext */ private function createContextMock() { diff --git a/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php b/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php index 6ad6f5569..1ae462731 100644 --- a/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php @@ -24,7 +24,7 @@ public function setUp() new TempFile(sys_get_temp_dir().'/fs_test_queue'); } - public function tearDown() + public function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/Tests/Functional/FsConsumerTest.php b/pkg/fs/Tests/Functional/FsConsumerTest.php index 50cab8533..9dd7a0103 100644 --- a/pkg/fs/Tests/Functional/FsConsumerTest.php +++ b/pkg/fs/Tests/Functional/FsConsumerTest.php @@ -22,7 +22,7 @@ public function setUp() $this->fsContext->purgeQueue($this->fsContext->createQueue('fs_test_queue')); } - public function tearDown() + public function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php b/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php index 7ea11c74c..98895a62d 100644 --- a/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php @@ -32,7 +32,7 @@ public function setUp() new TempFile(sys_get_temp_dir().'/fs_test_queue'); } - public function tearDown() + public function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/Tests/Functional/FsContextTest.php b/pkg/fs/Tests/Functional/FsContextTest.php index bdcfb341a..287fd6c04 100644 --- a/pkg/fs/Tests/Functional/FsContextTest.php +++ b/pkg/fs/Tests/Functional/FsContextTest.php @@ -14,7 +14,7 @@ class FsContextTest extends TestCase */ private $fsContext; - public function tearDown() + public function tearDown(): void { $fs = new Filesystem(); $fs->remove(sys_get_temp_dir().'/enqueue'); diff --git a/pkg/fs/Tests/Functional/FsProducerTest.php b/pkg/fs/Tests/Functional/FsProducerTest.php index 634e09882..6f7e4b4fa 100644 --- a/pkg/fs/Tests/Functional/FsProducerTest.php +++ b/pkg/fs/Tests/Functional/FsProducerTest.php @@ -22,7 +22,7 @@ public function setUp() file_put_contents(sys_get_temp_dir().'/fs_test_queue', ''); } - public function tearDown() + public function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php b/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php index 91c40f450..046a25f9c 100644 --- a/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php @@ -28,7 +28,7 @@ public function setUp() new TempFile(sys_get_temp_dir().'/fs_reply_queue'); } - public function tearDown() + public function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 164227300..d6f6e8e13 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -13,11 +13,12 @@ "makasim/temp-file": "^0.2@stable" }, "require-dev": { - "phpunit/phpunit": "~5.5", + "phpunit/phpunit": "~7.5", "enqueue/null": "0.9.x-dev", "enqueue/test": "0.9.x-dev", "queue-interop/queue-spec": "^0.6", - "symfony/dependency-injection": "^3.4|^4|^5" + "symfony/dependency-injection": "^3.4|^4|^5", + "symfony/yaml": "^3.4|^4|^5" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/fs/phpunit.xml.dist b/pkg/fs/phpunit.xml.dist index 9754bd41f..ccc9b044b 100644 --- a/pkg/fs/phpunit.xml.dist +++ b/pkg/fs/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/gearman/Tests/GearmanProducerTest.php b/pkg/gearman/Tests/GearmanProducerTest.php index 907d9ef46..afb6181a3 100644 --- a/pkg/gearman/Tests/GearmanProducerTest.php +++ b/pkg/gearman/Tests/GearmanProducerTest.php @@ -10,6 +10,7 @@ use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class GearmanProducerTest extends TestCase @@ -68,7 +69,7 @@ public function testShouldJsonEncodeMessageAndPutToExpectedTube() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|\GearmanClient + * @return MockObject|\GearmanClient */ private function createGearmanClientMock() { diff --git a/pkg/gearman/phpunit.xml.dist b/pkg/gearman/phpunit.xml.dist index 626570c00..26f1d81f1 100644 --- a/pkg/gearman/phpunit.xml.dist +++ b/pkg/gearman/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/gps/Tests/GpsConsumerTest.php b/pkg/gps/Tests/GpsConsumerTest.php index 24bed7e3b..0b4b925ce 100644 --- a/pkg/gps/Tests/GpsConsumerTest.php +++ b/pkg/gps/Tests/GpsConsumerTest.php @@ -180,7 +180,7 @@ public function testShouldReceiveMessage() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|GpsContext + * @return \PHPUnit\Framework\MockObject\MockObject|GpsContext */ private function createContextMock() { @@ -188,7 +188,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|PubSubClient + * @return \PHPUnit\Framework\MockObject\MockObject|PubSubClient */ private function createPubSubClientMock() { @@ -196,7 +196,7 @@ private function createPubSubClientMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Subscription + * @return \PHPUnit\Framework\MockObject\MockObject|Subscription */ private function createSubscriptionMock() { diff --git a/pkg/gps/Tests/GpsContextTest.php b/pkg/gps/Tests/GpsContextTest.php index 355eeff81..658e2659e 100644 --- a/pkg/gps/Tests/GpsContextTest.php +++ b/pkg/gps/Tests/GpsContextTest.php @@ -87,7 +87,7 @@ public function testCreateConsumerShouldThrowExceptionIfInvalidDestination() } /** - * @return PubSubClient|\PHPUnit_Framework_MockObject_MockObject|PubSubClient + * @return PubSubClient|\PHPUnit\Framework\MockObject\MockObject|PubSubClient */ private function createPubSubClientMock() { diff --git a/pkg/gps/Tests/GpsProducerTest.php b/pkg/gps/Tests/GpsProducerTest.php index 6d3191bb8..1e1bfae41 100644 --- a/pkg/gps/Tests/GpsProducerTest.php +++ b/pkg/gps/Tests/GpsProducerTest.php @@ -56,7 +56,7 @@ public function testShouldSendMessage() } /** - * @return GpsContext|\PHPUnit_Framework_MockObject_MockObject|GpsContext + * @return GpsContext|\PHPUnit\Framework\MockObject\MockObject|GpsContext */ private function createContextMock() { @@ -64,7 +64,7 @@ private function createContextMock() } /** - * @return PubSubClient|\PHPUnit_Framework_MockObject_MockObject|PubSubClient + * @return PubSubClient|\PHPUnit\Framework\MockObject\MockObject|PubSubClient */ private function createPubSubClientMock() { @@ -72,7 +72,7 @@ private function createPubSubClientMock() } /** - * @return Topic|\PHPUnit_Framework_MockObject_MockObject|Topic + * @return Topic|\PHPUnit\Framework\MockObject\MockObject|Topic */ private function createGTopicMock() { diff --git a/pkg/gps/phpunit.xml.dist b/pkg/gps/phpunit.xml.dist index 57e46d2f2..af7972bc6 100644 --- a/pkg/gps/phpunit.xml.dist +++ b/pkg/gps/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php index ff5e97c48..2e5a6ac4c 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php @@ -12,6 +12,7 @@ use Enqueue\JobQueue\Topics; use Enqueue\Null\NullMessage; use Interop\Queue\Context; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; class CalculateRootJobStatusProcessorTest extends \PHPUnit\Framework\TestCase @@ -176,7 +177,7 @@ public function testShouldSendRootJobStoppedMessageIfJobHasStopped() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + * @return MockObject|ProducerInterface */ private function createProducerMock() { @@ -184,7 +185,7 @@ private function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Context + * @return MockObject|Context */ private function createContextMock() { @@ -192,7 +193,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|LoggerInterface + * @return MockObject|LoggerInterface */ private function createLoggerMock() { @@ -200,7 +201,7 @@ private function createLoggerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|CalculateRootJobStatusService + * @return MockObject|CalculateRootJobStatusService */ private function createCalculateRootJobStatusCaseMock() { @@ -208,7 +209,7 @@ private function createCalculateRootJobStatusCaseMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|JobStorage + * @return MockObject|JobStorage */ private function createJobStorageMock() { diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php index bf16d81ff..bcb62531a 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php @@ -5,6 +5,7 @@ use Enqueue\JobQueue\CalculateRootJobStatusService; use Enqueue\JobQueue\Doctrine\JobStorage; use Enqueue\JobQueue\Job; +use PHPUnit\Framework\MockObject\MockObject; class CalculateRootJobStatusServiceTest extends \PHPUnit\Framework\TestCase { @@ -153,10 +154,8 @@ public function testShouldThrowIfInvalidStatus() $case = new CalculateRootJobStatusService($storage); - $this->setExpectedException( - \LogicException::class, - 'Got unsupported job status: id: "12345" status: "invalid-status"' - ); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Got unsupported job status: id: "12345" status: "invalid-status"'); $case->calculate($childJob); } @@ -356,7 +355,7 @@ public function testShouldSetStatusSuccessIfAllAreSuccess() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|\Enqueue\JobQueue\Doctrine\JobStorage + * @return MockObject|\Enqueue\JobQueue\Doctrine\JobStorage */ private function createJobStorageMock() { diff --git a/pkg/job-queue/Tests/DependentJobProcessorTest.php b/pkg/job-queue/Tests/DependentJobProcessorTest.php index fe0980714..fff9517a4 100644 --- a/pkg/job-queue/Tests/DependentJobProcessorTest.php +++ b/pkg/job-queue/Tests/DependentJobProcessorTest.php @@ -11,6 +11,7 @@ use Enqueue\JobQueue\Topics; use Enqueue\Null\NullMessage; use Interop\Queue\Context; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; class DependentJobProcessorTest extends \PHPUnit\Framework\TestCase @@ -317,7 +318,7 @@ public function testShouldPublishDependentMessageWithPriority() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Context + * @return MockObject|Context */ private function createContextMock() { @@ -325,7 +326,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|\Enqueue\JobQueue\Doctrine\JobStorage + * @return MockObject|\Enqueue\JobQueue\Doctrine\JobStorage */ private function createJobStorageMock() { @@ -333,7 +334,7 @@ private function createJobStorageMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface + * @return MockObject|ProducerInterface */ private function createProducerMock() { @@ -341,7 +342,7 @@ private function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|LoggerInterface + * @return MockObject|LoggerInterface */ private function createLoggerMock() { diff --git a/pkg/job-queue/Tests/DependentJobServiceTest.php b/pkg/job-queue/Tests/DependentJobServiceTest.php index ed0f79519..149856308 100644 --- a/pkg/job-queue/Tests/DependentJobServiceTest.php +++ b/pkg/job-queue/Tests/DependentJobServiceTest.php @@ -6,6 +6,7 @@ use Enqueue\JobQueue\DependentJobService; use Enqueue\JobQueue\Doctrine\JobStorage; use Enqueue\JobQueue\Job; +use PHPUnit\Framework\MockObject\MockObject; class DependentJobServiceTest extends \PHPUnit\Framework\TestCase { @@ -24,7 +25,8 @@ public function testShouldThrowIfJobIsNotRootJob() $service = new DependentJobService($this->createJobStorageMock()); - $this->setExpectedException(\LogicException::class, 'Only root jobs allowed but got child. jobId: "12345"'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Only root jobs allowed but got child. jobId: "12345"'); $service->saveDependentJob($context); } @@ -66,7 +68,7 @@ public function testShouldSaveDependentJobs() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|\Enqueue\JobQueue\Doctrine\JobStorage + * @return MockObject|\Enqueue\JobQueue\Doctrine\JobStorage */ private function createJobStorageMock() { diff --git a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php index 8344fd0b6..622a79819 100644 --- a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php +++ b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php @@ -11,6 +11,7 @@ use Enqueue\JobQueue\Doctrine\JobStorage; use Enqueue\JobQueue\DuplicateJobException; use Enqueue\JobQueue\Job; +use PHPUnit\Framework\MockObject\MockObject; class JobStorageTest extends \PHPUnit\Framework\TestCase { @@ -136,11 +137,8 @@ public function testShouldThrowIfGotUnexpectedJobInstance() $storage = new JobStorage($doctrine, 'entity-class', 'unique_table'); - $this->setExpectedException( - \LogicException::class, - 'Got unexpected job instance: expected: "expected\class\name", '. - 'actual" "Enqueue\JobQueue\Job"' - ); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Got unexpected job instance: expected: "expected\class\name", actual" "Enqueue\JobQueue\Job"'); $storage->saveJob(new Job()); } @@ -316,7 +314,8 @@ public function testShouldCatchUniqueConstraintViolationExceptionAndThrowDuplica $storage = new JobStorage($doctrine, 'entity-class', 'unique_table'); - $this->setExpectedException(DuplicateJobException::class, 'Duplicate job. ownerId:"owner-id", name:"job-name"'); + $this->expectException(DuplicateJobException::class); + $this->expectExceptionMessage('Duplicate job. ownerId:"owner-id", name:"job-name"'); $storage->saveJob($job); } @@ -359,11 +358,8 @@ public function testShouldThrowIfTryToSaveNewEntityWithLock() $storage = new JobStorage($doctrine, 'entity-class', 'unique_table'); - $this->setExpectedException( - \LogicException::class, - 'Is not possible to create new job with lock, only update is allowed' - ); - + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Is not possible to create new job with lock, only update is allowed'); $storage->saveJob($job, function () { }); } @@ -579,7 +575,7 @@ public function testShouldDeleteRecordFromUniqueTableIfJobIsUniqueAndStoppedAtIs } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ManagerRegistry + * @return MockObject|ManagerRegistry */ private function createDoctrineMock() { @@ -587,7 +583,7 @@ private function createDoctrineMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Connection + * @return MockObject|Connection */ private function createConnectionMock() { @@ -595,7 +591,7 @@ private function createConnectionMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|EntityManager + * @return MockObject|EntityManager */ private function createEntityManagerMock() { @@ -603,7 +599,7 @@ private function createEntityManagerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|EntityRepository + * @return MockObject|EntityRepository */ private function createRepositoryMock() { @@ -611,7 +607,7 @@ private function createRepositoryMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|UniqueConstraintViolationException + * @return MockObject|UniqueConstraintViolationException */ private function createUniqueConstraintViolationExceptionMock() { diff --git a/pkg/job-queue/Tests/Functional/Job/JobStorageTest.php b/pkg/job-queue/Tests/Functional/Job/JobStorageTest.php index 4cc05f8e0..c2c8fb94d 100644 --- a/pkg/job-queue/Tests/Functional/Job/JobStorageTest.php +++ b/pkg/job-queue/Tests/Functional/Job/JobStorageTest.php @@ -128,7 +128,7 @@ public function testShouldThrowIfDuplicateJob() $job2->setStatus(Job::STATUS_NEW); $job2->setCreatedAt(new \DateTime()); - $this->setExpectedException(DuplicateJobException::class); + $this->expectException(DuplicateJobException::class); $this->getJobStorage()->saveJob($job2); } diff --git a/pkg/job-queue/Tests/Functional/WebTestCase.php b/pkg/job-queue/Tests/Functional/WebTestCase.php index ecb6e5af9..2f8e17cea 100644 --- a/pkg/job-queue/Tests/Functional/WebTestCase.php +++ b/pkg/job-queue/Tests/Functional/WebTestCase.php @@ -33,11 +33,11 @@ protected function setUp() $this->startTransaction(); } - protected function tearDown() + protected function tearDown(): void { $this->rollbackTransaction(); - parent::tearDown(); + static::ensureKernelShutdown(); } /** diff --git a/pkg/job-queue/Tests/Functional/app/config/config.yml b/pkg/job-queue/Tests/Functional/app/config/config.yml index 2297c7bb4..b6d642b82 100644 --- a/pkg/job-queue/Tests/Functional/app/config/config.yml +++ b/pkg/job-queue/Tests/Functional/app/config/config.yml @@ -7,11 +7,10 @@ framework: #translator: { fallback: "%locale%" } test: ~ assets: false - templating: false session: storage_id: session.storage.mock_file secret: "%secret%" - router: { resource: "%kernel.root_dir%/config/routing.yml" } + router: { resource: "%kernel.project_dir%/config/routing.yml" } default_locale: "%locale%" doctrine: @@ -27,7 +26,7 @@ doctrine: TestEntity: mapping: true type: annotation - dir: '%kernel.root_dir%/../Entity' + dir: '%kernel.project_dir%/Tests/Functional/Entity' alias: 'EnqueueJobQueue' prefix: 'Enqueue\JobQueue\Tests\Functional\Entity' is_bundle: false diff --git a/pkg/job-queue/Tests/JobProcessorTest.php b/pkg/job-queue/Tests/JobProcessorTest.php index b91a23a97..f4e937c02 100644 --- a/pkg/job-queue/Tests/JobProcessorTest.php +++ b/pkg/job-queue/Tests/JobProcessorTest.php @@ -8,6 +8,7 @@ use Enqueue\JobQueue\DuplicateJobException; use Enqueue\JobQueue\Job; use Enqueue\JobQueue\JobProcessor; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class JobProcessorTest extends TestCase @@ -21,7 +22,8 @@ public function testCreateRootJobShouldThrowIfOwnerIdIsEmpty() { $processor = new JobProcessor($this->createJobStorage(), $this->createProducerMock()); - $this->setExpectedException(\LogicException::class, 'OwnerId must not be empty'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('OwnerId must not be empty'); $processor->findOrCreateRootJob(null, 'job-name', true); } @@ -30,7 +32,8 @@ public function testCreateRootJobShouldThrowIfNameIsEmpty() { $processor = new JobProcessor($this->createJobStorage(), $this->createProducerMock()); - $this->setExpectedException(\LogicException::class, 'Job name must not be empty'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Job name must not be empty'); $processor->findOrCreateRootJob('owner-id', null, true); } @@ -98,7 +101,8 @@ public function testCreateChildJobShouldThrowIfNameIsEmpty() { $processor = new JobProcessor($this->createJobStorage(), $this->createProducerMock()); - $this->setExpectedException(\LogicException::class, 'Job name must not be empty'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Job name must not be empty'); $processor->findOrCreateChildJob(null, new Job()); } @@ -193,7 +197,8 @@ public function testStartChildJobShouldThrowIfRootJob() $rootJob = new Job(); $rootJob->setId(12345); - $this->setExpectedException(\LogicException::class, 'Can\'t start root jobs. id: "12345"'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can\'t start root jobs. id: "12345"'); $processor->startChildJob($rootJob); } @@ -215,10 +220,8 @@ public function testStartChildJobShouldThrowIfJobHasNotNewStatus() $processor = new JobProcessor($storage, $this->createProducerMock()); - $this->setExpectedException( - \LogicException::class, - 'Can start only new jobs: id: "12345", status: "enqueue.job_queue.status.cancelled"' - ); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can start only new jobs: id: "12345", status: "enqueue.job_queue.status.cancelled"'); $processor->startChildJob($job); } @@ -263,7 +266,8 @@ public function testSuccessChildJobShouldThrowIfRootJob() $rootJob = new Job(); $rootJob->setId(12345); - $this->setExpectedException(\LogicException::class, 'Can\'t success root jobs. id: "12345"'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can\'t success root jobs. id: "12345"'); $processor->successChildJob($rootJob); } @@ -285,10 +289,8 @@ public function testSuccessChildJobShouldThrowIfJobHasNotRunningStatus() $processor = new JobProcessor($storage, $this->createProducerMock()); - $this->setExpectedException( - \LogicException::class, - 'Can success only running jobs. id: "12345", status: "enqueue.job_queue.status.cancelled"' - ); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can success only running jobs. id: "12345", status: "enqueue.job_queue.status.cancelled"'); $processor->successChildJob($job); } @@ -333,7 +335,8 @@ public function testFailChildJobShouldThrowIfRootJob() $rootJob = new Job(); $rootJob->setId(12345); - $this->setExpectedException(\LogicException::class, 'Can\'t fail root jobs. id: "12345"'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can\'t fail root jobs. id: "12345"'); $processor->failChildJob($rootJob); } @@ -355,10 +358,8 @@ public function testFailChildJobShouldThrowIfJobHasNotRunningStatus() $processor = new JobProcessor($storage, $this->createProducerMock()); - $this->setExpectedException( - \LogicException::class, - 'Can fail only running jobs. id: "12345", status: "enqueue.job_queue.status.cancelled"' - ); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can fail only running jobs. id: "12345", status: "enqueue.job_queue.status.cancelled"'); $processor->failChildJob($job); } @@ -403,7 +404,8 @@ public function testCancelChildJobShouldThrowIfRootJob() $rootJob = new Job(); $rootJob->setId(12345); - $this->setExpectedException(\LogicException::class, 'Can\'t cancel root jobs. id: "12345"'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can\'t cancel root jobs. id: "12345"'); $processor->cancelChildJob($rootJob); } @@ -425,10 +427,8 @@ public function testCancelChildJobShouldThrowIfJobHasNotNewOrRunningStatus() $processor = new JobProcessor($storage, $this->createProducerMock()); - $this->setExpectedException( - \LogicException::class, - 'Can cancel only new or running jobs. id: "12345", status: "enqueue.job_queue.status.cancelled"' - ); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can cancel only new or running jobs. id: "12345", status: "enqueue.job_queue.status.cancelled"'); $processor->cancelChildJob($job); } @@ -475,7 +475,8 @@ public function testInterruptRootJobShouldThrowIfNotRootJob() $processor = new JobProcessor($this->createJobStorage(), $this->createProducerMock()); - $this->setExpectedException(\LogicException::class, 'Can interrupt only root jobs. id: "123"'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Can interrupt only root jobs. id: "123"'); $processor->interruptRootJob($notRootJob); } @@ -539,7 +540,7 @@ public function testInterruptRootJobShouldUpdateJobAndSetInterruptedTrueAndStopp } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createJobStorage(): JobStorage { @@ -547,7 +548,7 @@ private function createJobStorage(): JobStorage } /** - * @return \PHPUnit_Framework_MockObject_MockObject + * @return MockObject */ private function createProducerMock(): ProducerInterface { diff --git a/pkg/job-queue/Tests/JobRunnerTest.php b/pkg/job-queue/Tests/JobRunnerTest.php index aa7a7f49e..e43440fe3 100644 --- a/pkg/job-queue/Tests/JobRunnerTest.php +++ b/pkg/job-queue/Tests/JobRunnerTest.php @@ -6,6 +6,7 @@ use Enqueue\JobQueue\JobProcessor; use Enqueue\JobQueue\JobRunner; use Enqueue\JobQueue\OrphanJobException; +use PHPUnit\Framework\MockObject\MockObject; class JobRunnerTest extends \PHPUnit\Framework\TestCase { @@ -301,7 +302,8 @@ public function testRunDelayedShouldThrowExceptionIfJobWasNotFoundById() $jobRunner = new JobRunner($jobProcessor); - $this->setExpectedException(\LogicException::class, 'Job was not found. id: "job-id"'); + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Job was not found. id: "job-id"'); $jobRunner->runDelayed('job-id', function () { }); @@ -450,7 +452,7 @@ public function testRunDelayedShouldNotSuccessJobIfAlreadyStopped() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|JobProcessor + * @return MockObject|JobProcessor */ private function createJobProcessorMock() { diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 44268e689..158eb6a7f 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -13,12 +13,13 @@ "doctrine/orm": "~2.4" }, "require-dev": { - "phpunit/phpunit": "~5.5", + "phpunit/phpunit": "~7.5", "enqueue/test": "0.9.x-dev", - "doctrine/doctrine-bundle": "~1.2", + "doctrine/doctrine-bundle": "~1.2|^2", "symfony/browser-kit": "^3.4|^4|^5", "symfony/expression-language": "^3.4|^4|^5", - "symfony/framework-bundle": "^3.4|^4|^5" + "symfony/framework-bundle": "^3.4|^4|^5", + "symfony/yaml": "^3.4|^4|^5" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/job-queue/phpunit.xml.dist b/pkg/job-queue/phpunit.xml.dist index 29dc33404..d82f4457f 100644 --- a/pkg/job-queue/phpunit.xml.dist +++ b/pkg/job-queue/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php b/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php index 609a22e16..6e7f01e5c 100644 --- a/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php @@ -24,7 +24,7 @@ public function setUp() $this->context = $this->buildMongodbContext(); } - protected function tearDown() + protected function tearDown(): void { if ($this->context) { $this->context->close(); diff --git a/pkg/mongodb/Tests/MongodbConsumerTest.php b/pkg/mongodb/Tests/MongodbConsumerTest.php index b1b98e0cd..33212bda9 100644 --- a/pkg/mongodb/Tests/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbConsumerTest.php @@ -113,7 +113,7 @@ public function testRejectShouldReSendMessageToSameQueueOnRequeue() } /** - * @return MongodbProducer|\PHPUnit_Framework_MockObject_MockObject + * @return MongodbProducer|\PHPUnit\Framework\MockObject\MockObject */ private function createProducerMock() { @@ -121,7 +121,7 @@ private function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|MongodbContext + * @return \PHPUnit\Framework\MockObject\MockObject|MongodbContext */ private function createContextMock() { diff --git a/pkg/mongodb/Tests/MongodbContextTest.php b/pkg/mongodb/Tests/MongodbContextTest.php index d43f21733..32835c90e 100644 --- a/pkg/mongodb/Tests/MongodbContextTest.php +++ b/pkg/mongodb/Tests/MongodbContextTest.php @@ -183,7 +183,7 @@ public function testShouldThrowNotSupportedOnCreateTemporaryQueueCall() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Client + * @return \PHPUnit\Framework\MockObject\MockObject|Client */ private function createClientMock() { diff --git a/pkg/mongodb/Tests/MongodbProducerTest.php b/pkg/mongodb/Tests/MongodbProducerTest.php index a62c8436e..8e8900cfd 100644 --- a/pkg/mongodb/Tests/MongodbProducerTest.php +++ b/pkg/mongodb/Tests/MongodbProducerTest.php @@ -43,7 +43,7 @@ public function testShouldThrowIfDestinationOfInvalidType() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|MongodbContext + * @return \PHPUnit\Framework\MockObject\MockObject|MongodbContext */ private function createContextMock() { diff --git a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php index a7d1d8d8a..7d3cb44f4 100644 --- a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php @@ -145,7 +145,7 @@ public function testThrowsIfTryConsumeWithoutSubscribers() } /** - * @return MongodbContext|\PHPUnit_Framework_MockObject_MockObject + * @return MongodbContext|\PHPUnit\Framework\MockObject\MockObject */ private function createMongodbContextMock() { @@ -155,7 +155,7 @@ private function createMongodbContextMock() /** * @param mixed|null $queueName * - * @return Consumer|\PHPUnit_Framework_MockObject_MockObject + * @return Consumer|\PHPUnit\Framework\MockObject\MockObject */ private function createConsumerStub($queueName = null) { diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index ec5bfe34d..3801164b6 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -13,7 +13,7 @@ "php": "^7.1.3", "queue-interop/queue-interop": "^0.7|^0.8", "mongodb/mongodb": "^1.2", - "ext-mongodb": "^1.3" + "ext-mongodb": "^1.5" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/mongodb/phpunit.xml.dist b/pkg/mongodb/phpunit.xml.dist index 1f34af01d..8416ff838 100644 --- a/pkg/mongodb/phpunit.xml.dist +++ b/pkg/mongodb/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/monitoring/phpunit.xml.dist b/pkg/monitoring/phpunit.xml.dist index 6a6148ae4..10678a573 100644 --- a/pkg/monitoring/phpunit.xml.dist +++ b/pkg/monitoring/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/null/phpunit.xml.dist b/pkg/null/phpunit.xml.dist index 2fd4e20c3..2c7c8b1ff 100644 --- a/pkg/null/phpunit.xml.dist +++ b/pkg/null/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php index 7600e9921..c0138c726 100644 --- a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php @@ -222,7 +222,7 @@ public function testRequeueShouldThrowExceptionIfMessageHasNoJob() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Pheanstalk + * @return \PHPUnit\Framework\MockObject\MockObject|Pheanstalk */ private function createPheanstalkMock() { diff --git a/pkg/pheanstalk/Tests/PheanstalkContextTest.php b/pkg/pheanstalk/Tests/PheanstalkContextTest.php index fb92b6a72..9f5ac5812 100644 --- a/pkg/pheanstalk/Tests/PheanstalkContextTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkContextTest.php @@ -73,7 +73,7 @@ public function testShouldDoConnectionDisconnectOnContextClose() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Pheanstalk + * @return \PHPUnit\Framework\MockObject\MockObject|Pheanstalk */ private function createPheanstalkMock() { diff --git a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php index 7a8d0b483..60a19f627 100644 --- a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php @@ -11,6 +11,7 @@ use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; use Pheanstalk\Pheanstalk; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class PheanstalkProducerTest extends TestCase @@ -66,7 +67,7 @@ public function testShouldJsonEncodeMessageAndPutToExpectedTube() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Pheanstalk + * @return MockObject|Pheanstalk */ private function createPheanstalkMock() { diff --git a/pkg/pheanstalk/phpunit.xml.dist b/pkg/pheanstalk/phpunit.xml.dist index 4dca142e1..b24485336 100644 --- a/pkg/pheanstalk/phpunit.xml.dist +++ b/pkg/pheanstalk/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php index e35d97fc0..b40916c15 100644 --- a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php @@ -272,7 +272,7 @@ public function testShouldAllowGetPreviouslySetSerializer() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|KafkaConsumer + * @return \PHPUnit\Framework\MockObject\MockObject|KafkaConsumer */ private function createKafkaConsumerMock() { @@ -280,7 +280,7 @@ private function createKafkaConsumerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|RdKafkaContext + * @return \PHPUnit\Framework\MockObject\MockObject|RdKafkaContext */ private function createContextMock() { @@ -288,7 +288,7 @@ private function createContextMock() } /** - * @return Serializer|\PHPUnit_Framework_MockObject_MockObject|Serializer + * @return Serializer|\PHPUnit\Framework\MockObject\MockObject|Serializer */ private function createSerializerMock() { diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index 1f8e7db8b..7cc601aef 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -206,7 +206,7 @@ public function testShouldAllowSerializersToSerializeKeys() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|ProducerTopic + * @return \PHPUnit\Framework\MockObject\MockObject|ProducerTopic */ private function createKafkaTopicMock() { @@ -214,7 +214,7 @@ private function createKafkaTopicMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Producer + * @return \PHPUnit\Framework\MockObject\MockObject|Producer */ private function createKafkaProducerMock() { @@ -222,7 +222,7 @@ private function createKafkaProducerMock() } /** - * @return Serializer|\PHPUnit_Framework_MockObject_MockObject|Serializer + * @return Serializer|\PHPUnit\Framework\MockObject\MockObject|Serializer */ private function createSerializerMock() { diff --git a/pkg/rdkafka/phpunit.xml.dist b/pkg/rdkafka/phpunit.xml.dist index d899fd655..0f9bb33cc 100644 --- a/pkg/rdkafka/phpunit.xml.dist +++ b/pkg/rdkafka/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php b/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php index 8c95e47de..a63672da8 100644 --- a/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php @@ -27,7 +27,7 @@ public function setUp() $this->context->deleteTopic($this->context->createTopic('enqueue.test_topic')); } - public function tearDown() + public function tearDown(): void { $this->context->close(); } diff --git a/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php b/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php index 87fca37fd..f748020f1 100644 --- a/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php @@ -27,7 +27,7 @@ public function setUp() $this->context->deleteQueue($this->context->createQueue('enqueue.test_queue_reply')); } - public function tearDown() + public function tearDown(): void { $this->context->close(); } diff --git a/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php b/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php index 2d5559d34..41b403565 100644 --- a/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php @@ -27,7 +27,7 @@ public function setUp() $this->context->deleteTopic($this->context->createTopic('enqueue.test_topic')); } - public function tearDown() + public function tearDown(): void { $this->context->close(); } diff --git a/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php b/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php index 50c639f92..d48e4bcb4 100644 --- a/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php @@ -27,7 +27,7 @@ public function setUp() $this->context->deleteQueue($this->context->createQueue('enqueue.test_queue_reply')); } - public function tearDown() + public function tearDown(): void { $this->context->close(); } diff --git a/pkg/redis/Tests/RedisConsumerTest.php b/pkg/redis/Tests/RedisConsumerTest.php index 8c2b1afe0..ed67bd73b 100644 --- a/pkg/redis/Tests/RedisConsumerTest.php +++ b/pkg/redis/Tests/RedisConsumerTest.php @@ -291,7 +291,7 @@ public function testShouldCallRedisRPopAndReturnMessageIfOneInQueueOnReceiveNoWa } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Redis + * @return \PHPUnit\Framework\MockObject\MockObject|Redis */ private function createRedisMock() { @@ -299,7 +299,7 @@ private function createRedisMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|RedisProducer + * @return \PHPUnit\Framework\MockObject\MockObject|RedisProducer */ private function createProducerMock() { @@ -307,7 +307,7 @@ private function createProducerMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|RedisContext + * @return \PHPUnit\Framework\MockObject\MockObject|RedisContext */ private function createContextMock() { diff --git a/pkg/redis/Tests/RedisContextTest.php b/pkg/redis/Tests/RedisContextTest.php index 01ea67df5..0115f27b8 100644 --- a/pkg/redis/Tests/RedisContextTest.php +++ b/pkg/redis/Tests/RedisContextTest.php @@ -231,7 +231,7 @@ public function testShouldReturnExpectedSubscriptionConsumerInstance() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Redis + * @return \PHPUnit\Framework\MockObject\MockObject|Redis */ private function createRedisMock() { diff --git a/pkg/redis/Tests/RedisProducerTest.php b/pkg/redis/Tests/RedisProducerTest.php index daef46b61..7c2c365d4 100644 --- a/pkg/redis/Tests/RedisProducerTest.php +++ b/pkg/redis/Tests/RedisProducerTest.php @@ -128,7 +128,7 @@ public function testShouldCallZaddOnSendWithDeliveryDelay() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|RedisContext + * @return \PHPUnit\Framework\MockObject\MockObject|RedisContext */ private function createContextMock() { @@ -136,7 +136,7 @@ private function createContextMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Redis + * @return \PHPUnit\Framework\MockObject\MockObject|Redis */ private function createRedisMock() { diff --git a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php index 3698ad2ea..ac8300cd2 100644 --- a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php +++ b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php @@ -142,7 +142,7 @@ public function testThrowsIfTryConsumeWithoutSubscribers() } /** - * @return RedisContext|\PHPUnit_Framework_MockObject_MockObject + * @return RedisContext|\PHPUnit\Framework\MockObject\MockObject */ private function createRedisContextMock() { @@ -152,7 +152,7 @@ private function createRedisContextMock() /** * @param mixed|null $queueName * - * @return Consumer|\PHPUnit_Framework_MockObject_MockObject + * @return Consumer|\PHPUnit\Framework\MockObject\MockObject */ private function createConsumerStub($queueName = null) { diff --git a/pkg/redis/phpunit.xml.dist b/pkg/redis/phpunit.xml.dist index 9c4467b56..6abcdf9f4 100644 --- a/pkg/redis/phpunit.xml.dist +++ b/pkg/redis/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 604eb6988..3f9e17518 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -13,11 +13,12 @@ "symfony/config": "^3.4|^4|^5" }, "require-dev": { - "phpunit/phpunit": "~5.5", + "phpunit/phpunit": "~7.5", "enqueue/test": "0.9.x-dev", "enqueue/amqp-ext": "0.9.x-dev", "enqueue/fs": "0.9.x-dev", - "enqueue/null": "0.9.x-dev" + "enqueue/null": "0.9.x-dev", + "symfony/yaml": "^3.4|^4|^5" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/simple-client/phpunit.xml.dist b/pkg/simple-client/phpunit.xml.dist index e86476dec..57d353f74 100644 --- a/pkg/simple-client/phpunit.xml.dist +++ b/pkg/simple-client/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/sns/Tests/SnsProducerTest.php b/pkg/sns/Tests/SnsProducerTest.php index 62f8ae4cf..5f8784905 100644 --- a/pkg/sns/Tests/SnsProducerTest.php +++ b/pkg/sns/Tests/SnsProducerTest.php @@ -233,7 +233,7 @@ public function testShouldPublishWithMergedAttributes() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SnsContext + * @return \PHPUnit\Framework\MockObject\MockObject|SnsContext */ private function createSnsContextMock(): SnsContext { @@ -241,7 +241,7 @@ private function createSnsContextMock(): SnsContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SnsClient + * @return \PHPUnit\Framework\MockObject\MockObject|SnsClient */ private function createSnsClientMock(): SnsClient { diff --git a/pkg/sns/phpunit.xml.dist b/pkg/sns/phpunit.xml.dist index 3fe611e9c..e50e79f9a 100644 --- a/pkg/sns/phpunit.xml.dist +++ b/pkg/sns/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index 336e32033..91b21d7bf 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -115,7 +115,7 @@ public function testShouldSendSqsMessageToSqsProducer() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SnsContext + * @return \PHPUnit\Framework\MockObject\MockObject|SnsContext */ private function createSnsContextMock(): SnsContext { @@ -123,7 +123,7 @@ private function createSnsContextMock(): SnsContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SqsContext + * @return \PHPUnit\Framework\MockObject\MockObject|SqsContext */ private function createSqsContextMock(): SqsContext { diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php index 74fb5db29..ed199180d 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php @@ -15,7 +15,7 @@ class SnsQsSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec use RetryTrait; use SnsQsFactoryTrait; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php index 72e29eeae..53ae719b2 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php @@ -15,7 +15,7 @@ class SnsQsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFro use RetryTrait; use SnsQsFactoryTrait; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php index f32e37a94..24206c9d8 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php @@ -15,7 +15,7 @@ class SnsQsSendToTopicAndReceiveFromQueueSpec extends SendToTopicAndReceiveFromQ use RetryTrait; use SnsQsFactoryTrait; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php index 5d404e4a3..e370c1f32 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -15,7 +15,7 @@ class SnsQsSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiv use RetryTrait; use SnsQsFactoryTrait; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/snsqs/phpunit.xml.dist b/pkg/snsqs/phpunit.xml.dist index e9b3b30e8..69fa7ebb8 100644 --- a/pkg/snsqs/phpunit.xml.dist +++ b/pkg/snsqs/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php index 5c6f11286..13b8809d7 100644 --- a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php +++ b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php @@ -39,7 +39,7 @@ protected function setUp() $this->context->declareQueue($this->queue); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php index 710e918f3..357ed93eb 100644 --- a/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php @@ -24,7 +24,7 @@ class SqsSendAndReceiveDelayedMessageFromQueueTest extends SendAndReceiveDelayed */ private $context; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php index 1a3cdb54e..802d887ac 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php @@ -24,7 +24,7 @@ class SqsSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec */ private $context; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php index b66631233..ac57818aa 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php @@ -24,7 +24,7 @@ class SqsSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec */ private $context; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php index 378e65c13..3f03006d9 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php @@ -24,7 +24,7 @@ class SqsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQ */ private $context; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php index 175af9568..12a3c0c6e 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php @@ -24,7 +24,7 @@ class SqsSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFromT */ private $context; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php index 2f9c8b638..519db1be5 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php @@ -24,7 +24,7 @@ class SqsSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFromQue */ private $context; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php index b4cc5669f..317d7297c 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -24,7 +24,7 @@ class SqsSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveN */ private $context; - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index 9fdded9e2..23e443653 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -448,7 +448,7 @@ public function testShouldReturnNullIfThereIsNoNewMessage() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SqsProducer + * @return \PHPUnit\Framework\MockObject\MockObject|SqsProducer */ private function createProducerMock(): SqsProducer { @@ -456,7 +456,7 @@ private function createProducerMock(): SqsProducer } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SqsClient + * @return \PHPUnit\Framework\MockObject\MockObject|SqsClient */ private function createSqsClientMock(): SqsClient { @@ -464,7 +464,7 @@ private function createSqsClientMock(): SqsClient } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SqsContext + * @return \PHPUnit\Framework\MockObject\MockObject|SqsContext */ private function createContextMock(): SqsContext { diff --git a/pkg/sqs/Tests/SqsContextTest.php b/pkg/sqs/Tests/SqsContextTest.php index 1f5fcf239..75970bbad 100644 --- a/pkg/sqs/Tests/SqsContextTest.php +++ b/pkg/sqs/Tests/SqsContextTest.php @@ -435,7 +435,7 @@ public function testShouldThrowExceptionIfGetQueueUrlResultHasNoQueueUrlProperty } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SqsClient + * @return \PHPUnit\Framework\MockObject\MockObject|SqsClient */ private function createSqsClientMock(): SqsClient { diff --git a/pkg/sqs/Tests/SqsProducerTest.php b/pkg/sqs/Tests/SqsProducerTest.php index 54729adbd..1bda62c48 100644 --- a/pkg/sqs/Tests/SqsProducerTest.php +++ b/pkg/sqs/Tests/SqsProducerTest.php @@ -221,7 +221,7 @@ public function testShouldSendDelayedMessage() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SqsContext + * @return \PHPUnit\Framework\MockObject\MockObject|SqsContext */ private function createSqsContextMock(): SqsContext { @@ -229,7 +229,7 @@ private function createSqsContextMock(): SqsContext } /** - * @return \PHPUnit_Framework_MockObject_MockObject|SqsClient + * @return \PHPUnit\Framework\MockObject\MockObject|SqsClient */ private function createSqsClientMock(): SqsClient { diff --git a/pkg/sqs/phpunit.xml.dist b/pkg/sqs/phpunit.xml.dist index 7c026b4e6..1810857f2 100644 --- a/pkg/sqs/phpunit.xml.dist +++ b/pkg/sqs/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/stomp/Tests/BufferedStompClientTest.php b/pkg/stomp/Tests/BufferedStompClientTest.php index 9e7bfa8df..8732170e9 100644 --- a/pkg/stomp/Tests/BufferedStompClientTest.php +++ b/pkg/stomp/Tests/BufferedStompClientTest.php @@ -179,7 +179,7 @@ public function testShouldAddFirstFrameToBufferIfSubscriptionNotEqualAndReturnSe } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Connection + * @return \PHPUnit\Framework\MockObject\MockObject|Connection */ private function createStompConnectionMock() { diff --git a/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php b/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php index 42250ed96..e2175b8af 100644 --- a/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php @@ -27,7 +27,7 @@ public function setUp() $this->removeQueue('stomp.test'); } - public function tearDown() + public function tearDown(): void { $this->stompContext->close(); } diff --git a/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php b/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php index 3ab8498ab..36357ca21 100644 --- a/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php @@ -35,7 +35,7 @@ public function setUp() $this->removeQueue('stomp.test'); } - public function tearDown() + public function tearDown(): void { $this->stompContext->close(); } diff --git a/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php b/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php index f054ffdd7..4c06d59b1 100644 --- a/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php @@ -30,7 +30,7 @@ public function setUp() $this->removeQueue('stomp.rpc.reply_test'); } - public function tearDown() + public function tearDown(): void { $this->stompContext->close(); } diff --git a/pkg/stomp/Tests/StompConsumerTest.php b/pkg/stomp/Tests/StompConsumerTest.php index 19b16096e..67423f76c 100644 --- a/pkg/stomp/Tests/StompConsumerTest.php +++ b/pkg/stomp/Tests/StompConsumerTest.php @@ -540,7 +540,7 @@ public function testShouldUseTempQueueNameAsSubscriptionId() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Protocol + * @return \PHPUnit\Framework\MockObject\MockObject|Protocol */ private function createStompProtocolMock() { @@ -548,7 +548,7 @@ private function createStompProtocolMock() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|BufferedStompClient + * @return \PHPUnit\Framework\MockObject\MockObject|BufferedStompClient */ private function createStompClientMock() { diff --git a/pkg/stomp/Tests/StompContextTest.php b/pkg/stomp/Tests/StompContextTest.php index 69b577e85..89fc8825b 100644 --- a/pkg/stomp/Tests/StompContextTest.php +++ b/pkg/stomp/Tests/StompContextTest.php @@ -233,7 +233,7 @@ public function testShouldGetBufferedStompClient() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|BufferedStompClient + * @return \PHPUnit\Framework\MockObject\MockObject|BufferedStompClient */ private function createStompClientMock() { diff --git a/pkg/stomp/Tests/StompProducerTest.php b/pkg/stomp/Tests/StompProducerTest.php index a197a5870..e1e542709 100644 --- a/pkg/stomp/Tests/StompProducerTest.php +++ b/pkg/stomp/Tests/StompProducerTest.php @@ -100,7 +100,7 @@ public function testShouldEncodeMessageHeadersAndProperties() } /** - * @return \PHPUnit_Framework_MockObject_MockObject|Client + * @return \PHPUnit\Framework\MockObject\MockObject|Client */ private function createStompClientMock() { diff --git a/pkg/stomp/phpunit.xml.dist b/pkg/stomp/phpunit.xml.dist index a9291bf93..6bbac7035 100644 --- a/pkg/stomp/phpunit.xml.dist +++ b/pkg/stomp/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > diff --git a/pkg/test/GpsExtension.php b/pkg/test/GpsExtension.php index 6d9c412b6..2b03ef64b 100644 --- a/pkg/test/GpsExtension.php +++ b/pkg/test/GpsExtension.php @@ -4,13 +4,14 @@ use Enqueue\Gps\GpsConnectionFactory; use Enqueue\Gps\GpsContext; +use PHPUnit\Framework\SkippedTestError; trait GpsExtension { private function buildGpsContext(): GpsContext { if (false == getenv('GPS_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } $config = getenv('GPS_DSN'); diff --git a/pkg/test/RabbitmqAmqpExtension.php b/pkg/test/RabbitmqAmqpExtension.php index 358147851..28099f12b 100644 --- a/pkg/test/RabbitmqAmqpExtension.php +++ b/pkg/test/RabbitmqAmqpExtension.php @@ -4,6 +4,7 @@ use Enqueue\AmqpExt\AmqpConnectionFactory; use Enqueue\AmqpExt\AmqpContext; +use PHPUnit\Framework\SkippedTestError; trait RabbitmqAmqpExtension { @@ -13,7 +14,7 @@ trait RabbitmqAmqpExtension private function buildAmqpContext() { if (false == $dsn = getenv('AMQP_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } return (new AmqpConnectionFactory($dsn))->createContext(); diff --git a/pkg/test/RabbitmqStompExtension.php b/pkg/test/RabbitmqStompExtension.php index 2ce2dfaa0..d381d1fcf 100644 --- a/pkg/test/RabbitmqStompExtension.php +++ b/pkg/test/RabbitmqStompExtension.php @@ -4,13 +4,14 @@ use Enqueue\Stomp\StompConnectionFactory; use Enqueue\Stomp\StompContext; +use PHPUnit\Framework\SkippedTestError; trait RabbitmqStompExtension { private function buildStompContext(): StompContext { if (false == $dsn = getenv('RABITMQ_STOMP_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } return (new StompConnectionFactory($dsn))->createContext(); diff --git a/pkg/test/RedisExtension.php b/pkg/test/RedisExtension.php index cb32382f9..86586d16b 100644 --- a/pkg/test/RedisExtension.php +++ b/pkg/test/RedisExtension.php @@ -6,13 +6,14 @@ use Enqueue\Redis\PRedis; use Enqueue\Redis\RedisConnectionFactory; use Enqueue\Redis\RedisContext; +use PHPUnit\Framework\SkippedTestError; trait RedisExtension { private function buildPhpRedisContext(): RedisContext { if (false == getenv('PHPREDIS_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } $config = getenv('PHPREDIS_DSN'); @@ -28,7 +29,7 @@ private function buildPhpRedisContext(): RedisContext private function buildPRedisContext(): RedisContext { if (false == getenv('PREDIS_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } $config = getenv('PREDIS_DSN'); diff --git a/pkg/test/RetryTrait.php b/pkg/test/RetryTrait.php index de17565bd..17c96ae89 100644 --- a/pkg/test/RetryTrait.php +++ b/pkg/test/RetryTrait.php @@ -2,9 +2,12 @@ namespace Enqueue\Test; +use PHPUnit\Framework\IncompleteTestError; +use PHPUnit\Framework\SkippedTestError; + trait RetryTrait { - public function runBare() + public function runBare(): void { $e = null; @@ -22,9 +25,9 @@ public function runBare() parent::runBare(); return; - } catch (\PHPUnit_Framework_IncompleteTestError $e) { + } catch (IncompleteTestError $e) { throw $e; - } catch (\PHPUnit_Framework_SkippedTestError $e) { + } catch (SkippedTestError $e) { throw $e; } catch (\Throwable $e) { // last one thrown below diff --git a/pkg/test/SnsExtension.php b/pkg/test/SnsExtension.php index 6c01abe2f..050f212dd 100644 --- a/pkg/test/SnsExtension.php +++ b/pkg/test/SnsExtension.php @@ -4,13 +4,14 @@ use Enqueue\Sns\SnsConnectionFactory; use Enqueue\Sns\SnsContext; +use PHPUnit\Framework\SkippedTestError; trait SnsExtension { private function buildSqsContext(): SnsContext { if (false == $dsn = getenv('SNS_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } return (new SnsConnectionFactory($dsn))->createContext(); diff --git a/pkg/test/SnsQsExtension.php b/pkg/test/SnsQsExtension.php index 719f5ce58..6dc7dc9d9 100644 --- a/pkg/test/SnsQsExtension.php +++ b/pkg/test/SnsQsExtension.php @@ -4,13 +4,14 @@ use Enqueue\SnsQs\SnsQsConnectionFactory; use Enqueue\SnsQs\SnsQsContext; +use PHPUnit\Framework\SkippedTestError; trait SnsQsExtension { private function buildSnsQsContext(): SnsQsContext { if (false == $dsn = getenv('SNSQS_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } return (new SnsQsConnectionFactory($dsn))->createContext(); diff --git a/pkg/test/SqsExtension.php b/pkg/test/SqsExtension.php index 3cc17e47f..c00b42e68 100644 --- a/pkg/test/SqsExtension.php +++ b/pkg/test/SqsExtension.php @@ -4,13 +4,14 @@ use Enqueue\Sqs\SqsConnectionFactory; use Enqueue\Sqs\SqsContext; +use PHPUnit\Framework\SkippedTestError; trait SqsExtension { private function buildSqsContext(): SqsContext { if (false == $dsn = getenv('SQS_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } return (new SqsConnectionFactory($dsn))->createContext(); diff --git a/pkg/test/WampExtension.php b/pkg/test/WampExtension.php index eab5d42b7..5b17fe7cf 100644 --- a/pkg/test/WampExtension.php +++ b/pkg/test/WampExtension.php @@ -4,13 +4,14 @@ use Enqueue\Wamp\WampConnectionFactory; use Enqueue\Wamp\WampContext; +use PHPUnit\Framework\SkippedTestError; trait WampExtension { private function buildWampContext(): WampContext { if (false == $dsn = getenv('WAMP_DSN')) { - throw new \PHPUnit_Framework_SkippedTestError('Functional tests are not allowed in this environment'); + throw new SkippedTestError('Functional tests are not allowed in this environment'); } return (new WampConnectionFactory($dsn))->createContext(); diff --git a/pkg/wamp/README.md b/pkg/wamp/README.md index 22b32d4e2..67f5c9cef 100644 --- a/pkg/wamp/README.md +++ b/pkg/wamp/README.md @@ -14,7 +14,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made [![Total Downloads](https://poser.pugx.org/enqueue/wamp/d/total.png)](https://packagist.org/packages/enqueue/wamp) [![Latest Stable Version](https://poser.pugx.org/enqueue/wamp/version.png)](https://packagist.org/packages/enqueue/wamp) -This is an implementation of [queue interop](https://github.com/queue-interop/queue-interop). It uses [Thruway](https://github.com/voryx/Thruway) internally. +This is an implementation of [queue interop](https://github.com/queue-interop/queue-interop). It uses [Thruway](https://github.com/thruway/client) internally. ## Resources diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 28c2c7065..379e60d3e 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -9,8 +9,8 @@ "php": "^7.1.3", "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", - "thruway/pawl-transport": "^0.5.0", - "voryx/thruway": "^0.5.3" + "thruway/client": "^0.5.0", + "thruway/pawl-transport": "^0.5.0" }, "require-dev": { "phpunit/phpunit": "~5.4.0", diff --git a/pkg/wamp/phpunit.xml.dist b/pkg/wamp/phpunit.xml.dist index 717a3c6db..1648880fe 100644 --- a/pkg/wamp/phpunit.xml.dist +++ b/pkg/wamp/phpunit.xml.dist @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" bootstrap="./vendor/autoload.php" > From 1db193955a29cff8f7612f5f461182939d232b34 Mon Sep 17 00:00:00 2001 From: Mathieu Lemoine Date: Thu, 12 Dec 2019 09:10:53 +0100 Subject: [PATCH 0713/1142] apply new cs-fixer and phpstan rules --- phpstan.neon | 7 +++++ .../AbstractAsyncEventDispatcher.php | 4 --- .../AbstractAsyncListener.php | 3 -- .../AbstractPhpSerializerEventTransformer.php | 9 ------ .../AsyncEventDispatcher.php | 6 ++-- pkg/async-event-dispatcher/AsyncListener.php | 8 ++--- .../EventTransformer.php | 31 +++++++++---------- .../PhpSerializerEventTransformer.php | 15 ++------- .../Tests/Functional/UseCasesTest.php | 14 ++++----- .../Tests/ProxyEventDispatcherTest.php | 1 - .../DoctrinePingConnectionExtension.php | 3 -- .../AbstractMessageQueueCollector.php | 22 ++++++------- .../Functional/App/AbstractAsyncListener.php | 4 --- .../Tests/Functional/App/AsyncListener.php | 10 +++--- .../App/TestAsyncEventTransformer.php | 15 ++------- .../Functional/App/TestAsyncSubscriber.php | 1 - pkg/enqueue/Symfony/Client/ConsumeCommand.php | 6 +--- .../ConfigurableConsumeCommand.php | 5 +-- pkg/redis/Tests/RedisProducerTest.php | 2 +- 19 files changed, 59 insertions(+), 107 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 222a9fe95..b1e660701 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -14,3 +14,10 @@ parameters: - pkg/enqueue-bundle/DependencyInjection/Configuration.php - pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php - pkg/simple-client/SimpleClient.php + ignoreErrors: + - + message: Class Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy not found. + path: %currentWorkingDirectory%/* + - + message: '#.*Symfony\Contracts\EventDispatcher\Event.*#' + path: %currentWorkingDirectory%/* diff --git a/pkg/async-event-dispatcher/AbstractAsyncEventDispatcher.php b/pkg/async-event-dispatcher/AbstractAsyncEventDispatcher.php index c1feb0267..5bc7d270a 100644 --- a/pkg/async-event-dispatcher/AbstractAsyncEventDispatcher.php +++ b/pkg/async-event-dispatcher/AbstractAsyncEventDispatcher.php @@ -19,10 +19,6 @@ abstract class AbstractAsyncEventDispatcher extends EventDispatcher implements E */ protected $asyncListener; - /** - * @param EventDispatcherInterface $trueEventDispatcher - * @param AsyncListener $asyncListener - */ public function __construct(EventDispatcherInterface $trueEventDispatcher, AsyncListener $asyncListener) { $this->trueEventDispatcher = $trueEventDispatcher; diff --git a/pkg/async-event-dispatcher/AbstractAsyncListener.php b/pkg/async-event-dispatcher/AbstractAsyncListener.php index fbf8e1930..d4ac19a1f 100644 --- a/pkg/async-event-dispatcher/AbstractAsyncListener.php +++ b/pkg/async-event-dispatcher/AbstractAsyncListener.php @@ -4,7 +4,6 @@ use Interop\Queue\Context; use Interop\Queue\Queue; -use Symfony\Component\EventDispatcher\Event; abstract class AbstractAsyncListener { @@ -29,8 +28,6 @@ abstract class AbstractAsyncListener protected $syncMode; /** - * @param Context $context - * @param Registry $registry * @param Queue|string $eventQueue */ public function __construct(Context $context, Registry $registry, $eventQueue) diff --git a/pkg/async-event-dispatcher/AbstractPhpSerializerEventTransformer.php b/pkg/async-event-dispatcher/AbstractPhpSerializerEventTransformer.php index d713e01c6..6ac53cbc2 100644 --- a/pkg/async-event-dispatcher/AbstractPhpSerializerEventTransformer.php +++ b/pkg/async-event-dispatcher/AbstractPhpSerializerEventTransformer.php @@ -4,9 +4,6 @@ use Interop\Queue\Context; use Interop\Queue\Message; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; -use Symfony\Contracts\EventDispatcher\Event as ContractEvent; abstract class AbstractPhpSerializerEventTransformer { @@ -15,17 +12,11 @@ abstract class AbstractPhpSerializerEventTransformer */ protected $context; - /** - * @param Context $context - */ public function __construct(Context $context) { $this->context = $context; } - /** - * {@inheritdoc} - */ public function toEvent($eventName, Message $message) { return unserialize($message->getBody()); diff --git a/pkg/async-event-dispatcher/AsyncEventDispatcher.php b/pkg/async-event-dispatcher/AsyncEventDispatcher.php index 44ecd1dd9..1ea464cc9 100644 --- a/pkg/async-event-dispatcher/AsyncEventDispatcher.php +++ b/pkg/async-event-dispatcher/AsyncEventDispatcher.php @@ -7,7 +7,7 @@ if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * Symfony < 4.3 + * Symfony < 4.3. */ class AsyncEventDispatcher extends AbstractAsyncEventDispatcher { @@ -28,7 +28,7 @@ protected function parentDispatch($event, $eventName) } } elseif (class_exists(Event::class)) { /** - * Symfony >= 4.3 and < 5.0 + * Symfony >= 4.3 and < 5.0. */ class AsyncEventDispatcher extends AbstractAsyncEventDispatcher { @@ -49,7 +49,7 @@ protected function parentDispatch($event, $eventName) } } else { /** - * Symfony >= 5.0 + * Symfony >= 5.0. */ class AsyncEventDispatcher extends AbstractAsyncEventDispatcher { diff --git a/pkg/async-event-dispatcher/AsyncListener.php b/pkg/async-event-dispatcher/AsyncListener.php index e3ea3bec1..bacf5202e 100644 --- a/pkg/async-event-dispatcher/AsyncListener.php +++ b/pkg/async-event-dispatcher/AsyncListener.php @@ -8,7 +8,7 @@ if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * Symfony < 4.3 + * Symfony < 4.3. */ class AsyncListener extends AbstractAsyncListener { @@ -18,7 +18,6 @@ public function __invoke(Event $event, $eventName) } /** - * @param Event $event * @param string $eventName */ public function onEvent(Event $event, $eventName) @@ -36,7 +35,7 @@ public function onEvent(Event $event, $eventName) } } elseif (class_exists(Event::class)) { /** - * Symfony >= 4.3 and < 5.0 + * Symfony >= 4.3 and < 5.0. */ class AsyncListener extends AbstractAsyncListener { @@ -68,7 +67,7 @@ public function onEvent($event, $eventName) } } else { /** - * Symfony >= 5.0 + * Symfony >= 5.0. */ class AsyncListener extends AbstractAsyncListener { @@ -78,7 +77,6 @@ public function __invoke(ContractEvent $event, $eventName) } /** - * @param Event $event * @param string $eventName */ public function onEvent(ContractEvent $event, $eventName) diff --git a/pkg/async-event-dispatcher/EventTransformer.php b/pkg/async-event-dispatcher/EventTransformer.php index 5781f5087..f18f23bec 100644 --- a/pkg/async-event-dispatcher/EventTransformer.php +++ b/pkg/async-event-dispatcher/EventTransformer.php @@ -9,13 +9,12 @@ if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * Symfony < 4.3 + * Symfony < 4.3. */ interface EventTransformer { /** - * @param string $eventName - * @param Event|null $event + * @param string $eventName * * @return Message */ @@ -23,20 +22,20 @@ public function toMessage($eventName, Event $event = null); /** * If you able to transform message back to event return it. - * If you failed to transform for some reason you can return a string status (@param string $eventName + * If you failed to transform for some reason you can return a string status. * - * @param Message $message + * @param mixed $eventName * * @return Event|string|object + * * @see Process constants) or an object that implements __toString method. * The object must have a __toString method is supposed to be used as Processor::process return value. - * */ public function toEvent($eventName, Message $message); } } elseif (class_exists(Event::class)) { /** - * Symfony >= 4.3 and < 5.0 + * Symfony >= 4.3 and < 5.0. */ interface EventTransformer { @@ -50,26 +49,25 @@ public function toMessage($eventName, $event = null); /** * If you able to transform message back to event return it. - * If you failed to transform for some reason you can return a string status (@param string $eventName + * If you failed to transform for some reason you can return a string status. * - * @param Message $message + * @param mixed $eventName * * @return ContractEvent|Event|string|object + * * @see Process constants) or an object that implements __toString method. * The object must have a __toString method is supposed to be used as Processor::process return value. - * */ public function toEvent($eventName, Message $message); } } else { /** - * Symfony >= 5.0 + * Symfony >= 5.0. */ interface EventTransformer { /** - * @param string $eventName - * @param ContractEvent|null $event + * @param string $eventName * * @return Message */ @@ -77,14 +75,15 @@ public function toMessage($eventName, ContractEvent $event = null); /** * If you able to transform message back to event return it. - * If you failed to transform for some reason you can return a string status (@param string $eventName + * If you failed to transform for some reason you can return a string status. * - * @param Message $message + * @param mixed $eventNAme + * @param mixed $eventName * * @return ContractEvent|string|object + * * @see Process constants) or an object that implements __toString method. * The object must have a __toString method is supposed to be used as Processor::process return value. - * */ public function toEvent($eventName, Message $message); } diff --git a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php index c6bd4b67c..9348d4dd5 100644 --- a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php +++ b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php @@ -8,13 +8,10 @@ if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * Symfony < 4.3 + * Symfony < 4.3. */ class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer { - /** - * {@inheritdoc} - */ public function toMessage($eventName, Event $event = null) { return $this->context->createMessage(serialize($event)); @@ -22,13 +19,10 @@ public function toMessage($eventName, Event $event = null) } } elseif (class_exists(Event::class)) { /** - * Symfony >= 4.3 and < 5.0 + * Symfony >= 4.3 and < 5.0. */ class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer { - /** - * {@inheritdoc} - */ public function toMessage($eventName, $event = null) { return $this->context->createMessage(serialize($event)); @@ -36,13 +30,10 @@ public function toMessage($eventName, $event = null) } } else { /** - * Symfony >= 5.0 + * Symfony >= 5.0. */ class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer { - /** - * {@inheritdoc} - */ public function toMessage($eventName, ContractEvent $event = null) { return $this->context->createMessage(serialize($event)); diff --git a/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php b/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php index 41aebe559..d05a9add5 100644 --- a/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php +++ b/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php @@ -104,7 +104,7 @@ public function testShouldDispatchBothAsyncEventAndSyncOne() echo "Async event\n"; }); - $this->dispatch($this->dispatcher, new GenericEvent(),'test_async'); + $this->dispatch($this->dispatcher, new GenericEvent(), 'test_async'); $this->processMessages(); $this->expectOutputString("Sync event\nSend message for event: test_async\nAsync event\n"); @@ -115,7 +115,7 @@ public function testShouldDispatchBothAsyncEventAndSyncOneFromWhenDispatchedFrom $this->dispatcher->addListener('foo', function ($event, $name, EventDispatcherInterface $dispatcher) { echo "Foo event\n"; - $this->dispatch($dispatcher, new GenericEvent(),'test_async'); + $this->dispatch($dispatcher, new GenericEvent(), 'test_async'); }); $this->dispatcher->addListener('test_async', function () { @@ -128,7 +128,7 @@ public function testShouldDispatchBothAsyncEventAndSyncOneFromWhenDispatchedFrom echo "Async event\n"; }); - $this->dispatch($this->dispatcher, new GenericEvent(),'foo'); + $this->dispatch($this->dispatcher, new GenericEvent(), 'foo'); $this->processMessages(); @@ -143,14 +143,14 @@ public function testShouldDispatchOtherAsyncEventFromAsyncEvent() $this->asyncDispatcher->addListener('test_async', function ($event, $eventName, EventDispatcherInterface $dispatcher) { echo "Async event\n"; - $this->dispatch($dispatcher, new GenericEvent(),'test_async_from_async'); + $this->dispatch($dispatcher, new GenericEvent(), 'test_async_from_async'); }); $this->dispatcher->addListener('test_async_from_async', function ($event, $eventName, EventDispatcherInterface $dispatcher) { echo "Async event from event\n"; }); - $this->dispatch($this->dispatcher, new GenericEvent(),'test_async'); + $this->dispatch($this->dispatcher, new GenericEvent(), 'test_async'); $this->processMessages(); $this->processMessages(); @@ -169,10 +169,10 @@ public function testShouldDispatchSyncListenerIfDispatchedFromAsycListner() $this->asyncDispatcher->addListener('test_async', function ($event, $eventName, EventDispatcherInterface $dispatcher) { echo "Async event\n"; - $this->dispatch($dispatcher, new GenericEvent(),'sync'); + $this->dispatch($dispatcher, new GenericEvent(), 'sync'); }); - $this->dispatch($this->dispatcher, new GenericEvent(),'test_async'); + $this->dispatch($this->dispatcher, new GenericEvent(), 'test_async'); $this->processMessages(); diff --git a/pkg/async-event-dispatcher/Tests/ProxyEventDispatcherTest.php b/pkg/async-event-dispatcher/Tests/ProxyEventDispatcherTest.php index 905d55a25..eed680aa6 100644 --- a/pkg/async-event-dispatcher/Tests/ProxyEventDispatcherTest.php +++ b/pkg/async-event-dispatcher/Tests/ProxyEventDispatcherTest.php @@ -10,7 +10,6 @@ use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\GenericEvent; -use Symfony\Component\HttpKernel\Kernel; class ProxyEventDispatcherTest extends TestCase { diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php index fbd290461..88453e77c 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php @@ -14,9 +14,6 @@ class DoctrinePingConnectionExtension implements MessageReceivedExtensionInterfa */ protected $registry; - /** - * @param ManagerRegistry $registry - */ public function __construct(ManagerRegistry $registry) { $this->registry = $registry; diff --git a/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php b/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php index 871b2cb62..a63e75431 100644 --- a/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php +++ b/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php @@ -22,17 +22,6 @@ public function addProducer(string $name, ProducerInterface $producer): void $this->producers[$name] = $producer; } - protected function collectInternal(Request $request, Response $response): void - { - $this->data = []; - - foreach ($this->producers as $name => $producer) { - if ($producer instanceof TraceableProducer) { - $this->data[$name] = $producer->getTraces(); - } - } - } - public function getCount(): int { $count = 0; @@ -94,4 +83,15 @@ public function reset() { $this->data = []; } + + protected function collectInternal(Request $request, Response $response): void + { + $this->data = []; + + foreach ($this->producers as $name => $producer) { + if ($producer instanceof TraceableProducer) { + $this->data[$name] = $producer->getTraces(); + } + } + } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/AbstractAsyncListener.php b/pkg/enqueue-bundle/Tests/Functional/App/AbstractAsyncListener.php index 1b3cd9ad9..acf7406e1 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/AbstractAsyncListener.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/AbstractAsyncListener.php @@ -21,10 +21,6 @@ abstract class AbstractAsyncListener extends \Enqueue\AsyncEventDispatcher\Async */ protected $registry; - /** - * @param ProducerInterface $producer - * @param Registry $registry - */ public function __construct(ProducerInterface $producer, Registry $registry) { $this->producer = $producer; diff --git a/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php b/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php index e488fc118..504486ae4 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php @@ -8,12 +8,11 @@ if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * Symfony < 4.3 + * Symfony < 4.3. */ class AsyncListener extends AbstractAsyncListener { /** - * @param Event $event * @param string $eventName */ public function onEvent(Event $event, $eventName) @@ -23,7 +22,7 @@ public function onEvent(Event $event, $eventName) } } elseif (class_exists(Event::class)) { /** - * Symfony >= 4.3 and < 5.0 + * Symfony >= 4.3 and < 5.0. */ class AsyncListener extends AbstractAsyncListener { @@ -38,13 +37,12 @@ public function onEvent($event, $eventName) } } else { /** - * Symfony >= 5.0 + * Symfony >= 5.0. */ class AsyncListener extends AbstractAsyncListener { /** - * @param ContractEvent $event - * @param string $eventName + * @param string $eventName */ public function onEvent(ContractEvent $event, $eventName) { diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php index 6d2ce25b6..93c87fbda 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php @@ -13,7 +13,7 @@ if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { /** - * Symfony < 4.3 + * Symfony < 4.3. */ class TestAsyncEventTransformer implements EventTransformer { @@ -22,9 +22,6 @@ class TestAsyncEventTransformer implements EventTransformer */ private $context; - /** - * @param Context $context - */ public function __construct(Context $context) { $this->context = $context; @@ -60,7 +57,7 @@ public function toEvent($eventName, Message $message) } } elseif (class_exists(Event::class)) { /** - * Symfony >= 4.3 and < 5.0 + * Symfony >= 4.3 and < 5.0. */ class TestAsyncEventTransformer implements EventTransformer { @@ -69,9 +66,6 @@ class TestAsyncEventTransformer implements EventTransformer */ private $context; - /** - * @param Context $context - */ public function __construct(Context $context) { $this->context = $context; @@ -107,7 +101,7 @@ public function toEvent($eventName, Message $message) } } else { /** - * Symfony >= 5.0 + * Symfony >= 5.0. */ class TestAsyncEventTransformer implements EventTransformer { @@ -116,9 +110,6 @@ class TestAsyncEventTransformer implements EventTransformer */ private $context; - /** - * @param Context $context - */ public function __construct(Context $context) { $this->context = $context; diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncSubscriber.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncSubscriber.php index ea8cd026e..cd3beb45b 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncSubscriber.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncSubscriber.php @@ -2,7 +2,6 @@ namespace Enqueue\Bundle\Tests\Functional\App; -use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index 4f6e5edb6..4b65f6276 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -122,11 +122,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $queues = []; foreach ($selectedQueues as $queue) { if (false == array_key_exists($queue, $allQueues)) { - throw new \LogicException(sprintf( - 'There is no such queue "%s". Available are "%s"', - $queue, - implode('", "', array_keys($allQueues)) - )); + throw new \LogicException(sprintf('There is no such queue "%s". Available are "%s"', $queue, implode('", "', array_keys($allQueues)))); } $queues[$queue] = $allQueues[$queue]; diff --git a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php index 9439f7651..9ec8a36f3 100644 --- a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php @@ -92,10 +92,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if (empty($queues)) { - throw new \LogicException(sprintf( - 'The queue is not provided. The processor must implement "%s" interface and it must return not empty array of queues or a queue set using as a second argument.', - QueueSubscriberInterface::class - )); + throw new \LogicException(sprintf('The queue is not provided. The processor must implement "%s" interface and it must return not empty array of queues or a queue set using as a second argument.', QueueSubscriberInterface::class)); } $extensions = $this->getLimitsExtensions($input, $output); diff --git a/pkg/redis/Tests/RedisProducerTest.php b/pkg/redis/Tests/RedisProducerTest.php index 7c2c365d4..fa7260311 100644 --- a/pkg/redis/Tests/RedisProducerTest.php +++ b/pkg/redis/Tests/RedisProducerTest.php @@ -104,7 +104,7 @@ public function testShouldCallZaddOnSendWithDeliveryDelay() ->with( 'aDestination:delayed', $this->isJson(), - $this->equalTo(time() + 5) + $this->equalTo(time() + 5, 1) ) ; From 2f8f6f035f3bcbbe64bab8651c6425a6bd80d307 Mon Sep 17 00:00:00 2001 From: Mathieu Lemoine Date: Thu, 12 Dec 2019 11:56:38 +0100 Subject: [PATCH 0714/1142] drop support for Symfony < 4.3 --- .travis.yml | 27 +++------- composer.json | 2 +- phpstan.neon | 4 +- .../RabbitMqDelayPluginDelayStrategyTest.php | 6 +++ pkg/async-command/composer.json | 16 +++--- .../AsyncEventDispatcher.php | 26 +--------- pkg/async-event-dispatcher/AsyncListener.php | 32 +----------- .../EventTransformer.php | 31 +----------- .../PhpSerializerEventTransformer.php | 16 +----- pkg/async-event-dispatcher/composer.json | 12 ++--- pkg/dbal/Tests/DbalConsumerTest.php | 8 +++ .../Tests/Functional/App/AsyncListener.php | 19 +------ .../App/TestAsyncEventTransformer.php | 49 +------------------ pkg/enqueue-bundle/composer.json | 8 +-- pkg/enqueue/composer.json | 16 +++--- pkg/fs/composer.json | 6 +-- pkg/job-queue/composer.json | 8 +-- pkg/mongodb/Tests/MongodbConsumerTest.php | 8 +++ pkg/simple-client/composer.json | 4 +- 19 files changed, 79 insertions(+), 219 deletions(-) diff --git a/.travis.yml b/.travis.yml index d19429608..76968a051 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,28 +7,19 @@ matrix: include: - php: 7.1 sudo: false - env: SYMFONY_VERSION=3.4.* PHPSTAN=true + env: SYMFONY_VERSION=4.3.* PHPSTAN=true - php: 7.1 sudo: false - env: SYMFONY_VERSION=3.4.* PHP_CS_FIXER=true + env: SYMFONY_VERSION=4.3.* PHP_CS_FIXER=true - php: 7.1 sudo: false - env: SYMFONY_VERSION=3.4.* UNIT_TESTS=true - - php: 7.1 - sudo: false - env: SYMFONY_VERSION=4.0.* UNIT_TESTS=true + env: SYMFONY_VERSION=4.3.* UNIT_TESTS=true - php: 7.2 sudo: false - env: SYMFONY_VERSION=4.0.* UNIT_TESTS=true + env: SYMFONY_VERSION=4.3.* UNIT_TESTS=true - php: 7.2 sudo: false env: SYMFONY_VERSION=5.0.* UNIT_TESTS=true - - php: 7.3 - sudo: false - env: SYMFONY_VERSION=4.1.* UNIT_TESTS=true - - php: 7.3 - sudo: false - env: SYMFONY_VERSION=4.2.* UNIT_TESTS=true - php: 7.3 sudo: false env: SYMFONY_VERSION=4.3.* UNIT_TESTS=true @@ -38,14 +29,10 @@ matrix: - php: 7.3 sudo: false env: SYMFONY_VERSION=5.0.* UNIT_TESTS=true - - php: 7.1 - services: docker - sudo: required - env: SYMFONY_VERSION=3.4.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - php: 7.1 sudo: required services: docker - env: SYMFONY_VERSION=4.0.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true + env: SYMFONY_VERSION=4.3.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - php: 7.3 sudo: required services: docker @@ -53,9 +40,9 @@ matrix: - php: 7.1 sudo: required services: docker - env: SYMFONY_VERSION=3.4.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true + env: SYMFONY_VERSION=4.3.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true allow_failures: - - env: SYMFONY_VERSION=3.4.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true + - env: SYMFONY_VERSION=4.3.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true cache: directories: diff --git a/composer.json b/composer.json index 78f3d42de..866f41d02 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "symfony/http-kernel": "^3.4|^4", "symfony/filesystem": "^3.4|^4", "symfony/framework-bundle": "^3.4|^4", - "symfony/yaml": "^3.4|^4|^5", + "symfony/yaml": "^4.3|^5", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2|^2", "doctrine/mongodb-odm-bundle": "^3.5|^4", diff --git a/phpstan.neon b/phpstan.neon index b1e660701..3bd6187d9 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -16,8 +16,8 @@ parameters: - pkg/simple-client/SimpleClient.php ignoreErrors: - - message: Class Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy not found. + message: '#Class Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy not found#' path: %currentWorkingDirectory%/* - - message: '#.*Symfony\Contracts\EventDispatcher\Event.*#' + message: '#.*Symfony\\Contracts\\EventDispatcher\\Event.*#' path: %currentWorkingDirectory%/* diff --git a/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php b/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php index d3658a558..de2b77ec5 100644 --- a/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php +++ b/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php @@ -194,25 +194,31 @@ public function send(Destination $destination, Message $message): void public function setDeliveryDelay(int $deliveryDelay = null): Producer { + throw new \BadMethodCallException('This should not be called directly'); } public function getDeliveryDelay(): ?int { + throw new \BadMethodCallException('This should not be called directly'); } public function setPriority(int $priority = null): Producer { + throw new \BadMethodCallException('This should not be called directly'); } public function getPriority(): ?int { + throw new \BadMethodCallException('This should not be called directly'); } public function setTimeToLive(int $timeToLive = null): Producer { + throw new \BadMethodCallException('This should not be called directly'); } public function getTimeToLive(): ?int { + throw new \BadMethodCallException('This should not be called directly'); } } diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index e886a0c09..0273ecb25 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -9,16 +9,16 @@ "php": ">=7.1", "enqueue/enqueue": "^0.9", "queue-interop/queue-interop": "^0.7|^0.8", - "symfony/console": "^3.4|^4|^5", - "symfony/process": "^3.4|^4|^5" + "symfony/console": "^4.3|^5", + "symfony/process": "^4.3|^5" }, "require-dev": { "phpunit/phpunit": "~7.5", - "symfony/dependency-injection": "^3.4|^4|^5", - "symfony/config": "^3.4|^4|^5", - "symfony/http-kernel": "^3.4|^4|^5", - "symfony/filesystem": "^3.4|^4|^5", - "symfony/yaml": "^3.4|^4|^5", + "symfony/dependency-injection": "^4.3|^5", + "symfony/config": "^4.3|^5", + "symfony/http-kernel": "^4.3|^5", + "symfony/filesystem": "^4.3|^5", + "symfony/yaml": "^4.3|^5", "enqueue/null": "0.9.x-dev", "enqueue/fs": "0.9.x-dev", "enqueue/test": "0.9.x-dev" @@ -31,7 +31,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "suggest": { - "symfony/dependency-injection": "^3.4|^4|^5 If you'd like to use async event dispatcher container extension." + "symfony/dependency-injection": "^4.3|^5 If you'd like to use async event dispatcher container extension." }, "autoload": { "psr-4": { "Enqueue\\AsyncCommand\\": "" }, diff --git a/pkg/async-event-dispatcher/AsyncEventDispatcher.php b/pkg/async-event-dispatcher/AsyncEventDispatcher.php index 1ea464cc9..153fdc111 100644 --- a/pkg/async-event-dispatcher/AsyncEventDispatcher.php +++ b/pkg/async-event-dispatcher/AsyncEventDispatcher.php @@ -3,32 +3,10 @@ namespace Enqueue\AsyncEventDispatcher; use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; -if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { +if (class_exists(Event::class)) { /** - * Symfony < 4.3. - */ - class AsyncEventDispatcher extends AbstractAsyncEventDispatcher - { - /** - * {@inheritdoc} - */ - public function dispatch($eventName, Event $event = null) - { - $this->parentDispatch($event, $eventName); - - $this->trueEventDispatcher->dispatch($eventName, $event); - } - - protected function parentDispatch($event, $eventName) - { - parent::dispatch($eventName, $event); - } - } -} elseif (class_exists(Event::class)) { - /** - * Symfony >= 4.3 and < 5.0. + * Symfony < 5.0. */ class AsyncEventDispatcher extends AbstractAsyncEventDispatcher { diff --git a/pkg/async-event-dispatcher/AsyncListener.php b/pkg/async-event-dispatcher/AsyncListener.php index bacf5202e..ccbe5b038 100644 --- a/pkg/async-event-dispatcher/AsyncListener.php +++ b/pkg/async-event-dispatcher/AsyncListener.php @@ -3,39 +3,11 @@ namespace Enqueue\AsyncEventDispatcher; use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { +if (class_exists(Event::class)) { /** - * Symfony < 4.3. - */ - class AsyncListener extends AbstractAsyncListener - { - public function __invoke(Event $event, $eventName) - { - $this->onEvent($event, $eventName); - } - - /** - * @param string $eventName - */ - public function onEvent(Event $event, $eventName) - { - if (false == isset($this->syncMode[$eventName])) { - $transformerName = $this->registry->getTransformerNameForEvent($eventName); - - $message = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); - $message->setProperty('event_name', $eventName); - $message->setProperty('transformer_name', $transformerName); - - $this->context->createProducer()->send($this->eventQueue, $message); - } - } - } -} elseif (class_exists(Event::class)) { - /** - * Symfony >= 4.3 and < 5.0. + * Symfony < 5.0. */ class AsyncListener extends AbstractAsyncListener { diff --git a/pkg/async-event-dispatcher/EventTransformer.php b/pkg/async-event-dispatcher/EventTransformer.php index f18f23bec..352930cef 100644 --- a/pkg/async-event-dispatcher/EventTransformer.php +++ b/pkg/async-event-dispatcher/EventTransformer.php @@ -4,38 +4,11 @@ use Interop\Queue\Message; use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { +if (class_exists(Event::class)) { /** - * Symfony < 4.3. - */ - interface EventTransformer - { - /** - * @param string $eventName - * - * @return Message - */ - public function toMessage($eventName, Event $event = null); - - /** - * If you able to transform message back to event return it. - * If you failed to transform for some reason you can return a string status. - * - * @param mixed $eventName - * - * @return Event|string|object - * - * @see Process constants) or an object that implements __toString method. - * The object must have a __toString method is supposed to be used as Processor::process return value. - */ - public function toEvent($eventName, Message $message); - } -} elseif (class_exists(Event::class)) { - /** - * Symfony >= 4.3 and < 5.0. + * Symfony < 5.0. */ interface EventTransformer { diff --git a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php index 9348d4dd5..c6a3e2c97 100644 --- a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php +++ b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php @@ -3,23 +3,11 @@ namespace Enqueue\AsyncEventDispatcher; use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { +if (class_exists(Event::class)) { /** - * Symfony < 4.3. - */ - class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer - { - public function toMessage($eventName, Event $event = null) - { - return $this->context->createMessage(serialize($event)); - } - } -} elseif (class_exists(Event::class)) { - /** - * Symfony >= 4.3 and < 5.0. + * Symfony < 5.0. */ class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer { diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index ffc917b83..efd3f99bc 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -9,15 +9,15 @@ "php": "^7.1.3", "enqueue/enqueue": "^0.9", "queue-interop/queue-interop": "^0.7|^0.8", - "symfony/event-dispatcher": "^3.4|^4|^5" + "symfony/event-dispatcher": "^4.3|^5" }, "require-dev": { "phpunit/phpunit": "~7.5", - "symfony/dependency-injection": "^3.4|^4|^5", - "symfony/config": "^3.4|^4|^5", - "symfony/http-kernel": "^3.4|^4|^5", - "symfony/filesystem": "^3.4|^4|^5", - "symfony/yaml": "^3.4|^4|^5", + "symfony/dependency-injection": "^4.3|^5", + "symfony/config": "^4.3|^5", + "symfony/http-kernel": "^4.3|^5", + "symfony/filesystem": "^4.3|^5", + "symfony/yaml": "^4.3|^5", "enqueue/null": "0.9.x-dev", "enqueue/fs": "0.9.x-dev", "enqueue/test": "0.9.x-dev" diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index 0155b3d6e..add41a1df 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -220,6 +220,7 @@ class InvalidMessage implements Message { public function getBody(): string { + throw new \BadMethodCallException('This should not be called directly'); } public function setBody(string $body): void @@ -232,6 +233,7 @@ public function setProperties(array $properties): void public function getProperties(): array { + throw new \BadMethodCallException('This should not be called directly'); } public function setProperty(string $name, $value): void @@ -248,6 +250,7 @@ public function setHeaders(array $headers): void public function getHeaders(): array { + throw new \BadMethodCallException('This should not be called directly'); } public function setHeader(string $name, $value): void @@ -264,6 +267,7 @@ public function setRedelivered(bool $redelivered): void public function isRedelivered(): bool { + throw new \BadMethodCallException('This should not be called directly'); } public function setCorrelationId(string $correlationId = null): void @@ -272,6 +276,7 @@ public function setCorrelationId(string $correlationId = null): void public function getCorrelationId(): ?string { + throw new \BadMethodCallException('This should not be called directly'); } public function setMessageId(string $messageId = null): void @@ -280,10 +285,12 @@ public function setMessageId(string $messageId = null): void public function getMessageId(): ?string { + throw new \BadMethodCallException('This should not be called directly'); } public function getTimestamp(): ?int { + throw new \BadMethodCallException('This should not be called directly'); } public function setTimestamp(int $timestamp = null): void @@ -296,5 +303,6 @@ public function setReplyTo(string $replyTo = null): void public function getReplyTo(): ?string { + throw new \BadMethodCallException('This should not be called directly'); } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php b/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php index 504486ae4..2248dc5d1 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php @@ -3,26 +3,11 @@ namespace Enqueue\Bundle\Tests\Functional\App; use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { +if (class_exists(Event::class)) { /** - * Symfony < 4.3. - */ - class AsyncListener extends AbstractAsyncListener - { - /** - * @param string $eventName - */ - public function onEvent(Event $event, $eventName) - { - $this->onEventInternal($event, $eventName); - } - } -} elseif (class_exists(Event::class)) { - /** - * Symfony >= 4.3 and < 5.0. + * Symfony < 5.0. */ class AsyncListener extends AbstractAsyncListener { diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php index 93c87fbda..7c85e076c 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php @@ -8,56 +8,11 @@ use Interop\Queue\Message; use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\GenericEvent; -use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; use Symfony\Contracts\EventDispatcher\Event as ContractEvent; -if (class_exists(Event::class) && !class_exists(LegacyEventDispatcherProxy::class)) { +if (class_exists(Event::class)) { /** - * Symfony < 4.3. - */ - class TestAsyncEventTransformer implements EventTransformer - { - /** - * @var Context - */ - private $context; - - public function __construct(Context $context) - { - $this->context = $context; - } - - public function toMessage($eventName, Event $event = null) - { - if (Event::class === get_class($event)) { - return $this->context->createMessage(json_encode('')); - } - - /** @var GenericEvent $event */ - if (false == $event instanceof GenericEvent) { - throw new \LogicException('Must be GenericEvent'); - } - - return $this->context->createMessage(json_encode([ - 'subject' => $event->getSubject(), - 'arguments' => $event->getArguments(), - ])); - } - - public function toEvent($eventName, Message $message) - { - $data = JSON::decode($message->getBody()); - - if ('' === $data) { - return new Event(); - } - - return new GenericEvent($data['subject'], $data['arguments']); - } - } -} elseif (class_exists(Event::class)) { - /** - * Symfony >= 4.3 and < 5.0. + * Symfony < 5.0. */ class TestAsyncEventTransformer implements EventTransformer { diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 38db216b7..75e6c1e94 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "symfony/framework-bundle": "^3.4|^4|^5", + "symfony/framework-bundle": "^4.3|^5", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/enqueue": "^0.9", @@ -39,9 +39,9 @@ "doctrine/doctrine-bundle": "~1.2|^2", "doctrine/mongodb-odm-bundle": "^3.5|^4", "alcaeus/mongo-php-adapter": "^1.0", - "symfony/browser-kit": "^3.4|^4|^5", - "symfony/expression-language": "^3.4|^4|^5", - "symfony/yaml": "^3.4|^4|^5" + "symfony/browser-kit": "^4.3|^5", + "symfony/expression-language": "^4.3|^5", + "symfony/yaml": "^4.3|^5" }, "suggest": { "enqueue/async-command": "If want to run Symfony command via message queue", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 759d7ccbd..84a41b05d 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -17,12 +17,12 @@ }, "require-dev": { "phpunit/phpunit": "~7.5", - "symfony/console": "^3.4|^4|^5", - "symfony/dependency-injection": "^3.4|^4|^5", - "symfony/config": "^3.4|^4|^5", - "symfony/event-dispatcher": "^3.4|^4|^5", - "symfony/http-kernel": "^3.4|^4|^5", - "symfony/yaml": "^3.4|^4|^5", + "symfony/console": "^4.3|^5", + "symfony/dependency-injection": "^4.3|^5", + "symfony/config": "^4.3|^5", + "symfony/event-dispatcher": "^4.3|^5", + "symfony/http-kernel": "^4.3|^5", + "symfony/yaml": "^4.3|^5", "enqueue/amqp-ext": "0.9.x-dev", "enqueue/amqp-lib": "0.9.x-dev", "enqueue/amqp-bunny": "0.9.x-dev", @@ -43,8 +43,8 @@ }, "suggest": { "symfony/console": "^2.8|^3|^4|^5 If you want to use cli commands", - "symfony/dependency-injection": "^3.4|^4|^5", - "symfony/config": "^3.4|^4|^5", + "symfony/dependency-injection": "^4.3|^5", + "symfony/config": "^4.3|^5", "enqueue/amqp-ext": "AMQP transport (based on php extension)", "enqueue/stomp": "STOMP transport", "enqueue/fs": "Filesystem transport", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index d6f6e8e13..39f40ef19 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "queue-interop/queue-interop": "^0.7|^0.8", "enqueue/dsn": "^0.9", - "symfony/filesystem": "^3.4|^4|^5", + "symfony/filesystem": "^4.3|^5", "makasim/temp-file": "^0.2@stable" }, "require-dev": { @@ -17,8 +17,8 @@ "enqueue/null": "0.9.x-dev", "enqueue/test": "0.9.x-dev", "queue-interop/queue-spec": "^0.6", - "symfony/dependency-injection": "^3.4|^4|^5", - "symfony/yaml": "^3.4|^4|^5" + "symfony/dependency-injection": "^4.3|^5", + "symfony/yaml": "^4.3|^5" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 158eb6a7f..653689793 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -16,10 +16,10 @@ "phpunit/phpunit": "~7.5", "enqueue/test": "0.9.x-dev", "doctrine/doctrine-bundle": "~1.2|^2", - "symfony/browser-kit": "^3.4|^4|^5", - "symfony/expression-language": "^3.4|^4|^5", - "symfony/framework-bundle": "^3.4|^4|^5", - "symfony/yaml": "^3.4|^4|^5" + "symfony/browser-kit": "^4.3|^5", + "symfony/expression-language": "^4.3|^5", + "symfony/framework-bundle": "^4.3|^5", + "symfony/yaml": "^4.3|^5" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/mongodb/Tests/MongodbConsumerTest.php b/pkg/mongodb/Tests/MongodbConsumerTest.php index 33212bda9..cd2ee06f8 100644 --- a/pkg/mongodb/Tests/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbConsumerTest.php @@ -133,6 +133,7 @@ class InvalidMessage implements Message { public function getBody(): string { + throw new \BadMethodCallException('This should not be called directly'); } public function setBody(string $body): void @@ -145,6 +146,7 @@ public function setProperties(array $properties): void public function getProperties(): array { + throw new \BadMethodCallException('This should not be called directly'); } public function setProperty(string $name, $value): void @@ -161,6 +163,7 @@ public function setHeaders(array $headers): void public function getHeaders(): array { + throw new \BadMethodCallException('This should not be called directly'); } public function setHeader(string $name, $value): void @@ -177,6 +180,7 @@ public function setRedelivered(bool $redelivered): void public function isRedelivered(): bool { + throw new \BadMethodCallException('This should not be called directly'); } public function setCorrelationId(string $correlationId = null): void @@ -185,6 +189,7 @@ public function setCorrelationId(string $correlationId = null): void public function getCorrelationId(): ?string { + throw new \BadMethodCallException('This should not be called directly'); } public function setMessageId(string $messageId = null): void @@ -193,10 +198,12 @@ public function setMessageId(string $messageId = null): void public function getMessageId(): ?string { + throw new \BadMethodCallException('This should not be called directly'); } public function getTimestamp(): ?int { + throw new \BadMethodCallException('This should not be called directly'); } public function setTimestamp(int $timestamp = null): void @@ -209,5 +216,6 @@ public function setReplyTo(string $replyTo = null): void public function getReplyTo(): ?string { + throw new \BadMethodCallException('This should not be called directly'); } } diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 3f9e17518..18e87e351 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.9", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7|^0.8", - "symfony/config": "^3.4|^4|^5" + "symfony/config": "^4.3|^5" }, "require-dev": { "phpunit/phpunit": "~7.5", @@ -18,7 +18,7 @@ "enqueue/amqp-ext": "0.9.x-dev", "enqueue/fs": "0.9.x-dev", "enqueue/null": "0.9.x-dev", - "symfony/yaml": "^3.4|^4|^5" + "symfony/yaml": "^4.3|^5" }, "support": { "email": "opensource@forma-pro.com", From d02c657f9d0b33d9f53be50909c1adb6861ed593 Mon Sep 17 00:00:00 2001 From: Are Pedersen Date: Fri, 13 Dec 2019 09:17:16 +0100 Subject: [PATCH 0715/1142] Consumer receive should only fetch one message When looping the worker->work() call, the receive method will fetch all messages in the queue, but only return the last one. The fix will return only one message. --- pkg/gearman/GearmanConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gearman/GearmanConsumer.php b/pkg/gearman/GearmanConsumer.php index 7d4bcef23..68f15e045 100644 --- a/pkg/gearman/GearmanConsumer.php +++ b/pkg/gearman/GearmanConsumer.php @@ -59,7 +59,7 @@ public function receive(int $timeout = 0): ?Message $message = GearmanMessage::jsonUnserialize($job->workload()); }); - while ($this->worker->work()); + $this->worker->work(); } finally { restore_error_handler(); } From 38354f7532baff4b2d2d35a4d3393406c39ce5b1 Mon Sep 17 00:00:00 2001 From: hochgenug Date: Wed, 18 Dec 2019 15:53:43 +0100 Subject: [PATCH 0716/1142] Replace the Magento 1 code into the Magento 2 documentation --- docs/magento2/quick_tour.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/magento2/quick_tour.md b/docs/magento2/quick_tour.md index a14836b33..5063ab56c 100644 --- a/docs/magento2/quick_tour.md +++ b/docs/magento2/quick_tour.md @@ -61,13 +61,13 @@ To consume messages you have to define a processor class first: namespace Acme\Module\Helper\Async; -use Interop\Queue\Context; -use Interop\Queue\Message; -use Interop\Queue\Processor; +use Interop\Queue\PsrContext; +use Interop\Queue\PsrMessage; +use Interop\Queue\PsrProcessor; class Foo implements Processor { - public function process(Message $message, Context $context) + public function process(PsrMessage $message, PsrContext $context) { // do job // $message->getBody() -> 'payload' @@ -83,7 +83,7 @@ than subscribe it to a topic or several topics: ```xml - + @@ -91,7 +91,7 @@ than subscribe it to a topic or several topics: a_topic - acme/async_foo + Acme\Module\Helper\Async\foo From 9601badb30f712eb0322539fdc7b640691907a5b Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 19 Dec 2019 09:01:09 +0200 Subject: [PATCH 0717/1142] master is 0.10 --- pkg/amqp-bunny/composer.json | 14 +++---- pkg/amqp-ext/composer.json | 12 +++--- pkg/amqp-lib/composer.json | 12 +++--- pkg/amqp-tools/composer.json | 12 +++--- pkg/async-command/composer.json | 12 +++--- pkg/async-event-dispatcher/composer.json | 12 +++--- pkg/dbal/composer.json | 10 ++--- pkg/dsn/composer.json | 4 +- pkg/enqueue-bundle/composer.json | 34 ++++++++-------- .../DoctrineConnectionFactoryFactoryTest.php | 3 +- pkg/enqueue/composer.json | 40 +++++++++---------- pkg/fs/composer.json | 10 ++--- pkg/gearman/composer.json | 10 ++--- pkg/gps/composer.json | 10 ++--- pkg/job-queue/composer.json | 10 ++--- pkg/mongodb/composer.json | 10 ++--- pkg/monitoring/composer.json | 10 ++--- pkg/null/composer.json | 8 ++-- pkg/pheanstalk/composer.json | 10 ++--- pkg/rdkafka/composer.json | 10 ++--- pkg/redis/composer.json | 12 +++--- pkg/simple-client/composer.json | 14 +++---- pkg/sns/composer.json | 10 ++--- pkg/snsqs/composer.json | 14 +++---- pkg/sqs/composer.json | 10 ++--- pkg/stomp/composer.json | 12 +++--- pkg/test/composer.json | 4 +- pkg/wamp/composer.json | 12 +++--- 28 files changed, 171 insertions(+), 170 deletions(-) diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 63b6addb0..8c8d053be 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -8,14 +8,14 @@ "require": { "php": "^7.1.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8", - "bunny/bunny": "^0.2.4|^0.3|^0.4", - "enqueue/amqp-tools": "^0.9" + "queue-interop/queue-interop": "^0.8", + "bunny/bunny": "^0.4", + "enqueue/amqp-tools": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -34,7 +34,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 1c681f17e..5bc1b3f07 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -9,13 +9,13 @@ "php": "^7.1.3", "ext-amqp": "^1.9.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/amqp-tools": "^0.9" + "queue-interop/queue-interop": "^0.8", + "enqueue/amqp-tools": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6", "empi89/php-amqp-stubs": "*@dev" }, @@ -35,7 +35,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index f5d29ecf6..a04900d1c 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -9,13 +9,13 @@ "php": "^7.1.3", "php-amqplib/php-amqplib": "^2.10", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/amqp-tools": "^0.9" + "queue-interop/queue-interop": "^0.8", + "enqueue/amqp-tools": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -34,7 +34,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index ef2ae274d..6cb280fd5 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -8,13 +8,13 @@ "require": { "php": "^7.1.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/dsn": "^0.9.2" + "queue-interop/queue-interop": "^0.8", + "enqueue/dsn": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev" + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev" }, "support": { "email": "opensource@forma-pro.com", @@ -32,7 +32,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 0273ecb25..a511f8b0e 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -7,8 +7,8 @@ "license": "MIT", "require": { "php": ">=7.1", - "enqueue/enqueue": "^0.9", - "queue-interop/queue-interop": "^0.7|^0.8", + "enqueue/enqueue": "^0.10", + "queue-interop/queue-interop": "^0.8", "symfony/console": "^4.3|^5", "symfony/process": "^4.3|^5" }, @@ -19,9 +19,9 @@ "symfony/http-kernel": "^4.3|^5", "symfony/filesystem": "^4.3|^5", "symfony/yaml": "^4.3|^5", - "enqueue/null": "0.9.x-dev", - "enqueue/fs": "0.9.x-dev", - "enqueue/test": "0.9.x-dev" + "enqueue/null": "0.10.x-dev", + "enqueue/fs": "0.10.x-dev", + "enqueue/test": "0.10.x-dev" }, "support": { "email": "opensource@forma-pro.com", @@ -41,7 +41,7 @@ }, "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index efd3f99bc..dae5bb529 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -7,8 +7,8 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/enqueue": "^0.9", - "queue-interop/queue-interop": "^0.7|^0.8", + "enqueue/enqueue": "^0.10", + "queue-interop/queue-interop": "^0.8", "symfony/event-dispatcher": "^4.3|^5" }, "require-dev": { @@ -18,9 +18,9 @@ "symfony/http-kernel": "^4.3|^5", "symfony/filesystem": "^4.3|^5", "symfony/yaml": "^4.3|^5", - "enqueue/null": "0.9.x-dev", - "enqueue/fs": "0.9.x-dev", - "enqueue/test": "0.9.x-dev" + "enqueue/null": "0.10.x-dev", + "enqueue/fs": "0.10.x-dev", + "enqueue/test": "0.10.x-dev" }, "support": { "email": "opensource@forma-pro.com", @@ -40,7 +40,7 @@ }, "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 253d63d31..01e605105 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -7,14 +7,14 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", + "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.6", "ramsey/uuid": "^3" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -33,7 +33,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/dsn/composer.json b/pkg/dsn/composer.json index 6c2f38189..06ef139e9 100644 --- a/pkg/dsn/composer.json +++ b/pkg/dsn/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3" }, "require-dev": { - "phpunit/phpunit": "~5.4.0" + "phpunit/phpunit": "~7.5" }, "support": { "email": "opensource@forma-pro.com", @@ -27,7 +27,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 75e6c1e94..ee7c5459e 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -9,9 +9,9 @@ "php": "^7.1.3", "symfony/framework-bundle": "^4.3|^5", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/enqueue": "^0.9", - "enqueue/null": "^0.9" + "queue-interop/queue-interop": "^0.8", + "enqueue/enqueue": "^0.10", + "enqueue/null": "^0.10" }, "support": { "email": "opensource@forma-pro.com", @@ -22,19 +22,19 @@ }, "require-dev": { "phpunit/phpunit": "~7.5", - "enqueue/stomp": "0.9.x-dev", - "enqueue/amqp-ext": "0.9.x-dev", - "enqueue/amqp-lib": "0.9.x-dev", - "enqueue/amqp-bunny": "0.9.x-dev", - "enqueue/job-queue": "0.9.x-dev", - "enqueue/fs": "0.9.x-dev", - "enqueue/redis": "0.9.x-dev", - "enqueue/dbal": "0.9.x-dev", - "enqueue/sqs": "0.9.x-dev", - "enqueue/gps": "0.9.x-dev", - "enqueue/test": "0.9.x-dev", - "enqueue/async-event-dispatcher": "0.9.x-dev", - "enqueue/async-command": "0.9.x-dev", + "enqueue/stomp": "0.10.x-dev", + "enqueue/amqp-ext": "0.10.x-dev", + "enqueue/amqp-lib": "0.10.x-dev", + "enqueue/amqp-bunny": "0.10.x-dev", + "enqueue/job-queue": "0.10.x-dev", + "enqueue/fs": "0.10.x-dev", + "enqueue/redis": "0.10.x-dev", + "enqueue/dbal": "0.10.x-dev", + "enqueue/sqs": "0.10.x-dev", + "enqueue/gps": "0.10.x-dev", + "enqueue/test": "0.10.x-dev", + "enqueue/async-event-dispatcher": "0.10.x-dev", + "enqueue/async-command": "0.10.x-dev", "php-amqplib/php-amqplib": "^2.7", "doctrine/doctrine-bundle": "~1.2|^2", "doctrine/mongodb-odm-bundle": "^3.5|^4", @@ -55,7 +55,7 @@ }, "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php index 5aca26dbf..cf1e5918a 100644 --- a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php +++ b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php @@ -8,8 +8,9 @@ use Enqueue\ConnectionFactoryFactoryInterface; use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Doctrine\DoctrineConnectionFactoryFactory; +use PHPUnit\Framework\TestCase; -class DoctrineConnectionFactoryFactoryTest extends \PHPUnit_Framework_TestCase +class DoctrineConnectionFactoryFactoryTest extends TestCase { /** * @var ManagerRegistry|\Prophecy\Prophecy\ObjectProphecy diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 84a41b05d..d95bb23df 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -8,9 +8,9 @@ "require": { "php": "^7.1.3", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/null": "^0.9", - "enqueue/dsn": "^0.9", + "queue-interop/queue-interop": "^0.8", + "enqueue/null": "^0.10", + "enqueue/dsn": "^0.10", "ramsey/uuid": "^2|^3.5", "psr/log": "^1", "psr/container": "^1" @@ -23,23 +23,23 @@ "symfony/event-dispatcher": "^4.3|^5", "symfony/http-kernel": "^4.3|^5", "symfony/yaml": "^4.3|^5", - "enqueue/amqp-ext": "0.9.x-dev", - "enqueue/amqp-lib": "0.9.x-dev", - "enqueue/amqp-bunny": "0.9.x-dev", - "enqueue/pheanstalk": "0.9.x-dev", - "enqueue/gearman": "0.9.x-dev", - "enqueue/rdkafka": "0.9.x-dev", - "enqueue/dbal": "0.9.x-dev", - "enqueue/fs": "0.9.x-dev", - "enqueue/gps": "0.9.x-dev", - "enqueue/redis": "0.9.x-dev", - "enqueue/sqs": "0.9.x-dev", - "enqueue/stomp": "0.9.x-dev", - "enqueue/test": "0.9.x-dev", - "enqueue/simple-client": "0.9.x-dev", - "enqueue/mongodb": "0.9.x-dev", + "enqueue/amqp-ext": "0.10.x-dev", + "enqueue/amqp-lib": "0.10.x-dev", + "enqueue/amqp-bunny": "0.10.x-dev", + "enqueue/pheanstalk": "0.10.x-dev", + "enqueue/gearman": "0.10.x-dev", + "enqueue/rdkafka": "0.10.x-dev", + "enqueue/dbal": "0.10.x-dev", + "enqueue/fs": "0.10.x-dev", + "enqueue/gps": "0.10.x-dev", + "enqueue/redis": "0.10.x-dev", + "enqueue/sqs": "0.10.x-dev", + "enqueue/stomp": "0.10.x-dev", + "enqueue/test": "0.10.x-dev", + "enqueue/simple-client": "0.10.x-dev", + "enqueue/mongodb": "0.10.x-dev", "empi89/php-amqp-stubs": "*@dev", - "enqueue/dsn": "0.9.x-dev" + "enqueue/dsn": "0.10.x-dev" }, "suggest": { "symfony/console": "^2.8|^3|^4|^5 If you want to use cli commands", @@ -73,7 +73,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 39f40ef19..19d2fd841 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -7,15 +7,15 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/dsn": "^0.9", + "queue-interop/queue-interop": "^0.8", + "enqueue/dsn": "^0.10", "symfony/filesystem": "^4.3|^5", "makasim/temp-file": "^0.2@stable" }, "require-dev": { "phpunit/phpunit": "~7.5", - "enqueue/null": "0.9.x-dev", - "enqueue/test": "0.9.x-dev", + "enqueue/null": "0.10.x-dev", + "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6", "symfony/dependency-injection": "^4.3|^5", "symfony/yaml": "^4.3|^5" @@ -36,7 +36,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index 102703aed..a2b2eeccd 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -8,12 +8,12 @@ "require": { "php": "^7.1.3", "ext-gearman": "^2.0", - "queue-interop/queue-interop": "^0.7|^0.8" + "queue-interop/queue-interop": "^0.8" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -32,7 +32,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 46f804ebb..7a9868f2f 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -7,13 +7,13 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", + "queue-interop/queue-interop": "^0.8", "google/cloud-pubsub": "^1.0", - "enqueue/dsn": "^0.9" + "enqueue/dsn": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -32,7 +32,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 653689793..dd31c62c4 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -7,14 +7,14 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/enqueue": "^0.9", - "enqueue/null": "^0.9", - "queue-interop/queue-interop": "^0.7|^0.8", + "enqueue/enqueue": "^0.10", + "enqueue/null": "^0.10", + "queue-interop/queue-interop": "^0.8", "doctrine/orm": "~2.4" }, "require-dev": { "phpunit/phpunit": "~7.5", - "enqueue/test": "0.9.x-dev", + "enqueue/test": "0.10.x-dev", "doctrine/doctrine-bundle": "~1.2|^2", "symfony/browser-kit": "^4.3|^5", "symfony/expression-language": "^4.3|^5", @@ -37,7 +37,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index 3801164b6..055abe0a2 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -11,15 +11,15 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", + "queue-interop/queue-interop": "^0.8", "mongodb/mongodb": "^1.2", "ext-mongodb": "^1.5" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", + "phpunit/phpunit": "~7.5", "queue-interop/queue-spec": "^0.6", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev" + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev" }, "support": { "email": "opensource@forma-pro.com", @@ -37,7 +37,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index df5da85ce..919744f2a 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -7,13 +7,13 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/enqueue": "^0.9", + "enqueue/enqueue": "^0.10", "ramsey/uuid": "^3", - "enqueue/dsn": "^0.9" + "enqueue/dsn": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", "thruway/client": "^0.5", @@ -41,7 +41,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/null/composer.json b/pkg/null/composer.json index 1fa1a2c22..e2ef6c29e 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -7,11 +7,11 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8" + "queue-interop/queue-interop": "^0.8" }, "require-dev": { - "phpunit/phpunit": "~5.5", - "enqueue/test": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -30,7 +30,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index a3e34ee10..7d7907ef1 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -8,12 +8,12 @@ "require": { "php": "^7.1.3", "pda/pheanstalk": "^3", - "queue-interop/queue-interop": "^0.7|^0.8" + "queue-interop/queue-interop": "^0.8" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -32,7 +32,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index e0d55b396..520c05a0f 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -8,12 +8,12 @@ "require": { "php": "^7.1.3", "ext-rdkafka": "^3.0.3", - "queue-interop/queue-interop": "^0.7|^0.8" + "queue-interop/queue-interop": "^0.8" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6", "kwn/php-rdkafka-stubs": "^1.0.2" }, @@ -44,7 +44,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 7e9294548..a067d9a6d 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -7,15 +7,15 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/dsn": "^0.9", + "queue-interop/queue-interop": "^0.8", + "enqueue/dsn": "^0.10", "ramsey/uuid": "^3" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", + "phpunit/phpunit": "~7.5", "predis/predis": "^1.1", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -37,7 +37,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 18e87e351..3b525bf16 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -7,17 +7,17 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/enqueue": "^0.9", + "enqueue/enqueue": "^0.10", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8", + "queue-interop/queue-interop": "^0.8", "symfony/config": "^4.3|^5" }, "require-dev": { "phpunit/phpunit": "~7.5", - "enqueue/test": "0.9.x-dev", - "enqueue/amqp-ext": "0.9.x-dev", - "enqueue/fs": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "enqueue/test": "0.10.x-dev", + "enqueue/amqp-ext": "0.10.x-dev", + "enqueue/fs": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "symfony/yaml": "^4.3|^5" }, "support": { @@ -36,7 +36,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index 81dab9e24..7fb27bffc 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -7,13 +7,13 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/dsn": "^0.9", + "queue-interop/queue-interop": "^0.8", + "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "~3.26" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -32,7 +32,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/snsqs/composer.json b/pkg/snsqs/composer.json index 05eda07bd..19398df34 100644 --- a/pkg/snsqs/composer.json +++ b/pkg/snsqs/composer.json @@ -7,14 +7,14 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/dsn": "^0.9", - "enqueue/sns": "^0.9", - "enqueue/sqs": "^0.9" + "queue-interop/queue-interop": "^0.8", + "enqueue/dsn": "^0.10", + "enqueue/sns": "^0.10", + "enqueue/sqs": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -33,7 +33,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index 0022bf72f..cb21e9905 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -7,13 +7,13 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/dsn": "^0.9", + "queue-interop/queue-interop": "^0.8", + "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "~3.26" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -32,7 +32,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 0f667a8ae..30fe9a2fa 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -7,17 +7,17 @@ "license": "MIT", "require": { "php": "^7.1.3", - "enqueue/dsn": "^0.9", + "enqueue/dsn": "^0.10", "stomp-php/stomp-php": "^4", - "queue-interop/queue-interop": "^0.7|^0.8", + "queue-interop/queue-interop": "^0.8", "php-http/guzzle6-adapter": "^1.1", "php-http/client-common": "^1.7@dev", "richardfullmer/rabbitmq-management-api": "^2.0" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -36,7 +36,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/test/composer.json b/pkg/test/composer.json index 52a5e368a..ad9234cda 100644 --- a/pkg/test/composer.json +++ b/pkg/test/composer.json @@ -10,7 +10,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "require": { - "enqueue/dsn": "^0.9" + "enqueue/dsn": "^0.10" }, "autoload": { "psr-4": { "Enqueue\\Test\\": "" } @@ -18,7 +18,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 379e60d3e..c128997e5 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -7,15 +7,15 @@ "license": "MIT", "require": { "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8", - "enqueue/dsn": "^0.9", + "queue-interop/queue-interop": "^0.8", + "enqueue/dsn": "^0.10", "thruway/client": "^0.5.0", "thruway/pawl-transport": "^0.5.0" }, "require-dev": { - "phpunit/phpunit": "~5.4.0", - "enqueue/test": "0.9.x-dev", - "enqueue/null": "0.9.x-dev", + "phpunit/phpunit": "~7.5", + "enqueue/test": "0.10.x-dev", + "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, "support": { @@ -34,7 +34,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "0.9.x-dev" + "dev-master": "0.10.x-dev" } } } From 6f4b2b1ec287ff5a1c66447b1b75c77ee6d3c8c7 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 19 Dec 2019 09:13:04 +0200 Subject: [PATCH 0718/1142] Release 0.10.0 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86f58e5e4..a314573bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## [0.10.0](https://github.com/php-enqueue/enqueue-dev/tree/0.10.0) (2019-12-19) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.15...0.10.0) + +**Merged pull requests:** + +- Symfony 5 [\#997](https://github.com/php-enqueue/enqueue-dev/pull/997) ([kuraobi](https://github.com/kuraobi)) +- Replace the Magento 1 code into the Magento 2 documentation [\#999](https://github.com/php-enqueue/enqueue-dev/pull/999) ([hochgenug](https://github.com/hochgenug)) +- Wrong parameter description [\#994](https://github.com/php-enqueue/enqueue-dev/pull/994) ([bramstroker](https://github.com/bramstroker)) + ## [0.9.15](https://github.com/php-enqueue/enqueue-dev/tree/0.9.15) (2019-11-28) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.14...0.9.15) From a626076755d670251c3ca249f12dc2d955ce28bf Mon Sep 17 00:00:00 2001 From: Max Kalyabin Date: Sat, 28 Dec 2019 12:04:00 +0300 Subject: [PATCH 0719/1142] fixes #1003 --- pkg/amqp-lib/AmqpContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/amqp-lib/AmqpContext.php b/pkg/amqp-lib/AmqpContext.php index 83167c3db..3628b09c9 100644 --- a/pkg/amqp-lib/AmqpContext.php +++ b/pkg/amqp-lib/AmqpContext.php @@ -172,7 +172,7 @@ public function declareQueue(InteropAmqpQueue $queue): int $queue->getArguments() ? new AMQPTable($queue->getArguments()) : null ); - return $messageCount; + return $messageCount ?? 0; } public function deleteQueue(InteropAmqpQueue $queue): void From f15a7e9e93df177db613fa1b9e9f628af3f691ad Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 2 Jan 2020 23:35:04 +0100 Subject: [PATCH 0720/1142] Use bionic to php 7.4 support --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5570bf4cb..d3d873aa4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ git: depth: 10 language: php +dist: bionic matrix: include: From e6aa278f9723748988b6644c7fef6a13d77109de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20L=C3=A9v=C3=AAque?= Date: Fri, 29 Nov 2019 15:02:30 +0100 Subject: [PATCH 0721/1142] inject messageId to the sqsMessage --- pkg/sqs/SqsConsumer.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index aa91f3df3..d0ada3fb1 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -185,6 +185,10 @@ protected function convertMessage(array $sqsMessage): SqsMessage { $message = $this->context->createMessage(); + if (isset($sqsMessage['MessageId'])) { + $message->setMessageId($sqsMessage['MessageId']); + } + $message->setBody($sqsMessage['Body']); $message->setReceiptHandle($sqsMessage['ReceiptHandle']); From ca12581f204052a64e2de642cd119713743aa07b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20L=C3=A9v=C3=AAque?= Date: Fri, 29 Nov 2019 15:02:30 +0100 Subject: [PATCH 0722/1142] inject messageId to the sqsMessage --- pkg/sqs/SqsConsumer.php | 2 ++ pkg/sqs/Tests/SqsConsumerTest.php | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index d0ada3fb1..dbd476ea2 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -207,6 +207,8 @@ protected function convertMessage(array $sqsMessage): SqsMessage $message->setProperties($headers[1]); } + $message->setMessageId($sqsMessage['MessageId']); + return $message; } } diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index 23e443653..05fbb9b69 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -293,6 +293,7 @@ public function testShouldReceiveMessage() $expectedSqsMessage = [ 'Body' => 'The Body', 'ReceiptHandle' => 'The Receipt', + 'MessageId' => 'theMessageId', 'Attributes' => [ 'SenderId' => 'AROAX5IAWYILCTYIS3OZ5:foo@bar.com', 'ApproximateFirstReceiveTimestamp' => '1560512269481', @@ -337,7 +338,7 @@ public function testShouldReceiveMessage() $this->assertInstanceOf(SqsMessage::class, $result); $this->assertEquals('The Body', $result->getBody()); - $this->assertEquals(['hkey' => 'hvalue'], $result->getHeaders()); + $this->assertEquals(['hkey' => 'hvalue', 'message_id' => 'theMessageId'], $result->getHeaders()); $this->assertEquals(['key' => 'value'], $result->getProperties()); $this->assertEquals([ 'SenderId' => 'AROAX5IAWYILCTYIS3OZ5:foo@bar.com', @@ -347,6 +348,7 @@ public function testShouldReceiveMessage() ], $result->getAttributes()); $this->assertTrue($result->isRedelivered()); $this->assertEquals('The Receipt', $result->getReceiptHandle()); + $this->assertEquals('theMessageId', $result->getMessageId()); } public function testShouldReceiveMessageWithCustomRegion() @@ -368,6 +370,7 @@ public function testShouldReceiveMessageWithCustomRegion() ->willReturn(new Result(['Messages' => [[ 'Body' => 'The Body', 'ReceiptHandle' => 'The Receipt', + 'MessageId' => 'theMessageId', 'Attributes' => [ 'ApproximateReceiveCount' => 3, ], From 84d09e0b62f4fefd906f0018be4cf13bb34cb1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20L=C3=A9v=C3=AAque?= Date: Wed, 4 Dec 2019 14:19:42 +0100 Subject: [PATCH 0723/1142] fix unit test --- pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php index 13b8809d7..ef8263fa6 100644 --- a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php +++ b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php @@ -102,7 +102,8 @@ public function testProduceAndReceiveOneMessageSentDirectlyToQueue() $this->assertEquals(__METHOD__, $message->getBody()); $this->assertEquals(['FooProperty' => 'FooVal'], $message->getProperties()); - $this->assertEquals(['BarHeader' => 'BarVal'], $message->getHeaders()); + $this->assertEquals('BarVal', $message->getHeaders()['BarHeader']); + $this->assertNotNull($message->getMessageId()); } public function testProduceAndReceiveOneMessageSentDirectlyToTopic() From f8a458dc91d8f57a70c692fb7d3999bc58e49fec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20L=C3=A9v=C3=AAque?= Date: Tue, 7 Jan 2020 11:24:00 +0100 Subject: [PATCH 0724/1142] remove useless if --- pkg/sqs/SqsConsumer.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index dbd476ea2..04d5bbd81 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -185,10 +185,6 @@ protected function convertMessage(array $sqsMessage): SqsMessage { $message = $this->context->createMessage(); - if (isset($sqsMessage['MessageId'])) { - $message->setMessageId($sqsMessage['MessageId']); - } - $message->setBody($sqsMessage['Body']); $message->setReceiptHandle($sqsMessage['ReceiptHandle']); From 5736c26f1aef93dc074af4254e690972906d0a6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20L=C3=A9v=C3=AAque?= Date: Tue, 7 Jan 2020 11:38:20 +0100 Subject: [PATCH 0725/1142] fix phpunit test --- pkg/snsqs/Tests/SnsQsProducerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index 91b21d7bf..dd82e4895 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -36,7 +36,7 @@ public function testCouldBeConstructedWithRequiredArguments() public function testShouldThrowIfMessageIsInvalidType() { $this->expectException(InvalidMessageException::class); - $this->expectExceptionMessage('The message must be an instance of Enqueue\SnsQs\SnsQsMessage but it is Double\Message\P1'); + $this->expectExceptionMessage('The message must be an instance of Enqueue\SnsQs\SnsQsMessage but it is Double\Message\P4'); $producer = new SnsQsProducer($this->createSnsContextMock(), $this->createSqsContextMock()); From 0907defc7b05d8af89fbc1ef69b595ad7195e5b9 Mon Sep 17 00:00:00 2001 From: Baptiste Gaillard Date: Wed, 8 Jan 2020 16:37:17 +0100 Subject: [PATCH 0726/1142] SQS Transport - Add support for AWS profiles. --- pkg/sqs/SqsConnectionFactory.php | 14 ++++--- .../Tests/SqsConnectionFactoryConfigTest.php | 41 +++++++++++++++++++ pkg/sqs/Tests/SqsConnectionFactoryTest.php | 2 + 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/pkg/sqs/SqsConnectionFactory.php b/pkg/sqs/SqsConnectionFactory.php index 1a8a967c7..a39cf806a 100644 --- a/pkg/sqs/SqsConnectionFactory.php +++ b/pkg/sqs/SqsConnectionFactory.php @@ -31,7 +31,8 @@ class SqsConnectionFactory implements ConnectionFactory * 'retries' => 3, (int, default=int(3)) Configures the maximum number of allowed retries for a client (pass 0 to disable retries). * 'version' => '2012-11-05', (string, required) The version of the webservice to utilize * 'lazy' => true, Enable lazy connection (boolean) - * 'endpoint' => null (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack + * 'endpoint' => null, (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack + * 'profile' => null, (string, default=null) The name of an AWS profile to used, if provided the SDK will attempt to read associated credentials from the ~/.aws/credentials file. * 'queue_owner_aws_account_id' The AWS account ID of the account that created the queue. * ]. * @@ -92,6 +93,10 @@ private function establishConnection(): SqsClient $config['endpoint'] = $this->config['endpoint']; } + if (isset($this->config['profile'])) { + $config['profile'] = $this->config['profile']; + } + if ($this->config['key'] && $this->config['secret']) { $config['credentials'] = [ 'key' => $this->config['key'], @@ -120,10 +125,7 @@ private function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if ('sqs' !== $dsn->getSchemeProtocol()) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be "sqs"', - $dsn->getSchemeProtocol() - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be "sqs"', $dsn->getSchemeProtocol())); } return array_filter(array_replace($dsn->getQuery(), [ @@ -135,6 +137,7 @@ private function parseDsn(string $dsn): array 'version' => $dsn->getString('version'), 'lazy' => $dsn->getBool('lazy'), 'endpoint' => $dsn->getString('endpoint'), + 'profile' => $dsn->getString('profile'), 'queue_owner_aws_account_id' => $dsn->getString('queue_owner_aws_account_id'), ]), function ($value) { return null !== $value; }); } @@ -150,6 +153,7 @@ private function defaultConfig(): array 'version' => '2012-11-05', 'lazy' => true, 'endpoint' => null, + 'profile' => null, 'queue_owner_aws_account_id' => null, ]; } diff --git a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php index 375b0d03a..8225a4d34 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php @@ -63,6 +63,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => true, 'endpoint' => null, + 'profile' => null, 'queue_owner_aws_account_id' => null, ], ]; @@ -78,6 +79,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => true, 'endpoint' => null, + 'profile' => null, 'queue_owner_aws_account_id' => null, ], ]; @@ -93,6 +95,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => true, 'endpoint' => null, + 'profile' => null, 'queue_owner_aws_account_id' => null, ], ]; @@ -108,6 +111,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => false, 'endpoint' => null, + 'profile' => null, 'queue_owner_aws_account_id' => null, ], ]; @@ -123,6 +127,23 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => false, 'endpoint' => null, + 'profile' => null, + 'queue_owner_aws_account_id' => null, + ], + ]; + + yield [ + ['dsn' => 'sqs:?profile=staging&lazy=0'], + [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'retries' => 3, + 'version' => '2012-11-05', + 'lazy' => false, + 'endpoint' => null, + 'profile' => 'staging', 'queue_owner_aws_account_id' => null, ], ]; @@ -138,6 +159,7 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => false, 'endpoint' => null, + 'profile' => null, 'queue_owner_aws_account_id' => null, ], ]; @@ -159,6 +181,25 @@ public static function provideConfigs() 'version' => '2012-11-05', 'lazy' => false, 'endpoint' => 'http://localstack:1111/', + 'profile' => null, + 'queue_owner_aws_account_id' => null, + ], + ]; + + yield [ + [ + 'profile' => 'staging', + ], + [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'retries' => 3, + 'version' => '2012-11-05', + 'lazy' => true, + 'endpoint' => null, + 'profile' => 'staging', 'queue_owner_aws_account_id' => null, ], ]; diff --git a/pkg/sqs/Tests/SqsConnectionFactoryTest.php b/pkg/sqs/Tests/SqsConnectionFactoryTest.php index 056ecc41b..189cfe7f8 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryTest.php @@ -32,6 +32,7 @@ public function testCouldBeConstructedWithEmptyConfiguration() 'retries' => 3, 'version' => '2012-11-05', 'endpoint' => null, + 'profile' => null, 'queue_owner_aws_account_id' => null, ], 'config', $factory); } @@ -49,6 +50,7 @@ public function testCouldBeConstructedWithCustomConfiguration() 'retries' => 3, 'version' => '2012-11-05', 'endpoint' => null, + 'profile' => null, 'queue_owner_aws_account_id' => null, ], 'config', $factory); } From c9fe07c04017e324d00b0ef99233ad70a93806b1 Mon Sep 17 00:00:00 2001 From: Baptiste Gaillard Date: Wed, 8 Jan 2020 17:43:54 +0100 Subject: [PATCH 0727/1142] Fix CI error. --- pkg/snsqs/Tests/SnsQsProducerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index 91b21d7bf..dd82e4895 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -36,7 +36,7 @@ public function testCouldBeConstructedWithRequiredArguments() public function testShouldThrowIfMessageIsInvalidType() { $this->expectException(InvalidMessageException::class); - $this->expectExceptionMessage('The message must be an instance of Enqueue\SnsQs\SnsQsMessage but it is Double\Message\P1'); + $this->expectExceptionMessage('The message must be an instance of Enqueue\SnsQs\SnsQsMessage but it is Double\Message\P4'); $producer = new SnsQsProducer($this->createSnsContextMock(), $this->createSqsContextMock()); From 41069e6e1d3b3b5f9d06c9aa20035d1c26775854 Mon Sep 17 00:00:00 2001 From: Rudy den Otter Date: Fri, 10 Jan 2020 14:36:20 +0100 Subject: [PATCH 0728/1142] Catch consume error "Local: Broker transport failure" and continue consuming --- pkg/rdkafka/RdKafkaConsumer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index 88b05adac..6ec89aaf5 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -161,6 +161,7 @@ private function doReceive(int $timeout): ?RdKafkaMessage switch ($kafkaMessage->err) { case RD_KAFKA_RESP_ERR__PARTITION_EOF: case RD_KAFKA_RESP_ERR__TIMED_OUT: + case RD_KAFKA_RESP_ERR__TRANSPORT: return null; case RD_KAFKA_RESP_ERR_NO_ERROR: $message = $this->serializer->toMessage($kafkaMessage->payload); From f2bd9db9f044748dad2c9f3de37af371b68e0edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20L=C3=A9v=C3=AAque?= Date: Tue, 14 Jan 2020 11:04:32 +0100 Subject: [PATCH 0729/1142] use a property for the messageId --- pkg/sqs/SqsMessage.php | 9 +++++++-- pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php | 2 +- pkg/sqs/Tests/SqsConsumerTest.php | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pkg/sqs/SqsMessage.php b/pkg/sqs/SqsMessage.php index cd2b1bdfe..d1cf77d3c 100644 --- a/pkg/sqs/SqsMessage.php +++ b/pkg/sqs/SqsMessage.php @@ -58,6 +58,11 @@ class SqsMessage implements Message */ private $requeueVisibilityTimeout; + /** + * @var string|null + */ + private $messageId; + public function __construct(string $body = '', array $properties = [], array $headers = []) { $this->body = $body; @@ -166,12 +171,12 @@ public function getCorrelationId(): ?string public function setMessageId(string $messageId = null): void { - $this->setHeader('message_id', $messageId); + $this->messageId = $messageId; } public function getMessageId(): ?string { - return $this->getHeader('message_id'); + return $this->messageId; } public function getTimestamp(): ?int diff --git a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php index ef8263fa6..4486ca8a8 100644 --- a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php +++ b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php @@ -102,7 +102,7 @@ public function testProduceAndReceiveOneMessageSentDirectlyToQueue() $this->assertEquals(__METHOD__, $message->getBody()); $this->assertEquals(['FooProperty' => 'FooVal'], $message->getProperties()); - $this->assertEquals('BarVal', $message->getHeaders()['BarHeader']); + $this->assertEquals(['BarHeader' => 'BarVal'], $message->getHeaders()); $this->assertNotNull($message->getMessageId()); } diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index 05fbb9b69..ed2a7b276 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -338,7 +338,7 @@ public function testShouldReceiveMessage() $this->assertInstanceOf(SqsMessage::class, $result); $this->assertEquals('The Body', $result->getBody()); - $this->assertEquals(['hkey' => 'hvalue', 'message_id' => 'theMessageId'], $result->getHeaders()); + $this->assertEquals(['hkey' => 'hvalue'], $result->getHeaders()); $this->assertEquals(['key' => 'value'], $result->getProperties()); $this->assertEquals([ 'SenderId' => 'AROAX5IAWYILCTYIS3OZ5:foo@bar.com', From b7a9877f439bef66ede43a48465fc959923e28ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20L=C3=A9v=C3=AAque?= Date: Tue, 14 Jan 2020 11:30:25 +0100 Subject: [PATCH 0730/1142] Revert "use a property for the messageId" This reverts commit f2bd9db9f044748dad2c9f3de37af371b68e0edf. --- pkg/sqs/SqsMessage.php | 9 ++------- pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php | 2 +- pkg/sqs/Tests/SqsConsumerTest.php | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/pkg/sqs/SqsMessage.php b/pkg/sqs/SqsMessage.php index d1cf77d3c..cd2b1bdfe 100644 --- a/pkg/sqs/SqsMessage.php +++ b/pkg/sqs/SqsMessage.php @@ -58,11 +58,6 @@ class SqsMessage implements Message */ private $requeueVisibilityTimeout; - /** - * @var string|null - */ - private $messageId; - public function __construct(string $body = '', array $properties = [], array $headers = []) { $this->body = $body; @@ -171,12 +166,12 @@ public function getCorrelationId(): ?string public function setMessageId(string $messageId = null): void { - $this->messageId = $messageId; + $this->setHeader('message_id', $messageId); } public function getMessageId(): ?string { - return $this->messageId; + return $this->getHeader('message_id'); } public function getTimestamp(): ?int diff --git a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php index 4486ca8a8..ef8263fa6 100644 --- a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php +++ b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php @@ -102,7 +102,7 @@ public function testProduceAndReceiveOneMessageSentDirectlyToQueue() $this->assertEquals(__METHOD__, $message->getBody()); $this->assertEquals(['FooProperty' => 'FooVal'], $message->getProperties()); - $this->assertEquals(['BarHeader' => 'BarVal'], $message->getHeaders()); + $this->assertEquals('BarVal', $message->getHeaders()['BarHeader']); $this->assertNotNull($message->getMessageId()); } diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index ed2a7b276..05fbb9b69 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -338,7 +338,7 @@ public function testShouldReceiveMessage() $this->assertInstanceOf(SqsMessage::class, $result); $this->assertEquals('The Body', $result->getBody()); - $this->assertEquals(['hkey' => 'hvalue'], $result->getHeaders()); + $this->assertEquals(['hkey' => 'hvalue', 'message_id' => 'theMessageId'], $result->getHeaders()); $this->assertEquals(['key' => 'value'], $result->getProperties()); $this->assertEquals([ 'SenderId' => 'AROAX5IAWYILCTYIS3OZ5:foo@bar.com', From b77f945cbd6268ceef025e5deee762c19e7297ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 27 Jan 2020 00:45:10 +0100 Subject: [PATCH 0731/1142] Add schema declaration to phpunit files. Remove parameters set to phpunit defaults. --- phpunit.xml.dist | 24 ++++++++++++--------- pkg/amqp-bunny/phpunit.xml.dist | 16 ++++++-------- pkg/amqp-ext/phpunit.xml.dist | 16 ++++++-------- pkg/amqp-lib/phpunit.xml.dist | 16 ++++++-------- pkg/async-event-dispatcher/phpunit.xml.dist | 16 ++++++-------- pkg/dbal/phpunit.xml.dist | 16 ++++++-------- pkg/dsn/phpunit.xml.dist | 16 ++++++-------- pkg/enqueue-bundle/phpunit.xml.dist | 16 ++++++-------- pkg/enqueue/phpunit.xml.dist | 16 ++++++-------- pkg/fs/phpunit.xml.dist | 16 ++++++-------- pkg/gearman/phpunit.xml.dist | 16 ++++++-------- pkg/gps/phpunit.xml.dist | 16 ++++++-------- pkg/job-queue/phpunit.xml.dist | 16 ++++++-------- pkg/mongodb/phpunit.xml.dist | 16 ++++++-------- pkg/monitoring/phpunit.xml.dist | 16 ++++++-------- pkg/null/phpunit.xml.dist | 16 ++++++-------- pkg/pheanstalk/phpunit.xml.dist | 16 ++++++-------- pkg/rdkafka/phpunit.xml.dist | 24 ++++++++++++--------- pkg/redis/phpunit.xml.dist | 16 ++++++-------- pkg/simple-client/phpunit.xml.dist | 16 ++++++-------- pkg/sns/phpunit.xml.dist | 16 ++++++-------- pkg/snsqs/phpunit.xml.dist | 16 ++++++-------- pkg/sqs/phpunit.xml.dist | 16 ++++++-------- pkg/stomp/phpunit.xml.dist | 16 ++++++-------- pkg/wamp/phpunit.xml.dist | 16 ++++++-------- 25 files changed, 166 insertions(+), 250 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 3db683ec7..43abe1afc 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,15 +1,19 @@ - + diff --git a/pkg/amqp-bunny/phpunit.xml.dist b/pkg/amqp-bunny/phpunit.xml.dist index 0db15a427..3ca071a57 100644 --- a/pkg/amqp-bunny/phpunit.xml.dist +++ b/pkg/amqp-bunny/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/amqp-ext/phpunit.xml.dist b/pkg/amqp-ext/phpunit.xml.dist index b24485336..1e72c01a2 100644 --- a/pkg/amqp-ext/phpunit.xml.dist +++ b/pkg/amqp-ext/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/amqp-lib/phpunit.xml.dist b/pkg/amqp-lib/phpunit.xml.dist index 258e20c5e..2c5fe1f6a 100644 --- a/pkg/amqp-lib/phpunit.xml.dist +++ b/pkg/amqp-lib/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/async-event-dispatcher/phpunit.xml.dist b/pkg/async-event-dispatcher/phpunit.xml.dist index b4c8fec08..e5c3f6d2d 100644 --- a/pkg/async-event-dispatcher/phpunit.xml.dist +++ b/pkg/async-event-dispatcher/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/dbal/phpunit.xml.dist b/pkg/dbal/phpunit.xml.dist index 8b2213d34..55a8d1f29 100644 --- a/pkg/dbal/phpunit.xml.dist +++ b/pkg/dbal/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/dsn/phpunit.xml.dist b/pkg/dsn/phpunit.xml.dist index 8709cdcf6..43b743e2a 100644 --- a/pkg/dsn/phpunit.xml.dist +++ b/pkg/dsn/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/enqueue-bundle/phpunit.xml.dist b/pkg/enqueue-bundle/phpunit.xml.dist index 9058a1c0c..974d2c3f5 100644 --- a/pkg/enqueue-bundle/phpunit.xml.dist +++ b/pkg/enqueue-bundle/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/enqueue/phpunit.xml.dist b/pkg/enqueue/phpunit.xml.dist index 2b99dda0b..69c12ca1e 100644 --- a/pkg/enqueue/phpunit.xml.dist +++ b/pkg/enqueue/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/fs/phpunit.xml.dist b/pkg/fs/phpunit.xml.dist index ccc9b044b..79088ae1d 100644 --- a/pkg/fs/phpunit.xml.dist +++ b/pkg/fs/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/gearman/phpunit.xml.dist b/pkg/gearman/phpunit.xml.dist index 26f1d81f1..6b750813c 100644 --- a/pkg/gearman/phpunit.xml.dist +++ b/pkg/gearman/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/gps/phpunit.xml.dist b/pkg/gps/phpunit.xml.dist index af7972bc6..77f02571a 100644 --- a/pkg/gps/phpunit.xml.dist +++ b/pkg/gps/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/job-queue/phpunit.xml.dist b/pkg/job-queue/phpunit.xml.dist index d82f4457f..3665922c4 100644 --- a/pkg/job-queue/phpunit.xml.dist +++ b/pkg/job-queue/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/mongodb/phpunit.xml.dist b/pkg/mongodb/phpunit.xml.dist index 8416ff838..6b9960935 100644 --- a/pkg/mongodb/phpunit.xml.dist +++ b/pkg/mongodb/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/monitoring/phpunit.xml.dist b/pkg/monitoring/phpunit.xml.dist index 10678a573..254ab22d6 100644 --- a/pkg/monitoring/phpunit.xml.dist +++ b/pkg/monitoring/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/null/phpunit.xml.dist b/pkg/null/phpunit.xml.dist index 2c7c8b1ff..07729246d 100644 --- a/pkg/null/phpunit.xml.dist +++ b/pkg/null/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/pheanstalk/phpunit.xml.dist b/pkg/pheanstalk/phpunit.xml.dist index b24485336..1e72c01a2 100644 --- a/pkg/pheanstalk/phpunit.xml.dist +++ b/pkg/pheanstalk/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/rdkafka/phpunit.xml.dist b/pkg/rdkafka/phpunit.xml.dist index 0f9bb33cc..a20efef51 100644 --- a/pkg/rdkafka/phpunit.xml.dist +++ b/pkg/rdkafka/phpunit.xml.dist @@ -1,15 +1,19 @@ - + diff --git a/pkg/redis/phpunit.xml.dist b/pkg/redis/phpunit.xml.dist index 6abcdf9f4..22691000e 100644 --- a/pkg/redis/phpunit.xml.dist +++ b/pkg/redis/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/simple-client/phpunit.xml.dist b/pkg/simple-client/phpunit.xml.dist index 57d353f74..81d59cfaf 100644 --- a/pkg/simple-client/phpunit.xml.dist +++ b/pkg/simple-client/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/sns/phpunit.xml.dist b/pkg/sns/phpunit.xml.dist index e50e79f9a..5f01f5897 100644 --- a/pkg/sns/phpunit.xml.dist +++ b/pkg/sns/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/snsqs/phpunit.xml.dist b/pkg/snsqs/phpunit.xml.dist index 69fa7ebb8..9adb0b184 100644 --- a/pkg/snsqs/phpunit.xml.dist +++ b/pkg/snsqs/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/sqs/phpunit.xml.dist b/pkg/sqs/phpunit.xml.dist index 1810857f2..8fbb94ebf 100644 --- a/pkg/sqs/phpunit.xml.dist +++ b/pkg/sqs/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/stomp/phpunit.xml.dist b/pkg/stomp/phpunit.xml.dist index 6bbac7035..ae7136aca 100644 --- a/pkg/stomp/phpunit.xml.dist +++ b/pkg/stomp/phpunit.xml.dist @@ -1,15 +1,11 @@ - + diff --git a/pkg/wamp/phpunit.xml.dist b/pkg/wamp/phpunit.xml.dist index 1648880fe..9e8558ce8 100644 --- a/pkg/wamp/phpunit.xml.dist +++ b/pkg/wamp/phpunit.xml.dist @@ -1,15 +1,11 @@ - + From f0bfa9e12e5472b4c469df2527c0e49cfba72d41 Mon Sep 17 00:00:00 2001 From: Christian Alexander Wolf Date: Mon, 27 Jan 2020 09:38:58 +0100 Subject: [PATCH 0732/1142] fix: use parse_url() only if scheme is not sqlite* --- pkg/dbal/DbalConnectionFactory.php | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/pkg/dbal/DbalConnectionFactory.php b/pkg/dbal/DbalConnectionFactory.php index 077bd0e3c..b570af07e 100644 --- a/pkg/dbal/DbalConnectionFactory.php +++ b/pkg/dbal/DbalConnectionFactory.php @@ -91,25 +91,19 @@ private function establishConnection(): Connection return $this->connection; } - /** - * @param string $dsn - * @param array|null $config - * - * @return array - */ private function parseDsn(string $dsn, array $config = null): array { if (false === strpos($dsn, ':')) { throw new \LogicException(sprintf('The DSN is invalid. It does not have scheme separator ":".')); } - if (false === parse_url(http://github.com/$dsn)) { + list($scheme) = explode(':', $dsn, 2); + $scheme = strtolower($scheme); + + if (false === strpos($scheme, 'sqlite') && false === parse_url(http://github.com/$dsn)) { throw new \LogicException(sprintf('Failed to parse DSN "%s"', $dsn)); } - list($scheme) = explode(':', $dsn, 2); - - $scheme = strtolower($scheme); if (false == preg_match('/^[a-z\d+-.]*$/', $scheme)) { throw new \LogicException('The DSN is invalid. Scheme contains illegal symbols.'); } @@ -131,11 +125,7 @@ private function parseDsn(string $dsn, array $config = null): array ]; if (false == isset($supported[$scheme])) { - throw new \LogicException(sprintf( - 'The given DSN schema "%s" is not supported. There are supported schemes: "%s".', - $scheme, - implode('", "', array_keys($supported)) - )); + throw new \LogicException(sprintf('The given DSN schema "%s" is not supported. There are supported schemes: "%s".', $scheme, implode('", "', array_keys($supported)))); } $doctrineScheme = $supported[$scheme]; From 9d922eb48225c5867447a212217511aafb01c666 Mon Sep 17 00:00:00 2001 From: Christian Alexander Wolf Date: Wed, 29 Jan 2020 08:16:07 +0100 Subject: [PATCH 0733/1142] fix: switch to DSN class, add tests --- pkg/dbal/DbalConnectionFactory.php | 30 ++++++-------------- pkg/dbal/Tests/DbalConnectionFactoryTest.php | 28 ++++++++++++++++++ 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/pkg/dbal/DbalConnectionFactory.php b/pkg/dbal/DbalConnectionFactory.php index b570af07e..2e0fe702e 100644 --- a/pkg/dbal/DbalConnectionFactory.php +++ b/pkg/dbal/DbalConnectionFactory.php @@ -6,6 +6,7 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\DriverManager; +use Enqueue\Dsn\Dsn; use Interop\Queue\ConnectionFactory; use Interop\Queue\Context; @@ -93,20 +94,7 @@ private function establishConnection(): Connection private function parseDsn(string $dsn, array $config = null): array { - if (false === strpos($dsn, ':')) { - throw new \LogicException(sprintf('The DSN is invalid. It does not have scheme separator ":".')); - } - - list($scheme) = explode(':', $dsn, 2); - $scheme = strtolower($scheme); - - if (false === strpos($scheme, 'sqlite') && false === parse_url(http://github.com/$dsn)) { - throw new \LogicException(sprintf('Failed to parse DSN "%s"', $dsn)); - } - - if (false == preg_match('/^[a-z\d+-.]*$/', $scheme)) { - throw new \LogicException('The DSN is invalid. Scheme contains illegal symbols.'); - } + $parsedDsn = Dsn::parseFirst($dsn); $supported = [ 'db2' => 'db2', @@ -124,13 +112,13 @@ private function parseDsn(string $dsn, array $config = null): array 'sqlite+pdo' => 'pdo_sqlite', ]; - if (false == isset($supported[$scheme])) { - throw new \LogicException(sprintf('The given DSN schema "%s" is not supported. There are supported schemes: "%s".', $scheme, implode('", "', array_keys($supported)))); + if ($parsedDsn && false == isset($supported[$parsedDsn->getScheme()])) { + throw new \LogicException(sprintf('The given DSN schema "%s" is not supported. There are supported schemes: "%s".', $parsedDsn->getScheme(), implode('", "', array_keys($supported)))); } - $doctrineScheme = $supported[$scheme]; - - if ($scheme.':' === $dsn && is_array($config) && array_key_exists('connection', $config)) { + $doctrineScheme = $supported[$parsedDsn->getScheme()]; + $dsnHasProtocolOnly = $parsedDsn->getScheme().':' === $dsn; + if ($dsnHasProtocolOnly && is_array($config) && array_key_exists('connection', $config)) { $default = [ 'driver' => $doctrineScheme, 'host' => 'localhost', @@ -148,9 +136,9 @@ private function parseDsn(string $dsn, array $config = null): array return [ 'lazy' => true, 'connection' => [ - 'url' => $scheme.':' === $dsn ? + 'url' => $dsnHasProtocolOnly ? $doctrineScheme.'://root@localhost' : - str_replace($scheme, $doctrineScheme, $dsn), + str_replace($parsedDsn->getScheme(), $doctrineScheme, $dsn), ], ]; } diff --git a/pkg/dbal/Tests/DbalConnectionFactoryTest.php b/pkg/dbal/Tests/DbalConnectionFactoryTest.php index 15e2659e1..b4a6857f6 100644 --- a/pkg/dbal/Tests/DbalConnectionFactoryTest.php +++ b/pkg/dbal/Tests/DbalConnectionFactoryTest.php @@ -28,4 +28,32 @@ public function testShouldCreateLazyContext() $this->assertAttributeEquals(null, 'connection', $context); $this->assertAttributeInternalType('callable', 'connectionFactory', $context); } + + public function testShouldParseGenericDSN() + { + $factory = new DbalConnectionFactory('pgsql+pdo://foo@bar'); + + $context = $factory->createContext(); + + $this->assertInstanceOf(DbalContext::class, $context); + + $config = $context->getConfig(); + $this->assertArrayHasKey('connection', $config); + $this->assertArrayHasKey('url', $config['connection']); + $this->assertEquals('pdo_pgsql://foo@bar', $config['connection']['url']); + } + + public function testShouldParseSqliteAbsolutePathDSN() + { + $factory = new DbalConnectionFactory('sqlite+pdo:////tmp/some.sq3'); + + $context = $factory->createContext(); + + $this->assertInstanceOf(DbalContext::class, $context); + + $config = $context->getConfig(); + $this->assertArrayHasKey('connection', $config); + $this->assertArrayHasKey('url', $config['connection']); + $this->assertEquals('pdo_sqlite:////tmp/some.sq3', $config['connection']['url']); + } } From 34a0f6a861e19050c5b37e63f2ecf43c042e6331 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 31 Jan 2020 09:36:04 +0200 Subject: [PATCH 0734/1142] Release 0.10.1 --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a314573bd..0befb01a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## [0.10.1](https://github.com/php-enqueue/enqueue-dev/tree/0.10.1) (2020-01-31) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.0...0.10.1) + +**Merged pull requests:** + +- \[dbal\] fix: allow absolute paths for sqlite transport [\#1015](https://github.com/php-enqueue/enqueue-dev/pull/1015) ([cawolf](https://github.com/cawolf)) +- \[tests\] Add schema declaration to phpunit files [\#1014](https://github.com/php-enqueue/enqueue-dev/pull/1014) ([Steveb-p](https://github.com/Steveb-p)) +- \[rdkafka\] Catch consume error "Local: Broker transport failure" and continue consume [\#1009](https://github.com/php-enqueue/enqueue-dev/pull/1009) ([rdotter](https://github.com/rdotter)) +- \[sqs\] SQS Transport - Add support for AWS profiles. [\#1008](https://github.com/php-enqueue/enqueue-dev/pull/1008) ([bgaillard](https://github.com/bgaillard)) +- \[amqp\] fixes \#1003 Return value of Enqueue\AmqpLib\AmqpContext::declareQueue() must be of the type int [\#1004](https://github.com/php-enqueue/enqueue-dev/pull/1004) ([kalyabin](https://github.com/kalyabin)) +- \[gearman\] Gearman Consumer receive should only fetch one message [\#998](https://github.com/php-enqueue/enqueue-dev/pull/998) ([arep](https://github.com/arep)) +- \[sqs\] add messageId to the sqsMessage [\#992](https://github.com/php-enqueue/enqueue-dev/pull/992) ([BenoitLeveque](https://github.com/BenoitLeveque)) + ## [0.10.0](https://github.com/php-enqueue/enqueue-dev/tree/0.10.0) (2019-12-19) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.9.15...0.10.0) From 1d05de7ad35aa3d32074771fa1c59acc9d4d47dd Mon Sep 17 00:00:00 2001 From: vershinin_so Date: Mon, 3 Feb 2020 15:02:16 +0300 Subject: [PATCH 0735/1142] add additional configuration --- pkg/stomp/StompConnectionFactory.php | 21 +++++++++++ .../StompConnectionFactoryConfigTest.php | 36 +++++++++++++++++++ .../Tests/StompConnectionFactoryTest.php | 32 +++++++++++++++++ 3 files changed, 89 insertions(+) diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index 764145ca2..818283493 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -8,6 +8,8 @@ use Interop\Queue\ConnectionFactory; use Interop\Queue\Context; use Stomp\Network\Connection; +use Stomp\Network\Observer\HeartbeatEmitter; +use Stomp\Network\Observer\ServerAliveObserver; class StompConnectionFactory implements ConnectionFactory { @@ -88,11 +90,22 @@ private function establishConnection(): BufferedStompClient $scheme = (true === $config['ssl_on']) ? 'ssl' : 'tcp'; $uri = $scheme.'://'.$config['host'].':'.$config['port']; $connection = new Connection($uri, $config['connection_timeout']); + $connection->setWriteTimeout($config['write_timeout']); + $connection->setReadTimeout($config['read_timeout']); + + if ($config['send_heartbeat']) { + $connection->getObservers()->addObserver(new HeartbeatEmitter($connection)); + } + + if ($config['receive_heartbeat']) { + $connection->getObservers()->addObserver(new ServerAliveObserver()); + } $this->stomp = new BufferedStompClient($connection, $config['buffer_size']); $this->stomp->setLogin($config['login'], $config['password']); $this->stomp->setVhostname($config['vhost']); $this->stomp->setSync($config['sync']); + $this->stomp->setHeartbeat($config['send_heartbeat'], $config['receive_heartbeat']); $this->stomp->connect(); } @@ -128,6 +141,10 @@ private function parseDsn(string $dsn): array 'sync' => $dsn->getBool('sync'), 'lazy' => $dsn->getBool('lazy'), 'ssl_on' => $dsn->getBool('ssl_on'), + 'write_timeout' => $dsn->getDecimal('write_timeout'), + 'read_timeout' => $dsn->getDecimal('read_timeout'), + 'send_heartbeat' => $dsn->getDecimal('send_heartbeat'), + 'receive_heartbeat' => $dsn->getDecimal('receive_heartbeat'), ]), function ($value) { return null !== $value; }); } @@ -145,6 +162,10 @@ private function defaultConfig(): array 'sync' => false, 'lazy' => true, 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ]; } } diff --git a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php index af8e71bd7..3d2ae99d9 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php @@ -66,6 +66,10 @@ public static function provideConfigs() 'sync' => false, 'lazy' => true, 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; @@ -83,6 +87,10 @@ public static function provideConfigs() 'sync' => false, 'lazy' => true, 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; @@ -100,6 +108,10 @@ public static function provideConfigs() 'sync' => false, 'lazy' => true, 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; @@ -118,6 +130,10 @@ public static function provideConfigs() 'lazy' => false, 'foo' => 'bar', 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; @@ -136,6 +152,10 @@ public static function provideConfigs() 'lazy' => false, 'foo' => 'bar', 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; @@ -154,6 +174,10 @@ public static function provideConfigs() 'lazy' => false, 'foo' => 'bar', 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; @@ -173,6 +197,10 @@ public static function provideConfigs() 'foo' => 'bar', 'ssl_on' => false, 'baz' => 'bazVal', + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; @@ -190,6 +218,10 @@ public static function provideConfigs() 'sync' => false, 'lazy' => true, 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; @@ -208,6 +240,10 @@ public static function provideConfigs() 'lazy' => true, 'foo' => 'bar', 'ssl_on' => false, + 'write_timeout' => 3, + 'read_timeout' => 60, + 'send_heartbeat' => 0, + 'receive_heartbeat' => 0, ], ]; } diff --git a/pkg/stomp/Tests/StompConnectionFactoryTest.php b/pkg/stomp/Tests/StompConnectionFactoryTest.php index 91986e6d0..896a9ddf3 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryTest.php @@ -6,6 +6,9 @@ use Enqueue\Stomp\StompContext; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\ConnectionFactory; +use Stomp\Network\Observer\Exception\HeartbeatException; +use Stomp\Network\Observer\HeartbeatEmitter; +use Stomp\Network\Observer\ServerAliveObserver; class StompConnectionFactoryTest extends \PHPUnit\Framework\TestCase { @@ -52,4 +55,33 @@ public function testShouldCreateActiveMQContext() $this->assertAttributeEquals(null, 'stomp', $context); $this->assertAttributeEquals(false, 'useExchangePrefix', $context); } + + public function testShouldNotCreateConnectionWithSendHeartbeat() + { + $factory = new StompConnectionFactory(['send_heartbeat' => 2000, 'host' => 'activemq']); + $this->expectException(HeartbeatException::class); + $factory->createContext()->getStomp(); + } + + public function testShouldCreateConnectionWithSendHeartbeat() + { + $factory = new StompConnectionFactory(['send_heartbeat' => 2000, 'host' => 'activemq', 'read_timeout' => 1]); + $context = $factory->createContext(); + + $observers = $context->getStomp()->getConnection()->getObservers()->getObservers(); + $this->assertAttributeEquals([2000, 0], 'heartbeat', $context->getStomp()); + $this->assertCount(1, $observers); + $this->assertInstanceOf(HeartbeatEmitter::class, $observers[0]); + } + + public function testShouldCreateConnectionWithReceiveHeartbeat() + { + $factory = new StompConnectionFactory(['receive_heartbeat' => 2000, 'host' => 'activemq']); + $context = $factory->createContext(); + + $observers = $context->getStomp()->getConnection()->getObservers()->getObservers(); + $this->assertAttributeEquals([0, 2000], 'heartbeat', $context->getStomp()); + $this->assertCount(1, $observers); + $this->assertInstanceOf(ServerAliveObserver::class, $observers[0]); + } } From 757c3d33c046b671d2e40f66f9843304b0bf2f1d Mon Sep 17 00:00:00 2001 From: vershinin_so Date: Mon, 3 Feb 2020 15:07:13 +0300 Subject: [PATCH 0736/1142] cleanup --- pkg/stomp/Tests/StompConnectionFactoryTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/stomp/Tests/StompConnectionFactoryTest.php b/pkg/stomp/Tests/StompConnectionFactoryTest.php index 896a9ddf3..2b2898c16 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryTest.php @@ -58,14 +58,14 @@ public function testShouldCreateActiveMQContext() public function testShouldNotCreateConnectionWithSendHeartbeat() { - $factory = new StompConnectionFactory(['send_heartbeat' => 2000, 'host' => 'activemq']); + $factory = new StompConnectionFactory(['send_heartbeat' => 2000]); $this->expectException(HeartbeatException::class); $factory->createContext()->getStomp(); } public function testShouldCreateConnectionWithSendHeartbeat() { - $factory = new StompConnectionFactory(['send_heartbeat' => 2000, 'host' => 'activemq', 'read_timeout' => 1]); + $factory = new StompConnectionFactory(['send_heartbeat' => 2000, 'read_timeout' => 1]); $context = $factory->createContext(); $observers = $context->getStomp()->getConnection()->getObservers()->getObservers(); @@ -76,7 +76,7 @@ public function testShouldCreateConnectionWithSendHeartbeat() public function testShouldCreateConnectionWithReceiveHeartbeat() { - $factory = new StompConnectionFactory(['receive_heartbeat' => 2000, 'host' => 'activemq']); + $factory = new StompConnectionFactory(['receive_heartbeat' => 2000]); $context = $factory->createContext(); $observers = $context->getStomp()->getConnection()->getObservers()->getObservers(); From a1367fb190ba7d8cf8d0c020d7e0250293e47bfc Mon Sep 17 00:00:00 2001 From: vershinin_so Date: Mon, 3 Feb 2020 15:44:04 +0300 Subject: [PATCH 0737/1142] move to functional test --- .../Functional/StompConnectionFactoryTest.php | 48 +++++++++++++++++++ .../Tests/StompConnectionFactoryTest.php | 28 ----------- pkg/test/RabbitmqStompExtension.php | 7 ++- 3 files changed, 54 insertions(+), 29 deletions(-) create mode 100644 pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php diff --git a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php new file mode 100644 index 000000000..a70ae7872 --- /dev/null +++ b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php @@ -0,0 +1,48 @@ +getDsn() . '&send_heartbeat=2000'; + $factory = new StompConnectionFactory($dsn); + $this->expectException(HeartbeatException::class); + $factory->createContext()->getStomp(); + } + + public function testShouldCreateConnectionWithSendHeartbeat() + { + $dsn = $this->getDsn() . '&send_heartbeat=2000&read_timeout=1'; + $factory = new StompConnectionFactory($dsn); + $context = $factory->createContext(); + + $observers = $context->getStomp()->getConnection()->getObservers()->getObservers(); + $this->assertAttributeEquals([2000, 0], 'heartbeat', $context->getStomp()); + $this->assertCount(1, $observers); + $this->assertInstanceOf(HeartbeatEmitter::class, $observers[0]); + } + + public function testShouldCreateConnectionWithReceiveHeartbeat() + { + $dsn = $this->getDsn() . '&receive_heartbeat=2000'; + $factory = new StompConnectionFactory($dsn); + $context = $factory->createContext(); + + $observers = $context->getStomp()->getConnection()->getObservers()->getObservers(); + $this->assertAttributeEquals([0, 2000], 'heartbeat', $context->getStomp()); + $this->assertCount(1, $observers); + $this->assertInstanceOf(ServerAliveObserver::class, $observers[0]); + } + +} diff --git a/pkg/stomp/Tests/StompConnectionFactoryTest.php b/pkg/stomp/Tests/StompConnectionFactoryTest.php index 2b2898c16..a803f114b 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryTest.php @@ -56,32 +56,4 @@ public function testShouldCreateActiveMQContext() $this->assertAttributeEquals(false, 'useExchangePrefix', $context); } - public function testShouldNotCreateConnectionWithSendHeartbeat() - { - $factory = new StompConnectionFactory(['send_heartbeat' => 2000]); - $this->expectException(HeartbeatException::class); - $factory->createContext()->getStomp(); - } - - public function testShouldCreateConnectionWithSendHeartbeat() - { - $factory = new StompConnectionFactory(['send_heartbeat' => 2000, 'read_timeout' => 1]); - $context = $factory->createContext(); - - $observers = $context->getStomp()->getConnection()->getObservers()->getObservers(); - $this->assertAttributeEquals([2000, 0], 'heartbeat', $context->getStomp()); - $this->assertCount(1, $observers); - $this->assertInstanceOf(HeartbeatEmitter::class, $observers[0]); - } - - public function testShouldCreateConnectionWithReceiveHeartbeat() - { - $factory = new StompConnectionFactory(['receive_heartbeat' => 2000]); - $context = $factory->createContext(); - - $observers = $context->getStomp()->getConnection()->getObservers()->getObservers(); - $this->assertAttributeEquals([0, 2000], 'heartbeat', $context->getStomp()); - $this->assertCount(1, $observers); - $this->assertInstanceOf(ServerAliveObserver::class, $observers[0]); - } } diff --git a/pkg/test/RabbitmqStompExtension.php b/pkg/test/RabbitmqStompExtension.php index d381d1fcf..240f67edb 100644 --- a/pkg/test/RabbitmqStompExtension.php +++ b/pkg/test/RabbitmqStompExtension.php @@ -8,9 +8,14 @@ trait RabbitmqStompExtension { + private function getDsn() + { + return getenv('RABITMQ_STOMP_DSN'); + } + private function buildStompContext(): StompContext { - if (false == $dsn = getenv('RABITMQ_STOMP_DSN')) { + if (false == $dsn = $this->getDsn()) { throw new SkippedTestError('Functional tests are not allowed in this environment'); } From 72031f0845333e3d1b0481a82da3d4a74a75611a Mon Sep 17 00:00:00 2001 From: vershinin_so Date: Mon, 3 Feb 2020 15:48:13 +0300 Subject: [PATCH 0738/1142] fix dsn --- .../Tests/Functional/StompConnectionFactoryTest.php | 9 +++------ pkg/stomp/Tests/StompConnectionFactoryTest.php | 4 ---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php index a70ae7872..9daa5254f 100644 --- a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php @@ -1,9 +1,7 @@ getDsn() . '&send_heartbeat=2000'; + $dsn = $this->getDsn().'?send_heartbeat=2000'; $factory = new StompConnectionFactory($dsn); $this->expectException(HeartbeatException::class); $factory->createContext()->getStomp(); @@ -23,7 +21,7 @@ public function testShouldNotCreateConnectionWithSendHeartbeat() public function testShouldCreateConnectionWithSendHeartbeat() { - $dsn = $this->getDsn() . '&send_heartbeat=2000&read_timeout=1'; + $dsn = $this->getDsn().'?send_heartbeat=2000&read_timeout=1'; $factory = new StompConnectionFactory($dsn); $context = $factory->createContext(); @@ -35,7 +33,7 @@ public function testShouldCreateConnectionWithSendHeartbeat() public function testShouldCreateConnectionWithReceiveHeartbeat() { - $dsn = $this->getDsn() . '&receive_heartbeat=2000'; + $dsn = $this->getDsn().'?receive_heartbeat=2000'; $factory = new StompConnectionFactory($dsn); $context = $factory->createContext(); @@ -44,5 +42,4 @@ public function testShouldCreateConnectionWithReceiveHeartbeat() $this->assertCount(1, $observers); $this->assertInstanceOf(ServerAliveObserver::class, $observers[0]); } - } diff --git a/pkg/stomp/Tests/StompConnectionFactoryTest.php b/pkg/stomp/Tests/StompConnectionFactoryTest.php index a803f114b..91986e6d0 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryTest.php @@ -6,9 +6,6 @@ use Enqueue\Stomp\StompContext; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\ConnectionFactory; -use Stomp\Network\Observer\Exception\HeartbeatException; -use Stomp\Network\Observer\HeartbeatEmitter; -use Stomp\Network\Observer\ServerAliveObserver; class StompConnectionFactoryTest extends \PHPUnit\Framework\TestCase { @@ -55,5 +52,4 @@ public function testShouldCreateActiveMQContext() $this->assertAttributeEquals(null, 'stomp', $context); $this->assertAttributeEquals(false, 'useExchangePrefix', $context); } - } From a5fefdb05746f85dda508b051abc157670c77ea0 Mon Sep 17 00:00:00 2001 From: vershinin_so Date: Mon, 3 Feb 2020 15:55:06 +0300 Subject: [PATCH 0739/1142] mark functional test --- pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php index 9daa5254f..ce4320768 100644 --- a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php @@ -7,6 +7,9 @@ use Stomp\Network\Observer\HeartbeatEmitter; use Stomp\Network\Observer\ServerAliveObserver; +/** + * @group functional + */ class StompConnectionFactoryTest extends \PHPUnit\Framework\TestCase { use RabbitmqStompExtension; From 2b8ade32078af551ffc3d57f9b3a1fb1295cfe1b Mon Sep 17 00:00:00 2001 From: vershinin_so Date: Mon, 3 Feb 2020 15:57:26 +0300 Subject: [PATCH 0740/1142] missing class --- pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php index ce4320768..9029c17c1 100644 --- a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php @@ -4,6 +4,7 @@ use Enqueue\Stomp\StompConnectionFactory; use Enqueue\Test\RabbitmqStompExtension; +use Stomp\Network\Observer\Exception\HeartbeatException; use Stomp\Network\Observer\HeartbeatEmitter; use Stomp\Network\Observer\ServerAliveObserver; From b906e18865ce0c8492b9b3ef0930dafe2d3d7651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 14 Feb 2020 20:59:18 +0100 Subject: [PATCH 0741/1142] Call flush method on shutdown / context closing This allows compatibility with phprdkafka 4.0 --- .travis.yml | 2 +- composer.json | 2 +- docker-compose.yml | 6 +-- pkg/rdkafka/RdKafkaConnectionFactory.php | 1 + pkg/rdkafka/RdKafkaContext.php | 38 +++++++++++-------- pkg/rdkafka/RdKafkaProducer.php | 8 ++++ .../RdKafkaSendToAndReceiveFromTopicTest.php | 11 ++++-- pkg/rdkafka/composer.json | 4 +- 8 files changed, 46 insertions(+), 26 deletions(-) diff --git a/.travis.yml b/.travis.yml index 76968a051..e993f1ed5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -68,7 +68,7 @@ script: - if [ "$PHPSTAN" = true ] && [ ! -z "${PKG_PHP_CHANGED_FILES}" ]; then docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon -- ${PKG_PHP_CHANGED_FILES[@]} ; fi - if [ "$UNIT_TESTS" = true ]; then bin/phpunit --exclude-group=functional; fi - if [ "$FUNCTIONAL_TESTS" = true ]; then bin/test.sh --exclude-group=rdkafka; fi - - if [ "RDKAFKA_TESTS" = true ]; then bin/test.sh --group=rdkafka; fi + - if [ "$RDKAFKA_TESTS" = true ]; then bin/test.sh --group=rdkafka; fi notifications: webhooks: diff --git a/composer.json b/composer.json index 866f41d02..a358b853f 100644 --- a/composer.json +++ b/composer.json @@ -59,7 +59,7 @@ "doctrine/doctrine-bundle": "~1.2|^2", "doctrine/mongodb-odm-bundle": "^3.5|^4", "alcaeus/mongo-php-adapter": "^1.0", - "kwn/php-rdkafka-stubs": "^1.0.2", + "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", "friendsofphp/php-cs-fixer": "^2" }, "autoload": { diff --git a/docker-compose.yml b/docker-compose.yml index ddae063b4..fb5838c06 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -99,13 +99,13 @@ services: - '2181:2181' kafka: - image: 'wurstmeister/kafka:0.10.2.1' + image: 'wurstmeister/kafka' ports: - '9092:9092' environment: KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' - volumes: - - '/var/run/docker.sock:/var/run/docker.sock' + KAFKA_ADVERTISED_HOST_NAME: kafka + KAFKA_ADVERTISED_PORT: 9092 google-pubsub: image: 'google/cloud-sdk:latest' diff --git a/pkg/rdkafka/RdKafkaConnectionFactory.php b/pkg/rdkafka/RdKafkaConnectionFactory.php index 8a634a1be..a55c5c617 100644 --- a/pkg/rdkafka/RdKafkaConnectionFactory.php +++ b/pkg/rdkafka/RdKafkaConnectionFactory.php @@ -28,6 +28,7 @@ class RdKafkaConnectionFactory implements ConnectionFactory * 'partitioner' => null, // https://arnaud-lb.github.io/php-rdkafka/phpdoc/rdkafka-topicconf.setpartitioner.html * 'log_level' => null, * 'commit_async' => false, + * 'shutdown_timeout' => -1, // https://github.com/arnaud-lb/php-rdkafka#proper-shutdown * ] * * or diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index 6270b2230..97223ba9b 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -36,7 +36,7 @@ class RdKafkaContext implements Context private $conf; /** - * @var Producer + * @var RdKafkaProducer */ private $producer; @@ -96,7 +96,23 @@ public function createTemporaryQueue(): Queue */ public function createProducer(): Producer { - return new RdKafkaProducer($this->getProducer(), $this->getSerializer()); + if (!isset($this->producer)) { + $producer = new VendorProducer($this->getConf()); + + if (isset($this->config['log_level'])) { + $producer->setLogLevel($this->config['log_level']); + } + + $this->producer = new RdKafkaProducer($producer, $this->getSerializer()); + + // Once created RdKafkaProducer can store messages internally that need to be delivered before PHP shuts + // down. Otherwise, we are bound to lose messages in transit. + // Note that it is generally preferable to call "close" method explicitly before shutdown starts, since + // otherwise we might not have access to some objects, like database connections. + register_shutdown_function([$this->producer, 'flush'], $this->config['shutdown_timeout'] ?? -1); + } + + return $this->producer; } /** @@ -139,6 +155,11 @@ public function close(): void foreach ($kafkaConsumers as $kafkaConsumer) { $kafkaConsumer->unsubscribe(); } + + // Compatibility with phprdkafka 4.0. + if (isset($this->producer)) { + $this->producer->flush($this->config['shutdown_timeout'] ?? -1); + } } public function createSubscriptionConsumer(): SubscriptionConsumer @@ -163,19 +184,6 @@ public static function getLibrdKafkaVersion(): string return "$major.$minor.$patch"; } - private function getProducer(): VendorProducer - { - if (null === $this->producer) { - $this->producer = new VendorProducer($this->getConf()); - - if (isset($this->config['log_level'])) { - $this->producer->setLogLevel($this->config['log_level']); - } - } - - return $this->producer; - } - private function getConf(): Conf { if (null === $this->conf) { diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index 77ec9115b..8464866c3 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -111,4 +111,12 @@ public function getTimeToLive(): ?int { return null; } + + public function flush(int $timeout): void + { + // Flush method is exposed in phprdkafka 4.0 + if (method_exists($this->producer, 'flush')) { + $this->producer->flush($timeout); + } + } } diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php index 6604eb127..c755b8740 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php @@ -19,9 +19,14 @@ public function test() $topic = $this->createTopic($context, uniqid('', true)); - $consumer = $context->createConsumer($topic); - $expectedBody = __CLASS__.time(); + $producer = $context->createProducer(); + $producer->send($topic, $context->createMessage($expectedBody)); + + // Calling close causes Producer to flush (wait for messages to be delivered to Kafka) + $context->close(); + + $consumer = $context->createConsumer($topic); $context->createProducer()->send($topic, $context->createMessage($expectedBody)); @@ -48,8 +53,6 @@ protected function createContext() $context = (new RdKafkaConnectionFactory($config))->createContext(); - sleep(3); - return $context; } } diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 520c05a0f..b6b486594 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "ext-rdkafka": "^3.0.3", + "ext-rdkafka": "^3.0.3|^4.0", "queue-interop/queue-interop": "^0.8" }, "require-dev": { @@ -15,7 +15,7 @@ "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6", - "kwn/php-rdkafka-stubs": "^1.0.2" + "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0" }, "support": { "email": "opensource@forma-pro.com", From 0e94bd1334dc8f2603ee13cff462c9cd016ca04a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 14 Feb 2020 21:18:13 +0100 Subject: [PATCH 0742/1142] Add extension tag parameter note Fixes #1010 --- docs/bundle/consumption_extension.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/bundle/consumption_extension.md b/docs/bundle/consumption_extension.md index cad372103..b05c9f89e 100644 --- a/docs/bundle/consumption_extension.md +++ b/docs/bundle/consumption_extension.md @@ -40,4 +40,15 @@ services: - { name: 'enqueue.consumption.extension', priority: 10 } ``` +When using multiple enqueue instances, you can apply extension to +specific or all instances by providing an additional tag attribute: + +``` +services: + app.enqueue.count_processed_messages_extension: + class: 'AppBundle\Enqueue\CountProcessedMessagesExtension' + tags: + - { name: 'enqueue.consumption.extension', priority: 10, client: 'all' } +``` + [back to index](index.md) From 05a5073217d4c784dc966155b302b244325d9518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Fri, 14 Feb 2020 21:22:33 +0100 Subject: [PATCH 0743/1142] Fix style --- pkg/rdkafka/RdKafkaContext.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index 97223ba9b..cc4915062 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -50,9 +50,6 @@ class RdKafkaContext implements Context */ private $rdKafkaConsumers; - /** - * @param array $config - */ public function __construct(array $config) { $this->config = $config; From 67ecbc40e126a1c9e24705529109ea336a782552 Mon Sep 17 00:00:00 2001 From: Sebastian Neubert Date: Mon, 17 Feb 2020 10:15:17 +0100 Subject: [PATCH 0744/1142] typo --- docs/transport/amqp_lib.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/transport/amqp_lib.md b/docs/transport/amqp_lib.md index ab0418e73..288779a55 100644 --- a/docs/transport/amqp_lib.md +++ b/docs/transport/amqp_lib.md @@ -292,7 +292,7 @@ It is not possible to implement heartbeat feature in PHP, due to its synchronous You could read more about the issues in post: [Keeping RabbitMQ connections alive in PHP](https://blog.mollie.com/keeping-rabbitmq-connections-alive-in-php-b11cb657d5fb). `enqueue/amqp-lib` address the issue by registering heartbeat call as a [tick callbacks](http://php.net/manual/en/function.register-tick-function.php). -To make it work you have to wrapp your long running task by `decalre(ticks=1) {}`. +To make it work you have to wrapp your long running task by `declare(ticks=1) {}`. The number of ticks could be adjusted to your needs. Calling it at every tick is not good. From d8ad6aeb4d5e42679d73cbde2e43c2ec6fef6fd2 Mon Sep 17 00:00:00 2001 From: Alexander Strizhak Date: Wed, 11 Mar 2020 22:36:20 +0300 Subject: [PATCH 0745/1142] Option example --- docs/bundle/async_commands.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/bundle/async_commands.md b/docs/bundle/async_commands.md index 8c83d2b4d..b099c0b9c 100644 --- a/docs/bundle/async_commands.md +++ b/docs/bundle/async_commands.md @@ -43,7 +43,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** @var ProducerInterface $producer */ $producer = $container->get(ProducerInterface::class); -$producer->sendCommand(Commands::RUN_COMMAND, new RunCommand('debug:container')); +$cmd = new RunCommand('debug:container', ['--tag=form.type']); +$producer->sendCommand(Commands::RUN_COMMAND, $cmd); ``` optionally you can get a command execution result: From 1e11dced08315dc1b8bb7786bcdd1541c0ee3626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=A1bl?= Date: Wed, 18 Mar 2020 10:53:14 +0100 Subject: [PATCH 0746/1142] fix(mongodb): Exception throwing fatal error, Broken handling of MongodbConnectionFactory config, Incorrect MongodbConnectionFactory documentation Closes: #1031, #1027 --- pkg/mongodb/MongodbConnectionFactory.php | 12 ++++++++++-- pkg/mongodb/MongodbProducer.php | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pkg/mongodb/MongodbConnectionFactory.php b/pkg/mongodb/MongodbConnectionFactory.php index a5148f1c0..05fdd89ac 100644 --- a/pkg/mongodb/MongodbConnectionFactory.php +++ b/pkg/mongodb/MongodbConnectionFactory.php @@ -27,7 +27,7 @@ class MongodbConnectionFactory implements ConnectionFactory * * or * - * mongodb://127.0.0.1:27017/dbname?polling_interval=1000&enqueue_collection=enqueue + * mongodb://127.0.0.1:27017/defaultauthdb?polling_interval=1000&enqueue_database=enqueue&enqueue_collection=enqueue * * @param array|string|null $config */ @@ -38,7 +38,10 @@ public function __construct($config = 'mongodb:') } elseif (is_string($config)) { $config = $this->parseDsn($config); } elseif (is_array($config)) { - $config = $this->parseDsn(empty($config['dsn']) ? 'mongodb:' : $config['dsn']); + $config = array_replace( + $config, + $this->parseDsn(empty($config['dsn']) ? 'mongodb:' : $config['dsn']) + ); } else { throw new \LogicException('The config must be either an array of options, a DSN string or null'); } @@ -86,6 +89,8 @@ public static function parseDsn(string $dsn): array ]; } $config['dsn'] = $dsn; + // FIXME this is NOT a dbname but rather authdb. But removing this would be a BC break. + // see: https://github.com/php-enqueue/enqueue-dev/issues/1027 if (isset($parsedUrl['path']) && '/' !== $parsedUrl['path']) { $pathParts = explode('/', $parsedUrl['path']); //DB name @@ -103,6 +108,9 @@ public static function parseDsn(string $dsn): array if (!empty($queryParts['enqueue_collection'])) { $config['collection_name'] = $queryParts['enqueue_collection']; } + if (!empty($queryParts['enqueue_database'])) { + $config['dbname'] = $queryParts['enqueue_database']; + } } return $config; diff --git a/pkg/mongodb/MongodbProducer.php b/pkg/mongodb/MongodbProducer.php index d27f014eb..12956f714 100644 --- a/pkg/mongodb/MongodbProducer.php +++ b/pkg/mongodb/MongodbProducer.php @@ -110,7 +110,7 @@ public function send(Destination $destination, Message $message): void $collection = $this->context->getCollection(); $collection->insertOne($mongoMessage); } catch (\Exception $e) { - throw new Exception('The transport has failed to send the message due to some internal error.', null, $e); + throw new Exception('The transport has failed to send the message due to some internal error.', $e->getCode(), $e); } } From 54fe9e6ce88f0d9b5bdc6df65b564f1b08d7fbe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=A1bl?= Date: Thu, 19 Mar 2020 11:33:37 +0100 Subject: [PATCH 0747/1142] cs(mongodb): Fix legacy code for new coding standards --- pkg/mongodb/MongodbConnectionFactory.php | 6 +----- pkg/mongodb/MongodbProducer.php | 10 ++-------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/pkg/mongodb/MongodbConnectionFactory.php b/pkg/mongodb/MongodbConnectionFactory.php index 05fdd89ac..3d7624904 100644 --- a/pkg/mongodb/MongodbConnectionFactory.php +++ b/pkg/mongodb/MongodbConnectionFactory.php @@ -77,11 +77,7 @@ public static function parseDsn(string $dsn): array 'mongodb' => true, ]; if (false == isset($parsedUrl['scheme'])) { - throw new \LogicException(sprintf( - 'The given DSN schema "%s" is not supported. There are supported schemes: "%s".', - $parsedUrl['scheme'], - implode('", "', array_keys($supported)) - )); + throw new \LogicException(sprintf('The given DSN schema "%s" is not supported. There are supported schemes: "%s".', $parsedUrl['scheme'], implode('", "', array_keys($supported)))); } if ('mongodb:' === $dsn) { return [ diff --git a/pkg/mongodb/MongodbProducer.php b/pkg/mongodb/MongodbProducer.php index 12956f714..d26696cf8 100644 --- a/pkg/mongodb/MongodbProducer.php +++ b/pkg/mongodb/MongodbProducer.php @@ -77,10 +77,7 @@ public function send(Destination $destination, Message $message): void $delay = $message->getDeliveryDelay(); if ($delay) { if (!is_int($delay)) { - throw new \LogicException(sprintf( - 'Delay must be integer but got: "%s"', - is_object($delay) ? get_class($delay) : gettype($delay) - )); + throw new \LogicException(sprintf('Delay must be integer but got: "%s"', is_object($delay) ? get_class($delay) : gettype($delay))); } if ($delay <= 0) { @@ -93,10 +90,7 @@ public function send(Destination $destination, Message $message): void $timeToLive = $message->getTimeToLive(); if ($timeToLive) { if (!is_int($timeToLive)) { - throw new \LogicException(sprintf( - 'TimeToLive must be integer but got: "%s"', - is_object($timeToLive) ? get_class($timeToLive) : gettype($timeToLive) - )); + throw new \LogicException(sprintf('TimeToLive must be integer but got: "%s"', is_object($timeToLive) ? get_class($timeToLive) : gettype($timeToLive))); } if ($timeToLive <= 0) { From 16797d6b6edb5c510d67d59631a067bc5c464884 Mon Sep 17 00:00:00 2001 From: Jonathan Cox Date: Thu, 19 Mar 2020 17:06:38 -0400 Subject: [PATCH 0748/1142] Implement DeliveryDelay, Priority and TimeToLive in PheanstalkProducer --- pkg/pheanstalk/PheanstalkProducer.php | 88 +++-- .../Tests/PheanstalkProducerTest.php | 320 ++++++++++++++++++ 2 files changed, 384 insertions(+), 24 deletions(-) diff --git a/pkg/pheanstalk/PheanstalkProducer.php b/pkg/pheanstalk/PheanstalkProducer.php index 05722dad9..28120f0fb 100644 --- a/pkg/pheanstalk/PheanstalkProducer.php +++ b/pkg/pheanstalk/PheanstalkProducer.php @@ -7,7 +7,6 @@ use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; use Interop\Queue\Exception\InvalidMessageException; -use Interop\Queue\Exception\PriorityNotSupportedException; use Interop\Queue\Message; use Interop\Queue\Producer; use Pheanstalk\Pheanstalk; @@ -19,6 +18,21 @@ class PheanstalkProducer implements Producer */ private $pheanstalk; + /** + * @var int + */ + private $deliveryDelay; + + /** + * @var int + */ + private $priority; + + /** + * @var int + */ + private $timeToLive; + public function __construct(Pheanstalk $pheanstalk) { $this->pheanstalk = $pheanstalk; @@ -35,18 +49,14 @@ public function send(Destination $destination, Message $message): void $rawMessage = json_encode($message); if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'Could not encode value into json. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + throw new \InvalidArgumentException(sprintf('Could not encode value into json. Error %s and message %s', json_last_error(), json_last_error_msg())); } $this->pheanstalk->useTube($destination->getName())->put( $rawMessage, - $message->getPriority(), - $message->getDelay(), - $message->getTimeToRun() + $this->resolvePriority($message), + $this->resolveDelay($message), + $this->resolveTimeToLive($message) ); } @@ -55,16 +65,14 @@ public function send(Destination $destination, Message $message): void */ public function setDeliveryDelay(int $deliveryDelay = null): Producer { - if (null === $deliveryDelay) { - return $this; - } + $this->deliveryDelay = $deliveryDelay; - throw new \LogicException('Not implemented'); + return $this; } public function getDeliveryDelay(): ?int { - return null; + return $this->deliveryDelay; } /** @@ -72,16 +80,14 @@ public function getDeliveryDelay(): ?int */ public function setPriority(int $priority = null): Producer { - if (null === $priority) { - return $this; - } + $this->priority = $priority; - throw PriorityNotSupportedException::providerDoestNotSupportIt(); + return $this; } public function getPriority(): ?int { - return null; + return $this->priority; } /** @@ -89,15 +95,49 @@ public function getPriority(): ?int */ public function setTimeToLive(int $timeToLive = null): Producer { - if (null === $timeToLive) { - return $this; - } + $this->timeToLive = $timeToLive; - throw new \LogicException('Not implemented'); + return $this; } public function getTimeToLive(): ?int { - return null; + return $this->timeToLive; + } + + private function resolvePriority(PheanstalkMessage $message): ?int + { + if (null === $this->priority) { + return $message->getPriority(); + } + + $priority = $this->priority; + $this->priority = null; + + return $priority; + } + + private function resolveDelay(PheanstalkMessage $message): ?int + { + if (null === $this->deliveryDelay) { + return $message->getDelay(); + } + + $delay = $this->deliveryDelay; + $this->deliveryDelay = null; + + return $delay / 1000; + } + + private function resolveTimeToLive(PheanstalkMessage $message): ?int + { + if (null === $this->timeToLive) { + return $message->getTimeToRun(); + } + + $ttl = $this->timeToLive; + $this->timeToLive = null; + + return $ttl / 1000; } } diff --git a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php index 60a19f627..1b9522ac4 100644 --- a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php @@ -66,6 +66,326 @@ public function testShouldJsonEncodeMessageAndPutToExpectedTube() ); } + public function testPriorityPrecedesMessagePriority() + { + $message = new PheanstalkMessage('theBody'); + $message->setPriority(100); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":{"priority":100}}', 50, Pheanstalk::DEFAULT_DELAY, Pheanstalk::DEFAULT_TTR) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setPriority(50); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + } + + public function testNullPriorityFallsBackToMessagePriority() + { + $message = new PheanstalkMessage('theBody'); + $message->setPriority(100); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":{"priority":100}}', 100, Pheanstalk::DEFAULT_DELAY, Pheanstalk::DEFAULT_TTR) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setPriority(null); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + } + + public function testPriorityDoesNotPersist() + { + $message = new PheanstalkMessage('theBody'); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":[]}', 100, Pheanstalk::DEFAULT_DELAY, Pheanstalk::DEFAULT_TTR) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setPriority(100); + + $this->assertEquals(100, $producer->getPriority()); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + + $this->assertNull($producer->getPriority()); + } + + public function testAccessDeliveryDelayAsMilliseconds() + { + $producer = new PheanstalkProducer($this->createPheanstalkMock()); + $producer->setDeliveryDelay(5000); + + $this->assertEquals(5000, $producer->getDeliveryDelay()); + } + + public function testDeliveryDelayResolvesToSeconds() + { + $message = new PheanstalkMessage('theBody'); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":[]}', Pheanstalk::DEFAULT_PRIORITY, 5, Pheanstalk::DEFAULT_TTR) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setDeliveryDelay(5000); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + } + + public function testDeliveryDelayPrecedesMessageDelay() + { + $message = new PheanstalkMessage('theBody'); + $message->setDelay(25); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":{"delay":25}}', Pheanstalk::DEFAULT_PRIORITY, 1, Pheanstalk::DEFAULT_TTR) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setDeliveryDelay(1000); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + } + + public function testNullDeliveryDelayFallsBackToMessageDelay() + { + $message = new PheanstalkMessage('theBody'); + $message->setDelay(25); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":{"delay":25}}', Pheanstalk::DEFAULT_PRIORITY, 25, Pheanstalk::DEFAULT_TTR) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setDeliveryDelay(null); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + } + + public function testDeliveryDelayDoesNotPersist() + { + $message = new PheanstalkMessage('theBody'); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":[]}', Pheanstalk::DEFAULT_PRIORITY, 1, Pheanstalk::DEFAULT_TTR) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setDeliveryDelay(1000); + + $this->assertEquals(1000, $producer->getDeliveryDelay()); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + + $this->assertNull($producer->getDeliveryDelay()); + } + + public function testAccessTimeToLiveAsMilliseconds() + { + $producer = new PheanstalkProducer($this->createPheanstalkMock()); + $producer->setTimeToLive(5000); + + $this->assertEquals(5000, $producer->getTimeToLive()); + } + + public function testTimeToLiveResolvesToSeconds() + { + $message = new PheanstalkMessage('theBody'); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":[]}', Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, 5) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setTimeToLive(5000); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + } + + public function testTimeToLivePrecedesMessageTimeToRun() + { + $message = new PheanstalkMessage('theBody'); + $message->setTimeToRun(25); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":{"ttr":25}}', Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, 1) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setTimeToLive(1000); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + } + + public function testNullTimeToLiveFallsBackToMessageTimeToRun() + { + $message = new PheanstalkMessage('theBody'); + $message->setTimeToRun(25); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":{"ttr":25}}', Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, 25) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setTimeToLive(null); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + } + + public function testTimeToLiveDoesNotPersist() + { + $message = new PheanstalkMessage('theBody'); + + $pheanstalk = $this->createPheanstalkMock(); + $pheanstalk + ->expects($this->once()) + ->method('useTube') + ->with('theQueueName') + ->willReturnSelf() + ; + $pheanstalk + ->expects($this->once()) + ->method('put') + ->with('{"body":"theBody","properties":[],"headers":[]}', Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, 1) + ; + + $producer = new PheanstalkProducer($pheanstalk); + $producer->setTimeToLive(1000); + + $this->assertEquals(1000, $producer->getTimeToLive()); + + $producer->send( + new PheanstalkDestination('theQueueName'), + $message + ); + + $this->assertNull($producer->getTimeToLive()); + } + /** * @return MockObject|Pheanstalk */ From 3b205e0667ce675cc2c791616fae2075678069f9 Mon Sep 17 00:00:00 2001 From: Jonathan Cox Date: Fri, 20 Mar 2020 05:11:45 -0400 Subject: [PATCH 0749/1142] =?UTF-8?q?Swap=20priority=20of=20producer=20and?= =?UTF-8?q?=20message=20values=20Don=E2=80=99t=20reset=20producer=20values?= =?UTF-8?q?=20after=20send?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/pheanstalk/PheanstalkProducer.php | 52 ++--- .../Tests/PheanstalkProducerTest.php | 179 +----------------- 2 files changed, 17 insertions(+), 214 deletions(-) diff --git a/pkg/pheanstalk/PheanstalkProducer.php b/pkg/pheanstalk/PheanstalkProducer.php index 28120f0fb..030beedf8 100644 --- a/pkg/pheanstalk/PheanstalkProducer.php +++ b/pkg/pheanstalk/PheanstalkProducer.php @@ -52,11 +52,21 @@ public function send(Destination $destination, Message $message): void throw new \InvalidArgumentException(sprintf('Could not encode value into json. Error %s and message %s', json_last_error(), json_last_error_msg())); } + if (null !== $this->priority && null === $message->getHeader('priority')) { + $message->setPriority($this->priority); + } + if (null !== $this->deliveryDelay && null === $message->getHeader('delay')) { + $message->setDelay($this->deliveryDelay / 1000); + } + if (null !== $this->timeToLive && null === $message->getHeader('ttr')) { + $message->setTimeToRun($this->timeToLive / 1000); + } + $this->pheanstalk->useTube($destination->getName())->put( $rawMessage, - $this->resolvePriority($message), - $this->resolveDelay($message), - $this->resolveTimeToLive($message) + $message->getPriority(), + $message->getDelay(), + $message->getTimeToRun() ); } @@ -104,40 +114,4 @@ public function getTimeToLive(): ?int { return $this->timeToLive; } - - private function resolvePriority(PheanstalkMessage $message): ?int - { - if (null === $this->priority) { - return $message->getPriority(); - } - - $priority = $this->priority; - $this->priority = null; - - return $priority; - } - - private function resolveDelay(PheanstalkMessage $message): ?int - { - if (null === $this->deliveryDelay) { - return $message->getDelay(); - } - - $delay = $this->deliveryDelay; - $this->deliveryDelay = null; - - return $delay / 1000; - } - - private function resolveTimeToLive(PheanstalkMessage $message): ?int - { - if (null === $this->timeToLive) { - return $message->getTimeToRun(); - } - - $ttl = $this->timeToLive; - $this->timeToLive = null; - - return $ttl / 1000; - } } diff --git a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php index 1b9522ac4..7a736c09e 100644 --- a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php @@ -66,34 +66,7 @@ public function testShouldJsonEncodeMessageAndPutToExpectedTube() ); } - public function testPriorityPrecedesMessagePriority() - { - $message = new PheanstalkMessage('theBody'); - $message->setPriority(100); - - $pheanstalk = $this->createPheanstalkMock(); - $pheanstalk - ->expects($this->once()) - ->method('useTube') - ->with('theQueueName') - ->willReturnSelf() - ; - $pheanstalk - ->expects($this->once()) - ->method('put') - ->with('{"body":"theBody","properties":[],"headers":{"priority":100}}', 50, Pheanstalk::DEFAULT_DELAY, Pheanstalk::DEFAULT_TTR) - ; - - $producer = new PheanstalkProducer($pheanstalk); - $producer->setPriority(50); - - $producer->send( - new PheanstalkDestination('theQueueName'), - $message - ); - } - - public function testNullPriorityFallsBackToMessagePriority() + public function testMessagePriorityPrecedesPriority() { $message = new PheanstalkMessage('theBody'); $message->setPriority(100); @@ -112,42 +85,12 @@ public function testNullPriorityFallsBackToMessagePriority() ; $producer = new PheanstalkProducer($pheanstalk); - $producer->setPriority(null); - - $producer->send( - new PheanstalkDestination('theQueueName'), - $message - ); - } - - public function testPriorityDoesNotPersist() - { - $message = new PheanstalkMessage('theBody'); - - $pheanstalk = $this->createPheanstalkMock(); - $pheanstalk - ->expects($this->once()) - ->method('useTube') - ->with('theQueueName') - ->willReturnSelf() - ; - $pheanstalk - ->expects($this->once()) - ->method('put') - ->with('{"body":"theBody","properties":[],"headers":[]}', 100, Pheanstalk::DEFAULT_DELAY, Pheanstalk::DEFAULT_TTR) - ; - - $producer = new PheanstalkProducer($pheanstalk); - $producer->setPriority(100); - - $this->assertEquals(100, $producer->getPriority()); + $producer->setPriority(50); $producer->send( new PheanstalkDestination('theQueueName'), $message ); - - $this->assertNull($producer->getPriority()); } public function testAccessDeliveryDelayAsMilliseconds() @@ -184,34 +127,7 @@ public function testDeliveryDelayResolvesToSeconds() ); } - public function testDeliveryDelayPrecedesMessageDelay() - { - $message = new PheanstalkMessage('theBody'); - $message->setDelay(25); - - $pheanstalk = $this->createPheanstalkMock(); - $pheanstalk - ->expects($this->once()) - ->method('useTube') - ->with('theQueueName') - ->willReturnSelf() - ; - $pheanstalk - ->expects($this->once()) - ->method('put') - ->with('{"body":"theBody","properties":[],"headers":{"delay":25}}', Pheanstalk::DEFAULT_PRIORITY, 1, Pheanstalk::DEFAULT_TTR) - ; - - $producer = new PheanstalkProducer($pheanstalk); - $producer->setDeliveryDelay(1000); - - $producer->send( - new PheanstalkDestination('theQueueName'), - $message - ); - } - - public function testNullDeliveryDelayFallsBackToMessageDelay() + public function testMessageDelayPrecedesDeliveryDelay() { $message = new PheanstalkMessage('theBody'); $message->setDelay(25); @@ -229,43 +145,13 @@ public function testNullDeliveryDelayFallsBackToMessageDelay() ->with('{"body":"theBody","properties":[],"headers":{"delay":25}}', Pheanstalk::DEFAULT_PRIORITY, 25, Pheanstalk::DEFAULT_TTR) ; - $producer = new PheanstalkProducer($pheanstalk); - $producer->setDeliveryDelay(null); - - $producer->send( - new PheanstalkDestination('theQueueName'), - $message - ); - } - - public function testDeliveryDelayDoesNotPersist() - { - $message = new PheanstalkMessage('theBody'); - - $pheanstalk = $this->createPheanstalkMock(); - $pheanstalk - ->expects($this->once()) - ->method('useTube') - ->with('theQueueName') - ->willReturnSelf() - ; - $pheanstalk - ->expects($this->once()) - ->method('put') - ->with('{"body":"theBody","properties":[],"headers":[]}', Pheanstalk::DEFAULT_PRIORITY, 1, Pheanstalk::DEFAULT_TTR) - ; - $producer = new PheanstalkProducer($pheanstalk); $producer->setDeliveryDelay(1000); - $this->assertEquals(1000, $producer->getDeliveryDelay()); - $producer->send( new PheanstalkDestination('theQueueName'), $message ); - - $this->assertNull($producer->getDeliveryDelay()); } public function testAccessTimeToLiveAsMilliseconds() @@ -302,34 +188,7 @@ public function testTimeToLiveResolvesToSeconds() ); } - public function testTimeToLivePrecedesMessageTimeToRun() - { - $message = new PheanstalkMessage('theBody'); - $message->setTimeToRun(25); - - $pheanstalk = $this->createPheanstalkMock(); - $pheanstalk - ->expects($this->once()) - ->method('useTube') - ->with('theQueueName') - ->willReturnSelf() - ; - $pheanstalk - ->expects($this->once()) - ->method('put') - ->with('{"body":"theBody","properties":[],"headers":{"ttr":25}}', Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, 1) - ; - - $producer = new PheanstalkProducer($pheanstalk); - $producer->setTimeToLive(1000); - - $producer->send( - new PheanstalkDestination('theQueueName'), - $message - ); - } - - public function testNullTimeToLiveFallsBackToMessageTimeToRun() + public function testMessageTimeToRunPrecedesTimeToLive() { $message = new PheanstalkMessage('theBody'); $message->setTimeToRun(25); @@ -347,43 +206,13 @@ public function testNullTimeToLiveFallsBackToMessageTimeToRun() ->with('{"body":"theBody","properties":[],"headers":{"ttr":25}}', Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, 25) ; - $producer = new PheanstalkProducer($pheanstalk); - $producer->setTimeToLive(null); - - $producer->send( - new PheanstalkDestination('theQueueName'), - $message - ); - } - - public function testTimeToLiveDoesNotPersist() - { - $message = new PheanstalkMessage('theBody'); - - $pheanstalk = $this->createPheanstalkMock(); - $pheanstalk - ->expects($this->once()) - ->method('useTube') - ->with('theQueueName') - ->willReturnSelf() - ; - $pheanstalk - ->expects($this->once()) - ->method('put') - ->with('{"body":"theBody","properties":[],"headers":[]}', Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, 1) - ; - $producer = new PheanstalkProducer($pheanstalk); $producer->setTimeToLive(1000); - $this->assertEquals(1000, $producer->getTimeToLive()); - $producer->send( new PheanstalkDestination('theQueueName'), $message ); - - $this->assertNull($producer->getTimeToLive()); } /** From 38f6f0cfe2b77d9e55cbb05552a91c613c143dd7 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 20 Mar 2020 16:08:33 +0200 Subject: [PATCH 0750/1142] Release 0.10.2 --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0befb01a2..917dffa65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## [0.10.2](https://github.com/php-enqueue/enqueue-dev/tree/0.10.2) (2020-03-20) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.1...0.10.2) + +**Merged pull requests:** + +- Implement DeliveryDelay, Priority and TimeToLive in PheanstalkProducer [\#1033](https://github.com/php-enqueue/enqueue-dev/pull/1033) ([likeuntomurphy](https://github.com/likeuntomurphy)) +- fix\(mongodb\): Exception throwing fatal error, Broken handling of Mong… [\#1032](https://github.com/php-enqueue/enqueue-dev/pull/1032) ([josefsabl](https://github.com/josefsabl)) +- RUN\_COMMAND Option example [\#1030](https://github.com/php-enqueue/enqueue-dev/pull/1030) ([gam6itko](https://github.com/gam6itko)) +- typo [\#1026](https://github.com/php-enqueue/enqueue-dev/pull/1026) ([sebastianneubert](https://github.com/sebastianneubert)) +- Add extension tag parameter note [\#1023](https://github.com/php-enqueue/enqueue-dev/pull/1023) ([Steveb-p](https://github.com/Steveb-p)) +- STOMP. add additional configuration [\#1018](https://github.com/php-enqueue/enqueue-dev/pull/1018) ([versh23](https://github.com/versh23)) + ## [0.10.1](https://github.com/php-enqueue/enqueue-dev/tree/0.10.1) (2020-01-31) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.0...0.10.1) From c14da8203352efb2cc232d48ccc279b4063bba58 Mon Sep 17 00:00:00 2001 From: balabis Date: Tue, 24 Mar 2020 18:02:47 +0200 Subject: [PATCH 0751/1142] Changed: cast redelivery_delay to int --- pkg/redis/RedisConnectionFactory.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/pkg/redis/RedisConnectionFactory.php b/pkg/redis/RedisConnectionFactory.php index a17726ca8..e31a88456 100644 --- a/pkg/redis/RedisConnectionFactory.php +++ b/pkg/redis/RedisConnectionFactory.php @@ -87,10 +87,10 @@ public function createContext(): Context if ($this->config['lazy']) { return new RedisContext(function () { return $this->createRedis(); - }, $this->config['redelivery_delay']); + }, (int) $this->config['redelivery_delay']); } - return new RedisContext($this->createRedis(), $this->config['redelivery_delay']); + return new RedisContext($this->createRedis(), (int) $this->config['redelivery_delay']); } private function createRedis(): Redis @@ -114,11 +114,7 @@ private function parseDsn(string $dsn): array $supportedSchemes = ['redis', 'rediss', 'tcp', 'tls', 'unix']; if (false == in_array($dsn->getSchemeProtocol(), $supportedSchemes, true)) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be one of "%s"', - $dsn->getSchemeProtocol(), - implode('", "', $supportedSchemes) - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be one of "%s"', $dsn->getSchemeProtocol(), implode('", "', $supportedSchemes))); } $database = $dsn->getDecimal('database'); From 6e6e33393d28a820b154a6dd1104c43739d045a9 Mon Sep 17 00:00:00 2001 From: balabis Date: Mon, 6 Apr 2020 11:05:17 +0300 Subject: [PATCH 0752/1142] Added: ability to pass entity manager name to use --- .../DependencyInjection/Configuration.php | 3 +++ .../DependencyInjection/EnqueueExtension.php | 5 +++++ pkg/enqueue-bundle/Resources/config/job.yml | 1 + pkg/job-queue/Doctrine/JobStorage.php | 17 +++++++++++++---- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 3b6367fda..0bd6bb378 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -94,6 +94,9 @@ private function getJobConfiguration(): ArrayNodeDefinition } return (new ArrayNodeDefinition('job')) + ->children() + ->scalarNode('entity_manager_name')->defaultNull()->end() + ->end() ->addDefaultsIfNotSet() ->canBeEnabled() ; diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 10521b3a0..e45fac7bb 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -98,6 +98,11 @@ public function load(array $configs, ContainerBuilder $container): void throw new \LogicException('Job-queue supports only default configuration.'); } + $container->setParameter( + 'enqueue.job.entity_manager_name', + $modules['job']['entity_manager_name'] + ); + $loader->load('job.yml'); } diff --git a/pkg/enqueue-bundle/Resources/config/job.yml b/pkg/enqueue-bundle/Resources/config/job.yml index 0a368aebc..541fc13cf 100644 --- a/pkg/enqueue-bundle/Resources/config/job.yml +++ b/pkg/enqueue-bundle/Resources/config/job.yml @@ -9,6 +9,7 @@ services: - '@doctrine' - 'Enqueue\JobQueue\Doctrine\Entity\Job' - '%enqueue.job.unique_job_table_name%' + - '%enqueue.job.entity_manager_name%' # Deprecated. To be removed in 0.10. enqueue.job.storage: diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 32e20fe8d..bf86a9ae1 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -38,16 +38,23 @@ class JobStorage */ private $uniqueTableName; + /** + * @var string + */ + private $entityManagerName; + /** * @param ManagerRegistry $doctrine - * @param string $entityClass - * @param string $uniqueTableName + * @param string $entityClass + * @param string $uniqueTableName + * @param $entityManagerName */ - public function __construct(ManagerRegistry $doctrine, $entityClass, $uniqueTableName) + public function __construct(ManagerRegistry $doctrine, $entityClass, $uniqueTableName, $entityManagerName) { $this->doctrine = $doctrine; $this->entityClass = $entityClass; $this->uniqueTableName = $uniqueTableName; + $this->entityManagerName = $entityManagerName; } /** @@ -210,7 +217,9 @@ private function getEntityRepository() private function getEntityManager() { if (!$this->em) { - $this->em = $this->doctrine->getManagerForClass($this->entityClass); + $this->em = empty($this->entityManagerName) + ? $this->doctrine->getManagerForClass($this->entityClass) + : $this->doctrine->getManager($this->entityManagerName); } if (!$this->em->isOpen()) { $this->em = $this->doctrine->resetManager(); From 426aea9b2042161e0ff2fec123b7bc4405bd7bcc Mon Sep 17 00:00:00 2001 From: balabis Date: Mon, 6 Apr 2020 11:21:21 +0300 Subject: [PATCH 0753/1142] Changed: documentation --- docs/bundle/config_reference.md | 1 + docs/bundle/job_queue.md | 16 ++++------------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index d27877765..eaa3fafc9 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -67,6 +67,7 @@ enqueue: queue_name: ~ job: enabled: false + entity_manager_name: ~ async_events: enabled: false extensions: diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index eb1e25281..59b1b15d6 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -60,18 +60,10 @@ enqueue: # plus basic bundle configuration job: true - -doctrine: - # plus basic bundle configuration - - orm: - mappings: - EnqueueJobQueue: - is_bundle: false - type: xml - dir: '%kernel.project_dir%/vendor/enqueue/job-queue/Doctrine/mapping' - prefix: 'Enqueue\JobQueue\Doctrine\Entity' - + + # by default bundle will add a default orm mapping configuration + # if you define custom mappings, you can specify which entity manager to use here + entity_manager_name: ~ ``` * Run doctrine schema update command From d48103dc5f1a34c32483b79740368d0a0758366f Mon Sep 17 00:00:00 2001 From: balabis Date: Mon, 6 Apr 2020 11:27:39 +0300 Subject: [PATCH 0754/1142] Fixed: cs --- .../DoctrineClearIdentityMapExtension.php | 3 -- .../Tests/Functional/App/AppKernel.php | 3 -- .../CalculateRootJobStatusService.php | 11 +---- pkg/job-queue/DependentJobContext.php | 3 -- pkg/job-queue/DependentJobProcessor.php | 5 -- pkg/job-queue/DependentJobService.php | 10 +--- pkg/job-queue/Doctrine/JobStorage.php | 17 +------ pkg/job-queue/Job.php | 9 ---- pkg/job-queue/JobProcessor.php | 46 ++----------------- pkg/job-queue/JobRunner.php | 20 +++----- .../Test/DbalPersistedConnection.php | 3 -- .../Tests/Functional/app/AppKernel.php | 3 -- 12 files changed, 14 insertions(+), 119 deletions(-) diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php index a8f258f21..e88076819 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php @@ -13,9 +13,6 @@ class DoctrineClearIdentityMapExtension implements MessageReceivedExtensionInter */ protected $registry; - /** - * @param ManagerRegistry $registry - */ public function __construct(ManagerRegistry $registry) { $this->registry = $registry; diff --git a/pkg/enqueue-bundle/Tests/Functional/App/AppKernel.php b/pkg/enqueue-bundle/Tests/Functional/App/AppKernel.php index e484f0bfd..49ae1c605 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/AppKernel.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/AppKernel.php @@ -37,9 +37,6 @@ public function getLogDir() return sys_get_temp_dir().'/EnqueueBundle/cache/logs'; } - /** - * @param \Symfony\Component\Config\Loader\LoaderInterface $loader - */ public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load(__DIR__.'/config/config.yml'); diff --git a/pkg/job-queue/CalculateRootJobStatusService.php b/pkg/job-queue/CalculateRootJobStatusService.php index af4631e2a..4268158b1 100644 --- a/pkg/job-queue/CalculateRootJobStatusService.php +++ b/pkg/job-queue/CalculateRootJobStatusService.php @@ -12,17 +12,12 @@ class CalculateRootJobStatusService */ private $jobStorage; - /** - * @param JobStorage $jobStorage - */ public function __construct(JobStorage $jobStorage) { $this->jobStorage = $jobStorage; } /** - * @param Job $job - * * @return bool true if root job was stopped */ public function calculate(Job $job) @@ -91,11 +86,7 @@ protected function calculateRootJobStatus(array $jobs) $success++; break; default: - throw new \LogicException(sprintf( - 'Got unsupported job status: id: "%s" status: "%s"', - $job->getId(), - $job->getStatus() - )); + throw new \LogicException(sprintf('Got unsupported job status: id: "%s" status: "%s"', $job->getId(), $job->getStatus())); } } diff --git a/pkg/job-queue/DependentJobContext.php b/pkg/job-queue/DependentJobContext.php index 34deba656..04b898fd3 100644 --- a/pkg/job-queue/DependentJobContext.php +++ b/pkg/job-queue/DependentJobContext.php @@ -14,9 +14,6 @@ class DependentJobContext */ private $dependentJobs; - /** - * @param Job $job - */ public function __construct(Job $job) { $this->job = $job; diff --git a/pkg/job-queue/DependentJobProcessor.php b/pkg/job-queue/DependentJobProcessor.php index 6126be08f..4916c7031 100644 --- a/pkg/job-queue/DependentJobProcessor.php +++ b/pkg/job-queue/DependentJobProcessor.php @@ -30,11 +30,6 @@ class DependentJobProcessor implements Processor, TopicSubscriberInterface */ private $logger; - /** - * @param JobStorage $jobStorage - * @param ProducerInterface $producer - * @param LoggerInterface $logger - */ public function __construct(JobStorage $jobStorage, ProducerInterface $producer, LoggerInterface $logger) { $this->jobStorage = $jobStorage; diff --git a/pkg/job-queue/DependentJobService.php b/pkg/job-queue/DependentJobService.php index b6066d669..9ab500ba8 100644 --- a/pkg/job-queue/DependentJobService.php +++ b/pkg/job-queue/DependentJobService.php @@ -20,8 +20,6 @@ public function __construct(JobStorage $jobStorage) } /** - * @param Job $job - * * @return DependentJobContext */ public function createDependentJobContext(Job $job) @@ -29,16 +27,10 @@ public function createDependentJobContext(Job $job) return new DependentJobContext($job); } - /** - * @param DependentJobContext $context - */ public function saveDependentJob(DependentJobContext $context) { if (!$context->getJob()->isRoot()) { - throw new \LogicException(sprintf( - 'Only root jobs allowed but got child. jobId: "%s"', - $context->getJob()->getId() - )); + throw new \LogicException(sprintf('Only root jobs allowed but got child. jobId: "%s"', $context->getJob()->getId())); } $this->jobStorage->saveJob($context->getJob(), function (Job $job) use ($context) { diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index bf86a9ae1..5de408138 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -44,7 +44,6 @@ class JobStorage private $entityManagerName; /** - * @param ManagerRegistry $doctrine * @param string $entityClass * @param string $uniqueTableName * @param $entityManagerName @@ -97,7 +96,6 @@ public function findRootJobByOwnerIdAndJobName($ownerId, $jobName) /** * @param string $name - * @param Job $rootJob * * @return Job */ @@ -126,20 +124,13 @@ public function createJob() } /** - * @param Job $job - * @param \Closure|null $lockCallback - * * @throws DuplicateJobException */ public function saveJob(Job $job, \Closure $lockCallback = null) { $class = $this->getEntityRepository()->getClassName(); if (!$job instanceof $class) { - throw new \LogicException(sprintf( - 'Got unexpected job instance: expected: "%s", actual" "%s"', - $class, - get_class($job) - )); + throw new \LogicException(sprintf('Got unexpected job instance: expected: "%s", actual" "%s"', $class, get_class($job))); } if ($lockCallback) { @@ -182,11 +173,7 @@ public function saveJob(Job $job, \Closure $lockCallback = null) ]); } } catch (UniqueConstraintViolationException $e) { - throw new DuplicateJobException(sprintf( - 'Duplicate job. ownerId:"%s", name:"%s"', - $job->getOwnerId(), - $job->getName() - )); + throw new DuplicateJobException(sprintf('Duplicate job. ownerId:"%s", name:"%s"', $job->getOwnerId(), $job->getName())); } $this->getEntityManager()->persist($job); diff --git a/pkg/job-queue/Job.php b/pkg/job-queue/Job.php index 0468d7fdb..ef0c42c4e 100644 --- a/pkg/job-queue/Job.php +++ b/pkg/job-queue/Job.php @@ -237,8 +237,6 @@ public function getCreatedAt() * Do not call from the outside. * * @internal - * - * @param \DateTime $createdAt */ public function setCreatedAt(\DateTime $createdAt) { @@ -258,8 +256,6 @@ public function getStartedAt() * Do not call from the outside. * * @internal - * - * @param \DateTime $startedAt */ public function setStartedAt(\DateTime $startedAt) { @@ -279,8 +275,6 @@ public function getStoppedAt() * Do not call from the outside. * * @internal - * - * @param \DateTime $stoppedAt */ public function setStoppedAt(\DateTime $stoppedAt) { @@ -324,9 +318,6 @@ public function getData() return $this->data; } - /** - * @param array $data - */ public function setData(array $data) { $this->data = $data; diff --git a/pkg/job-queue/JobProcessor.php b/pkg/job-queue/JobProcessor.php index 8f197f742..06698f45c 100644 --- a/pkg/job-queue/JobProcessor.php +++ b/pkg/job-queue/JobProcessor.php @@ -17,10 +17,6 @@ class JobProcessor */ private $producer; - /** - * @param JobStorage $jobStorage - * @param ProducerInterface $producer - */ public function __construct(JobStorage $jobStorage, ProducerInterface $producer) { $this->jobStorage = $jobStorage; @@ -74,7 +70,6 @@ public function findOrCreateRootJob($ownerId, $jobName, $unique = false) /** * @param string $jobName - * @param Job $rootJob * * @return Job */ @@ -104,9 +99,6 @@ public function findOrCreateChildJob($jobName, Job $rootJob) return $job; } - /** - * @param Job $job - */ public function startChildJob(Job $job) { if ($job->isRoot()) { @@ -116,11 +108,7 @@ public function startChildJob(Job $job) $job = $this->jobStorage->findJobById($job->getId()); if (Job::STATUS_NEW !== $job->getStatus()) { - throw new \LogicException(sprintf( - 'Can start only new jobs: id: "%s", status: "%s"', - $job->getId(), - $job->getStatus() - )); + throw new \LogicException(sprintf('Can start only new jobs: id: "%s", status: "%s"', $job->getId(), $job->getStatus())); } $job->setStatus(Job::STATUS_RUNNING); @@ -131,9 +119,6 @@ public function startChildJob(Job $job) $this->sendCalculateRootJobStatusEvent($job); } - /** - * @param Job $job - */ public function successChildJob(Job $job) { if ($job->isRoot()) { @@ -143,11 +128,7 @@ public function successChildJob(Job $job) $job = $this->jobStorage->findJobById($job->getId()); if (Job::STATUS_RUNNING !== $job->getStatus()) { - throw new \LogicException(sprintf( - 'Can success only running jobs. id: "%s", status: "%s"', - $job->getId(), - $job->getStatus() - )); + throw new \LogicException(sprintf('Can success only running jobs. id: "%s", status: "%s"', $job->getId(), $job->getStatus())); } $job->setStatus(Job::STATUS_SUCCESS); @@ -158,9 +139,6 @@ public function successChildJob(Job $job) $this->sendCalculateRootJobStatusEvent($job); } - /** - * @param Job $job - */ public function failChildJob(Job $job) { if ($job->isRoot()) { @@ -170,11 +148,7 @@ public function failChildJob(Job $job) $job = $this->jobStorage->findJobById($job->getId()); if (Job::STATUS_RUNNING !== $job->getStatus()) { - throw new \LogicException(sprintf( - 'Can fail only running jobs. id: "%s", status: "%s"', - $job->getId(), - $job->getStatus() - )); + throw new \LogicException(sprintf('Can fail only running jobs. id: "%s", status: "%s"', $job->getId(), $job->getStatus())); } $job->setStatus(Job::STATUS_FAILED); @@ -185,9 +159,6 @@ public function failChildJob(Job $job) $this->sendCalculateRootJobStatusEvent($job); } - /** - * @param Job $job - */ public function cancelChildJob(Job $job) { if ($job->isRoot()) { @@ -197,11 +168,7 @@ public function cancelChildJob(Job $job) $job = $this->jobStorage->findJobById($job->getId()); if (!in_array($job->getStatus(), [Job::STATUS_NEW, Job::STATUS_RUNNING], true)) { - throw new \LogicException(sprintf( - 'Can cancel only new or running jobs. id: "%s", status: "%s"', - $job->getId(), - $job->getStatus() - )); + throw new \LogicException(sprintf('Can cancel only new or running jobs. id: "%s", status: "%s"', $job->getId(), $job->getStatus())); } $job->setStatus(Job::STATUS_CANCELLED); @@ -217,7 +184,6 @@ public function cancelChildJob(Job $job) } /** - * @param Job $job * @param bool $force */ public function interruptRootJob(Job $job, $force = false) @@ -245,8 +211,6 @@ public function interruptRootJob(Job $job, $force = false) /** * @see https://github.com/php-enqueue/enqueue-dev/pull/222#issuecomment-336102749 See for rationale - * - * @param Job $job */ protected function saveJob(Job $job) { @@ -255,8 +219,6 @@ protected function saveJob(Job $job) /** * @see https://github.com/php-enqueue/enqueue-dev/pull/222#issuecomment-336102749 See for rationale - * - * @param Job $job */ protected function sendCalculateRootJobStatusEvent(Job $job) { diff --git a/pkg/job-queue/JobRunner.php b/pkg/job-queue/JobRunner.php index afd445c67..e8d7eaa27 100644 --- a/pkg/job-queue/JobRunner.php +++ b/pkg/job-queue/JobRunner.php @@ -15,8 +15,7 @@ class JobRunner private $rootJob; /** - * @param JobProcessor $jobProcessor - * @param Job $rootJob + * @param Job $rootJob */ public function __construct(JobProcessor $jobProcessor, Job $rootJob = null) { @@ -25,9 +24,8 @@ public function __construct(JobProcessor $jobProcessor, Job $rootJob = null) } /** - * @param string $ownerId - * @param string $name - * @param callable $runCallback + * @param string $ownerId + * @param string $name * * @throws \Throwable|\Exception if $runCallback triggers an exception * @@ -54,11 +52,7 @@ public function runUnique($ownerId, $name, callable $runCallback) try { $this->jobProcessor->failChildJob($childJob); } catch (\Throwable $t) { - throw new OrphanJobException(sprintf( - 'Job cleanup failed. ID: "%s" Name: "%s"', - $childJob->getId(), - $childJob->getName() - ), 0, $e); + throw new OrphanJobException(sprintf('Job cleanup failed. ID: "%s" Name: "%s"', $childJob->getId(), $childJob->getName()), 0, $e); } throw $e; @@ -74,8 +68,7 @@ public function runUnique($ownerId, $name, callable $runCallback) } /** - * @param string $name - * @param callable $startCallback + * @param string $name * * @return mixed */ @@ -89,8 +82,7 @@ public function createDelayed($name, callable $startCallback) } /** - * @param string $jobId - * @param callable $runCallback + * @param string $jobId * * @return mixed */ diff --git a/pkg/job-queue/Test/DbalPersistedConnection.php b/pkg/job-queue/Test/DbalPersistedConnection.php index f1ec03035..51160c03b 100644 --- a/pkg/job-queue/Test/DbalPersistedConnection.php +++ b/pkg/job-queue/Test/DbalPersistedConnection.php @@ -102,9 +102,6 @@ protected function persistTransactionNestingLevel($level) static::$persistedTransactionNestingLevels[$this->getConnectionId()] = $level; } - /** - * @param DriverConnection $connection - */ protected function persistConnection(DriverConnection $connection) { static::$persistedConnections[$this->getConnectionId()] = $connection; diff --git a/pkg/job-queue/Tests/Functional/app/AppKernel.php b/pkg/job-queue/Tests/Functional/app/AppKernel.php index ce21df0b8..9e6a24812 100644 --- a/pkg/job-queue/Tests/Functional/app/AppKernel.php +++ b/pkg/job-queue/Tests/Functional/app/AppKernel.php @@ -36,9 +36,6 @@ public function getLogDir() return sys_get_temp_dir().'/EnqueueJobQueue/cache/logs'; } - /** - * @param \Symfony\Component\Config\Loader\LoaderInterface $loader - */ public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load(__DIR__.'/config/config.yml'); From 7087ddc57403b5f689a3c2c8b20a8a3afbb03373 Mon Sep 17 00:00:00 2001 From: balabis Date: Mon, 6 Apr 2020 15:50:46 +0300 Subject: [PATCH 0755/1142] Changed: default param to null --- pkg/job-queue/Doctrine/JobStorage.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 5de408138..42b39b437 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -46,9 +46,9 @@ class JobStorage /** * @param string $entityClass * @param string $uniqueTableName - * @param $entityManagerName + * @param mixed $entityManagerName */ - public function __construct(ManagerRegistry $doctrine, $entityClass, $uniqueTableName, $entityManagerName) + public function __construct(ManagerRegistry $doctrine, $entityClass, $uniqueTableName, $entityManagerName = null) { $this->doctrine = $doctrine; $this->entityClass = $entityClass; From 9c8ddcba6389089e98d56cc944649592c99fd2ba Mon Sep 17 00:00:00 2001 From: Alexander Menshchikov Date: Mon, 6 Apr 2020 20:45:28 +0300 Subject: [PATCH 0756/1142] Update composer.json Added ramsey/uuid 4.0 support. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 866f41d02..d9418163c 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "bunny/bunny": "^0.2.4|^0.3|^0.4", "php-amqplib/php-amqplib": "^2.7", "doctrine/dbal": "^2.6", - "ramsey/uuid": "^2|^3.5", + "ramsey/uuid": "^2|^3.5|^4.0", "psr/log": "^1", "psr/container": "^1", "makasim/temp-file": "^0.2", From 290a4440c1c9ca3f9f3d41bc17ba181dad46dd9e Mon Sep 17 00:00:00 2001 From: Pierre Grimaud Date: Sun, 19 Apr 2020 02:35:35 +0200 Subject: [PATCH 0757/1142] Fix typos --- docs/client/rpc_call.md | 2 +- docs/monitoring.md | 2 +- pkg/enqueue/Tests/Rpc/PromiseTest.php | 4 ++-- pkg/monitoring/README.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/client/rpc_call.md b/docs/client/rpc_call.md index ff07c6dbe..cfdd6ce46 100644 --- a/docs/client/rpc_call.md +++ b/docs/client/rpc_call.md @@ -15,7 +15,7 @@ You can do it by defining a command which returns something. ## The consumer side On the consumer side we have to register a command processor which computes the result and send it back to the sender. -Pay attention that you have to add reply extension. It wont work without it. +Pay attention that you have to add reply extension. It won't work without it. Of course it is possible to implement rpc server side based on transport classes only. That would require a bit more work to do. diff --git a/docs/monitoring.md b/docs/monitoring.md index 4c7172889..d86cf23a9 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -9,7 +9,7 @@ nav_order: 95 # Monitoring. Enqueue provides a tool for monitoring message queues. -With it, you can control how many messages were sent, how many processed successfuly or failed. +With it, you can control how many messages were sent, how many processed successfully or failed. How many consumers are working, their up time, processed messages stats, memory usage and system load. The tool could be integrated with virtually any analytics and monitoring platform. There are several integration: diff --git a/pkg/enqueue/Tests/Rpc/PromiseTest.php b/pkg/enqueue/Tests/Rpc/PromiseTest.php index 2755ef469..6762149ef 100644 --- a/pkg/enqueue/Tests/Rpc/PromiseTest.php +++ b/pkg/enqueue/Tests/Rpc/PromiseTest.php @@ -50,10 +50,10 @@ public function testOnReceiveShouldCallReceiveCallBackWithTimeout() $receiveInvoked = false; $receivePromise = null; $receiveTimeout = null; - $receivecb = function ($promise, $timout) use (&$receiveInvoked, &$receivePromise, &$receiveTimeout) { + $receivecb = function ($promise, $timeout) use (&$receiveInvoked, &$receivePromise, &$receiveTimeout) { $receiveInvoked = true; $receivePromise = $promise; - $receiveTimeout = $timout; + $receiveTimeout = $timeout; }; $promise = new Promise($receivecb, function () {}, function () {}); diff --git a/pkg/monitoring/README.md b/pkg/monitoring/README.md index 0942a4dbc..c14410cb9 100644 --- a/pkg/monitoring/README.md +++ b/pkg/monitoring/README.md @@ -12,7 +12,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made Queue Monitoring tool. Track sent, consumed messages. Consumers performances. * Could be used with any message queue library. -* Could be intergrated to any PHP framework +* Could be integrated to any PHP framework * Could send stats to any analytical platform * Supports Datadog, InfluxDb, Grafana and WAMP out of the box. * Provides integration for Enqueue From 10a0b124819fd0968a61f75c258eafabc94a9e39 Mon Sep 17 00:00:00 2001 From: balabis Date: Tue, 5 May 2020 10:54:48 +0300 Subject: [PATCH 0758/1142] Changed: use config setting to disable default mapping --- docs/bundle/config_reference.md | 2 +- docs/bundle/job_queue.md | 17 ++++++++++++++--- .../DependencyInjection/Configuration.php | 2 +- .../DependencyInjection/EnqueueExtension.php | 13 ++++++++----- pkg/enqueue-bundle/Resources/config/job.yml | 1 - pkg/job-queue/Doctrine/JobStorage.php | 8 ++------ 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/docs/bundle/config_reference.md b/docs/bundle/config_reference.md index eaa3fafc9..042b93cfa 100644 --- a/docs/bundle/config_reference.md +++ b/docs/bundle/config_reference.md @@ -67,7 +67,7 @@ enqueue: queue_name: ~ job: enabled: false - entity_manager_name: ~ + default_mapping: true async_events: enabled: false extensions: diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index 59b1b15d6..464ff0d0a 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -61,9 +61,20 @@ enqueue: job: true - # by default bundle will add a default orm mapping configuration - # if you define custom mappings, you can specify which entity manager to use here - entity_manager_name: ~ + # if you configure doctrine mapping yourself, disable default mapping + default_mapping: false + +doctrine: + # plus basic bundle configuration + + orm: + mappings: + EnqueueJobQueue: + is_bundle: false + type: xml + dir: '%kernel.project_dir%/vendor/enqueue/job-queue/Doctrine/mapping' + prefix: 'Enqueue\JobQueue\Doctrine\Entity' + ``` * Run doctrine schema update command diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 0bd6bb378..070851e4e 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -95,7 +95,7 @@ private function getJobConfiguration(): ArrayNodeDefinition return (new ArrayNodeDefinition('job')) ->children() - ->scalarNode('entity_manager_name')->defaultNull()->end() + ->booleanNode('default_mapping')->defaultTrue()->end() ->end() ->addDefaultsIfNotSet() ->canBeEnabled() diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index e45fac7bb..cc6c0500c 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -98,11 +98,6 @@ public function load(array $configs, ContainerBuilder $container): void throw new \LogicException('Job-queue supports only default configuration.'); } - $container->setParameter( - 'enqueue.job.entity_manager_name', - $modules['job']['entity_manager_name'] - ); - $loader->load('job.yml'); } @@ -176,6 +171,14 @@ private function registerJobQueueDoctrineEntityMapping(ContainerBuilder $contain return; } + foreach ($container->getExtensionConfig('enqueue') as $modules) { + foreach ($modules as $config) { + if (isset($config['job']) && false === $config['job']['default_mapping']) { + return; + } + } + } + foreach ($container->getExtensionConfig('doctrine') as $config) { // do not register mappings if dbal not configured. if (!empty($config['dbal'])) { diff --git a/pkg/enqueue-bundle/Resources/config/job.yml b/pkg/enqueue-bundle/Resources/config/job.yml index 541fc13cf..0a368aebc 100644 --- a/pkg/enqueue-bundle/Resources/config/job.yml +++ b/pkg/enqueue-bundle/Resources/config/job.yml @@ -9,7 +9,6 @@ services: - '@doctrine' - 'Enqueue\JobQueue\Doctrine\Entity\Job' - '%enqueue.job.unique_job_table_name%' - - '%enqueue.job.entity_manager_name%' # Deprecated. To be removed in 0.10. enqueue.job.storage: diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 42b39b437..89a79ac44 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -46,14 +46,12 @@ class JobStorage /** * @param string $entityClass * @param string $uniqueTableName - * @param mixed $entityManagerName */ - public function __construct(ManagerRegistry $doctrine, $entityClass, $uniqueTableName, $entityManagerName = null) + public function __construct(ManagerRegistry $doctrine, $entityClass, $uniqueTableName) { $this->doctrine = $doctrine; $this->entityClass = $entityClass; $this->uniqueTableName = $uniqueTableName; - $this->entityManagerName = $entityManagerName; } /** @@ -204,9 +202,7 @@ private function getEntityRepository() private function getEntityManager() { if (!$this->em) { - $this->em = empty($this->entityManagerName) - ? $this->doctrine->getManagerForClass($this->entityClass) - : $this->doctrine->getManager($this->entityManagerName); + $this->em = $this->doctrine->getManagerForClass($this->entityClass); } if (!$this->em->isOpen()) { $this->em = $this->doctrine->resetManager(); From 3148309b2a6252158608472cddef55c90ee46ec4 Mon Sep 17 00:00:00 2001 From: Andrii Dembitskyi Date: Sat, 16 May 2020 16:49:33 +0300 Subject: [PATCH 0759/1142] Fix contact us link --- docs/monitoring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/monitoring.md b/docs/monitoring.md index d86cf23a9..0643b425e 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -20,7 +20,7 @@ We are working on a JS\WAMP based real-time UI tool, for more information please ![Grafana Monitoring](images/grafana_monitoring.jpg) -[contact us](opensource@forma-pro.com) if need a Grafana template such as on the picture. +[contact us](mailto:opensource@forma-pro.com) if need a Grafana template such as on the picture. * [Installation](#installation) * [Track sent messages](#track-sent-messages) From 2a02ee1171c62a6acab87155dee404ff4c164c97 Mon Sep 17 00:00:00 2001 From: Bruno Melo Date: Tue, 9 Jun 2020 11:42:57 -0300 Subject: [PATCH 0760/1142] Fixes typo on client messages exemples doc --- docs/client/message_examples.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/client/message_examples.md b/docs/client/message_examples.md index 30efda7d1..f43ff6d46 100644 --- a/docs/client/message_examples.md +++ b/docs/client/message_examples.md @@ -16,7 +16,7 @@ nav_order: 2 ## Scope -There are two two types possible scopes: `Message:SCOPE_MESSAGE_BUS` and `Message::SCOPE_APP`. +There are two types possible scopes: `Message:SCOPE_MESSAGE_BUS` and `Message::SCOPE_APP`. The first one instructs the client send messages (if driver supports) to the message bus so other apps can consume those messages. The second in turns limits the message to the application that sent it. No other apps could receive it. From 5cbd20847c3cacfd66a3206292bfea8ba473f302 Mon Sep 17 00:00:00 2001 From: Quentin Dreyer Date: Wed, 24 Jun 2020 20:27:05 +0200 Subject: [PATCH 0761/1142] chore: add typehint to RdKafkaConsumer#getQueue Prevent the vscode intelephense error : "Undefined method 'getPartition'." --- pkg/rdkafka/RdKafkaConsumer.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index 6ec89aaf5..3aa568edb 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -75,6 +75,9 @@ public function setOffset(int $offset = null): void $this->offset = $offset; } + /** + * @return RdKafkaTopic + */ public function getQueue(): Queue { return $this->topic; From d544ca9318be67550294da6f25ec89b3bf72b51e Mon Sep 17 00:00:00 2001 From: Nebual Date: Tue, 21 Jul 2020 18:01:34 -0700 Subject: [PATCH 0762/1142] Update supported_brokers.md Added several missing ones, corrected Redis/FS, and added a Heartbeat column --- docs/client/supported_brokers.md | 60 ++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/docs/client/supported_brokers.md b/docs/client/supported_brokers.md index eee6bce8c..8f72a10c6 100644 --- a/docs/client/supported_brokers.md +++ b/docs/client/supported_brokers.md @@ -6,38 +6,46 @@ nav_order: 3 --- {% include support.md %} -# Client. Supported brokers +# Client Supported brokers Here's the list of transports supported by Enqueue Client: -| Transport | Package | DSN | -|:-------------------:|:----------------------------------------------------------:|:-------------------------------:| -| AMQP, RabbitMQ | [enqueue/amqp-bunny](../transport/amqp_bunny.md) | amqp: amqp+bunny: | -| AMQP, RabbitMQ | [enqueue/amqp-lib](../transport/amqp_lib.md) | amqp: amqp+lib: amqp+rabbitmq: | -| AMQP, RabbitMQ | [enqueue/amqp-ext](../transport/amqp.md) | amqp: amqp+ext: | -| Doctrine DBAL | [enqueue/dbal](../transport/dbal.md) | mysql: pgsql: pdo_pgsql etc | -| Filesystem | [enqueue/fs](../transport/fs.md) | file:///foo/bar | -| Google PubSub | [enqueue/gps](../transport/gps.md) | gps: | -| Redis | [enqueue/redis](../transport/redis.md) | redis: | -| Amazon SQS | [enqueue/sqs](../transport/sqs.md) | sqs: | -| STOMP, RabbitMQ | [enqueue/stomp](../transport/stomp.md) | stomp: | -| Kafka | [enqueue/rdkafka](../transport/kafka.md) | kafka: | -| Null | [enqueue/null](../transport/null.md) | null: | +| Transport | Package | DSN | +|:---------------------:|:----------------------------------------------------------:|:-------------------------------:| +| AMQP, RabbitMQ | [enqueue/amqp-bunny](../transport/amqp_bunny.md) | amqp: amqp+bunny: | +| AMQP, RabbitMQ | [enqueue/amqp-lib](../transport/amqp_lib.md) | amqp: amqp+lib: amqp+rabbitmq: | +| AMQP, RabbitMQ | [enqueue/amqp-ext](../transport/amqp.md) | amqp: amqp+ext: | +| Doctrine DBAL | [enqueue/dbal](../transport/dbal.md) | mysql: pgsql: pdo_pgsql etc | +| Filesystem | [enqueue/fs](../transport/fs.md) | file:///foo/bar | +| Gearman | [enqueue/gearman](../transport/gearman.md) | gearman: | +| GPS, Google PubSub | [enqueue/gps](../transport/gps.md) | gps: | +| MongoDB | [enqueue/mongodb](../transport/mongodb.md) | mongodb: | +| Pheanstalk, Beanstalk | [enqueue/pheanstalk](../transport/pheanstalk.md) | beanstalk: | +| Redis | [enqueue/redis](../transport/redis.md) | redis: | +| Amazon SQS | [enqueue/sqs](../transport/sqs.md) | sqs: | +| STOMP, RabbitMQ | [enqueue/stomp](../transport/stomp.md) | stomp: | +| Kafka | [enqueue/rdkafka](../transport/kafka.md) | kafka: | +| Null | [enqueue/null](../transport/null.md) | null: | +| WAMP | [enqueue/wamp](../transport/wamp.md) | wamp: | Here's the list of protocols and Client features supported by them -| Protocol | Priority | Delay | Expiration | Setup broker | Message bus | -|:--------------:|:--------:|:--------:|:----------:|:------------:|:-----------:| -| AMQP | No | No | Yes | Yes | Yes | -| RabbitMQ AMQP | Yes | Yes | Yes | Yes | Yes | -| STOMP | No | No | Yes | No | Yes** | -| RabbitMQ STOMP | Yes | Yes | Yes | Yes*** | Yes** | -| Filesystem | No | No | No | Yes | No | -| Redis | No | No | No | Not needed | No | -| Doctrine DBAL | Yes | Yes | No | Yes | No | -| Amazon SQS | No | Yes | No | Yes | Not impl | -| Kafka | No | No | No | Yes | No | -| Google PubSub | Not impl | Not impl | Not impl | Yes | Not impl | +| Protocol | Priority | Delay | Expiration | Setup broker | Message bus | Heartbeat | +|:--------------:|:--------:|:--------:|:----------:|:------------:|:-----------:|:---------:| +| AMQP | No | No | Yes | Yes | Yes | No | +| RabbitMQ AMQP | Yes | Yes | Yes | Yes | Yes | Yes | +| STOMP | No | No | Yes | No | Yes** | No | +| RabbitMQ STOMP | Yes | Yes | Yes | Yes*** | Yes** | Yes | +| Filesystem | No | No | Yes | Yes | No | No | +| Redis | No | Yes | Yes | Not needed | No | No | +| Doctrine DBAL | Yes | Yes | No | Yes | No | No | +| Amazon SQS | No | Yes | No | Yes | Not impl | No | +| Gearman | No | No | No | No | No | No | +| Kafka | No | No | No | Yes | No | No | +| Google PubSub | Not impl | Not impl | Not impl | Yes | Not impl | No | +| MongoDB | Yes | Yes | Yes | Yes | No | No | +| Pheanstalk | Yes | Yes | Yes | No | No | No | +| WAMP | No | No | No | No | No | No | * \*\* Possible if topics (exchanges) are configured on broker side manually. * \*\*\* Possible if RabbitMQ Management Plugin is installed. From 3db066ce1d9a8021763f4db5b88e7d6a5c86348e Mon Sep 17 00:00:00 2001 From: Nebual Date: Tue, 21 Jul 2020 18:04:37 -0700 Subject: [PATCH 0763/1142] Docs: Supported Brokers - reordered alphabetically --- docs/client/supported_brokers.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/client/supported_brokers.md b/docs/client/supported_brokers.md index 8f72a10c6..7a691de7a 100644 --- a/docs/client/supported_brokers.md +++ b/docs/client/supported_brokers.md @@ -12,20 +12,20 @@ Here's the list of transports supported by Enqueue Client: | Transport | Package | DSN | |:---------------------:|:----------------------------------------------------------:|:-------------------------------:| +| AMQP, RabbitMQ | [enqueue/amqp-ext](../transport/amqp.md) | amqp: amqp+ext: | | AMQP, RabbitMQ | [enqueue/amqp-bunny](../transport/amqp_bunny.md) | amqp: amqp+bunny: | | AMQP, RabbitMQ | [enqueue/amqp-lib](../transport/amqp_lib.md) | amqp: amqp+lib: amqp+rabbitmq: | -| AMQP, RabbitMQ | [enqueue/amqp-ext](../transport/amqp.md) | amqp: amqp+ext: | | Doctrine DBAL | [enqueue/dbal](../transport/dbal.md) | mysql: pgsql: pdo_pgsql etc | | Filesystem | [enqueue/fs](../transport/fs.md) | file:///foo/bar | | Gearman | [enqueue/gearman](../transport/gearman.md) | gearman: | | GPS, Google PubSub | [enqueue/gps](../transport/gps.md) | gps: | +| Kafka | [enqueue/rdkafka](../transport/kafka.md) | kafka: | | MongoDB | [enqueue/mongodb](../transport/mongodb.md) | mongodb: | +| Null | [enqueue/null](../transport/null.md) | null: | | Pheanstalk, Beanstalk | [enqueue/pheanstalk](../transport/pheanstalk.md) | beanstalk: | | Redis | [enqueue/redis](../transport/redis.md) | redis: | | Amazon SQS | [enqueue/sqs](../transport/sqs.md) | sqs: | | STOMP, RabbitMQ | [enqueue/stomp](../transport/stomp.md) | stomp: | -| Kafka | [enqueue/rdkafka](../transport/kafka.md) | kafka: | -| Null | [enqueue/null](../transport/null.md) | null: | | WAMP | [enqueue/wamp](../transport/wamp.md) | wamp: | Here's the list of protocols and Client features supported by them @@ -34,17 +34,17 @@ Here's the list of protocols and Client features supported by them |:--------------:|:--------:|:--------:|:----------:|:------------:|:-----------:|:---------:| | AMQP | No | No | Yes | Yes | Yes | No | | RabbitMQ AMQP | Yes | Yes | Yes | Yes | Yes | Yes | -| STOMP | No | No | Yes | No | Yes** | No | -| RabbitMQ STOMP | Yes | Yes | Yes | Yes*** | Yes** | Yes | -| Filesystem | No | No | Yes | Yes | No | No | -| Redis | No | Yes | Yes | Not needed | No | No | | Doctrine DBAL | Yes | Yes | No | Yes | No | No | -| Amazon SQS | No | Yes | No | Yes | Not impl | No | +| Filesystem | No | No | Yes | Yes | No | No | | Gearman | No | No | No | No | No | No | -| Kafka | No | No | No | Yes | No | No | | Google PubSub | Not impl | Not impl | Not impl | Yes | Not impl | No | +| Kafka | No | No | No | Yes | No | No | | MongoDB | Yes | Yes | Yes | Yes | No | No | | Pheanstalk | Yes | Yes | Yes | No | No | No | +| Redis | No | Yes | Yes | Not needed | No | No | +| Amazon SQS | No | Yes | No | Yes | Not impl | No | +| STOMP | No | No | Yes | No | Yes** | No | +| RabbitMQ STOMP | Yes | Yes | Yes | Yes*** | Yes** | Yes | | WAMP | No | No | No | No | No | No | * \*\* Possible if topics (exchanges) are configured on broker side manually. From 30935c300d96a225fcf9f60e850b35ae5d1faa94 Mon Sep 17 00:00:00 2001 From: Nebual Date: Tue, 21 Jul 2020 18:27:58 -0700 Subject: [PATCH 0764/1142] Docs: add link to Supported Brokers to Transports index --- docs/client/supported_brokers.md | 2 +- docs/transport/index.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/client/supported_brokers.md b/docs/client/supported_brokers.md index 7a691de7a..076e3b013 100644 --- a/docs/client/supported_brokers.md +++ b/docs/client/supported_brokers.md @@ -28,7 +28,7 @@ Here's the list of transports supported by Enqueue Client: | STOMP, RabbitMQ | [enqueue/stomp](../transport/stomp.md) | stomp: | | WAMP | [enqueue/wamp](../transport/wamp.md) | wamp: | -Here's the list of protocols and Client features supported by them +## Transport Features | Protocol | Priority | Delay | Expiration | Setup broker | Message bus | Heartbeat | |:--------------:|:--------:|:--------:|:----------:|:------------:|:-----------:|:---------:| diff --git a/docs/transport/index.md b/docs/transport/index.md index df7755e83..47da348c4 100644 --- a/docs/transport/index.md +++ b/docs/transport/index.md @@ -7,3 +7,5 @@ permalink: /transport --- {:toc} + +[Feature Comparison Table](../client/supported_brokers.md#transport-features) From 640ad86915181095b469871b1c80005a4e46befa Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 30 Jul 2020 13:02:35 +0200 Subject: [PATCH 0765/1142] Fix php7.4 issue --- pkg/pheanstalk/PheanstalkConsumer.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/pheanstalk/PheanstalkConsumer.php b/pkg/pheanstalk/PheanstalkConsumer.php index d8460f58a..cec388785 100644 --- a/pkg/pheanstalk/PheanstalkConsumer.php +++ b/pkg/pheanstalk/PheanstalkConsumer.php @@ -111,7 +111,9 @@ private function convertJobToMessage(Job $job): PheanstalkMessage $stats = $this->pheanstalk->statsJob($job); $message = PheanstalkMessage::jsonUnserialize($job->getData()); - $message->setRedelivered($stats['reserves'] > 1); + if (isset($stats['reserves'])) { + $message->setRedelivered($stats['reserves'] > 1); + } $message->setJob($job); return $message; From 1173c7d6a7de48c3a43356c2fbfa1d2f76820f98 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 30 Jul 2020 13:27:26 +0200 Subject: [PATCH 0766/1142] CS fix --- pkg/pheanstalk/PheanstalkConsumer.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/pheanstalk/PheanstalkConsumer.php b/pkg/pheanstalk/PheanstalkConsumer.php index cec388785..3fb217683 100644 --- a/pkg/pheanstalk/PheanstalkConsumer.php +++ b/pkg/pheanstalk/PheanstalkConsumer.php @@ -91,10 +91,8 @@ public function reject(Message $message, bool $requeue = false): void InvalidMessageException::assertMessageInstanceOf($message, PheanstalkMessage::class); if (false == $message->getJob()) { - throw new \LogicException(sprintf( - 'The message could not be %s because it does not have job set.', - $requeue ? 'requeued' : 'rejected' - )); + $state = $requeue ? 'requeued' : 'rejected'; + throw new \LogicException(sprintf('The message could not be %s because it does not have job set.', $state)); } if ($requeue) { From 48420755f7d6abed09c1deda615b73ad445f9587 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 30 Jul 2020 14:00:17 +0200 Subject: [PATCH 0767/1142] Add more timeout --- pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 37b6e1b57..98d48a1ef 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -220,7 +220,7 @@ public function testProducerSendsEventMessageViaProduceCommand() $consumer = $this->getContext()->createConsumer($this->getTestQueue()); - $message = $consumer->receive(100); + $message = $consumer->receive(500); $this->assertInstanceOf(Message::class, $message); $consumer->acknowledge($message); From f2e7fd1c82afed9e1e71c7500bde7a8c87cbc811 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 30 Jul 2020 14:19:01 +0200 Subject: [PATCH 0768/1142] Move receive timeout to const --- pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 98d48a1ef..7c2936c0e 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -18,6 +18,8 @@ */ class UseCasesTest extends WebTestCase { + const RECEIVE_TIMEOUT = 500; + public function setUp() { // do not call parent::setUp. @@ -172,7 +174,7 @@ public function testProducerSendsEventMessage(array $enqueueConfig) $consumer = $this->getContext()->createConsumer($this->getTestQueue()); - $message = $consumer->receive(100); + $message = $consumer->receive(self::RECEIVE_TIMEOUT); $this->assertInstanceOf(Message::class, $message); $consumer->acknowledge($message); @@ -192,7 +194,7 @@ public function testProducerSendsCommandMessage(array $enqueueConfig) $consumer = $this->getContext()->createConsumer($this->getTestQueue()); - $message = $consumer->receive(100); + $message = $consumer->receive(self::RECEIVE_TIMEOUT); $this->assertInstanceOf(Message::class, $message); $consumer->acknowledge($message); @@ -220,7 +222,7 @@ public function testProducerSendsEventMessageViaProduceCommand() $consumer = $this->getContext()->createConsumer($this->getTestQueue()); - $message = $consumer->receive(500); + $message = $consumer->receive(self::RECEIVE_TIMEOUT); $this->assertInstanceOf(Message::class, $message); $consumer->acknowledge($message); @@ -247,7 +249,7 @@ public function testProducerSendsCommandMessageViaProduceCommand() $consumer = $this->getContext()->createConsumer($this->getTestQueue()); - $message = $consumer->receive(100); + $message = $consumer->receive(self::RECEIVE_TIMEOUT); $this->assertInstanceOf(Message::class, $message); $consumer->acknowledge($message); From 38fd33fe0b861d1a05465546bea1266e024789f7 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 30 Jul 2020 17:40:15 +0200 Subject: [PATCH 0769/1142] Allow to install ramsey/uuid:^4 --- pkg/dbal/composer.json | 2 +- pkg/enqueue/composer.json | 2 +- pkg/monitoring/composer.json | 2 +- pkg/redis/composer.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 01e605105..afd98c18a 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.6", - "ramsey/uuid": "^3" + "ramsey/uuid": "^3|^4" }, "require-dev": { "phpunit/phpunit": "~7.5", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index d95bb23df..ed9603057 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -11,7 +11,7 @@ "queue-interop/queue-interop": "^0.8", "enqueue/null": "^0.10", "enqueue/dsn": "^0.10", - "ramsey/uuid": "^2|^3.5", + "ramsey/uuid": "^2|^3.5|^4", "psr/log": "^1", "psr/container": "^1" }, diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index 919744f2a..b31dc7831 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.1.3", "enqueue/enqueue": "^0.10", - "ramsey/uuid": "^3", + "ramsey/uuid": "^3|^4", "enqueue/dsn": "^0.10" }, "require-dev": { diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index a067d9a6d..135f5a0c9 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -9,7 +9,7 @@ "php": "^7.1.3", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "ramsey/uuid": "^3" + "ramsey/uuid": "^3|^4" }, "require-dev": { "phpunit/phpunit": "~7.5", From 2c8bbceac5ffd8f8f5ed9ce0010c677f344ac666 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 30 Jul 2020 20:38:01 +0200 Subject: [PATCH 0770/1142] Add php 7.3 and 7.4 travis env to test --- pkg/amqp-bunny/.travis.yml | 2 ++ pkg/amqp-ext/.travis.yml | 2 ++ pkg/amqp-lib/.travis.yml | 2 ++ pkg/async-command/.travis.yml | 2 ++ pkg/async-event-dispatcher/.travis.yml | 2 ++ pkg/dbal/.travis.yml | 2 ++ pkg/dsn/.travis.yml | 2 ++ pkg/fs/.travis.yml | 2 ++ pkg/gearman/.travis.yml | 2 ++ pkg/gps/.travis.yml | 2 ++ pkg/job-queue/.travis.yml | 2 ++ pkg/monitoring/.travis.yml | 2 ++ pkg/null/.travis.yml | 2 ++ pkg/pheanstalk/.travis.yml | 2 ++ pkg/rdkafka/.travis.yml | 2 ++ pkg/redis/.travis.yml | 2 ++ pkg/simple-client/.travis.yml | 2 ++ pkg/sns/.travis.yml | 2 ++ pkg/snsqs/.travis.yml | 2 ++ pkg/sqs/.travis.yml | 2 ++ pkg/stomp/.travis.yml | 2 ++ pkg/wamp/.travis.yml | 2 ++ 22 files changed, 44 insertions(+) diff --git a/pkg/amqp-bunny/.travis.yml b/pkg/amqp-bunny/.travis.yml index b7ba11943..02ba7238b 100644 --- a/pkg/amqp-bunny/.travis.yml +++ b/pkg/amqp-bunny/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/amqp-ext/.travis.yml b/pkg/amqp-ext/.travis.yml index 5556e8f9c..8210653a3 100644 --- a/pkg/amqp-ext/.travis.yml +++ b/pkg/amqp-ext/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/amqp-lib/.travis.yml b/pkg/amqp-lib/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/amqp-lib/.travis.yml +++ b/pkg/amqp-lib/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/async-command/.travis.yml b/pkg/async-command/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/async-command/.travis.yml +++ b/pkg/async-command/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/async-event-dispatcher/.travis.yml b/pkg/async-event-dispatcher/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/async-event-dispatcher/.travis.yml +++ b/pkg/async-event-dispatcher/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/dbal/.travis.yml b/pkg/dbal/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/dbal/.travis.yml +++ b/pkg/dbal/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/dsn/.travis.yml b/pkg/dsn/.travis.yml index bc1ccd01c..27c064a7c 100644 --- a/pkg/dsn/.travis.yml +++ b/pkg/dsn/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/fs/.travis.yml b/pkg/fs/.travis.yml index 2c39f47da..b910c0fcf 100644 --- a/pkg/fs/.travis.yml +++ b/pkg/fs/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/gearman/.travis.yml b/pkg/gearman/.travis.yml index ca78987eb..7e96cb089 100644 --- a/pkg/gearman/.travis.yml +++ b/pkg/gearman/.travis.yml @@ -6,6 +6,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/gps/.travis.yml b/pkg/gps/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/gps/.travis.yml +++ b/pkg/gps/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/job-queue/.travis.yml b/pkg/job-queue/.travis.yml index e74d70f07..623b55fe0 100644 --- a/pkg/job-queue/.travis.yml +++ b/pkg/job-queue/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/monitoring/.travis.yml b/pkg/monitoring/.travis.yml index b7ba11943..02ba7238b 100644 --- a/pkg/monitoring/.travis.yml +++ b/pkg/monitoring/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/null/.travis.yml b/pkg/null/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/null/.travis.yml +++ b/pkg/null/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/pheanstalk/.travis.yml b/pkg/pheanstalk/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/pheanstalk/.travis.yml +++ b/pkg/pheanstalk/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/rdkafka/.travis.yml b/pkg/rdkafka/.travis.yml index 5556e8f9c..8210653a3 100644 --- a/pkg/rdkafka/.travis.yml +++ b/pkg/rdkafka/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/redis/.travis.yml b/pkg/redis/.travis.yml index 2b0fbc84a..0b8b0d098 100644 --- a/pkg/redis/.travis.yml +++ b/pkg/redis/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/simple-client/.travis.yml b/pkg/simple-client/.travis.yml index 408d8b7f9..ebe714611 100644 --- a/pkg/simple-client/.travis.yml +++ b/pkg/simple-client/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/sns/.travis.yml b/pkg/sns/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/sns/.travis.yml +++ b/pkg/sns/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/snsqs/.travis.yml b/pkg/snsqs/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/snsqs/.travis.yml +++ b/pkg/snsqs/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/sqs/.travis.yml b/pkg/sqs/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/sqs/.travis.yml +++ b/pkg/sqs/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/stomp/.travis.yml b/pkg/stomp/.travis.yml index 9ed4fa123..ae8b10d3d 100644 --- a/pkg/stomp/.travis.yml +++ b/pkg/stomp/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: diff --git a/pkg/wamp/.travis.yml b/pkg/wamp/.travis.yml index b7ba11943..02ba7238b 100644 --- a/pkg/wamp/.travis.yml +++ b/pkg/wamp/.travis.yml @@ -8,6 +8,8 @@ language: php php: - '7.1' - '7.2' + - '7.3' + - '7.4' cache: directories: From 8f44320ac5d1ac0d9ab55b166b61b5c7eeb47088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=A1bl?= Date: Wed, 5 Aug 2020 18:11:37 +0200 Subject: [PATCH 0771/1142] fix(MongoDB) Redelivery not working (fixes #1077) --- pkg/mongodb/MongodbConsumer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/mongodb/MongodbConsumer.php b/pkg/mongodb/MongodbConsumer.php index 494210573..37ef12530 100644 --- a/pkg/mongodb/MongodbConsumer.php +++ b/pkg/mongodb/MongodbConsumer.php @@ -109,6 +109,7 @@ public function reject(Message $message, bool $requeue = false): void InvalidMessageException::assertMessageInstanceOf($message, MongodbMessage::class); if ($requeue) { + $message->setRedelivered(true); $this->context->createProducer()->send($this->queue, $message); return; From 7cbc437ed0f09eb067c785a4adf8d98076e30256 Mon Sep 17 00:00:00 2001 From: balabis Date: Thu, 20 Aug 2020 10:04:11 +0300 Subject: [PATCH 0772/1142] Removed: unused variable Changed: job queue documentation --- docs/bundle/job_queue.md | 5 +++-- pkg/job-queue/Doctrine/JobStorage.php | 5 ----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/bundle/job_queue.md b/docs/bundle/job_queue.md index 464ff0d0a..cd13ca3cd 100644 --- a/docs/bundle/job_queue.md +++ b/docs/bundle/job_queue.md @@ -61,8 +61,9 @@ enqueue: job: true - # if you configure doctrine mapping yourself, disable default mapping - default_mapping: false + # adds bundle's default Job entity mapping to application's entity manager. + # set it to false when using your own mapped entities for jobs. + default_mapping: true doctrine: # plus basic bundle configuration diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 89a79ac44..1ba6aab33 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -38,11 +38,6 @@ class JobStorage */ private $uniqueTableName; - /** - * @var string - */ - private $entityManagerName; - /** * @param string $entityClass * @param string $uniqueTableName From 200964cbc35b747eaf3a88cd312bac83ca47082e Mon Sep 17 00:00:00 2001 From: balabis Date: Thu, 20 Aug 2020 11:38:43 +0300 Subject: [PATCH 0773/1142] Added: additional information in bundle configuration --- pkg/enqueue-bundle/DependencyInjection/Configuration.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/Configuration.php b/pkg/enqueue-bundle/DependencyInjection/Configuration.php index 070851e4e..733849d35 100644 --- a/pkg/enqueue-bundle/DependencyInjection/Configuration.php +++ b/pkg/enqueue-bundle/DependencyInjection/Configuration.php @@ -95,7 +95,10 @@ private function getJobConfiguration(): ArrayNodeDefinition return (new ArrayNodeDefinition('job')) ->children() - ->booleanNode('default_mapping')->defaultTrue()->end() + ->booleanNode('default_mapping') + ->defaultTrue() + ->info('Adds bundle\'s default Job entity mapping to application\'s entity manager') + ->end() ->end() ->addDefaultsIfNotSet() ->canBeEnabled() From 1772a88c8cfcb2ac192f2b4acfee71c6b5c93267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20CROMBEZ?= <777666+jcrombez@users.noreply.github.com> Date: Mon, 24 Aug 2020 16:28:11 +0200 Subject: [PATCH 0774/1142] [async-command] Fix service definition to apply the timeout addArgument add only one argument at a time to the construtor, right now the timeout configured by the user is never applied and it's always the default (60) value, this fixes it. --- .../DependencyInjection/AsyncCommandExtension.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php index d1f4157a2..c1a0fa8f8 100644 --- a/pkg/async-command/DependencyInjection/AsyncCommandExtension.php +++ b/pkg/async-command/DependencyInjection/AsyncCommandExtension.php @@ -24,7 +24,8 @@ public function load(array $configs, ContainerBuilder $container) $id = sprintf('enqueue.async_command.%s.run_command_processor', $client['name']); $container->register($id, RunCommandProcessor::class) - ->addArgument('%kernel.project_dir%', $client['timeout']) + ->addArgument('%kernel.project_dir%') + ->addArgument($client['timeout']) ->addTag('enqueue.processor', [ 'client' => $client['name'], 'command' => $client['command_name'] ?? Commands::RUN_COMMAND, From 62370e4235979df474d8f4e9c5d63eae3a144887 Mon Sep 17 00:00:00 2001 From: Dariusz Gafka Date: Tue, 1 Sep 2020 14:24:09 +0200 Subject: [PATCH 0775/1142] Solves binding Headers Exchange with Queue using custom arguments --- pkg/amqp-lib/AmqpContext.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/amqp-lib/AmqpContext.php b/pkg/amqp-lib/AmqpContext.php index 3628b09c9..32f60c21b 100644 --- a/pkg/amqp-lib/AmqpContext.php +++ b/pkg/amqp-lib/AmqpContext.php @@ -220,7 +220,7 @@ public function bind(InteropAmqpBind $bind): void $bind->getTarget()->getTopicName(), $bind->getRoutingKey(), (bool) ($bind->getFlags() & InteropAmqpBind::FLAG_NOWAIT), - $bind->getArguments() + new AMQPTable($bind->getArguments()) ); // bind exchange to queue } else { @@ -229,7 +229,7 @@ public function bind(InteropAmqpBind $bind): void $bind->getSource()->getTopicName(), $bind->getRoutingKey(), (bool) ($bind->getFlags() & InteropAmqpBind::FLAG_NOWAIT), - $bind->getArguments() + new AMQPTable($bind->getArguments()) ); } } From f7a8b0faa0f55562967495bd18545a1693a4f76d Mon Sep 17 00:00:00 2001 From: Kevin Defives Date: Fri, 4 Sep 2020 11:28:49 +0200 Subject: [PATCH 0776/1142] Fix #1085 Fix #1085 - Fix to be compatible with doctrine v3 . Since Doctrine v3, seems some changes with doctrine/common --- pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php index b6e684cdd..1fd336c4e 100644 --- a/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php +++ b/pkg/enqueue/Doctrine/DoctrineConnectionFactoryFactory.php @@ -2,7 +2,7 @@ namespace Enqueue\Doctrine; -use Doctrine\Common\Persistence\ManagerRegistry; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\ConnectionFactoryFactoryInterface; use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Dsn\Dsn; From 4a8265f550c058d117f63ea1423ae00b412765ab Mon Sep 17 00:00:00 2001 From: Kevin Defives Date: Fri, 4 Sep 2020 15:56:45 +0200 Subject: [PATCH 0777/1142] Add conflict "doctrine/persistence": "<1.3.0" Add conflict "doctrine/persistence": "<1.3.0" --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d9418163c..793c1294f 100644 --- a/composer.json +++ b/composer.json @@ -119,5 +119,8 @@ "ext-mongo": "1.6.14" }, "prefer-stable": true - } + }, + "conflict": { + "doctrine/persistence": "<1.3.0" + } } From 95959bd112d1cedeb6d56dd20ab70cbb85a1e72f Mon Sep 17 00:00:00 2001 From: Kevin Date: Fri, 4 Sep 2020 20:48:09 +0200 Subject: [PATCH 0778/1142] Change doctine\common by doctrine --- .../Extension/DoctrineClearIdentityMapExtensionTest.php | 4 ++-- .../Extension/DoctrineClosedEntityManagerExtensionTest.php | 2 +- .../Extension/DoctrinePingConnectionExtensionTest.php | 2 +- pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php index 852960458..604012e78 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php @@ -2,8 +2,8 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; -use Doctrine\Common\Persistence\ManagerRegistry; -use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Persistence\ManagerRegistry; +use Doctrine\Persistence\ObjectManager; use Enqueue\Bundle\Consumption\Extension\DoctrineClearIdentityMapExtension; use Enqueue\Consumption\Context\MessageReceived; use Interop\Queue\Consumer; diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php index 59587adfb..aa12bf7b8 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php @@ -2,7 +2,7 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; -use Doctrine\Common\Persistence\ManagerRegistry; +use Doctrine\Persistence\ManagerRegistry; use Doctrine\ORM\EntityManagerInterface; use Enqueue\Bundle\Consumption\Extension\DoctrineClosedEntityManagerExtension; use Enqueue\Consumption\Context\PostConsume; diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index 829882d4f..b6eddfa93 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -2,7 +2,7 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; -use Doctrine\Common\Persistence\ManagerRegistry; +use Doctrine\Persistence\ManagerRegistry; use Doctrine\DBAL\Connection; use Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension; use Enqueue\Consumption\Context\MessageReceived; diff --git a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php index cf1e5918a..7282aa42e 100644 --- a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php +++ b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php @@ -4,7 +4,7 @@ namespace Enqueue\Tests; -use Doctrine\Common\Persistence\ManagerRegistry; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\ConnectionFactoryFactoryInterface; use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Doctrine\DoctrineConnectionFactoryFactory; From 286834d442cc343a4c95a59c6db52ed1151f1274 Mon Sep 17 00:00:00 2001 From: balabis Date: Tue, 8 Sep 2020 10:00:34 +0300 Subject: [PATCH 0779/1142] Changed: use merged configuration --- .../DependencyInjection/EnqueueExtension.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index cc6c0500c..64d59db71 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -171,11 +171,14 @@ private function registerJobQueueDoctrineEntityMapping(ContainerBuilder $contain return; } - foreach ($container->getExtensionConfig('enqueue') as $modules) { - foreach ($modules as $config) { - if (isset($config['job']) && false === $config['job']['default_mapping']) { - return; - } + $config = $this->processConfiguration( + new Configuration(false), + $container->getExtensionConfig('enqueue') + ); + + foreach ($config as $name => $modules) { + if (isset($modules['job']) && false === $modules['job']['default_mapping']) { + return; } } From 0fbfc4de1338f0fb7a622653940d4e59e904837b Mon Sep 17 00:00:00 2001 From: balabis Date: Tue, 8 Sep 2020 10:44:58 +0300 Subject: [PATCH 0780/1142] Fixed: failing test --- .../DependencyInjection/EnqueueExtension.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 64d59db71..c5dbbbc96 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -171,14 +171,15 @@ private function registerJobQueueDoctrineEntityMapping(ContainerBuilder $contain return; } - $config = $this->processConfiguration( - new Configuration(false), - $container->getExtensionConfig('enqueue') - ); + $config = $container->getExtensionConfig('enqueue'); - foreach ($config as $name => $modules) { - if (isset($modules['job']) && false === $modules['job']['default_mapping']) { - return; + if (!empty($config)) { + $processedConfig = $this->processConfiguration(new Configuration(false), $config); + + foreach ($processedConfig as $name => $modules) { + if (isset($modules['job']) && false === $modules['job']['default_mapping']) { + return; + } } } From 73f182b53ba919c2e512cf9992aa9a06c088fcd2 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Wed, 23 Sep 2020 08:28:11 -0500 Subject: [PATCH 0781/1142] Add first pass for Apache ActiveMQ Artemis support. --- pkg/stomp/ExtensionType.php | 12 ++++++ pkg/stomp/StompConnectionFactory.php | 27 ++++++------ pkg/stomp/StompConsumer.php | 61 ++++++++++++++++++++-------- pkg/stomp/StompContext.php | 18 +++++--- pkg/stomp/StompDestination.php | 17 +++++++- 5 files changed, 99 insertions(+), 36 deletions(-) create mode 100644 pkg/stomp/ExtensionType.php diff --git a/pkg/stomp/ExtensionType.php b/pkg/stomp/ExtensionType.php new file mode 100644 index 000000000..37c248feb --- /dev/null +++ b/pkg/stomp/ExtensionType.php @@ -0,0 +1,12 @@ +config['target'] ? true : false; - if ($this->config['lazy']) { - return new StompContext(function () { - return $this->establishConnection(); - }, $useExchangePrefix); + return new StompContext( + fn () => $this->establishConnection(), + $this->config['target'] + ); } - return new StompContext($this->establishConnection(), $useExchangePrefix); + return new StompContext($this->establishConnection(), $this->config['target']); } private function establishConnection(): BufferedStompClient @@ -123,10 +125,11 @@ private function parseDsn(string $dsn): array $schemeExtension = current($dsn->getSchemeExtensions()); if (false === $schemeExtension) { - $schemeExtension = self::SCHEME_EXT_RABBITMQ; + $schemeExtension = ExtensionType::RABBITMQ; } - if (self::SCHEME_EXT_ACTIVEMQ !== $schemeExtension && self::SCHEME_EXT_RABBITMQ !== $schemeExtension) { - throw new \LogicException(sprintf('The given DSN is not supported. The scheme extension "%s" provided is invalid. It must be one of "%s" or "%s".', $schemeExtension, self::SCHEME_EXT_ACTIVEMQ, self::SCHEME_EXT_RABBITMQ)); + + if (false === in_array($schemeExtension, self::SUPPORTED_SCHEMES)) { + throw new \LogicException(sprintf('The given DSN is not supported. The scheme extension "%s" provided is not supported. It must be one of %s.', $schemeExtension, implode(', ', self::SUPPORTED_SCHEMES))); } return array_filter(array_replace($dsn->getQuery(), [ @@ -151,7 +154,7 @@ private function parseDsn(string $dsn): array private function defaultConfig(): array { return [ - 'target' => self::SCHEME_EXT_RABBITMQ, + 'target' => ExtensionType::RABBITMQ, 'host' => 'localhost', 'port' => 61613, 'login' => 'guest', diff --git a/pkg/stomp/StompConsumer.php b/pkg/stomp/StompConsumer.php index 7f792163c..726ec1066 100644 --- a/pkg/stomp/StompConsumer.php +++ b/pkg/stomp/StompConsumer.php @@ -9,6 +9,7 @@ use Interop\Queue\Message; use Interop\Queue\Queue; use Stomp\Client; +use Stomp\Exception\ErrorFrameException; use Stomp\Transport\Frame; class StompConsumer implements Consumer @@ -96,17 +97,23 @@ public function receive(int $timeout = 0): ?Message { $this->subscribe(); - if (0 === $timeout) { - while (true) { - if ($message = $this->stomp->readMessageFrame($this->subscriptionId, 100)) { - return $this->convertMessage($message); + try { + if (0 === $timeout) { + while (true) { + if ($message = $this->stomp->readMessageFrame($this->subscriptionId, 100)) { + return $this->convertMessage($message); + } } } - } else { - if ($message = $this->stomp->readMessageFrame($this->subscriptionId, $timeout)) { - return $this->convertMessage($message); + else { + if ($message = $this->stomp->readMessageFrame($this->subscriptionId, $timeout)) { + return $this->convertMessage($message); + } } } + catch (ErrorFrameException $e) { + throw new \Exception($e->getMessage() . "\n" . $e->getFrame()->getBody()); + } return null; } @@ -143,10 +150,11 @@ public function reject(Message $message, bool $requeue = false): void $nackFrame = $this->stomp->getProtocol()->getNackFrame($message->getFrame()); - // rabbitmq STOMP protocol extension - $nackFrame->addHeaders([ - 'requeue' => $requeue ? 'true' : 'false', - ]); + if ($this->queue->getExtensionType() === ExtensionType::RABBITMQ) { + $nackFrame->addHeaders([ + 'requeue' => $requeue ? 'true' : 'false', + ]); + } $this->stomp->sendFrame($nackFrame); } @@ -168,13 +176,32 @@ private function subscribe(): void $this->ackMode ); - // rabbitmq STOMP protocol extension $headers = $this->queue->getHeaders(); - $headers['prefetch-count'] = $this->prefetchCount; - $headers = StompHeadersEncoder::encode($headers); - foreach ($headers as $key => $value) { - $frame[$key] = $value; + if ($this->queue->getExtensionType() === ExtensionType::RABBITMQ) { + + $headers['prefetch-count'] = $this->prefetchCount; + $headers = StompHeadersEncoder::encode($headers); + + foreach ($headers as $key => $value) { + $frame[$key] = $value; + } + } + + if ($this->queue->getExtensionType() === ExtensionType::ARTEMIS) { + + $subscriptionName = "{$this->subscriptionId}-{$this->queue->getStompName()}"; + + $artemisHeaders = []; + + $artemisHeaders['client-id'] = true ? $this->subscriptionId : null; + $artemisHeaders['durable-subscription-name'] = true ? $subscriptionName : null; + + $artemisHeaders = StompHeadersEncoder::encode(array_filter($artemisHeaders)); + + foreach ($artemisHeaders as $key => $value) { + $frame[$key] = $value; + } } $this->stomp->sendFrame($frame); @@ -187,7 +214,7 @@ private function convertMessage(Frame $frame): StompMessage throw new \LogicException(sprintf('Frame is not MESSAGE frame but: "%s"', $frame->getCommand())); } - list($headers, $properties) = StompHeadersEncoder::decode($frame->getHeaders()); + [$headers, $properties] = StompHeadersEncoder::decode($frame->getHeaders()); $redelivered = isset($headers['redelivered']) && 'true' === $headers['redelivered']; diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index 2824e0b27..79ce33b09 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -23,6 +23,11 @@ class StompContext implements Context */ private $stomp; + /** + * @var string + */ + private $extensionType; + /** * @var bool */ @@ -35,9 +40,9 @@ class StompContext implements Context /** * @param BufferedStompClient|callable $stomp - * @param bool $useExchangePrefix + * @param string $extensionType */ - public function __construct($stomp, $useExchangePrefix = true) + public function __construct($stomp, string $extensionType) { if ($stomp instanceof BufferedStompClient) { $this->stomp = $stomp; @@ -47,7 +52,8 @@ public function __construct($stomp, $useExchangePrefix = true) throw new \InvalidArgumentException('The stomp argument must be either BufferedStompClient or callable that return BufferedStompClient.'); } - $this->useExchangePrefix = $useExchangePrefix; + $this->extensionType = $extensionType; + $this->useExchangePrefix = true; } /** @@ -64,7 +70,7 @@ public function createMessage(string $body = '', array $properties = [], array $ public function createQueue(string $name): Queue { if (0 !== strpos($name, '/')) { - $destination = new StompDestination(); + $destination = new StompDestination($this->extensionType); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName($name); @@ -91,7 +97,7 @@ public function createTemporaryQueue(): Queue public function createTopic(string $name): Topic { if (0 !== strpos($name, '/')) { - $destination = new StompDestination(); + $destination = new StompDestination($this->extensionType); $destination->setType($this->useExchangePrefix ? StompDestination::TYPE_EXCHANGE : StompDestination::TYPE_TOPIC); $destination->setStompName($name); @@ -151,7 +157,7 @@ public function createDestination(string $destination): StompDestination $routingKey = $pieces[1]; } - $destination = new StompDestination(); + $destination = new StompDestination($this->extensionType); $destination->setType($type); $destination->setStompName($name); $destination->setRoutingKey($routingKey); diff --git a/pkg/stomp/StompDestination.php b/pkg/stomp/StompDestination.php index b54dde0da..94b892848 100644 --- a/pkg/stomp/StompDestination.php +++ b/pkg/stomp/StompDestination.php @@ -39,14 +39,25 @@ class StompDestination implements Topic, Queue * @var array */ private $headers; + /** + * @var string + */ + private string $extensionType; - public function __construct() + public function __construct(string $extensionType) { $this->headers = [ self::HEADER_DURABLE => false, self::HEADER_AUTO_DELETE => true, self::HEADER_EXCLUSIVE => false, ]; + + $this->extensionType = $extensionType; + } + + public function getExtensionType(): string + { + return $this->extensionType; } public function getStompName(): string @@ -65,6 +76,10 @@ public function getQueueName(): string throw new \LogicException('Destination name is not set'); } + if ($this->extensionType === ExtensionType::ARTEMIS) { + return $this->getStompName(); + } + $name = '/'.$this->getType().'/'.$this->getStompName(); if ($this->getRoutingKey()) { From f3f9273f2cef2b10e91813afb7e256dcfcb8448c Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Wed, 23 Sep 2020 09:38:44 -0500 Subject: [PATCH 0782/1142] Code review fixes. --- pkg/stomp/StompConnectionFactory.php | 4 ++-- pkg/stomp/StompConsumer.php | 23 +++++++++-------------- pkg/stomp/StompDestination.php | 4 ++-- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index 8341fca3a..d4d9c3d3c 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -76,7 +76,7 @@ public function createContext(): Context { if ($this->config['lazy']) { return new StompContext( - fn () => $this->establishConnection(), + function () { return $this->establishConnection(); }, $this->config['target'] ); } @@ -128,7 +128,7 @@ private function parseDsn(string $dsn): array $schemeExtension = ExtensionType::RABBITMQ; } - if (false === in_array($schemeExtension, self::SUPPORTED_SCHEMES)) { + if (false === in_array($schemeExtension, self::SUPPORTED_SCHEMES, true)) { throw new \LogicException(sprintf('The given DSN is not supported. The scheme extension "%s" provided is not supported. It must be one of %s.', $schemeExtension, implode(', ', self::SUPPORTED_SCHEMES))); } diff --git a/pkg/stomp/StompConsumer.php b/pkg/stomp/StompConsumer.php index 726ec1066..681f45624 100644 --- a/pkg/stomp/StompConsumer.php +++ b/pkg/stomp/StompConsumer.php @@ -5,6 +5,7 @@ namespace Enqueue\Stomp; use Interop\Queue\Consumer; +use Interop\Queue\Exception\Exception; use Interop\Queue\Exception\InvalidMessageException; use Interop\Queue\Message; use Interop\Queue\Queue; @@ -104,15 +105,13 @@ public function receive(int $timeout = 0): ?Message return $this->convertMessage($message); } } - } - else { + } else { if ($message = $this->stomp->readMessageFrame($this->subscriptionId, $timeout)) { return $this->convertMessage($message); } } - } - catch (ErrorFrameException $e) { - throw new \Exception($e->getMessage() . "\n" . $e->getFrame()->getBody()); + } catch (ErrorFrameException $e) { + throw new Exception($e->getMessage()."\n".$e->getFrame()->getBody(), null, $e); } return null; @@ -150,7 +149,7 @@ public function reject(Message $message, bool $requeue = false): void $nackFrame = $this->stomp->getProtocol()->getNackFrame($message->getFrame()); - if ($this->queue->getExtensionType() === ExtensionType::RABBITMQ) { + if (ExtensionType::RABBITMQ === $this->queue->getExtensionType()) { $nackFrame->addHeaders([ 'requeue' => $requeue ? 'true' : 'false', ]); @@ -178,19 +177,15 @@ private function subscribe(): void $headers = $this->queue->getHeaders(); - if ($this->queue->getExtensionType() === ExtensionType::RABBITMQ) { - + if (ExtensionType::RABBITMQ === $this->queue->getExtensionType()) { $headers['prefetch-count'] = $this->prefetchCount; $headers = StompHeadersEncoder::encode($headers); foreach ($headers as $key => $value) { $frame[$key] = $value; } - } - - if ($this->queue->getExtensionType() === ExtensionType::ARTEMIS) { - - $subscriptionName = "{$this->subscriptionId}-{$this->queue->getStompName()}"; + } elseif (ExtensionType::ARTEMIS === $this->queue->getExtensionType()) { + $subscriptionName = $this->subscriptionId.'-'.$this->queue->getStompName(); $artemisHeaders = []; @@ -214,7 +209,7 @@ private function convertMessage(Frame $frame): StompMessage throw new \LogicException(sprintf('Frame is not MESSAGE frame but: "%s"', $frame->getCommand())); } - [$headers, $properties] = StompHeadersEncoder::decode($frame->getHeaders()); + list($headers, $properties) = StompHeadersEncoder::decode($frame->getHeaders()); $redelivered = isset($headers['redelivered']) && 'true' === $headers['redelivered']; diff --git a/pkg/stomp/StompDestination.php b/pkg/stomp/StompDestination.php index 94b892848..30e858e1d 100644 --- a/pkg/stomp/StompDestination.php +++ b/pkg/stomp/StompDestination.php @@ -42,7 +42,7 @@ class StompDestination implements Topic, Queue /** * @var string */ - private string $extensionType; + private $extensionType; public function __construct(string $extensionType) { @@ -76,7 +76,7 @@ public function getQueueName(): string throw new \LogicException('Destination name is not set'); } - if ($this->extensionType === ExtensionType::ARTEMIS) { + if (ExtensionType::ARTEMIS === $this->extensionType) { return $this->getStompName(); } From b5f7b5b0c2f8c2b930696e03281abb4c73e84efb Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 24 Sep 2020 09:24:16 -0500 Subject: [PATCH 0783/1142] Test fixes. --- .../Client/Driver/RabbitMqStompDriverTest.php | 17 +++---- .../Tests/Client/Driver/StompDriverTest.php | 5 ++- pkg/stomp/StompContext.php | 6 +-- pkg/stomp/Tests/StompConsumerTest.php | 3 +- pkg/stomp/Tests/StompContextTest.php | 45 ++++++++++--------- pkg/stomp/Tests/StompDestinationTest.php | 9 ++-- pkg/stomp/Tests/StompProducerTest.php | 7 +-- 7 files changed, 47 insertions(+), 45 deletions(-) diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php index a55fd91a4..4152f93cc 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php @@ -12,6 +12,7 @@ use Enqueue\Client\MessagePriority; use Enqueue\Client\Route; use Enqueue\Client\RouteCollection; +use Enqueue\Stomp\ExtensionType; use Enqueue\Stomp\StompContext; use Enqueue\Stomp\StompDestination; use Enqueue\Stomp\StompMessage; @@ -47,7 +48,7 @@ public function testShouldBeSubClassOfStompDriver() public function testShouldCreateAndReturnStompQueueInstance() { - $expectedQueue = new StompDestination(); + $expectedQueue = new StompDestination(ExtensionType::RABBITMQ); $context = $this->createContextMock(); $context @@ -185,10 +186,10 @@ public function testShouldInitDeliveryDelayIfDelayPropertyOnSendToProcessor() public function shouldSendMessageToDelayExchangeIfDelaySet() { - $queue = new StompDestination(); + $queue = new StompDestination(ExtensionType::RABBITMQ); $queue->setStompName('queueName'); - $delayTopic = new StompDestination(); + $delayTopic = new StompDestination(ExtensionType::RABBITMQ); $delayTopic->setStompName('delayTopic'); $transportMessage = new StompMessage(); @@ -339,7 +340,7 @@ public function testShouldSetupBroker() ->expects($this->any()) ->method('createQueue') ->willReturnCallback(function (string $name) { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName($name); @@ -431,7 +432,7 @@ public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() ->expects($this->any()) ->method('createQueue') ->willReturnCallback(function (string $name) { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName($name); @@ -442,7 +443,7 @@ public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() ->expects($this->any()) ->method('createTopic') ->willReturnCallback(function (string $name) { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_TOPIC); $destination->setStompName($name); @@ -503,7 +504,7 @@ protected function createProducerMock(): InteropProducer */ protected function createQueue(string $name): InteropQueue { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName($name); @@ -515,7 +516,7 @@ protected function createQueue(string $name): InteropQueue */ protected function createTopic(string $name): InteropTopic { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_TOPIC); $destination->setStompName($name); diff --git a/pkg/enqueue/Tests/Client/Driver/StompDriverTest.php b/pkg/enqueue/Tests/Client/Driver/StompDriverTest.php index 67764f3bb..8f777fdbd 100644 --- a/pkg/enqueue/Tests/Client/Driver/StompDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/StompDriverTest.php @@ -9,6 +9,7 @@ use Enqueue\Client\Message; use Enqueue\Client\MessagePriority; use Enqueue\Client\RouteCollection; +use Enqueue\Stomp\ExtensionType; use Enqueue\Stomp\StompContext; use Enqueue\Stomp\StompDestination; use Enqueue\Stomp\StompMessage; @@ -127,7 +128,7 @@ protected function createProducerMock(): InteropProducer */ protected function createQueue(string $name): InteropQueue { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName($name); @@ -139,7 +140,7 @@ protected function createQueue(string $name): InteropQueue */ protected function createTopic(string $name): InteropTopic { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_TOPIC); $destination->setStompName($name); diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index 79ce33b09..10e139aa2 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -40,7 +40,6 @@ class StompContext implements Context /** * @param BufferedStompClient|callable $stomp - * @param string $extensionType */ public function __construct($stomp, string $extensionType) { @@ -205,10 +204,7 @@ public function getStomp(): BufferedStompClient if (false == $this->stomp) { $stomp = call_user_func($this->stompFactory); if (false == $stomp instanceof BufferedStompClient) { - throw new \LogicException(sprintf( - 'The factory must return instance of BufferedStompClient. It returns %s', - is_object($stomp) ? get_class($stomp) : gettype($stomp) - )); + throw new \LogicException(sprintf('The factory must return instance of BufferedStompClient. It returns %s', is_object($stomp) ? get_class($stomp) : gettype($stomp))); } $this->stomp = $stomp; diff --git a/pkg/stomp/Tests/StompConsumerTest.php b/pkg/stomp/Tests/StompConsumerTest.php index 67423f76c..ff07ebde1 100644 --- a/pkg/stomp/Tests/StompConsumerTest.php +++ b/pkg/stomp/Tests/StompConsumerTest.php @@ -3,6 +3,7 @@ namespace Enqueue\Stomp\Tests; use Enqueue\Stomp\BufferedStompClient; +use Enqueue\Stomp\ExtensionType; use Enqueue\Stomp\StompConsumer; use Enqueue\Stomp\StompDestination; use Enqueue\Stomp\StompMessage; @@ -557,7 +558,7 @@ private function createStompClientMock() private function createDummyDestination(): StompDestination { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setStompName('aName'); $destination->setType(StompDestination::TYPE_QUEUE); diff --git a/pkg/stomp/Tests/StompContextTest.php b/pkg/stomp/Tests/StompContextTest.php index 89fc8825b..9b1739ad6 100644 --- a/pkg/stomp/Tests/StompContextTest.php +++ b/pkg/stomp/Tests/StompContextTest.php @@ -3,6 +3,7 @@ namespace Enqueue\Stomp\Tests; use Enqueue\Stomp\BufferedStompClient; +use Enqueue\Stomp\ExtensionType; use Enqueue\Stomp\StompConsumer; use Enqueue\Stomp\StompContext; use Enqueue\Stomp\StompDestination; @@ -24,14 +25,14 @@ public function testShouldImplementSessionInterface() public function testCouldBeCreatedWithRequiredArguments() { - new StompContext($this->createStompClientMock()); + new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); } public function testCouldBeConstructedWithExtChannelCallbackFactoryAsFirstArgument() { new StompContext(function () { return $this->createStompClientMock(); - }); + }, ExtensionType::RABBITMQ); } public function testThrowIfNeitherCallbackNorExtChannelAsFirstArgument() @@ -39,12 +40,12 @@ public function testThrowIfNeitherCallbackNorExtChannelAsFirstArgument() $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('The stomp argument must be either BufferedStompClient or callable that return BufferedStompClient.'); - new StompContext(new \stdClass()); + new StompContext(new \stdClass(), ExtensionType::RABBITMQ); } public function testShouldCreateMessageInstance() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $message = $context->createMessage('the body', ['key' => 'value'], ['hkey' => 'hvalue']); @@ -56,7 +57,7 @@ public function testShouldCreateMessageInstance() public function testShouldCreateQueueInstance() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $queue = $context->createQueue('the name'); @@ -68,7 +69,7 @@ public function testShouldCreateQueueInstance() public function testCreateQueueShouldCreateDestinationIfNameIsFullDestinationString() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $destination = $context->createQueue('/amq/queue/name/routing-key'); @@ -81,7 +82,7 @@ public function testCreateQueueShouldCreateDestinationIfNameIsFullDestinationStr public function testShouldCreateTopicInstanceWithExchangePrefix() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $topic = $context->createTopic('the name'); @@ -93,7 +94,7 @@ public function testShouldCreateTopicInstanceWithExchangePrefix() public function testShouldCreateTopicInstanceWithTopicPrefix() { - $context = new StompContext($this->createStompClientMock(), false); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $topic = $context->createTopic('the name'); @@ -105,7 +106,7 @@ public function testShouldCreateTopicInstanceWithTopicPrefix() public function testCreateTopicShouldCreateDestinationIfNameIsFullDestinationString() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $destination = $context->createTopic('/amq/queue/name/routing-key'); @@ -121,20 +122,20 @@ public function testThrowInvalidDestinationException() $this->expectException(InvalidDestinationException::class); $this->expectExceptionMessage('The destination must be an instance of'); - $session = new StompContext($this->createStompClientMock()); + $session = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $session->createConsumer($this->createMock(Queue::class)); } public function testShouldCreateMessageConsumerInstance() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $this->assertInstanceOf(StompConsumer::class, $context->createConsumer($this->createDummyDestination())); } public function testShouldCreateMessageProducerInstance() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $this->assertInstanceOf(StompProducer::class, $context->createProducer()); } @@ -147,7 +148,7 @@ public function testShouldCloseConnections() ->method('disconnect') ; - $context = new StompContext($client); + $context = new StompContext($client, ExtensionType::RABBITMQ); $context->createProducer(); $context->createConsumer($this->createDummyDestination()); @@ -160,7 +161,7 @@ public function testCreateDestinationShouldThrowLogicExceptionIfTypeIsInvalid() $this->expectException(\LogicException::class); $this->expectExceptionMessage('Destination name is invalid, cant find type: "/invalid-type/name"'); - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $context->createDestination('/invalid-type/name'); } @@ -169,7 +170,7 @@ public function testCreateDestinationShouldThrowLogicExceptionIfExtraSlashFound( $this->expectException(\LogicException::class); $this->expectExceptionMessage('Destination name is invalid, found extra / char: "/queue/name/routing-key/extra'); - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $context->createDestination('/queue/name/routing-key/extra'); } @@ -178,7 +179,7 @@ public function testCreateDestinationShouldThrowLogicExceptionIfNameIsEmpty() $this->expectException(\LogicException::class); $this->expectExceptionMessage('Destination name is invalid, name is empty: "/queue/"'); - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $context->createDestination('/queue/'); } @@ -187,13 +188,13 @@ public function testCreateDestinationShouldThrowLogicExceptionIfRoutingKeyIsEmpt $this->expectException(\LogicException::class); $this->expectExceptionMessage('Destination name is invalid, routing key is empty: "/queue/name/"'); - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $context->createDestination('/queue/name/'); } public function testCreateDestinationShouldParseStringAndCreateDestination() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $destination = $context->createDestination('/amq/queue/name/routing-key'); $this->assertEquals('amq/queue', $destination->getType()); @@ -204,7 +205,7 @@ public function testCreateDestinationShouldParseStringAndCreateDestination() public function testCreateTemporaryQueue() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $tempQueue = $context->createTemporaryQueue(); $this->assertEquals('temp-queue', $tempQueue->getType()); @@ -215,7 +216,7 @@ public function testCreateTemporaryQueue() public function testCreateTemporaryQueuesWithUniqueNames() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $fooTempQueue = $context->createTemporaryQueue(); $barTempQueue = $context->createTemporaryQueue(); @@ -227,7 +228,7 @@ public function testCreateTemporaryQueuesWithUniqueNames() public function testShouldGetBufferedStompClient() { - $context = new StompContext($this->createStompClientMock()); + $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); $this->assertInstanceOf(BufferedStompClient::class, $context->getStomp()); } @@ -242,7 +243,7 @@ private function createStompClientMock() private function createDummyDestination(): StompDestination { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setStompName('aName'); $destination->setType(StompDestination::TYPE_QUEUE); diff --git a/pkg/stomp/Tests/StompDestinationTest.php b/pkg/stomp/Tests/StompDestinationTest.php index 0f5261866..5061655f8 100644 --- a/pkg/stomp/Tests/StompDestinationTest.php +++ b/pkg/stomp/Tests/StompDestinationTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Stomp\Tests; +use Enqueue\Stomp\ExtensionType; use Enqueue\Stomp\StompDestination; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Queue; @@ -19,7 +20,7 @@ public function testShouldImplementsTopicAndQueueInterfaces() public function testShouldReturnDestinationStringWithRoutingKey() { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_AMQ_QUEUE); $destination->setStompName('name'); $destination->setRoutingKey('routing-key'); @@ -32,7 +33,7 @@ public function testShouldReturnDestinationStringWithRoutingKey() public function testShouldReturnDestinationStringWithoutRoutingKey() { - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_TOPIC); $destination->setStompName('name'); @@ -47,7 +48,7 @@ public function testShouldThrowLogicExceptionIfNameIsNotSet() $this->expectException(\LogicException::class); $this->expectExceptionMessage('Destination name is not set'); - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName(''); @@ -59,7 +60,7 @@ public function testSetTypeShouldThrowLogicExceptionIfTypeIsInvalid() $this->expectException(\LogicException::class); $this->expectExceptionMessage('Invalid destination type: "invalid-type"'); - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType('invalid-type'); } } diff --git a/pkg/stomp/Tests/StompProducerTest.php b/pkg/stomp/Tests/StompProducerTest.php index e1e542709..41f35256c 100644 --- a/pkg/stomp/Tests/StompProducerTest.php +++ b/pkg/stomp/Tests/StompProducerTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Stomp\Tests; +use Enqueue\Stomp\ExtensionType; use Enqueue\Stomp\StompDestination; use Enqueue\Stomp\StompMessage; use Enqueue\Stomp\StompProducer; @@ -40,7 +41,7 @@ public function testShouldThrowInvalidMessageExceptionWhenMessageIsWrongType() $producer = new StompProducer($this->createStompClientMock()); - $producer->send(new StompDestination(), $this->createMock(Message::class)); + $producer->send(new StompDestination(ExtensionType::RABBITMQ), $this->createMock(Message::class)); } public function testShouldSendMessage() @@ -54,7 +55,7 @@ public function testShouldSendMessage() $producer = new StompProducer($client); - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName('name'); @@ -77,7 +78,7 @@ public function testShouldEncodeMessageHeadersAndProperties() $message = new StompMessage('', ['key' => 'value'], ['hkey' => false]); - $destination = new StompDestination(); + $destination = new StompDestination(ExtensionType::RABBITMQ); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName('name'); From a485e7db87b758b23b54591e7a348f70b1845f22 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 24 Sep 2020 09:45:33 -0500 Subject: [PATCH 0784/1142] Restore exchange prefix logic. --- pkg/stomp/StompContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index 10e139aa2..61f269ac4 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -52,7 +52,7 @@ public function __construct($stomp, string $extensionType) } $this->extensionType = $extensionType; - $this->useExchangePrefix = true; + $this->useExchangePrefix = ExtensionType::RABBITMQ === $extensionType ? true : false; } /** From a4ef2d8ddd8e23c8f47008b669485ba85f0b5ed8 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 24 Sep 2020 12:39:30 -0500 Subject: [PATCH 0785/1142] This was testing non-rabbitmq. --- pkg/stomp/StompContext.php | 2 +- pkg/stomp/Tests/StompContextTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index 61f269ac4..24876356e 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -52,7 +52,7 @@ public function __construct($stomp, string $extensionType) } $this->extensionType = $extensionType; - $this->useExchangePrefix = ExtensionType::RABBITMQ === $extensionType ? true : false; + $this->useExchangePrefix = ExtensionType::RABBITMQ === $extensionType; } /** diff --git a/pkg/stomp/Tests/StompContextTest.php b/pkg/stomp/Tests/StompContextTest.php index 9b1739ad6..68ec2e688 100644 --- a/pkg/stomp/Tests/StompContextTest.php +++ b/pkg/stomp/Tests/StompContextTest.php @@ -94,7 +94,7 @@ public function testShouldCreateTopicInstanceWithExchangePrefix() public function testShouldCreateTopicInstanceWithTopicPrefix() { - $context = new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); + $context = new StompContext($this->createStompClientMock(), ExtensionType::ARTEMIS); $topic = $context->createTopic('the name'); From e3d07c9acfd566689a9180f434fc99cc0bea53e1 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 24 Sep 2020 13:05:13 -0500 Subject: [PATCH 0786/1142] ActiveMQ instead. --- pkg/stomp/Tests/StompContextTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/stomp/Tests/StompContextTest.php b/pkg/stomp/Tests/StompContextTest.php index 68ec2e688..84b87fc6d 100644 --- a/pkg/stomp/Tests/StompContextTest.php +++ b/pkg/stomp/Tests/StompContextTest.php @@ -94,7 +94,7 @@ public function testShouldCreateTopicInstanceWithExchangePrefix() public function testShouldCreateTopicInstanceWithTopicPrefix() { - $context = new StompContext($this->createStompClientMock(), ExtensionType::ARTEMIS); + $context = new StompContext($this->createStompClientMock(), ExtensionType::ACTIVEMQ); $topic = $context->createTopic('the name'); From 266faf9218ceede9cc8b6869f40e4fd4f879b436 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 24 Sep 2020 22:04:08 +0300 Subject: [PATCH 0787/1142] upd changelog --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 917dffa65..19683ca8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Change Log +## [0.10.4](https://github.com/php-enqueue/enqueue-dev/tree/0.10.4) (2020-09-24) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.3...0.10.4) + +**Merged pull requests:** + +- \[stomp\] Add first pass for Apache ActiveMQ Artemis support [\#1091](https://github.com/php-enqueue/enqueue-dev/pull/1091) ([atrauzzi](https://github.com/atrauzzi)) +- \[amqp\]Solves binding Headers Exchange with Queue using custom arguments [\#1087](https://github.com/php-enqueue/enqueue-dev/pull/1087) ([dgafka](https://github.com/dgafka)) +- \[async-command\] Fix service definition to apply the timeout [\#1084](https://github.com/php-enqueue/enqueue-dev/pull/1084) ([jcrombez](https://github.com/jcrombez)) +- \[mongodb\] fix\(MongoDB\) Redelivery not working \(fixes \#1077\) [\#1078](https://github.com/php-enqueue/enqueue-dev/pull/1078) ([josefsabl](https://github.com/josefsabl)) +- Add php 7.3 and 7.4 travis env to every package [\#1076](https://github.com/php-enqueue/enqueue-dev/pull/1076) ([snapshotpl](https://github.com/snapshotpl)) +- Docs: update Supported Brokers [\#1074](https://github.com/php-enqueue/enqueue-dev/pull/1074) ([Nebual](https://github.com/Nebual)) +- \[rdkafka\] Compatibility with Phprdkafka 4.0 [\#959](https://github.com/php-enqueue/enqueue-dev/pull/959) ([Steveb-p](https://github.com/Steveb-p)) + +## [0.10.3](https://github.com/php-enqueue/enqueue-dev/tree/0.10.3) (2020-07-31) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.2...0.10.3) + +**Merged pull requests:** + +- Allow to install ramsey/uuid:^4 [\#1075](https://github.com/php-enqueue/enqueue-dev/pull/1075) ([snapshotpl](https://github.com/snapshotpl)) +- chore: add typehint to RdKafkaConsumer\#getQueue [\#1071](https://github.com/php-enqueue/enqueue-dev/pull/1071) ([qkdreyer](https://github.com/qkdreyer)) +- Fixes typo on client messages exemples doc [\#1065](https://github.com/php-enqueue/enqueue-dev/pull/1065) ([brunousml](https://github.com/brunousml)) +- Fix contact us link [\#1058](https://github.com/php-enqueue/enqueue-dev/pull/1058) ([andrew-demb](https://github.com/andrew-demb)) +- Fix typos [\#1049](https://github.com/php-enqueue/enqueue-dev/pull/1049) ([pgrimaud](https://github.com/pgrimaud)) +- Added support for ramsey/uuid 4.0 [\#1043](https://github.com/php-enqueue/enqueue-dev/pull/1043) ([a-menshchikov](https://github.com/a-menshchikov)) +- Changed: cast redelivery\_delay to int [\#1034](https://github.com/php-enqueue/enqueue-dev/pull/1034) ([balabis](https://github.com/balabis)) +- Add php 7.4 to test matrix [\#991](https://github.com/php-enqueue/enqueue-dev/pull/991) ([snapshotpl](https://github.com/snapshotpl)) + ## [0.10.2](https://github.com/php-enqueue/enqueue-dev/tree/0.10.2) (2020-03-20) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.1...0.10.2) From e328664b00a7d8630a894e1d29b5a6d70ae2c547 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sun, 27 Sep 2020 11:55:40 +0300 Subject: [PATCH 0788/1142] Lock doctrine perisistence version. Fix tests. --- composer.json | 3 +++ pkg/dbal/composer.json | 3 +++ 2 files changed, 6 insertions(+) diff --git a/composer.json b/composer.json index 5e79826ce..002ae9946 100644 --- a/composer.json +++ b/composer.json @@ -62,6 +62,9 @@ "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", "friendsofphp/php-cs-fixer": "^2" }, + "conflict": { + "doctrine/persistence": ">=1.3.0" + }, "autoload": { "psr-4": { "Enqueue\\AmqpBunny\\": "pkg/amqp-bunny/", diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index afd98c18a..868cc7266 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -17,6 +17,9 @@ "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, + "conflict": { + "doctrine/persistence": ">=1.3.0" + }, "support": { "email": "opensource@forma-pro.com", "issues": "https://github.com/php-enqueue/enqueue-dev/issues", From 65f06d258c01eb70135d4a64a46bbfe0425a44c9 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Mon, 28 Sep 2020 15:32:49 -0500 Subject: [PATCH 0789/1142] Allow fals-y values for unsupported options This is to acomodate any situations where `0` is passed via configuration or even defaults from other layers (in my case, laravel). --- pkg/stomp/StompProducer.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index c275bd6a3..4ada1f8fe 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -47,7 +47,7 @@ public function send(Destination $destination, Message $message): void public function setDeliveryDelay(int $deliveryDelay = null): Producer { - if (null === $deliveryDelay) { + if (empty($deliveryDelay)) { return $this; } @@ -61,7 +61,7 @@ public function getDeliveryDelay(): ?int public function setPriority(int $priority = null): Producer { - if (null === $priority) { + if (empty($priority)) { return $this; } @@ -75,7 +75,7 @@ public function getPriority(): ?int public function setTimeToLive(int $timeToLive = null): Producer { - if (null === $timeToLive) { + if (empty($timeToLive)) { return $this; } From 36c36503fcd875a263b867b1862a0e34a24f62a1 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 29 Sep 2020 09:18:53 +0300 Subject: [PATCH 0790/1142] fix localstack version (one that worked) --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index fb5838c06..f782de48e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -122,7 +122,7 @@ services: - '9090:9090' localstack: - image: 'localstack/localstack:latest' + image: 'localstack/localstack:0.8.10' ports: - '4576:4576' - '4575:4575' From 1ebd1fa0c3115fbd01da0fe4033199a81d6ce78b Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 29 Sep 2020 10:09:20 +0300 Subject: [PATCH 0791/1142] fix doctrine orm version --- composer.json | 2 +- pkg/job-queue/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 002ae9946..fa4d4824f 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "psr/container": "^1", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^0.6.1|^1.0", - "doctrine/orm": "~2.4", + "doctrine/orm": "2.4.*|2.5.*", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3", "aws/aws-sdk-php": "^3.26", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index dd31c62c4..dcf4ca25d 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", - "doctrine/orm": "~2.4" + "doctrine/orm": "2.4.*|2.5.*" }, "require-dev": { "phpunit/phpunit": "~7.5", From 40d3607602e4ca6d40232687c0d95d6c26dd30cd Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 29 Sep 2020 10:21:25 +0300 Subject: [PATCH 0792/1142] fix doctrine version --- composer.json | 2 +- pkg/job-queue/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index fa4d4824f..2672c6bc7 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "psr/container": "^1", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^0.6.1|^1.0", - "doctrine/orm": "2.4.*|2.5.*", + "doctrine/orm": ">2.4,<2.7.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3", "aws/aws-sdk-php": "^3.26", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index dcf4ca25d..88141bd09 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", - "doctrine/orm": "2.4.*|2.5.*" + "doctrine/orm": ">2.4,<2.7.0" }, "require-dev": { "phpunit/phpunit": "~7.5", From fc50ed8cbd2fcfd10d9e187aff60a37eb72c0ccb Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 29 Sep 2020 10:34:14 +0300 Subject: [PATCH 0793/1142] fix doctrine version --- composer.json | 2 +- pkg/job-queue/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 2672c6bc7..c9ee5e88c 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "psr/container": "^1", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^0.6.1|^1.0", - "doctrine/orm": ">2.4,<2.7.0", + "doctrine/orm": "2.7.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3", "aws/aws-sdk-php": "^3.26", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 88141bd09..f4b82d17e 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", - "doctrine/orm": ">2.4,<2.7.0" + "doctrine/orm": "2.7.0" }, "require-dev": { "phpunit/phpunit": "~7.5", From 635d0ea2b10305c53e3cf44ebecc7aae4027288a Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 29 Sep 2020 10:56:31 +0300 Subject: [PATCH 0794/1142] fix doctrine version --- composer.json | 4 ++-- pkg/job-queue/composer.json | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index c9ee5e88c..3799f63b4 100644 --- a/composer.json +++ b/composer.json @@ -20,13 +20,13 @@ "queue-interop/queue-interop": "^0.7|^0.8", "bunny/bunny": "^0.2.4|^0.3|^0.4", "php-amqplib/php-amqplib": "^2.7", - "doctrine/dbal": "^2.6", + "doctrine/dbal": "^2.6,<2.10", "ramsey/uuid": "^2|^3.5|^4.0", "psr/log": "^1", "psr/container": "^1", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^0.6.1|^1.0", - "doctrine/orm": "2.7.0", + "doctrine/orm": "~2.4", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3", "aws/aws-sdk-php": "^3.26", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index f4b82d17e..08b9889c2 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -10,7 +10,8 @@ "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", - "doctrine/orm": "2.7.0" + "doctrine/orm": "~2.4", + "doctrine/dbal": "<2.10" }, "require-dev": { "phpunit/phpunit": "~7.5", From b6514d003dfd08f64a09b9b049fee626d5393759 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Tue, 29 Sep 2020 08:34:08 -0500 Subject: [PATCH 0795/1142] Resolve code style issues. --- pkg/stomp/StompProducer.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index 4ada1f8fe..8c1933ee4 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -20,9 +20,6 @@ class StompProducer implements Producer */ private $stomp; - /** - * @param Client $stomp - */ public function __construct(Client $stomp) { $this->stomp = $stomp; @@ -45,6 +42,9 @@ public function send(Destination $destination, Message $message): void $this->stomp->send($destination->getQueueName(), $stompMessage); } + /** + * @return $this|Producer + */ public function setDeliveryDelay(int $deliveryDelay = null): Producer { if (empty($deliveryDelay)) { @@ -59,6 +59,11 @@ public function getDeliveryDelay(): ?int return null; } + /** + * @throws PriorityNotSupportedException + * + * @return $this|Producer + */ public function setPriority(int $priority = null): Producer { if (empty($priority)) { @@ -73,6 +78,9 @@ public function getPriority(): ?int return null; } + /** + * @return $this|Producer + */ public function setTimeToLive(int $timeToLive = null): Producer { if (empty($timeToLive)) { From b09cecb499136a3b52f657ebe81604350260f16b Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Tue, 29 Sep 2020 16:47:06 -0500 Subject: [PATCH 0796/1142] Add automatic reconnect support for STOMP producers. --- .gitignore | 5 ++++- pkg/stomp/StompProducer.php | 14 +++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a46930d73..2bd575f69 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,11 @@ bin/jp.php bin/php-parse bin/google-cloud-batch bin/thruway +bin/phpstan.phar +bin/var-dump-server +bin/yaml-lint vendor var .php_cs .php_cs.cache -composer.lock \ No newline at end of file +composer.lock diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index 8c1933ee4..2f819d1b5 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -11,6 +11,7 @@ use Interop\Queue\Message; use Interop\Queue\Producer; use Stomp\Client; +use Stomp\Exception\ConnectionException; use Stomp\Transport\Message as StompLibMessage; class StompProducer implements Producer @@ -39,7 +40,18 @@ public function send(Destination $destination, Message $message): void $stompMessage = new StompLibMessage($message->getBody(), $headers); - $this->stomp->send($destination->getQueueName(), $stompMessage); + try { + $this->stomp->send($destination->getQueueName(), $stompMessage); + } catch (ConnectionException $ex) { + if (!$this->stomp->isConnected()) { + throw $ex; + } + + $this->stomp->disconnect(true); + $this->stomp->connect(); + + $this->stomp->send($destination->getQueueName(), $stompMessage); + } } /** From bfd08b1a4644542b511d101363e91f877a69c515 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Tue, 29 Sep 2020 18:34:22 -0500 Subject: [PATCH 0797/1142] Not sure why lock got ignored... --- .gitignore | 1 - composer.lock | 9780 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 9780 insertions(+), 1 deletion(-) create mode 100644 composer.lock diff --git a/.gitignore b/.gitignore index 2bd575f69..c41f9c215 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,3 @@ vendor var .php_cs .php_cs.cache -composer.lock diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..ee1e3f2cc --- /dev/null +++ b/composer.lock @@ -0,0 +1,9780 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "e80471129f8fe6e399961bf99c1a7674", + "packages": [ + { + "name": "aws/aws-sdk-php", + "version": "3.156.0", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "994831c4560d8c309882f5d5b9adafb85748f0e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/994831c4560d8c309882f5d5b9adafb85748f0e8", + "reference": "994831c4560d8c309882f5d5b9adafb85748f0e8", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4.1", + "mtdowling/jmespath.php": "^2.5", + "php": ">=5.5" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^4.8.35|^5.4.3", + "psr/cache": "^1.0", + "psr/simple-cache": "^1.0", + "sebastian/comparator": "^1.2.3" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Aws\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com/" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "time": "2020-09-29T18:17:44+00:00" + }, + { + "name": "brick/math", + "version": "0.9.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "283a40c901101e66de7061bd359252c013dcc43c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/283a40c901101e66de7061bd359252c013dcc43c", + "reference": "283a40c901101e66de7061bd359252c013dcc43c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1|^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15|^8.5", + "vimeo/psalm": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], + "time": "2020-08-18T23:57:15+00:00" + }, + { + "name": "bunny/bunny", + "version": "v0.4.3", + "source": { + "type": "git", + "url": "https://github.com/jakubkulhan/bunny.git", + "reference": "5c1a0f7ed81c20559ada8eeb9c6cd5037030b8b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jakubkulhan/bunny/zipball/5c1a0f7ed81c20559ada8eeb9c6cd5037030b8b5", + "reference": "5c1a0f7ed81c20559ada8eeb9c6cd5037030b8b5", + "shasum": "" + }, + "require": { + "php": "~7.0", + "psr/log": "~1.0", + "react/event-loop": "^1.0 || ^0.5 || ^0.4", + "react/promise": "~2.2" + }, + "require-dev": { + "phpunit/phpunit": "~6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Bunny\\": "src/Bunny/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Kulhan", + "email": "jakub.kulhan@gmail.com" + } + ], + "description": "Performant pure-PHP AMQP (RabbitMQ) sync/async (ReactPHP) library", + "keywords": [ + "AMQP", + "bunny", + "exchange", + "message", + "messaging", + "queue", + "queueing", + "rabbit", + "rabbitmq", + "react", + "react-php", + "reactphp" + ], + "time": "2020-09-27T14:39:46+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/clue/php-stream-filter.git", + "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-stream-filter/zipball/5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71", + "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^5.0 || ^4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "time": "2019-04-09T12:31:48+00:00" + }, + { + "name": "datadog/php-datadogstatsd", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/DataDog/php-datadogstatsd.git", + "reference": "5c2050adcfb6e91ae05f8fd9295d0564d635c9df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DataDog/php-datadogstatsd/zipball/5c2050adcfb6e91ae05f8fd9295d0564d635c9df", + "reference": "5c2050adcfb6e91ae05f8fd9295d0564d635c9df", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-sockets": "*", + "lib-curl": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "DataDog\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Corley", + "email": "anthroprose@gmail.com", + "role": "Developer" + }, + { + "name": "Datadog", + "email": "dev@datadoghq.com", + "role": "Developer" + } + ], + "description": "An extremely simple PHP datadogstatsd client", + "homepage": "https://www.datadoghq.com/", + "keywords": [ + "DataDog", + "check", + "error-reporting", + "health", + "logging", + "monitoring", + "statsd" + ], + "time": "2020-09-02T16:47:54+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.10.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "bfe91e31984e2ba76df1c1339681770401ec262f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/bfe91e31984e2ba76df1c1339681770401ec262f", + "reference": "bfe91e31984e2ba76df1c1339681770401ec262f", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^9.1.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org/", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2020-08-10T19:35:50+00:00" + }, + { + "name": "doctrine/cache", + "version": "1.10.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "13e3381b25847283a91948d04640543941309727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", + "reference": "13e3381b25847283a91948d04640543941309727", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2020-07-07T18:54:01+00:00" + }, + { + "name": "doctrine/collections", + "version": "1.6.7", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "shasum": "" + }, + "require": { + "php": "^7.1.3 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan-shim": "^0.9.2", + "phpunit/phpunit": "^7.0", + "vimeo/psalm": "^3.8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "time": "2020-07-27T17:53:49+00:00" + }, + { + "name": "doctrine/common", + "version": "2.12.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", + "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/inflector": "^1.0", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.1", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "time": "2020-01-10T15:49:25+00:00" + }, + { + "name": "doctrine/dbal", + "version": "v2.9.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "7345cd59edfa2036eb0fa4264b77ae2576842035" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/7345cd59edfa2036eb0fa4264b77ae2576842035", + "reference": "7345cd59edfa2036eb0fa4264b77ae2576842035", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "jetbrains/phpstorm-stubs": "^2018.1.2", + "phpstan/phpstan": "^0.10.1", + "phpunit/phpunit": "^7.4", + "symfony/console": "^2.0.5|^3.0|^4.0", + "symfony/phpunit-bridge": "^3.4.5|^4.0.5" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9.x-dev", + "dev-develop": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "dbal", + "mysql", + "persistence", + "pgsql", + "php", + "queryobject" + ], + "time": "2019-11-02T22:19:34+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2020-05-29T18:28:51+00:00" + }, + { + "name": "doctrine/inflector", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", + "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2020-05-29T07:19:59+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-05-29T17:27:14+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "doctrine/orm", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "dafe298ce5d0b995ebe1746670704c0a35868a6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/dafe298ce5d0b995ebe1746670704c0a35868a6a", + "reference": "dafe298ce5d0b995ebe1746670704c0a35868a6a", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.8", + "doctrine/cache": "^1.9.1", + "doctrine/collections": "^1.5", + "doctrine/common": "^2.11", + "doctrine/dbal": "^2.9.3", + "doctrine/event-manager": "^1.1", + "doctrine/instantiator": "^1.3", + "doctrine/persistence": "^1.2", + "ext-pdo": "*", + "ocramius/package-versions": "^1.2", + "php": "^7.1", + "symfony/console": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "phpunit/phpunit": "^7.5", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine/orm", + "type": "tidelift" + } + ], + "time": "2020-03-19T06:41:02+00:00" + }, + { + "name": "doctrine/persistence", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "43526ae63312942e5316100bb3ed589ba1aba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/43526ae63312942e5316100bb3ed589ba1aba491", + "reference": "43526ae63312942e5316100bb3ed589ba1aba491", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.10@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "phpstan/phpstan": "^0.8", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "time": "2019-04-23T12:39:21+00:00" + }, + { + "name": "doctrine/reflection", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/reflection.git", + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "ext-tokenizer": "*", + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "doctrine/common": "^2.10", + "phpstan/phpstan": "^0.11.0", + "phpstan/phpstan-phpunit": "^0.11.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", + "homepage": "https://www.doctrine-project.org/projects/reflection.html", + "keywords": [ + "reflection", + "static" + ], + "time": "2020-03-27T11:06:43+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Evenement": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "time": "2017-07-23T21:35:13+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v5.2.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8 <=9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "time": "2020-03-25T18:49:23+00:00" + }, + { + "name": "google/auth", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-auth-library-php.git", + "reference": "173191f5defd1d9ae8bdfc28da31b63eb73dd34e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/173191f5defd1d9ae8bdfc28da31b63eb73dd34e", + "reference": "173191f5defd1d9ae8bdfc28da31b63eb73dd34e", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", + "guzzlehttp/guzzle": "^5.3.1|^6.2.1|^7.0", + "guzzlehttp/psr7": "^1.2", + "php": ">=5.4", + "psr/cache": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "guzzlehttp/promises": "0.1.1|^1.3", + "kelvinmo/simplejwt": "^0.2.5", + "phpseclib/phpseclib": "^2", + "phpunit/phpunit": "^4.8.36|^5.7", + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Auth Library for PHP", + "homepage": "http://github.com/google/google-auth-library-php", + "keywords": [ + "Authentication", + "google", + "oauth2" + ], + "time": "2020-09-18T20:03:05+00:00" + }, + { + "name": "google/cloud-core", + "version": "v1.39.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-cloud-php-core.git", + "reference": "f9e7421beac89fd7d9006a13a6b39b89dd86c92e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/f9e7421beac89fd7d9006a13a6b39b89dd86c92e", + "reference": "f9e7421beac89fd7d9006a13a6b39b89dd86c92e", + "shasum": "" + }, + "require": { + "google/auth": "^1.6", + "guzzlehttp/guzzle": "^5.3|^6.0|^7.0", + "guzzlehttp/promises": "^1.3", + "guzzlehttp/psr7": "^1.2", + "monolog/monolog": "^1.1|^2.0", + "php": ">=5.5", + "psr/http-message": "1.0.*", + "rize/uri-template": "~0.3" + }, + "require-dev": { + "erusev/parsedown": "^1.6", + "google/common-protos": "^1.0", + "google/gax": "^1.1", + "opis/closure": "^3", + "phpdocumentor/reflection": "^3.0", + "phpunit/phpunit": "^4.8|^5.0", + "squizlabs/php_codesniffer": "2.*" + }, + "suggest": { + "opis/closure": "May be used to serialize closures to process jobs in the batch daemon. Please require version ^3.", + "symfony/lock": "Required for the Spanner cached based session pool. Please require the following commit: 3.3.x-dev#1ba6ac9" + }, + "bin": [ + "bin/google-cloud-batch" + ], + "type": "library", + "extra": { + "component": { + "id": "cloud-core", + "target": "googleapis/google-cloud-php-core.git", + "path": "Core", + "entry": "src/ServiceBuilder.php" + } + }, + "autoload": { + "psr-4": { + "Google\\Cloud\\Core\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", + "time": "2020-09-08T20:52:20+00:00" + }, + { + "name": "google/cloud-pubsub", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-cloud-php-pubsub.git", + "reference": "4e11e9ecbaeb5a3a546f36e7b0e3c171c71cb987" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-pubsub/zipball/4e11e9ecbaeb5a3a546f36e7b0e3c171c71cb987", + "reference": "4e11e9ecbaeb5a3a546f36e7b0e3c171c71cb987", + "shasum": "" + }, + "require": { + "google/cloud-core": "^1.39", + "google/gax": "^1.1" + }, + "require-dev": { + "erusev/parsedown": "^1.6", + "phpdocumentor/reflection": "^3.0", + "phpunit/phpunit": "^4.8|^5.0", + "squizlabs/php_codesniffer": "2.*" + }, + "suggest": { + "ext-grpc": "The gRPC extension enables use of the performant gRPC transport", + "ext-protobuf": "Provides a significant increase in throughput over the pure PHP protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions." + }, + "type": "library", + "extra": { + "component": { + "id": "cloud-pubsub", + "target": "googleapis/google-cloud-php-pubsub.git", + "path": "PubSub", + "entry": "src/PubSubClient.php" + } + }, + "autoload": { + "psr-4": { + "Google\\Cloud\\PubSub\\": "src", + "GPBMetadata\\Google\\Pubsub\\": "metadata" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Cloud PubSub Client for PHP", + "time": "2020-09-22T23:22:32+00:00" + }, + { + "name": "google/common-protos", + "version": "1.3", + "source": { + "type": "git", + "url": "https://github.com/googleapis/common-protos-php.git", + "reference": "535f489ff1c3433c0ea64cd5aa0560f926949ac5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/535f489ff1c3433c0ea64cd5aa0560f926949ac5", + "reference": "535f489ff1c3433c0ea64cd5aa0560f926949ac5", + "shasum": "" + }, + "require": { + "google/protobuf": "^3.6.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36", + "sami/sami": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\": "src", + "GPBMetadata\\Google\\": "metadata" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google API Common Protos for PHP", + "homepage": "https://github.com/googleapis/common-protos-php", + "keywords": [ + "google" + ], + "time": "2020-08-26T16:05:09+00:00" + }, + { + "name": "google/gax", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/gax-php.git", + "reference": "63ea951e70557bb851bf6b487d65698410a6aa96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/gax-php/zipball/63ea951e70557bb851bf6b487d65698410a6aa96", + "reference": "63ea951e70557bb851bf6b487d65698410a6aa96", + "shasum": "" + }, + "require": { + "google/auth": "^1.2.0", + "google/common-protos": "^1.0", + "google/grpc-gcp": "^0.1.0", + "google/protobuf": "^3.12.2", + "grpc/grpc": "^1.13", + "guzzlehttp/promises": "^1.3", + "guzzlehttp/psr7": "^1.2", + "php": ">=5.5" + }, + "conflict": { + "ext-protobuf": "<3.7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36", + "sami/sami": "*", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\ApiCore\\": "src", + "GPBMetadata\\Google\\": "metadata" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Google API Core for PHP", + "homepage": "https://github.com/googleapis/gax-php", + "keywords": [ + "google" + ], + "time": "2020-09-16T17:29:29+00:00" + }, + { + "name": "google/grpc-gcp", + "version": "0.1.5", + "source": { + "type": "git", + "url": "https://github.com/GoogleCloudPlatform/grpc-gcp-php.git", + "reference": "bb9bdbf62f6ae4e73d5209d85b1d0a0b9855ff36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/bb9bdbf62f6ae4e73d5209d85b1d0a0b9855ff36", + "reference": "bb9bdbf62f6ae4e73d5209d85b1d0a0b9855ff36", + "shasum": "" + }, + "require": { + "google/auth": "^1.3", + "google/protobuf": "^v3.3.0", + "grpc/grpc": "^v1.13.0", + "php": ">=5.5.0", + "psr/cache": "^1.0.1" + }, + "require-dev": { + "google/cloud-spanner": "^1.7", + "phpunit/phpunit": "4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\Gcp\\": "src/" + }, + "classmap": [ + "src/generated/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC GCP library for channel management", + "time": "2020-05-26T17:21:09+00:00" + }, + { + "name": "google/protobuf", + "version": "v3.13.0", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "fddc6c2439b190284f207143f6d37bf5b651cea6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/fddc6c2439b190284f207143f6d37bf5b651cea6", + "reference": "fddc6c2439b190284f207143f6d37bf5b651cea6", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "time": "2020-08-15T00:44:58+00:00" + }, + { + "name": "grpc/grpc", + "version": "1.30.0", + "source": { + "type": "git", + "url": "https://github.com/grpc/grpc-php.git", + "reference": "31952d18884d91c674b73f8b4da831f708706f20" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/31952d18884d91c674b73f8b4da831f708706f20", + "reference": "31952d18884d91c674b73f8b4da831f708706f20", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC library for PHP", + "homepage": "https://grpc.io/", + "keywords": [ + "rpc" + ], + "time": "2020-06-23T01:49:02+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2020-06-16T21:01:06+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "influxdb/influxdb-php", + "version": "1.15.1", + "source": { + "type": "git", + "url": "https://github.com/influxdata/influxdb-php.git", + "reference": "447acb600969f9510c9f1900a76d442fc3537b0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/influxdata/influxdb-php/zipball/447acb600969f9510c9f1900a76d442fc3537b0e", + "reference": "447acb600969f9510c9f1900a76d442fc3537b0e", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0|^7.0", + "php": "^5.5 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7" + }, + "suggest": { + "ext-curl": "Curl extension, needed for Curl driver", + "stefanotorresi/influxdb-php-async": "An asyncronous client for InfluxDB, implemented via ReactPHP." + }, + "type": "library", + "autoload": { + "psr-4": { + "InfluxDB\\": "src/InfluxDB" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stephen Hoogendijk", + "email": "stephen@tca0.nl" + }, + { + "name": "Daniel Martinez", + "email": "danimartcas@hotmail.com" + }, + { + "name": "Gianluca Arbezzano", + "email": "gianarb92@gmail.com" + } + ], + "description": "InfluxDB client library for PHP", + "keywords": [ + "client", + "influxdata", + "influxdb", + "influxdb class", + "influxdb client", + "influxdb library", + "time series" + ], + "time": "2020-09-18T13:24:03+00:00" + }, + { + "name": "makasim/temp-file", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/makasim/TempFile.git", + "reference": "e9cfbfc61a23044aeb2fe0a3db49aeec2f84ca27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/makasim/TempFile/zipball/e9cfbfc61a23044aeb2fe0a3db49aeec2f84ca27", + "reference": "e9cfbfc61a23044aeb2fe0a3db49aeec2f84ca27", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "Makasim": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maksim Kotlyar", + "email": "kotlyar.maksim@gmail.com" + } + ], + "description": "Temp file object", + "homepage": "https://github.com/makasim/TempFile", + "keywords": [ + "file", + "temp", + "temp file" + ], + "time": "2013-07-12T06:09:04+00:00" + }, + { + "name": "mongodb/mongodb", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/mongodb/mongo-php-library.git", + "reference": "18fca8cc8d0c2cc07f76605760d20632bb3dab96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/18fca8cc8d0c2cc07f76605760d20632bb3dab96", + "reference": "18fca8cc8d0c2cc07f76605760d20632bb3dab96", + "shasum": "" + }, + "require": { + "ext-hash": "*", + "ext-json": "*", + "ext-mongodb": "^1.5.0", + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "MongoDB\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Jeremy Mikola", + "email": "jmikola@gmail.com" + }, + { + "name": "Derick Rethans", + "email": "github@derickrethans.nl" + }, + { + "name": "Katherine Walker", + "email": "katherine.walker@mongodb.com" + } + ], + "description": "MongoDB driver library", + "homepage": "https://jira.mongodb.org/browse/PHPLIB", + "keywords": [ + "database", + "driver", + "mongodb", + "persistence" + ], + "time": "2019-07-02T18:04:14+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f9eee5cec93dfb313a38b6b288741e84e53f02d5", + "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^6.0", + "graylog2/gelf-php": "^1.4.2", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", + "phpspec/prophecy": "^1.6.1", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90 <3.0", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be/" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:41:23+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb", + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^1.4", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "JmesPath\\": "src/" + }, + "files": [ + "src/JmesPath.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "time": "2020-07-31T21:01:56+00:00" + }, + { + "name": "ocramius/package-versions", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/PackageVersions.git", + "reference": "94c9d42a466c57f91390cdd49c81313264f49d85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/94c9d42a466c57f91390cdd49c81313264f49d85", + "reference": "94c9d42a466c57f91390cdd49c81313264f49d85", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7.4.0" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "doctrine/coding-standard": "^7.0.2", + "ext-zip": "^1.15.0", + "infection/infection": "^0.15.3", + "phpunit/phpunit": "^9.1.1", + "vimeo/psalm": "^3.9.3" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.99.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/package-versions", + "type": "tidelift" + } + ], + "time": "2020-06-22T14:15:44+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com/" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "time": "2018-07-02T15:55:56+00:00" + }, + { + "name": "pda/pheanstalk", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/pda/pheanstalk.git", + "reference": "57b6e76f1b06ca798e739a8dee92c2dac04fd170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pda/pheanstalk/zipball/57b6e76f1b06ca798e739a8dee92c2dac04fd170", + "reference": "57b6e76f1b06ca798e739a8dee92c2dac04fd170", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Pheanstalk\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Annesley", + "email": "paul@annesley.cc", + "homepage": "http://paul.annesley.cc/", + "role": "Developer" + } + ], + "description": "PHP client for beanstalkd queue", + "homepage": "https://github.com/pda/pheanstalk", + "keywords": [ + "beanstalkd" + ], + "time": "2018-09-19T12:16:28+00:00" + }, + { + "name": "php-amqplib/php-amqplib", + "version": "v2.12.1", + "source": { + "type": "git", + "url": "https://github.com/php-amqplib/php-amqplib.git", + "reference": "0eaaa9d5d45335f4342f69603288883388c2fe21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/0eaaa9d5d45335f4342f69603288883388c2fe21", + "reference": "0eaaa9d5d45335f4342f69603288883388c2fe21", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-sockets": "*", + "php": ">=5.6.3", + "phpseclib/phpseclib": "^2.0.0" + }, + "conflict": { + "php": "7.4.0 - 7.4.1" + }, + "replace": { + "videlalvaro/php-amqplib": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "nategood/httpful": "^0.2.20", + "phpunit/phpunit": "^5.7|^6.5|^7.0", + "squizlabs/php_codesniffer": "^2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.12-dev" + } + }, + "autoload": { + "psr-4": { + "PhpAmqpLib\\": "PhpAmqpLib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Alvaro Videla", + "role": "Original Maintainer" + }, + { + "name": "Raúl Araya", + "email": "nubeiro@gmail.com", + "role": "Maintainer" + }, + { + "name": "Luke Bakken", + "email": "luke@bakken.io", + "role": "Maintainer" + }, + { + "name": "Ramūnas Dronga", + "email": "github@ramuno.lt", + "role": "Maintainer" + } + ], + "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", + "homepage": "https://github.com/php-amqplib/php-amqplib/", + "keywords": [ + "message", + "queue", + "rabbitmq" + ], + "time": "2020-09-25T18:34:58+00:00" + }, + { + "name": "php-http/client-common", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "c0390ae3c8f2ae9d50901feef0127fb9e396f6b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/c0390ae3c8f2ae9d50901feef0127fb9e396f6b4", + "reference": "c0390ae3c8f2ae9d50901feef0127fb9e396f6b4", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0", + "php-http/httplug": "^1.1", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "guzzlehttp/psr7": "^1.4", + "phpspec/phpspec": "^2.5 || ^3.4 || ^4.2" + }, + "suggest": { + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io/", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "time": "2019-11-18T08:54:36+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "4366bf1bc39b663aa87459bd725501d2f1988b6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/4366bf1bc39b663aa87459bd725501d2f1988b6c", + "reference": "4366bf1bc39b663aa87459bd725501d2f1988b6c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1", + "puli/composer-plugin": "1.0.0-beta10" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", + "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org/", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" + ], + "time": "2020-09-22T13:31:04+00:00" + }, + { + "name": "php-http/guzzle6-adapter", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/a56941f9dc6110409cfcddc91546ee97039277ab", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": ">=5.5.0", + "php-http/httplug": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/adapter-integration-tests": "^0.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io/", + "keywords": [ + "Guzzle", + "http" + ], + "time": "2016-05-10T06:13:32+00:00" + }, + { + "name": "php-http/httplug", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "php-http/promise": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io/", + "keywords": [ + "client", + "http" + ], + "time": "2016-08-31T08:30:17+00:00" + }, + { + "name": "php-http/message", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "2c7256e3c1aba0bfca70f099810f1c7712e00945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/2c7256e3c1aba0bfca70f099810f1c7712e00945", + "reference": "2c7256e3c1aba0bfca70f099810f1c7712e00945", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.4.1", + "php": "^7.1", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "akeneo/phpspec-skip-example-extension": "^1.0", + "coduo/phpspec-data-provider-extension": "^1.0", + "ergebnis/composer-normalize": "^2.1", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4", + "slim/slim": "^3.0", + "zendframework/zend-diactoros": "^1.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation", + "zendframework/zend-diactoros": "Used with Diactoros Factories" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + }, + "files": [ + "src/filters.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org/", + "keywords": [ + "http", + "message", + "psr-7" + ], + "time": "2020-08-17T06:33:14+00:00" + }, + { + "name": "php-http/message-factory", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org/", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "time": "2015-12-19T14:08:53+00:00" + }, + { + "name": "php-http/promise", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io/", + "keywords": [ + "promise" + ], + "time": "2020-07-07T09:29:14+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "2.0.29", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "497856a8d997f640b4a516062f84228a772a48a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/497856a8d997f640b4a516062f84228a772a48a8", + "reference": "497856a8d997f640b4a516062f84228a772a48a8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phing/phing": "~2.7", + "phpunit/phpunit": "^4.8.35|^5.7|^6.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "suggest": { + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net/", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2020-09-08T04:24:43+00:00" + }, + { + "name": "predis/predis", + "version": "v1.1.6", + "source": { + "type": "git", + "url": "https://github.com/predis/predis.git", + "reference": "9930e933c67446962997b05201c69c2319bf26de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/predis/predis/zipball/9930e933c67446962997b05201c69c2319bf26de", + "reference": "9930e933c67446962997b05201c69c2319bf26de", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "cweagans/composer-patches": "^1.6", + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-curl": "Allows access to Webdis when paired with phpiredis", + "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + }, + "type": "library", + "extra": { + "composer-exit-on-patch-failure": true, + "patches": { + "phpunit/phpunit-mock-objects": { + "Fix PHP 7 and 8 compatibility": "./tests/phpunit_mock_objects.patch" + }, + "phpunit/phpunit": { + "Fix PHP 7 compatibility": "./tests/phpunit_php7.patch", + "Fix PHP 8 compatibility": "./tests/phpunit_php8.patch" + } + } + }, + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniele Alessandri", + "email": "suppakilla@gmail.com", + "homepage": "http://clorophilla.net/", + "role": "Creator & Maintainer" + }, + { + "name": "Till Krüss", + "homepage": "https://till.im/", + "role": "Maintainer" + } + ], + "description": "Flexible and feature-complete Redis client for PHP and HHVM", + "homepage": "http://github.com/predis/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" + } + ], + "time": "2020-09-11T19:18:05+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "queue-interop/amqp-interop", + "version": "0.8.1", + "source": { + "type": "git", + "url": "https://github.com/queue-interop/amqp-interop.git", + "reference": "2029c3b3b9f10cc1c0a219650f66ab68fcfe656d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/queue-interop/amqp-interop/zipball/2029c3b3b9f10cc1c0a219650f66ab68fcfe656d", + "reference": "2029c3b3b9f10cc1c0a219650f66ab68fcfe656d", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "queue-interop/queue-interop": "^0.7|^0.8" + }, + "require-dev": { + "phpunit/phpunit": "~5.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Interop\\Amqp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "time": "2018-12-13T13:42:47+00:00" + }, + { + "name": "queue-interop/queue-interop", + "version": "0.8.0", + "source": { + "type": "git", + "url": "https://github.com/queue-interop/queue-interop.git", + "reference": "b43af85f635439fa2c9a6d8fd486489da4869741" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/queue-interop/queue-interop/zipball/b43af85f635439fa2c9a6d8fd486489da4869741", + "reference": "b43af85f635439fa2c9a6d8fd486489da4869741", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "phpunit/phpunit": "^5.5", + "queue-interop/queue-spec": "^0.6@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.7-dev" + } + }, + "autoload": { + "psr-4": { + "Interop\\Queue\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Promoting the interoperability of MQs objects. Based on Java JMS", + "homepage": "https://github.com/queue-interop/queue-interop", + "keywords": [ + "MQ", + "jms", + "message queue", + "messaging", + "queue" + ], + "time": "2018-11-22T17:53:21+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/24d93aefb2cd786b7edd9f45b554aea20b28b9b1", + "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fzaninotto/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.6", + "mockery/mockery": "^1.3", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^3.12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com/" + } + ], + "description": "A PHP 7.2+ library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + } + ], + "time": "2020-09-10T20:58:17+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "cd4032040a750077205918c86049aa0f43d22947" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947", + "reference": "cd4032040a750077205918c86049aa0f43d22947", + "shasum": "" + }, + "require": { + "brick/math": "^0.8 || ^0.9", + "ext-json": "*", + "php": "^7.2 || ^8", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0", + "doctrine/annotations": "^1.8", + "goaop/framework": "^2", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock-mockery": "^1.3", + "php-mock/php-mock-phpunit": "^2.5", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^0.17.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "psy/psysh": "^0.10.0", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "3.9.4" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + } + ], + "time": "2020-08-18T17:17:46+00:00" + }, + { + "name": "ratchet/pawl", + "version": "v0.3.5", + "source": { + "type": "git", + "url": "https://github.com/ratchetphp/Pawl.git", + "reference": "89ec703c76dc893484a2a0ed44b48a37d445abd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ratchetphp/Pawl/zipball/89ec703c76dc893484a2a0ed44b48a37d445abd5", + "reference": "89ec703c76dc893484a2a0ed44b48a37d445abd5", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0", + "php": ">=5.4", + "ratchet/rfc6455": "^0.3", + "react/socket": "^1.0 || ^0.8 || ^0.7" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "reactivex/rxphp": "~2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ratchet\\Client\\": "src" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Asynchronous WebSocket client", + "keywords": [ + "Ratchet", + "async", + "client", + "websocket", + "websocket client" + ], + "time": "2020-07-17T15:32:47+00:00" + }, + { + "name": "ratchet/rfc6455", + "version": "v0.3", + "source": { + "type": "git", + "url": "https://github.com/ratchetphp/RFC6455.git", + "reference": "c8651c7938651c2d55f5d8c2422ac5e57a183341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ratchetphp/RFC6455/zipball/c8651c7938651c2d55f5d8c2422ac5e57a183341", + "reference": "c8651c7938651c2d55f5d8c2422ac5e57a183341", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.0", + "php": ">=5.4.2" + }, + "require-dev": { + "phpunit/phpunit": "5.7.*", + "react/socket": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ratchet\\RFC6455\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "role": "Developer" + }, + { + "name": "Matt Bonneau", + "role": "Developer" + } + ], + "description": "RFC6455 WebSocket protocol handler", + "homepage": "http://socketo.me/", + "keywords": [ + "WebSockets", + "rfc6455", + "websocket" + ], + "time": "2020-05-15T18:31:24+00:00" + }, + { + "name": "react/cache", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/44a568925556b0bd8cacc7b49fb0f1cf0d706a0c", + "reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2020-09-18T12:12:35+00:00" + }, + { + "name": "react/dns", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/665260757171e2ab17485b44e7ffffa7acb6ca1f", + "reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.0 || ^0.5", + "react/promise": "^3.0 || ^2.7 || ^1.2.1", + "react/promise-timer": "^1.2" + }, + "require-dev": { + "clue/block-react": "^1.2", + "phpunit/phpunit": "^9.3 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2020-09-18T12:12:55+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "6d24de090cd59cfc830263cfba965be77b563c13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6d24de090cd59cfc830263cfba965be77b563c13", + "reference": "6d24de090cd59cfc830263cfba965be77b563c13", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35" + }, + "suggest": { + "ext-event": "~1.0 for ExtEventLoop", + "ext-pcntl": "For signal handling support when using the StreamSelectLoop", + "ext-uv": "* for ExtUvLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "time": "2020-01-01T18:39:52+00:00" + }, + { + "name": "react/promise", + "version": "v2.8.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "time": "2020-05-12T15:16:56+00:00" + }, + { + "name": "react/promise-timer", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise-timer.git", + "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/daee9baf6ef30c43ea4c86399f828bb5f558f6e6", + "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", + "react/promise": "^3.0 || ^2.7.0 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.0 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\Timer\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", + "homepage": "https://github.com/reactphp/promise-timer", + "keywords": [ + "async", + "event-loop", + "promise", + "reactphp", + "timeout", + "timer" + ], + "time": "2020-07-10T12:18:06+00:00" + }, + { + "name": "react/socket", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/e2b96b23a13ca9b41ab343268dbce3f8ef4d524a", + "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.1", + "react/event-loop": "^1.0 || ^0.5", + "react/promise": "^2.6.0 || ^1.2.1", + "react/promise-timer": "^1.4.0", + "react/stream": "^1.1" + }, + "require-dev": { + "clue/block-react": "^1.2", + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "react/promise-stream": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2020-08-28T12:49:05+00:00" + }, + { + "name": "react/stream", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/7c02b510ee3f582c810aeccd3a197b9c2f52ff1a", + "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "time": "2020-05-04T10:17:57+00:00" + }, + { + "name": "richardfullmer/rabbitmq-management-api", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/richardfullmer/php-rabbitmq-management-api.git", + "reference": "3bab8bba3b7e76bd3b4c1b3f1b645894b6ce8009" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/richardfullmer/php-rabbitmq-management-api/zipball/3bab8bba3b7e76bd3b4c1b3f1b645894b6ce8009", + "reference": "3bab8bba3b7e76bd3b4c1b3f1b645894b6ce8009", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "php-http/client-common": "^1.0", + "php-http/client-implementation": "^1.0", + "php-http/discovery": "^1.0", + "php-http/httplug": "^1.0", + "php-http/message-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "RabbitMq\\ManagementApi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Richard Fullmer", + "email": "richardfullmer@gmail.com", + "homepage": "https://github.com/richardfullmer" + } + ], + "description": "An object oriented wrapper for the RabbitMQ Management HTTP Api", + "homepage": "https://github.com/richardfullmer/php-rabbitmq-management-api", + "keywords": [ + "message queue", + "rabbitmq", + "rest" + ], + "time": "2016-10-18T17:33:33+00:00" + }, + { + "name": "rize/uri-template", + "version": "0.3.2", + "source": { + "type": "git", + "url": "https://github.com/rize/UriTemplate.git", + "reference": "9e5fdd5c47147aa5adf7f760002ee591ed37b9ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rize/UriTemplate/zipball/9e5fdd5c47147aa5adf7f760002ee591ed37b9ca", + "reference": "9e5fdd5c47147aa5adf7f760002ee591ed37b9ca", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Rize\\UriTemplate": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marut K", + "homepage": "http://twitter.com/rezigned" + } + ], + "description": "PHP URI Template (RFC 6570) supports both expansion & extraction", + "keywords": [ + "RFC 6570", + "template", + "uri" + ], + "time": "2017-06-14T03:57:53+00:00" + }, + { + "name": "stomp-php/stomp-php", + "version": "4.6.1", + "source": { + "type": "git", + "url": "https://github.com/stomp-php/stomp-php.git", + "reference": "d55ba2b2c3ce0e3074b3aa15de1151fd13bb84e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stomp-php/stomp-php/zipball/d55ba2b2c3ce0e3074b3aa15de1151fd13bb84e4", + "reference": "d55ba2b2c3ce0e3074b3aa15de1151fd13bb84e4", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Stomp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Dejan Bosnanac", + "email": "dejan@nighttale.net", + "homepage": "http://www.nighttale.net/" + }, + { + "name": "Sören Rohweder", + "email": "s.rohweder@blage.net", + "homepage": "http://www.monofone.de/" + }, + { + "name": "Jens Radtke", + "email": "swefl@fin-sn.de", + "homepage": "http://www.fin-sn.de/" + } + ], + "description": "stomp support for PHP", + "homepage": "http://github.com/stomp-php/stomp-php", + "keywords": [ + "activeMQ", + "apollomq", + "jms", + "messaging", + "rabbitmq", + "stomp" + ], + "funding": [ + { + "url": "https://github.com/jmglsn", + "type": "github" + }, + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2020-06-15T18:01:49+00:00" + }, + { + "name": "symfony/console", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "90933b39c7b312fc3ceaa1ddeac7eb48cb953124" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/90933b39c7b312fc3ceaa1ddeac7eb48cb953124", + "reference": "90933b39c7b312fc3ceaa1ddeac7eb48cb953124", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-15T07:58:55+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "4c7e155bf7d93ea4ba3824d5a14476694a5278dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4c7e155bf7d93ea4ba3824d5a14476694a5278dd", + "reference": "4c7e155bf7d93ea4ba3824d5a14476694a5278dd", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony OptionsResolver Component", + "homepage": "https://symfony.com/", + "keywords": [ + "config", + "configuration", + "options" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T03:44:28+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/5dcab1bc7146cf8c1beaa4502a3d9be344334251", + "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-04T06:02:08+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "639447d008615574653fb3bc60d1986d7172eaae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", + "reference": "639447d008615574653fb3bc60d1986d7172eaae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "shasum": "" + }, + "require": { + "php": ">=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com/", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" + }, + { + "name": "thruway/client", + "version": "0.5.4", + "source": { + "type": "git", + "url": "https://github.com/thruway/client.git", + "reference": "532604ab58de1e271a368dae406685566c539c87" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thruway/client/zipball/532604ab58de1e271a368dae406685566c539c87", + "reference": "532604ab58de1e271a368dae406685566c539c87", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0", + "psr/log": "^1.0", + "react/event-loop": "^1.0 || ^0.5 || ^0.4.3", + "react/promise-timer": "^1.2.1", + "voryx/thruway-common": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.5.4", + "thruway/pawl-transport": "dev-master" + }, + "type": "library", + "autoload": { + "psr-4": { + "Thruway\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Bonneau", + "email": "matt@bonneau.net", + "role": "Developer" + }, + { + "name": "David Dan", + "email": "davidwdan@gmail.com", + "role": "Developer" + } + ], + "description": "Thruway WAMP client", + "keywords": [ + "Autobahn", + "WAMP", + "WAMP2", + "WebSockets", + "client" + ], + "time": "2018-04-09T12:18:12+00:00" + }, + { + "name": "thruway/pawl-transport", + "version": "0.5.1", + "source": { + "type": "git", + "url": "https://github.com/thruway/pawl-transport.git", + "reference": "fa297b4aaf74c59fe2fcb41963f55bfcfda70c98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thruway/pawl-transport/zipball/fa297b4aaf74c59fe2fcb41963f55bfcfda70c98", + "reference": "fa297b4aaf74c59fe2fcb41963f55bfcfda70c98", + "shasum": "" + }, + "require": { + "ratchet/pawl": "^0.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Thruway\\Transport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Bonneau", + "email": "matt@bonneau.net", + "role": "Developer" + }, + { + "name": "David Dan", + "email": "davidwdan@gmail.com", + "role": "Developer" + } + ], + "description": "Pawl WebSocket Transport for Thruway Client", + "keywords": [ + "Autobahn", + "WAMP", + "WAMP2", + "WebSockets", + "client", + "sockets", + "thruway" + ], + "time": "2019-07-04T14:58:36+00:00" + }, + { + "name": "voryx/thruway-common", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/voryx/ThruwayCommon.git", + "reference": "694adb0403c4267d1ea78a136da1cafc935d39b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voryx/ThruwayCommon/zipball/694adb0403c4267d1ea78a136da1cafc935d39b5", + "reference": "694adb0403c4267d1ea78a136da1cafc935d39b5", + "shasum": "" + }, + "replace": { + "voryx/thruway-message": "1.*" + }, + "require-dev": { + "phpunit/phpunit": "^5.5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Thruway\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Bonneau", + "email": "matt@bonneau.net", + "role": "Developer" + }, + { + "name": "David Dan", + "email": "davidwdan@gmail.com", + "role": "Developer" + } + ], + "description": "WAMP2 Common Library for Thruway", + "keywords": [ + "WAMP", + "WAMP2", + "thruway", + "wamp-proto" + ], + "time": "2019-01-18T15:59:32+00:00" + } + ], + "packages-dev": [ + { + "name": "alcaeus/mongo-php-adapter", + "version": "1.1.11", + "source": { + "type": "git", + "url": "https://github.com/alcaeus/mongo-php-adapter.git", + "reference": "43b6add94c8b4cb9890d662cba4c0defde733dcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alcaeus/mongo-php-adapter/zipball/43b6add94c8b4cb9890d662cba4c0defde733dcf", + "reference": "43b6add94c8b4cb9890d662cba4c0defde733dcf", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-hash": "*", + "ext-mongodb": "^1.2.0", + "mongodb/mongodb": "^1.0.1", + "php": "^5.6 || ^7.0" + }, + "provide": { + "ext-mongo": "1.6.14" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.27 || ^6.0 || ^7.0", + "squizlabs/php_codesniffer": "^3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mongo": "lib/Mongo" + }, + "psr-4": { + "Alcaeus\\MongoDbAdapter\\": "lib/Alcaeus/MongoDbAdapter" + }, + "files": [ + "lib/Mongo/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "alcaeus", + "email": "alcaeus@alcaeus.org" + }, + { + "name": "Olivier Lechevalier", + "email": "olivier.lechevalier@gmail.com" + } + ], + "description": "Adapter to provide ext-mongo interface on top of mongo-php-libary", + "keywords": [ + "database", + "mongodb" + ], + "time": "2019-11-11T20:47:32+00:00" + }, + { + "name": "composer/semver", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "38276325bd896f90dfcfe30029aa5db40df387a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/38276325bd896f90dfcfe30029aa5db40df387a7", + "reference": "38276325bd896f90dfcfe30029aa5db40df387a7", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de/" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be/" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl/" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "funding": [ + { + "url": "https://packagist.com/", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-09-27T13:13:07+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ebd27a9866ae8254e873866f795491f02418c5a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ebd27a9866ae8254e873866f795491f02418c5a5", + "reference": "ebd27a9866ae8254e873866f795491f02418c5a5", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "funding": [ + { + "url": "https://packagist.com/", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-08-19T10:27:58+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "f96fac225563f5b3b4eeb2f80eb982b7f56484d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f96fac225563f5b3b4eeb2f80eb982b7f56484d8", + "reference": "f96fac225563f5b3b4eeb2f80eb982b7f56484d8", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9.0", + "jdorn/sql-formatter": "^1.2.16", + "php": "^7.1", + "symfony/cache": "^4.3.3|^5.0", + "symfony/config": "^4.3.3|^5.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0", + "symfony/dependency-injection": "^4.3.3|^5.0", + "symfony/doctrine-bridge": "^4.3.7|^5.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0" + }, + "conflict": { + "doctrine/orm": "<2.6", + "twig/twig": "<1.34|>=2.0,<2.4" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "doctrine/orm": "^2.6", + "phpunit/phpunit": "^7.5", + "symfony/phpunit-bridge": "^4.2", + "symfony/property-info": "^4.3.3|^5.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0", + "twig/twig": "^1.34|^2.12" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org/", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "time": "2019-11-28T08:38:10+00:00" + }, + { + "name": "doctrine/mongodb-odm", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/mongodb-odm.git", + "reference": "72ca04db10f68d3e6f442ab861add63ce6069670" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/mongodb-odm/zipball/72ca04db10f68d3e6f442ab861add63ce6069670", + "reference": "72ca04db10f68d3e6f442ab861add63ce6069670", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.6", + "doctrine/cache": "^1.7", + "doctrine/collections": "^1.5", + "doctrine/event-manager": "^1.0", + "doctrine/instantiator": "^1.1", + "doctrine/persistence": "^1.1", + "ext-mongodb": "^1.5", + "mongodb/mongodb": "^1.2.0", + "ocramius/proxy-manager": "^2.2", + "php": "^7.2", + "symfony/console": "^3.4|^4.1|^5.0", + "symfony/var-dumper": "^3.4|^4.1|^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "jmikola/geojson": "^1.0", + "phpbench/phpbench": "^0.13.0", + "phpstan/phpstan": "^0.10.3", + "phpunit/phpunit": "^8.2", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\ODM\\MongoDB\\": "lib/Doctrine/ODM/MongoDB" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bulat Shakirzyanov", + "email": "mallluhuct@gmail.com" + }, + { + "name": "Kris Wallsmith", + "email": "kris.wallsmith@gmail.com" + }, + { + "name": "Jonathan H. Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Jeremy Mikola", + "email": "jmikola@gmail.com" + }, + { + "name": "Maciej Malarz", + "email": "malarzm@gmail.com" + }, + { + "name": "Andreas Braun", + "email": "alcaeus@alcaeus.org" + } + ], + "description": "PHP Doctrine MongoDB Object Document Mapper (ODM) provides transparent persistence for PHP objects to MongoDB.", + "homepage": "https://www.doctrine-project.org/projects/mongodb-odm.html", + "keywords": [ + "data", + "mapper", + "mapping", + "mongodb", + "object", + "odm", + "php" + ], + "time": "2019-11-26T08:29:21+00:00" + }, + { + "name": "doctrine/mongodb-odm-bundle", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMongoDBBundle.git", + "reference": "c27fefe5ff4cd1a25969b5d5695c9c36879b1b50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMongoDBBundle/zipball/c27fefe5ff4cd1a25969b5d5695c9c36879b1b50", + "reference": "c27fefe5ff4cd1a25969b5d5695c9c36879b1b50", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.2", + "doctrine/mongodb-odm": "^2.0.0", + "php": "^7.2", + "psr/log": "^1.0", + "symfony/config": "^4.3.3|^5.0", + "symfony/console": "^4.3.3|^5.0", + "symfony/dependency-injection": "^4.3.3|^5.0", + "symfony/doctrine-bridge": "^4.3.3|^5.0", + "symfony/framework-bundle": "^4.3.3|^5.0", + "symfony/http-kernel": "^4.3.7|^5.0", + "symfony/options-resolver": "^4.3.3|^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "doctrine/data-fixtures": "^1.2.2", + "phpunit/phpunit": "^7.3", + "squizlabs/php_codesniffer": "^3.5", + "symfony/form": "^4.3.3|^5.0", + "symfony/phpunit-bridge": "^4.3.3|^5.0", + "symfony/yaml": "^4.3.3|^5.0" + }, + "suggest": { + "doctrine/data-fixtures": "Load data fixtures" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MongoDBBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bulat Shakirzyanov", + "email": "mallluhuct@gmail.com" + }, + { + "name": "Kris Wallsmith", + "email": "kris@symfony.com" + }, + { + "name": "Jonathan H. Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Symfony2 Doctrine MongoDB Bundle", + "homepage": "http://www.doctrine-project.org/", + "keywords": [ + "mongodb", + "persistence", + "symfony" + ], + "time": "2019-11-28T06:20:43+00:00" + }, + { + "name": "empi89/php-amqp-stubs", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/empi89/php-amqp-stubs.git", + "reference": "f8f402e81edf56871fa7192df01b8e47f29e2e13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/empi89/php-amqp-stubs/zipball/f8f402e81edf56871fa7192df01b8e47f29e2e13", + "reference": "f8f402e81edf56871fa7192df01b8e47f29e2e13", + "shasum": "" + }, + "require": { + "php": ">=5.1.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "": "src" + }, + "files": [ + "src/AMQP.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "PHP" + ], + "description": "pdezwart/php-amqp stubs via packagist", + "homepage": "http://github.com/empi89/php-amqp-stubs", + "keywords": [ + "AMQP", + "testing" + ], + "time": "2014-07-17T15:28:25+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v2.16.4", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "1023c3458137ab052f6ff1e09621a721bfdeca13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/1023c3458137ab052f6ff1e09621a721bfdeca13", + "reference": "1023c3458137ab052f6ff1e09621a721bfdeca13", + "shasum": "" + }, + "require": { + "composer/semver": "^1.4", + "composer/xdebug-handler": "^1.2", + "doctrine/annotations": "^1.2", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^5.6 || ^7.0", + "php-cs-fixer/diff": "^1.3", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", + "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", + "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^3.0 || ^4.0 || ^5.0", + "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", + "symfony/polyfill-php70": "^1.0", + "symfony/polyfill-php72": "^1.4", + "symfony/process": "^3.0 || ^4.0 || ^5.0", + "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", + "justinrainbow/json-schema": "^5.0", + "keradus/cli-executor": "^1.2", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.1", + "php-cs-fixer/accessible-object": "^1.0", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.1", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.1", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.1", + "phpunitgoodpractices/traits": "^1.8", + "symfony/phpunit-bridge": "^5.1", + "symfony/yaml": "^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters.", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", + "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "classmap": [ + "tests/Test/AbstractFixerTestCase.php", + "tests/Test/AbstractIntegrationCaseFactory.php", + "tests/Test/AbstractIntegrationTestCase.php", + "tests/Test/Assert/AssertTokensTrait.php", + "tests/Test/IntegrationCase.php", + "tests/Test/IntegrationCaseFactory.php", + "tests/Test/IntegrationCaseFactoryInterface.php", + "tests/Test/InternalIntegrationCaseFactory.php", + "tests/Test/IsIdenticalConstraint.php", + "tests/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2020-06-27T23:57:46+00:00" + }, + { + "name": "jdorn/sql-formatter", + "version": "v1.2.17", + "source": { + "type": "git", + "url": "https://github.com/jdorn/sql-formatter.git", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "lib" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/jdorn/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "time": "2014-01-12T16:20:24+00:00" + }, + { + "name": "kwn/php-rdkafka-stubs", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/kwn/php-rdkafka-stubs.git", + "reference": "093852073707708d434cfd293c5df36719edc765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kwn/php-rdkafka-stubs/zipball/093852073707708d434cfd293c5df36719edc765", + "reference": "093852073707708d434cfd293c5df36719edc765", + "shasum": "" + }, + "require": { + "ext-rdkafka": ">=3.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.2.4" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Karol Wnuk", + "email": "k.wnuk@ascetic.pl" + } + ], + "description": "Rdkafka extension stubs for your IDE", + "time": "2019-08-27T20:35:53+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1cb8f203389ab1482bf89c0e70a04849bacd7766", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766", + "shasum": "" + }, + "require": { + "laminas/laminas-eventmanager": "^2.6 || ^3.0", + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^7.1" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0" + }, + "replace": { + "zendframework/zend-code": "self.version" + }, + "require-dev": { + "doctrine/annotations": "^1.7", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^1.0", + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "phpunit/phpunit": "^7.5.16 || ^8.4" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev", + "dev-develop": "3.5.x-dev", + "dev-dev-4.0": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev/", + "keywords": [ + "code", + "laminas" + ], + "time": "2019-12-31T16:28:24+00:00" + }, + { + "name": "laminas/laminas-eventmanager", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-eventmanager.git", + "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/1940ccf30e058b2fd66f5a9d696f1b5e0027b082", + "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082", + "shasum": "" + }, + "require": { + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^7.3 || ^8.0" + }, + "replace": { + "zendframework/zend-eventmanager": "^3.2.1" + }, + "require-dev": { + "container-interop/container-interop": "^1.1", + "laminas/laminas-coding-standard": "~1.0.0", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0", + "phpbench/phpbench": "^0.17.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "container-interop/container-interop": "^1.1, to use the lazy listeners feature", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev", + "dev-develop": "3.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://laminas.dev/", + "keywords": [ + "event", + "eventmanager", + "events", + "laminas" + ], + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-08-25T11:10:44+00:00" + }, + { + "name": "laminas/laminas-zendframework-bridge", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-zendframework-bridge.git", + "reference": "6ede70583e101030bcace4dcddd648f760ddf642" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", + "reference": "6ede70583e101030bcace4dcddd648f760ddf642", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laminas": { + "module": "Laminas\\ZendFrameworkBridge" + } + }, + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Laminas\\ZendFrameworkBridge\\": "src//" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Alias legacy ZF class names to Laminas Project equivalents.", + "keywords": [ + "ZendFramework", + "autoloading", + "laminas", + "zf" + ], + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-09-14T14:23:00+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-06-29T13:22:24+00:00" + }, + { + "name": "ocramius/proxy-manager", + "version": "2.8.1", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/ProxyManager.git", + "reference": "371c8f2d9d1e888ce1f8f2137d9187252b07ee94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/371c8f2d9d1e888ce1f8f2137d9187252b07ee94", + "reference": "371c8f2d9d1e888ce1f8f2137d9187252b07ee94", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "^3.4.1", + "ocramius/package-versions": "^1.8.0,<1.10.0", + "php": "~7.4.1", + "webimpress/safe-writer": "^2.0.1" + }, + "conflict": { + "doctrine/annotations": "<1.6.1", + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0.0", + "ext-phar": "*", + "infection/infection": "^0.16.2", + "nikic/php-parser": "^4.4.0", + "phpbench/phpbench": "^0.17.0", + "phpunit/phpunit": "^9.1.1", + "slevomat/coding-standard": "^5.0.4", + "squizlabs/php_codesniffer": "^3.5.4", + "vimeo/psalm": "^3.11.1" + }, + "suggest": { + "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", + "laminas/laminas-soap": "To have the Soap adapter (Remote Object feature)", + "laminas/laminas-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)", + "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + } + ], + "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", + "homepage": "https://github.com/Ocramius/ProxyManager", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2020-07-13T19:23:57+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "SpacePossum" + } + ], + "description": "sebastian/diff v2 backport support for PHP5.6", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "time": "2018-02-15T16:58:55+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org/", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.2.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2020-09-03T19:13:55+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "time": "2020-09-17T18:55:26+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.1", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0 || ^9.0 <9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com/" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2020-09-29T09:10:42+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "0.12.47", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "74325a6ae15378db0df71b969ded245378d2e058" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/74325a6ae15378db0df71b969ded245378d2e058", + "reference": "74325a6ae15378db0df71b969ded245378d2e058", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.12-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2020-09-29T13:35:39+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "6.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.1", + "phpunit/php-file-iterator": "^2.0", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.1 || ^4.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "ext-xdebug": "^2.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-10-31T16:06:48+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2018-09-13T20:33:42+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2019-06-07T04:22:29+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "abandoned": true, + "time": "2019-09-17T06:23:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "7.5.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "9467db479d1b0487c99733bb1e7944d32deded2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c", + "reference": "9467db479d1b0487c99733bb1e7944d32deded2c", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.7", + "phar-io/manifest": "^1.0.2", + "phar-io/version": "^2.0", + "php": "^7.1", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^6.0.7", + "phpunit/php-file-iterator": "^2.0.1", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", + "sebastian/environment": "^4.0", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpunit/phpunit-mock-objects": "*" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2020-01-08T08:45:45+00:00" + }, + { + "name": "queue-interop/queue-spec", + "version": "0.6.1", + "source": { + "type": "git", + "url": "https://github.com/queue-interop/queue-spec.git", + "reference": "f0414b8c98a31cf5ab09da0ef575836d457d898c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/queue-interop/queue-spec/zipball/f0414b8c98a31cf5ab09da0ef575836d457d898c", + "reference": "f0414b8c98a31cf5ab09da0ef575836d457d898c", + "shasum": "" + }, + "require": { + "queue-interop/queue-interop": "^0.7|^0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Interop\\Queue\\Spec\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "time": "2018-12-13T13:43:40+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-07-12T15:12:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "time": "2019-02-04T06:01:07+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2019-11-20T08:46:58+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2019-09-14T09:02:43+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2018-10-04T04:07:39+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "4012fac896bf5c1ac435d8c5d98fa2163241dbcc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/4012fac896bf5c1ac435d8c5d98fa2163241dbcc", + "reference": "4012fac896bf5c1ac435d8c5d98fa2163241dbcc", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/dom-crawler": "^3.4|^4.0|^5.0" + }, + "require-dev": { + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/http-client": "^4.3|^5.0", + "symfony/mime": "^4.3|^5.0", + "symfony/process": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony BrowserKit Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:08:58+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "72b4c2bfe8b40a0d7365943cfaaf1658217e2f69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/72b4c2bfe8b40a0d7365943cfaaf1658217e2f69", + "reference": "72b4c2bfe8b40a0d7365943cfaaf1658217e2f69", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "~1.0", + "psr/log": "~1.0", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "conflict": { + "doctrine/dbal": "<2.5", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0", + "symfony/cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6", + "doctrine/dbal": "^2.5|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com/", + "keywords": [ + "caching", + "psr6" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-24T07:56:38+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", + "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com/", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" + }, + { + "name": "symfony/config", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "3880541ff96d2e9a113f355d8c6891489c63cf56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/3880541ff96d2e9a113f355d8c6891489c63cf56", + "reference": "3880541ff96d2e9a113f355d8c6891489c63cf56", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/messenger": "^4.1|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:08:58+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "726b85e69342e767d60e3853b98559a68ff74183" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/726b85e69342e767d60e3853b98559a68ff74183", + "reference": "726b85e69342e767d60e3853b98559a68ff74183", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-09T05:20:36+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "89274c8847dff2ed703e481843eb9159ca25cc6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/89274c8847dff2ed703e481843eb9159ca25cc6e", + "reference": "89274c8847dff2ed703e481843eb9159ca25cc6e", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/container": "^1.0", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/config": "<4.3|>=5.0", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "^4.3", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-10T10:08:39+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "31c3d72f9e7a03e1b9d136084a9201c2225ee348" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/31c3d72f9e7a03e1b9d136084a9201c2225ee348", + "reference": "31c3d72f9e7a03e1b9d136084a9201c2225ee348", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "~1.0", + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4", + "symfony/form": "<4.4", + "symfony/http-kernel": "<4.3.7", + "symfony/messenger": "<4.3", + "symfony/security-core": "<4.4", + "symfony/validator": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.6", + "doctrine/collections": "~1.0", + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": "~2.4", + "doctrine/orm": "^2.6.3", + "doctrine/reflection": "~1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/http-kernel": "^4.3.7", + "symfony/messenger": "^4.4|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/proxy-manager-bridge": "^3.4|^4.0|^5.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/translation": "^3.4|^4.0|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/var-dumper": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Bridge", + "homepage": "https://symfony.com/", + "time": "2019-12-01T08:39:58+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6d6885e167aad0af4128b392f22d8f2a33dd88ec", + "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^4.4|^5.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DomCrawler Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "5a6feca7a384015a09e14265c35ee0bd6f54b2ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/5a6feca7a384015a09e14265c35ee0bd6f54b2ed", + "reference": "5a6feca7a384015a09e14265c35ee0bd6f54b2ed", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/debug": "^4.4.5", + "symfony/polyfill-php80": "^1.15", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ErrorHandler Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-25T08:51:35+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "e17bb5e0663dc725f7cdcafc932132735b4725cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e17bb5e0663dc725f7cdcafc932132735b4725cd", + "reference": "e17bb5e0663dc725f7cdcafc932132735b4725cd", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-18T14:07:46+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com/", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "54b118a1c91991b90e67919146db66093def1bf9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/54b118a1c91991b90e67919146db66093def1bf9", + "reference": "54b118a1c91991b90e67919146db66093def1bf9", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/cache": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ExpressionLanguage Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:08:58+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "0d386979828c15d37ff936bf9bae2ecbfa36d7dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0d386979828c15d37ff936bf9bae2ecbfa36d7dc", + "reference": "0d386979828c15d37ff936bf9bae2ecbfa36d7dc", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:08:58+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", + "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "69ac426bfaca9270e549cea184eece00357f2675" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/69ac426bfaca9270e549cea184eece00357f2675", + "reference": "69ac426bfaca9270e549cea184eece00357f2675", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^7.1.3", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.3.4|^5.0", + "symfony/dependency-injection": "^4.4.1|^5.0.1", + "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^4.4|^5.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.0", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/asset": "<3.4", + "symfony/browser-kit": "<4.3", + "symfony/console": "<4.3", + "symfony/dom-crawler": "<4.3", + "symfony/dotenv": "<4.3.6", + "symfony/form": "<4.3.5", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<4.4", + "symfony/messenger": "<4.4", + "symfony/mime": "<4.4", + "symfony/property-info": "<3.4", + "symfony/security-bundle": "<4.4", + "symfony/serializer": "<4.4", + "symfony/stopwatch": "<3.4", + "symfony/translation": "<4.4", + "symfony/twig-bridge": "<4.1.1", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<4.4", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<4.3.6" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "paragonie/sodium_compat": "^1.8", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/asset": "^3.4|^4.0|^5.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/console": "^4.3.4|^5.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dom-crawler": "^4.3|^5.0", + "symfony/dotenv": "^4.3.6|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/form": "^4.3.5|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/security-csrf": "^3.4|^4.0|^5.0", + "symfony/security-http": "^3.4|^4.0|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.3.6|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0", + "twig/twig": "^1.41|^2.10|^3.0" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony FrameworkBundle", + "homepage": "https://symfony.com/", + "time": "2019-11-28T14:12:27+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "3a5d0fe7908daaa23e3dbf4cee3ba4bfbb19fdd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/3a5d0fe7908daaa23e3dbf4cee3ba4bfbb19fdd3", + "reference": "3a5d0fe7908daaa23e3dbf4cee3ba4bfbb19fdd3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com/", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "6cca6b2e4b69fc5bace160d14cf1ee5f71483db4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6cca6b2e4b69fc5bace160d14cf1ee5f71483db4", + "reference": "6cca6b2e4b69fc5bace160d14cf1ee5f71483db4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-13T05:01:27+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "e3eac6daeb0c65965a6201bd2de9564a802fe0a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e3eac6daeb0c65965a6201bd2de9564a802fe0a9", + "reference": "e3eac6daeb0c65965a6201bd2de9564a802fe0a9", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/error-handler": "^4.4", + "symfony/event-dispatcher": "^4.4", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/browser-kit": "<4.3", + "symfony/config": "<3.4", + "symfony/console": ">=5", + "symfony/dependency-injection": "<4.3", + "symfony/translation": "<4.2", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^4.3|^5.0", + "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T04:25:44+00:00" + }, + { + "name": "symfony/process", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "9b887acc522935f77555ae8813495958c7771ba7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/9b887acc522935f77555ae8813495958c7771ba7", + "reference": "9b887acc522935f77555ae8813495958c7771ba7", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:08:58+00:00" + }, + { + "name": "symfony/routing", + "version": "v4.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "8db77d97152f55f0df5158cc0a877ad8e16099ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/8db77d97152f55f0df5158cc0a877ad8e16099ac", + "reference": "8db77d97152f55f0df5158cc0a877ad8e16099ac", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com/", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:08:58+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "c976c115a0d788808f7e71834c8eb0844f678d02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c976c115a0d788808f7e71834c8eb0844f678d02", + "reference": "c976c115a0d788808f7e71834c8eb0844f678d02", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com/", + "keywords": [ + "debug", + "dump" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-18T14:27:32+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "8b858508e49beb257fd635104c3d449a8113e8fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8b858508e49beb257fd635104c3d449a8113e8fe", + "reference": "8b858508e49beb257fd635104c3d449a8113e8fe", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/var-dumper": "^4.4.9|^5.0.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "homepage": "https://symfony.com/", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-08T14:19:54+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", + "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com/", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T03:44:28+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "75a63c33a8577608444246075ea0af0d052e452a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2020-07-12T23:59:07+00:00" + }, + { + "name": "webimpress/safe-writer", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/webimpress/safe-writer.git", + "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/5cfafdec5873c389036f14bf832a5efc9390dcdd", + "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.8 || ^9.3.7", + "vimeo/psalm": "^3.14.2", + "webimpress/coding-standard": "^1.1.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev", + "dev-develop": "2.2.x-dev", + "dev-release-1.0": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Webimpress\\SafeWriter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "Tool to write files safely, to avoid race conditions", + "keywords": [ + "concurrent write", + "file writer", + "race condition", + "safe writer", + "webimpress" + ], + "funding": [ + { + "url": "https://github.com/michalbundyra", + "type": "github" + } + ], + "time": "2020-08-25T07:21:11+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2020-07-08T17:02:28+00:00" + } + ], + "aliases": [], + "minimum-stability": "beta", + "stability-flags": { + "php-http/client-common": 20, + "empi89/php-amqp-stubs": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^7.1.3", + "ext-amqp": "^1.9.3", + "ext-gearman": "^2.0", + "ext-mongodb": "^1.5", + "ext-rdkafka": "^3.0.3" + }, + "platform-dev": [], + "platform-overrides": { + "ext-amqp": "1.9.3", + "ext-gearman": "2.0.3", + "ext-rdkafka": "3.3", + "ext-mongodb": "1.5", + "ext-bcmath": "1", + "ext-mbstring": "1", + "ext-mongo": "1.6.14" + }, + "plugin-api-version": "1.1.0" +} From b4afec2b855c1750eee3d35dc39b91b49cee7f68 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Tue, 29 Sep 2020 19:13:53 -0500 Subject: [PATCH 0798/1142] Do we not want this? --- .gitignore | 1 + composer.lock | 9780 ------------------------------------------------- 2 files changed, 1 insertion(+), 9780 deletions(-) delete mode 100644 composer.lock diff --git a/.gitignore b/.gitignore index c41f9c215..2bd575f69 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ vendor var .php_cs .php_cs.cache +composer.lock diff --git a/composer.lock b/composer.lock deleted file mode 100644 index ee1e3f2cc..000000000 --- a/composer.lock +++ /dev/null @@ -1,9780 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "e80471129f8fe6e399961bf99c1a7674", - "packages": [ - { - "name": "aws/aws-sdk-php", - "version": "3.156.0", - "source": { - "type": "git", - "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "994831c4560d8c309882f5d5b9adafb85748f0e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/994831c4560d8c309882f5d5b9adafb85748f0e8", - "reference": "994831c4560d8c309882f5d5b9adafb85748f0e8", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4.1", - "mtdowling/jmespath.php": "^2.5", - "php": ">=5.5" - }, - "require-dev": { - "andrewsville/php-token-reflection": "^1.4", - "aws/aws-php-sns-message-validator": "~1.0", - "behat/behat": "~3.0", - "doctrine/cache": "~1.4", - "ext-dom": "*", - "ext-openssl": "*", - "ext-pcntl": "*", - "ext-sockets": "*", - "nette/neon": "^2.3", - "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35|^5.4.3", - "psr/cache": "^1.0", - "psr/simple-cache": "^1.0", - "sebastian/comparator": "^1.2.3" - }, - "suggest": { - "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", - "doctrine/cache": "To use the DoctrineCacheAdapter", - "ext-curl": "To send requests using cURL", - "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", - "ext-sockets": "To use client-side monitoring" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Aws\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com/" - } - ], - "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", - "keywords": [ - "amazon", - "aws", - "cloud", - "dynamodb", - "ec2", - "glacier", - "s3", - "sdk" - ], - "time": "2020-09-29T18:17:44+00:00" - }, - { - "name": "brick/math", - "version": "0.9.1", - "source": { - "type": "git", - "url": "https://github.com/brick/math.git", - "reference": "283a40c901101e66de7061bd359252c013dcc43c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/283a40c901101e66de7061bd359252c013dcc43c", - "reference": "283a40c901101e66de7061bd359252c013dcc43c", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.1|^8.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^7.5.15|^8.5", - "vimeo/psalm": "^3.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Brick\\Math\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Arbitrary-precision arithmetic library", - "keywords": [ - "Arbitrary-precision", - "BigInteger", - "BigRational", - "arithmetic", - "bigdecimal", - "bignum", - "brick", - "math" - ], - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/brick/math", - "type": "tidelift" - } - ], - "time": "2020-08-18T23:57:15+00:00" - }, - { - "name": "bunny/bunny", - "version": "v0.4.3", - "source": { - "type": "git", - "url": "https://github.com/jakubkulhan/bunny.git", - "reference": "5c1a0f7ed81c20559ada8eeb9c6cd5037030b8b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jakubkulhan/bunny/zipball/5c1a0f7ed81c20559ada8eeb9c6cd5037030b8b5", - "reference": "5c1a0f7ed81c20559ada8eeb9c6cd5037030b8b5", - "shasum": "" - }, - "require": { - "php": "~7.0", - "psr/log": "~1.0", - "react/event-loop": "^1.0 || ^0.5 || ^0.4", - "react/promise": "~2.2" - }, - "require-dev": { - "phpunit/phpunit": "~6.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Bunny\\": "src/Bunny/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jakub Kulhan", - "email": "jakub.kulhan@gmail.com" - } - ], - "description": "Performant pure-PHP AMQP (RabbitMQ) sync/async (ReactPHP) library", - "keywords": [ - "AMQP", - "bunny", - "exchange", - "message", - "messaging", - "queue", - "queueing", - "rabbit", - "rabbitmq", - "react", - "react-php", - "reactphp" - ], - "time": "2020-09-27T14:39:46+00:00" - }, - { - "name": "clue/stream-filter", - "version": "v1.4.1", - "source": { - "type": "git", - "url": "https://github.com/clue/php-stream-filter.git", - "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/php-stream-filter/zipball/5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71", - "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^5.0 || ^4.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Clue\\StreamFilter\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@lueck.tv" - } - ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", - "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" - ], - "time": "2019-04-09T12:31:48+00:00" - }, - { - "name": "datadog/php-datadogstatsd", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/DataDog/php-datadogstatsd.git", - "reference": "5c2050adcfb6e91ae05f8fd9295d0564d635c9df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/DataDog/php-datadogstatsd/zipball/5c2050adcfb6e91ae05f8fd9295d0564d635c9df", - "reference": "5c2050adcfb6e91ae05f8fd9295d0564d635c9df", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-sockets": "*", - "lib-curl": "*", - "php": ">=5.6.0" - }, - "require-dev": { - "phpunit/phpunit": "4.8.36" - }, - "type": "library", - "autoload": { - "psr-4": { - "DataDog\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Corley", - "email": "anthroprose@gmail.com", - "role": "Developer" - }, - { - "name": "Datadog", - "email": "dev@datadoghq.com", - "role": "Developer" - } - ], - "description": "An extremely simple PHP datadogstatsd client", - "homepage": "https://www.datadoghq.com/", - "keywords": [ - "DataDog", - "check", - "error-reporting", - "health", - "logging", - "monitoring", - "statsd" - ], - "time": "2020-09-02T16:47:54+00:00" - }, - { - "name": "doctrine/annotations", - "version": "1.10.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "bfe91e31984e2ba76df1c1339681770401ec262f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/bfe91e31984e2ba76df1c1339681770401ec262f", - "reference": "bfe91e31984e2ba76df1c1339681770401ec262f", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org/", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2020-08-10T19:35:50+00:00" - }, - { - "name": "doctrine/cache", - "version": "1.10.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2020-07-07T18:54:01+00:00" - }, - { - "name": "doctrine/collections", - "version": "1.6.7", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "shasum": "" - }, - "require": { - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "time": "2020-07-27T17:53:49+00:00" - }, - { - "name": "doctrine/common", - "version": "2.12.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", - "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "doctrine/inflector": "^1.0", - "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.1", - "doctrine/reflection": "^1.0", - "php": "^7.1" - }, - "require-dev": { - "doctrine/coding-standard": "^1.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpunit/phpunit": "^7.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "time": "2020-01-10T15:49:25+00:00" - }, - { - "name": "doctrine/dbal", - "version": "v2.9.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "7345cd59edfa2036eb0fa4264b77ae2576842035" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/7345cd59edfa2036eb0fa4264b77ae2576842035", - "reference": "7345cd59edfa2036eb0fa4264b77ae2576842035", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.0", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "jetbrains/phpstorm-stubs": "^2018.1.2", - "phpstan/phpstan": "^0.10.1", - "phpunit/phpunit": "^7.4", - "symfony/console": "^2.0.5|^3.0|^4.0", - "symfony/phpunit-bridge": "^3.4.5|^4.0.5" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.9.x-dev", - "dev-develop": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "dbal", - "mysql", - "persistence", - "pgsql", - "php", - "queryobject" - ], - "time": "2019-11-02T22:19:34+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2020-05-29T18:28:51+00:00" - }, - { - "name": "doctrine/inflector", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2020-05-29T07:19:59+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2020-05-29T17:27:14+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2020-05-25T17:44:05+00:00" - }, - { - "name": "doctrine/orm", - "version": "v2.7.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/orm.git", - "reference": "dafe298ce5d0b995ebe1746670704c0a35868a6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/dafe298ce5d0b995ebe1746670704c0a35868a6a", - "reference": "dafe298ce5d0b995ebe1746670704c0a35868a6a", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.8", - "doctrine/cache": "^1.9.1", - "doctrine/collections": "^1.5", - "doctrine/common": "^2.11", - "doctrine/dbal": "^2.9.3", - "doctrine/event-manager": "^1.1", - "doctrine/instantiator": "^1.3", - "doctrine/persistence": "^1.2", - "ext-pdo": "*", - "ocramius/package-versions": "^1.2", - "php": "^7.1", - "symfony/console": "^3.0|^4.0|^5.0" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "phpunit/phpunit": "^7.5", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" - }, - "bin": [ - "bin/doctrine" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\ORM\\": "lib/Doctrine/ORM" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "https://www.doctrine-project.org/projects/orm.html", - "keywords": [ - "database", - "orm" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine/orm", - "type": "tidelift" - } - ], - "time": "2020-03-19T06:41:02+00:00" - }, - { - "name": "doctrine/persistence", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/persistence.git", - "reference": "43526ae63312942e5316100bb3ed589ba1aba491" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/43526ae63312942e5316100bb3ed589ba1aba491", - "reference": "43526ae63312942e5316100bb3ed589ba1aba491", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.0", - "php": "^7.1" - }, - "conflict": { - "doctrine/common": "<2.10@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "phpstan/phpstan": "^0.8", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://doctrine-project.org/projects/persistence.html", - "keywords": [ - "mapper", - "object", - "odm", - "orm", - "persistence" - ], - "time": "2019-04-23T12:39:21+00:00" - }, - { - "name": "doctrine/reflection", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/reflection.git", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "ext-tokenizer": "*", - "php": "^7.1" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "doctrine/common": "^2.10", - "phpstan/phpstan": "^0.11.0", - "phpstan/phpstan-phpunit": "^0.11.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", - "homepage": "https://www.doctrine-project.org/projects/reflection.html", - "keywords": [ - "reflection", - "static" - ], - "time": "2020-03-27T11:06:43+00:00" - }, - { - "name": "evenement/evenement", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Evenement": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - } - ], - "description": "Événement is a very simple event dispatching library for PHP", - "keywords": [ - "event-dispatcher", - "event-emitter" - ], - "time": "2017-07-23T21:35:13+00:00" - }, - { - "name": "firebase/php-jwt", - "version": "v5.2.0", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", - "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": ">=4.8 <=9" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "keywords": [ - "jwt", - "php" - ], - "time": "2020-03-25T18:49:23+00:00" - }, - { - "name": "google/auth", - "version": "v1.13.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "173191f5defd1d9ae8bdfc28da31b63eb73dd34e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/173191f5defd1d9ae8bdfc28da31b63eb73dd34e", - "reference": "173191f5defd1d9ae8bdfc28da31b63eb73dd34e", - "shasum": "" - }, - "require": { - "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", - "guzzlehttp/guzzle": "^5.3.1|^6.2.1|^7.0", - "guzzlehttp/psr7": "^1.2", - "php": ">=5.4", - "psr/cache": "^1.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "guzzlehttp/promises": "0.1.1|^1.3", - "kelvinmo/simplejwt": "^0.2.5", - "phpseclib/phpseclib": "^2", - "phpunit/phpunit": "^4.8.36|^5.7", - "sebastian/comparator": ">=1.2.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "suggest": { - "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\Auth\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google Auth Library for PHP", - "homepage": "http://github.com/google/google-auth-library-php", - "keywords": [ - "Authentication", - "google", - "oauth2" - ], - "time": "2020-09-18T20:03:05+00:00" - }, - { - "name": "google/cloud-core", - "version": "v1.39.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "f9e7421beac89fd7d9006a13a6b39b89dd86c92e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/f9e7421beac89fd7d9006a13a6b39b89dd86c92e", - "reference": "f9e7421beac89fd7d9006a13a6b39b89dd86c92e", - "shasum": "" - }, - "require": { - "google/auth": "^1.6", - "guzzlehttp/guzzle": "^5.3|^6.0|^7.0", - "guzzlehttp/promises": "^1.3", - "guzzlehttp/psr7": "^1.2", - "monolog/monolog": "^1.1|^2.0", - "php": ">=5.5", - "psr/http-message": "1.0.*", - "rize/uri-template": "~0.3" - }, - "require-dev": { - "erusev/parsedown": "^1.6", - "google/common-protos": "^1.0", - "google/gax": "^1.1", - "opis/closure": "^3", - "phpdocumentor/reflection": "^3.0", - "phpunit/phpunit": "^4.8|^5.0", - "squizlabs/php_codesniffer": "2.*" - }, - "suggest": { - "opis/closure": "May be used to serialize closures to process jobs in the batch daemon. Please require version ^3.", - "symfony/lock": "Required for the Spanner cached based session pool. Please require the following commit: 3.3.x-dev#1ba6ac9" - }, - "bin": [ - "bin/google-cloud-batch" - ], - "type": "library", - "extra": { - "component": { - "id": "cloud-core", - "target": "googleapis/google-cloud-php-core.git", - "path": "Core", - "entry": "src/ServiceBuilder.php" - } - }, - "autoload": { - "psr-4": { - "Google\\Cloud\\Core\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", - "time": "2020-09-08T20:52:20+00:00" - }, - { - "name": "google/cloud-pubsub", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-cloud-php-pubsub.git", - "reference": "4e11e9ecbaeb5a3a546f36e7b0e3c171c71cb987" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-pubsub/zipball/4e11e9ecbaeb5a3a546f36e7b0e3c171c71cb987", - "reference": "4e11e9ecbaeb5a3a546f36e7b0e3c171c71cb987", - "shasum": "" - }, - "require": { - "google/cloud-core": "^1.39", - "google/gax": "^1.1" - }, - "require-dev": { - "erusev/parsedown": "^1.6", - "phpdocumentor/reflection": "^3.0", - "phpunit/phpunit": "^4.8|^5.0", - "squizlabs/php_codesniffer": "2.*" - }, - "suggest": { - "ext-grpc": "The gRPC extension enables use of the performant gRPC transport", - "ext-protobuf": "Provides a significant increase in throughput over the pure PHP protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions." - }, - "type": "library", - "extra": { - "component": { - "id": "cloud-pubsub", - "target": "googleapis/google-cloud-php-pubsub.git", - "path": "PubSub", - "entry": "src/PubSubClient.php" - } - }, - "autoload": { - "psr-4": { - "Google\\Cloud\\PubSub\\": "src", - "GPBMetadata\\Google\\Pubsub\\": "metadata" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Cloud PubSub Client for PHP", - "time": "2020-09-22T23:22:32+00:00" - }, - { - "name": "google/common-protos", - "version": "1.3", - "source": { - "type": "git", - "url": "https://github.com/googleapis/common-protos-php.git", - "reference": "535f489ff1c3433c0ea64cd5aa0560f926949ac5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/535f489ff1c3433c0ea64cd5aa0560f926949ac5", - "reference": "535f489ff1c3433c0ea64cd5aa0560f926949ac5", - "shasum": "" - }, - "require": { - "google/protobuf": "^3.6.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36", - "sami/sami": "*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\": "src", - "GPBMetadata\\Google\\": "metadata" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google API Common Protos for PHP", - "homepage": "https://github.com/googleapis/common-protos-php", - "keywords": [ - "google" - ], - "time": "2020-08-26T16:05:09+00:00" - }, - { - "name": "google/gax", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/gax-php.git", - "reference": "63ea951e70557bb851bf6b487d65698410a6aa96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/gax-php/zipball/63ea951e70557bb851bf6b487d65698410a6aa96", - "reference": "63ea951e70557bb851bf6b487d65698410a6aa96", - "shasum": "" - }, - "require": { - "google/auth": "^1.2.0", - "google/common-protos": "^1.0", - "google/grpc-gcp": "^0.1.0", - "google/protobuf": "^3.12.2", - "grpc/grpc": "^1.13", - "guzzlehttp/promises": "^1.3", - "guzzlehttp/psr7": "^1.2", - "php": ">=5.5" - }, - "conflict": { - "ext-protobuf": "<3.7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36", - "sami/sami": "*", - "squizlabs/php_codesniffer": "3.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\ApiCore\\": "src", - "GPBMetadata\\Google\\": "metadata" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Google API Core for PHP", - "homepage": "https://github.com/googleapis/gax-php", - "keywords": [ - "google" - ], - "time": "2020-09-16T17:29:29+00:00" - }, - { - "name": "google/grpc-gcp", - "version": "0.1.5", - "source": { - "type": "git", - "url": "https://github.com/GoogleCloudPlatform/grpc-gcp-php.git", - "reference": "bb9bdbf62f6ae4e73d5209d85b1d0a0b9855ff36" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/bb9bdbf62f6ae4e73d5209d85b1d0a0b9855ff36", - "reference": "bb9bdbf62f6ae4e73d5209d85b1d0a0b9855ff36", - "shasum": "" - }, - "require": { - "google/auth": "^1.3", - "google/protobuf": "^v3.3.0", - "grpc/grpc": "^v1.13.0", - "php": ">=5.5.0", - "psr/cache": "^1.0.1" - }, - "require-dev": { - "google/cloud-spanner": "^1.7", - "phpunit/phpunit": "4.8.36" - }, - "type": "library", - "autoload": { - "psr-4": { - "Grpc\\Gcp\\": "src/" - }, - "classmap": [ - "src/generated/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "gRPC GCP library for channel management", - "time": "2020-05-26T17:21:09+00:00" - }, - { - "name": "google/protobuf", - "version": "v3.13.0", - "source": { - "type": "git", - "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "fddc6c2439b190284f207143f6d37bf5b651cea6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/fddc6c2439b190284f207143f6d37bf5b651cea6", - "reference": "fddc6c2439b190284f207143f6d37bf5b651cea6", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": ">=4.8.0" - }, - "suggest": { - "ext-bcmath": "Need to support JSON deserialization" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\Protobuf\\": "src/Google/Protobuf", - "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "proto library for PHP", - "homepage": "https://developers.google.com/protocol-buffers/", - "keywords": [ - "proto" - ], - "time": "2020-08-15T00:44:58+00:00" - }, - { - "name": "grpc/grpc", - "version": "1.30.0", - "source": { - "type": "git", - "url": "https://github.com/grpc/grpc-php.git", - "reference": "31952d18884d91c674b73f8b4da831f708706f20" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/grpc/grpc-php/zipball/31952d18884d91c674b73f8b4da831f708706f20", - "reference": "31952d18884d91c674b73f8b4da831f708706f20", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "google/auth": "^v1.3.0" - }, - "suggest": { - "ext-protobuf": "For better performance, install the protobuf C extension.", - "google/protobuf": "To get started using grpc quickly, install the native protobuf library." - }, - "type": "library", - "autoload": { - "psr-4": { - "Grpc\\": "src/lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "gRPC library for PHP", - "homepage": "https://grpc.io/", - "keywords": [ - "rpc" - ], - "time": "2020-06-23T01:49:02+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.5.5", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2020-06-16T21:01:06+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" - }, - "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "time": "2019-07-01T23:21:34+00:00" - }, - { - "name": "influxdb/influxdb-php", - "version": "1.15.1", - "source": { - "type": "git", - "url": "https://github.com/influxdata/influxdb-php.git", - "reference": "447acb600969f9510c9f1900a76d442fc3537b0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/influxdata/influxdb-php/zipball/447acb600969f9510c9f1900a76d442fc3537b0e", - "reference": "447acb600969f9510c9f1900a76d442fc3537b0e", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^6.0|^7.0", - "php": "^5.5 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7" - }, - "suggest": { - "ext-curl": "Curl extension, needed for Curl driver", - "stefanotorresi/influxdb-php-async": "An asyncronous client for InfluxDB, implemented via ReactPHP." - }, - "type": "library", - "autoload": { - "psr-4": { - "InfluxDB\\": "src/InfluxDB" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stephen Hoogendijk", - "email": "stephen@tca0.nl" - }, - { - "name": "Daniel Martinez", - "email": "danimartcas@hotmail.com" - }, - { - "name": "Gianluca Arbezzano", - "email": "gianarb92@gmail.com" - } - ], - "description": "InfluxDB client library for PHP", - "keywords": [ - "client", - "influxdata", - "influxdb", - "influxdb class", - "influxdb client", - "influxdb library", - "time series" - ], - "time": "2020-09-18T13:24:03+00:00" - }, - { - "name": "makasim/temp-file", - "version": "0.2.0", - "source": { - "type": "git", - "url": "https://github.com/makasim/TempFile.git", - "reference": "e9cfbfc61a23044aeb2fe0a3db49aeec2f84ca27" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/makasim/TempFile/zipball/e9cfbfc61a23044aeb2fe0a3db49aeec2f84ca27", - "reference": "e9cfbfc61a23044aeb2fe0a3db49aeec2f84ca27", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "Makasim": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maksim Kotlyar", - "email": "kotlyar.maksim@gmail.com" - } - ], - "description": "Temp file object", - "homepage": "https://github.com/makasim/TempFile", - "keywords": [ - "file", - "temp", - "temp file" - ], - "time": "2013-07-12T06:09:04+00:00" - }, - { - "name": "mongodb/mongodb", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/mongodb/mongo-php-library.git", - "reference": "18fca8cc8d0c2cc07f76605760d20632bb3dab96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/18fca8cc8d0c2cc07f76605760d20632bb3dab96", - "reference": "18fca8cc8d0c2cc07f76605760d20632bb3dab96", - "shasum": "" - }, - "require": { - "ext-hash": "*", - "ext-json": "*", - "ext-mongodb": "^1.5.0", - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^6.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "MongoDB\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Jeremy Mikola", - "email": "jmikola@gmail.com" - }, - { - "name": "Derick Rethans", - "email": "github@derickrethans.nl" - }, - { - "name": "Katherine Walker", - "email": "katherine.walker@mongodb.com" - } - ], - "description": "MongoDB driver library", - "homepage": "https://jira.mongodb.org/browse/PHPLIB", - "keywords": [ - "database", - "driver", - "mongodb", - "persistence" - ], - "time": "2019-07-02T18:04:14+00:00" - }, - { - "name": "monolog/monolog", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f9eee5cec93dfb313a38b6b288741e84e53f02d5", - "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/log": "^1.0.1" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^6.0", - "graylog2/gelf-php": "^1.4.2", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "php-parallel-lint/php-parallel-lint": "^1.0", - "phpspec/prophecy": "^1.6.1", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90 <3.0", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be/" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2020-07-23T08:41:23+00:00" - }, - { - "name": "mtdowling/jmespath.php", - "version": "2.6.0", - "source": { - "type": "git", - "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb", - "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb", - "shasum": "" - }, - "require": { - "php": "^5.4 || ^7.0 || ^8.0", - "symfony/polyfill-mbstring": "^1.17" - }, - "require-dev": { - "composer/xdebug-handler": "^1.4", - "phpunit/phpunit": "^4.8.36 || ^7.5.15" - }, - "bin": [ - "bin/jp.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-4": { - "JmesPath\\": "src/" - }, - "files": [ - "src/JmesPath.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Declaratively specify how to extract elements from a JSON document", - "keywords": [ - "json", - "jsonpath" - ], - "time": "2020-07-31T21:01:56+00:00" - }, - { - "name": "ocramius/package-versions", - "version": "1.9.0", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "94c9d42a466c57f91390cdd49c81313264f49d85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/94c9d42a466c57f91390cdd49c81313264f49d85", - "reference": "94c9d42a466c57f91390cdd49c81313264f49d85", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7.4.0" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "doctrine/coding-standard": "^7.0.2", - "ext-zip": "^1.15.0", - "infection/infection": "^0.15.3", - "phpunit/phpunit": "^9.1.1", - "vimeo/psalm": "^3.9.3" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.99.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/package-versions", - "type": "tidelift" - } - ], - "time": "2020-06-22T14:15:44+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.99", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "shasum": "" - }, - "require": { - "php": "^7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com/" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "time": "2018-07-02T15:55:56+00:00" - }, - { - "name": "pda/pheanstalk", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/pda/pheanstalk.git", - "reference": "57b6e76f1b06ca798e739a8dee92c2dac04fd170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pda/pheanstalk/zipball/57b6e76f1b06ca798e739a8dee92c2dac04fd170", - "reference": "57b6e76f1b06ca798e739a8dee92c2dac04fd170", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "psr-4": { - "Pheanstalk\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paul Annesley", - "email": "paul@annesley.cc", - "homepage": "http://paul.annesley.cc/", - "role": "Developer" - } - ], - "description": "PHP client for beanstalkd queue", - "homepage": "https://github.com/pda/pheanstalk", - "keywords": [ - "beanstalkd" - ], - "time": "2018-09-19T12:16:28+00:00" - }, - { - "name": "php-amqplib/php-amqplib", - "version": "v2.12.1", - "source": { - "type": "git", - "url": "https://github.com/php-amqplib/php-amqplib.git", - "reference": "0eaaa9d5d45335f4342f69603288883388c2fe21" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/0eaaa9d5d45335f4342f69603288883388c2fe21", - "reference": "0eaaa9d5d45335f4342f69603288883388c2fe21", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "ext-sockets": "*", - "php": ">=5.6.3", - "phpseclib/phpseclib": "^2.0.0" - }, - "conflict": { - "php": "7.4.0 - 7.4.1" - }, - "replace": { - "videlalvaro/php-amqplib": "self.version" - }, - "require-dev": { - "ext-curl": "*", - "nategood/httpful": "^0.2.20", - "phpunit/phpunit": "^5.7|^6.5|^7.0", - "squizlabs/php_codesniffer": "^2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.12-dev" - } - }, - "autoload": { - "psr-4": { - "PhpAmqpLib\\": "PhpAmqpLib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Alvaro Videla", - "role": "Original Maintainer" - }, - { - "name": "Raúl Araya", - "email": "nubeiro@gmail.com", - "role": "Maintainer" - }, - { - "name": "Luke Bakken", - "email": "luke@bakken.io", - "role": "Maintainer" - }, - { - "name": "Ramūnas Dronga", - "email": "github@ramuno.lt", - "role": "Maintainer" - } - ], - "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", - "homepage": "https://github.com/php-amqplib/php-amqplib/", - "keywords": [ - "message", - "queue", - "rabbitmq" - ], - "time": "2020-09-25T18:34:58+00:00" - }, - { - "name": "php-http/client-common", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "c0390ae3c8f2ae9d50901feef0127fb9e396f6b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/c0390ae3c8f2ae9d50901feef0127fb9e396f6b4", - "reference": "c0390ae3c8f2ae9d50901feef0127fb9e396f6b4", - "shasum": "" - }, - "require": { - "php": "^5.4 || ^7.0", - "php-http/httplug": "^1.1", - "php-http/message": "^1.6", - "php-http/message-factory": "^1.0", - "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0" - }, - "require-dev": { - "guzzlehttp/psr7": "^1.4", - "phpspec/phpspec": "^2.5 || ^3.4 || ^4.2" - }, - "suggest": { - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10.x-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Client\\Common\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io/", - "keywords": [ - "client", - "common", - "http", - "httplug" - ], - "time": "2019-11-18T08:54:36+00:00" - }, - { - "name": "php-http/discovery", - "version": "1.12.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "4366bf1bc39b663aa87459bd725501d2f1988b6c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/4366bf1bc39b663aa87459bd725501d2f1988b6c", - "reference": "4366bf1bc39b663aa87459bd725501d2f1988b6c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0" - }, - "require-dev": { - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1", - "puli/composer-plugin": "1.0.0-beta10" - }, - "suggest": { - "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", - "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Discovery\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Finds installed HTTPlug implementations and PSR-7 message factories", - "homepage": "http://php-http.org/", - "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr7" - ], - "time": "2020-09-22T13:31:04+00:00" - }, - { - "name": "php-http/guzzle6-adapter", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/guzzle6-adapter.git", - "reference": "a56941f9dc6110409cfcddc91546ee97039277ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/a56941f9dc6110409cfcddc91546ee97039277ab", - "reference": "a56941f9dc6110409cfcddc91546ee97039277ab", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^6.0", - "php": ">=5.5.0", - "php-http/httplug": "^1.0" - }, - "provide": { - "php-http/async-client-implementation": "1.0", - "php-http/client-implementation": "1.0" - }, - "require-dev": { - "ext-curl": "*", - "php-http/adapter-integration-tests": "^0.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Adapter\\Guzzle6\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - }, - { - "name": "David de Boer", - "email": "david@ddeboer.nl" - } - ], - "description": "Guzzle 6 HTTP Adapter", - "homepage": "http://httplug.io/", - "keywords": [ - "Guzzle", - "http" - ], - "time": "2016-05-10T06:13:32+00:00" - }, - { - "name": "php-http/httplug", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/1c6381726c18579c4ca2ef1ec1498fdae8bdf018", - "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "php-http/promise": "^1.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "henrikbjorn/phpspec-code-coverage": "^1.0", - "phpspec/phpspec": "^2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io/", - "keywords": [ - "client", - "http" - ], - "time": "2016-08-31T08:30:17+00:00" - }, - { - "name": "php-http/message", - "version": "1.9.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "2c7256e3c1aba0bfca70f099810f1c7712e00945" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/2c7256e3c1aba0bfca70f099810f1c7712e00945", - "reference": "2c7256e3c1aba0bfca70f099810f1c7712e00945", - "shasum": "" - }, - "require": { - "clue/stream-filter": "^1.4.1", - "php": "^7.1", - "php-http/message-factory": "^1.0.2", - "psr/http-message": "^1.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" - }, - "require-dev": { - "akeneo/phpspec-skip-example-extension": "^1.0", - "coduo/phpspec-data-provider-extension": "^1.0", - "ergebnis/composer-normalize": "^2.1", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0", - "henrikbjorn/phpspec-code-coverage": "^1.0", - "phpspec/phpspec": "^2.4", - "slim/slim": "^3.0", - "zendframework/zend-diactoros": "^1.0" - }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation", - "zendframework/zend-diactoros": "Used with Diactoros Factories" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Message\\": "src/" - }, - "files": [ - "src/filters.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org/", - "keywords": [ - "http", - "message", - "psr-7" - ], - "time": "2020-08-17T06:33:14+00:00" - }, - { - "name": "php-http/message-factory", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-http/message-factory.git", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Factory interfaces for PSR-7 HTTP Message", - "homepage": "http://php-http.org/", - "keywords": [ - "factory", - "http", - "message", - "stream", - "uri" - ], - "time": "2015-12-19T14:08:53+00:00" - }, - { - "name": "php-http/promise", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io/", - "keywords": [ - "promise" - ], - "time": "2020-07-07T09:29:14+00:00" - }, - { - "name": "phpseclib/phpseclib", - "version": "2.0.29", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "497856a8d997f640b4a516062f84228a772a48a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/497856a8d997f640b4a516062f84228a772a48a8", - "reference": "497856a8d997f640b4a516062f84228a772a48a8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net/", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ], - "time": "2020-09-08T04:24:43+00:00" - }, - { - "name": "predis/predis", - "version": "v1.1.6", - "source": { - "type": "git", - "url": "https://github.com/predis/predis.git", - "reference": "9930e933c67446962997b05201c69c2319bf26de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/9930e933c67446962997b05201c69c2319bf26de", - "reference": "9930e933c67446962997b05201c69c2319bf26de", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "cweagans/composer-patches": "^1.6", - "phpunit/phpunit": "~4.8" - }, - "suggest": { - "ext-curl": "Allows access to Webdis when paired with phpiredis", - "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" - }, - "type": "library", - "extra": { - "composer-exit-on-patch-failure": true, - "patches": { - "phpunit/phpunit-mock-objects": { - "Fix PHP 7 and 8 compatibility": "./tests/phpunit_mock_objects.patch" - }, - "phpunit/phpunit": { - "Fix PHP 7 compatibility": "./tests/phpunit_php7.patch", - "Fix PHP 8 compatibility": "./tests/phpunit_php8.patch" - } - } - }, - "autoload": { - "psr-4": { - "Predis\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniele Alessandri", - "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net/", - "role": "Creator & Maintainer" - }, - { - "name": "Till Krüss", - "homepage": "https://till.im/", - "role": "Maintainer" - } - ], - "description": "Flexible and feature-complete Redis client for PHP and HHVM", - "homepage": "http://github.com/predis/predis", - "keywords": [ - "nosql", - "predis", - "redis" - ], - "funding": [ - { - "url": "https://github.com/sponsors/tillkruss", - "type": "github" - } - ], - "time": "2020-09-11T19:18:05+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "queue-interop/amqp-interop", - "version": "0.8.1", - "source": { - "type": "git", - "url": "https://github.com/queue-interop/amqp-interop.git", - "reference": "2029c3b3b9f10cc1c0a219650f66ab68fcfe656d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/queue-interop/amqp-interop/zipball/2029c3b3b9f10cc1c0a219650f66ab68fcfe656d", - "reference": "2029c3b3b9f10cc1c0a219650f66ab68fcfe656d", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8" - }, - "require-dev": { - "phpunit/phpunit": "~5.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.8.x-dev" - } - }, - "autoload": { - "psr-4": { - "Interop\\Amqp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "time": "2018-12-13T13:42:47+00:00" - }, - { - "name": "queue-interop/queue-interop", - "version": "0.8.0", - "source": { - "type": "git", - "url": "https://github.com/queue-interop/queue-interop.git", - "reference": "b43af85f635439fa2c9a6d8fd486489da4869741" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/queue-interop/queue-interop/zipball/b43af85f635439fa2c9a6d8fd486489da4869741", - "reference": "b43af85f635439fa2c9a6d8fd486489da4869741", - "shasum": "" - }, - "require": { - "php": "^7.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^5.5", - "queue-interop/queue-spec": "^0.6@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.7-dev" - } - }, - "autoload": { - "psr-4": { - "Interop\\Queue\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Promoting the interoperability of MQs objects. Based on Java JMS", - "homepage": "https://github.com/queue-interop/queue-interop", - "keywords": [ - "MQ", - "jms", - "message queue", - "messaging", - "queue" - ], - "time": "2018-11-22T17:53:21+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "ramsey/collection", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/ramsey/collection.git", - "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/24d93aefb2cd786b7edd9f45b554aea20b28b9b1", - "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8" - }, - "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fzaninotto/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.6", - "mockery/mockery": "^1.3", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^3.12.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ramsey\\Collection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com/" - } - ], - "description": "A PHP 7.2+ library for representing and manipulating collections.", - "keywords": [ - "array", - "collection", - "hash", - "map", - "queue", - "set" - ], - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - } - ], - "time": "2020-09-10T20:58:17+00:00" - }, - { - "name": "ramsey/uuid", - "version": "4.1.1", - "source": { - "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "cd4032040a750077205918c86049aa0f43d22947" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947", - "reference": "cd4032040a750077205918c86049aa0f43d22947", - "shasum": "" - }, - "require": { - "brick/math": "^0.8 || ^0.9", - "ext-json": "*", - "php": "^7.2 || ^8", - "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8" - }, - "replace": { - "rhumsaa/uuid": "self.version" - }, - "require-dev": { - "codeception/aspect-mock": "^3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0", - "doctrine/annotations": "^1.8", - "goaop/framework": "^2", - "mockery/mockery": "^1.3", - "moontoast/math": "^1.1", - "paragonie/random-lib": "^2", - "php-mock/php-mock-mockery": "^1.3", - "php-mock/php-mock-phpunit": "^2.5", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^0.17.1", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5", - "psy/psysh": "^0.10.0", - "slevomat/coding-standard": "^6.0", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "3.9.4" - }, - "suggest": { - "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-ctype": "Enables faster processing of character classification using ctype functions.", - "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", - "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", - "homepage": "https://github.com/ramsey/uuid", - "keywords": [ - "guid", - "identifier", - "uuid" - ], - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - } - ], - "time": "2020-08-18T17:17:46+00:00" - }, - { - "name": "ratchet/pawl", - "version": "v0.3.5", - "source": { - "type": "git", - "url": "https://github.com/ratchetphp/Pawl.git", - "reference": "89ec703c76dc893484a2a0ed44b48a37d445abd5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ratchetphp/Pawl/zipball/89ec703c76dc893484a2a0ed44b48a37d445abd5", - "reference": "89ec703c76dc893484a2a0ed44b48a37d445abd5", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0", - "php": ">=5.4", - "ratchet/rfc6455": "^0.3", - "react/socket": "^1.0 || ^0.8 || ^0.7" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "suggest": { - "reactivex/rxphp": "~2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ratchet\\Client\\": "src" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Asynchronous WebSocket client", - "keywords": [ - "Ratchet", - "async", - "client", - "websocket", - "websocket client" - ], - "time": "2020-07-17T15:32:47+00:00" - }, - { - "name": "ratchet/rfc6455", - "version": "v0.3", - "source": { - "type": "git", - "url": "https://github.com/ratchetphp/RFC6455.git", - "reference": "c8651c7938651c2d55f5d8c2422ac5e57a183341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ratchetphp/RFC6455/zipball/c8651c7938651c2d55f5d8c2422ac5e57a183341", - "reference": "c8651c7938651c2d55f5d8c2422ac5e57a183341", - "shasum": "" - }, - "require": { - "guzzlehttp/psr7": "^1.0", - "php": ">=5.4.2" - }, - "require-dev": { - "phpunit/phpunit": "5.7.*", - "react/socket": "^1.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ratchet\\RFC6455\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "role": "Developer" - }, - { - "name": "Matt Bonneau", - "role": "Developer" - } - ], - "description": "RFC6455 WebSocket protocol handler", - "homepage": "http://socketo.me/", - "keywords": [ - "WebSockets", - "rfc6455", - "websocket" - ], - "time": "2020-05-15T18:31:24+00:00" - }, - { - "name": "react/cache", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/44a568925556b0bd8cacc7b49fb0f1cf0d706a0c", - "reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "react/promise": "^3.0 || ^2.0 || ^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async, Promise-based cache interface for ReactPHP", - "keywords": [ - "cache", - "caching", - "promise", - "reactphp" - ], - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2020-09-18T12:12:35+00:00" - }, - { - "name": "react/dns", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/665260757171e2ab17485b44e7ffffa7acb6ca1f", - "reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.0 || ^0.5", - "react/promise": "^3.0 || ^2.7 || ^1.2.1", - "react/promise-timer": "^1.2" - }, - "require-dev": { - "clue/block-react": "^1.2", - "phpunit/phpunit": "^9.3 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Dns\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async DNS resolver for ReactPHP", - "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" - ], - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2020-09-18T12:12:55+00:00" - }, - { - "name": "react/event-loop", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "6d24de090cd59cfc830263cfba965be77b563c13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6d24de090cd59cfc830263cfba965be77b563c13", - "reference": "6d24de090cd59cfc830263cfba965be77b563c13", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35" - }, - "suggest": { - "ext-event": "~1.0 for ExtEventLoop", - "ext-pcntl": "For signal handling support when using the StreamSelectLoop", - "ext-uv": "* for ExtUvLoop" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\EventLoop\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", - "keywords": [ - "asynchronous", - "event-loop" - ], - "time": "2020-01-01T18:39:52+00:00" - }, - { - "name": "react/promise", - "version": "v2.8.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "time": "2020-05-12T15:16:56+00:00" - }, - { - "name": "react/promise-timer", - "version": "v1.6.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise-timer.git", - "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/daee9baf6ef30c43ea4c86399f828bb5f558f6e6", - "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", - "react/promise": "^3.0 || ^2.7.0 || ^1.2.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.0 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Promise\\Timer\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@lueck.tv" - } - ], - "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", - "homepage": "https://github.com/reactphp/promise-timer", - "keywords": [ - "async", - "event-loop", - "promise", - "reactphp", - "timeout", - "timer" - ], - "time": "2020-07-10T12:18:06+00:00" - }, - { - "name": "react/socket", - "version": "v1.6.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/e2b96b23a13ca9b41ab343268dbce3f8ef4d524a", - "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/dns": "^1.1", - "react/event-loop": "^1.0 || ^0.5", - "react/promise": "^2.6.0 || ^1.2.1", - "react/promise-timer": "^1.4.0", - "react/stream": "^1.1" - }, - "require-dev": { - "clue/block-react": "^1.2", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react/promise-stream": "^1.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Socket\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", - "keywords": [ - "Connection", - "Socket", - "async", - "reactphp", - "stream" - ], - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2020-08-28T12:49:05+00:00" - }, - { - "name": "react/stream", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/7c02b510ee3f582c810aeccd3a197b9c2f52ff1a", - "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5" - }, - "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Stream\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", - "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" - ], - "time": "2020-05-04T10:17:57+00:00" - }, - { - "name": "richardfullmer/rabbitmq-management-api", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/richardfullmer/php-rabbitmq-management-api.git", - "reference": "3bab8bba3b7e76bd3b4c1b3f1b645894b6ce8009" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/richardfullmer/php-rabbitmq-management-api/zipball/3bab8bba3b7e76bd3b4c1b3f1b645894b6ce8009", - "reference": "3bab8bba3b7e76bd3b4c1b3f1b645894b6ce8009", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "php-http/client-common": "^1.0", - "php-http/client-implementation": "^1.0", - "php-http/discovery": "^1.0", - "php-http/httplug": "^1.0", - "php-http/message-factory": "^1.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "RabbitMq\\ManagementApi\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Richard Fullmer", - "email": "richardfullmer@gmail.com", - "homepage": "https://github.com/richardfullmer" - } - ], - "description": "An object oriented wrapper for the RabbitMQ Management HTTP Api", - "homepage": "https://github.com/richardfullmer/php-rabbitmq-management-api", - "keywords": [ - "message queue", - "rabbitmq", - "rest" - ], - "time": "2016-10-18T17:33:33+00:00" - }, - { - "name": "rize/uri-template", - "version": "0.3.2", - "source": { - "type": "git", - "url": "https://github.com/rize/UriTemplate.git", - "reference": "9e5fdd5c47147aa5adf7f760002ee591ed37b9ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rize/UriTemplate/zipball/9e5fdd5c47147aa5adf7f760002ee591ed37b9ca", - "reference": "9e5fdd5c47147aa5adf7f760002ee591ed37b9ca", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Rize\\UriTemplate": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marut K", - "homepage": "http://twitter.com/rezigned" - } - ], - "description": "PHP URI Template (RFC 6570) supports both expansion & extraction", - "keywords": [ - "RFC 6570", - "template", - "uri" - ], - "time": "2017-06-14T03:57:53+00:00" - }, - { - "name": "stomp-php/stomp-php", - "version": "4.6.1", - "source": { - "type": "git", - "url": "https://github.com/stomp-php/stomp-php.git", - "reference": "d55ba2b2c3ce0e3074b3aa15de1151fd13bb84e4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/stomp-php/stomp-php/zipball/d55ba2b2c3ce0e3074b3aa15de1151fd13bb84e4", - "reference": "d55ba2b2c3ce0e3074b3aa15de1151fd13bb84e4", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Stomp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Dejan Bosnanac", - "email": "dejan@nighttale.net", - "homepage": "http://www.nighttale.net/" - }, - { - "name": "Sören Rohweder", - "email": "s.rohweder@blage.net", - "homepage": "http://www.monofone.de/" - }, - { - "name": "Jens Radtke", - "email": "swefl@fin-sn.de", - "homepage": "http://www.fin-sn.de/" - } - ], - "description": "stomp support for PHP", - "homepage": "http://github.com/stomp-php/stomp-php", - "keywords": [ - "activeMQ", - "apollomq", - "jms", - "messaging", - "rabbitmq", - "stomp" - ], - "funding": [ - { - "url": "https://github.com/jmglsn", - "type": "github" - }, - { - "url": "https://github.com/staabm", - "type": "github" - } - ], - "time": "2020-06-15T18:01:49+00:00" - }, - { - "name": "symfony/console", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "90933b39c7b312fc3ceaa1ddeac7eb48cb953124" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/90933b39c7b312fc3ceaa1ddeac7eb48cb953124", - "reference": "90933b39c7b312fc3ceaa1ddeac7eb48cb953124", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-15T07:58:55+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "4c7e155bf7d93ea4ba3824d5a14476694a5278dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4c7e155bf7d93ea4ba3824d5a14476694a5278dd", - "reference": "4c7e155bf7d93ea4ba3824d5a14476694a5278dd", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony OptionsResolver Component", - "homepage": "https://symfony.com/", - "keywords": [ - "config", - "configuration", - "options" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-27T03:44:28+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com/", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/5dcab1bc7146cf8c1beaa4502a3d9be344334251", - "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php70": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com/", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-08-04T06:02:08+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", - "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com/", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com/", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-php70", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", - "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", - "shasum": "" - }, - "require": { - "paragonie/random_compat": "~1.0|~2.0|~9.99", - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "homepage": "https://symfony.com/", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "639447d008615574653fb3bc60d1986d7172eaae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", - "reference": "639447d008615574653fb3bc60d1986d7172eaae", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com/", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", - "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com/", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "shasum": "" - }, - "require": { - "php": ">=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com/", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com/", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "thruway/client", - "version": "0.5.4", - "source": { - "type": "git", - "url": "https://github.com/thruway/client.git", - "reference": "532604ab58de1e271a368dae406685566c539c87" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thruway/client/zipball/532604ab58de1e271a368dae406685566c539c87", - "reference": "532604ab58de1e271a368dae406685566c539c87", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0", - "psr/log": "^1.0", - "react/event-loop": "^1.0 || ^0.5 || ^0.4.3", - "react/promise-timer": "^1.2.1", - "voryx/thruway-common": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.5.4", - "thruway/pawl-transport": "dev-master" - }, - "type": "library", - "autoload": { - "psr-4": { - "Thruway\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Bonneau", - "email": "matt@bonneau.net", - "role": "Developer" - }, - { - "name": "David Dan", - "email": "davidwdan@gmail.com", - "role": "Developer" - } - ], - "description": "Thruway WAMP client", - "keywords": [ - "Autobahn", - "WAMP", - "WAMP2", - "WebSockets", - "client" - ], - "time": "2018-04-09T12:18:12+00:00" - }, - { - "name": "thruway/pawl-transport", - "version": "0.5.1", - "source": { - "type": "git", - "url": "https://github.com/thruway/pawl-transport.git", - "reference": "fa297b4aaf74c59fe2fcb41963f55bfcfda70c98" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thruway/pawl-transport/zipball/fa297b4aaf74c59fe2fcb41963f55bfcfda70c98", - "reference": "fa297b4aaf74c59fe2fcb41963f55bfcfda70c98", - "shasum": "" - }, - "require": { - "ratchet/pawl": "^0.3.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Thruway\\Transport\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Bonneau", - "email": "matt@bonneau.net", - "role": "Developer" - }, - { - "name": "David Dan", - "email": "davidwdan@gmail.com", - "role": "Developer" - } - ], - "description": "Pawl WebSocket Transport for Thruway Client", - "keywords": [ - "Autobahn", - "WAMP", - "WAMP2", - "WebSockets", - "client", - "sockets", - "thruway" - ], - "time": "2019-07-04T14:58:36+00:00" - }, - { - "name": "voryx/thruway-common", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/voryx/ThruwayCommon.git", - "reference": "694adb0403c4267d1ea78a136da1cafc935d39b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voryx/ThruwayCommon/zipball/694adb0403c4267d1ea78a136da1cafc935d39b5", - "reference": "694adb0403c4267d1ea78a136da1cafc935d39b5", - "shasum": "" - }, - "replace": { - "voryx/thruway-message": "1.*" - }, - "require-dev": { - "phpunit/phpunit": "^5.5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Thruway\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Bonneau", - "email": "matt@bonneau.net", - "role": "Developer" - }, - { - "name": "David Dan", - "email": "davidwdan@gmail.com", - "role": "Developer" - } - ], - "description": "WAMP2 Common Library for Thruway", - "keywords": [ - "WAMP", - "WAMP2", - "thruway", - "wamp-proto" - ], - "time": "2019-01-18T15:59:32+00:00" - } - ], - "packages-dev": [ - { - "name": "alcaeus/mongo-php-adapter", - "version": "1.1.11", - "source": { - "type": "git", - "url": "https://github.com/alcaeus/mongo-php-adapter.git", - "reference": "43b6add94c8b4cb9890d662cba4c0defde733dcf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/alcaeus/mongo-php-adapter/zipball/43b6add94c8b4cb9890d662cba4c0defde733dcf", - "reference": "43b6add94c8b4cb9890d662cba4c0defde733dcf", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-hash": "*", - "ext-mongodb": "^1.2.0", - "mongodb/mongodb": "^1.0.1", - "php": "^5.6 || ^7.0" - }, - "provide": { - "ext-mongo": "1.6.14" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.27 || ^6.0 || ^7.0", - "squizlabs/php_codesniffer": "^3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "Mongo": "lib/Mongo" - }, - "psr-4": { - "Alcaeus\\MongoDbAdapter\\": "lib/Alcaeus/MongoDbAdapter" - }, - "files": [ - "lib/Mongo/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "alcaeus", - "email": "alcaeus@alcaeus.org" - }, - { - "name": "Olivier Lechevalier", - "email": "olivier.lechevalier@gmail.com" - } - ], - "description": "Adapter to provide ext-mongo interface on top of mongo-php-libary", - "keywords": [ - "database", - "mongodb" - ], - "time": "2019-11-11T20:47:32+00:00" - }, - { - "name": "composer/semver", - "version": "1.7.1", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "38276325bd896f90dfcfe30029aa5db40df387a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/38276325bd896f90dfcfe30029aa5db40df387a7", - "reference": "38276325bd896f90dfcfe30029aa5db40df387a7", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de/" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be/" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl/" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "funding": [ - { - "url": "https://packagist.com/", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-09-27T13:13:07+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ebd27a9866ae8254e873866f795491f02418c5a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ebd27a9866ae8254e873866f795491f02418c5a5", - "reference": "ebd27a9866ae8254e873866f795491f02418c5a5", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "funding": [ - { - "url": "https://packagist.com/", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-08-19T10:27:58+00:00" - }, - { - "name": "doctrine/doctrine-bundle", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "f96fac225563f5b3b4eeb2f80eb982b7f56484d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f96fac225563f5b3b4eeb2f80eb982b7f56484d8", - "reference": "f96fac225563f5b3b4eeb2f80eb982b7f56484d8", - "shasum": "" - }, - "require": { - "doctrine/dbal": "^2.9.0", - "jdorn/sql-formatter": "^1.2.16", - "php": "^7.1", - "symfony/cache": "^4.3.3|^5.0", - "symfony/config": "^4.3.3|^5.0", - "symfony/console": "^3.4.30|^4.3.3|^5.0", - "symfony/dependency-injection": "^4.3.3|^5.0", - "symfony/doctrine-bridge": "^4.3.7|^5.0", - "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0" - }, - "conflict": { - "doctrine/orm": "<2.6", - "twig/twig": "<1.34|>=2.0,<2.4" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "doctrine/orm": "^2.6", - "phpunit/phpunit": "^7.5", - "symfony/phpunit-bridge": "^4.2", - "symfony/property-info": "^4.3.3|^5.0", - "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", - "symfony/validator": "^3.4.30|^4.3.3|^5.0", - "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", - "symfony/yaml": "^3.4.30|^4.3.3|^5.0", - "twig/twig": "^1.34|^2.12" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "symfony/web-profiler-bundle": "To use the data collector." - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org/" - } - ], - "description": "Symfony DoctrineBundle", - "homepage": "http://www.doctrine-project.org/", - "keywords": [ - "database", - "dbal", - "orm", - "persistence" - ], - "time": "2019-11-28T08:38:10+00:00" - }, - { - "name": "doctrine/mongodb-odm", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/mongodb-odm.git", - "reference": "72ca04db10f68d3e6f442ab861add63ce6069670" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/mongodb-odm/zipball/72ca04db10f68d3e6f442ab861add63ce6069670", - "reference": "72ca04db10f68d3e6f442ab861add63ce6069670", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.6", - "doctrine/cache": "^1.7", - "doctrine/collections": "^1.5", - "doctrine/event-manager": "^1.0", - "doctrine/instantiator": "^1.1", - "doctrine/persistence": "^1.1", - "ext-mongodb": "^1.5", - "mongodb/mongodb": "^1.2.0", - "ocramius/proxy-manager": "^2.2", - "php": "^7.2", - "symfony/console": "^3.4|^4.1|^5.0", - "symfony/var-dumper": "^3.4|^4.1|^5.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "jmikola/geojson": "^1.0", - "phpbench/phpbench": "^0.13.0", - "phpstan/phpstan": "^0.10.3", - "phpunit/phpunit": "^8.2", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\ODM\\MongoDB\\": "lib/Doctrine/ODM/MongoDB" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bulat Shakirzyanov", - "email": "mallluhuct@gmail.com" - }, - { - "name": "Kris Wallsmith", - "email": "kris.wallsmith@gmail.com" - }, - { - "name": "Jonathan H. Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Jeremy Mikola", - "email": "jmikola@gmail.com" - }, - { - "name": "Maciej Malarz", - "email": "malarzm@gmail.com" - }, - { - "name": "Andreas Braun", - "email": "alcaeus@alcaeus.org" - } - ], - "description": "PHP Doctrine MongoDB Object Document Mapper (ODM) provides transparent persistence for PHP objects to MongoDB.", - "homepage": "https://www.doctrine-project.org/projects/mongodb-odm.html", - "keywords": [ - "data", - "mapper", - "mapping", - "mongodb", - "object", - "odm", - "php" - ], - "time": "2019-11-26T08:29:21+00:00" - }, - { - "name": "doctrine/mongodb-odm-bundle", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineMongoDBBundle.git", - "reference": "c27fefe5ff4cd1a25969b5d5695c9c36879b1b50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMongoDBBundle/zipball/c27fefe5ff4cd1a25969b5d5695c9c36879b1b50", - "reference": "c27fefe5ff4cd1a25969b5d5695c9c36879b1b50", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.2", - "doctrine/mongodb-odm": "^2.0.0", - "php": "^7.2", - "psr/log": "^1.0", - "symfony/config": "^4.3.3|^5.0", - "symfony/console": "^4.3.3|^5.0", - "symfony/dependency-injection": "^4.3.3|^5.0", - "symfony/doctrine-bridge": "^4.3.3|^5.0", - "symfony/framework-bundle": "^4.3.3|^5.0", - "symfony/http-kernel": "^4.3.7|^5.0", - "symfony/options-resolver": "^4.3.3|^5.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "doctrine/data-fixtures": "^1.2.2", - "phpunit/phpunit": "^7.3", - "squizlabs/php_codesniffer": "^3.5", - "symfony/form": "^4.3.3|^5.0", - "symfony/phpunit-bridge": "^4.3.3|^5.0", - "symfony/yaml": "^4.3.3|^5.0" - }, - "suggest": { - "doctrine/data-fixtures": "Load data fixtures" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "4.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\MongoDBBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bulat Shakirzyanov", - "email": "mallluhuct@gmail.com" - }, - { - "name": "Kris Wallsmith", - "email": "kris@symfony.com" - }, - { - "name": "Jonathan H. Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Symfony2 Doctrine MongoDB Bundle", - "homepage": "http://www.doctrine-project.org/", - "keywords": [ - "mongodb", - "persistence", - "symfony" - ], - "time": "2019-11-28T06:20:43+00:00" - }, - { - "name": "empi89/php-amqp-stubs", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/empi89/php-amqp-stubs.git", - "reference": "f8f402e81edf56871fa7192df01b8e47f29e2e13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/empi89/php-amqp-stubs/zipball/f8f402e81edf56871fa7192df01b8e47f29e2e13", - "reference": "f8f402e81edf56871fa7192df01b8e47f29e2e13", - "shasum": "" - }, - "require": { - "php": ">=5.1.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "": "src" - }, - "files": [ - "src/AMQP.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "PHP" - ], - "description": "pdezwart/php-amqp stubs via packagist", - "homepage": "http://github.com/empi89/php-amqp-stubs", - "keywords": [ - "AMQP", - "testing" - ], - "time": "2014-07-17T15:28:25+00:00" - }, - { - "name": "friendsofphp/php-cs-fixer", - "version": "v2.16.4", - "source": { - "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "1023c3458137ab052f6ff1e09621a721bfdeca13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/1023c3458137ab052f6ff1e09621a721bfdeca13", - "reference": "1023c3458137ab052f6ff1e09621a721bfdeca13", - "shasum": "" - }, - "require": { - "composer/semver": "^1.4", - "composer/xdebug-handler": "^1.2", - "doctrine/annotations": "^1.2", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^5.6 || ^7.0", - "php-cs-fixer/diff": "^1.3", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", - "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^3.0 || ^4.0 || ^5.0", - "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", - "symfony/polyfill-php70": "^1.0", - "symfony/polyfill-php72": "^1.4", - "symfony/process": "^3.0 || ^4.0 || ^5.0", - "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" - }, - "require-dev": { - "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", - "justinrainbow/json-schema": "^5.0", - "keradus/cli-executor": "^1.2", - "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.1", - "php-cs-fixer/accessible-object": "^1.0", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.1", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.1", - "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.1", - "phpunitgoodpractices/traits": "^1.8", - "symfony/phpunit-bridge": "^5.1", - "symfony/yaml": "^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters.", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", - "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." - }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", - "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - }, - "classmap": [ - "tests/Test/AbstractFixerTestCase.php", - "tests/Test/AbstractIntegrationCaseFactory.php", - "tests/Test/AbstractIntegrationTestCase.php", - "tests/Test/Assert/AssertTokensTrait.php", - "tests/Test/IntegrationCase.php", - "tests/Test/IntegrationCaseFactory.php", - "tests/Test/IntegrationCaseFactoryInterface.php", - "tests/Test/InternalIntegrationCaseFactory.php", - "tests/Test/IsIdenticalConstraint.php", - "tests/TestCase.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - } - ], - "description": "A tool to automatically fix PHP code style", - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "time": "2020-06-27T23:57:46+00:00" - }, - { - "name": "jdorn/sql-formatter", - "version": "v1.2.17", - "source": { - "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "lib" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "time": "2014-01-12T16:20:24+00:00" - }, - { - "name": "kwn/php-rdkafka-stubs", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/kwn/php-rdkafka-stubs.git", - "reference": "093852073707708d434cfd293c5df36719edc765" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kwn/php-rdkafka-stubs/zipball/093852073707708d434cfd293c5df36719edc765", - "reference": "093852073707708d434cfd293c5df36719edc765", - "shasum": "" - }, - "require": { - "ext-rdkafka": ">=3.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.2.4" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Karol Wnuk", - "email": "k.wnuk@ascetic.pl" - } - ], - "description": "Rdkafka extension stubs for your IDE", - "time": "2019-08-27T20:35:53+00:00" - }, - { - "name": "laminas/laminas-code", - "version": "3.4.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-code.git", - "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1cb8f203389ab1482bf89c0e70a04849bacd7766", - "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766", - "shasum": "" - }, - "require": { - "laminas/laminas-eventmanager": "^2.6 || ^3.0", - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.1" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" - }, - "replace": { - "zendframework/zend-code": "self.version" - }, - "require-dev": { - "doctrine/annotations": "^1.7", - "ext-phar": "*", - "laminas/laminas-coding-standard": "^1.0", - "laminas/laminas-stdlib": "^2.7 || ^3.0", - "phpunit/phpunit": "^7.5.16 || ^8.4" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev", - "dev-develop": "3.5.x-dev", - "dev-dev-4.0": "4.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laminas\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "homepage": "https://laminas.dev/", - "keywords": [ - "code", - "laminas" - ], - "time": "2019-12-31T16:28:24+00:00" - }, - { - "name": "laminas/laminas-eventmanager", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-eventmanager.git", - "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/1940ccf30e058b2fd66f5a9d696f1b5e0027b082", - "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082", - "shasum": "" - }, - "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.3 || ^8.0" - }, - "replace": { - "zendframework/zend-eventmanager": "^3.2.1" - }, - "require-dev": { - "container-interop/container-interop": "^1.1", - "laminas/laminas-coding-standard": "~1.0.0", - "laminas/laminas-stdlib": "^2.7.3 || ^3.0", - "phpbench/phpbench": "^0.17.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "container-interop/container-interop": "^1.1, to use the lazy listeners feature", - "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev", - "dev-develop": "3.4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laminas\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://laminas.dev/", - "keywords": [ - "event", - "eventmanager", - "events", - "laminas" - ], - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-08-25T11:10:44+00:00" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-09-14T14:23:00+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2020-06-29T13:22:24+00:00" - }, - { - "name": "ocramius/proxy-manager", - "version": "2.8.1", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "371c8f2d9d1e888ce1f8f2137d9187252b07ee94" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/371c8f2d9d1e888ce1f8f2137d9187252b07ee94", - "reference": "371c8f2d9d1e888ce1f8f2137d9187252b07ee94", - "shasum": "" - }, - "require": { - "laminas/laminas-code": "^3.4.1", - "ocramius/package-versions": "^1.8.0,<1.10.0", - "php": "~7.4.1", - "webimpress/safe-writer": "^2.0.1" - }, - "conflict": { - "doctrine/annotations": "<1.6.1", - "laminas/laminas-stdlib": "<3.2.1", - "zendframework/zend-stdlib": "<3.2.1" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0.0", - "ext-phar": "*", - "infection/infection": "^0.16.2", - "nikic/php-parser": "^4.4.0", - "phpbench/phpbench": "^0.17.0", - "phpunit/phpunit": "^9.1.1", - "slevomat/coding-standard": "^5.0.4", - "squizlabs/php_codesniffer": "^3.5.4", - "vimeo/psalm": "^3.11.1" - }, - "suggest": { - "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", - "laminas/laminas-soap": "To have the Soap adapter (Remote Object feature)", - "laminas/laminas-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)", - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "ProxyManager\\": "src/ProxyManager" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.io/" - } - ], - "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", - "homepage": "https://github.com/Ocramius/ProxyManager", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", - "type": "tidelift" - } - ], - "time": "2020-07-13T19:23:57+00:00" - }, - { - "name": "phar-io/manifest", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2018-07-08T19:23:20+00:00" - }, - { - "name": "phar-io/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" - }, - { - "name": "php-cs-fixer/diff", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756", - "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3", - "symfony/process": "^3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "SpacePossum" - } - ], - "description": "sebastian/diff v2 backport support for PHP5.6", - "homepage": "https://github.com/PHP-CS-Fixer", - "keywords": [ - "diff" - ], - "time": "2018-02-15T16:58:55+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org/", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-09-03T19:13:55+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-09-17T18:55:26+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "1.12.1", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com/" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2020-09-29T09:10:42+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "0.12.47", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "74325a6ae15378db0df71b969ded245378d2e058" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/74325a6ae15378db0df71b969ded245378d2e058", - "reference": "74325a6ae15378db0df71b969ded245378d2e058", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.12-dev" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpstan", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], - "time": "2020-09-29T13:35:39+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "6.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.1", - "phpunit/php-file-iterator": "^2.0", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1 || ^4.0", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "suggest": { - "ext-xdebug": "^2.6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2018-10-31T16:06:48+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2018-09-13T20:33:42+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "2.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2019-06-07T04:22:29+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "abandoned": true, - "time": "2019-09-17T06:23:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "7.5.20", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9467db479d1b0487c99733bb1e7944d32deded2c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c", - "reference": "9467db479d1b0487c99733bb1e7944d32deded2c", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "^1.7", - "phar-io/manifest": "^1.0.2", - "phar-io/version": "^2.0", - "php": "^7.1", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^6.0.7", - "phpunit/php-file-iterator": "^2.0.1", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1", - "sebastian/comparator": "^3.0", - "sebastian/diff": "^3.0", - "sebastian/environment": "^4.0", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpunit/phpunit-mock-objects": "*" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2020-01-08T08:45:45+00:00" - }, - { - "name": "queue-interop/queue-spec", - "version": "0.6.1", - "source": { - "type": "git", - "url": "https://github.com/queue-interop/queue-spec.git", - "reference": "f0414b8c98a31cf5ab09da0ef575836d457d898c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/queue-interop/queue-spec/zipball/f0414b8c98a31cf5ab09da0ef575836d457d898c", - "reference": "f0414b8c98a31cf5ab09da0ef575836d457d898c", - "shasum": "" - }, - "require": { - "queue-interop/queue-interop": "^0.7|^0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Interop\\Queue\\Spec\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "time": "2018-12-13T13:43:40+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "shasum": "" - }, - "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2018-07-12T15:12:46+00:00" - }, - { - "name": "sebastian/diff", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "time": "2019-02-04T06:01:07+00:00" - }, - { - "name": "sebastian/environment", - "version": "4.2.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2019-11-20T08:46:58+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2019-09-14T09:02:43+00:00" - }, - { - "name": "sebastian/global-state", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2017-04-27T15:39:26+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "symfony/browser-kit", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "4012fac896bf5c1ac435d8c5d98fa2163241dbcc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/4012fac896bf5c1ac435d8c5d98fa2163241dbcc", - "reference": "4012fac896bf5c1ac435d8c5d98fa2163241dbcc", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/dom-crawler": "^3.4|^4.0|^5.0" - }, - "require-dev": { - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/http-client": "^4.3|^5.0", - "symfony/mime": "^4.3|^5.0", - "symfony/process": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony BrowserKit Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-02T16:08:58+00:00" - }, - { - "name": "symfony/cache", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "72b4c2bfe8b40a0d7365943cfaaf1658217e2f69" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/72b4c2bfe8b40a0d7365943cfaaf1658217e2f69", - "reference": "72b4c2bfe8b40a0d7365943cfaaf1658217e2f69", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "~1.0", - "psr/log": "~1.0", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "conflict": { - "doctrine/dbal": "<2.5", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" - }, - "provide": { - "psr/cache-implementation": "1.0", - "psr/simple-cache-implementation": "1.0", - "symfony/cache-implementation": "1.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6", - "doctrine/dbal": "^2.5|^3.0", - "predis/predis": "^1.1", - "psr/simple-cache": "^1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", - "homepage": "https://symfony.com/", - "keywords": [ - "caching", - "psr6" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-24T07:56:38+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0" - }, - "suggest": { - "symfony/cache-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Cache\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to caching", - "homepage": "https://symfony.com/", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/config", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "3880541ff96d2e9a113f355d8c6891489c63cf56" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/3880541ff96d2e9a113f355d8c6891489c63cf56", - "reference": "3880541ff96d2e9a113f355d8c6891489c63cf56", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<3.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/messenger": "^4.1|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-02T16:08:58+00:00" - }, - { - "name": "symfony/debug", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "726b85e69342e767d60e3853b98559a68ff74183" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/726b85e69342e767d60e3853b98559a68ff74183", - "reference": "726b85e69342e767d60e3853b98559a68ff74183", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/http-kernel": "<3.4" - }, - "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-09T05:20:36+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "89274c8847dff2ed703e481843eb9159ca25cc6e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/89274c8847dff2ed703e481843eb9159ca25cc6e", - "reference": "89274c8847dff2ed703e481843eb9159ca25cc6e", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/container": "^1.0", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/config": "<4.3|>=5.0", - "symfony/finder": "<3.4", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<3.4" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0" - }, - "require-dev": { - "symfony/config": "^4.3", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DependencyInjection Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-10T10:08:39+00:00" - }, - { - "name": "symfony/doctrine-bridge", - "version": "v4.4.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "31c3d72f9e7a03e1b9d136084a9201c2225ee348" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/31c3d72f9e7a03e1b9d136084a9201c2225ee348", - "reference": "31c3d72f9e7a03e1b9d136084a9201c2225ee348", - "shasum": "" - }, - "require": { - "doctrine/event-manager": "~1.0", - "doctrine/persistence": "~1.0", - "php": "^7.1.3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/dependency-injection": "<3.4", - "symfony/form": "<4.4", - "symfony/http-kernel": "<4.3.7", - "symfony/messenger": "<4.3", - "symfony/security-core": "<4.4", - "symfony/validator": "<4.4" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.6", - "doctrine/collections": "~1.0", - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": "~2.4", - "doctrine/orm": "^2.6.3", - "doctrine/reflection": "~1.0", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/http-kernel": "^4.3.7", - "symfony/messenger": "^4.4|^5.0", - "symfony/property-access": "^3.4|^4.0|^5.0", - "symfony/property-info": "^3.4|^4.0|^5.0", - "symfony/proxy-manager-bridge": "^3.4|^4.0|^5.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/translation": "^3.4|^4.0|^5.0", - "symfony/validator": "^4.4|^5.0", - "symfony/var-dumper": "^3.4|^4.0|^5.0" - }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/property-info": "", - "symfony/validator": "" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Doctrine\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Doctrine Bridge", - "homepage": "https://symfony.com/", - "time": "2019-12-01T08:39:58+00:00" - }, - { - "name": "symfony/dom-crawler", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6d6885e167aad0af4128b392f22d8f2a33dd88ec", - "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "masterminds/html5": "<2.6" - }, - "require-dev": { - "masterminds/html5": "^2.6", - "symfony/css-selector": "^4.4|^5.0" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-02T16:23:27+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "5a6feca7a384015a09e14265c35ee0bd6f54b2ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/5a6feca7a384015a09e14265c35ee0bd6f54b2ed", - "reference": "5a6feca7a384015a09e14265c35ee0bd6f54b2ed", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/debug": "^4.4.5", - "symfony/polyfill-php80": "^1.15", - "symfony/var-dumper": "^4.4|^5.0" - }, - "require-dev": { - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony ErrorHandler Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-25T08:51:35+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "e17bb5e0663dc725f7cdcafc932132735b4725cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e17bb5e0663dc725f7cdcafc932132735b4725cd", - "reference": "e17bb5e0663dc725f7cdcafc932132735b4725cd", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" - }, - "conflict": { - "symfony/dependency-injection": "<3.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "~3.4|~4.4", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-18T14:07:46+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com/", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-06T13:19:58+00:00" - }, - { - "name": "symfony/expression-language", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/expression-language.git", - "reference": "54b118a1c91991b90e67919146db66093def1bf9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/54b118a1c91991b90e67919146db66093def1bf9", - "reference": "54b118a1c91991b90e67919146db66093def1bf9", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/cache": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\ExpressionLanguage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony ExpressionLanguage Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-02T16:08:58+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "0d386979828c15d37ff936bf9bae2ecbfa36d7dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/0d386979828c15d37ff936bf9bae2ecbfa36d7dc", - "reference": "0d386979828c15d37ff936bf9bae2ecbfa36d7dc", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-02T16:08:58+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", - "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-02T16:23:27+00:00" - }, - { - "name": "symfony/framework-bundle", - "version": "v4.4.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "69ac426bfaca9270e549cea184eece00357f2675" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/69ac426bfaca9270e549cea184eece00357f2675", - "reference": "69ac426bfaca9270e549cea184eece00357f2675", - "shasum": "" - }, - "require": { - "ext-xml": "*", - "php": "^7.1.3", - "symfony/cache": "^4.4|^5.0", - "symfony/config": "^4.3.4|^5.0", - "symfony/dependency-injection": "^4.4.1|^5.0.1", - "symfony/error-handler": "^4.4.1|^5.0.1", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^4.4|^5.0" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.1", - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/asset": "<3.4", - "symfony/browser-kit": "<4.3", - "symfony/console": "<4.3", - "symfony/dom-crawler": "<4.3", - "symfony/dotenv": "<4.3.6", - "symfony/form": "<4.3.5", - "symfony/http-client": "<4.4", - "symfony/lock": "<4.4", - "symfony/mailer": "<4.4", - "symfony/messenger": "<4.4", - "symfony/mime": "<4.4", - "symfony/property-info": "<3.4", - "symfony/security-bundle": "<4.4", - "symfony/serializer": "<4.4", - "symfony/stopwatch": "<3.4", - "symfony/translation": "<4.4", - "symfony/twig-bridge": "<4.1.1", - "symfony/twig-bundle": "<4.4", - "symfony/validator": "<4.4", - "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<4.3.6" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "paragonie/sodium_compat": "^1.8", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "^3.4|^4.0|^5.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/console": "^4.3.4|^5.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dom-crawler": "^4.3|^5.0", - "symfony/dotenv": "^4.3.6|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/form": "^4.3.5|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/property-info": "^3.4|^4.0|^5.0", - "symfony/security-csrf": "^3.4|^4.0|^5.0", - "symfony/security-http": "^3.4|^4.0|^5.0", - "symfony/serializer": "^4.4|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "symfony/validator": "^4.4|^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.3.6|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0", - "twig/twig": "^1.41|^2.10|^3.0" - }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony FrameworkBundle", - "homepage": "https://symfony.com/", - "time": "2019-11-28T14:12:27+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "3a5d0fe7908daaa23e3dbf4cee3ba4bfbb19fdd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/3a5d0fe7908daaa23e3dbf4cee3ba4bfbb19fdd3", - "reference": "3a5d0fe7908daaa23e3dbf4cee3ba4bfbb19fdd3", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/http-client-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com/", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "6cca6b2e4b69fc5bace160d14cf1ee5f71483db4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6cca6b2e4b69fc5bace160d14cf1ee5f71483db4", - "reference": "6cca6b2e4b69fc5bace160d14cf1ee5f71483db4", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpFoundation Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-13T05:01:27+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "e3eac6daeb0c65965a6201bd2de9564a802fe0a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e3eac6daeb0c65965a6201bd2de9564a802fe0a9", - "reference": "e3eac6daeb0c65965a6201bd2de9564a802fe0a9", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/error-handler": "^4.4", - "symfony/event-dispatcher": "^4.4", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/browser-kit": "<4.3", - "symfony/config": "<3.4", - "symfony/console": ">=5", - "symfony/dependency-injection": "<4.3", - "symfony/translation": "<4.2", - "twig/twig": "<1.34|<2.4,>=2" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^4.3|^5.0", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/routing": "^3.4|^4.0|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpKernel Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-27T04:25:44+00:00" - }, - { - "name": "symfony/process", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "9b887acc522935f77555ae8813495958c7771ba7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/9b887acc522935f77555ae8813495958c7771ba7", - "reference": "9b887acc522935f77555ae8813495958c7771ba7", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-02T16:08:58+00:00" - }, - { - "name": "symfony/routing", - "version": "v4.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "8db77d97152f55f0df5158cc0a877ad8e16099ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8db77d97152f55f0df5158cc0a877ad8e16099ac", - "reference": "8db77d97152f55f0df5158cc0a877ad8e16099ac", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "conflict": { - "symfony/config": "<4.2", - "symfony/dependency-injection": "<3.4", - "symfony/yaml": "<3.4" - }, - "require-dev": { - "doctrine/annotations": "~1.2", - "psr/log": "~1.0", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Routing Component", - "homepage": "https://symfony.com/", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-02T16:08:58+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f7c58cf81dbb5dd67d423a89d577524a2ec0323", - "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "c976c115a0d788808f7e71834c8eb0844f678d02" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c976c115a0d788808f7e71834c8eb0844f678d02", - "reference": "c976c115a0d788808f7e71834c8eb0844f678d02", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.4|^3.0" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony mechanism for exploring and dumping PHP variables", - "homepage": "https://symfony.com/", - "keywords": [ - "debug", - "dump" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-18T14:27:32+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "8b858508e49beb257fd635104c3d449a8113e8fe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8b858508e49beb257fd635104c3d449a8113e8fe", - "reference": "8b858508e49beb257fd635104c3d449a8113e8fe", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", - "homepage": "https://symfony.com/", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "serialize" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-08T14:19:54+00:00" - }, - { - "name": "symfony/yaml", - "version": "v5.1.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", - "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<4.4" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com/", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-27T03:44:28+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2020-07-12T23:59:07+00:00" - }, - { - "name": "webimpress/safe-writer", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/webimpress/safe-writer.git", - "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/5cfafdec5873c389036f14bf832a5efc9390dcdd", - "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.8 || ^9.3.7", - "vimeo/psalm": "^3.14.2", - "webimpress/coding-standard": "^1.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev", - "dev-develop": "2.2.x-dev", - "dev-release-1.0": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Webimpress\\SafeWriter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "description": "Tool to write files safely, to avoid race conditions", - "keywords": [ - "concurrent write", - "file writer", - "race condition", - "safe writer", - "webimpress" - ], - "funding": [ - { - "url": "https://github.com/michalbundyra", - "type": "github" - } - ], - "time": "2020-08-25T07:21:11+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2020-07-08T17:02:28+00:00" - } - ], - "aliases": [], - "minimum-stability": "beta", - "stability-flags": { - "php-http/client-common": 20, - "empi89/php-amqp-stubs": 20 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.1.3", - "ext-amqp": "^1.9.3", - "ext-gearman": "^2.0", - "ext-mongodb": "^1.5", - "ext-rdkafka": "^3.0.3" - }, - "platform-dev": [], - "platform-overrides": { - "ext-amqp": "1.9.3", - "ext-gearman": "2.0.3", - "ext-rdkafka": "3.3", - "ext-mongodb": "1.5", - "ext-bcmath": "1", - "ext-mbstring": "1", - "ext-mongo": "1.6.14" - }, - "plugin-api-version": "1.1.0" -} From 2a0545c15a3921ca57a134cd0162d5587f61a1b8 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Wed, 30 Sep 2020 11:55:53 -0500 Subject: [PATCH 0799/1142] Fix for stomp-php - Use one connection for each message. --- pkg/stomp/StompProducer.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index 2f819d1b5..070bf6ce4 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -47,10 +47,12 @@ public function send(Destination $destination, Message $message): void throw $ex; } - $this->stomp->disconnect(true); + $this->stomp->disconnect(); $this->stomp->connect(); $this->stomp->send($destination->getQueueName(), $stompMessage); + } finally { + $this->stomp->disconnect(); } } From a439f00b22b0a3ab1e7da945248e786c4cf6fe7f Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Wed, 30 Sep 2020 13:35:54 -0500 Subject: [PATCH 0800/1142] Unfortunately, can't use this as it will break actual long-lived connections. --- pkg/stomp/StompProducer.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index 070bf6ce4..861069329 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -51,8 +51,6 @@ public function send(Destination $destination, Message $message): void $this->stomp->connect(); $this->stomp->send($destination->getQueueName(), $stompMessage); - } finally { - $this->stomp->disconnect(); } } From cd3c765a9954cc76311e0e249dcc8c2cd03f4e36 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 1 Oct 2020 09:16:58 -0500 Subject: [PATCH 0801/1142] Allow connections that have no consumer to be considered 'transient'. --- pkg/stomp/StompContext.php | 33 ++++++++++++++++++++++++++------- pkg/stomp/StompProducer.php | 25 +------------------------ 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index 24876356e..d1bcb2799 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -38,10 +38,16 @@ class StompContext implements Context */ private $stompFactory; + /** + * @var bool + */ + private $transient; + /** * @param BufferedStompClient|callable $stomp + * @param mixed $transient */ - public function __construct($stomp, string $extensionType) + public function __construct($stomp, string $extensionType, $transient = true) { if ($stomp instanceof BufferedStompClient) { $this->stomp = $stomp; @@ -53,6 +59,7 @@ public function __construct($stomp, string $extensionType) $this->extensionType = $extensionType; $this->useExchangePrefix = ExtensionType::RABBITMQ === $extensionType; + $this->transient = $transient; } /** @@ -173,6 +180,8 @@ public function createConsumer(Destination $destination): Consumer { InvalidDestinationException::assertDestinationInstanceOf($destination, StompDestination::class); + $this->transient = false; + return new StompConsumer($this->getStomp(), $destination); } @@ -181,6 +190,10 @@ public function createConsumer(Destination $destination): Consumer */ public function createProducer(): Producer { + if ($this->transient && true == $this->stomp) { + $this->stomp->disconnect(); + } + return new StompProducer($this->getStomp()); } @@ -202,14 +215,20 @@ public function purgeQueue(Queue $queue): void public function getStomp(): BufferedStompClient { if (false == $this->stomp) { - $stomp = call_user_func($this->stompFactory); - if (false == $stomp instanceof BufferedStompClient) { - throw new \LogicException(sprintf('The factory must return instance of BufferedStompClient. It returns %s', is_object($stomp) ? get_class($stomp) : gettype($stomp))); - } - - $this->stomp = $stomp; + $this->stomp = $this->createStomp(); } return $this->stomp; } + + private function createStomp(): BufferedStompClient + { + $stomp = call_user_func($this->stompFactory); + + if (false == $stomp instanceof BufferedStompClient) { + throw new \LogicException(sprintf('The factory must return instance of BufferedStompClient. It returns %s', is_object($stomp) ? get_class($stomp) : gettype($stomp))); + } + + return $stomp; + } } diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index 861069329..f8ea364e3 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -11,7 +11,6 @@ use Interop\Queue\Message; use Interop\Queue\Producer; use Stomp\Client; -use Stomp\Exception\ConnectionException; use Stomp\Transport\Message as StompLibMessage; class StompProducer implements Producer @@ -40,23 +39,9 @@ public function send(Destination $destination, Message $message): void $stompMessage = new StompLibMessage($message->getBody(), $headers); - try { - $this->stomp->send($destination->getQueueName(), $stompMessage); - } catch (ConnectionException $ex) { - if (!$this->stomp->isConnected()) { - throw $ex; - } - - $this->stomp->disconnect(); - $this->stomp->connect(); - - $this->stomp->send($destination->getQueueName(), $stompMessage); - } + $this->stomp->send($destination->getQueueName(), $stompMessage); } - /** - * @return $this|Producer - */ public function setDeliveryDelay(int $deliveryDelay = null): Producer { if (empty($deliveryDelay)) { @@ -71,11 +56,6 @@ public function getDeliveryDelay(): ?int return null; } - /** - * @throws PriorityNotSupportedException - * - * @return $this|Producer - */ public function setPriority(int $priority = null): Producer { if (empty($priority)) { @@ -90,9 +70,6 @@ public function getPriority(): ?int return null; } - /** - * @return $this|Producer - */ public function setTimeToLive(int $timeToLive = null): Producer { if (empty($timeToLive)) { From 905b3e8b669ccadfdaa395670dfab37793f3570c Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 1 Oct 2020 09:19:11 -0500 Subject: [PATCH 0802/1142] Revert StompProducer --- pkg/stomp/StompProducer.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index f8ea364e3..8c1933ee4 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -42,6 +42,9 @@ public function send(Destination $destination, Message $message): void $this->stomp->send($destination->getQueueName(), $stompMessage); } + /** + * @return $this|Producer + */ public function setDeliveryDelay(int $deliveryDelay = null): Producer { if (empty($deliveryDelay)) { @@ -56,6 +59,11 @@ public function getDeliveryDelay(): ?int return null; } + /** + * @throws PriorityNotSupportedException + * + * @return $this|Producer + */ public function setPriority(int $priority = null): Producer { if (empty($priority)) { @@ -70,6 +78,9 @@ public function getPriority(): ?int return null; } + /** + * @return $this|Producer + */ public function setTimeToLive(int $timeToLive = null): Producer { if (empty($timeToLive)) { From 327ca4de09707c0706029e12980d0f10b2a93ec9 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 1 Oct 2020 10:14:37 -0500 Subject: [PATCH 0803/1142] Amend test. --- pkg/stomp/Tests/StompContextTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/stomp/Tests/StompContextTest.php b/pkg/stomp/Tests/StompContextTest.php index 84b87fc6d..b0a41b64d 100644 --- a/pkg/stomp/Tests/StompContextTest.php +++ b/pkg/stomp/Tests/StompContextTest.php @@ -144,7 +144,7 @@ public function testShouldCloseConnections() { $client = $this->createStompClientMock(); $client - ->expects($this->once()) + ->expects($this->atLeastOnce()) ->method('disconnect') ; From e8f20f6ebd2f8c56d4058fe6b52765a0e41058cf Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 5 Oct 2020 19:25:45 +0200 Subject: [PATCH 0804/1142] remove topic conf, deprecated --- pkg/rdkafka/RdKafkaContext.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index cc4915062..362037dd2 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -184,20 +184,18 @@ public static function getLibrdKafkaVersion(): string private function getConf(): Conf { if (null === $this->conf) { - $topicConf = new TopicConf(); + $this->conf = new Conf(); if (isset($this->config['topic']) && is_array($this->config['topic'])) { foreach ($this->config['topic'] as $key => $value) { - $topicConf->set($key, $value); + $this->conf->set($key, $value); } } if (isset($this->config['partitioner'])) { - $topicConf->setPartitioner($this->config['partitioner']); + $this->conf->set('partitioner', $this->config['partitioner']); } - $this->conf = new Conf(); - if (isset($this->config['global']) && is_array($this->config['global'])) { foreach ($this->config['global'] as $key => $value) { $this->conf->set($key, $value); @@ -219,8 +217,6 @@ private function getConf(): Conf if (isset($this->config['stats_cb'])) { $this->conf->setStatsCb($this->config['stats_cb']); } - - $this->conf->setDefaultTopicConf($topicConf); } return $this->conf; From 3096078f20008c2d4665bd90f6083b93e86d31b7 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 5 Oct 2020 19:41:05 +0200 Subject: [PATCH 0805/1142] add non-blocking poll call to serve cb's --- pkg/rdkafka/RdKafkaProducer.php | 2 ++ pkg/rdkafka/Tests/RdKafkaProducerTest.php | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index 8464866c3..2b987bb96 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -56,12 +56,14 @@ public function send(Destination $destination, Message $message): void ); } else { $topic->producev($partition, 0 /* must be 0 */, $payload, $key, $message->getHeaders()); + $this->producer->poll(0); return; } } $topic->produce($partition, 0 /* must be 0 */, $payload, $key); + $this->producer->poll(0); } /** diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index 7cc601aef..467f1a43e 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -69,6 +69,11 @@ public function testShouldUseSerializerToEncodeMessageAndPutToExpectedTube() ->with('theQueueName') ->willReturn($kafkaTopic) ; + $kafkaProducer + ->expects($this->once()) + ->method('poll') + ->with(0) + ; $serializer = $this->createSerializerMock(); $serializer @@ -99,6 +104,11 @@ public function testShouldPassNullAsTopicConfigIfNotSetOnTopic() ->with('theQueueName', null) ->willReturn($kafkaTopic) ; + $kafkaProducer + ->expects($this->once()) + ->method('poll') + ->with(0) + ; $serializer = $this->createSerializerMock(); $serializer @@ -135,6 +145,11 @@ public function testShouldPassCustomConfAsTopicConfigIfSetOnTopic() ->with('theQueueName', $this->identicalTo($conf)) ->willReturn($kafkaTopic) ; + $kafkaProducer + ->expects($this->once()) + ->method('poll') + ->with(0) + ; $serializer = $this->createSerializerMock(); $serializer @@ -189,6 +204,11 @@ public function testShouldAllowSerializersToSerializeKeys() ->method('newTopic') ->willReturn($kafkaTopic) ; + $kafkaProducer + ->expects($this->once()) + ->method('poll') + ->with(0) + ; $serializer = $this->createSerializerMock(); $serializer From c02b57dc243142db7e5f837132b28c325d389dc9 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 5 Oct 2020 19:46:40 +0200 Subject: [PATCH 0806/1142] remove unused import --- pkg/rdkafka/RdKafkaContext.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index 362037dd2..9930b56ee 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -19,7 +19,6 @@ use RdKafka\Conf; use RdKafka\KafkaConsumer; use RdKafka\Producer as VendorProducer; -use RdKafka\TopicConf; class RdKafkaContext implements Context { From b1a0bbc1b2cac7d9a9dff5402a4c91a67f1b3456 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 5 Oct 2020 21:14:06 +0200 Subject: [PATCH 0807/1142] test improvements --- .../Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php index c755b8740..d756f23e2 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php @@ -30,7 +30,8 @@ public function test() $context->createProducer()->send($topic, $context->createMessage($expectedBody)); - $message = $consumer->receive(10000); // 10 sec + // Initial balancing can take some time, so we want to make sure the timeout is high enough + $message = $consumer->receive(15000); // 15 sec $this->assertInstanceOf(Message::class, $message); $consumer->acknowledge($message); @@ -47,7 +48,7 @@ protected function createContext() 'enable.auto.commit' => 'false', ], 'topic' => [ - 'auto.offset.reset' => 'beginning', + 'auto.offset.reset' => 'earliest', ], ]; From 916c57eb00a552907a434d67eaf944fcd4a913ff Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 5 Oct 2020 22:10:32 +0200 Subject: [PATCH 0808/1142] use supported librdkafka version of ext --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index c79a46461..ad483b3d4 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -20,7 +20,7 @@ RUN set -x && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ - git checkout v0.11.1 && \ + git checkout v0.11.6 && \ ./configure && make && make install && \ pecl install rdkafka && \ echo "extension=rdkafka.so" > /etc/php/7.2/cli/conf.d/10-rdkafka.ini && \ From 36d4e019b27ddc82bf71597990e40ea8546cab3c Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Wed, 7 Oct 2020 19:04:52 -0500 Subject: [PATCH 0809/1142] Allow the detection of transient connections to be configured. --- pkg/stomp/StompConnectionFactory.php | 14 +++++++------- pkg/stomp/StompContext.php | 7 +++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index d4d9c3d3c..9e0996b6c 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -74,14 +74,14 @@ public function __construct($config = 'stomp:') */ public function createContext(): Context { - if ($this->config['lazy']) { - return new StompContext( - function () { return $this->establishConnection(); }, - $this->config['target'] - ); - } + $stomp = $this->config['lazy'] + ? function () { return $this->establishConnection(); } + : $this->establishConnection(); + + $target = $this->config['target']; + $detectTransientConnections = (bool) $this->config['detect_transient_connections']; - return new StompContext($this->establishConnection(), $this->config['target']); + return new StompContext($stomp, $target, $detectTransientConnections); } private function establishConnection(): BufferedStompClient diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index d1bcb2799..c71277e65 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -45,9 +45,8 @@ class StompContext implements Context /** * @param BufferedStompClient|callable $stomp - * @param mixed $transient */ - public function __construct($stomp, string $extensionType, $transient = true) + public function __construct($stomp, string $extensionType, bool $detectTransientConnections = false) { if ($stomp instanceof BufferedStompClient) { $this->stomp = $stomp; @@ -59,7 +58,7 @@ public function __construct($stomp, string $extensionType, $transient = true) $this->extensionType = $extensionType; $this->useExchangePrefix = ExtensionType::RABBITMQ === $extensionType; - $this->transient = $transient; + $this->transient = $detectTransientConnections; } /** @@ -190,7 +189,7 @@ public function createConsumer(Destination $destination): Consumer */ public function createProducer(): Producer { - if ($this->transient && true == $this->stomp) { + if ($this->transient && $this->stomp) { $this->stomp->disconnect(); } From 2e1d06dc8e5ddec1483dfe8b29d5dc8ccc8d334e Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 8 Oct 2020 02:22:57 -0500 Subject: [PATCH 0810/1142] Add default configuration for transient connection detection. --- pkg/stomp/StompConnectionFactory.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index 9e0996b6c..9110911bc 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -169,6 +169,7 @@ private function defaultConfig(): array 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ]; } } From b46a945c0d3b5b1cc1e8a3a749e729c794eff20a Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 8 Oct 2020 03:02:45 -0500 Subject: [PATCH 0811/1142] Update configuration for tests. --- pkg/stomp/Tests/StompConnectionFactoryConfigTest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php index 3d2ae99d9..50031e1e7 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php @@ -70,6 +70,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; @@ -91,6 +92,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; @@ -112,6 +114,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; @@ -134,6 +137,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; @@ -156,6 +160,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; @@ -178,6 +183,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; @@ -201,6 +207,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; @@ -222,6 +229,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; @@ -244,6 +252,7 @@ public static function provideConfigs() 'read_timeout' => 60, 'send_heartbeat' => 0, 'receive_heartbeat' => 0, + 'detect_transient_connections' => false, ], ]; } From 093cddfc4a458e5b465f9d9e6a16a30926c28858 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 8 Oct 2020 21:35:32 +0200 Subject: [PATCH 0812/1142] add exception for unsupported librdkafka version --- docker/Dockerfile | 2 +- pkg/rdkafka/RdKafkaConnectionFactory.php | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index ad483b3d4..f41c22953 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -20,7 +20,7 @@ RUN set -x && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ - git checkout v0.11.6 && \ + git checkout v1.0.0 && \ ./configure && make && make install && \ pecl install rdkafka && \ echo "extension=rdkafka.so" > /etc/php/7.2/cli/conf.d/10-rdkafka.ini && \ diff --git a/pkg/rdkafka/RdKafkaConnectionFactory.php b/pkg/rdkafka/RdKafkaConnectionFactory.php index a55c5c617..24d60c9b6 100644 --- a/pkg/rdkafka/RdKafkaConnectionFactory.php +++ b/pkg/rdkafka/RdKafkaConnectionFactory.php @@ -39,6 +39,10 @@ class RdKafkaConnectionFactory implements ConnectionFactory */ public function __construct($config = 'kafka:') { + if (version_compare(RdKafkaContext::getLibrdKafkaVersion(), '1.0.0', '<')) { + throw new \RuntimeException('You must install librdkafka:1.0.0 or higher'); + } + if (empty($config) || 'kafka:' === $config) { $config = []; } elseif (is_string($config)) { From 2a1ca16dda7bdac39c5ae8c48a3ca23e43991b7d Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 8 Oct 2020 21:50:26 +0200 Subject: [PATCH 0813/1142] bump php-amqp --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index f41c22953..91af4ed05 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -10,7 +10,7 @@ RUN set -x && \ apt-get install -y --no-install-recommends --no-install-suggests php-dev librabbitmq-dev make && \ mkdir -p $HOME/php-amqp && \ cd $HOME/php-amqp && \ - git clone https://github.com/pdezwart/php-amqp.git . && git checkout v1.9.3 && \ + git clone https://github.com/pdezwart/php-amqp.git . && git checkout v1.10.2 && \ phpize --clean && phpize && ./configure && make install ## librdkafka From 5e7bf96c6050c17a9c539734491b56ea66ab7dfb Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 8 Oct 2020 22:16:17 +0200 Subject: [PATCH 0814/1142] update image --- docker/Dockerfile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index ad483b3d4..06d3e78f7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,32 +1,32 @@ -FROM formapro/nginx-php-fpm:latest-all-exts +FROM formapro/nginx-php-fpm:7.3-latest-all-exts ## libs RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php-dev php-redis php-pgsql git python + apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php7.3-dev php7.3-redis php7.3-pgsql git python RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests php-dev librabbitmq-dev make && \ + apt-get install -y --no-install-recommends --no-install-suggests php7.3-dev librabbitmq-dev make && \ mkdir -p $HOME/php-amqp && \ cd $HOME/php-amqp && \ - git clone https://github.com/pdezwart/php-amqp.git . && git checkout v1.9.3 && \ + git clone https://github.com/pdezwart/php-amqp.git . && git checkout v1.10.2 && \ phpize --clean && phpize && ./configure && make install ## librdkafka RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php-dev && \ + apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php7.3-dev && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ - git checkout v0.11.6 && \ + git checkout v1.0.0 && \ ./configure && make && make install && \ pecl install rdkafka && \ - echo "extension=rdkafka.so" > /etc/php/7.2/cli/conf.d/10-rdkafka.ini && \ - echo "extension=rdkafka.so" > /etc/php/7.2/fpm/conf.d/10-rdkafka.ini + echo "extension=rdkafka.so" > /etc/php/7.3/cli/conf.d/10-rdkafka.ini && \ + echo "extension=rdkafka.so" > /etc/php/7.3/fpm/conf.d/10-rdkafka.ini -COPY ./php/cli.ini /etc/php/7.2/cli/conf.d/1-dev_cli.ini +COPY ./php/cli.ini /etc/php/7.3/cli/conf.d/1-dev_cli.ini COPY ./bin/dev_entrypoiny.sh /usr/local/bin/entrypoint.sh RUN chmod u+x /usr/local/bin/entrypoint.sh From f62327edd8420f4b461e64ef7a01f9f14d54464b Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 8 Oct 2020 22:44:53 +0200 Subject: [PATCH 0815/1142] remove duplicate install --- docker/Dockerfile | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 06d3e78f7..bae8c2623 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,18 +5,10 @@ RUN set -x && \ apt-get update && \ apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php7.3-dev php7.3-redis php7.3-pgsql git python -RUN set -x && \ - apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests php7.3-dev librabbitmq-dev make && \ - mkdir -p $HOME/php-amqp && \ - cd $HOME/php-amqp && \ - git clone https://github.com/pdezwart/php-amqp.git . && git checkout v1.10.2 && \ - phpize --clean && phpize && ./configure && make install - ## librdkafka RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php7.3-dev && \ + apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php7.3-dev make && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ From 487f0953ade46e6aec3f6c562a7a295d3ea1dfd6 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 8 Oct 2020 23:03:44 +0200 Subject: [PATCH 0816/1142] add php-amqp to update --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index bae8c2623..86f460f8e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -3,7 +3,7 @@ FROM formapro/nginx-php-fpm:7.3-latest-all-exts ## libs RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php7.3-dev php7.3-redis php7.3-pgsql git python + apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php7.3-dev php7.3-redis php7.3-pgsql git python php-amqp ## librdkafka RUN set -x && \ From c8e6c561bff28eaf9b057e479d254cf4b8e80c5e Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 9 Oct 2020 10:26:15 +0200 Subject: [PATCH 0817/1142] make sure we use the latest image --- bin/test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/test.sh b/bin/test.sh index f392e616b..12c9734bd 100755 --- a/bin/test.sh +++ b/bin/test.sh @@ -3,4 +3,5 @@ set -x set -e +docker pull enqueue/dev docker-compose run --workdir="/mqdev" --rm dev ./docker/bin/test.sh $@ From c16bdb4e10aa1b0849f16e7d192933a98d4881cd Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 9 Oct 2020 10:50:20 +0200 Subject: [PATCH 0818/1142] install librdkafka locally --- .travis.yml | 1 + bin/install-librdkafka.sh | 6 ++++++ bin/test.sh | 1 - 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100755 bin/install-librdkafka.sh diff --git a/.travis.yml b/.travis.yml index 33535e57e..978a96644 100644 --- a/.travis.yml +++ b/.travis.yml @@ -68,6 +68,7 @@ install: - echo "memory_limit=2048M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - php ./bin/fix-symfony-version.php "$SYMFONY_VERSION" - composer install + - ./bin/install-librdkafka.sh - if [ "$PREPARE_CONTAINER" = true ]; then docker --version; fi - if [ "$PREPARE_CONTAINER" = true ]; then docker-compose --version; fi - if [ "$PREPARE_CONTAINER" = true ]; then bin/dev -b; fi diff --git a/bin/install-librdkafka.sh b/bin/install-librdkafka.sh new file mode 100755 index 000000000..cb696a9e7 --- /dev/null +++ b/bin/install-librdkafka.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +git clone --depth 1 --branch v1.0.0 https://github.com/edenhill/librdkafka.git +cd librdkafka +./configure +make +sudo make install diff --git a/bin/test.sh b/bin/test.sh index 12c9734bd..f392e616b 100755 --- a/bin/test.sh +++ b/bin/test.sh @@ -3,5 +3,4 @@ set -x set -e -docker pull enqueue/dev docker-compose run --workdir="/mqdev" --rm dev ./docker/bin/test.sh $@ From 16c537cd3c89e8346c974d47c79612ba9e2eec07 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 9 Oct 2020 11:08:29 +0200 Subject: [PATCH 0819/1142] try to fix lib problem --- bin/install-librdkafka.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/install-librdkafka.sh b/bin/install-librdkafka.sh index cb696a9e7..4248975d4 100755 --- a/bin/install-librdkafka.sh +++ b/bin/install-librdkafka.sh @@ -4,3 +4,5 @@ cd librdkafka ./configure make sudo make install +sudo ldconfig + From 07c0fb725fe612bee0c1835d528167ade0216dcc Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 9 Oct 2020 11:34:19 +0200 Subject: [PATCH 0820/1142] fix stub --- .travis.yml | 2 +- bin/install-librdkafka.sh | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100755 bin/install-librdkafka.sh diff --git a/.travis.yml b/.travis.yml index 978a96644..7c3c68762 100644 --- a/.travis.yml +++ b/.travis.yml @@ -68,7 +68,7 @@ install: - echo "memory_limit=2048M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - php ./bin/fix-symfony-version.php "$SYMFONY_VERSION" - composer install - - ./bin/install-librdkafka.sh + - sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - if [ "$PREPARE_CONTAINER" = true ]; then docker --version; fi - if [ "$PREPARE_CONTAINER" = true ]; then docker-compose --version; fi - if [ "$PREPARE_CONTAINER" = true ]; then bin/dev -b; fi diff --git a/bin/install-librdkafka.sh b/bin/install-librdkafka.sh deleted file mode 100755 index 4248975d4..000000000 --- a/bin/install-librdkafka.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -git clone --depth 1 --branch v1.0.0 https://github.com/edenhill/librdkafka.git -cd librdkafka -./configure -make -sudo make install -sudo ldconfig - From a71fd0995373cdc1ea46b98f23ee857355f79815 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 9 Oct 2020 11:56:41 +0200 Subject: [PATCH 0821/1142] make check more safe --- pkg/rdkafka/RdKafkaProducer.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index 2b987bb96..db21b9311 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -47,7 +47,8 @@ public function send(Destination $destination, Message $message): void // Headers in payload are maintained for backwards compatibility with apps that might run on lower phprdkafka version if (method_exists($topic, 'producev')) { // Phprdkafka <= 3.1.0 will fail calling `producev` on librdkafka >= 1.0.0 causing segfault - if (version_compare(RdKafkaContext::getLibrdKafkaVersion(), '1.0.0', '>=') + // Since we are forcing to use at least librdkafka:1.0.0, no need to check the lib version anymore + if (false !== phpversion('rdkafka') && version_compare(phpversion('rdkafka'), '3.1.0', '<=')) { trigger_error( 'Phprdkafka <= 3.1.0 is incompatible with librdkafka 1.0.0 when calling `producev`. '. From 640e4108bf9b12e87e26e1392475746137de206e Mon Sep 17 00:00:00 2001 From: Niv Penso Date: Tue, 13 Oct 2020 19:06:17 +0300 Subject: [PATCH 0822/1142] fixing some files according to php-cs-fixer --- .../Extension/DoctrineClosedEntityManagerExtensionTest.php | 2 +- .../Extension/DoctrinePingConnectionExtensionTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php index aa12bf7b8..8e7120325 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClosedEntityManagerExtensionTest.php @@ -2,8 +2,8 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; -use Doctrine\Persistence\ManagerRegistry; use Doctrine\ORM\EntityManagerInterface; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\Bundle\Consumption\Extension\DoctrineClosedEntityManagerExtension; use Enqueue\Consumption\Context\PostConsume; use Enqueue\Consumption\Context\PostMessageReceived; diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index b6eddfa93..fd2ae06aa 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -2,8 +2,8 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; -use Doctrine\Persistence\ManagerRegistry; use Doctrine\DBAL\Connection; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension; use Enqueue\Consumption\Context\MessageReceived; use Interop\Queue\Consumer; From 091f359486ab7acce1d964752d15aa71083b7f17 Mon Sep 17 00:00:00 2001 From: Niv Penso Date: Tue, 13 Oct 2020 19:43:25 +0300 Subject: [PATCH 0823/1142] fix for namespace changed from Doctrine\Common\Persistence\ManagerRegistry to Doctrine\Persistence\ManagerRegistry --- composer.json | 7 ++---- docs/transport/dbal.md | 2 +- pkg/dbal/ManagerRegistryConnectionFactory.php | 5 +--- .../ManagerRegistryConnectionFactoryTest.php | 2 +- .../DoctrineClearIdentityMapExtension.php | 5 +--- .../DoctrineClosedEntityManagerExtension.php | 2 +- .../DoctrinePingConnectionExtension.php | 2 +- .../Extension/ResetServicesExtensionTest.php | 2 +- pkg/job-queue/Doctrine/JobStorage.php | 23 ++++--------------- .../Tests/Doctrine/JobStorageTest.php | 2 +- 10 files changed, 15 insertions(+), 37 deletions(-) diff --git a/composer.json b/composer.json index 4a38f76bf..21cf655c1 100644 --- a/composer.json +++ b/composer.json @@ -62,9 +62,6 @@ "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", "friendsofphp/php-cs-fixer": "^2" }, - "conflict": { - "doctrine/persistence": ">=1.3.0" - }, "autoload": { "psr-4": { "Enqueue\\AmqpBunny\\": "pkg/amqp-bunny/", @@ -124,6 +121,6 @@ "prefer-stable": true }, "conflict": { - "doctrine/persistence": "<1.3.0" - } + "doctrine/persistence": "<1.3.0" + } } diff --git a/docs/transport/dbal.md b/docs/transport/dbal.md index ab1107b60..559414a74 100644 --- a/docs/transport/dbal.md +++ b/docs/transport/dbal.md @@ -48,7 +48,7 @@ $context = $factory->createContext(); ```php 1000, - How often query for new messages (milliseconds) * 'lazy' => true, - Use lazy database connection (boolean) * ]. - * - * @param ManagerRegistry $registry - * @param array $config */ public function __construct(ManagerRegistry $registry, array $config = []) { diff --git a/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php b/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php index 953921b87..3adefff01 100644 --- a/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php +++ b/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php @@ -2,8 +2,8 @@ namespace Enqueue\Dbal\Tests; -use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\DBAL\Connection; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\Dbal\DbalContext; use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Test\ClassExtensionTrait; diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php index a8f258f21..d02b9a274 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClearIdentityMapExtension.php @@ -2,7 +2,7 @@ namespace Enqueue\Bundle\Consumption\Extension; -use Doctrine\Common\Persistence\ManagerRegistry; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\Consumption\Context\MessageReceived; use Enqueue\Consumption\MessageReceivedExtensionInterface; @@ -13,9 +13,6 @@ class DoctrineClearIdentityMapExtension implements MessageReceivedExtensionInter */ protected $registry; - /** - * @param ManagerRegistry $registry - */ public function __construct(ManagerRegistry $registry) { $this->registry = $registry; diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php index d2765231a..e5ad0c6cf 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrineClosedEntityManagerExtension.php @@ -2,8 +2,8 @@ namespace Enqueue\Bundle\Consumption\Extension; -use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\ORM\EntityManagerInterface; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\Consumption\Context\PostConsume; use Enqueue\Consumption\Context\PostMessageReceived; use Enqueue\Consumption\Context\PreConsume; diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php index 88453e77c..77212508f 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php @@ -2,8 +2,8 @@ namespace Enqueue\Bundle\Consumption\Extension; -use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\DBAL\Connection; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\Consumption\Context\MessageReceived; use Enqueue\Consumption\MessageReceivedExtensionInterface; diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php index 8fbe29791..bfd772a5c 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php @@ -2,7 +2,7 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; -use Doctrine\Common\Persistence\ManagerRegistry; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\Bundle\Consumption\Extension\ResetServicesExtension; use Enqueue\Consumption\Context\MessageReceived; use Interop\Queue\Consumer; diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 32e20fe8d..385ee4d38 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -2,12 +2,12 @@ namespace Enqueue\JobQueue\Doctrine; -use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use Doctrine\DBAL\LockMode; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\JobQueue\DuplicateJobException; use Enqueue\JobQueue\Job; @@ -39,9 +39,8 @@ class JobStorage private $uniqueTableName; /** - * @param ManagerRegistry $doctrine - * @param string $entityClass - * @param string $uniqueTableName + * @param string $entityClass + * @param string $uniqueTableName */ public function __construct(ManagerRegistry $doctrine, $entityClass, $uniqueTableName) { @@ -90,7 +89,6 @@ public function findRootJobByOwnerIdAndJobName($ownerId, $jobName) /** * @param string $name - * @param Job $rootJob * * @return Job */ @@ -119,20 +117,13 @@ public function createJob() } /** - * @param Job $job - * @param \Closure|null $lockCallback - * * @throws DuplicateJobException */ public function saveJob(Job $job, \Closure $lockCallback = null) { $class = $this->getEntityRepository()->getClassName(); if (!$job instanceof $class) { - throw new \LogicException(sprintf( - 'Got unexpected job instance: expected: "%s", actual" "%s"', - $class, - get_class($job) - )); + throw new \LogicException(sprintf('Got unexpected job instance: expected: "%s", actual" "%s"', $class, get_class($job))); } if ($lockCallback) { @@ -175,11 +166,7 @@ public function saveJob(Job $job, \Closure $lockCallback = null) ]); } } catch (UniqueConstraintViolationException $e) { - throw new DuplicateJobException(sprintf( - 'Duplicate job. ownerId:"%s", name:"%s"', - $job->getOwnerId(), - $job->getName() - )); + throw new DuplicateJobException(sprintf('Duplicate job. ownerId:"%s", name:"%s"', $job->getOwnerId(), $job->getName())); } $this->getEntityManager()->persist($job); diff --git a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php index 622a79819..38d72a81c 100644 --- a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php +++ b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php @@ -2,12 +2,12 @@ namespace Enqueue\JobQueue\Tests\Doctrine; -use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use Doctrine\DBAL\LockMode; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; +use Doctrine\Persistence\ManagerRegistry; use Enqueue\JobQueue\Doctrine\JobStorage; use Enqueue\JobQueue\DuplicateJobException; use Enqueue\JobQueue\Job; From c981b565a612ac9dc583009457d6fcda4b976f7d Mon Sep 17 00:00:00 2001 From: Niv Penso Date: Tue, 13 Oct 2020 22:20:05 +0300 Subject: [PATCH 0824/1142] update pkg/dbdal --- pkg/dbal/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 868cc7266..e097f228c 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -18,7 +18,7 @@ "queue-interop/queue-spec": "^0.6" }, "conflict": { - "doctrine/persistence": ">=1.3.0" + "doctrine/persistence": "<1.3.0" }, "support": { "email": "opensource@forma-pro.com", From 0a584431ca63610fee6b9e4fbdf8236c732e7c48 Mon Sep 17 00:00:00 2001 From: Nikita Makarov Date: Wed, 4 Nov 2020 15:00:52 +0300 Subject: [PATCH 0825/1142] Ramsey dependency removed in favor to \Enqueue\Util\UUID::generate --- pkg/monitoring/ConsumerMonitoringExtension.php | 4 ++-- pkg/monitoring/composer.json | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/monitoring/ConsumerMonitoringExtension.php b/pkg/monitoring/ConsumerMonitoringExtension.php index af5ce9871..31e97697d 100644 --- a/pkg/monitoring/ConsumerMonitoringExtension.php +++ b/pkg/monitoring/ConsumerMonitoringExtension.php @@ -19,8 +19,8 @@ use Enqueue\Consumption\ProcessorExceptionExtensionInterface; use Enqueue\Consumption\Result; use Enqueue\Consumption\StartExtensionInterface; +use Enqueue\Util\UUID; use Psr\Log\LoggerInterface; -use Ramsey\Uuid\Uuid; class ConsumerMonitoringExtension implements StartExtensionInterface, PreSubscribeExtensionInterface, PreConsumeExtensionInterface, EndExtensionInterface, ProcessorExceptionExtensionInterface, MessageReceivedExtensionInterface, MessageResultExtensionInterface { @@ -82,7 +82,7 @@ public function __construct(StatsStorage $storage) public function onStart(Start $context): void { - $this->consumerId = Uuid::uuid4()->toString(); + $this->consumerId = UUID::generate(); $this->queues = []; diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index b31dc7831..ee23e109b 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -8,7 +8,6 @@ "require": { "php": "^7.1.3", "enqueue/enqueue": "^0.10", - "ramsey/uuid": "^3|^4", "enqueue/dsn": "^0.10" }, "require-dev": { From 0375baa72c08fa74e1cfcf38cb59de4fd6fe0ee7 Mon Sep 17 00:00:00 2001 From: Patrick Mac Gregor Date: Mon, 9 Nov 2020 13:40:09 +0100 Subject: [PATCH 0826/1142] [fix] queue consumption: catch throwable for processing errors cf. issue #1113 --- pkg/enqueue/Consumption/Context/ProcessorException.php | 6 +++--- pkg/enqueue/Consumption/QueueConsumer.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/enqueue/Consumption/Context/ProcessorException.php b/pkg/enqueue/Consumption/Context/ProcessorException.php index f41f23271..329b13d93 100644 --- a/pkg/enqueue/Consumption/Context/ProcessorException.php +++ b/pkg/enqueue/Consumption/Context/ProcessorException.php @@ -26,7 +26,7 @@ final class ProcessorException private $message; /** - * @var \Exception + * @var \Throwable */ private $exception; @@ -44,7 +44,7 @@ final class ProcessorException */ private $logger; - public function __construct(Context $context, Consumer $consumer, Message $message, \Exception $exception, int $receivedAt, LoggerInterface $logger) + public function __construct(Context $context, Consumer $consumer, Message $message, \Throwable $exception, int $receivedAt, LoggerInterface $logger) { $this->context = $context; $this->consumer = $consumer; @@ -69,7 +69,7 @@ public function getMessage(): Message return $this->message; } - public function getException(): \Exception + public function getException(): \Throwable { return $this->exception; } diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 6cb90290e..80936bf58 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -195,7 +195,7 @@ public function consume(ExtensionInterface $runtimeExtension = null): void if (null === $result) { try { $result = $processor->process($message, $this->interopContext); - } catch (\Exception $e) { + } catch (\Exception | \Throwable $e) { $result = $this->onProcessorException($extension, $consumer, $message, $e, $receivedAt); } } @@ -303,7 +303,7 @@ private function onEnd(ExtensionInterface $extension, int $startTime, ?int $exit * * https://github.com/symfony/symfony/blob/cbe289517470eeea27162fd2d523eb29c95f775f/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php#L77 */ - private function onProcessorException(ExtensionInterface $extension, Consumer $consumer, Message $message, \Exception $exception, int $receivedAt) + private function onProcessorException(ExtensionInterface $extension, Consumer $consumer, Message $message, \Throwable $exception, int $receivedAt) { $processorException = new ProcessorException($this->interopContext, $consumer, $message, $exception, $receivedAt, $this->logger); From 7d0f07d91149222550a516a8536a13ebf6d11de6 Mon Sep 17 00:00:00 2001 From: Alexander Trauzzi Date: Thu, 7 Jan 2021 18:57:42 -0600 Subject: [PATCH 0827/1142] Fix bad parameter for exception. --- pkg/stomp/StompConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/stomp/StompConsumer.php b/pkg/stomp/StompConsumer.php index 681f45624..e1fe80f7d 100644 --- a/pkg/stomp/StompConsumer.php +++ b/pkg/stomp/StompConsumer.php @@ -111,7 +111,7 @@ public function receive(int $timeout = 0): ?Message } } } catch (ErrorFrameException $e) { - throw new Exception($e->getMessage()."\n".$e->getFrame()->getBody(), null, $e); + throw new Exception($e->getMessage()."\n".$e->getFrame()->getBody(), 0, $e); } return null; From 2fae435ad52df9225d0d8672d67c300b5281d080 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 14 Jan 2021 20:00:42 +0200 Subject: [PATCH 0828/1142] Allow ext-rdkafka 5 --- pkg/rdkafka/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index b6b486594..4cdeb04ef 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.1.3", - "ext-rdkafka": "^3.0.3|^4.0", + "ext-rdkafka": "^3.0.3|^4.0|^5.0", "queue-interop/queue-interop": "^0.8" }, "require-dev": { From daa9753e5cc5654cf2c13cc1cd43d2af1222635f Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 18 Jan 2021 23:34:27 +0200 Subject: [PATCH 0829/1142] Add GH action CI --- .github/workflows/ci.yml | 105 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..67bf49ac4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,105 @@ +name: CI +on: [push, pull_request] +jobs: + tests: + runs-on: ubuntu-latest + strategy: + matrix: + php: ['7.1', '7.2', '7.3', '7.4'] + experimental: [false] + include: + - php: 7.1 + symfony_version: 4.3.* + phpstan: true + - php: 7.1 + symfony_version: 4.3.* + php_cs_fixer: true + - php: 7.1 + symfony_version: 4.3.* + unit_tests: true + - php: 7.2 + symfony_version: 4.3.* + unit_tests: true + - php: 7.2 + symfony_version: 5.0.* + unit_tests: true + - php: 7.3 + symfony_version: 4.3.* + unit_tests: true + - php: 7.3 + symfony_version: 4.4.* + unit_tests: true + - php: 7.3 + symfony_version: 5.0.* + unit_tests: true + - php: 7.4 + symfony_version: 4.3.* + unit_tests: true + - php: 7.4 + symfony_version: 4.4.* + unit_tests: true + - php: 7.4 + symfony_version: 5.0.* + unit_tests: true + - php: 7.1 + symfony_version: 4.3.* + functional_tests: true + prepare_container: true + - php: 7.3 + symfony_version: 5.0.* + functional_tests: true + prepare_container: true + - php: 7.1 + symfony_version: 4.3.* + rdkafka_tests: true + prepare_container: true + experimental: true + name: PHP ${{ matrix.php }} tests on Symfony ${{ matrix.symfony_version }} + env: + SYMFONY_VERSION: ${{ matrix.symfony_version }} + PHPSTAN: ${{ matrix.phpstan }} + PHP_CS_FIXER: ${{ matrix.php_cs_fixer }} + UNIT_TESTS: ${{ matrix.unit_tests }} + FUNCTIONAL_TESTS: ${{ matrix.functional_tests }} + PREPARE_CONTAINER: ${{ matrix.prepare_container }} + RDKAFKA_TESTS: ${{ matrix.rdkafka_tests }} + steps: + - uses: actions/checkout@v2 + + - uses: actions/cache@v2 + with: + path: ~/.composer/cache + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-composer- + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: mongodb, redis, :xdebug + ini-values: memory_limit=2048M + + - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" + + - run: composer install + + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php + + - run: bin/dev + if: ${{ matrix.prepare_container == true }} + + - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection + if: ${{ matrix.php_cs_fixer == true }} + + - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon + if: ${{ matrix.phpstan == true }} + + - run: bin/phpunit --exclude-group=functional + if: ${{ matrix.unit_tests == true }} + + - run: bin/test.sh --exclude-group=rdkafka + if: ${{ matrix.functional_tests == true }} + + - run: then bin/test.sh --group=rdkafka + if: ${{ matrix.rdkafka == true }} From bfebe07eb007443fe36326e4c21a8138ada1a011 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 18 Jan 2021 23:41:46 +0200 Subject: [PATCH 0830/1142] Fix the matrix --- .github/workflows/ci.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67bf49ac4..41440feae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,6 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: ['7.1', '7.2', '7.3', '7.4'] experimental: [false] include: - php: 7.1 @@ -54,15 +53,7 @@ jobs: rdkafka_tests: true prepare_container: true experimental: true - name: PHP ${{ matrix.php }} tests on Symfony ${{ matrix.symfony_version }} - env: - SYMFONY_VERSION: ${{ matrix.symfony_version }} - PHPSTAN: ${{ matrix.phpstan }} - PHP_CS_FIXER: ${{ matrix.php_cs_fixer }} - UNIT_TESTS: ${{ matrix.unit_tests }} - FUNCTIONAL_TESTS: ${{ matrix.functional_tests }} - PREPARE_CONTAINER: ${{ matrix.prepare_container }} - RDKAFKA_TESTS: ${{ matrix.rdkafka_tests }} + name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, phpstan=${{ matrix.phpstan }}, cs=${{ matrix.php_cs_fixer }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} steps: - uses: actions/checkout@v2 From ddd055b3b32103f9bc7517db7688595fa7bca395 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 18 Jan 2021 23:45:34 +0200 Subject: [PATCH 0831/1142] Fix stan --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41440feae..812c242bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,7 +83,7 @@ jobs: - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection if: ${{ matrix.php_cs_fixer == true }} - - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon + - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon pkg if: ${{ matrix.phpstan == true }} - run: bin/phpunit --exclude-group=functional From 81e0b807ce1c50a2be7dd5e0ed338e5086289a19 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 18 Jan 2021 23:51:12 +0200 Subject: [PATCH 0832/1142] Fix prepare container --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 812c242bb..a58e25464 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,7 +77,7 @@ jobs: - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: bin/dev + - run: bin/dev -b if: ${{ matrix.prepare_container == true }} - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection From cb71b183e183b21846fdd5cc214e743f2fead366 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 18 Jan 2021 23:57:54 +0200 Subject: [PATCH 0833/1142] Fix rdkafka matrix var --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a58e25464..4a81dba0a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,4 +93,4 @@ jobs: if: ${{ matrix.functional_tests == true }} - run: then bin/test.sh --group=rdkafka - if: ${{ matrix.rdkafka == true }} + if: ${{ matrix.rdkafka_tests == true }} From 2b814097c17d76bd52e631721840c6f091bddacb Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:03:52 +0200 Subject: [PATCH 0834/1142] Derp --- .github/workflows/ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a81dba0a..d6f7a2924 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,12 @@ jobs: strategy: matrix: experimental: [false] + phpstan: [false] + php_cs_fixer: [false] + unit_tests: [false] + functional_tests: [false] + prepare_container: [false] + rdkafka_tests: [false] include: - php: 7.1 symfony_version: 4.3.* @@ -92,5 +98,5 @@ jobs: - run: bin/test.sh --exclude-group=rdkafka if: ${{ matrix.functional_tests == true }} - - run: then bin/test.sh --group=rdkafka + - run: bin/test.sh --group=rdkafka if: ${{ matrix.rdkafka_tests == true }} From e80adf3d4fd43189208015580efefc1871cddde3 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:07:31 +0200 Subject: [PATCH 0835/1142] Restore sf ver env var --- .github/workflows/ci.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6f7a2924..fae9f34e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,8 +6,8 @@ jobs: strategy: matrix: experimental: [false] - phpstan: [false] - php_cs_fixer: [false] + stan: [false] + cs_fixer: [false] unit_tests: [false] functional_tests: [false] prepare_container: [false] @@ -15,10 +15,10 @@ jobs: include: - php: 7.1 symfony_version: 4.3.* - phpstan: true + stan: true - php: 7.1 symfony_version: 4.3.* - php_cs_fixer: true + cs_fixer: true - php: 7.1 symfony_version: 4.3.* unit_tests: true @@ -59,7 +59,11 @@ jobs: rdkafka_tests: true prepare_container: true experimental: true - name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, phpstan=${{ matrix.phpstan }}, cs=${{ matrix.php_cs_fixer }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} + + name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, phpstan=${{ matrix.stan }}, cs=${{ matrix.cs_fixer }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} + env: + SYMFONY_VERSION: ${{ matrix.symfony_version }} + steps: - uses: actions/checkout@v2 @@ -87,10 +91,10 @@ jobs: if: ${{ matrix.prepare_container == true }} - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection - if: ${{ matrix.php_cs_fixer == true }} + if: ${{ matrix.cs_fixer == true }} - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon pkg - if: ${{ matrix.phpstan == true }} + if: ${{ matrix.stan == true }} - run: bin/phpunit --exclude-group=functional if: ${{ matrix.unit_tests == true }} From 3eb6c62c8fcdd9f614fabc57bf36c3a48fe70530 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:11:53 +0200 Subject: [PATCH 0836/1142] Derp --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fae9f34e3..db9b5d3a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ name: CI -on: [push, pull_request] +on: [pull_request] jobs: tests: runs-on: ubuntu-latest @@ -61,8 +61,6 @@ jobs: experimental: true name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, phpstan=${{ matrix.stan }}, cs=${{ matrix.cs_fixer }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} - env: - SYMFONY_VERSION: ${{ matrix.symfony_version }} steps: - uses: actions/checkout@v2 From 510de404d365367465e4a326ef4b88b5dbc65a12 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:20:55 +0200 Subject: [PATCH 0837/1142] Try tog et rid of empty php and sf ver --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db9b5d3a5..0e60e1db8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,8 @@ jobs: runs-on: ubuntu-latest strategy: matrix: + php: [false] + symfony_version: [false] experimental: [false] stan: [false] cs_fixer: [false] From d188977d7c74493d3ba33418d937128207af40d2 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:23:33 +0200 Subject: [PATCH 0838/1142] Less composer output --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e60e1db8..e3aba4dba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,7 +83,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" - - run: composer install + - run: composer install --no-progress - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php From 1dba3806dd9ec6ac8144f87d78c002d233f89c7a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:29:25 +0200 Subject: [PATCH 0839/1142] Try defined versions first --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3aba4dba..492b1825e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,8 +5,8 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: [false] - symfony_version: [false] + php: ['7.4'] + symfony_version: ['4.3.*'] experimental: [false] stan: [false] cs_fixer: [false] From 35c17debd1bd8e0be91563bf0dfbd648ed688f1d Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:41:24 +0200 Subject: [PATCH 0840/1142] Fix composer cache --- .github/workflows/ci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 492b1825e..4daf85d74 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,10 +67,15 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Get Composer Cache Directory + id: composer-cache + run: | + echo "::set-output name=dir::$(composer config cache-files-dir)" + - uses: actions/cache@v2 with: - path: ~/.composer/cache - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: | ${{ runner.os }}-composer- From 52954c7583fe8c824358ad47695e39dca0b5634a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:46:01 +0200 Subject: [PATCH 0841/1142] Fix cs fixer --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4daf85d74..422bae389 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,7 +95,7 @@ jobs: - run: bin/dev -b if: ${{ matrix.prepare_container == true }} - - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection + - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v if: ${{ matrix.cs_fixer == true }} - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon pkg From e352ba1e8ec5bc36fa9b789ad2041f33475654a1 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 00:54:55 +0200 Subject: [PATCH 0842/1142] Split jobs --- .github/workflows/ci.yml | 98 ++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 422bae389..3ebfcba58 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,66 @@ name: CI on: [pull_request] jobs: + static_analysis: + name: Static analysis + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Get Composer Cache Directory + id: composer-cache + run: | + echo "::set-output name=dir::$(composer config cache-files-dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + ${{ runner.os }}-composer- + + - uses: shivammathur/setup-php@v2 + with: + php-version: '7.1' + coverage: none + extensions: mongodb, redis, :xdebug + ini-values: memory_limit=2048M + + - run: php ./bin/fix-symfony-version.php "4.3.*" + - run: composer install --no-progress + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php + - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon pkg + + code_style_check: + name: Code style check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Get Composer Cache Directory + id: composer-cache + run: | + echo "::set-output name=dir::$(composer config cache-files-dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + ${{ runner.os }}-composer- + + - uses: shivammathur/setup-php@v2 + with: + php-version: '7.1' + coverage: none + extensions: mongodb, redis, :xdebug + ini-values: memory_limit=2048M + + - run: php ./bin/fix-symfony-version.php "4.3.*" + - run: composer install --no-progress + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php + - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v + tests: runs-on: ubuntu-latest strategy: @@ -8,61 +68,47 @@ jobs: php: ['7.4'] symfony_version: ['4.3.*'] experimental: [false] - stan: [false] - cs_fixer: [false] - unit_tests: [false] + unit_tests: [true] functional_tests: [false] prepare_container: [false] rdkafka_tests: [false] include: - php: 7.1 symfony_version: 4.3.* - stan: true - - php: 7.1 - symfony_version: 4.3.* - cs_fixer: true - - php: 7.1 - symfony_version: 4.3.* - unit_tests: true - php: 7.2 symfony_version: 4.3.* - unit_tests: true - php: 7.2 symfony_version: 5.0.* - unit_tests: true - php: 7.3 symfony_version: 4.3.* - unit_tests: true - php: 7.3 symfony_version: 4.4.* - unit_tests: true - php: 7.3 symfony_version: 5.0.* - unit_tests: true - php: 7.4 symfony_version: 4.3.* - unit_tests: true - php: 7.4 symfony_version: 4.4.* - unit_tests: true - php: 7.4 symfony_version: 5.0.* - unit_tests: true - php: 7.1 symfony_version: 4.3.* + unit_tests: false functional_tests: true prepare_container: true - php: 7.3 symfony_version: 5.0.* + unit_tests: false functional_tests: true prepare_container: true - php: 7.1 symfony_version: 4.3.* + unit_tests: false rdkafka_tests: true prepare_container: true experimental: true - name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, phpstan=${{ matrix.stan }}, cs=${{ matrix.cs_fixer }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} + name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} steps: - uses: actions/checkout@v2 @@ -93,19 +139,13 @@ jobs: - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: bin/dev -b - if: ${{ matrix.prepare_container == true }} - - - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v - if: ${{ matrix.cs_fixer == true }} - - - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon pkg - if: ${{ matrix.stan == true }} + if: matrix.prepare_container - run: bin/phpunit --exclude-group=functional - if: ${{ matrix.unit_tests == true }} + if: matrix.unit_tests - run: bin/test.sh --exclude-group=rdkafka - if: ${{ matrix.functional_tests == true }} + if: matrix.functional_tests - run: bin/test.sh --group=rdkafka - if: ${{ matrix.rdkafka_tests == true }} + if: matrix.rdkafka_tests From 58382ad7694ee411ee3b5b527014e0c8cd36e31a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 01:16:26 +0200 Subject: [PATCH 0843/1142] Add file diff --- .github/workflows/ci.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ebfcba58..60f6a4c01 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,10 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Set changed files + run: | + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ env.GITHUB_BASE_REF }}..${{ env.GITHUB_SHA }}")" + - name: Get Composer Cache Directory id: composer-cache run: | @@ -29,7 +33,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "4.3.*" - run: composer install --no-progress - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon pkg + - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${PKG_PHP_CHANGED_FILES[@]} code_style_check: name: Code style check @@ -37,6 +41,10 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Set changed files + run: | + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ env.GITHUB_BASE_REF }}..${{ env.GITHUB_SHA }}")" + - name: Get Composer Cache Directory id: composer-cache run: | @@ -59,7 +67,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "4.3.*" - run: composer install --no-progress - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v + - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${PKG_PHP_CHANGED_FILES[@]} tests: runs-on: ubuntu-latest From 845ee13c5966797270fa7ea3db0279e1c2ca2724 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 01:19:36 +0200 Subject: [PATCH 0844/1142] Add file diff --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 60f6a4c01..736167a09 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: - name: Set changed files run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ env.GITHUB_BASE_REF }}..${{ env.GITHUB_SHA }}")" + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ env.GITHUB_BASE_REF }} ${{ env.GITHUB_SHA }}")" - name: Get Composer Cache Directory id: composer-cache @@ -33,7 +33,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "4.3.*" - run: composer install --no-progress - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${PKG_PHP_CHANGED_FILES[@]} + - run: if [ ! -z "${PKG_PHP_CHANGED_FILES}" ]; then docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${PKG_PHP_CHANGED_FILES[@]} ; fi code_style_check: name: Code style check @@ -43,7 +43,7 @@ jobs: - name: Set changed files run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ env.GITHUB_BASE_REF }}..${{ env.GITHUB_SHA }}")" + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ env.GITHUB_BASE_REF }} ${{ env.GITHUB_SHA }}")" - name: Get Composer Cache Directory id: composer-cache @@ -67,7 +67,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "4.3.*" - run: composer install --no-progress - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${PKG_PHP_CHANGED_FILES[@]} + - run: if [ ! -z "${PKG_PHP_CHANGED_FILES}" ]; then ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${PKG_PHP_CHANGED_FILES[@]} ; fi tests: runs-on: ubuntu-latest From 62015f0c3e6986fa3eb58b201b6024b0570a204d Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 01:22:06 +0200 Subject: [PATCH 0845/1142] Add file diff --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 736167a09..b7fe758e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: - name: Set changed files run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ env.GITHUB_BASE_REF }} ${{ env.GITHUB_SHA }}")" + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ github.base_ref }} ${{ github.sha }}")" - name: Get Composer Cache Directory id: composer-cache @@ -43,7 +43,7 @@ jobs: - name: Set changed files run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ env.GITHUB_BASE_REF }} ${{ env.GITHUB_SHA }}")" + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ github.base_ref }} ${{ github.sha }}")" - name: Get Composer Cache Directory id: composer-cache From 5adc0dafa7e75ce7586cecc24247819426b801a1 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 01:34:16 +0200 Subject: [PATCH 0846/1142] Add file diff --- .github/workflows/ci.yml | 6 ++++-- bin/git-find-changed-php-files.sh | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7fe758e0..15538d90f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,8 @@ jobs: - name: Set changed files run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ github.base_ref }} ${{ github.sha }}")" + echo "ALL_CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB ${{ github.base_ref }}..${{ github.sha }});" + echo 'PKG_PHP_CHANGED_FILES=$(echo "$ALL_CHANGED_FILES" | grep -E "^pkg\/" | grep -E ".*?\.php$");' - name: Get Composer Cache Directory id: composer-cache @@ -43,7 +44,8 @@ jobs: - name: Set changed files run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ github.base_ref }} ${{ github.sha }}")" + echo "ALL_CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB ${{ github.base_ref }}..${{ github.sha }});" + echo 'PKG_PHP_CHANGED_FILES=$(echo "$ALL_CHANGED_FILES" | grep -E "^pkg\/" | grep -E ".*?\.php$");' - name: Get Composer Cache Directory id: composer-cache diff --git a/bin/git-find-changed-php-files.sh b/bin/git-find-changed-php-files.sh index e256b5f24..bb65a2d7b 100755 --- a/bin/git-find-changed-php-files.sh +++ b/bin/git-find-changed-php-files.sh @@ -12,4 +12,5 @@ IFS=' ALL_CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB "$1"); PKG_PHP_CHANGED_FILES=$(echo "$ALL_CHANGED_FILES" | grep -E "^pkg\/" | grep -E ".*?\.php$"); -echo "$PKG_PHP_CHANGED_FILES"; +echo "$ALL_PHP_CHANGED_FILES"; +#echo "$PKG_PHP_CHANGED_FILES"; From e6b418902ff0bb7de409181d81a384eeecbe26ca Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 01:39:14 +0200 Subject: [PATCH 0847/1142] Add file diff --- .github/workflows/ci.yml | 6 ++---- bin/git-find-changed-php-files.sh | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 15538d90f..7cac92a00 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,8 +9,7 @@ jobs: - name: Set changed files run: | - echo "ALL_CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB ${{ github.base_ref }}..${{ github.sha }});" - echo 'PKG_PHP_CHANGED_FILES=$(echo "$ALL_CHANGED_FILES" | grep -E "^pkg\/" | grep -E ".*?\.php$");' + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ github.base_ref }}..${{ github.head_ref }}")" - name: Get Composer Cache Directory id: composer-cache @@ -44,8 +43,7 @@ jobs: - name: Set changed files run: | - echo "ALL_CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB ${{ github.base_ref }}..${{ github.sha }});" - echo 'PKG_PHP_CHANGED_FILES=$(echo "$ALL_CHANGED_FILES" | grep -E "^pkg\/" | grep -E ".*?\.php$");' + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ github.base_ref }}..${{ github.head_ref }}")" - name: Get Composer Cache Directory id: composer-cache diff --git a/bin/git-find-changed-php-files.sh b/bin/git-find-changed-php-files.sh index bb65a2d7b..e256b5f24 100755 --- a/bin/git-find-changed-php-files.sh +++ b/bin/git-find-changed-php-files.sh @@ -12,5 +12,4 @@ IFS=' ALL_CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB "$1"); PKG_PHP_CHANGED_FILES=$(echo "$ALL_CHANGED_FILES" | grep -E "^pkg\/" | grep -E ".*?\.php$"); -echo "$ALL_PHP_CHANGED_FILES"; -#echo "$PKG_PHP_CHANGED_FILES"; +echo "$PKG_PHP_CHANGED_FILES"; From 446d1a3c0eb1d4f3b4826e03bba211ef43cf1aa7 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 01:51:14 +0200 Subject: [PATCH 0848/1142] Add file diff --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7cac92a00..ec3c77f8b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: - name: Set changed files run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ github.base_ref }}..${{ github.head_ref }}")" + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "origin/${{ github.base_ref }}..${{ github.head_ref }}")" - name: Get Composer Cache Directory id: composer-cache @@ -43,7 +43,7 @@ jobs: - name: Set changed files run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "${{ github.base_ref }}..${{ github.head_ref }}")" + echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "origin/${{ github.base_ref }}..${{ github.head_ref }}")" - name: Get Composer Cache Directory id: composer-cache From b732d967cc58d29952763c775be372255639d7b5 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 19 Jan 2021 02:01:54 +0200 Subject: [PATCH 0849/1142] Add file diff --- .github/workflows/ci.yml | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec3c77f8b..92c2a840d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,9 +7,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set changed files - run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "origin/${{ github.base_ref }}..${{ github.head_ref }}")" + - uses: technote-space/get-diff-action@v4 + with: + PATTERNS: | + pkg/**/*.php - name: Get Composer Cache Directory id: composer-cache @@ -33,7 +34,9 @@ jobs: - run: php ./bin/fix-symfony-version.php "4.3.*" - run: composer install --no-progress - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: if [ ! -z "${PKG_PHP_CHANGED_FILES}" ]; then docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${PKG_PHP_CHANGED_FILES[@]} ; fi + + - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${{ env.GIT_DIFF_FILTERED }} + if: env.GIT_DIFF_FILTERED code_style_check: name: Code style check @@ -41,9 +44,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set changed files - run: | - echo "PKG_PHP_CHANGED_FILES=$(./bin/git-find-changed-php-files.sh "origin/${{ github.base_ref }}..${{ github.head_ref }}")" + - uses: technote-space/get-diff-action@v4 + with: + PATTERNS: | + pkg/**/*.php - name: Get Composer Cache Directory id: composer-cache @@ -67,7 +71,9 @@ jobs: - run: php ./bin/fix-symfony-version.php "4.3.*" - run: composer install --no-progress - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: if [ ! -z "${PKG_PHP_CHANGED_FILES}" ]; then ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${PKG_PHP_CHANGED_FILES[@]} ; fi + + - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} + if: env.GIT_DIFF_FILTERED tests: runs-on: ubuntu-latest From 0e2200720eca9ced587e1b2ffb894220c810de96 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 20 Jan 2021 22:18:09 +0200 Subject: [PATCH 0850/1142] rm travis --- .travis.yml | 91 ----------------------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7c3c68762..000000000 --- a/.travis.yml +++ /dev/null @@ -1,91 +0,0 @@ -git: - depth: 10 - -language: php -dist: bionic - -matrix: - include: - - php: 7.1 - sudo: false - env: SYMFONY_VERSION=4.3.* PHPSTAN=true - - php: 7.1 - sudo: false - env: SYMFONY_VERSION=4.3.* PHP_CS_FIXER=true - - php: 7.1 - sudo: false - env: SYMFONY_VERSION=4.3.* UNIT_TESTS=true - - php: 7.2 - sudo: false - env: SYMFONY_VERSION=4.3.* UNIT_TESTS=true - - php: 7.2 - sudo: false - env: SYMFONY_VERSION=5.0.* UNIT_TESTS=true - - php: 7.3 - sudo: false - env: SYMFONY_VERSION=4.3.* UNIT_TESTS=true - - php: 7.3 - sudo: false - env: SYMFONY_VERSION=4.4.* UNIT_TESTS=true - - php: 7.3 - sudo: false - env: SYMFONY_VERSION=5.0.* UNIT_TESTS=true - - php: 7.4 - sudo: false - env: SYMFONY_VERSION=4.3.* UNIT_TESTS=true - - php: 7.4 - sudo: false - env: SYMFONY_VERSION=4.4.* UNIT_TESTS=true - - php: 7.4 - sudo: false - env: SYMFONY_VERSION=5.0.* UNIT_TESTS=true - - php: 7.1 - sudo: required - services: docker - env: SYMFONY_VERSION=4.3.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - - php: 7.3 - sudo: required - services: docker - env: SYMFONY_VERSION=5.0.* FUNCTIONAL_TESTS=true PREPARE_CONTAINER=true - - php: 7.1 - sudo: required - services: docker - env: SYMFONY_VERSION=4.3.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true - allow_failures: - - env: SYMFONY_VERSION=4.3.* RDKAFKA_TESTS=true PREPARE_CONTAINER=true - -cache: - directories: - - $HOME/.composer/cache - - $HOME/php-cs-fixer - -before_install: - - echo "extension = mongodb.so" >> $HOME/.phpenv/versions/$(phpenv version-name)/etc/php.ini - - echo "extension = redis.so" >> $HOME/.phpenv/versions/$(phpenv version-name)/etc/php.ini - -install: - - rm $HOME/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini; - - echo "memory_limit=2048M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - - php ./bin/fix-symfony-version.php "$SYMFONY_VERSION" - - composer install - - sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - if [ "$PREPARE_CONTAINER" = true ]; then docker --version; fi - - if [ "$PREPARE_CONTAINER" = true ]; then docker-compose --version; fi - - if [ "$PREPARE_CONTAINER" = true ]; then bin/dev -b; fi - -script: - - PKG_PHP_CHANGED_FILES=`./bin/git-find-changed-php-files.sh "${TRAVIS_COMMIT_RANGE}"` - - if [ "$PHP_CS_FIXER" = true ] && [ ! -z "${PKG_PHP_CHANGED_FILES}" ]; then ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${PKG_PHP_CHANGED_FILES[@]} ; fi - - if [ "$PHPSTAN" = true ] && [ ! -z "${PKG_PHP_CHANGED_FILES}" ]; then docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon -- ${PKG_PHP_CHANGED_FILES[@]} ; fi - - if [ "$UNIT_TESTS" = true ]; then bin/phpunit --exclude-group=functional; fi - - if [ "$FUNCTIONAL_TESTS" = true ]; then bin/test.sh --exclude-group=rdkafka; fi - - if [ "$RDKAFKA_TESTS" = true ]; then bin/test.sh --group=rdkafka; fi - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/3f8b3668e7792de23a49 - on_success: change - on_failure: always - on_start: never - From 4205783277bd611e790e571680b080bac2ef8a47 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 20 Jan 2021 22:31:46 +0200 Subject: [PATCH 0851/1142] 0.10.6 changelog --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19683ca8c..0a35b9528 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Change Log +## [0.10.6](https://github.com/php-enqueue/enqueue-dev/tree/0.10.6) (2020-10-16) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.5...0.10.6) + +**Merged pull requests:** + +- fixing issue \#1085 [\#1105](https://github.com/php-enqueue/enqueue-dev/pull/1105) ([nivpenso](https://github.com/nivpenso)) +- Fix DoctrineConnectionFactoryFactory due to doctrine/common changes [\#1089](https://github.com/php-enqueue/enqueue-dev/pull/1089) ([kdefives](https://github.com/kdefives)) + +## [0.10.5](https://github.com/php-enqueue/enqueue-dev/tree/0.10.5) (2020-10-09) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.4...0.10.5) + +**Merged pull requests:** + +- update image [\#1104](https://github.com/php-enqueue/enqueue-dev/pull/1104) ([nick-zh](https://github.com/nick-zh)) +- \[rdkafka\]use supported librdkafka version of ext [\#1103](https://github.com/php-enqueue/enqueue-dev/pull/1103) ([nick-zh](https://github.com/nick-zh)) +- \[rdkafka\] add non-blocking poll call to serve cb's [\#1102](https://github.com/php-enqueue/enqueue-dev/pull/1102) ([nick-zh](https://github.com/nick-zh)) +- \[rdkafka\] remove topic conf, deprecated [\#1101](https://github.com/php-enqueue/enqueue-dev/pull/1101) ([nick-zh](https://github.com/nick-zh)) +- \[stomp\] Fix - Add automatic reconnect support for STOMP producers [\#1099](https://github.com/php-enqueue/enqueue-dev/pull/1099) ([atrauzzi](https://github.com/atrauzzi)) +- fix localstack version \(one that worked\) [\#1094](https://github.com/php-enqueue/enqueue-dev/pull/1094) ([makasim](https://github.com/makasim)) +- Allow false-y values for unsupported options [\#1093](https://github.com/php-enqueue/enqueue-dev/pull/1093) ([atrauzzi](https://github.com/atrauzzi)) +- Lock doctrine perisistence version. Fix tests. [\#1092](https://github.com/php-enqueue/enqueue-dev/pull/1092) ([makasim](https://github.com/makasim)) + ## [0.10.4](https://github.com/php-enqueue/enqueue-dev/tree/0.10.4) (2020-09-24) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.3...0.10.4) From 8a65ee4f56838e37b806244305ef2214705b4737 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 21 Jan 2021 14:56:03 +0200 Subject: [PATCH 0852/1142] Fix the build matrix --- .github/workflows/ci.yml | 52 ++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 92c2a840d..1f5bbee0f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,47 +80,79 @@ jobs: strategy: matrix: php: ['7.4'] - symfony_version: ['4.3.*'] - experimental: [false] - unit_tests: [true] - functional_tests: [false] - prepare_container: [false] - rdkafka_tests: [false] include: - php: 7.1 symfony_version: 4.3.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.2 symfony_version: 4.3.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.2 symfony_version: 5.0.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.3 symfony_version: 4.3.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.3 symfony_version: 4.4.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.3 symfony_version: 5.0.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.4 symfony_version: 4.3.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.4 symfony_version: 4.4.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.4 symfony_version: 5.0.* - - php: 7.1 + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false + - php: 7.3 # same as in the container symfony_version: 4.3.* unit_tests: false functional_tests: true + rdkafka_tests: false prepare_container: true - - php: 7.3 + - php: 7.3 # same as in the container symfony_version: 5.0.* unit_tests: false functional_tests: true + rdkafka_tests: false prepare_container: true - - php: 7.1 + - php: 7.3 # same as in the container symfony_version: 4.3.* unit_tests: false + functional_tests: false rdkafka_tests: true prepare_container: true - experimental: true name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} From 6faffd46cc921e10fa879673163655ad56afbb36 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 22 Jan 2021 15:01:31 +0200 Subject: [PATCH 0853/1142] Add php 8, drop 7.1 and 7.2; up phpunit to 9.5 --- .github/workflows/ci.yml | 39 +++++++++++++++++++-------------------- composer.json | 4 ++-- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1f5bbee0f..aa56948be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: - uses: shivammathur/setup-php@v2 with: - php-version: '7.1' + php-version: '7.4' coverage: none extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M @@ -63,7 +63,7 @@ jobs: - uses: shivammathur/setup-php@v2 with: - php-version: '7.1' + php-version: '7.4' coverage: none extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M @@ -81,24 +81,6 @@ jobs: matrix: php: ['7.4'] include: - - php: 7.1 - symfony_version: 4.3.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.2 - symfony_version: 4.3.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.2 - symfony_version: 5.0.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - php: 7.3 symfony_version: 4.3.* unit_tests: true @@ -153,6 +135,23 @@ jobs: functional_tests: false rdkafka_tests: true prepare_container: true + - php: 8.0 + symfony_version: 5.2.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false + - php: 8.0 + symfony_version: 5.2.* + unit_tests: false + functional_tests: true + rdkafka_tests: false + prepare_container: true + - php: 8.0 + symfony_version: 5.2.* + unit_tests: false + rdkafka_tests: true + prepare_container: true name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} diff --git a/composer.json b/composer.json index 21cf655c1..c16aaa7d6 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "phpstan": "bin/phpstan analyse --memory-limit=512M -c phpstan.neon" }, "require": { - "php": "^7.1.3", + "php": "^7.3|^8.0", "ext-amqp": "^1.9.3", "ext-gearman": "^2.0", @@ -41,7 +41,7 @@ "datadog/php-datadogstatsd": "^1.3" }, "require-dev": { - "phpunit/phpunit": "^7.5", + "phpunit/phpunit": "^9.5", "phpstan/phpstan": "^0.12", "queue-interop/queue-spec": "^0.6", "symfony/browser-kit": "^3.4|^4", From 87652fe4b3dfc28ea393a1800495243533f9613c Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 22 Jan 2021 15:05:19 +0200 Subject: [PATCH 0854/1142] Disable fail-fast --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa56948be..9b2a50af8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,6 +78,7 @@ jobs: tests: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: php: ['7.4'] include: From 9567c78aaad1768c90365ded94f4464fb254fe89 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 22 Jan 2021 15:09:43 +0200 Subject: [PATCH 0855/1142] Fix test setUp method signatures --- pkg/enqueue-bundle/Tests/Functional/WebTestCase.php | 2 +- pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php | 2 +- pkg/job-queue/Tests/Functional/WebTestCase.php | 2 +- pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php | 2 +- pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php index 8e3569a98..ca462ea1e 100644 --- a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php +++ b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php @@ -20,7 +20,7 @@ abstract class WebTestCase extends BaseWebTestCase */ protected static $container; - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php index 7282aa42e..81bb0091b 100644 --- a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php +++ b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php @@ -25,7 +25,7 @@ class DoctrineConnectionFactoryFactoryTest extends TestCase */ private $factory; - protected function setUp() + protected function setUp(): void { $this->registry = $this->prophesize(ManagerRegistry::class); $this->fallbackFactory = $this->prophesize(ConnectionFactoryFactoryInterface::class); diff --git a/pkg/job-queue/Tests/Functional/WebTestCase.php b/pkg/job-queue/Tests/Functional/WebTestCase.php index 2f8e17cea..90a8188dd 100644 --- a/pkg/job-queue/Tests/Functional/WebTestCase.php +++ b/pkg/job-queue/Tests/Functional/WebTestCase.php @@ -18,7 +18,7 @@ abstract class WebTestCase extends BaseWebTestCase */ protected static $container; - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php index ef8263fa6..7d06df229 100644 --- a/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php +++ b/pkg/sqs/Tests/Functional/SqsCommonUseCasesTest.php @@ -27,7 +27,7 @@ class SqsCommonUseCasesTest extends TestCase */ private $queueName; - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php b/pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php index b9c1a2987..f003825d1 100644 --- a/pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php +++ b/pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php @@ -26,7 +26,7 @@ class SqsConsumptionUseCasesTest extends TestCase */ private $context; - protected function setUp() + protected function setUp(): void { parent::setUp(); From 3731d696da04475e0ee4944a932b06ddd50a4c63 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 22 Jan 2021 15:12:15 +0200 Subject: [PATCH 0856/1142] Fix more setUp signatures --- docs/bundle/functional_testing.md | 2 +- pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php | 2 +- pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php | 2 +- pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php | 2 +- pkg/amqp-tools/Tests/SignalSocketHelperTest.php | 2 +- pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php | 2 +- pkg/dbal/Tests/Functional/DbalConsumerTest.php | 2 +- .../Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php | 2 +- .../DbalSendAndReceivePriorityMessagesFromQueueTest.php | 2 +- .../Tests/Functional/Events/AsyncListenerTest.php | 2 +- .../Tests/Functional/Events/AsyncProcessorTest.php | 2 +- .../Tests/Functional/Events/AsyncSubscriberTest.php | 2 +- pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php | 2 +- pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php | 2 +- pkg/fs/Tests/Functional/FsCommonUseCasesTest.php | 2 +- pkg/fs/Tests/Functional/FsConsumerTest.php | 2 +- pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php | 2 +- pkg/fs/Tests/Functional/FsProducerTest.php | 2 +- pkg/fs/Tests/Functional/FsRpcUseCasesTest.php | 2 +- pkg/gearman/Tests/SkipIfGearmanExtensionIsNotInstalledTrait.php | 2 +- .../Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php | 2 +- .../Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php | 2 +- pkg/mongodb/Tests/Functional/MongodbConsumerTest.php | 2 +- .../Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php | 2 +- .../Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php | 2 +- .../Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php | 2 +- pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php | 2 +- pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php | 2 +- pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php | 2 +- pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php | 2 +- pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php | 2 +- pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php | 2 +- pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/docs/bundle/functional_testing.md b/docs/bundle/functional_testing.md index 7e81f8eaa..ca475a2e4 100644 --- a/docs/bundle/functional_testing.md +++ b/docs/bundle/functional_testing.md @@ -57,7 +57,7 @@ class FooTest extends WebTestCase /** @var \Symfony\Bundle\FrameworkBundle\Client */ private $client; - public function setUp() + public function setUp(): void { $this->client = static::createClient(); } diff --git a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php index ee73345e9..8e8ea2545 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php @@ -22,7 +22,7 @@ class AmqpCommonUseCasesTest extends TestCase */ private $amqpContext; - public function setUp() + public function setUp(): void { $this->amqpContext = $this->buildAmqpContext(); diff --git a/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php index 220554859..09d0a0e99 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php @@ -29,7 +29,7 @@ class AmqpConsumptionUseCasesTest extends TestCase */ private $amqpContext; - public function setUp() + public function setUp(): void { $this->amqpContext = $this->buildAmqpContext(); diff --git a/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php index 9e5dc4df3..5aafe96a4 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php @@ -23,7 +23,7 @@ class AmqpRpcUseCasesTest extends TestCase */ private $amqpContext; - public function setUp() + public function setUp(): void { $this->amqpContext = $this->buildAmqpContext(); diff --git a/pkg/amqp-tools/Tests/SignalSocketHelperTest.php b/pkg/amqp-tools/Tests/SignalSocketHelperTest.php index d869878c9..10903d47d 100644 --- a/pkg/amqp-tools/Tests/SignalSocketHelperTest.php +++ b/pkg/amqp-tools/Tests/SignalSocketHelperTest.php @@ -16,7 +16,7 @@ class SignalSocketHelperTest extends TestCase private $backupSigIntHandler; - public function setUp() + public function setUp(): void { parent::setUp(); diff --git a/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php b/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php index d05a9add5..f073ff515 100644 --- a/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php +++ b/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php @@ -53,7 +53,7 @@ class UseCasesTest extends TestCase */ protected $asyncProcessor; - public function setUp() + public function setUp(): void { (new Filesystem())->remove(__DIR__.'/queues/'); diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index 69b644ed4..709f1eafe 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -21,7 +21,7 @@ class DbalConsumerTest extends TestCase */ private $context; - public function setUp() + public function setUp(): void { $this->context = $this->createDbalContext(); } diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php index 5a051a729..a26c58ef2 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php @@ -16,7 +16,7 @@ class DbalSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceivePrio private $publishedAt; - public function setUp() + public function setUp(): void { parent::setUp(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php index a645cbad6..44fba568f 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php @@ -16,7 +16,7 @@ class DbalSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceivePrio private $publishedAt; - public function setUp() + public function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php index 457a0ffcd..2dcdd251e 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php @@ -16,7 +16,7 @@ */ class AsyncListenerTest extends WebTestCase { - public function setUp() + public function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php index e595414ae..8c8501ad4 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php @@ -18,7 +18,7 @@ */ class AsyncProcessorTest extends WebTestCase { - public function setUp() + public function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php index 7404e6af8..ce9f6456c 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php @@ -16,7 +16,7 @@ */ class AsyncSubscriberTest extends WebTestCase { - public function setUp() + public function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php index fefbe882b..c41a4d2db 100644 --- a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php @@ -11,7 +11,7 @@ */ class LazyProducerTest extends WebTestCase { - public function setUp() + public function setUp(): void { // do not call parent::setUp. // parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 7c2936c0e..2144e42d7 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -20,7 +20,7 @@ class UseCasesTest extends WebTestCase { const RECEIVE_TIMEOUT = 500; - public function setUp() + public function setUp(): void { // do not call parent::setUp. // parent::setUp(); diff --git a/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php b/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php index 1ae462731..9b169a03d 100644 --- a/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php @@ -17,7 +17,7 @@ class FsCommonUseCasesTest extends \PHPUnit\Framework\TestCase */ private $fsContext; - public function setUp() + public function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); diff --git a/pkg/fs/Tests/Functional/FsConsumerTest.php b/pkg/fs/Tests/Functional/FsConsumerTest.php index 9dd7a0103..495989aad 100644 --- a/pkg/fs/Tests/Functional/FsConsumerTest.php +++ b/pkg/fs/Tests/Functional/FsConsumerTest.php @@ -15,7 +15,7 @@ class FsConsumerTest extends TestCase */ private $fsContext; - public function setUp() + public function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); diff --git a/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php b/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php index 98895a62d..28457afbb 100644 --- a/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php @@ -25,7 +25,7 @@ class FsConsumptionUseCasesTest extends \PHPUnit\Framework\TestCase */ private $fsContext; - public function setUp() + public function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); diff --git a/pkg/fs/Tests/Functional/FsProducerTest.php b/pkg/fs/Tests/Functional/FsProducerTest.php index 6f7e4b4fa..ae95ddf68 100644 --- a/pkg/fs/Tests/Functional/FsProducerTest.php +++ b/pkg/fs/Tests/Functional/FsProducerTest.php @@ -14,7 +14,7 @@ class FsProducerTest extends TestCase */ private $fsContext; - public function setUp() + public function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); diff --git a/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php b/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php index 046a25f9c..01b8894f9 100644 --- a/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php @@ -20,7 +20,7 @@ class FsRpcUseCasesTest extends TestCase */ private $fsContext; - public function setUp() + public function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); diff --git a/pkg/gearman/Tests/SkipIfGearmanExtensionIsNotInstalledTrait.php b/pkg/gearman/Tests/SkipIfGearmanExtensionIsNotInstalledTrait.php index 99419eb15..9c680bb67 100644 --- a/pkg/gearman/Tests/SkipIfGearmanExtensionIsNotInstalledTrait.php +++ b/pkg/gearman/Tests/SkipIfGearmanExtensionIsNotInstalledTrait.php @@ -4,7 +4,7 @@ trait SkipIfGearmanExtensionIsNotInstalledTrait { - public function setUp() + public function setUp(): void { if (false == class_exists(\GearmanClient::class)) { $this->markTestSkipped('The gearman extension is not installed'); diff --git a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php index c90432e00..e34d9d1d5 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php @@ -13,7 +13,7 @@ class GearmanSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFro { private $time; - public function setUp() + public function setUp(): void { $this->time = time(); } diff --git a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php index 469f9e997..b68b94480 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -13,7 +13,7 @@ class GearmanSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndRece { private $time; - public function setUp() + public function setUp(): void { $this->time = time(); } diff --git a/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php b/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php index 6e7f01e5c..ccefe0278 100644 --- a/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php @@ -19,7 +19,7 @@ class MongodbConsumerTest extends TestCase */ private $context; - public function setUp() + public function setUp(): void { $this->context = $this->buildMongodbContext(); } diff --git a/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php index 9869d6e06..1f06aac5d 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php @@ -18,7 +18,7 @@ class MongodbSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceiveP private $publishedAt; - public function setUp() + public function setUp(): void { parent::setUp(); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php index a6a5f925a..9a913e422 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php @@ -13,7 +13,7 @@ class PheanstalkSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceive { private $time; - public function setUp() + public function setUp(): void { $this->time = time(); } diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php index 2bf9f9542..c3501f8aa 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -13,7 +13,7 @@ class PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndR { private $time; - public function setUp() + public function setUp(): void { $this->time = time(); } diff --git a/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php b/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php index a63672da8..f54aadf91 100644 --- a/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php @@ -19,7 +19,7 @@ class PRedisCommonUseCasesTest extends TestCase */ private $context; - public function setUp() + public function setUp(): void { $this->context = $this->buildPRedisContext(); diff --git a/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php b/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php index f748020f1..e657b1830 100644 --- a/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php @@ -19,7 +19,7 @@ class PRedisConsumptionUseCasesTest extends TestCase */ private $context; - public function setUp() + public function setUp(): void { $this->context = $this->buildPRedisContext(); diff --git a/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php b/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php index 41b403565..ee4a1a786 100644 --- a/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php @@ -19,7 +19,7 @@ class PhpRedisCommonUseCasesTest extends TestCase */ private $context; - public function setUp() + public function setUp(): void { $this->context = $this->buildPhpRedisContext(); diff --git a/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php b/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php index d48e4bcb4..f255d4ea0 100644 --- a/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php @@ -19,7 +19,7 @@ class PhpRedisConsumptionUseCasesTest extends TestCase */ private $context; - public function setUp() + public function setUp(): void { $this->context = $this->buildPhpRedisContext(); diff --git a/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php b/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php index e2175b8af..1b56893b1 100644 --- a/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php @@ -20,7 +20,7 @@ class StompCommonUseCasesTest extends \PHPUnit\Framework\TestCase */ private $stompContext; - public function setUp() + public function setUp(): void { $this->stompContext = $this->buildStompContext(); diff --git a/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php b/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php index 36357ca21..fd816ccad 100644 --- a/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php @@ -28,7 +28,7 @@ class StompConsumptionUseCasesTest extends \PHPUnit\Framework\TestCase */ private $stompContext; - public function setUp() + public function setUp(): void { $this->stompContext = $this->buildStompContext(); diff --git a/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php b/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php index 4c06d59b1..657510c19 100644 --- a/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php @@ -22,7 +22,7 @@ class StompRpcUseCasesTest extends \PHPUnit\Framework\TestCase */ private $stompContext; - public function setUp() + public function setUp(): void { $this->stompContext = $this->buildStompContext(); From 30687acb9f88dc36d7071408b0b91572fd130df9 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 22 Jan 2021 15:14:11 +0200 Subject: [PATCH 0857/1142] Fix setUpBeforeClass signatures --- pkg/wamp/Tests/Functional/WampConsumerTest.php | 2 +- pkg/wamp/Tests/Functional/WampSubscriptionConsumerTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/wamp/Tests/Functional/WampConsumerTest.php b/pkg/wamp/Tests/Functional/WampConsumerTest.php index f76cce71b..57dc32fd5 100644 --- a/pkg/wamp/Tests/Functional/WampConsumerTest.php +++ b/pkg/wamp/Tests/Functional/WampConsumerTest.php @@ -19,7 +19,7 @@ class WampConsumerTest extends TestCase use WampExtension; use RetryTrait; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { Logger::set(new NullLogger()); } diff --git a/pkg/wamp/Tests/Functional/WampSubscriptionConsumerTest.php b/pkg/wamp/Tests/Functional/WampSubscriptionConsumerTest.php index c28b3e0a5..e272f42ed 100644 --- a/pkg/wamp/Tests/Functional/WampSubscriptionConsumerTest.php +++ b/pkg/wamp/Tests/Functional/WampSubscriptionConsumerTest.php @@ -16,7 +16,7 @@ class WampSubscriptionConsumerTest extends TestCase { use WampExtension; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { Logger::set(new NullLogger()); } From 642c5ef86c389828664e1166d91e93f09361252b Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 20:35:57 +0200 Subject: [PATCH 0858/1142] Fix phpunit compatibility - null queues; - array subset; - is array; - is callable; - read attribute; - add ext-pcntl. --- composer.json | 4 +- .../Tests/AmqpConnectionFactoryTest.php | 4 +- .../Tests/SignalSocketHelperTest.php | 5 ++- .../Tests/DbalConnectionFactoryConfigTest.php | 2 + .../DependencyInjection/ConfigurationTest.php | 45 ++++++++++--------- .../Profiler/MessageQueueCollectorTest.php | 3 +- .../DelayRedeliveredMessageExtensionTest.php | 9 ++-- .../ExclusiveCommandExtensionTest.php | 15 +++---- .../SetRouterPropertiesExtensionTest.php | 9 ++-- .../Tests/Client/Driver/AmqpDriverTest.php | 3 +- .../Tests/Client/Driver/GenericDriverTest.php | 3 +- .../Client/Driver/GenericDriverTestsTrait.php | 5 ++- .../Client/Driver/RabbitMqDriverTest.php | 3 +- pkg/enqueue/Tests/Client/ResourcesTest.php | 6 +-- .../Tests/Client/TraceableProducerTest.php | 29 ++++++------ .../Tests/Consumption/QueueConsumerTest.php | 5 ++- pkg/enqueue/Tests/ResourcesTest.php | 12 ++--- .../BuildClientExtensionsPassTest.php | 14 +++--- .../BuildCommandSubscriberRoutesPassTest.php | 18 ++++---- .../BuildConsumptionExtensionsPassTest.php | 14 +++--- .../BuildProcessorRoutesPassTest.php | 14 +++--- .../BuildTopicSubscriberRoutesPassTest.php | 16 +++---- .../Client/FlushSpoolProducerListenerTest.php | 4 +- .../BuildConsumptionExtensionsPassTest.php | 14 +++--- .../Tests/RedisConnectionFactoryTest.php | 4 +- pkg/sns/Tests/SnsConnectionFactoryTest.php | 2 + pkg/sqs/Tests/SqsConnectionFactoryTest.php | 2 + pkg/stomp/Tests/BufferedStompClientTest.php | 2 + .../Tests/StompConnectionFactoryTest.php | 4 +- pkg/stomp/Tests/StompConsumerTest.php | 2 + pkg/test/ReadAttributeTrait.php | 36 +++++++++++++++ 31 files changed, 186 insertions(+), 122 deletions(-) create mode 100644 pkg/test/ReadAttributeTrait.php diff --git a/composer.json b/composer.json index c16aaa7d6..c13225ac7 100644 --- a/composer.json +++ b/composer.json @@ -41,6 +41,7 @@ "datadog/php-datadogstatsd": "^1.3" }, "require-dev": { + "ext-pcntl": "*", "phpunit/phpunit": "^9.5", "phpstan/phpstan": "^0.12", "queue-interop/queue-spec": "^0.6", @@ -60,7 +61,8 @@ "doctrine/mongodb-odm-bundle": "^3.5|^4", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", - "friendsofphp/php-cs-fixer": "^2" + "friendsofphp/php-cs-fixer": "^2", + "dms/phpunit-arraysubset-asserts": "^0.2.1" }, "autoload": { "psr-4": { diff --git a/pkg/amqp-ext/Tests/AmqpConnectionFactoryTest.php b/pkg/amqp-ext/Tests/AmqpConnectionFactoryTest.php index 0bceae358..7ea58f947 100644 --- a/pkg/amqp-ext/Tests/AmqpConnectionFactoryTest.php +++ b/pkg/amqp-ext/Tests/AmqpConnectionFactoryTest.php @@ -6,12 +6,14 @@ use Enqueue\AmqpExt\AmqpContext; use Enqueue\AmqpTools\RabbitMqDlxDelayStrategy; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\TestCase; class AmqpConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { @@ -34,6 +36,6 @@ public function testShouldCreateLazyContext() $this->assertInstanceOf(AmqpContext::class, $context); $this->assertAttributeEquals(null, 'extChannel', $context); - $this->assertInternalType('callable', $this->readAttribute($context, 'extChannelFactory')); + self::assertIsCallable($this->readAttribute($context, 'extChannelFactory')); } } diff --git a/pkg/amqp-tools/Tests/SignalSocketHelperTest.php b/pkg/amqp-tools/Tests/SignalSocketHelperTest.php index 10903d47d..61e0d2ce6 100644 --- a/pkg/amqp-tools/Tests/SignalSocketHelperTest.php +++ b/pkg/amqp-tools/Tests/SignalSocketHelperTest.php @@ -3,10 +3,13 @@ namespace Enqueue\AmqpTools\Tests; use Enqueue\AmqpTools\SignalSocketHelper; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; class SignalSocketHelperTest extends TestCase { + use ReadAttributeTrait; + /** * @var SignalSocketHelper */ @@ -76,7 +79,7 @@ public function testShouldRegisterHandlerOnBeforeSocketAndBackupCurrentOne() $handlers = $this->readAttribute($this->signalHelper, 'handlers'); - $this->assertInternalType('array', $handlers); + self::assertIsArray($handlers); $this->assertArrayHasKey(SIGTERM, $handlers); $this->assertSame($handler, $handlers[SIGTERM]); } diff --git a/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php b/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php index fb5cae5d5..dda690f9f 100644 --- a/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php +++ b/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\Dbal\DbalConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class DbalConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index 3f3aae8ee..d641227ef 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Bundle\Tests\Unit\DependencyInjection; +use DMS\PHPUnitExtensions\ArraySubset\Assert; use Enqueue\Bundle\DependencyInjection\Configuration; use Enqueue\Test\ClassExtensionTrait; use PHPUnit\Framework\TestCase; @@ -222,7 +223,7 @@ public function testJobShouldBeDisabledByDefault() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'job' => [ 'enabled' => false, @@ -243,7 +244,7 @@ public function testCouldEnableJob() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'job' => true, ], @@ -261,7 +262,7 @@ public function testDoctrinePingConnectionExtensionShouldBeDisabledByDefault() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'doctrine_ping_connection_extension' => false, @@ -284,7 +285,7 @@ public function testDoctrinePingConnectionExtensionCouldBeEnabled() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'doctrine_ping_connection_extension' => true, @@ -304,7 +305,7 @@ public function testDoctrineClearIdentityMapExtensionShouldBeDisabledByDefault() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'doctrine_clear_identity_map_extension' => false, @@ -327,7 +328,7 @@ public function testDoctrineClearIdentityMapExtensionCouldBeEnabled() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'doctrine_clear_identity_map_extension' => true, @@ -347,7 +348,7 @@ public function testDoctrineOdmClearIdentityMapExtensionShouldBeDisabledByDefaul ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'doctrine_odm_clear_identity_map_extension' => false, @@ -370,7 +371,7 @@ public function testDoctrineOdmClearIdentityMapExtensionCouldBeEnabled() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'doctrine_odm_clear_identity_map_extension' => true, @@ -390,7 +391,7 @@ public function testDoctrineClosedEntityManagerExtensionShouldBeDisabledByDefaul ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'doctrine_closed_entity_manager_extension' => false, @@ -413,7 +414,7 @@ public function testDoctrineClosedEntityManagerExtensionCouldBeEnabled() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'doctrine_closed_entity_manager_extension' => true, @@ -433,7 +434,7 @@ public function testResetServicesExtensionShouldBeDisabledByDefault() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'reset_services_extension' => false, @@ -456,7 +457,7 @@ public function testResetServicesExtensionCouldBeEnabled() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'reset_services_extension' => true, @@ -478,7 +479,7 @@ public function testSignalExtensionShouldBeEnabledIfPcntlExtensionIsLoaded() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'signal_extension' => $isLoaded, @@ -501,7 +502,7 @@ public function testSignalExtensionCouldBeDisabled() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'signal_extension' => false, @@ -521,7 +522,7 @@ public function testReplyExtensionShouldBeEnabledByDefault() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'reply_extension' => true, @@ -544,7 +545,7 @@ public function testReplyExtensionCouldBeDisabled() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'extensions' => [ 'reply_extension' => false, @@ -564,7 +565,7 @@ public function testShouldDisableAsyncEventsByDefault() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'async_events' => [ 'enabled' => false, @@ -586,7 +587,7 @@ public function testShouldAllowEnableAsyncEvents() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'async_events' => [ 'enabled' => true, @@ -603,7 +604,7 @@ public function testShouldAllowEnableAsyncEvents() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'async_events' => [ 'enabled' => true, @@ -623,7 +624,7 @@ public function testShouldSetDefaultConfigurationForConsumption() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'consumption' => [ 'receive_timeout' => 10000, @@ -646,7 +647,7 @@ public function testShouldAllowConfigureConsumption() ], ]]); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'default' => [ 'consumption' => [ 'receive_timeout' => 456, @@ -657,6 +658,6 @@ public function testShouldAllowConfigureConsumption() private function assertConfigEquals(array $expected, array $actual): void { - $this->assertArraySubset($expected, $actual, false, var_export($actual, true)); + Assert::assertArraySubset($expected, $actual, false, var_export($actual, true)); } } diff --git a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php index 96d4bc940..55f415d03 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Bundle\Tests\Unit\Profiler; +use DMS\PHPUnitExtensions\ArraySubset\Assert; use Enqueue\Bundle\Profiler\MessageQueueCollector; use Enqueue\Client\MessagePriority; use Enqueue\Client\ProducerInterface; @@ -59,7 +60,7 @@ public function testShouldReturnSentMessageArrayTakenFromTraceableProducers() $collector->collect(new Request(), new Response()); - $this->assertArraySubset( + Assert::assertArraySubset( [ 'foo' => [ [ diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php index 050b4f2f5..61a307a5a 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php @@ -15,6 +15,7 @@ use Interop\Queue\Destination; use Interop\Queue\Message as TransportMessage; use Interop\Queue\Processor; +use Interop\Queue\Queue; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; @@ -169,17 +170,15 @@ private function createProcessorMock(): Processor } /** - * @param mixed $queue - * - * @return MockObject + * @return MockObject|Consumer */ - private function createConsumerStub($queue): Consumer + private function createConsumerStub(?Queue $queue): Consumer { $consumerMock = $this->createMock(Consumer::class); $consumerMock ->expects($this->any()) ->method('getQueue') - ->willReturn($queue) + ->willReturn($queue ?? new NullQueue('queue')) ; return $consumerMock; diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php index 878778b30..1e58d14f8 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php @@ -15,6 +15,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Context as InteropContext; use Interop\Queue\Processor; +use Interop\Queue\Queue; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -243,15 +244,15 @@ public function testShouldDoNothingIfAnotherQueue() } /** - * @return MockObject + * @return MockObject|DriverInterface */ - private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface + private function createDriverStub(?RouteCollection $routeCollection = null): DriverInterface { $driver = $this->createMock(DriverInterface::class); $driver ->expects($this->any()) ->method('getRouteCollection') - ->willReturn($routeCollection) + ->willReturn($routeCollection ?? new RouteCollection()) ; return $driver; @@ -274,17 +275,15 @@ private function createProcessorMock(): Processor } /** - * @param mixed $queue - * - * @return MockObject + * @return MockObject|Consumer */ - private function createConsumerStub($queue): Consumer + private function createConsumerStub(?Queue $queue): Consumer { $consumerMock = $this->createMock(Consumer::class); $consumerMock ->expects($this->any()) ->method('getQueue') - ->willReturn($queue) + ->willReturn($queue ?? new NullQueue('queue')) ; return $consumerMock; diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php index 18760e9bf..e5015ff45 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php @@ -13,6 +13,7 @@ use Interop\Queue\Consumer; use Interop\Queue\Context as InteropContext; use Interop\Queue\Processor; +use Interop\Queue\Queue; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -186,17 +187,15 @@ private function createProcessorMock(): Processor } /** - * @param mixed $queue - * - * @return MockObject + * @return MockObject|Consumer */ - private function createConsumerStub($queue): Consumer + private function createConsumerStub(?Queue $queue): Consumer { $consumerMock = $this->createMock(Consumer::class); $consumerMock ->expects($this->any()) ->method('getQueue') - ->willReturn($queue) + ->willReturn($queue ?? new NullQueue('queue')) ; return $consumerMock; diff --git a/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php b/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php index 4e4cc62fd..3234c45f0 100644 --- a/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Tests\Client\Driver; +use DMS\PHPUnitExtensions\ArraySubset\Assert; use Enqueue\Client\Config; use Enqueue\Client\Driver\AmqpDriver; use Enqueue\Client\Driver\GenericDriver; @@ -336,7 +337,7 @@ protected function getRouterTransportName(): string protected function assertTransportMessage(InteropMessage $transportMessage): void { $this->assertSame('body', $transportMessage->getBody()); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'hkey' => 'hval', 'delivery_mode' => AmqpMessage::DELIVERY_MODE_PERSISTENT, 'content_type' => 'ContentType', diff --git a/pkg/enqueue/Tests/Client/Driver/GenericDriverTest.php b/pkg/enqueue/Tests/Client/Driver/GenericDriverTest.php index 98b6c2285..78f7f6e83 100644 --- a/pkg/enqueue/Tests/Client/Driver/GenericDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/GenericDriverTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Tests\Client\Driver; +use DMS\PHPUnitExtensions\ArraySubset\Assert; use Enqueue\Client\Config; use Enqueue\Client\Driver\GenericDriver; use Enqueue\Client\DriverInterface; @@ -60,7 +61,7 @@ protected function createMessage(): InteropMessage protected function assertTransportMessage(InteropMessage $transportMessage): void { $this->assertSame('body', $transportMessage->getBody()); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'hkey' => 'hval', 'message_id' => 'theMessageId', 'timestamp' => 1000, diff --git a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php index 4f1c81566..d5ad498a9 100644 --- a/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php +++ b/pkg/enqueue/Tests/Client/Driver/GenericDriverTestsTrait.php @@ -2,6 +2,7 @@ namespace Enqueue\Tests\Client\Driver; +use DMS\PHPUnitExtensions\ArraySubset\Assert; use Enqueue\Client\Config; use Enqueue\Client\DriverInterface; use Enqueue\Client\Message; @@ -1191,10 +1192,10 @@ protected function assertTransportMessage(InteropMessage $transportMessage): voi protected function assertClientMessage(Message $clientMessage): void { $this->assertSame('body', $clientMessage->getBody()); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'hkey' => 'hval', ], $clientMessage->getHeaders()); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'pkey' => 'pval', Config::CONTENT_TYPE => 'theContentType', Config::EXPIRE => '22', diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqDriverTest.php index 2f6e20a82..6b61465c3 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqDriverTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Tests\Client\Driver; +use DMS\PHPUnitExtensions\ArraySubset\Assert; use Enqueue\Client\Config; use Enqueue\Client\Driver\AmqpDriver; use Enqueue\Client\Driver\GenericDriver; @@ -115,7 +116,7 @@ protected function getRouterTransportName(): string protected function assertTransportMessage(InteropMessage $transportMessage): void { $this->assertSame('body', $transportMessage->getBody()); - $this->assertArraySubset([ + Assert::assertArraySubset([ 'hkey' => 'hval', 'delivery_mode' => AmqpMessage::DELIVERY_MODE_PERSISTENT, 'content_type' => 'ContentType', diff --git a/pkg/enqueue/Tests/Client/ResourcesTest.php b/pkg/enqueue/Tests/Client/ResourcesTest.php index c2d2b117d..e79fb9dda 100644 --- a/pkg/enqueue/Tests/Client/ResourcesTest.php +++ b/pkg/enqueue/Tests/Client/ResourcesTest.php @@ -28,7 +28,7 @@ public function testShouldGetAvailableDriverInExpectedFormat() { $availableDrivers = Resources::getAvailableDrivers(); - $this->assertInternalType('array', $availableDrivers); + self::assertIsArray($availableDrivers); $this->assertGreaterThan(0, count($availableDrivers)); $driverInfo = $availableDrivers[0]; @@ -50,7 +50,7 @@ public function testShouldGetAvailableDriverWithRequiredExtensionInExpectedForma { $availableDrivers = Resources::getAvailableDrivers(); - $this->assertInternalType('array', $availableDrivers); + self::assertIsArray($availableDrivers); $this->assertGreaterThan(0, count($availableDrivers)); $driverInfo = $availableDrivers[1]; @@ -72,7 +72,7 @@ public function testShouldGetKnownDriversInExpectedFormat() { $knownDrivers = Resources::getAvailableDrivers(); - $this->assertInternalType('array', $knownDrivers); + self::assertIsArray($knownDrivers); $this->assertGreaterThan(0, count($knownDrivers)); $driverInfo = $knownDrivers[0]; diff --git a/pkg/enqueue/Tests/Client/TraceableProducerTest.php b/pkg/enqueue/Tests/Client/TraceableProducerTest.php index ff5ee83eb..ac0a52961 100644 --- a/pkg/enqueue/Tests/Client/TraceableProducerTest.php +++ b/pkg/enqueue/Tests/Client/TraceableProducerTest.php @@ -2,6 +2,7 @@ namespace Enqueue\Tests\Client; +use DMS\PHPUnitExtensions\ArraySubset\Assert; use Enqueue\Client\Message; use Enqueue\Client\ProducerInterface; use Enqueue\Client\TraceableProducer; @@ -45,7 +46,7 @@ public function testShouldCollectInfoIfStringGivenAsEventMessage() $producer->sendEvent('aFooTopic', 'aFooBody'); - $this->assertArraySubset([ + Assert::assertArraySubset([ [ 'topic' => 'aFooTopic', 'command' => null, @@ -70,7 +71,7 @@ public function testShouldCollectInfoIfArrayGivenAsEventMessage() $producer->sendEvent('aFooTopic', ['foo' => 'fooVal', 'bar' => 'barVal']); - $this->assertArraySubset([ + Assert::assertArraySubset([ [ 'topic' => 'aFooTopic', 'command' => null, @@ -106,7 +107,7 @@ public function testShouldCollectInfoIfEventMessageObjectGivenAsMessage() $producer->sendEvent('aFooTopic', $message); - $this->assertArraySubset([ + Assert::assertArraySubset([ [ 'topic' => 'aFooTopic', 'command' => null, @@ -168,7 +169,7 @@ public function testShouldCollectInfoIfStringGivenAsCommandMessage() $producer->sendCommand('aFooCommand', 'aFooBody'); - $this->assertArraySubset([ + Assert::assertArraySubset([ [ 'topic' => null, 'command' => 'aFooCommand', @@ -193,7 +194,7 @@ public function testShouldCollectInfoIfArrayGivenAsCommandMessage() $producer->sendCommand('aFooCommand', ['foo' => 'fooVal', 'bar' => 'barVal']); - $this->assertArraySubset([ + Assert::assertArraySubset([ [ 'topic' => null, 'command' => 'aFooCommand', @@ -229,7 +230,7 @@ public function testShouldCollectInfoIfCommandMessageObjectGivenAsMessage() $producer->sendCommand('aFooCommand', $message); - $this->assertArraySubset([ + Assert::assertArraySubset([ [ 'topic' => null, 'command' => 'aFooCommand', @@ -275,7 +276,7 @@ public function testShouldAllowGetInfoSentToSameTopic() $producer->sendEvent('aFooTopic', 'aFooBody'); $producer->sendEvent('aFooTopic', 'aFooBody'); - $this->assertArraySubset([ + Assert::assertArraySubset([ ['topic' => 'aFooTopic', 'body' => 'aFooBody'], ['topic' => 'aFooTopic', 'body' => 'aFooBody'], ], $producer->getTraces()); @@ -288,7 +289,7 @@ public function testShouldAllowGetInfoSentToDifferentTopics() $producer->sendEvent('aFooTopic', 'aFooBody'); $producer->sendEvent('aBarTopic', 'aBarBody'); - $this->assertArraySubset([ + Assert::assertArraySubset([ ['topic' => 'aFooTopic', 'body' => 'aFooBody'], ['topic' => 'aBarTopic', 'body' => 'aBarBody'], ], $producer->getTraces()); @@ -301,11 +302,11 @@ public function testShouldAllowGetInfoSentToSpecialTopic() $producer->sendEvent('aFooTopic', 'aFooBody'); $producer->sendEvent('aBarTopic', 'aBarBody'); - $this->assertArraySubset([ + Assert::assertArraySubset([ ['topic' => 'aFooTopic', 'body' => 'aFooBody'], ], $producer->getTopicTraces('aFooTopic')); - $this->assertArraySubset([ + Assert::assertArraySubset([ ['topic' => 'aBarTopic', 'body' => 'aBarBody'], ], $producer->getTopicTraces('aBarTopic')); } @@ -317,7 +318,7 @@ public function testShouldAllowGetInfoSentToSameCommand() $producer->sendCommand('aFooCommand', 'aFooBody'); $producer->sendCommand('aFooCommand', 'aFooBody'); - $this->assertArraySubset([ + Assert::assertArraySubset([ ['command' => 'aFooCommand', 'body' => 'aFooBody'], ['command' => 'aFooCommand', 'body' => 'aFooBody'], ], $producer->getTraces()); @@ -330,7 +331,7 @@ public function testShouldAllowGetInfoSentToDifferentCommands() $producer->sendCommand('aFooCommand', 'aFooBody'); $producer->sendCommand('aBarCommand', 'aBarBody'); - $this->assertArraySubset([ + Assert::assertArraySubset([ ['command' => 'aFooCommand', 'body' => 'aFooBody'], ['command' => 'aBarCommand', 'body' => 'aBarBody'], ], $producer->getTraces()); @@ -343,11 +344,11 @@ public function testShouldAllowGetInfoSentToSpecialCommand() $producer->sendCommand('aFooCommand', 'aFooBody'); $producer->sendCommand('aBarCommand', 'aBarBody'); - $this->assertArraySubset([ + Assert::assertArraySubset([ ['command' => 'aFooCommand', 'body' => 'aFooBody'], ], $producer->getCommandTraces('aFooCommand')); - $this->assertArraySubset([ + Assert::assertArraySubset([ ['command' => 'aBarCommand', 'body' => 'aBarBody'], ], $producer->getCommandTraces('aBarCommand')); } diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 9e25ab931..949c9ca6f 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -21,6 +21,7 @@ use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\Result; use Enqueue\Null\NullQueue; +use Enqueue\Test\ReadAttributeTrait; use Enqueue\Tests\Consumption\Mock\BreakCycleExtension; use Enqueue\Tests\Consumption\Mock\DummySubscriptionConsumer; use Interop\Queue\Consumer; @@ -36,6 +37,8 @@ class QueueConsumerTest extends TestCase { + use ReadAttributeTrait; + public function testCouldBeConstructedWithAllArguments() { new QueueConsumer($this->createContextStub(), null, [], null, 0); @@ -177,7 +180,7 @@ public function testShouldAllowBindCallbackToQueueName() $boundProcessors = $this->readAttribute($consumer, 'boundProcessors'); - $this->assertInternalType('array', $boundProcessors); + self::assertIsArray($boundProcessors); $this->assertCount(1, $boundProcessors); $this->assertArrayHasKey($queueName, $boundProcessors); diff --git a/pkg/enqueue/Tests/ResourcesTest.php b/pkg/enqueue/Tests/ResourcesTest.php index 214a0836f..ec713fd03 100644 --- a/pkg/enqueue/Tests/ResourcesTest.php +++ b/pkg/enqueue/Tests/ResourcesTest.php @@ -28,7 +28,7 @@ public function testShouldGetAvailableConnectionsInExpectedFormat() { $availableConnections = Resources::getAvailableConnections(); - $this->assertInternalType('array', $availableConnections); + self::assertIsArray($availableConnections); $this->assertArrayHasKey(RedisConnectionFactory::class, $availableConnections); $connectionInfo = $availableConnections[RedisConnectionFactory::class]; @@ -46,7 +46,7 @@ public function testShouldGetKnownConnectionsInExpectedFormat() { $availableConnections = Resources::getKnownConnections(); - $this->assertInternalType('array', $availableConnections); + self::assertIsArray($availableConnections); $this->assertArrayHasKey(RedisConnectionFactory::class, $availableConnections); $connectionInfo = $availableConnections[RedisConnectionFactory::class]; @@ -93,12 +93,12 @@ public function testShouldAllowRegisterConnectionThatIsNotInstalled() Resources::addConnection('theConnectionClass', ['foo'], [], 'foo'); $knownConnections = Resources::getKnownConnections(); - $this->assertInternalType('array', $knownConnections); + self::assertIsArray($knownConnections); $this->assertArrayHasKey('theConnectionClass', $knownConnections); $availableConnections = Resources::getAvailableConnections(); - $this->assertInternalType('array', $availableConnections); + self::assertIsArray($availableConnections); $this->assertArrayNotHasKey('theConnectionClass', $availableConnections); } @@ -115,7 +115,7 @@ public function testShouldAllowGetPreviouslyRegisteredConnection() $availableConnections = Resources::getAvailableConnections(); - $this->assertInternalType('array', $availableConnections); + self::assertIsArray($availableConnections); $this->assertArrayHasKey($connectionClass, $availableConnections); $connectionInfo = $availableConnections[$connectionClass]; @@ -133,7 +133,7 @@ public function testShouldHaveRegisteredWampConfiguration() { $availableConnections = Resources::getKnownConnections(); - $this->assertInternalType('array', $availableConnections); + self::assertIsArray($availableConnections); $this->assertArrayHasKey(WampConnectionFactory::class, $availableConnections); $connectionInfo = $availableConnections[WampConnectionFactory::class]; diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php index af69293d1..90c7493c1 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php @@ -72,7 +72,7 @@ public function testShouldRegisterClientExtension() $pass = new BuildClientExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), new Reference('aBarExtension'), @@ -99,7 +99,7 @@ public function testShouldIgnoreOtherClientExtensions() $pass = new BuildClientExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $extensions->getArgument(0)); @@ -125,7 +125,7 @@ public function testShouldAddExtensionIfClientAll() $pass = new BuildClientExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $extensions->getArgument(0)); @@ -151,7 +151,7 @@ public function testShouldTreatTagsWithoutClientAsDefaultClient() $pass = new BuildClientExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), new Reference('aBarExtension'), @@ -247,7 +247,7 @@ public function testShouldMergeWithAddedPreviously() $pass = new BuildClientExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertCount(4, $extensions->getArgument(0)); } @@ -275,12 +275,12 @@ public function testShouldRegisterProcessorWithMatchedNameToCorrespondingExtensi $pass = new BuildClientExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $fooExtensions->getArgument(0)); + self::assertIsArray($fooExtensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $fooExtensions->getArgument(0)); - $this->assertInternalType('array', $barExtensions->getArgument(0)); + self::assertIsArray($barExtensions->getArgument(0)); $this->assertEquals([ new Reference('aBarExtension'), ], $barExtensions->getArgument(0)); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php index 346c0cbdb..a2e964dcc 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php @@ -96,7 +96,7 @@ public function testShouldRegisterProcessorWithMatchedName() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -120,7 +120,7 @@ public function testShouldRegisterProcessorWithoutNameToDefaultClient() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -144,7 +144,7 @@ public function testShouldRegisterProcessorIfClientNameEqualsAll() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -166,7 +166,7 @@ public function testShouldRegisterProcessorIfCommandsIsString() $pass = new BuildCommandSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); $this->assertEquals( @@ -222,7 +222,7 @@ public function testShouldRegisterProcessorIfCommandsAreStrings() $pass = new BuildCommandSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(2, $routeCollection->getArgument(0)); $this->assertEquals( @@ -266,7 +266,7 @@ public function testShouldRegisterProcessorIfParamSingleCommandArray() $pass = new BuildCommandSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); @@ -305,7 +305,7 @@ public function testShouldRegisterProcessorIfCommandsAreParamArrays() $pass = new BuildCommandSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(2, $routeCollection->getArgument(0)); $this->assertEquals( @@ -372,7 +372,7 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() $pass = new BuildCommandSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(3, $routeCollection->getArgument(0)); $this->assertEquals( @@ -422,7 +422,7 @@ public function testShouldRegister08CommandProcessor() $pass = new BuildCommandSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); $this->assertEquals( diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php index db991e982..a94636261 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php @@ -72,7 +72,7 @@ public function testShouldRegisterClientExtension() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), new Reference('aBarExtension'), @@ -99,7 +99,7 @@ public function testShouldIgnoreOtherClientExtensions() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $extensions->getArgument(0)); @@ -125,7 +125,7 @@ public function testShouldAddExtensionIfClientAll() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $extensions->getArgument(0)); @@ -151,7 +151,7 @@ public function testShouldTreatTagsWithoutClientAsDefaultClient() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), new Reference('aBarExtension'), @@ -247,7 +247,7 @@ public function testShouldMergeWithAddedPreviously() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertCount(4, $extensions->getArgument(0)); } @@ -275,12 +275,12 @@ public function testShouldRegisterProcessorWithMatchedNameToCorrespondingExtensi $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $fooExtensions->getArgument(0)); + self::assertIsArray($fooExtensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $fooExtensions->getArgument(0)); - $this->assertInternalType('array', $barExtensions->getArgument(0)); + self::assertIsArray($barExtensions->getArgument(0)); $this->assertEquals([ new Reference('aBarExtension'), ], $barExtensions->getArgument(0)); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php index 74553e6eb..b2839c466 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php @@ -112,7 +112,7 @@ public function testShouldRegisterProcessorWithMatchedName() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -136,7 +136,7 @@ public function testShouldRegisterProcessorWithoutNameToDefaultClient() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -160,7 +160,7 @@ public function testShouldRegisterProcessorIfClientNameEqualsAll() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -180,7 +180,7 @@ public function testShouldRegisterAsTopicProcessor() $pass = new BuildProcessorRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); $this->assertEquals( @@ -212,7 +212,7 @@ public function testShouldRegisterAsCommandProcessor() $pass = new BuildProcessorRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); $this->assertEquals( @@ -244,7 +244,7 @@ public function testShouldRegisterWithCustomProcessorName() $pass = new BuildProcessorRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); $this->assertEquals( @@ -279,7 +279,7 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() $pass = new BuildProcessorRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(3, $routeCollection->getArgument(0)); $this->assertEquals( diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php index 65b64dcc8..af1c6a37a 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php @@ -96,7 +96,7 @@ public function testShouldRegisterProcessorWithMatchedName() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -120,7 +120,7 @@ public function testShouldRegisterProcessorWithoutNameToDefaultClient() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -144,7 +144,7 @@ public function testShouldRegisterProcessorIfClientNameEqualsAll() $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); } @@ -166,7 +166,7 @@ public function testShouldRegisterProcessorIfTopicsIsString() $pass = new BuildTopicSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(1, $routeCollection->getArgument(0)); $this->assertEquals( @@ -222,7 +222,7 @@ public function testShouldRegisterProcessorIfTopicsAreStrings() $pass = new BuildTopicSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(2, $routeCollection->getArgument(0)); $this->assertEquals( @@ -265,7 +265,7 @@ public function testShouldRegisterProcessorIfTopicsAreParamArrays() $pass = new BuildTopicSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(2, $routeCollection->getArgument(0)); $this->assertEquals( @@ -332,7 +332,7 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() $pass = new BuildTopicSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(3, $routeCollection->getArgument(0)); $this->assertEquals( @@ -379,7 +379,7 @@ public function testShouldRegister08TopicSubscriber() $pass = new BuildTopicSubscriberRoutesPass(); $pass->process($container); - $this->assertInternalType('array', $routeCollection->getArgument(0)); + self::assertIsArray($routeCollection->getArgument(0)); $this->assertCount(2, $routeCollection->getArgument(0)); $this->assertEquals( diff --git a/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php b/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php index e7ca3ffd5..3476c101e 100644 --- a/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php @@ -23,7 +23,7 @@ public function testShouldSubscribeOnKernelTerminateEvent() { $events = FlushSpoolProducerListener::getSubscribedEvents(); - $this->assertInternalType('array', $events); + self::assertIsArray($events); $this->assertArrayHasKey(KernelEvents::TERMINATE, $events); $this->assertEquals('flushMessages', $events[KernelEvents::TERMINATE]); @@ -33,7 +33,7 @@ public function testShouldSubscribeOnConsoleTerminateEvent() { $events = FlushSpoolProducerListener::getSubscribedEvents(); - $this->assertInternalType('array', $events); + self::assertIsArray($events); $this->assertArrayHasKey(ConsoleEvents::TERMINATE, $events); $this->assertEquals('flushMessages', $events[ConsoleEvents::TERMINATE]); diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php index b26b4481f..f16daf08a 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php @@ -72,7 +72,7 @@ public function testShouldRegisterTransportExtension() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), new Reference('aBarExtension'), @@ -99,7 +99,7 @@ public function testShouldIgnoreOtherTransportExtensions() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $extensions->getArgument(0)); @@ -125,7 +125,7 @@ public function testShouldAddExtensionIfTransportAll() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $extensions->getArgument(0)); @@ -151,7 +151,7 @@ public function testShouldTreatTagsWithoutTransportAsDefaultTransport() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), new Reference('aBarExtension'), @@ -247,7 +247,7 @@ public function testShouldMergeWithAddedPreviously() $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $extensions->getArgument(0)); + self::assertIsArray($extensions->getArgument(0)); $this->assertCount(4, $extensions->getArgument(0)); } @@ -275,12 +275,12 @@ public function testShouldRegisterProcessorWithMatchedNameToCorrespondingRegistr $pass = new BuildConsumptionExtensionsPass(); $pass->process($container); - $this->assertInternalType('array', $fooExtensions->getArgument(0)); + self::assertIsArray($fooExtensions->getArgument(0)); $this->assertEquals([ new Reference('aFooExtension'), ], $fooExtensions->getArgument(0)); - $this->assertInternalType('array', $barExtensions->getArgument(0)); + self::assertIsArray($barExtensions->getArgument(0)); $this->assertEquals([ new Reference('aBarExtension'), ], $barExtensions->getArgument(0)); diff --git a/pkg/redis/Tests/RedisConnectionFactoryTest.php b/pkg/redis/Tests/RedisConnectionFactoryTest.php index 049feaef9..1f9b3a259 100644 --- a/pkg/redis/Tests/RedisConnectionFactoryTest.php +++ b/pkg/redis/Tests/RedisConnectionFactoryTest.php @@ -5,12 +5,14 @@ use Enqueue\Redis\RedisConnectionFactory; use Enqueue\Redis\RedisContext; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\TestCase; class RedisConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { @@ -26,6 +28,6 @@ public function testShouldCreateLazyContext() $this->assertInstanceOf(RedisContext::class, $context); $this->assertAttributeEquals(null, 'redis', $context); - $this->assertInternalType('callable', $this->readAttribute($context, 'redisFactory')); + self::assertIsCallable($this->readAttribute($context, 'redisFactory')); } } diff --git a/pkg/sns/Tests/SnsConnectionFactoryTest.php b/pkg/sns/Tests/SnsConnectionFactoryTest.php index 104c4dc18..37fe6043a 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryTest.php @@ -7,12 +7,14 @@ use Enqueue\Sns\SnsConnectionFactory; use Enqueue\Sns\SnsContext; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\TestCase; class SnsConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { diff --git a/pkg/sqs/Tests/SqsConnectionFactoryTest.php b/pkg/sqs/Tests/SqsConnectionFactoryTest.php index 189cfe7f8..9eb072c77 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryTest.php @@ -7,12 +7,14 @@ use Enqueue\Sqs\SqsConnectionFactory; use Enqueue\Sqs\SqsContext; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\TestCase; class SqsConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { diff --git a/pkg/stomp/Tests/BufferedStompClientTest.php b/pkg/stomp/Tests/BufferedStompClientTest.php index 8732170e9..684edf397 100644 --- a/pkg/stomp/Tests/BufferedStompClientTest.php +++ b/pkg/stomp/Tests/BufferedStompClientTest.php @@ -4,6 +4,7 @@ use Enqueue\Stomp\BufferedStompClient; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Enqueue\Test\WriteAttributeTrait; use Stomp\Client; use Stomp\Network\Connection; @@ -12,6 +13,7 @@ class BufferedStompClientTest extends \PHPUnit\Framework\TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; use WriteAttributeTrait; public function testShouldExtendLibStompClient() diff --git a/pkg/stomp/Tests/StompConnectionFactoryTest.php b/pkg/stomp/Tests/StompConnectionFactoryTest.php index 91986e6d0..1f39e3b20 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryTest.php @@ -5,11 +5,13 @@ use Enqueue\Stomp\StompConnectionFactory; use Enqueue\Stomp\StompContext; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; class StompConnectionFactoryTest extends \PHPUnit\Framework\TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { @@ -26,7 +28,7 @@ public function testShouldCreateLazyContext() $this->assertAttributeEquals(null, 'stomp', $context); $this->assertAttributeEquals(true, 'useExchangePrefix', $context); - $this->assertInternalType('callable', $this->readAttribute($context, 'stompFactory')); + self::assertIsCallable($this->readAttribute($context, 'stompFactory')); } public function testShouldCreateRabbitMQContext() diff --git a/pkg/stomp/Tests/StompConsumerTest.php b/pkg/stomp/Tests/StompConsumerTest.php index ff07ebde1..25a873430 100644 --- a/pkg/stomp/Tests/StompConsumerTest.php +++ b/pkg/stomp/Tests/StompConsumerTest.php @@ -8,6 +8,7 @@ use Enqueue\Stomp\StompDestination; use Enqueue\Stomp\StompMessage; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Consumer; use Interop\Queue\Exception\InvalidMessageException; use Interop\Queue\Message; @@ -17,6 +18,7 @@ class StompConsumerTest extends \PHPUnit\Framework\TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementMessageConsumerInterface() { diff --git a/pkg/test/ReadAttributeTrait.php b/pkg/test/ReadAttributeTrait.php new file mode 100644 index 000000000..73209105e --- /dev/null +++ b/pkg/test/ReadAttributeTrait.php @@ -0,0 +1,36 @@ +setAccessible(true); + $value = $refProperty->getValue($object); + $refProperty->setAccessible(false); + + return $value; + } + + private function assertAttributeSame($expected, string $attribute, object $object): void + { + static::assertSame($expected, $this->readAttribute($object, $attribute)); + } + + private function assertAttributeEquals($expected, string $attribute, object $object): void + { + static::assertEquals($expected, $this->readAttribute($object, $attribute)); + } + + private function assertAttributeInstanceOf(string $expected, string $attribute, object $object): void + { + static::assertInstanceOf($expected, $this->readAttribute($object, $attribute)); + } + + private function assertAttributeCount(int $count, string $attribute, object $object): void + { + static::assertCount($count, $this->readAttribute($object, $attribute)); + } +} From d38fc1d2f58fbbec9721f12f910431c55b87d619 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 20:36:17 +0200 Subject: [PATCH 0859/1142] Remove php 8 from the build matrix for now --- .github/workflows/ci.yml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9b2a50af8..48cb4f16c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -136,23 +136,6 @@ jobs: functional_tests: false rdkafka_tests: true prepare_container: true - - php: 8.0 - symfony_version: 5.2.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 8.0 - symfony_version: 5.2.* - unit_tests: false - functional_tests: true - rdkafka_tests: false - prepare_container: true - - php: 8.0 - symfony_version: 5.2.* - unit_tests: false - rdkafka_tests: true - prepare_container: true name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} From da22b9010ffd14c1a2985f2f960e89335e9b0436 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 20:45:22 +0200 Subject: [PATCH 0860/1142] Fix more attributes; nullable params --- pkg/amqp-ext/Tests/AmqpContextTest.php | 2 ++ pkg/async-command/Tests/RunCommandProcessorTest.php | 3 +++ pkg/async-event-dispatcher/Tests/AsyncListenerTest.php | 2 ++ .../Tests/ContainerAwareRegistryTest.php | 2 ++ pkg/dbal/Tests/DbalSubscriptionConsumerTest.php | 3 +++ pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php | 2 ++ .../ExclusiveCommandExtensionTest.php | 2 +- pkg/enqueue/Tests/Client/RouterProcessorTest.php | 8 +++++--- .../Consumption/FallbackSubscriptionConsumerTest.php | 3 +++ pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php | 4 ++-- pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php | 2 +- .../Tests/Symfony/Client/SimpleConsumeCommandTest.php | 4 ++-- pkg/fs/Tests/FsConnectionFactoryTest.php | 2 ++ pkg/fs/Tests/FsContextTest.php | 2 ++ pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php | 3 +++ pkg/redis/Tests/RedisConnectionFactoryConfigTest.php | 2 ++ pkg/redis/Tests/RedisSubscriptionConsumerTest.php | 3 +++ 17 files changed, 40 insertions(+), 9 deletions(-) diff --git a/pkg/amqp-ext/Tests/AmqpContextTest.php b/pkg/amqp-ext/Tests/AmqpContextTest.php index bcf3b2200..4c4ab4298 100644 --- a/pkg/amqp-ext/Tests/AmqpContextTest.php +++ b/pkg/amqp-ext/Tests/AmqpContextTest.php @@ -9,6 +9,7 @@ use Enqueue\Null\NullQueue; use Enqueue\Null\NullTopic; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Amqp\Impl\AmqpMessage; use Interop\Amqp\Impl\AmqpQueue; use Interop\Amqp\Impl\AmqpTopic; @@ -20,6 +21,7 @@ class AmqpContextTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementQueueInteropContextInterface() { diff --git a/pkg/async-command/Tests/RunCommandProcessorTest.php b/pkg/async-command/Tests/RunCommandProcessorTest.php index 3065ec315..7a7a36428 100644 --- a/pkg/async-command/Tests/RunCommandProcessorTest.php +++ b/pkg/async-command/Tests/RunCommandProcessorTest.php @@ -3,11 +3,14 @@ namespace Enqueue\AsyncCommand\Tests; use Enqueue\AsyncCommand\RunCommandProcessor; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Processor; use PHPUnit\Framework\TestCase; class RunCommandProcessorTest extends TestCase { + use ReadAttributeTrait; + public function testShouldImplementProcessorInterface() { $rc = new \ReflectionClass(RunCommandProcessor::class); diff --git a/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php b/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php index c5a1c3567..f00635245 100644 --- a/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php +++ b/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php @@ -8,6 +8,7 @@ use Enqueue\Null\NullMessage; use Enqueue\Null\NullQueue; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Context; use Interop\Queue\Producer; use PHPUnit\Framework\MockObject\MockObject; @@ -20,6 +21,7 @@ class AsyncListenerTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testCouldBeConstructedWithContextAndRegistryAndEventQueueAsString() { diff --git a/pkg/async-event-dispatcher/Tests/ContainerAwareRegistryTest.php b/pkg/async-event-dispatcher/Tests/ContainerAwareRegistryTest.php index 125550268..3be3b5f3c 100644 --- a/pkg/async-event-dispatcher/Tests/ContainerAwareRegistryTest.php +++ b/pkg/async-event-dispatcher/Tests/ContainerAwareRegistryTest.php @@ -6,12 +6,14 @@ use Enqueue\AsyncEventDispatcher\EventTransformer; use Enqueue\AsyncEventDispatcher\Registry; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\Container; class ContainerAwareRegistryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementRegistryInterface() { diff --git a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php index 82787f19f..a3fad6e66 100644 --- a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php +++ b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php @@ -7,6 +7,7 @@ use Enqueue\Dbal\DbalConsumer; use Enqueue\Dbal\DbalContext; use Enqueue\Dbal\DbalSubscriptionConsumer; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Consumer; use Interop\Queue\Queue; use Interop\Queue\SubscriptionConsumer; @@ -15,6 +16,8 @@ class DbalSubscriptionConsumerTest extends TestCase { + use ReadAttributeTrait; + public function testShouldImplementSubscriptionConsumerInterface() { $rc = new \ReflectionClass(DbalSubscriptionConsumer::class); diff --git a/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php b/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php index 3adefff01..77cdbe1f0 100644 --- a/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php +++ b/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php @@ -7,6 +7,7 @@ use Enqueue\Dbal\DbalContext; use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -14,6 +15,7 @@ class ManagerRegistryConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php index 1e58d14f8..dc2c00c96 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php @@ -252,7 +252,7 @@ private function createDriverStub(?RouteCollection $routeCollection = null): Dri $driver ->expects($this->any()) ->method('getRouteCollection') - ->willReturn($routeCollection ?? new RouteCollection()) + ->willReturn($routeCollection ?? new RouteCollection([])) ; return $driver; diff --git a/pkg/enqueue/Tests/Client/RouterProcessorTest.php b/pkg/enqueue/Tests/Client/RouterProcessorTest.php index cdd44df7a..e2611d09c 100644 --- a/pkg/enqueue/Tests/Client/RouterProcessorTest.php +++ b/pkg/enqueue/Tests/Client/RouterProcessorTest.php @@ -13,6 +13,7 @@ use Enqueue\Null\NullContext; use Enqueue\Null\NullMessage; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Destination; use Interop\Queue\Message as TransportMessage; use Interop\Queue\Processor; @@ -21,6 +22,7 @@ class RouterProcessorTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementProcessorInterface() { @@ -195,15 +197,15 @@ public function testShouldDoNotModifyOriginalMessage() } /** - * @return \PHPUnit\Framework\MockObject\MockObject + * @return \PHPUnit\Framework\MockObject\MockObject|DriverInterface */ - private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface + private function createDriverStub(?RouteCollection $routeCollection = null): DriverInterface { $driver = $this->createMock(DriverInterface::class); $driver ->expects($this->any()) ->method('getRouteCollection') - ->willReturn($routeCollection) + ->willReturn($routeCollection ?? new RouteCollection([])) ; return $driver; diff --git a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php index 62066737c..4f8ac7a55 100644 --- a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php @@ -3,6 +3,7 @@ namespace Enqueue\Tests\Consumption; use Enqueue\Consumption\FallbackSubscriptionConsumer; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Consumer; use Interop\Queue\Message as InteropMessage; use Interop\Queue\Queue as InteropQueue; @@ -11,6 +12,8 @@ class FallbackSubscriptionConsumerTest extends TestCase { + use ReadAttributeTrait; + public function testShouldImplementSubscriptionConsumerInterface() { $rc = new \ReflectionClass(FallbackSubscriptionConsumer::class); diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index be7de228e..706aee07c 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -605,13 +605,13 @@ private function createQueueConsumerMock() /** * @return \PHPUnit\Framework\MockObject\MockObject|DriverInterface */ - private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface + private function createDriverStub(?RouteCollection $routeCollection = null): DriverInterface { $driverMock = $this->createMock(DriverInterface::class); $driverMock ->expects($this->any()) ->method('getRouteCollection') - ->willReturn($routeCollection) + ->willReturn($routeCollection ?? new RouteCollection([])) ; $driverMock diff --git a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php index d9935bdf4..de29e4c04 100644 --- a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php @@ -331,7 +331,7 @@ public function testShouldOutputRouteOptions() } /** - * @return \PHPUnit\Framework\MockObject\MockObject + * @return \PHPUnit\Framework\MockObject\MockObject|DriverInterface */ private function createDriverStub(Config $config, RouteCollection $routeCollection): DriverInterface { diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php index 8f23acdbc..fb89dae32 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php @@ -122,13 +122,13 @@ private function createQueueConsumerMock() /** * @return \PHPUnit\Framework\MockObject\MockObject|DriverInterface */ - private function createDriverStub(RouteCollection $routeCollection = null): DriverInterface + private function createDriverStub(?RouteCollection $routeCollection = null): DriverInterface { $driverMock = $this->createMock(DriverInterface::class); $driverMock ->expects($this->any()) ->method('getRouteCollection') - ->willReturn($routeCollection) + ->willReturn($routeCollection ?? new RouteCollection([])) ; $driverMock diff --git a/pkg/fs/Tests/FsConnectionFactoryTest.php b/pkg/fs/Tests/FsConnectionFactoryTest.php index 35558573a..2df442342 100644 --- a/pkg/fs/Tests/FsConnectionFactoryTest.php +++ b/pkg/fs/Tests/FsConnectionFactoryTest.php @@ -5,11 +5,13 @@ use Enqueue\Fs\FsConnectionFactory; use Enqueue\Fs\FsContext; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; class FsConnectionFactoryTest extends \PHPUnit\Framework\TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { diff --git a/pkg/fs/Tests/FsContextTest.php b/pkg/fs/Tests/FsContextTest.php index 377ec0007..a99276bbe 100644 --- a/pkg/fs/Tests/FsContextTest.php +++ b/pkg/fs/Tests/FsContextTest.php @@ -9,6 +9,7 @@ use Enqueue\Fs\FsProducer; use Enqueue\Null\NullQueue; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Context; use Interop\Queue\Exception\InvalidDestinationException; use Makasim\File\TempFile; @@ -16,6 +17,7 @@ class FsContextTest extends \PHPUnit\Framework\TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementContextInterface() { diff --git a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php index 7d3cb44f4..0fc5afae4 100644 --- a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php @@ -7,6 +7,7 @@ use Enqueue\Mongodb\MongodbConsumer; use Enqueue\Mongodb\MongodbContext; use Enqueue\Mongodb\MongodbSubscriptionConsumer; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Consumer; use Interop\Queue\Queue; use Interop\Queue\SubscriptionConsumer; @@ -14,6 +15,8 @@ class MongodbSubscriptionConsumerTest extends TestCase { + use ReadAttributeTrait; + public function testShouldImplementSubscriptionConsumerInterface() { $rc = new \ReflectionClass(MongodbSubscriptionConsumer::class); diff --git a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php index eee32baac..13eba9589 100644 --- a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php +++ b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php @@ -5,6 +5,7 @@ use Enqueue\Redis\Redis; use Enqueue\Redis\RedisConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -13,6 +14,7 @@ class RedisConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { diff --git a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php index ac8300cd2..b3ba4d26b 100644 --- a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php +++ b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php @@ -5,6 +5,7 @@ use Enqueue\Redis\RedisConsumer; use Enqueue\Redis\RedisContext; use Enqueue\Redis\RedisSubscriptionConsumer; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Consumer; use Interop\Queue\Queue; use Interop\Queue\SubscriptionConsumer; @@ -12,6 +13,8 @@ class RedisSubscriptionConsumerTest extends TestCase { + use ReadAttributeTrait; + public function testShouldImplementSubscriptionConsumerInterface() { $rc = new \ReflectionClass(RedisSubscriptionConsumer::class); From 69383000b4d042a24ee471d51233b251ae6b9736 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 20:58:12 +0200 Subject: [PATCH 0861/1142] Fix more attributes; void returns; assert string contains; resource; --- pkg/dbal/Tests/DbalConnectionFactoryTest.php | 2 ++ pkg/dbal/Tests/DbalContextTest.php | 2 ++ .../Tests/Functional/RoutesCommandTest.php | 20 +++++++++---------- .../Tests/Consumption/QueueConsumerTest.php | 4 ---- .../Symfony/Client/RoutesCommandTest.php | 2 +- .../Symfony/Client/SetupBrokerCommandTest.php | 4 ++-- .../Client/SimpleSetupBrokerCommandTest.php | 2 +- pkg/enqueue/Tests/Util/UUIDTest.php | 2 +- .../Tests/FsConnectionFactoryConfigTest.php | 2 ++ .../GearmanConnectionFactoryConfigTest.php | 2 ++ .../Tests/GpsConnectionFactoryConfigTest.php | 2 ++ .../Tests/MongodbConnectionFactoryTest.php | 2 ++ pkg/mongodb/Tests/MongodbContextTest.php | 2 ++ .../PheanstalkConnectionFactoryConfigTest.php | 2 ++ pkg/rdkafka/Tests/JsonSerializerTest.php | 2 +- .../Tests/RdKafkaConnectionFactoryTest.php | 3 +++ pkg/redis/Tests/Spec/JsonSerializerTest.php | 2 +- .../Tests/SnsConnectionFactoryConfigTest.php | 2 ++ .../Tests/SqsConnectionFactoryConfigTest.php | 2 ++ .../Functional/StompConnectionFactoryTest.php | 2 ++ .../StompConnectionFactoryConfigTest.php | 2 ++ pkg/wamp/Tests/Spec/JsonSerializerTest.php | 2 +- 22 files changed, 45 insertions(+), 22 deletions(-) diff --git a/pkg/dbal/Tests/DbalConnectionFactoryTest.php b/pkg/dbal/Tests/DbalConnectionFactoryTest.php index b4a6857f6..6e633cec0 100644 --- a/pkg/dbal/Tests/DbalConnectionFactoryTest.php +++ b/pkg/dbal/Tests/DbalConnectionFactoryTest.php @@ -5,12 +5,14 @@ use Enqueue\Dbal\DbalConnectionFactory; use Enqueue\Dbal\DbalContext; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\TestCase; class DbalConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { diff --git a/pkg/dbal/Tests/DbalContextTest.php b/pkg/dbal/Tests/DbalContextTest.php index b89abae2e..0b793e6e7 100644 --- a/pkg/dbal/Tests/DbalContextTest.php +++ b/pkg/dbal/Tests/DbalContextTest.php @@ -9,6 +9,7 @@ use Enqueue\Dbal\DbalMessage; use Enqueue\Dbal\DbalProducer; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Context; use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; @@ -19,6 +20,7 @@ class DbalContextTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementContextInterface() { diff --git a/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php b/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php index 4970e9b43..66833b1ce 100644 --- a/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/RoutesCommandTest.php @@ -26,11 +26,11 @@ public function testShouldDisplayRegisteredTopics() $tester->execute([]); $this->assertSame(0, $tester->getStatusCode()); - $this->assertContains('| topic', $tester->getDisplay()); - $this->assertContains('| theTopic', $tester->getDisplay()); - $this->assertContains('| default (prefixed)', $tester->getDisplay()); - $this->assertContains('| test_topic_subscriber_processor', $tester->getDisplay()); - $this->assertContains('| (hidden)', $tester->getDisplay()); + $this->assertStringContainsString('| topic', $tester->getDisplay()); + $this->assertStringContainsString('| theTopic', $tester->getDisplay()); + $this->assertStringContainsString('| default (prefixed)', $tester->getDisplay()); + $this->assertStringContainsString('| test_topic_subscriber_processor', $tester->getDisplay()); + $this->assertStringContainsString('| (hidden)', $tester->getDisplay()); } public function testShouldDisplayCommands() @@ -42,10 +42,10 @@ public function testShouldDisplayCommands() $tester->execute([]); $this->assertSame(0, $tester->getStatusCode()); - $this->assertContains('| command', $tester->getDisplay()); - $this->assertContains('| theCommand', $tester->getDisplay()); - $this->assertContains('| test_command_subscriber_processor', $tester->getDisplay()); - $this->assertContains('| default (prefixed)', $tester->getDisplay()); - $this->assertContains('| (hidden)', $tester->getDisplay()); + $this->assertStringContainsString('| command', $tester->getDisplay()); + $this->assertStringContainsString('| theCommand', $tester->getDisplay()); + $this->assertStringContainsString('| test_command_subscriber_processor', $tester->getDisplay()); + $this->assertStringContainsString('| default (prefixed)', $tester->getDisplay()); + $this->assertStringContainsString('| (hidden)', $tester->getDisplay()); } } diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 949c9ca6f..5023beacd 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -206,7 +206,6 @@ public function testShouldUseContextSubscriptionConsumerIfSupport() $contextSubscriptionConsumer ->expects($this->once()) ->method('consume') - ->willReturn(null) ; $fallbackSubscriptionConsumer = $this->createSubscriptionConsumerMock(); @@ -254,7 +253,6 @@ public function testShouldUseFallbackSubscriptionConsumerIfNotSupported() $fallbackSubscriptionConsumer ->expects($this->once()) ->method('consume') - ->willReturn(null) ; $contextMock = $this->createContextWithoutSubscriptionConsumerMock(); @@ -291,7 +289,6 @@ public function testShouldSubscribeToGivenQueueWithExpectedTimeout() ->expects($this->once()) ->method('consume') ->with(12345) - ->willReturn(null) ; $contextMock = $this->createContextWithoutSubscriptionConsumerMock(); @@ -322,7 +319,6 @@ public function testShouldSubscribeToGivenQueueAndQuitAfterFifthConsumeCycle() $subscriptionConsumerMock ->expects($this->exactly(5)) ->method('consume') - ->willReturn(null) ; $contextMock = $this->createContextWithoutSubscriptionConsumerMock(); diff --git a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php index de29e4c04..04980c135 100644 --- a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php @@ -116,7 +116,7 @@ public function testShouldUseFooDriver() '--client' => 'foo', ]); - $this->assertContains('Found 1 routes', $tester->getDisplay()); + $this->assertStringContainsString('Found 1 routes', $tester->getDisplay()); } public function testThrowIfClientNotFound() diff --git a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php index 358206dc7..82345b2bf 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php @@ -78,7 +78,7 @@ public function testShouldCallDriverSetupBrokerMethod() $tester = new CommandTester($command); $tester->execute([]); - $this->assertContains('Broker set up', $tester->getDisplay()); + $this->assertStringContainsString('Broker set up', $tester->getDisplay()); } public function testShouldCallRequestedClientDriverSetupBrokerMethod() @@ -105,7 +105,7 @@ public function testShouldCallRequestedClientDriverSetupBrokerMethod() '--client' => 'foo', ]); - $this->assertContains('Broker set up', $tester->getDisplay()); + $this->assertStringContainsString('Broker set up', $tester->getDisplay()); } public function testShouldThrowIfClientNotFound() diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php index 0d30582e1..f9a66129c 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php @@ -74,7 +74,7 @@ public function testShouldCallDriverSetupBrokerMethod() $tester = new CommandTester($command); $tester->execute([]); - $this->assertContains('Broker set up', $tester->getDisplay()); + $this->assertStringContainsString('Broker set up', $tester->getDisplay()); } /** diff --git a/pkg/enqueue/Tests/Util/UUIDTest.php b/pkg/enqueue/Tests/Util/UUIDTest.php index ac3090315..f21693e78 100644 --- a/pkg/enqueue/Tests/Util/UUIDTest.php +++ b/pkg/enqueue/Tests/Util/UUIDTest.php @@ -11,7 +11,7 @@ public function testShouldGenerateUniqueId() { $uuid = UUID::generate(); - $this->assertInternalType('string', $uuid); + $this->assertIsString($uuid); $this->assertEquals(36, strlen($uuid)); } diff --git a/pkg/fs/Tests/FsConnectionFactoryConfigTest.php b/pkg/fs/Tests/FsConnectionFactoryConfigTest.php index 59193d26d..970fef395 100644 --- a/pkg/fs/Tests/FsConnectionFactoryConfigTest.php +++ b/pkg/fs/Tests/FsConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\Fs\FsConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class FsConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { diff --git a/pkg/gearman/Tests/GearmanConnectionFactoryConfigTest.php b/pkg/gearman/Tests/GearmanConnectionFactoryConfigTest.php index bb8ab7ad6..84826d5f9 100644 --- a/pkg/gearman/Tests/GearmanConnectionFactoryConfigTest.php +++ b/pkg/gearman/Tests/GearmanConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\Gearman\GearmanConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class GearmanConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; use SkipIfGearmanExtensionIsNotInstalledTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() diff --git a/pkg/gps/Tests/GpsConnectionFactoryConfigTest.php b/pkg/gps/Tests/GpsConnectionFactoryConfigTest.php index a1700f64f..039e86cd4 100644 --- a/pkg/gps/Tests/GpsConnectionFactoryConfigTest.php +++ b/pkg/gps/Tests/GpsConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\Gps\GpsConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class GpsConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { diff --git a/pkg/mongodb/Tests/MongodbConnectionFactoryTest.php b/pkg/mongodb/Tests/MongodbConnectionFactoryTest.php index c15b0fa43..d5dd9ca45 100644 --- a/pkg/mongodb/Tests/MongodbConnectionFactoryTest.php +++ b/pkg/mongodb/Tests/MongodbConnectionFactoryTest.php @@ -5,6 +5,7 @@ use Enqueue\Mongodb\MongodbConnectionFactory; use Enqueue\Mongodb\MongodbContext; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\TestCase; @@ -14,6 +15,7 @@ class MongodbConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { diff --git a/pkg/mongodb/Tests/MongodbContextTest.php b/pkg/mongodb/Tests/MongodbContextTest.php index 32835c90e..94da3ae6a 100644 --- a/pkg/mongodb/Tests/MongodbContextTest.php +++ b/pkg/mongodb/Tests/MongodbContextTest.php @@ -8,6 +8,7 @@ use Enqueue\Mongodb\MongodbMessage; use Enqueue\Mongodb\MongodbProducer; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\Context; use Interop\Queue\Destination; use Interop\Queue\Exception\InvalidDestinationException; @@ -21,6 +22,7 @@ class MongodbContextTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementContextInterface() { diff --git a/pkg/pheanstalk/Tests/PheanstalkConnectionFactoryConfigTest.php b/pkg/pheanstalk/Tests/PheanstalkConnectionFactoryConfigTest.php index 231ec0d77..ef0030d42 100644 --- a/pkg/pheanstalk/Tests/PheanstalkConnectionFactoryConfigTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\Pheanstalk\PheanstalkConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class PheanstalkConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { diff --git a/pkg/rdkafka/Tests/JsonSerializerTest.php b/pkg/rdkafka/Tests/JsonSerializerTest.php index 6513a2257..84f09a698 100644 --- a/pkg/rdkafka/Tests/JsonSerializerTest.php +++ b/pkg/rdkafka/Tests/JsonSerializerTest.php @@ -43,7 +43,7 @@ public function testThrowIfFailedToEncodeMessageToJson() $resource = fopen(__FILE__, 'r'); //guard - $this->assertInternalType('resource', $resource); + $this->assertIsResource($resource); $message = new RdKafkaMessage('theBody', ['aProp' => $resource]); diff --git a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php index 47fdc1715..29501965b 100644 --- a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php @@ -3,6 +3,7 @@ namespace Enqueue\RdKafka\Tests; use Enqueue\RdKafka\RdKafkaConnectionFactory; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -10,6 +11,8 @@ */ class RdKafkaConnectionFactoryTest extends TestCase { + use ReadAttributeTrait; + public function testThrowNeitherArrayStringNorNullGivenAsConfig() { $this->expectException(\LogicException::class); diff --git a/pkg/redis/Tests/Spec/JsonSerializerTest.php b/pkg/redis/Tests/Spec/JsonSerializerTest.php index 7516090a9..e374ea170 100644 --- a/pkg/redis/Tests/Spec/JsonSerializerTest.php +++ b/pkg/redis/Tests/Spec/JsonSerializerTest.php @@ -43,7 +43,7 @@ public function testThrowIfFailedToEncodeMessageToJson() $resource = fopen(__FILE__, 'r'); //guard - $this->assertInternalType('resource', $resource); + $this->assertIsResource($resource); $message = new RedisMessage('theBody', ['aProp' => $resource]); diff --git a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php index d9cbff390..5dd3a2baa 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\Sns\SnsConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class SnsConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { diff --git a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php index 8225a4d34..83c656c0b 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\Sqs\SqsConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class SqsConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { diff --git a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php index 9029c17c1..6d4223616 100644 --- a/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php +++ b/pkg/stomp/Tests/Functional/StompConnectionFactoryTest.php @@ -4,6 +4,7 @@ use Enqueue\Stomp\StompConnectionFactory; use Enqueue\Test\RabbitmqStompExtension; +use Enqueue\Test\ReadAttributeTrait; use Stomp\Network\Observer\Exception\HeartbeatException; use Stomp\Network\Observer\HeartbeatEmitter; use Stomp\Network\Observer\ServerAliveObserver; @@ -14,6 +15,7 @@ class StompConnectionFactoryTest extends \PHPUnit\Framework\TestCase { use RabbitmqStompExtension; + use ReadAttributeTrait; public function testShouldNotCreateConnectionWithSendHeartbeat() { diff --git a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php index 50031e1e7..3899f3c76 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\Stomp\StompConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class StompConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { diff --git a/pkg/wamp/Tests/Spec/JsonSerializerTest.php b/pkg/wamp/Tests/Spec/JsonSerializerTest.php index 1e7e29413..eaa3c6bc2 100644 --- a/pkg/wamp/Tests/Spec/JsonSerializerTest.php +++ b/pkg/wamp/Tests/Spec/JsonSerializerTest.php @@ -43,7 +43,7 @@ public function testThrowIfFailedToEncodeMessageToJson() $resource = fopen(__FILE__, 'r'); //guard - $this->assertInternalType('resource', $resource); + $this->assertIsResource($resource); $message = new WampMessage('theBody', ['aProp' => $resource]); From 689c70ae847361f7bf15fbd228b1a99bc27064bd Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 21:07:30 +0200 Subject: [PATCH 0862/1142] Fix more attributes and nullables --- pkg/amqp-bunny/Tests/AmqpConnectionFactoryTest.php | 2 ++ pkg/amqp-lib/Tests/AmqpConnectionFactoryTest.php | 2 ++ pkg/dbal/Tests/DbalConnectionFactoryTest.php | 2 +- pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php | 2 +- pkg/enqueue/Tests/Consumption/QueueConsumerTest.php | 3 +++ pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php | 3 +++ pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php | 3 +++ pkg/fs/Tests/LegacyFilesystemLockTest.php | 2 ++ pkg/redis/Tests/RedisProducerTest.php | 2 +- pkg/stomp/Tests/StompConsumerTest.php | 4 ++-- 10 files changed, 20 insertions(+), 5 deletions(-) diff --git a/pkg/amqp-bunny/Tests/AmqpConnectionFactoryTest.php b/pkg/amqp-bunny/Tests/AmqpConnectionFactoryTest.php index 56d819206..da54dfc0d 100644 --- a/pkg/amqp-bunny/Tests/AmqpConnectionFactoryTest.php +++ b/pkg/amqp-bunny/Tests/AmqpConnectionFactoryTest.php @@ -5,12 +5,14 @@ use Enqueue\AmqpBunny\AmqpConnectionFactory; use Enqueue\AmqpTools\RabbitMqDlxDelayStrategy; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\TestCase; class AmqpConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { diff --git a/pkg/amqp-lib/Tests/AmqpConnectionFactoryTest.php b/pkg/amqp-lib/Tests/AmqpConnectionFactoryTest.php index 9db9f6288..1a2cf4e4d 100644 --- a/pkg/amqp-lib/Tests/AmqpConnectionFactoryTest.php +++ b/pkg/amqp-lib/Tests/AmqpConnectionFactoryTest.php @@ -5,12 +5,14 @@ use Enqueue\AmqpLib\AmqpConnectionFactory; use Enqueue\AmqpTools\RabbitMqDlxDelayStrategy; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Interop\Queue\ConnectionFactory; use PHPUnit\Framework\TestCase; class AmqpConnectionFactoryTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementConnectionFactoryInterface() { diff --git a/pkg/dbal/Tests/DbalConnectionFactoryTest.php b/pkg/dbal/Tests/DbalConnectionFactoryTest.php index 6e633cec0..105466c26 100644 --- a/pkg/dbal/Tests/DbalConnectionFactoryTest.php +++ b/pkg/dbal/Tests/DbalConnectionFactoryTest.php @@ -28,7 +28,7 @@ public function testShouldCreateLazyContext() $this->assertInstanceOf(DbalContext::class, $context); $this->assertAttributeEquals(null, 'connection', $context); - $this->assertAttributeInternalType('callable', 'connectionFactory', $context); + $this->assertIsCallable($this->readAttribute($context, 'connectionFactory')); } public function testShouldParseGenericDSN() diff --git a/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php b/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php index 77cdbe1f0..83135c2ed 100644 --- a/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php +++ b/pkg/dbal/Tests/ManagerRegistryConnectionFactoryTest.php @@ -73,7 +73,7 @@ public function testShouldCreateLazyContext() $this->assertInstanceOf(DbalContext::class, $context); $this->assertAttributeEquals(null, 'connection', $context); - $this->assertAttributeInternalType('callable', 'connectionFactory', $context); + $this->assertIsCallable($this->readAttribute($context, 'connectionFactory')); } /** diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 5023beacd..a087926ad 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -1537,6 +1537,9 @@ private function createExtension() */ private function createConsumerStub($queue = null): Consumer { + if ($queue === null) { + $queue = 'queue'; + } if (is_string($queue)) { $queue = new NullQueue($queue); } diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 706aee07c..fcc099538 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -677,6 +677,9 @@ private function createExtension() */ private function createConsumerStub($queue = null): Consumer { + if ($queue === null) { + $queue = 'queue'; + } if (is_string($queue)) { $queue = new NullQueue($queue); } diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index c2f2257c0..cfcfd520c 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -221,6 +221,9 @@ private function createExtension() */ private function createConsumerStub($queue = null): Consumer { + if ($queue === null) { + $queue = 'queue'; + } if (is_string($queue)) { $queue = new NullQueue($queue); } diff --git a/pkg/fs/Tests/LegacyFilesystemLockTest.php b/pkg/fs/Tests/LegacyFilesystemLockTest.php index 77d729886..519712881 100644 --- a/pkg/fs/Tests/LegacyFilesystemLockTest.php +++ b/pkg/fs/Tests/LegacyFilesystemLockTest.php @@ -6,12 +6,14 @@ use Enqueue\Fs\LegacyFilesystemLock; use Enqueue\Fs\Lock; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use Makasim\File\TempFile; use PHPUnit\Framework\TestCase; class LegacyFilesystemLockTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testShouldImplementLockInterface() { diff --git a/pkg/redis/Tests/RedisProducerTest.php b/pkg/redis/Tests/RedisProducerTest.php index fa7260311..ce3c77ad0 100644 --- a/pkg/redis/Tests/RedisProducerTest.php +++ b/pkg/redis/Tests/RedisProducerTest.php @@ -67,7 +67,7 @@ public function testShouldCallLPushOnSend() $this->assertNotEmpty($message['headers']['message_id']); $this->assertSame(0, $message['headers']['attempts']); - return true; + return 1; }) ; diff --git a/pkg/stomp/Tests/StompConsumerTest.php b/pkg/stomp/Tests/StompConsumerTest.php index 25a873430..916166657 100644 --- a/pkg/stomp/Tests/StompConsumerTest.php +++ b/pkg/stomp/Tests/StompConsumerTest.php @@ -523,8 +523,8 @@ public function testShouldGenerateUniqueSubscriptionIdPerConsumer() $fooConsumer = new StompConsumer($this->createStompClientMock(), $destination); $barConsumer = new StompConsumer($this->createStompClientMock(), $destination); - $this->assertAttributeNotEmpty('subscriptionId', $fooConsumer); - $this->assertAttributeNotEmpty('subscriptionId', $barConsumer); + $this->assertNotEmpty($this->readAttribute($fooConsumer, 'subscriptionId')); + $this->assertNotEmpty($this->readAttribute($barConsumer, 'subscriptionId')); $fooSubscriptionId = $this->readAttribute($fooConsumer, 'subscriptionId'); $barSubscriptionId = $this->readAttribute($barConsumer, 'subscriptionId'); From 3eb9ba30842a337d74f98f3037aba729ca1d384e Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 21:09:06 +0200 Subject: [PATCH 0863/1142] Fix annotations --- pkg/test/RetryTrait.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/test/RetryTrait.php b/pkg/test/RetryTrait.php index 17c96ae89..1f1042c81 100644 --- a/pkg/test/RetryTrait.php +++ b/pkg/test/RetryTrait.php @@ -4,6 +4,7 @@ use PHPUnit\Framework\IncompleteTestError; use PHPUnit\Framework\SkippedTestError; +use PHPUnit\Util\Test; trait RetryTrait { @@ -46,7 +47,7 @@ public function runBare(): void */ private function getNumberOfRetries() { - $annotations = $this->getAnnotations(); + $annotations = Test::parseTestMethodAnnotations(static::class, $this->getName(false)); if (isset($annotations['method']['retry'][0])) { return $annotations['method']['retry'][0]; From 2b33202713a6de4163984a6e06afc2be9b710199 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 21:11:36 +0200 Subject: [PATCH 0864/1142] Fix more attributes --- pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php | 4 +++- pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php index d3a6a5dab..0a50218bb 100644 --- a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php @@ -4,6 +4,7 @@ use Enqueue\RdKafka\RdKafkaConnectionFactory; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,7 @@ class RdKafkaConnectionFactoryConfigTest extends TestCase { use ClassExtensionTrait; + use ReadAttributeTrait; public function testThrowNeitherArrayStringNorNullGivenAsConfig() { @@ -39,7 +41,7 @@ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { $factory = new RdKafkaConnectionFactory($config); - $config = $this->getObjectAttribute($factory, 'config'); + $config = $this->readAttribute($factory, 'config'); $this->assertNotEmpty($config['global']['group.id']); diff --git a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php index 29501965b..8af3e8501 100644 --- a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php @@ -41,7 +41,7 @@ public function testShouldBeExpectedDefaultConfig() { $factory = new RdKafkaConnectionFactory(null); - $config = $this->getObjectAttribute($factory, 'config'); + $config = $this->readAttribute($factory, 'config'); $this->assertNotEmpty($config['global']['group.id']); @@ -58,7 +58,7 @@ public function testShouldBeExpectedDefaultDsnConfig() { $factory = new RdKafkaConnectionFactory('kafka:'); - $config = $this->getObjectAttribute($factory, 'config'); + $config = $this->readAttribute($factory, 'config'); $this->assertNotEmpty($config['global']['group.id']); From 63aaebff90e1a703e93f6511cb30d22b8b1c20d8 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 21:22:57 +0200 Subject: [PATCH 0865/1142] Fix datetime equal tests --- .../CalculateRootJobStatusServiceTest.php | 10 ++++- pkg/job-queue/Tests/JobProcessorTest.php | 45 +++++++++++++++---- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php index bcb62531a..f289c314c 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php @@ -102,7 +102,10 @@ public function testShouldCalculateRootJobStatusAndSetStoppedAtTimeIfGotStopStat $case->calculate($childJob); $this->assertEquals($stopStatus, $rootJob->getStatus()); - $this->assertEquals(new \DateTime(), $rootJob->getStoppedAt(), '', 1); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $rootJob->getStoppedAt()->getTimestamp() + ); } public function testShouldSetStoppedAtOnlyIfWasNotSet() @@ -129,7 +132,10 @@ public function testShouldSetStoppedAtOnlyIfWasNotSet() $case = new CalculateRootJobStatusService($em); $case->calculate($childJob); - $this->assertEquals(new \DateTime('2012-12-12 12:12:12'), $rootJob->getStoppedAt()); + $this->assertEquals( + (new \DateTime('2012-12-12 12:12:12'))->getTimestamp(), + $rootJob->getStoppedAt()->getTimestamp() + ); } public function testShouldThrowIfInvalidStatus() diff --git a/pkg/job-queue/Tests/JobProcessorTest.php b/pkg/job-queue/Tests/JobProcessorTest.php index f4e937c02..3f06bf8de 100644 --- a/pkg/job-queue/Tests/JobProcessorTest.php +++ b/pkg/job-queue/Tests/JobProcessorTest.php @@ -60,8 +60,14 @@ public function testShouldCreateRootJobAndReturnIt() $this->assertSame($job, $result); $this->assertEquals(Job::STATUS_NEW, $job->getStatus()); - $this->assertEquals(new \DateTime(), $job->getCreatedAt(), '', 1); - $this->assertEquals(new \DateTime(), $job->getStartedAt(), '', 1); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $job->getCreatedAt()->getTimestamp() + ); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $job->getStartedAt()->getTimestamp() + ); $this->assertNull($job->getStoppedAt()); $this->assertEquals('job-name', $job->getName()); $this->assertEquals('owner-id', $job->getOwnerId()); @@ -183,7 +189,10 @@ public function testCreateChildJobShouldCreateAndSaveJobAndPublishRecalculateRoo $this->assertSame($job, $result); $this->assertEquals(Job::STATUS_NEW, $job->getStatus()); - $this->assertEquals(new \DateTime(), $job->getCreatedAt(), '', 1); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $job->getCreatedAt()->getTimestamp() + ); $this->assertNull($job->getStartedAt()); $this->assertNull($job->getStoppedAt()); $this->assertEquals('job-name', $job->getName()); @@ -256,7 +265,10 @@ public function testStartJobShouldUpdateJobWithRunningStatusAndStartAtTime() $processor->startChildJob($job); $this->assertEquals(Job::STATUS_RUNNING, $job->getStatus()); - $this->assertEquals(new \DateTime(), $job->getStartedAt(), '', 1); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $job->getStartedAt()->getTimestamp() + ); } public function testSuccessChildJobShouldThrowIfRootJob() @@ -325,7 +337,10 @@ public function testSuccessJobShouldUpdateJobWithSuccessStatusAndStopAtTime() $processor->successChildJob($job); $this->assertEquals(Job::STATUS_SUCCESS, $job->getStatus()); - $this->assertEquals(new \DateTime(), $job->getStoppedAt(), '', 1); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $job->getStoppedAt()->getTimestamp() + ); } public function testFailChildJobShouldThrowIfRootJob() @@ -394,7 +409,10 @@ public function testFailJobShouldUpdateJobWithFailStatusAndStopAtTime() $processor->failChildJob($job); $this->assertEquals(Job::STATUS_FAILED, $job->getStatus()); - $this->assertEquals(new \DateTime(), $job->getStoppedAt(), '', 1); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $job->getStoppedAt()->getTimestamp() + ); } public function testCancelChildJobShouldThrowIfRootJob() @@ -463,8 +481,14 @@ public function testCancelJobShouldUpdateJobWithCancelStatusAndStoppedAtTimeAndS $processor->cancelChildJob($job); $this->assertEquals(Job::STATUS_CANCELLED, $job->getStatus()); - $this->assertEquals(new \DateTime(), $job->getStoppedAt(), '', 1); - $this->assertEquals(new \DateTime(), $job->getStartedAt(), '', 1); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $job->getStoppedAt()->getTimestamp() + ); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $job->getStartedAt()->getTimestamp() + ); } public function testInterruptRootJobShouldThrowIfNotRootJob() @@ -536,7 +560,10 @@ public function testInterruptRootJobShouldUpdateJobAndSetInterruptedTrueAndStopp $processor->interruptRootJob($rootJob, true); $this->assertTrue($rootJob->isInterrupted()); - $this->assertEquals(new \DateTime(), $rootJob->getStoppedAt(), '', 1); + $this->assertEquals( + (new \DateTime())->getTimestamp(), + $rootJob->getStoppedAt()->getTimestamp() + ); } /** From 140bc0104221a0c488f02b22c5c366b7038a17cd Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 21 Jan 2021 16:33:24 +0200 Subject: [PATCH 0866/1142] =?UTF-8?q?Fix=20at()=20warnings=20for=20non-log?= =?UTF-8?q?ger=20mocks=20=E2=80=94=20don't=20test=20for=20method=20call=20?= =?UTF-8?q?order?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/amqp-lib/Tests/AmqpContextTest.php | 4 +-- .../Tests/Client/Driver/AmqpDriverTest.php | 23 +++++++-------- .../Tests/Client/Driver/FsDriverTest.php | 8 +++--- .../Tests/Client/Driver/GpsDriverTest.php | 12 ++++---- .../Client/Driver/RabbitMqStompDriverTest.php | 16 +++++------ .../Tests/Client/Driver/RdKafkaDriverTest.php | 6 ++-- .../Tests/Client/Driver/SqsDriverTest.php | 8 +++--- .../Tests/Client/ProducerSendCommandTest.php | 8 +++--- .../Tests/Client/ProducerSendEventTest.php | 12 ++++---- .../Tests/Client/SpoolProducerTest.php | 12 ++++---- .../RouteRecipientListProcessorTest.php | 4 +-- .../Symfony/Client/ConsumeCommandTest.php | 28 +++++++++---------- .../ConfigurableConsumeCommandTest.php | 12 ++++---- .../Tests/Doctrine/JobStorageTest.php | 8 +++--- pkg/redis/Tests/RedisConsumerTest.php | 6 ++-- pkg/redis/Tests/RedisContextTest.php | 12 ++++---- pkg/stomp/Tests/BufferedStompClientTest.php | 8 +++--- 17 files changed, 94 insertions(+), 93 deletions(-) diff --git a/pkg/amqp-lib/Tests/AmqpContextTest.php b/pkg/amqp-lib/Tests/AmqpContextTest.php index 4cfde3c14..ea3bc43c3 100644 --- a/pkg/amqp-lib/Tests/AmqpContextTest.php +++ b/pkg/amqp-lib/Tests/AmqpContextTest.php @@ -322,12 +322,12 @@ public function testShouldSetQos() { $channel = $this->createChannelMock(); $channel - ->expects($this->at(0)) + ->expects(self::once()) ->method('basic_qos') ->with($this->identicalTo(0), $this->identicalTo(1), $this->isFalse()) ; $channel - ->expects($this->at(1)) + ->expects(self::once()) ->method('basic_qos') ->with($this->identicalTo(123), $this->identicalTo(456), $this->isTrue()) ; diff --git a/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php b/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php index 3234c45f0..08b22c713 100644 --- a/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php @@ -22,6 +22,7 @@ use Interop\Queue\Message as InteropMessage; use Interop\Queue\Producer as InteropProducer; use Interop\Queue\Queue as InteropQueue; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpDriverTest extends TestCase @@ -190,54 +191,54 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); // setup router $context - ->expects($this->at(0)) + ->expects(self::once()) ->method('createTopic') ->willReturn($routerTopic) ; $context - ->expects($this->at(1)) + ->expects(self::once()) ->method('declareTopic') ->with($this->identicalTo($routerTopic)) ; $context - ->expects($this->at(2)) + ->expects(self::once()) ->method('createQueue') ->willReturn($routerQueue) ; $context - ->expects($this->at(3)) + ->expects(self::once()) ->method('declareQueue') ->with($this->identicalTo($routerQueue)) ; $context - ->expects($this->at(4)) + ->expects(self::once()) ->method('bind') ->with($this->isInstanceOf(AmqpBind::class)) ; // setup processor with default queue $context - ->expects($this->at(5)) + ->expects(self::once()) ->method('createQueue') ->with($this->getDefaultQueueTransportName()) ->willReturn($processorWithDefaultQueue) ; $context - ->expects($this->at(6)) + ->expects(self::once()) ->method('declareQueue') ->with($this->identicalTo($processorWithDefaultQueue)) ; $context - ->expects($this->at(7)) + ->expects(self::once()) ->method('createQueue') ->with($this->getCustomQueueTransportName()) ->willReturn($processorWithCustomQueue) ; $context - ->expects($this->at(8)) + ->expects(self::once()) ->method('declareQueue') ->with($this->identicalTo($processorWithCustomQueue)) ; @@ -290,7 +291,7 @@ protected function createDriver(...$args): DriverInterface } /** - * @return AmqpContext + * @return AmqpContext|MockObject */ protected function createContextMock(): Context { @@ -298,7 +299,7 @@ protected function createContextMock(): Context } /** - * @return AmqpProducer + * @return AmqpProducer|MockObject */ protected function createProducerMock(): InteropProducer { diff --git a/pkg/enqueue/Tests/Client/Driver/FsDriverTest.php b/pkg/enqueue/Tests/Client/Driver/FsDriverTest.php index f1cd02f9b..a235b64b8 100644 --- a/pkg/enqueue/Tests/Client/Driver/FsDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/FsDriverTest.php @@ -44,23 +44,23 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); // setup router $context - ->expects($this->at(0)) + ->expects(self::once()) ->method('createQueue') ->willReturn($routerQueue) ; $context - ->expects($this->at(1)) + ->expects(self::once()) ->method('declareDestination') ->with($this->identicalTo($routerQueue)) ; // setup processor queue $context - ->expects($this->at(2)) + ->expects(self::once()) ->method('createQueue') ->willReturn($processorQueue) ; $context - ->expects($this->at(3)) + ->expects(self::once()) ->method('declareDestination') ->with($this->identicalTo($processorQueue)) ; diff --git a/pkg/enqueue/Tests/Client/Driver/GpsDriverTest.php b/pkg/enqueue/Tests/Client/Driver/GpsDriverTest.php index c0cac0458..37a97be66 100644 --- a/pkg/enqueue/Tests/Client/Driver/GpsDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/GpsDriverTest.php @@ -46,35 +46,35 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); // setup router $context - ->expects($this->at(0)) + ->expects(self::once()) ->method('createTopic') ->willReturn($routerTopic) ; $context - ->expects($this->at(1)) + ->expects(self::once()) ->method('createQueue') ->willReturn($routerQueue) ; $context - ->expects($this->at(2)) + ->expects(self::once()) ->method('subscribe') ->with($this->identicalTo($routerTopic), $this->identicalTo($routerQueue)) ; $context - ->expects($this->at(3)) + ->expects(self::once()) ->method('createQueue') ->with($this->getDefaultQueueTransportName()) ->willReturn($processorQueue) ; // setup processor queue $context - ->expects($this->at(4)) + ->expects(self::once()) ->method('createTopic') ->with($this->getDefaultQueueTransportName()) ->willReturn($processorTopic) ; $context - ->expects($this->at(5)) + ->expects(self::once()) ->method('subscribe') ->with($this->identicalTo($processorTopic), $this->identicalTo($processorQueue)) ; diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php index 4152f93cc..f59376be4 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php @@ -196,12 +196,12 @@ public function shouldSendMessageToDelayExchangeIfDelaySet() $producer = $this->createProducerMock(); $producer - ->expects($this->at(0)) + ->expects(self::once()) ->method('setDeliveryDelay') ->with(10000) ; $producer - ->expects($this->at(1)) + ->expects(self::once()) ->method('setDeliveryDelay') ->with(null) ; @@ -299,7 +299,7 @@ public function testShouldSetupBroker() $managementClient = $this->createManagementClientMock(); $managementClient - ->expects($this->at(0)) + ->expects(self::once()) ->method('declareExchange') ->with('aprefix.router', [ 'type' => 'fanout', @@ -308,7 +308,7 @@ public function testShouldSetupBroker() ]) ; $managementClient - ->expects($this->at(1)) + ->expects(self::once()) ->method('declareQueue') ->with('aprefix.default', [ 'durable' => true, @@ -319,12 +319,12 @@ public function testShouldSetupBroker() ]) ; $managementClient - ->expects($this->at(2)) + ->expects(self::once()) ->method('bind') ->with('aprefix.router', 'aprefix.default', 'aprefix.default') ; $managementClient - ->expects($this->at(3)) + ->expects(self::once()) ->method('declareQueue') ->with('aprefix.default', [ 'durable' => true, @@ -399,7 +399,7 @@ public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() $managementClient = $this->createManagementClientMock(); $managementClient - ->expects($this->at(4)) + ->expects(self::once()) ->method('declareExchange') ->with('aprefix.default.delayed', [ 'type' => 'x-delayed-message', @@ -411,7 +411,7 @@ public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() ]) ; $managementClient - ->expects($this->at(5)) + ->expects(self::once()) ->method('bind') ->with('aprefix.default.delayed', 'aprefix.default', 'aprefix.default') ; diff --git a/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php index 659590ba3..16d1da929 100644 --- a/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php @@ -47,17 +47,17 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); $context - ->expects($this->at(0)) + ->expects(self::once()) ->method('createQueue') ->willReturn($routerTopic) ; $context - ->expects($this->at(1)) + ->expects(self::once()) ->method('createQueue') ->willReturn($routerQueue) ; $context - ->expects($this->at(2)) + ->expects(self::once()) ->method('createQueue') ->willReturn($processorTopic) ; diff --git a/pkg/enqueue/Tests/Client/Driver/SqsDriverTest.php b/pkg/enqueue/Tests/Client/Driver/SqsDriverTest.php index 2e3005e6a..fb4af5303 100644 --- a/pkg/enqueue/Tests/Client/Driver/SqsDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/SqsDriverTest.php @@ -42,25 +42,25 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); // setup router $context - ->expects($this->at(0)) + ->expects(self::once()) ->method('createQueue') ->with('aprefix_dot_default') ->willReturn($routerQueue) ; $context - ->expects($this->at(1)) + ->expects(self::once()) ->method('declareQueue') ->with($this->identicalTo($routerQueue)) ; // setup processor queue $context - ->expects($this->at(2)) + ->expects(self::once()) ->method('createQueue') ->with('aprefix_dot_default') ->willReturn($processorQueue) ; $context - ->expects($this->at(3)) + ->expects(self::once()) ->method('declareQueue') ->with($this->identicalTo($processorQueue)) ; diff --git a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php index 8ac0704ca..9532ba368 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php @@ -370,7 +370,7 @@ public function testShouldCallPreSendCommandExtensionMethodWhenSendToBus() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onPreSendCommand') ->willReturnCallback(function (PreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -408,7 +408,7 @@ public function testShouldCallPreSendCommandExtensionMethodWhenSendToApplication $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onPreSendCommand') ->willReturnCallback(function (PreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -446,7 +446,7 @@ public function testShouldCallPreDriverSendExtensionMethod() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onDriverPreSend') ->willReturnCallback(function (DriverPreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -478,7 +478,7 @@ public function testShouldCallPostSendExtensionMethod() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onDriverPreSend') ->willReturnCallback(function (PostSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); diff --git a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php index 29a14b7d4..b482492b4 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php @@ -326,7 +326,7 @@ public function testShouldCallPreSendEventExtensionMethodWhenSendToBus() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onPreSendEvent') ->willReturnCallback(function (PreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -364,7 +364,7 @@ public function testShouldCallPreSendEventExtensionMethodWhenSendToApplicationRo $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onPreSendEvent') ->willReturnCallback(function (PreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -402,7 +402,7 @@ public function testShouldCallPreDriverSendExtensionMethodWhenSendToMessageBus() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onDriverPreSend') ->willReturnCallback(function (DriverPreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -434,7 +434,7 @@ public function testShouldCallPreDriverSendExtensionMethodWhenSendToApplicationR $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onDriverPreSend') ->willReturnCallback(function (DriverPreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -466,7 +466,7 @@ public function testShouldCallPostSendExtensionMethodWhenSendToMessageBus() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onPostSend') ->willReturnCallback(function (PostSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -498,7 +498,7 @@ public function testShouldCallPostSendExtensionMethodWhenSendToApplicationRouter $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects($this->at(0)) + ->expects(self::once()) ->method('onDriverPreSend') ->willReturnCallback(function (PostSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); diff --git a/pkg/enqueue/Tests/Client/SpoolProducerTest.php b/pkg/enqueue/Tests/Client/SpoolProducerTest.php index 024fd6da2..df9e728ed 100644 --- a/pkg/enqueue/Tests/Client/SpoolProducerTest.php +++ b/pkg/enqueue/Tests/Client/SpoolProducerTest.php @@ -68,17 +68,17 @@ public function testShouldSendQueuedEventMessagesOnFlush() $realProducer = $this->createProducerMock(); $realProducer - ->expects($this->at(0)) + ->expects(self::once()) ->method('sendEvent') ->with('foo_topic', 'first') ; $realProducer - ->expects($this->at(1)) + ->expects(self::once()) ->method('sendEvent') ->with('bar_topic', ['second']) ; $realProducer - ->expects($this->at(2)) + ->expects(self::once()) ->method('sendEvent') ->with('baz_topic', $this->identicalTo($message)) ; @@ -103,17 +103,17 @@ public function testShouldSendQueuedCommandMessagesOnFlush() $realProducer = $this->createProducerMock(); $realProducer - ->expects($this->at(0)) + ->expects(self::once()) ->method('sendCommand') ->with('foo_command', 'first') ; $realProducer - ->expects($this->at(1)) + ->expects(self::once()) ->method('sendCommand') ->with('bar_command', ['second']) ; $realProducer - ->expects($this->at(2)) + ->expects(self::once()) ->method('sendCommand') ->with('baz_command', $this->identicalTo($message)) ; diff --git a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php index 8a2e089f7..dfc820656 100644 --- a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php +++ b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php @@ -45,12 +45,12 @@ public function testShouldProduceRecipientsMessagesAndAckOriginalMessage() $producerMock = $this->createProducerMock(); $producerMock - ->expects($this->at(0)) + ->expects(self::once()) ->method('send') ->with($this->identicalTo($fooRecipient->getDestination()), $this->identicalTo($fooRecipient->getMessage())) ; $producerMock - ->expects($this->at(1)) + ->expects(self::once()) ->method('send') ->with($this->identicalTo($barRecipient->getDestination()), $this->identicalTo($barRecipient->getMessage())) ; diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index fcc099538..4f1dfe2fa 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -269,13 +269,13 @@ public function testShouldBindCustomExecuteConsumptionAndUseCustomClientDestinat $driver = $this->createDriverStub($routeCollection); $driver - ->expects($this->at(3)) + ->expects(self::once()) ->method('createQueue') ->with('default', true) ->willReturn($defaultQueue) ; $driver - ->expects($this->at(4)) + ->expects(self::once()) ->method('createQueue') ->with('custom', true) ->willReturn($customQueue) @@ -283,17 +283,17 @@ public function testShouldBindCustomExecuteConsumptionAndUseCustomClientDestinat $consumer = $this->createQueueConsumerMock(); $consumer - ->expects($this->at(0)) + ->expects(self::once()) ->method('bind') ->with($this->identicalTo($defaultQueue), $this->identicalTo($processor)) ; $consumer - ->expects($this->at(1)) + ->expects(self::once()) ->method('bind') ->with($this->identicalTo($customQueue), $this->identicalTo($processor)) ; $consumer - ->expects($this->at(2)) + ->expects(self::once()) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; @@ -408,13 +408,13 @@ public function testShouldBindQueuesOnlyOnce() $driver = $this->createDriverStub($routeCollection); $driver - ->expects($this->at(3)) + ->expects(self::once()) ->method('createQueue') ->with('default', true) ->willReturn($defaultQueue) ; $driver - ->expects($this->at(4)) + ->expects(self::once()) ->method('createQueue', true) ->with('custom') ->willReturn($customQueue) @@ -422,17 +422,17 @@ public function testShouldBindQueuesOnlyOnce() $consumer = $this->createQueueConsumerMock(); $consumer - ->expects($this->at(0)) + ->expects(self::once()) ->method('bind') ->with($this->identicalTo($defaultQueue), $this->identicalTo($processor)) ; $consumer - ->expects($this->at(1)) + ->expects(self::once()) ->method('bind') ->with($this->identicalTo($customQueue), $this->identicalTo($processor)) ; $consumer - ->expects($this->at(2)) + ->expects(self::once()) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; @@ -473,7 +473,7 @@ public function testShouldNotBindExternalRoutes() ->with($this->identicalTo($defaultQueue), $this->identicalTo($processor)) ; $consumer - ->expects($this->at(1)) + ->expects(self::once()) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; @@ -513,19 +513,19 @@ public function testShouldSkipQueueConsumptionAndUseCustomClientDestinationName( $driver = $this->createDriverStub($routeCollection); $driver - ->expects($this->at(3)) + ->expects(self::once()) ->method('createQueue', true) ->with('default') ->willReturn($queue) ; $driver - ->expects($this->at(4)) + ->expects(self::once()) ->method('createQueue', true) ->with('fooQueue') ->willReturn($queue) ; $driver - ->expects($this->at(5)) + ->expects(self::once()) ->method('createQueue', true) ->with('ololoQueue') ->willReturn($queue) diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index c788d5e75..083354c24 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -163,17 +163,17 @@ public function testShouldExecuteConsumptionWithSeveralCustomQueues() $consumer = $this->createQueueConsumerMock(); $consumer - ->expects($this->at(0)) + ->expects(self::once()) ->method('bind') ->with('queue-name', $this->identicalTo($processor)) ; $consumer - ->expects($this->at(1)) + ->expects(self::once()) ->method('bind') ->with('another-queue-name', $this->identicalTo($processor)) ; $consumer - ->expects($this->at(2)) + ->expects(self::once()) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; @@ -205,17 +205,17 @@ public static function getSubscribedQueues() $consumer = $this->createQueueConsumerMock(); $consumer - ->expects($this->at(0)) + ->expects(self::once()) ->method('bind') ->with('fooSubscribedQueues', $this->identicalTo($processor)) ; $consumer - ->expects($this->at(1)) + ->expects(self::once()) ->method('bind') ->with('barSubscribedQueues', $this->identicalTo($processor)) ; $consumer - ->expects($this->at(2)) + ->expects(self::once()) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; diff --git a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php index 38d72a81c..f01fd06e2 100644 --- a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php +++ b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php @@ -440,12 +440,12 @@ public function testShouldInsertIntoUniqueTableIfJobIsUniqueAndNew() }) ; $connection - ->expects($this->at(0)) + ->expects(self::once()) ->method('insert') ->with('unique_table', ['name' => 'owner-id']) ; $connection - ->expects($this->at(1)) + ->expects(self::once()) ->method('insert') ->with('unique_table', ['name' => 'job-name']) ; @@ -510,12 +510,12 @@ public function testShouldDeleteRecordFromUniqueTableIfJobIsUniqueAndStoppedAtIs $connection = $this->createConnectionMock(); $connection - ->expects($this->at(0)) + ->expects(self::once()) ->method('delete') ->with('unique_table', ['name' => 'owner-id']) ; $connection - ->expects($this->at(1)) + ->expects(self::once()) ->method('delete') ->with('unique_table', ['name' => 'job-name']) ; diff --git a/pkg/redis/Tests/RedisConsumerTest.php b/pkg/redis/Tests/RedisConsumerTest.php index ed67bd73b..f6e77c829 100644 --- a/pkg/redis/Tests/RedisConsumerTest.php +++ b/pkg/redis/Tests/RedisConsumerTest.php @@ -187,19 +187,19 @@ public function testShouldCallRedisBRPopSeveralTimesWithFiveSecondTimeoutIfZeroT $redisMock = $this->createRedisMock(); $redisMock - ->expects($this->at(2)) + ->expects(self::once()) ->method('brpop') ->with(['aQueue'], $expectedTimeout) ->willReturn(null) ; $redisMock - ->expects($this->at(5)) + ->expects(self::once()) ->method('brpop') ->with(['aQueue'], $expectedTimeout) ->willReturn(null) ; $redisMock - ->expects($this->at(8)) + ->expects(self::once()) ->method('brpop') ->with(['aQueue'], $expectedTimeout) ->willReturn(new RedisResult('aQueue', $serializer->toString(new RedisMessage('aBody')))) diff --git a/pkg/redis/Tests/RedisContextTest.php b/pkg/redis/Tests/RedisContextTest.php index 0115f27b8..01fd2fe09 100644 --- a/pkg/redis/Tests/RedisContextTest.php +++ b/pkg/redis/Tests/RedisContextTest.php @@ -161,17 +161,17 @@ public function testShouldAllowDeleteQueue() { $redisMock = $this->createRedisMock(); $redisMock - ->expects($this->at(0)) + ->expects(self::once()) ->method('del') ->with('aQueueName') ; $redisMock - ->expects($this->at(1)) + ->expects(self::once()) ->method('del') ->with('aQueueName:delayed') ; $redisMock - ->expects($this->at(2)) + ->expects(self::once()) ->method('del') ->with('aQueueName:reserved') ; @@ -201,17 +201,17 @@ public function testShouldAllowDeleteTopic() { $redisMock = $this->createRedisMock(); $redisMock - ->expects($this->at(0)) + ->expects(self::once()) ->method('del') ->with('aTopicName') ; $redisMock - ->expects($this->at(1)) + ->expects(self::once()) ->method('del') ->with('aTopicName:delayed') ; $redisMock - ->expects($this->at(2)) + ->expects(self::once()) ->method('del') ->with('aTopicName:reserved') ; diff --git a/pkg/stomp/Tests/BufferedStompClientTest.php b/pkg/stomp/Tests/BufferedStompClientTest.php index 684edf397..ddb92e50d 100644 --- a/pkg/stomp/Tests/BufferedStompClientTest.php +++ b/pkg/stomp/Tests/BufferedStompClientTest.php @@ -128,12 +128,12 @@ public function testShouldAddFrameToBufferIfSubscriptionIdIsNotEqual() $connection = $this->createStompConnectionMock(); $connection - ->expects($this->at(1)) + ->expects(self::once()) ->method('readFrame') ->willReturn($frame) ; $connection - ->expects($this->at(2)) + ->expects(self::once()) ->method('readFrame') ->willReturn(false) ; @@ -159,12 +159,12 @@ public function testShouldAddFirstFrameToBufferIfSubscriptionNotEqualAndReturnSe $connection = $this->createStompConnectionMock(); $connection - ->expects($this->at(1)) + ->expects(self::once()) ->method('readFrame') ->willReturn($frame1) ; $connection - ->expects($this->at(3)) + ->expects(self::once()) ->method('readFrame') ->willReturn($frame2) ; From 582b3a9a670267653064cb789119831ceefa588e Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 21 Jan 2021 16:37:57 +0200 Subject: [PATCH 0867/1142] =?UTF-8?q?Fix=20logger-related=20at()=20warning?= =?UTF-8?q?s=20=E2=80=94=20replace=20mocks=20with=20TestLogger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DoctrinePingConnectionExtensionTest.php | 37 ++++---- .../DelayRedeliveredMessageExtensionTest.php | 35 +++----- .../Client/Driver/RabbitMqStompDriverTest.php | 89 +++++++++---------- 3 files changed, 74 insertions(+), 87 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index fd2ae06aa..f7e984392 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -12,7 +12,7 @@ use Interop\Queue\Processor; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; -use Psr\Log\LoggerInterface; +use Psr\Log\Test\TestLogger; class DoctrinePingConnectionExtensionTest extends TestCase { @@ -44,20 +44,20 @@ public function testShouldNotReconnectIfConnectionIsOK() ; $context = $this->createContext(); - $context->getLogger() - ->expects($this->never()) - ->method('debug') - ; $registry = $this->createRegistryMock(); $registry - ->expects($this->once()) + ->expects(self::once()) ->method('getConnections') ->willReturn([$connection]) ; $extension = new DoctrinePingConnectionExtension($registry); $extension->onMessageReceived($context); + + /** @var TestLogger $logger */ + $logger = $context->getLogger(); + self::assertFalse($logger->hasDebugRecords()); } public function testShouldDoesReconnectIfConnectionFailed() @@ -83,16 +83,6 @@ public function testShouldDoesReconnectIfConnectionFailed() ; $context = $this->createContext(); - $context->getLogger() - ->expects($this->at(0)) - ->method('debug') - ->with('[DoctrinePingConnectionExtension] Connection is not active trying to reconnect.') - ; - $context->getLogger() - ->expects($this->at(1)) - ->method('debug') - ->with('[DoctrinePingConnectionExtension] Connection is active now.') - ; $registry = $this->createRegistryMock(); $registry @@ -103,6 +93,19 @@ public function testShouldDoesReconnectIfConnectionFailed() $extension = new DoctrinePingConnectionExtension($registry); $extension->onMessageReceived($context); + + /** @var TestLogger $logger */ + $logger = $context->getLogger(); + self::assertTrue( + $logger->hasDebugThatContains( + '[DoctrinePingConnectionExtension] Connection is not active trying to reconnect.' + ) + ); + self::assertTrue( + $logger->hasDebugThatContains( + '[DoctrinePingConnectionExtension] Connection is active now.' + ) + ); } public function testShouldSkipIfConnectionWasNotOpened() @@ -156,7 +159,7 @@ protected function createContext(): MessageReceived $this->createMock(Message::class), $this->createMock(Processor::class), 1, - $this->createMock(LoggerInterface::class) + new TestLogger() ); } diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php index 61a307a5a..a92dc8df1 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php @@ -18,8 +18,8 @@ use Interop\Queue\Queue; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; -use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; +use Psr\Log\Test\TestLogger; class DelayRedeliveredMessageExtensionTest extends TestCase { @@ -55,20 +55,7 @@ public function testShouldSendDelayedMessageAndRejectOriginalMessage() ->willReturn($delayedMessage) ; - $logger = $this->createLoggerMock(); - $logger - ->expects(self::at(0)) - ->method('debug') - ->with('[DelayRedeliveredMessageExtension] Send delayed message') - ; - $logger - ->expects(self::at(1)) - ->method('debug') - ->with( - '[DelayRedeliveredMessageExtension] '. - 'Reject redelivered original message by setting reject status to context.' - ) - ; + $logger = new TestLogger(); $messageReceived = new MessageReceived( $this->createContextMock(), @@ -93,6 +80,16 @@ public function testShouldSendDelayedMessageAndRejectOriginalMessage() $this->assertEquals([ 'enqueue.redelivery_count' => 1, ], $delayedMessage->getProperties()); + + self::assertTrue( + $logger->hasDebugThatContains('[DelayRedeliveredMessageExtension] Send delayed message') + ); + self::assertTrue( + $logger->hasDebugThatContains( + '[DelayRedeliveredMessageExtension] '. + 'Reject redelivered original message by setting reject status to context.' + ) + ); } public function testShouldDoNothingIfMessageIsNotRedelivered() @@ -184,14 +181,6 @@ private function createConsumerStub(?Queue $queue): Consumer return $consumerMock; } - /** - * @return MockObject - */ - private function createLoggerMock(): LoggerInterface - { - return $this->createMock(LoggerInterface::class); - } - private function createDriverSendResult(): DriverSendResult { return new DriverSendResult( diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php index f59376be4..79e8c33b7 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php @@ -24,7 +24,7 @@ use Interop\Queue\Queue as InteropQueue; use Interop\Queue\Topic as InteropTopic; use PHPUnit\Framework\TestCase; -use Psr\Log\LoggerInterface; +use Psr\Log\Test\TestLogger; class RabbitMqStompDriverTest extends TestCase { @@ -281,14 +281,15 @@ public function testShouldNotSetupBrokerIfManagementPluginInstalledOptionIsNotEn $this->createManagementClientMock() ); - $logger = $this->createLoggerMock(); - $logger - ->expects($this->once()) - ->method('debug') - ->with('[RabbitMqStompDriver] Could not setup broker. The option `management_plugin_installed` is not enabled. Please enable that option and install rabbit management plugin') - ; + $logger = new TestLogger(); $driver->setupBroker($logger); + + self::assertTrue( + $logger->hasDebugThatContains( + '[RabbitMqStompDriver] Could not setup broker. The option `management_plugin_installed` is not enabled. Please enable that option and install rabbit management plugin' + ) + ); } public function testShouldSetupBroker() @@ -366,29 +367,30 @@ public function testShouldSetupBroker() $managementClient ); - $logger = $this->createLoggerMock(); - $logger - ->expects($this->at(0)) - ->method('debug') - ->with('[RabbitMqStompDriver] Declare router exchange: aprefix.router') - ; - $logger - ->expects($this->at(1)) - ->method('debug') - ->with('[RabbitMqStompDriver] Declare router queue: aprefix.default') - ; - $logger - ->expects($this->at(2)) - ->method('debug') - ->with('[RabbitMqStompDriver] Bind router queue to exchange: aprefix.default -> aprefix.router') - ; - $logger - ->expects($this->at(3)) - ->method('debug') - ->with('[RabbitMqStompDriver] Declare processor queue: aprefix.default') - ; + $logger = new TestLogger(); $driver->setupBroker($logger); + + self::assertTrue( + $logger->hasDebugThatContains( + '[RabbitMqStompDriver] Declare router exchange: aprefix.router' + ) + ); + self::assertTrue( + $logger->hasDebugThatContains( + '[RabbitMqStompDriver] Declare router queue: aprefix.default' + ) + ); + self::assertTrue( + $logger->hasDebugThatContains( + '[RabbitMqStompDriver] Bind router queue to exchange: aprefix.default -> aprefix.router' + ) + ); + self::assertTrue( + $logger->hasDebugThatContains( + '[RabbitMqStompDriver] Declare processor queue: aprefix.default' + ) + ); } public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() @@ -458,19 +460,20 @@ public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() $managementClient ); - $logger = $this->createLoggerMock(); - $logger - ->expects($this->at(4)) - ->method('debug') - ->with('[RabbitMqStompDriver] Declare delay exchange: aprefix.default.delayed') - ; - $logger - ->expects($this->at(5)) - ->method('debug') - ->with('[RabbitMqStompDriver] Bind processor queue to delay exchange: aprefix.default -> aprefix.default.delayed') - ; + $logger = new TestLogger(); $driver->setupBroker($logger); + + self::assertTrue( + $logger->hasDebugThatContains( + '[RabbitMqStompDriver] Declare delay exchange: aprefix.default.delayed' + ) + ); + self::assertTrue( + $logger->hasDebugThatContains( + '[RabbitMqStompDriver] Bind processor queue to delay exchange: aprefix.default -> aprefix.default.delayed' + ) + ); } protected function createDriver(...$args): DriverInterface @@ -584,12 +587,4 @@ private function createManagementClientMock(): StompManagementClient { return $this->createMock(StompManagementClient::class); } - - /** - * @return \PHPUnit\Framework\MockObject\MockObject|LoggerInterface - */ - private function createLoggerMock() - { - return $this->createMock(LoggerInterface::class); - } } From b2b1d59370c2a108e308f1e6046f962c1ecbb131 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 21 Jan 2021 16:53:04 +0200 Subject: [PATCH 0868/1142] Fix renamed assertions and prophecy warnings --- .../DependencyInjection/BuildProcessorRegistryPassTest.php | 2 +- .../DependencyInjection/BuildProcessorRegistryPassTest.php | 2 +- pkg/fs/Tests/FsContextTest.php | 2 +- pkg/snsqs/Tests/SnsQsProducerTest.php | 2 ++ 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php index 4d95ca07d..8541f39bf 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -136,7 +136,7 @@ private function assertLocatorServices(ContainerBuilder $container, $locatorId, $locatorId = (string) $locatorId; $this->assertTrue($container->hasDefinition($locatorId)); - $this->assertRegExp('/\.?service_locator\..*?\.enqueue\./', $locatorId); + $this->assertMatchesRegularExpression('/\.?service_locator\..*?\.enqueue\./', $locatorId); $match = []; if (false == preg_match('/(\.?service_locator\..*?)\.enqueue\./', $locatorId, $match)) { diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php index 989d048cf..8d8edc537 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -199,7 +199,7 @@ private function assertLocatorServices(ContainerBuilder $container, $locatorId, $locatorId = (string) $locatorId; $this->assertTrue($container->hasDefinition($locatorId)); - $this->assertRegExp('/\.?service_locator\..*?\.enqueue\./', $locatorId); + $this->assertMatchesRegularExpression('/\.?service_locator\..*?\.enqueue\./', $locatorId); $match = []; if (false == preg_match('/(\.?service_locator\..*?)\.enqueue\./', $locatorId, $match)) { diff --git a/pkg/fs/Tests/FsContextTest.php b/pkg/fs/Tests/FsContextTest.php index a99276bbe..4bc05e9de 100644 --- a/pkg/fs/Tests/FsContextTest.php +++ b/pkg/fs/Tests/FsContextTest.php @@ -192,7 +192,7 @@ public function testShouldCreateFileOnFilesystemIfNotExistOnDeclareDestination() $queue = $context->createQueue($tmpFile->getFilename()); - $this->assertFileNotExists((string) $tmpFile); + $this->assertFileDoesNotExist((string) $tmpFile); $context->declareDestination($queue); diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index dd82e4895..d0925d15e 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -18,10 +18,12 @@ use Interop\Queue\Producer; use PHPUnit\Framework\TestCase; use Prophecy\Argument; +use Prophecy\PhpUnit\ProphecyTrait; class SnsQsProducerTest extends TestCase { use ClassExtensionTrait; + use ProphecyTrait; public function testShouldImplementProducerInterface() { From 32d49e331d27a7ad18039f82f060743d6ce8b0b4 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 21 Jan 2021 16:24:09 +0200 Subject: [PATCH 0869/1142] Fix prophecy warning --- composer.json | 3 ++- pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c13225ac7..c1cc4b041 100644 --- a/composer.json +++ b/composer.json @@ -62,7 +62,8 @@ "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", "friendsofphp/php-cs-fixer": "^2", - "dms/phpunit-arraysubset-asserts": "^0.2.1" + "dms/phpunit-arraysubset-asserts": "^0.2.1", + "phpspec/prophecy-phpunit": "^2.0" }, "autoload": { "psr-4": { diff --git a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php index 81bb0091b..14f7b1006 100644 --- a/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php +++ b/pkg/enqueue/Tests/DoctrineConnectionFactoryFactoryTest.php @@ -9,9 +9,12 @@ use Enqueue\Dbal\ManagerRegistryConnectionFactory; use Enqueue\Doctrine\DoctrineConnectionFactoryFactory; use PHPUnit\Framework\TestCase; +use Prophecy\PhpUnit\ProphecyTrait; class DoctrineConnectionFactoryFactoryTest extends TestCase { + use ProphecyTrait; + /** * @var ManagerRegistry|\Prophecy\Prophecy\ObjectProphecy */ From c0ce9b6f3381f7b4881c193160e47a211d9df1b9 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 21:33:39 +0200 Subject: [PATCH 0870/1142] Fix mocks and logger --- .../Extension/DoctrinePingConnectionExtensionTest.php | 8 ++++---- pkg/enqueue/Tests/Client/ProducerSendCommandTest.php | 2 +- pkg/enqueue/Tests/Client/ProducerSendEventTest.php | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index f7e984392..b740e64c1 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -135,10 +135,6 @@ public function testShouldSkipIfConnectionWasNotOpened() ; $context = $this->createContext(); - $context->getLogger() - ->expects($this->never()) - ->method('debug') - ; $registry = $this->createRegistryMock(); $registry @@ -149,6 +145,10 @@ public function testShouldSkipIfConnectionWasNotOpened() $extension = new DoctrinePingConnectionExtension($registry); $extension->onMessageReceived($context); + + /** @var TestLogger $logger */ + $logger = $context->getLogger(); + $this->assertFalse($logger->hasDebugRecords()); } protected function createContext(): MessageReceived diff --git a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php index 9532ba368..443426766 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php @@ -479,7 +479,7 @@ public function testShouldCallPostSendExtensionMethod() $extension ->expects(self::once()) - ->method('onDriverPreSend') + ->method('onPostSend') ->willReturnCallback(function (PostSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); $this->assertSame($producer, $context->getProducer()); diff --git a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php index b482492b4..2a3bbcb5e 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php @@ -499,7 +499,7 @@ public function testShouldCallPostSendExtensionMethodWhenSendToApplicationRouter $extension ->expects(self::once()) - ->method('onDriverPreSend') + ->method('onPostSend') ->willReturnCallback(function (PostSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); $this->assertSame($producer, $context->getProducer()); From dcb62c63fee64c204eb644f50488d3d3d80c9a24 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 24 Jan 2021 22:24:25 +0200 Subject: [PATCH 0871/1142] =?UTF-8?q?Revert=20"Fix=20at()=20warnings=20for?= =?UTF-8?q?=20non-logger=20mocks=20=E2=80=94=20don't=20test=20for=20method?= =?UTF-8?q?=20call=20order"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 140bc0104221a0c488f02b22c5c366b7038a17cd. # Conflicts: # pkg/enqueue/Tests/Client/ProducerSendCommandTest.php # pkg/enqueue/Tests/Client/ProducerSendEventTest.php --- pkg/amqp-lib/Tests/AmqpContextTest.php | 4 +-- .../Tests/Client/Driver/AmqpDriverTest.php | 23 ++++++++------- .../Tests/Client/Driver/FsDriverTest.php | 8 +++--- .../Tests/Client/Driver/GpsDriverTest.php | 12 ++++---- .../Client/Driver/RabbitMqStompDriverTest.php | 16 +++++------ .../Tests/Client/Driver/RdKafkaDriverTest.php | 6 ++-- .../Tests/Client/Driver/SqsDriverTest.php | 8 +++--- .../Tests/Client/ProducerSendCommandTest.php | 8 +++--- .../Tests/Client/ProducerSendEventTest.php | 12 ++++---- .../Tests/Client/SpoolProducerTest.php | 12 ++++---- .../RouteRecipientListProcessorTest.php | 4 +-- .../Symfony/Client/ConsumeCommandTest.php | 28 +++++++++---------- .../ConfigurableConsumeCommandTest.php | 12 ++++---- .../Tests/Doctrine/JobStorageTest.php | 8 +++--- pkg/redis/Tests/RedisConsumerTest.php | 6 ++-- pkg/redis/Tests/RedisContextTest.php | 12 ++++---- pkg/stomp/Tests/BufferedStompClientTest.php | 8 +++--- 17 files changed, 93 insertions(+), 94 deletions(-) diff --git a/pkg/amqp-lib/Tests/AmqpContextTest.php b/pkg/amqp-lib/Tests/AmqpContextTest.php index ea3bc43c3..4cfde3c14 100644 --- a/pkg/amqp-lib/Tests/AmqpContextTest.php +++ b/pkg/amqp-lib/Tests/AmqpContextTest.php @@ -322,12 +322,12 @@ public function testShouldSetQos() { $channel = $this->createChannelMock(); $channel - ->expects(self::once()) + ->expects($this->at(0)) ->method('basic_qos') ->with($this->identicalTo(0), $this->identicalTo(1), $this->isFalse()) ; $channel - ->expects(self::once()) + ->expects($this->at(1)) ->method('basic_qos') ->with($this->identicalTo(123), $this->identicalTo(456), $this->isTrue()) ; diff --git a/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php b/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php index 08b22c713..3234c45f0 100644 --- a/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php @@ -22,7 +22,6 @@ use Interop\Queue\Message as InteropMessage; use Interop\Queue\Producer as InteropProducer; use Interop\Queue\Queue as InteropQueue; -use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class AmqpDriverTest extends TestCase @@ -191,54 +190,54 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); // setup router $context - ->expects(self::once()) + ->expects($this->at(0)) ->method('createTopic') ->willReturn($routerTopic) ; $context - ->expects(self::once()) + ->expects($this->at(1)) ->method('declareTopic') ->with($this->identicalTo($routerTopic)) ; $context - ->expects(self::once()) + ->expects($this->at(2)) ->method('createQueue') ->willReturn($routerQueue) ; $context - ->expects(self::once()) + ->expects($this->at(3)) ->method('declareQueue') ->with($this->identicalTo($routerQueue)) ; $context - ->expects(self::once()) + ->expects($this->at(4)) ->method('bind') ->with($this->isInstanceOf(AmqpBind::class)) ; // setup processor with default queue $context - ->expects(self::once()) + ->expects($this->at(5)) ->method('createQueue') ->with($this->getDefaultQueueTransportName()) ->willReturn($processorWithDefaultQueue) ; $context - ->expects(self::once()) + ->expects($this->at(6)) ->method('declareQueue') ->with($this->identicalTo($processorWithDefaultQueue)) ; $context - ->expects(self::once()) + ->expects($this->at(7)) ->method('createQueue') ->with($this->getCustomQueueTransportName()) ->willReturn($processorWithCustomQueue) ; $context - ->expects(self::once()) + ->expects($this->at(8)) ->method('declareQueue') ->with($this->identicalTo($processorWithCustomQueue)) ; @@ -291,7 +290,7 @@ protected function createDriver(...$args): DriverInterface } /** - * @return AmqpContext|MockObject + * @return AmqpContext */ protected function createContextMock(): Context { @@ -299,7 +298,7 @@ protected function createContextMock(): Context } /** - * @return AmqpProducer|MockObject + * @return AmqpProducer */ protected function createProducerMock(): InteropProducer { diff --git a/pkg/enqueue/Tests/Client/Driver/FsDriverTest.php b/pkg/enqueue/Tests/Client/Driver/FsDriverTest.php index a235b64b8..f1cd02f9b 100644 --- a/pkg/enqueue/Tests/Client/Driver/FsDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/FsDriverTest.php @@ -44,23 +44,23 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); // setup router $context - ->expects(self::once()) + ->expects($this->at(0)) ->method('createQueue') ->willReturn($routerQueue) ; $context - ->expects(self::once()) + ->expects($this->at(1)) ->method('declareDestination') ->with($this->identicalTo($routerQueue)) ; // setup processor queue $context - ->expects(self::once()) + ->expects($this->at(2)) ->method('createQueue') ->willReturn($processorQueue) ; $context - ->expects(self::once()) + ->expects($this->at(3)) ->method('declareDestination') ->with($this->identicalTo($processorQueue)) ; diff --git a/pkg/enqueue/Tests/Client/Driver/GpsDriverTest.php b/pkg/enqueue/Tests/Client/Driver/GpsDriverTest.php index 37a97be66..c0cac0458 100644 --- a/pkg/enqueue/Tests/Client/Driver/GpsDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/GpsDriverTest.php @@ -46,35 +46,35 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); // setup router $context - ->expects(self::once()) + ->expects($this->at(0)) ->method('createTopic') ->willReturn($routerTopic) ; $context - ->expects(self::once()) + ->expects($this->at(1)) ->method('createQueue') ->willReturn($routerQueue) ; $context - ->expects(self::once()) + ->expects($this->at(2)) ->method('subscribe') ->with($this->identicalTo($routerTopic), $this->identicalTo($routerQueue)) ; $context - ->expects(self::once()) + ->expects($this->at(3)) ->method('createQueue') ->with($this->getDefaultQueueTransportName()) ->willReturn($processorQueue) ; // setup processor queue $context - ->expects(self::once()) + ->expects($this->at(4)) ->method('createTopic') ->with($this->getDefaultQueueTransportName()) ->willReturn($processorTopic) ; $context - ->expects(self::once()) + ->expects($this->at(5)) ->method('subscribe') ->with($this->identicalTo($processorTopic), $this->identicalTo($processorQueue)) ; diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php index 79e8c33b7..fbcb68644 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php @@ -196,12 +196,12 @@ public function shouldSendMessageToDelayExchangeIfDelaySet() $producer = $this->createProducerMock(); $producer - ->expects(self::once()) + ->expects($this->at(0)) ->method('setDeliveryDelay') ->with(10000) ; $producer - ->expects(self::once()) + ->expects($this->at(1)) ->method('setDeliveryDelay') ->with(null) ; @@ -300,7 +300,7 @@ public function testShouldSetupBroker() $managementClient = $this->createManagementClientMock(); $managementClient - ->expects(self::once()) + ->expects($this->at(0)) ->method('declareExchange') ->with('aprefix.router', [ 'type' => 'fanout', @@ -309,7 +309,7 @@ public function testShouldSetupBroker() ]) ; $managementClient - ->expects(self::once()) + ->expects($this->at(1)) ->method('declareQueue') ->with('aprefix.default', [ 'durable' => true, @@ -320,12 +320,12 @@ public function testShouldSetupBroker() ]) ; $managementClient - ->expects(self::once()) + ->expects($this->at(2)) ->method('bind') ->with('aprefix.router', 'aprefix.default', 'aprefix.default') ; $managementClient - ->expects(self::once()) + ->expects($this->at(3)) ->method('declareQueue') ->with('aprefix.default', [ 'durable' => true, @@ -401,7 +401,7 @@ public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() $managementClient = $this->createManagementClientMock(); $managementClient - ->expects(self::once()) + ->expects($this->at(4)) ->method('declareExchange') ->with('aprefix.default.delayed', [ 'type' => 'x-delayed-message', @@ -413,7 +413,7 @@ public function testSetupBrokerShouldCreateDelayExchangeIfEnabled() ]) ; $managementClient - ->expects(self::once()) + ->expects($this->at(5)) ->method('bind') ->with('aprefix.default.delayed', 'aprefix.default', 'aprefix.default') ; diff --git a/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php index 16d1da929..659590ba3 100644 --- a/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php @@ -47,17 +47,17 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); $context - ->expects(self::once()) + ->expects($this->at(0)) ->method('createQueue') ->willReturn($routerTopic) ; $context - ->expects(self::once()) + ->expects($this->at(1)) ->method('createQueue') ->willReturn($routerQueue) ; $context - ->expects(self::once()) + ->expects($this->at(2)) ->method('createQueue') ->willReturn($processorTopic) ; diff --git a/pkg/enqueue/Tests/Client/Driver/SqsDriverTest.php b/pkg/enqueue/Tests/Client/Driver/SqsDriverTest.php index fb4af5303..2e3005e6a 100644 --- a/pkg/enqueue/Tests/Client/Driver/SqsDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/SqsDriverTest.php @@ -42,25 +42,25 @@ public function testShouldSetupBroker() $context = $this->createContextMock(); // setup router $context - ->expects(self::once()) + ->expects($this->at(0)) ->method('createQueue') ->with('aprefix_dot_default') ->willReturn($routerQueue) ; $context - ->expects(self::once()) + ->expects($this->at(1)) ->method('declareQueue') ->with($this->identicalTo($routerQueue)) ; // setup processor queue $context - ->expects(self::once()) + ->expects($this->at(2)) ->method('createQueue') ->with('aprefix_dot_default') ->willReturn($processorQueue) ; $context - ->expects(self::once()) + ->expects($this->at(3)) ->method('declareQueue') ->with($this->identicalTo($processorQueue)) ; diff --git a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php index 443426766..9500e9d62 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendCommandTest.php @@ -370,7 +370,7 @@ public function testShouldCallPreSendCommandExtensionMethodWhenSendToBus() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onPreSendCommand') ->willReturnCallback(function (PreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -408,7 +408,7 @@ public function testShouldCallPreSendCommandExtensionMethodWhenSendToApplication $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onPreSendCommand') ->willReturnCallback(function (PreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -446,7 +446,7 @@ public function testShouldCallPreDriverSendExtensionMethod() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onDriverPreSend') ->willReturnCallback(function (DriverPreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -478,7 +478,7 @@ public function testShouldCallPostSendExtensionMethod() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onPostSend') ->willReturnCallback(function (PostSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); diff --git a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php index 2a3bbcb5e..c92b49560 100644 --- a/pkg/enqueue/Tests/Client/ProducerSendEventTest.php +++ b/pkg/enqueue/Tests/Client/ProducerSendEventTest.php @@ -326,7 +326,7 @@ public function testShouldCallPreSendEventExtensionMethodWhenSendToBus() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onPreSendEvent') ->willReturnCallback(function (PreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -364,7 +364,7 @@ public function testShouldCallPreSendEventExtensionMethodWhenSendToApplicationRo $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onPreSendEvent') ->willReturnCallback(function (PreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -402,7 +402,7 @@ public function testShouldCallPreDriverSendExtensionMethodWhenSendToMessageBus() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onDriverPreSend') ->willReturnCallback(function (DriverPreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -434,7 +434,7 @@ public function testShouldCallPreDriverSendExtensionMethodWhenSendToApplicationR $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onDriverPreSend') ->willReturnCallback(function (DriverPreSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -466,7 +466,7 @@ public function testShouldCallPostSendExtensionMethodWhenSendToMessageBus() $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onPostSend') ->willReturnCallback(function (PostSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); @@ -498,7 +498,7 @@ public function testShouldCallPostSendExtensionMethodWhenSendToApplicationRouter $producer = new Producer($driver, $this->createRpcFactoryMock(), $extension); $extension - ->expects(self::once()) + ->expects($this->at(0)) ->method('onPostSend') ->willReturnCallback(function (PostSend $context) use ($message, $producer, $driver) { $this->assertSame($message, $context->getMessage()); diff --git a/pkg/enqueue/Tests/Client/SpoolProducerTest.php b/pkg/enqueue/Tests/Client/SpoolProducerTest.php index df9e728ed..024fd6da2 100644 --- a/pkg/enqueue/Tests/Client/SpoolProducerTest.php +++ b/pkg/enqueue/Tests/Client/SpoolProducerTest.php @@ -68,17 +68,17 @@ public function testShouldSendQueuedEventMessagesOnFlush() $realProducer = $this->createProducerMock(); $realProducer - ->expects(self::once()) + ->expects($this->at(0)) ->method('sendEvent') ->with('foo_topic', 'first') ; $realProducer - ->expects(self::once()) + ->expects($this->at(1)) ->method('sendEvent') ->with('bar_topic', ['second']) ; $realProducer - ->expects(self::once()) + ->expects($this->at(2)) ->method('sendEvent') ->with('baz_topic', $this->identicalTo($message)) ; @@ -103,17 +103,17 @@ public function testShouldSendQueuedCommandMessagesOnFlush() $realProducer = $this->createProducerMock(); $realProducer - ->expects(self::once()) + ->expects($this->at(0)) ->method('sendCommand') ->with('foo_command', 'first') ; $realProducer - ->expects(self::once()) + ->expects($this->at(1)) ->method('sendCommand') ->with('bar_command', ['second']) ; $realProducer - ->expects(self::once()) + ->expects($this->at(2)) ->method('sendCommand') ->with('baz_command', $this->identicalTo($message)) ; diff --git a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php index dfc820656..8a2e089f7 100644 --- a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php +++ b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php @@ -45,12 +45,12 @@ public function testShouldProduceRecipientsMessagesAndAckOriginalMessage() $producerMock = $this->createProducerMock(); $producerMock - ->expects(self::once()) + ->expects($this->at(0)) ->method('send') ->with($this->identicalTo($fooRecipient->getDestination()), $this->identicalTo($fooRecipient->getMessage())) ; $producerMock - ->expects(self::once()) + ->expects($this->at(1)) ->method('send') ->with($this->identicalTo($barRecipient->getDestination()), $this->identicalTo($barRecipient->getMessage())) ; diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 4f1dfe2fa..fcc099538 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -269,13 +269,13 @@ public function testShouldBindCustomExecuteConsumptionAndUseCustomClientDestinat $driver = $this->createDriverStub($routeCollection); $driver - ->expects(self::once()) + ->expects($this->at(3)) ->method('createQueue') ->with('default', true) ->willReturn($defaultQueue) ; $driver - ->expects(self::once()) + ->expects($this->at(4)) ->method('createQueue') ->with('custom', true) ->willReturn($customQueue) @@ -283,17 +283,17 @@ public function testShouldBindCustomExecuteConsumptionAndUseCustomClientDestinat $consumer = $this->createQueueConsumerMock(); $consumer - ->expects(self::once()) + ->expects($this->at(0)) ->method('bind') ->with($this->identicalTo($defaultQueue), $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(1)) ->method('bind') ->with($this->identicalTo($customQueue), $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(2)) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; @@ -408,13 +408,13 @@ public function testShouldBindQueuesOnlyOnce() $driver = $this->createDriverStub($routeCollection); $driver - ->expects(self::once()) + ->expects($this->at(3)) ->method('createQueue') ->with('default', true) ->willReturn($defaultQueue) ; $driver - ->expects(self::once()) + ->expects($this->at(4)) ->method('createQueue', true) ->with('custom') ->willReturn($customQueue) @@ -422,17 +422,17 @@ public function testShouldBindQueuesOnlyOnce() $consumer = $this->createQueueConsumerMock(); $consumer - ->expects(self::once()) + ->expects($this->at(0)) ->method('bind') ->with($this->identicalTo($defaultQueue), $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(1)) ->method('bind') ->with($this->identicalTo($customQueue), $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(2)) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; @@ -473,7 +473,7 @@ public function testShouldNotBindExternalRoutes() ->with($this->identicalTo($defaultQueue), $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(1)) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; @@ -513,19 +513,19 @@ public function testShouldSkipQueueConsumptionAndUseCustomClientDestinationName( $driver = $this->createDriverStub($routeCollection); $driver - ->expects(self::once()) + ->expects($this->at(3)) ->method('createQueue', true) ->with('default') ->willReturn($queue) ; $driver - ->expects(self::once()) + ->expects($this->at(4)) ->method('createQueue', true) ->with('fooQueue') ->willReturn($queue) ; $driver - ->expects(self::once()) + ->expects($this->at(5)) ->method('createQueue', true) ->with('ololoQueue') ->willReturn($queue) diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index 083354c24..c788d5e75 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -163,17 +163,17 @@ public function testShouldExecuteConsumptionWithSeveralCustomQueues() $consumer = $this->createQueueConsumerMock(); $consumer - ->expects(self::once()) + ->expects($this->at(0)) ->method('bind') ->with('queue-name', $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(1)) ->method('bind') ->with('another-queue-name', $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(2)) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; @@ -205,17 +205,17 @@ public static function getSubscribedQueues() $consumer = $this->createQueueConsumerMock(); $consumer - ->expects(self::once()) + ->expects($this->at(0)) ->method('bind') ->with('fooSubscribedQueues', $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(1)) ->method('bind') ->with('barSubscribedQueues', $this->identicalTo($processor)) ; $consumer - ->expects(self::once()) + ->expects($this->at(2)) ->method('consume') ->with($this->isInstanceOf(ChainExtension::class)) ; diff --git a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php index f01fd06e2..38d72a81c 100644 --- a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php +++ b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php @@ -440,12 +440,12 @@ public function testShouldInsertIntoUniqueTableIfJobIsUniqueAndNew() }) ; $connection - ->expects(self::once()) + ->expects($this->at(0)) ->method('insert') ->with('unique_table', ['name' => 'owner-id']) ; $connection - ->expects(self::once()) + ->expects($this->at(1)) ->method('insert') ->with('unique_table', ['name' => 'job-name']) ; @@ -510,12 +510,12 @@ public function testShouldDeleteRecordFromUniqueTableIfJobIsUniqueAndStoppedAtIs $connection = $this->createConnectionMock(); $connection - ->expects(self::once()) + ->expects($this->at(0)) ->method('delete') ->with('unique_table', ['name' => 'owner-id']) ; $connection - ->expects(self::once()) + ->expects($this->at(1)) ->method('delete') ->with('unique_table', ['name' => 'job-name']) ; diff --git a/pkg/redis/Tests/RedisConsumerTest.php b/pkg/redis/Tests/RedisConsumerTest.php index f6e77c829..ed67bd73b 100644 --- a/pkg/redis/Tests/RedisConsumerTest.php +++ b/pkg/redis/Tests/RedisConsumerTest.php @@ -187,19 +187,19 @@ public function testShouldCallRedisBRPopSeveralTimesWithFiveSecondTimeoutIfZeroT $redisMock = $this->createRedisMock(); $redisMock - ->expects(self::once()) + ->expects($this->at(2)) ->method('brpop') ->with(['aQueue'], $expectedTimeout) ->willReturn(null) ; $redisMock - ->expects(self::once()) + ->expects($this->at(5)) ->method('brpop') ->with(['aQueue'], $expectedTimeout) ->willReturn(null) ; $redisMock - ->expects(self::once()) + ->expects($this->at(8)) ->method('brpop') ->with(['aQueue'], $expectedTimeout) ->willReturn(new RedisResult('aQueue', $serializer->toString(new RedisMessage('aBody')))) diff --git a/pkg/redis/Tests/RedisContextTest.php b/pkg/redis/Tests/RedisContextTest.php index 01fd2fe09..0115f27b8 100644 --- a/pkg/redis/Tests/RedisContextTest.php +++ b/pkg/redis/Tests/RedisContextTest.php @@ -161,17 +161,17 @@ public function testShouldAllowDeleteQueue() { $redisMock = $this->createRedisMock(); $redisMock - ->expects(self::once()) + ->expects($this->at(0)) ->method('del') ->with('aQueueName') ; $redisMock - ->expects(self::once()) + ->expects($this->at(1)) ->method('del') ->with('aQueueName:delayed') ; $redisMock - ->expects(self::once()) + ->expects($this->at(2)) ->method('del') ->with('aQueueName:reserved') ; @@ -201,17 +201,17 @@ public function testShouldAllowDeleteTopic() { $redisMock = $this->createRedisMock(); $redisMock - ->expects(self::once()) + ->expects($this->at(0)) ->method('del') ->with('aTopicName') ; $redisMock - ->expects(self::once()) + ->expects($this->at(1)) ->method('del') ->with('aTopicName:delayed') ; $redisMock - ->expects(self::once()) + ->expects($this->at(2)) ->method('del') ->with('aTopicName:reserved') ; diff --git a/pkg/stomp/Tests/BufferedStompClientTest.php b/pkg/stomp/Tests/BufferedStompClientTest.php index ddb92e50d..684edf397 100644 --- a/pkg/stomp/Tests/BufferedStompClientTest.php +++ b/pkg/stomp/Tests/BufferedStompClientTest.php @@ -128,12 +128,12 @@ public function testShouldAddFrameToBufferIfSubscriptionIdIsNotEqual() $connection = $this->createStompConnectionMock(); $connection - ->expects(self::once()) + ->expects($this->at(1)) ->method('readFrame') ->willReturn($frame) ; $connection - ->expects(self::once()) + ->expects($this->at(2)) ->method('readFrame') ->willReturn(false) ; @@ -159,12 +159,12 @@ public function testShouldAddFirstFrameToBufferIfSubscriptionNotEqualAndReturnSe $connection = $this->createStompConnectionMock(); $connection - ->expects(self::once()) + ->expects($this->at(1)) ->method('readFrame') ->willReturn($frame1) ; $connection - ->expects(self::once()) + ->expects($this->at(3)) ->method('readFrame') ->willReturn($frame2) ; From 9d34085defd6eca69399516112e30218663bdda1 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 09:03:39 +0200 Subject: [PATCH 0872/1142] Ignore phpunit result cache --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2bd575f69..e92454ae9 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ var .php_cs .php_cs.cache composer.lock +.phpunit.result.cache From 443fd77f6a0d5e7ba2b68af8885aadf94ccca35e Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 09:03:49 +0200 Subject: [PATCH 0873/1142] Fix reading parent attribute --- pkg/test/ReadAttributeTrait.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/pkg/test/ReadAttributeTrait.php b/pkg/test/ReadAttributeTrait.php index 73209105e..381b513da 100644 --- a/pkg/test/ReadAttributeTrait.php +++ b/pkg/test/ReadAttributeTrait.php @@ -2,11 +2,13 @@ namespace Enqueue\Test; +use ReflectionProperty; + trait ReadAttributeTrait { public function readAttribute(object $object, string $attribute) { - $refProperty = new \ReflectionProperty(get_class($object), $attribute); + $refProperty = $this->getClassAttribute($object, $attribute); $refProperty->setAccessible(true); $value = $refProperty->getValue($object); $refProperty->setAccessible(false); @@ -14,6 +16,27 @@ public function readAttribute(object $object, string $attribute) return $value; } + private function getClassAttribute( + object $object, + string $attribute, + ?string $class = null + ): ReflectionProperty { + if ($class === null) { + $class = get_class($object); + } + + try { + return new ReflectionProperty($class, $attribute); + } catch (\ReflectionException $exception) { + $parentClass = get_parent_class($object); + if ($parentClass === false) { + throw $exception; + } + + return $this->getClassAttribute($object, $attribute, $parentClass); + } + } + private function assertAttributeSame($expected, string $attribute, object $object): void { static::assertSame($expected, $this->readAttribute($object, $attribute)); From d380e5edf834041329e5992c2eaf685bc5401126 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 09:20:30 +0200 Subject: [PATCH 0874/1142] Migrate PhpUnit config --- phpunit.xml.dist | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 43abe1afc..1cd38e68b 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -2,7 +2,7 @@ - - + + . - - ./vendor - - - + + + ./vendor + + From 5a403dc5d4694b23b06304d5990ab887608b993d Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 09:44:34 +0200 Subject: [PATCH 0875/1142] Fix stan --- pkg/redis/Tests/RedisProducerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/redis/Tests/RedisProducerTest.php b/pkg/redis/Tests/RedisProducerTest.php index ce3c77ad0..53d5f19e3 100644 --- a/pkg/redis/Tests/RedisProducerTest.php +++ b/pkg/redis/Tests/RedisProducerTest.php @@ -104,7 +104,7 @@ public function testShouldCallZaddOnSendWithDeliveryDelay() ->with( 'aDestination:delayed', $this->isJson(), - $this->equalTo(time() + 5, 1) + $this->equalTo(time() + 5) ) ; From 8ba67506bbb5307539968457a0facf920abb25e3 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 09:46:24 +0200 Subject: [PATCH 0876/1142] Fix CS --- .../Functional/AmqpCommonUseCasesTest.php | 6 ++-- .../AmqpConsumptionUseCasesTest.php | 6 ++-- .../Tests/Functional/AmqpRpcUseCasesTest.php | 6 ++-- .../Tests/SignalSocketHelperTest.php | 28 +++++++++---------- .../Tests/Functional/UseCasesTest.php | 2 +- .../Tests/Functional/DbalConsumerTest.php | 2 +- ...ndReceivePriorityMessagesFromQueueTest.php | 2 +- ...ndReceivePriorityMessagesFromQueueTest.php | 2 +- .../Functional/Events/AsyncListenerTest.php | 2 +- .../Functional/Events/AsyncProcessorTest.php | 2 +- .../Functional/Events/AsyncSubscriberTest.php | 2 +- .../Tests/Functional/LazyProducerTest.php | 4 +-- .../Tests/Functional/UseCasesTest.php | 4 +-- .../Tests/Client/Driver/AmqpDriverTest.php | 3 -- .../Client/Driver/RabbitMqDriverTest.php | 3 -- .../Tests/Consumption/QueueConsumerTest.php | 2 +- .../Symfony/Client/ConsumeCommandTest.php | 2 +- .../Consumption/ConsumeCommandTest.php | 2 +- .../Tests/Functional/FsCommonUseCasesTest.php | 4 +-- pkg/fs/Tests/Functional/FsConsumerTest.php | 4 +-- .../Functional/FsConsumptionUseCasesTest.php | 4 +-- pkg/fs/Tests/Functional/FsProducerTest.php | 4 +-- pkg/fs/Tests/Functional/FsRpcUseCasesTest.php | 4 +-- ...rmanSendToTopicAndReceiveFromQueueTest.php | 2 +- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 2 +- .../Tests/Functional/MongodbConsumerTest.php | 2 +- ...ndReceivePriorityMessagesFromQueueTest.php | 2 +- ...talkSendToTopicAndReceiveFromQueueTest.php | 2 +- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 2 +- .../Functional/PRedisCommonUseCasesTest.php | 6 ++-- .../PRedisConsumptionUseCasesTest.php | 6 ++-- .../Functional/PhpRedisCommonUseCasesTest.php | 6 ++-- .../PhpRedisConsumptionUseCasesTest.php | 6 ++-- .../Functional/SqsConsumptionUseCasesTest.php | 2 +- .../Functional/StompCommonUseCasesTest.php | 6 ++-- .../StompConsumptionUseCasesTest.php | 6 ++-- .../Tests/Functional/StompRpcUseCasesTest.php | 6 ++-- pkg/test/ReadAttributeTrait.php | 4 +-- .../Tests/Functional/WampConsumerTest.php | 2 +- 39 files changed, 78 insertions(+), 84 deletions(-) diff --git a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php index 8e8ea2545..4e4b54166 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php @@ -14,15 +14,15 @@ */ class AmqpCommonUseCasesTest extends TestCase { - use RabbitmqAmqpExtension; use RabbitManagementExtensionTrait; + use RabbitmqAmqpExtension; /** * @var AmqpContext */ private $amqpContext; - public function setUp(): void + protected function setUp(): void { $this->amqpContext = $this->buildAmqpContext(); @@ -30,7 +30,7 @@ public function setUp(): void $this->removeExchange('amqp_ext.test_exchange'); } - public function tearDown(): void + protected function tearDown(): void { $this->amqpContext->close(); } diff --git a/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php index 09d0a0e99..51d5a7c54 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpConsumptionUseCasesTest.php @@ -21,22 +21,22 @@ */ class AmqpConsumptionUseCasesTest extends TestCase { - use RabbitmqAmqpExtension; use RabbitManagementExtensionTrait; + use RabbitmqAmqpExtension; /** * @var AmqpContext */ private $amqpContext; - public function setUp(): void + protected function setUp(): void { $this->amqpContext = $this->buildAmqpContext(); $this->removeQueue('amqp_ext.test'); } - public function tearDown(): void + protected function tearDown(): void { $this->amqpContext->close(); } diff --git a/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php index 5aafe96a4..66ae69241 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpRpcUseCasesTest.php @@ -15,15 +15,15 @@ */ class AmqpRpcUseCasesTest extends TestCase { - use RabbitmqAmqpExtension; use RabbitManagementExtensionTrait; + use RabbitmqAmqpExtension; /** * @var AmqpContext */ private $amqpContext; - public function setUp(): void + protected function setUp(): void { $this->amqpContext = $this->buildAmqpContext(); @@ -31,7 +31,7 @@ public function setUp(): void $this->removeQueue('rpc.reply_test'); } - public function tearDown(): void + protected function tearDown(): void { $this->amqpContext->close(); } diff --git a/pkg/amqp-tools/Tests/SignalSocketHelperTest.php b/pkg/amqp-tools/Tests/SignalSocketHelperTest.php index 61e0d2ce6..a44e42a70 100644 --- a/pkg/amqp-tools/Tests/SignalSocketHelperTest.php +++ b/pkg/amqp-tools/Tests/SignalSocketHelperTest.php @@ -19,7 +19,7 @@ class SignalSocketHelperTest extends TestCase private $backupSigIntHandler; - public function setUp(): void + protected function setUp(): void { parent::setUp(); @@ -28,16 +28,16 @@ public function setUp(): void $this->markTestSkipped('PHP 7.1+ needed'); } - $this->backupSigTermHandler = pcntl_signal_get_handler(SIGTERM); - $this->backupSigIntHandler = pcntl_signal_get_handler(SIGINT); + $this->backupSigTermHandler = pcntl_signal_get_handler(\SIGTERM); + $this->backupSigIntHandler = pcntl_signal_get_handler(\SIGINT); - pcntl_signal(SIGTERM, SIG_DFL); - pcntl_signal(SIGINT, SIG_DFL); + pcntl_signal(\SIGTERM, \SIG_DFL); + pcntl_signal(\SIGINT, \SIG_DFL); $this->signalHelper = new SignalSocketHelper(); } - public function tearDown(): void + protected function tearDown(): void { parent::tearDown(); @@ -46,11 +46,11 @@ public function tearDown(): void } if ($this->backupSigTermHandler) { - pcntl_signal(SIGTERM, $this->backupSigTermHandler); + pcntl_signal(\SIGTERM, $this->backupSigTermHandler); } if ($this->backupSigIntHandler) { - pcntl_signal(SIGINT, $this->backupSigIntHandler); + pcntl_signal(\SIGINT, $this->backupSigIntHandler); } } @@ -71,7 +71,7 @@ public function testShouldRegisterHandlerOnBeforeSocketAndBackupCurrentOne() { $handler = function () {}; - pcntl_signal(SIGTERM, $handler); + pcntl_signal(\SIGTERM, $handler); $this->signalHelper->beforeSocket(); @@ -80,8 +80,8 @@ public function testShouldRegisterHandlerOnBeforeSocketAndBackupCurrentOne() $handlers = $this->readAttribute($this->signalHelper, 'handlers'); self::assertIsArray($handlers); - $this->assertArrayHasKey(SIGTERM, $handlers); - $this->assertSame($handler, $handlers[SIGTERM]); + $this->assertArrayHasKey(\SIGTERM, $handlers); + $this->assertSame($handler, $handlers[\SIGTERM]); } public function testRestoreDefaultPropertiesOnAfterSocket() @@ -97,12 +97,12 @@ public function testRestorePreviousHandlerOnAfterSocket() { $handler = function () {}; - pcntl_signal(SIGTERM, $handler); + pcntl_signal(\SIGTERM, $handler); $this->signalHelper->beforeSocket(); $this->signalHelper->afterSocket(); - $this->assertSame($handler, pcntl_signal_get_handler(SIGTERM)); + $this->assertSame($handler, pcntl_signal_get_handler(\SIGTERM)); } public function testThrowsIfBeforeSocketCalledSecondTime() @@ -118,7 +118,7 @@ public function testShouldReturnTrueOnWasThereSignal() { $this->signalHelper->beforeSocket(); - posix_kill(getmypid(), SIGINT); + posix_kill(getmypid(), \SIGINT); pcntl_signal_dispatch(); $this->assertTrue($this->signalHelper->wasThereSignal()); diff --git a/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php b/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php index f073ff515..169d8ea5b 100644 --- a/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php +++ b/pkg/async-event-dispatcher/Tests/Functional/UseCasesTest.php @@ -53,7 +53,7 @@ class UseCasesTest extends TestCase */ protected $asyncProcessor; - public function setUp(): void + protected function setUp(): void { (new Filesystem())->remove(__DIR__.'/queues/'); diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index 709f1eafe..c95ada687 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -21,7 +21,7 @@ class DbalConsumerTest extends TestCase */ private $context; - public function setUp(): void + protected function setUp(): void { $this->context = $this->createDbalContext(); } diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php index a26c58ef2..23a5855b5 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php @@ -16,7 +16,7 @@ class DbalSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceivePrio private $publishedAt; - public function setUp(): void + protected function setUp(): void { parent::setUp(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php index 44fba568f..f6d048549 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php @@ -16,7 +16,7 @@ class DbalSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceivePrio private $publishedAt; - public function setUp(): void + protected function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php index 2dcdd251e..7fb6fdd86 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncListenerTest.php @@ -16,7 +16,7 @@ */ class AsyncListenerTest extends WebTestCase { - public function setUp(): void + protected function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php index 8c8501ad4..d85567509 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncProcessorTest.php @@ -18,7 +18,7 @@ */ class AsyncProcessorTest extends WebTestCase { - public function setUp(): void + protected function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php index ce9f6456c..4b145524a 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Events/AsyncSubscriberTest.php @@ -16,7 +16,7 @@ */ class AsyncSubscriberTest extends WebTestCase { - public function setUp(): void + protected function setUp(): void { parent::setUp(); diff --git a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php index c41a4d2db..19f139b69 100644 --- a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php @@ -11,13 +11,13 @@ */ class LazyProducerTest extends WebTestCase { - public function setUp(): void + protected function setUp(): void { // do not call parent::setUp. // parent::setUp(); } - public function tearDown(): void + protected function tearDown(): void { if (static::$kernel) { $fs = new Filesystem(); diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 2144e42d7..af4159c25 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -20,13 +20,13 @@ class UseCasesTest extends WebTestCase { const RECEIVE_TIMEOUT = 500; - public function setUp(): void + protected function setUp(): void { // do not call parent::setUp. // parent::setUp(); } - public function tearDown(): void + protected function tearDown(): void { if ($this->getContext()) { $this->getContext()->close(); diff --git a/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php b/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php index 3234c45f0..2cfb170b9 100644 --- a/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/AmqpDriverTest.php @@ -313,9 +313,6 @@ protected function createQueue(string $name): InteropQueue return new AmqpQueue($name); } - /** - * @return AmqpTopic - */ protected function createTopic(string $name): AmqpTopic { return new AmqpTopic($name); diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqDriverTest.php index 6b61465c3..b209d85bc 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqDriverTest.php @@ -92,9 +92,6 @@ protected function createQueue(string $name): InteropQueue return new AmqpQueue($name); } - /** - * @return AmqpTopic - */ protected function createTopic(string $name): AmqpTopic { return new AmqpTopic($name); diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index a087926ad..ecf7f9afa 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -1537,7 +1537,7 @@ private function createExtension() */ private function createConsumerStub($queue = null): Consumer { - if ($queue === null) { + if (null === $queue) { $queue = 'queue'; } if (is_string($queue)) { diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index fcc099538..1d94e6e51 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -677,7 +677,7 @@ private function createExtension() */ private function createConsumerStub($queue = null): Consumer { - if ($queue === null) { + if (null === $queue) { $queue = 'queue'; } if (is_string($queue)) { diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index cfcfd520c..348397137 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -221,7 +221,7 @@ private function createExtension() */ private function createConsumerStub($queue = null): Consumer { - if ($queue === null) { + if (null === $queue) { $queue = 'queue'; } if (is_string($queue)) { diff --git a/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php b/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php index 9b169a03d..7abb9d91c 100644 --- a/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php @@ -17,14 +17,14 @@ class FsCommonUseCasesTest extends \PHPUnit\Framework\TestCase */ private $fsContext; - public function setUp(): void + protected function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); new TempFile(sys_get_temp_dir().'/fs_test_queue'); } - public function tearDown(): void + protected function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/Tests/Functional/FsConsumerTest.php b/pkg/fs/Tests/Functional/FsConsumerTest.php index 495989aad..984ea160a 100644 --- a/pkg/fs/Tests/Functional/FsConsumerTest.php +++ b/pkg/fs/Tests/Functional/FsConsumerTest.php @@ -15,14 +15,14 @@ class FsConsumerTest extends TestCase */ private $fsContext; - public function setUp(): void + protected function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); $this->fsContext->purgeQueue($this->fsContext->createQueue('fs_test_queue')); } - public function tearDown(): void + protected function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php b/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php index 28457afbb..334a8fe7d 100644 --- a/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsConsumptionUseCasesTest.php @@ -25,14 +25,14 @@ class FsConsumptionUseCasesTest extends \PHPUnit\Framework\TestCase */ private $fsContext; - public function setUp(): void + protected function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); new TempFile(sys_get_temp_dir().'/fs_test_queue'); } - public function tearDown(): void + protected function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/Tests/Functional/FsProducerTest.php b/pkg/fs/Tests/Functional/FsProducerTest.php index ae95ddf68..75625cfdd 100644 --- a/pkg/fs/Tests/Functional/FsProducerTest.php +++ b/pkg/fs/Tests/Functional/FsProducerTest.php @@ -14,7 +14,7 @@ class FsProducerTest extends TestCase */ private $fsContext; - public function setUp(): void + protected function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); @@ -22,7 +22,7 @@ public function setUp(): void file_put_contents(sys_get_temp_dir().'/fs_test_queue', ''); } - public function tearDown(): void + protected function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php b/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php index 01b8894f9..3a0327d7c 100644 --- a/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsRpcUseCasesTest.php @@ -20,7 +20,7 @@ class FsRpcUseCasesTest extends TestCase */ private $fsContext; - public function setUp(): void + protected function setUp(): void { $this->fsContext = (new FsConnectionFactory(['path' => sys_get_temp_dir()]))->createContext(); @@ -28,7 +28,7 @@ public function setUp(): void new TempFile(sys_get_temp_dir().'/fs_reply_queue'); } - public function tearDown(): void + protected function tearDown(): void { $this->fsContext->close(); } diff --git a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php index e34d9d1d5..4d53934ff 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php @@ -13,7 +13,7 @@ class GearmanSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFro { private $time; - public function setUp(): void + protected function setUp(): void { $this->time = time(); } diff --git a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php index b68b94480..26e6f79a4 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -13,7 +13,7 @@ class GearmanSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndRece { private $time; - public function setUp(): void + protected function setUp(): void { $this->time = time(); } diff --git a/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php b/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php index ccefe0278..b6b644beb 100644 --- a/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/Functional/MongodbConsumerTest.php @@ -19,7 +19,7 @@ class MongodbConsumerTest extends TestCase */ private $context; - public function setUp(): void + protected function setUp(): void { $this->context = $this->buildMongodbContext(); } diff --git a/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php index 1f06aac5d..ab9b13aaa 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php @@ -18,7 +18,7 @@ class MongodbSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceiveP private $publishedAt; - public function setUp(): void + protected function setUp(): void { parent::setUp(); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php index 9a913e422..a961cdf3f 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php @@ -13,7 +13,7 @@ class PheanstalkSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceive { private $time; - public function setUp(): void + protected function setUp(): void { $this->time = time(); } diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php index c3501f8aa..cedc0dd48 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -13,7 +13,7 @@ class PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndR { private $time; - public function setUp(): void + protected function setUp(): void { $this->time = time(); } diff --git a/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php b/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php index f54aadf91..87d97c289 100644 --- a/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php @@ -11,15 +11,15 @@ */ class PRedisCommonUseCasesTest extends TestCase { - use RedisExtension; use CommonUseCasesTrait; + use RedisExtension; /** * @var RedisContext */ private $context; - public function setUp(): void + protected function setUp(): void { $this->context = $this->buildPRedisContext(); @@ -27,7 +27,7 @@ public function setUp(): void $this->context->deleteTopic($this->context->createTopic('enqueue.test_topic')); } - public function tearDown(): void + protected function tearDown(): void { $this->context->close(); } diff --git a/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php b/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php index e657b1830..f68cf6129 100644 --- a/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php @@ -11,15 +11,15 @@ */ class PRedisConsumptionUseCasesTest extends TestCase { - use RedisExtension; use ConsumptionUseCasesTrait; + use RedisExtension; /** * @var RedisContext */ private $context; - public function setUp(): void + protected function setUp(): void { $this->context = $this->buildPRedisContext(); @@ -27,7 +27,7 @@ public function setUp(): void $this->context->deleteQueue($this->context->createQueue('enqueue.test_queue_reply')); } - public function tearDown(): void + protected function tearDown(): void { $this->context->close(); } diff --git a/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php b/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php index ee4a1a786..af9140704 100644 --- a/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php @@ -11,15 +11,15 @@ */ class PhpRedisCommonUseCasesTest extends TestCase { - use RedisExtension; use CommonUseCasesTrait; + use RedisExtension; /** * @var RedisContext */ private $context; - public function setUp(): void + protected function setUp(): void { $this->context = $this->buildPhpRedisContext(); @@ -27,7 +27,7 @@ public function setUp(): void $this->context->deleteTopic($this->context->createTopic('enqueue.test_topic')); } - public function tearDown(): void + protected function tearDown(): void { $this->context->close(); } diff --git a/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php b/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php index f255d4ea0..cd5023178 100644 --- a/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php @@ -11,15 +11,15 @@ */ class PhpRedisConsumptionUseCasesTest extends TestCase { - use RedisExtension; use ConsumptionUseCasesTrait; + use RedisExtension; /** * @var RedisContext */ private $context; - public function setUp(): void + protected function setUp(): void { $this->context = $this->buildPhpRedisContext(); @@ -27,7 +27,7 @@ public function setUp(): void $this->context->deleteQueue($this->context->createQueue('enqueue.test_queue_reply')); } - public function tearDown(): void + protected function tearDown(): void { $this->context->close(); } diff --git a/pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php b/pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php index f003825d1..9c57dcbdc 100644 --- a/pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php +++ b/pkg/sqs/Tests/Functional/SqsConsumptionUseCasesTest.php @@ -18,8 +18,8 @@ class SqsConsumptionUseCasesTest extends TestCase { - use SqsExtension; use RetryTrait; + use SqsExtension; /** * @var SqsContext diff --git a/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php b/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php index 1b56893b1..e3f09737a 100644 --- a/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompCommonUseCasesTest.php @@ -12,22 +12,22 @@ */ class StompCommonUseCasesTest extends \PHPUnit\Framework\TestCase { - use RabbitmqStompExtension; use RabbitManagementExtensionTrait; + use RabbitmqStompExtension; /** * @var StompContext */ private $stompContext; - public function setUp(): void + protected function setUp(): void { $this->stompContext = $this->buildStompContext(); $this->removeQueue('stomp.test'); } - public function tearDown(): void + protected function tearDown(): void { $this->stompContext->close(); } diff --git a/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php b/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php index fd816ccad..2025380fd 100644 --- a/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompConsumptionUseCasesTest.php @@ -20,22 +20,22 @@ */ class StompConsumptionUseCasesTest extends \PHPUnit\Framework\TestCase { - use RabbitmqStompExtension; use RabbitManagementExtensionTrait; + use RabbitmqStompExtension; /** * @var StompContext */ private $stompContext; - public function setUp(): void + protected function setUp(): void { $this->stompContext = $this->buildStompContext(); $this->removeQueue('stomp.test'); } - public function tearDown(): void + protected function tearDown(): void { $this->stompContext->close(); } diff --git a/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php b/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php index 657510c19..4cbb3af47 100644 --- a/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php +++ b/pkg/stomp/Tests/Functional/StompRpcUseCasesTest.php @@ -14,15 +14,15 @@ */ class StompRpcUseCasesTest extends \PHPUnit\Framework\TestCase { - use RabbitmqStompExtension; use RabbitManagementExtensionTrait; + use RabbitmqStompExtension; /** * @var StompContext */ private $stompContext; - public function setUp(): void + protected function setUp(): void { $this->stompContext = $this->buildStompContext(); @@ -30,7 +30,7 @@ public function setUp(): void $this->removeQueue('stomp.rpc.reply_test'); } - public function tearDown(): void + protected function tearDown(): void { $this->stompContext->close(); } diff --git a/pkg/test/ReadAttributeTrait.php b/pkg/test/ReadAttributeTrait.php index 381b513da..6938f257c 100644 --- a/pkg/test/ReadAttributeTrait.php +++ b/pkg/test/ReadAttributeTrait.php @@ -21,7 +21,7 @@ private function getClassAttribute( string $attribute, ?string $class = null ): ReflectionProperty { - if ($class === null) { + if (null === $class) { $class = get_class($object); } @@ -29,7 +29,7 @@ private function getClassAttribute( return new ReflectionProperty($class, $attribute); } catch (\ReflectionException $exception) { $parentClass = get_parent_class($object); - if ($parentClass === false) { + if (false === $parentClass) { throw $exception; } diff --git a/pkg/wamp/Tests/Functional/WampConsumerTest.php b/pkg/wamp/Tests/Functional/WampConsumerTest.php index 57dc32fd5..2494721d1 100644 --- a/pkg/wamp/Tests/Functional/WampConsumerTest.php +++ b/pkg/wamp/Tests/Functional/WampConsumerTest.php @@ -16,8 +16,8 @@ */ class WampConsumerTest extends TestCase { - use WampExtension; use RetryTrait; + use WampExtension; public static function setUpBeforeClass(): void { From 9e6a755fb1d8118aab5f1e0efd8dfd12ceac5bfe Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 09:51:30 +0200 Subject: [PATCH 0877/1142] Update PHP and PHPUnit across all packages; fix ext-rdkafka requirement --- composer.json | 4 ++-- pkg/amqp-bunny/composer.json | 4 ++-- pkg/amqp-ext/composer.json | 4 ++-- pkg/amqp-lib/composer.json | 4 ++-- pkg/amqp-tools/composer.json | 4 ++-- pkg/async-command/composer.json | 2 +- pkg/async-event-dispatcher/composer.json | 4 ++-- pkg/dbal/composer.json | 4 ++-- pkg/enqueue-bundle/composer.json | 4 ++-- pkg/enqueue/composer.json | 4 ++-- pkg/fs/composer.json | 4 ++-- pkg/gearman/composer.json | 4 ++-- pkg/gps/composer.json | 4 ++-- pkg/job-queue/composer.json | 4 ++-- pkg/mongodb/composer.json | 4 ++-- pkg/monitoring/composer.json | 4 ++-- pkg/null/composer.json | 4 ++-- pkg/pheanstalk/composer.json | 4 ++-- pkg/rdkafka/composer.json | 4 ++-- pkg/redis/composer.json | 4 ++-- pkg/simple-client/composer.json | 4 ++-- pkg/sns/composer.json | 4 ++-- pkg/snsqs/composer.json | 4 ++-- pkg/sqs/composer.json | 4 ++-- pkg/stomp/composer.json | 4 ++-- pkg/wamp/composer.json | 4 ++-- 26 files changed, 51 insertions(+), 51 deletions(-) diff --git a/composer.json b/composer.json index c1cc4b041..b1ba9ff8b 100644 --- a/composer.json +++ b/composer.json @@ -9,12 +9,12 @@ "phpstan": "bin/phpstan analyse --memory-limit=512M -c phpstan.neon" }, "require": { - "php": "^7.3|^8.0", + "php": "^7.3", "ext-amqp": "^1.9.3", "ext-gearman": "^2.0", "ext-mongodb": "^1.5", - "ext-rdkafka": "^3.0.3", + "ext-rdkafka": "^3.0.3|^4.0|^5.0", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.7|^0.8", diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 8c8d053be..01d6a8c4a 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -6,14 +6,14 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "bunny/bunny": "^0.4", "enqueue/amqp-tools": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 5bc1b3f07..203908160 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -6,14 +6,14 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "ext-amqp": "^1.9.3", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6", diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index a04900d1c..2d9d2515f 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -6,14 +6,14 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "php-amqplib/php-amqplib": "^2.10", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index 6cb280fd5..52c582954 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -6,13 +6,13 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev" }, diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index a511f8b0e..24a24e80a 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -13,7 +13,7 @@ "symfony/process": "^4.3|^5" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "symfony/dependency-injection": "^4.3|^5", "symfony/config": "^4.3|^5", "symfony/http-kernel": "^4.3|^5", diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index dae5bb529..d4a72125b 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -6,13 +6,13 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", "symfony/event-dispatcher": "^4.3|^5" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "symfony/dependency-injection": "^4.3|^5", "symfony/config": "^4.3|^5", "symfony/http-kernel": "^4.3|^5", diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index e097f228c..dfeba65f3 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -6,13 +6,13 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.6", "ramsey/uuid": "^3|^4" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index ee7c5459e..43a73fa34 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "symfony/framework-bundle": "^4.3|^5", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", @@ -21,7 +21,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/stomp": "0.10.x-dev", "enqueue/amqp-ext": "0.10.x-dev", "enqueue/amqp-lib": "0.10.x-dev", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index ed9603057..e8c3f3ade 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "enqueue/null": "^0.10", @@ -16,7 +16,7 @@ "psr/container": "^1" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "symfony/console": "^4.3|^5", "symfony/dependency-injection": "^4.3|^5", "symfony/config": "^4.3|^5", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 19d2fd841..40cfe59c3 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -6,14 +6,14 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "symfony/filesystem": "^4.3|^5", "makasim/temp-file": "^0.2@stable" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/null": "0.10.x-dev", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6", diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index a2b2eeccd..92dd3bc09 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -6,12 +6,12 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "ext-gearman": "^2.0", "queue-interop/queue-interop": "^0.8" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 7a9868f2f..116a5dbf8 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -6,13 +6,13 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "google/cloud-pubsub": "^1.0", "enqueue/dsn": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 08b9889c2..cbe720e28 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", @@ -14,7 +14,7 @@ "doctrine/dbal": "<2.10" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "doctrine/doctrine-bundle": "~1.2|^2", "symfony/browser-kit": "^4.3|^5", diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index 055abe0a2..d84c6e68f 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -10,13 +10,13 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "mongodb/mongodb": "^1.2", "ext-mongodb": "^1.5" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "queue-interop/queue-spec": "^0.6", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev" diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index ee23e109b..92d31ec96 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -6,12 +6,12 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "enqueue/enqueue": "^0.10", "enqueue/dsn": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", diff --git a/pkg/null/composer.json b/pkg/null/composer.json index e2ef6c29e..5c43f40bc 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -6,11 +6,11 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index 7d7907ef1..40a32fb3c 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -6,12 +6,12 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "pda/pheanstalk": "^3", "queue-interop/queue-interop": "^0.8" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 4cdeb04ef..8db8e9cc3 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -6,12 +6,12 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "ext-rdkafka": "^3.0.3|^4.0|^5.0", "queue-interop/queue-interop": "^0.8" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6", diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 135f5a0c9..ace7230e5 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -6,13 +6,13 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "ramsey/uuid": "^3|^4" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "predis/predis": "^1.1", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 3b525bf16..e06d880af 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -6,14 +6,14 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "enqueue/enqueue": "^0.10", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "symfony/config": "^4.3|^5" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/amqp-ext": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index 7fb27bffc..cde4dab79 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -6,13 +6,13 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "~3.26" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, diff --git a/pkg/snsqs/composer.json b/pkg/snsqs/composer.json index 19398df34..ddf8d80cf 100644 --- a/pkg/snsqs/composer.json +++ b/pkg/snsqs/composer.json @@ -6,14 +6,14 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "enqueue/sns": "^0.10", "enqueue/sqs": "^0.10" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index cb21e9905..1ca52ab41 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -6,13 +6,13 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "~3.26" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" }, diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 30fe9a2fa..0509d34b0 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "enqueue/dsn": "^0.10", "stomp-php/stomp-php": "^4", "queue-interop/queue-interop": "^0.8", @@ -15,7 +15,7 @@ "richardfullmer/rabbitmq-management-api": "^2.0" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index c128997e5..f868b00eb 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -6,14 +6,14 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3", + "php": "^7.3", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "thruway/client": "^0.5.0", "thruway/pawl-transport": "^0.5.0" }, "require-dev": { - "phpunit/phpunit": "~7.5", + "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6" From 1cad99fc1d9dcda2e09527ac0faa175b101a239e Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 09:55:35 +0200 Subject: [PATCH 0878/1142] Fix CS --- pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php index 4e4b54166..a90b1d306 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php @@ -128,7 +128,7 @@ public function testProduceAndReceiveOneMessageSentDirectlyToTemporaryQueue() public function testProduceAndReceiveOneMessageSentDirectlyToTopic() { $topic = $this->amqpContext->createTopic('amqp_ext.test_exchange'); - $topic->setType(AMQP_EX_TYPE_FANOUT); + $topic->setType(\AMQP_EX_TYPE_FANOUT); $this->amqpContext->declareTopic($topic); $queue = $this->amqpContext->createQueue('amqp_ext.test'); @@ -153,7 +153,7 @@ public function testProduceAndReceiveOneMessageSentDirectlyToTopic() public function testConsumerReceiveMessageFromTopicDirectly() { $topic = $this->amqpContext->createTopic('amqp_ext.test_exchange'); - $topic->setType(AMQP_EX_TYPE_FANOUT); + $topic->setType(\AMQP_EX_TYPE_FANOUT); $this->amqpContext->declareTopic($topic); @@ -176,7 +176,7 @@ public function testConsumerReceiveMessageFromTopicDirectly() public function testConsumerReceiveMessageWithZeroTimeout() { $topic = $this->amqpContext->createTopic('amqp_ext.test_exchange'); - $topic->setType(AMQP_EX_TYPE_FANOUT); + $topic->setType(\AMQP_EX_TYPE_FANOUT); $this->amqpContext->declareTopic($topic); From eee800d41975319cd39360c1a5b74a993f24f0ba Mon Sep 17 00:00:00 2001 From: florian Date: Tue, 2 Feb 2021 15:53:52 +0100 Subject: [PATCH 0879/1142] add sns driver + use profile to establish connection --- pkg/enqueue/Resources.php | 11 ++++++++--- pkg/sns/SnsConnectionFactory.php | 23 ++++++++++++----------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/pkg/enqueue/Resources.php b/pkg/enqueue/Resources.php index 75884bab6..713450fed 100644 --- a/pkg/enqueue/Resources.php +++ b/pkg/enqueue/Resources.php @@ -14,6 +14,7 @@ use Enqueue\Pheanstalk\PheanstalkConnectionFactory; use Enqueue\RdKafka\RdKafkaConnectionFactory; use Enqueue\Redis\RedisConnectionFactory; +use Enqueue\Sns\SnsConnectionFactory; use Enqueue\SnsQs\SnsQsConnectionFactory; use Enqueue\Sqs\SqsConnectionFactory; use Enqueue\Stomp\StompConnectionFactory; @@ -42,7 +43,7 @@ public static function getAvailableConnections(): array $availableMap = []; foreach ($map as $connectionClass => $item) { - if (class_exists($connectionClass)) { + if (\class_exists($connectionClass)) { $availableMap[$connectionClass] = $item; } } @@ -156,6 +157,10 @@ public static function getKnownConnections(): array 'schemes' => ['sqs'], 'supportedSchemeExtensions' => [], 'package' => 'enqueue/sqs', ]; + $map[SnsConnectionFactory::class] = [ + 'schemes' => ['sns'], + 'supportedSchemeExtensions' => [], + 'package' => 'enqueue/sns', ]; $map[SnsQsConnectionFactory::class] = [ 'schemes' => ['snsqs'], 'supportedSchemeExtensions' => [], @@ -183,9 +188,9 @@ public static function getKnownConnections(): array public static function addConnection(string $connectionFactoryClass, array $schemes, array $extensions, string $package): void { - if (class_exists($connectionFactoryClass)) { + if (\class_exists($connectionFactoryClass)) { if (false == (new \ReflectionClass($connectionFactoryClass))->implementsInterface(ConnectionFactory::class)) { - throw new \InvalidArgumentException(sprintf('The connection factory class "%s" must implement "%s" interface.', $connectionFactoryClass, ConnectionFactory::class)); + throw new \InvalidArgumentException(\sprintf('The connection factory class "%s" must implement "%s" interface.', $connectionFactoryClass, ConnectionFactory::class)); } } diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index ffef39803..b3efd90d7 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -51,19 +51,19 @@ public function __construct($config = 'sns:') if (empty($config)) { $config = []; - } elseif (is_string($config)) { + } elseif (\is_string($config)) { $config = $this->parseDsn($config); - } elseif (is_array($config)) { - if (array_key_exists('dsn', $config)) { - $config = array_replace_recursive($config, $this->parseDsn($config['dsn'])); + } elseif (\is_array($config)) { + if (\array_key_exists('dsn', $config)) { + $config = \array_replace_recursive($config, $this->parseDsn($config['dsn'])); unset($config['dsn']); } } else { - throw new \LogicException(sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSnsClient::class)); + throw new \LogicException(\sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSnsClient::class)); } - $this->config = array_replace($this->defaultConfig(), $config); + $this->config = \array_replace($this->defaultConfig(), $config); } /** @@ -89,6 +89,10 @@ private function establishConnection(): SnsClient $config['endpoint'] = $this->config['endpoint']; } + if (isset($this->config['profile'])) { + $config['profile'] = $this->config['profile']; + } + if ($this->config['key'] && $this->config['secret']) { $config['credentials'] = [ 'key' => $this->config['key'], @@ -117,13 +121,10 @@ private function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if ('sns' !== $dsn->getSchemeProtocol()) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be "sns"', - $dsn->getSchemeProtocol() - )); + throw new \LogicException(\sprintf('The given scheme protocol "%s" is not supported. It must be "sns"', $dsn->getSchemeProtocol())); } - return array_filter(array_replace($dsn->getQuery(), [ + return \array_filter(\array_replace($dsn->getQuery(), [ 'key' => $dsn->getString('key'), 'secret' => $dsn->getString('secret'), 'token' => $dsn->getString('token'), From 15427a23b450b9e91d9358329d77fc0e520b8986 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 02:14:42 +0200 Subject: [PATCH 0880/1142] Fix package CI - Add push to master trigger; - Replace the clunky cache + composer install steps with an Action; - Replace Travis with GH WF in packages; - Add the missing CI to amqp-tools; - Replace the shields. --- .github/workflows/ci.yml | 52 +++++-------------- README.md | 36 ++++++------- pkg/amqp-bunny/.github/workflows/ci.yml | 27 ++++++++++ pkg/amqp-bunny/.travis.yml | 23 -------- pkg/amqp-bunny/README.md | 2 +- pkg/amqp-ext/.github/workflows/ci.yml | 29 +++++++++++ pkg/amqp-ext/.travis.yml | 24 --------- pkg/amqp-ext/README.md | 2 +- pkg/amqp-lib/.github/workflows/ci.yml | 29 +++++++++++ pkg/amqp-lib/.travis.yml | 23 -------- pkg/amqp-lib/README.md | 2 +- pkg/amqp-tools/.github/workflows/ci.yml | 27 ++++++++++ pkg/amqp-tools/README.md | 2 +- pkg/async-command/.github/workflows/ci.yml | 29 +++++++++++ pkg/async-command/.travis.yml | 23 -------- pkg/async-command/README.md | 2 +- .../.github/workflows/ci.yml | 29 +++++++++++ pkg/async-event-dispatcher/.travis.yml | 23 -------- pkg/async-event-dispatcher/README.md | 2 +- pkg/dbal/.github/workflows/ci.yml | 29 +++++++++++ pkg/dbal/.travis.yml | 23 -------- pkg/dbal/README.md | 2 +- pkg/dsn/.github/workflows/ci.yml | 29 +++++++++++ pkg/dsn/.travis.yml | 23 -------- pkg/enqueue-bundle/.github/workflows/ci.yml | 32 ++++++++++++ pkg/enqueue-bundle/.travis.yml | 28 ---------- pkg/enqueue-bundle/README.md | 2 +- pkg/enqueue/.github/workflows/ci.yml | 30 +++++++++++ pkg/enqueue/.travis.yml | 27 ---------- pkg/enqueue/README.md | 2 +- pkg/fs/.github/workflows/ci.yml | 29 +++++++++++ pkg/fs/.travis.yml | 23 -------- pkg/fs/README.md | 2 +- pkg/gearman/.github/workflows/ci.yml | 30 +++++++++++ pkg/gearman/.travis.yml | 34 ------------ pkg/gearman/README.md | 2 +- pkg/gps/.github/workflows/ci.yml | 29 +++++++++++ pkg/gps/.travis.yml | 23 -------- pkg/gps/README.md | 2 +- pkg/job-queue/.github/workflows/ci.yml | 29 +++++++++++ pkg/job-queue/.travis.yml | 23 -------- pkg/job-queue/README.md | 2 +- pkg/mongodb/.github/workflows/ci.yml | 30 +++++++++++ pkg/mongodb/.travis.yml | 27 ---------- pkg/mongodb/README.md | 2 +- pkg/monitoring/.github/workflows/ci.yml | 27 ++++++++++ pkg/monitoring/.travis.yml | 23 -------- pkg/monitoring/README.md | 2 +- pkg/null/.github/workflows/ci.yml | 29 +++++++++++ pkg/null/.travis.yml | 23 -------- pkg/null/README.md | 2 +- pkg/pheanstalk/.github/workflows/ci.yml | 29 +++++++++++ pkg/pheanstalk/.travis.yml | 23 -------- pkg/pheanstalk/README.md | 2 +- pkg/rdkafka/.github/workflows/ci.yml | 29 +++++++++++ pkg/rdkafka/.travis.yml | 24 --------- pkg/rdkafka/README.md | 2 +- pkg/redis/.github/workflows/ci.yml | 30 +++++++++++ pkg/redis/.travis.yml | 26 ---------- pkg/redis/README.md | 2 +- pkg/simple-client/.github/workflows/ci.yml | 31 +++++++++++ pkg/simple-client/.travis.yml | 24 --------- pkg/simple-client/README.md | 2 +- pkg/sns/.github/workflows/ci.yml | 29 +++++++++++ pkg/sns/.travis.yml | 23 -------- pkg/sns/README.md | 2 +- pkg/snsqs/.github/workflows/ci.yml | 29 +++++++++++ pkg/snsqs/.travis.yml | 23 -------- pkg/snsqs/README.md | 2 +- pkg/sqs/.github/workflows/ci.yml | 29 +++++++++++ pkg/sqs/.travis.yml | 23 -------- pkg/sqs/README.md | 2 +- pkg/stomp/.github/workflows/ci.yml | 29 +++++++++++ pkg/stomp/.travis.yml | 23 -------- pkg/stomp/README.md | 2 +- pkg/wamp/.github/workflows/ci.yml | 27 ++++++++++ pkg/wamp/.travis.yml | 23 -------- pkg/wamp/README.md | 2 +- 78 files changed, 810 insertions(+), 688 deletions(-) create mode 100644 pkg/amqp-bunny/.github/workflows/ci.yml delete mode 100644 pkg/amqp-bunny/.travis.yml create mode 100644 pkg/amqp-ext/.github/workflows/ci.yml delete mode 100644 pkg/amqp-ext/.travis.yml create mode 100644 pkg/amqp-lib/.github/workflows/ci.yml delete mode 100644 pkg/amqp-lib/.travis.yml create mode 100644 pkg/amqp-tools/.github/workflows/ci.yml create mode 100644 pkg/async-command/.github/workflows/ci.yml delete mode 100644 pkg/async-command/.travis.yml create mode 100644 pkg/async-event-dispatcher/.github/workflows/ci.yml delete mode 100644 pkg/async-event-dispatcher/.travis.yml create mode 100644 pkg/dbal/.github/workflows/ci.yml delete mode 100644 pkg/dbal/.travis.yml create mode 100644 pkg/dsn/.github/workflows/ci.yml delete mode 100644 pkg/dsn/.travis.yml create mode 100644 pkg/enqueue-bundle/.github/workflows/ci.yml delete mode 100644 pkg/enqueue-bundle/.travis.yml create mode 100644 pkg/enqueue/.github/workflows/ci.yml delete mode 100644 pkg/enqueue/.travis.yml create mode 100644 pkg/fs/.github/workflows/ci.yml delete mode 100644 pkg/fs/.travis.yml create mode 100644 pkg/gearman/.github/workflows/ci.yml delete mode 100644 pkg/gearman/.travis.yml create mode 100644 pkg/gps/.github/workflows/ci.yml delete mode 100644 pkg/gps/.travis.yml create mode 100644 pkg/job-queue/.github/workflows/ci.yml delete mode 100644 pkg/job-queue/.travis.yml create mode 100644 pkg/mongodb/.github/workflows/ci.yml delete mode 100644 pkg/mongodb/.travis.yml create mode 100644 pkg/monitoring/.github/workflows/ci.yml delete mode 100644 pkg/monitoring/.travis.yml create mode 100644 pkg/null/.github/workflows/ci.yml delete mode 100644 pkg/null/.travis.yml create mode 100644 pkg/pheanstalk/.github/workflows/ci.yml delete mode 100644 pkg/pheanstalk/.travis.yml create mode 100644 pkg/rdkafka/.github/workflows/ci.yml delete mode 100644 pkg/rdkafka/.travis.yml create mode 100644 pkg/redis/.github/workflows/ci.yml delete mode 100644 pkg/redis/.travis.yml create mode 100644 pkg/simple-client/.github/workflows/ci.yml delete mode 100644 pkg/simple-client/.travis.yml create mode 100644 pkg/sns/.github/workflows/ci.yml delete mode 100644 pkg/sns/.travis.yml create mode 100644 pkg/snsqs/.github/workflows/ci.yml delete mode 100644 pkg/snsqs/.travis.yml create mode 100644 pkg/sqs/.github/workflows/ci.yml delete mode 100644 pkg/sqs/.travis.yml create mode 100644 pkg/stomp/.github/workflows/ci.yml delete mode 100644 pkg/stomp/.travis.yml create mode 100644 pkg/wamp/.github/workflows/ci.yml delete mode 100644 pkg/wamp/.travis.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 48cb4f16c..ed066369b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,9 @@ name: CI -on: [pull_request] +on: + pull_request: + push: + branches: + - master jobs: static_analysis: name: Static analysis @@ -12,18 +16,6 @@ jobs: PATTERNS: | pkg/**/*.php - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: | - ${{ runner.os }}-composer- - - uses: shivammathur/setup-php@v2 with: php-version: '7.4' @@ -32,7 +24,9 @@ jobs: ini-values: memory_limit=2048M - run: php ./bin/fix-symfony-version.php "4.3.*" - - run: composer install --no-progress + + - uses: "ramsey/composer-install@v1" + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${{ env.GIT_DIFF_FILTERED }} @@ -49,18 +43,6 @@ jobs: PATTERNS: | pkg/**/*.php - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: | - ${{ runner.os }}-composer- - - uses: shivammathur/setup-php@v2 with: php-version: '7.4' @@ -69,7 +51,9 @@ jobs: ini-values: memory_limit=2048M - run: php ./bin/fix-symfony-version.php "4.3.*" - - run: composer install --no-progress + + - uses: "ramsey/composer-install@v1" + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} @@ -142,18 +126,6 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: | - ${{ runner.os }}-composer- - - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} @@ -163,7 +135,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" - - run: composer install --no-progress + - uses: "ramsey/composer-install@v1" - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php diff --git a/README.md b/README.md index 1d1cccb5f..fde09e871 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

Enqueue Chat - Build Status + Build Status Total Downloads Latest Stable Version License @@ -30,71 +30,71 @@ Features: * Battle-tested. Used in production. * Supported transports * [AMQP(s)](https://php-enqueue.github.io/transport/amqp/) based on [PHP AMQP extension](https://github.com/pdezwart/php-amqp) -[![Build Status](https://travis-ci.org/php-enqueue/amqp-ext.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-ext) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-ext/CI)](https://github.com/php-enqueue/amqp-ext/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-ext/d/total.png)](https://packagist.org/packages/enqueue/amqp-ext/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-ext/version.png)](https://packagist.org/packages/enqueue/amqp-ext) * [AMQP](https://php-enqueue.github.io/transport/amqp_bunny/) based on [bunny](https://github.com/jakubkulhan/bunny) -[![Build Status](https://travis-ci.org/php-enqueue/amqp-bunny.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-bunny) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-bunny/CI)](https://github.com/php-enqueue/amqp-bunny/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-bunny/d/total.png)](https://packagist.org/packages/enqueue/amqp-bunny/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-bunny/version.png)](https://packagist.org/packages/enqueue/amqp-bunny) * [AMQP(s)](https://php-enqueue.github.io/transport/amqp_lib/) based on [php-amqplib](https://github.com/php-amqplib/php-amqplib) -[![Build Status](https://travis-ci.org/php-enqueue/amqp-lib.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-lib) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-lib/CI)](https://github.com/php-enqueue/amqp-lib/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-lib/d/total.png)](https://packagist.org/packages/enqueue/amqp-lib/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-lib/version.png)](https://packagist.org/packages/enqueue/amqp-lib) * [Beanstalk](https://php-enqueue.github.io/transport/pheanstalk/) -[![Build Status](https://travis-ci.org/php-enqueue/pheanstalk.png?branch=master)](https://travis-ci.org/php-enqueue/pheanstalk) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/pheanstalk/CI)](https://github.com/php-enqueue/pheanstalk/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/pheanstalk/d/total.png)](https://packagist.org/packages/enqueue/pheanstalk/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/pheanstalk/version.png)](https://packagist.org/packages/enqueue/pheanstalk) * [STOMP](https://php-enqueue.github.io/transport/stomp/) -[![Build Status](https://travis-ci.org/php-enqueue/stomp.png?branch=master)](https://travis-ci.org/php-enqueue/stomp) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/stomp/CI)](https://github.com/php-enqueue/stomp/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/stomp/d/total.png)](https://packagist.org/packages/enqueue/stomp/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/stomp/version.png)](https://packagist.org/packages/enqueue/stomp) * [Amazon SQS](https://php-enqueue.github.io/transport/sqs/) -[![Build Status](https://travis-ci.org/php-enqueue/sqs.png?branch=master)](https://travis-ci.org/php-enqueue/sqs) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/sqs/CI)](https://github.com/php-enqueue/sqs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) * [Amazon SNS](https://php-enqueue.github.io/transport/sns/) -[![Build Status](https://travis-ci.org/php-enqueue/sns.png?branch=master)](https://travis-ci.org/php-enqueue/sns) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/sns/CI)](https://github.com/php-enqueue/sns/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) * [Amazon SNS\SQS](https://php-enqueue.github.io/transport/snsqs/) -[![Build Status](https://travis-ci.org/php-enqueue/snsqs.png?branch=master)](https://travis-ci.org/php-enqueue/snsqs) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/snsqs/CI)](https://github.com/php-enqueue/snsqs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/snsqs/d/total.png)](https://packagist.org/packages/enqueue/snsqs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/snsqs/version.png)](https://packagist.org/packages/enqueue/snsqs) * [Google PubSub](https://php-enqueue.github.io/transport/gps/) -[![Build Status](https://travis-ci.org/php-enqueue/gps.png?branch=master)](https://travis-ci.org/php-enqueue/gps) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/gps/CI)](https://github.com/php-enqueue/gps/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/gps/d/total.png)](https://packagist.org/packages/enqueue/gps/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/gps/version.png)](https://packagist.org/packages/enqueue/gps) * [Kafka](https://php-enqueue.github.io/transport/kafka/) -[![Build Status](https://travis-ci.org/php-enqueue/rdkafka.png?branch=master)](https://travis-ci.org/php-enqueue/rdkafka) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/rdkafka/CI)](https://github.com/php-enqueue/rdkafka/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/rdkafka/d/total.png)](https://packagist.org/packages/enqueue/rdkafka/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/rdkafka/version.png)](https://packagist.org/packages/enqueue/rdkafka) * [Redis](https://php-enqueue.github.io/transport/redis/) -[![Build Status](https://travis-ci.org/php-enqueue/redis.png?branch=master)](https://travis-ci.org/php-enqueue/redis) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/redis/CI)](https://github.com/php-enqueue/redis/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/redis/d/total.png)](https://packagist.org/packages/enqueue/redis/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/redis/version.png)](https://packagist.org/packages/enqueue/redis) * [Gearman](https://php-enqueue.github.io/transport/gearman/) -[![Build Status](https://travis-ci.org/php-enqueue/gearman.png?branch=master)](https://travis-ci.org/php-enqueue/gearman) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/gearman/CI)](https://github.com/php-enqueue/gearman/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/gearman/d/total.png)](https://packagist.org/packages/enqueue/gearman/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/gearman/version.png)](https://packagist.org/packages/enqueue/gearman) * [Doctrine DBAL](https://php-enqueue.github.io/transport/dbal/) -[![Build Status](https://travis-ci.org/php-enqueue/dbal.png?branch=master)](https://travis-ci.org/php-enqueue/dbal) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/dbal/CI)](https://github.com/php-enqueue/dbal/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/dbal/d/total.png)](https://packagist.org/packages/enqueue/dbal/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/dbal/version.png)](https://packagist.org/packages/enqueue/dbal) * [Filesystem](https://php-enqueue.github.io/transport/filesystem/) -[![Build Status](https://travis-ci.org/php-enqueue/fs.png?branch=master)](https://travis-ci.org/php-enqueue/fs) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/fs/CI)](https://github.com/php-enqueue/fs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/fs/d/total.png)](https://packagist.org/packages/enqueue/fs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/fs/version.png)](https://packagist.org/packages/enqueue/fs) * [Mongodb](https://php-enqueue.github.io/transport/mongodb/) -[![Build Status](https://travis-ci.org/php-enqueue/mongodb.png?branch=master)](https://travis-ci.org/php-enqueue/mongodb) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/mongodb/CI)](https://github.com/php-enqueue/mongodb/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/mongodb/d/total.png)](https://packagist.org/packages/enqueue/mongodb/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/mongodb/version.png)](https://packagist.org/packages/enqueue/mongodb) * [WAMP](https://php-enqueue.github.io/transport/wamp/) -[![Build Status](https://travis-ci.org/php-enqueue/wamp.png?branch=master)](https://travis-ci.org/php-enqueue/wamp) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/wamp/CI)](https://github.com/php-enqueue/wamp/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/wamp/d/total.png)](https://packagist.org/packages/enqueue/wamp/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/wamp/version.png)](https://packagist.org/packages/enqueue/wamp) * [Null](https://php-enqueue.github.io/transport/null/) -[![Build Status](https://travis-ci.org/php-enqueue/null.png?branch=master)](https://travis-ci.org/php-enqueue/null) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/null/CI)](https://github.com/php-enqueue/null/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) * [the others are coming](https://github.com/php-enqueue/enqueue-dev/issues/284) diff --git a/pkg/amqp-bunny/.github/workflows/ci.yml b/pkg/amqp-bunny/.github/workflows/ci.yml new file mode 100644 index 000000000..bd62476f1 --- /dev/null +++ b/pkg/amqp-bunny/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/amqp-bunny/.travis.yml b/pkg/amqp-bunny/.travis.yml deleted file mode 100644 index 02ba7238b..000000000 --- a/pkg/amqp-bunny/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/amqp-bunny/README.md b/pkg/amqp-bunny/README.md index 9efcfa531..41754124f 100644 --- a/pkg/amqp-bunny/README.md +++ b/pkg/amqp-bunny/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # AMQP Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/amqp-bunny.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-bunny) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-bunny/CI)](https://github.com/php-enqueue/amqp-bunny/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-bunny/d/total.png)](https://packagist.org/packages/enqueue/amqp-bunny) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-bunny/version.png)](https://packagist.org/packages/enqueue/amqp-bunny) diff --git a/pkg/amqp-ext/.github/workflows/ci.yml b/pkg/amqp-ext/.github/workflows/ci.yml new file mode 100644 index 000000000..24af1bbc1 --- /dev/null +++ b/pkg/amqp-ext/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - run: php Tests/fix_composer_json.php + + - uses: "ramsey/composer-install@v1" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/amqp-ext/.travis.yml b/pkg/amqp-ext/.travis.yml deleted file mode 100644 index 8210653a3..000000000 --- a/pkg/amqp-ext/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - php Tests/fix_composer_json.php - - composer self-update - - composer install - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/amqp-ext/README.md b/pkg/amqp-ext/README.md index e750d3c36..f739aa94a 100644 --- a/pkg/amqp-ext/README.md +++ b/pkg/amqp-ext/README.md @@ -8,7 +8,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # AMQP Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/amqp-ext.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-ext) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-ext/CI)](https://github.com/php-enqueue/amqp-ext/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-ext/d/total.png)](https://packagist.org/packages/enqueue/amqp-ext) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-ext/version.png)](https://packagist.org/packages/enqueue/amqp-ext) diff --git a/pkg/amqp-lib/.github/workflows/ci.yml b/pkg/amqp-lib/.github/workflows/ci.yml new file mode 100644 index 000000000..e60e63b9b --- /dev/null +++ b/pkg/amqp-lib/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/amqp-lib/.travis.yml b/pkg/amqp-lib/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/amqp-lib/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/amqp-lib/README.md b/pkg/amqp-lib/README.md index 1a7be690a..64a1cd684 100644 --- a/pkg/amqp-lib/README.md +++ b/pkg/amqp-lib/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # AMQP Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/amqp-lib.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-lib) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-lib/CI)](https://github.com/php-enqueue/amqp-lib/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-lib/d/total.png)](https://packagist.org/packages/enqueue/amqp-lib) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-lib/version.png)](https://packagist.org/packages/enqueue/amqp-lib) diff --git a/pkg/amqp-tools/.github/workflows/ci.yml b/pkg/amqp-tools/.github/workflows/ci.yml new file mode 100644 index 000000000..bd62476f1 --- /dev/null +++ b/pkg/amqp-tools/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/amqp-tools/README.md b/pkg/amqp-tools/README.md index 14f007cbb..8d3f35dc0 100644 --- a/pkg/amqp-tools/README.md +++ b/pkg/amqp-tools/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # AMQP tools [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/amqp-tools.png?branch=master)](https://travis-ci.org/php-enqueue/amqp-tools) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-tools/CI)](https://github.com/php-enqueue/amqp-tools/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-tools/d/total.png)](https://packagist.org/packages/enqueue/amqp-tools) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-tools/version.png)](https://packagist.org/packages/enqueue/amqp-tools) diff --git a/pkg/async-command/.github/workflows/ci.yml b/pkg/async-command/.github/workflows/ci.yml new file mode 100644 index 000000000..e60e63b9b --- /dev/null +++ b/pkg/async-command/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/async-command/.travis.yml b/pkg/async-command/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/async-command/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/async-command/README.md b/pkg/async-command/README.md index bd895676d..cb6eef58c 100644 --- a/pkg/async-command/README.md +++ b/pkg/async-command/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Symfony Async Command. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/async-command.png?branch=master)](https://travis-ci.org/php-enqueue/async-command) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/async-command/CI)](https://github.com/php-enqueue/async-command/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/async-command/d/total.png)](https://packagist.org/packages/enqueue/async-command) [![Latest Stable Version](https://poser.pugx.org/enqueue/async-command/version.png)](https://packagist.org/packages/enqueue/async-command) diff --git a/pkg/async-event-dispatcher/.github/workflows/ci.yml b/pkg/async-event-dispatcher/.github/workflows/ci.yml new file mode 100644 index 000000000..e60e63b9b --- /dev/null +++ b/pkg/async-event-dispatcher/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/async-event-dispatcher/.travis.yml b/pkg/async-event-dispatcher/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/async-event-dispatcher/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/async-event-dispatcher/README.md b/pkg/async-event-dispatcher/README.md index 93cee308e..1ba408fa7 100644 --- a/pkg/async-event-dispatcher/README.md +++ b/pkg/async-event-dispatcher/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Symfony Async Event Dispatcher. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/async-event-dispathcer.png?branch=master)](https://travis-ci.org/php-enqueue/async-event-dispathcer) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/async-event-dispathcer/CI)](https://github.com/php-enqueue/async-event-dispathcer/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/async-event-dispathcer/d/total.png)](https://packagist.org/packages/enqueue/async-event-dispathcer) [![Latest Stable Version](https://poser.pugx.org/enqueue/async-event-dispathcer/version.png)](https://packagist.org/packages/enqueue/async-event-dispathcer) diff --git a/pkg/dbal/.github/workflows/ci.yml b/pkg/dbal/.github/workflows/ci.yml new file mode 100644 index 000000000..e60e63b9b --- /dev/null +++ b/pkg/dbal/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/dbal/.travis.yml b/pkg/dbal/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/dbal/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/dbal/README.md b/pkg/dbal/README.md index 77af52655..7f4d2d007 100644 --- a/pkg/dbal/README.md +++ b/pkg/dbal/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Doctrine DBAL Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/dbal.png?branch=master)](https://travis-ci.org/php-enqueue/dbal) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/dbal/CI)](https://github.com/php-enqueue/dbal/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/dbal/d/total.png)](https://packagist.org/packages/enqueue/dbal) [![Latest Stable Version](https://poser.pugx.org/enqueue/dbal/version.png)](https://packagist.org/packages/enqueue/dbal) diff --git a/pkg/dsn/.github/workflows/ci.yml b/pkg/dsn/.github/workflows/ci.yml new file mode 100644 index 000000000..8486752a8 --- /dev/null +++ b/pkg/dsn/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit diff --git a/pkg/dsn/.travis.yml b/pkg/dsn/.travis.yml deleted file mode 100644 index 27c064a7c..000000000 --- a/pkg/dsn/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit diff --git a/pkg/enqueue-bundle/.github/workflows/ci.yml b/pkg/enqueue-bundle/.github/workflows/ci.yml new file mode 100644 index 000000000..99b7fc6bf --- /dev/null +++ b/pkg/enqueue-bundle/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: mongodb + + - run: php Tests/fix_composer_json.php + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/enqueue-bundle/.travis.yml b/pkg/enqueue-bundle/.travis.yml deleted file mode 100644 index 880a93f5e..000000000 --- a/pkg/enqueue-bundle/.travis.yml +++ /dev/null @@ -1,28 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - - -php: - - '7.1' - -services: - - mongodb - -before_install: - - echo "extension = mongodb.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - -cache: - directories: - - $HOME/.composer/cache - -install: - - php Tests/fix_composer_json.php - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/enqueue-bundle/README.md b/pkg/enqueue-bundle/README.md index 54c242600..4f103b3df 100644 --- a/pkg/enqueue-bundle/README.md +++ b/pkg/enqueue-bundle/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message Queue Bundle [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/enqueue-bundle.png?branch=master)](https://travis-ci.org/php-enqueue/enqueue-bundle) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/enqueue-bundle/CI)](https://github.com/php-enqueue/enqueue-bundle/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/enqueue-bundle/d/total.png)](https://packagist.org/packages/enqueue/enqueue-bundle) [![Latest Stable Version](https://poser.pugx.org/enqueue/enqueue-bundle/version.png)](https://packagist.org/packages/enqueue/enqueue-bundle) diff --git a/pkg/enqueue/.github/workflows/ci.yml b/pkg/enqueue/.github/workflows/ci.yml new file mode 100644 index 000000000..390f70724 --- /dev/null +++ b/pkg/enqueue/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: mongodb + + - run: php Tests/fix_composer_json.php + + - uses: "ramsey/composer-install@v1" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/enqueue/.travis.yml b/pkg/enqueue/.travis.yml deleted file mode 100644 index 2c830d0a6..000000000 --- a/pkg/enqueue/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - -services: - - mongodb - -before_install: - - echo "extension = mongodb.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - -cache: - directories: - - $HOME/.composer/cache - -install: - - php Tests/fix_composer_json.php - - composer self-update - - composer install - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/enqueue/README.md b/pkg/enqueue/README.md index 2e5aa5a00..f61715759 100644 --- a/pkg/enqueue/README.md +++ b/pkg/enqueue/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message Queue. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/enqueue.png?branch=master)](https://travis-ci.org/php-enqueue/enqueue) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/enqueue/CI)](https://github.com/php-enqueue/enqueue/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/enqueue/d/total.png)](https://packagist.org/packages/enqueue/enqueue) [![Latest Stable Version](https://poser.pugx.org/enqueue/enqueue/version.png)](https://packagist.org/packages/enqueue/enqueue) diff --git a/pkg/fs/.github/workflows/ci.yml b/pkg/fs/.github/workflows/ci.yml new file mode 100644 index 000000000..e9a20ead1 --- /dev/null +++ b/pkg/fs/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: SYMFONY_DEPRECATIONS_HELPER=weak vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/fs/.travis.yml b/pkg/fs/.travis.yml deleted file mode 100644 index b910c0fcf..000000000 --- a/pkg/fs/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - SYMFONY_DEPRECATIONS_HELPER=weak vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/fs/README.md b/pkg/fs/README.md index b1e5411d5..596c60f29 100644 --- a/pkg/fs/README.md +++ b/pkg/fs/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Enqueue Filesystem Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/fs.png?branch=master)](https://travis-ci.org/php-enqueue/fs) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/fs/CI)](https://github.com/php-enqueue/fs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/fs/d/total.png)](https://packagist.org/packages/enqueue/fs) [![Latest Stable Version](https://poser.pugx.org/enqueue/fs/version.png)](https://packagist.org/packages/enqueue/fs) diff --git a/pkg/gearman/.github/workflows/ci.yml b/pkg/gearman/.github/workflows/ci.yml new file mode 100644 index 000000000..eae3a9cfa --- /dev/null +++ b/pkg/gearman/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: gearman + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/gearman/.travis.yml b/pkg/gearman/.travis.yml deleted file mode 100644 index 7e96cb089..000000000 --- a/pkg/gearman/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - sudo apt-get update - - sudo apt-get install libgearman-dev -y --no-install-recommends --no-install-suggests - - export GEARMAN_PACKAGE=gearman-2.0.3 - - curl -L -O https://github.com/wcgallego/pecl-gearman/archive/$GEARMAN_PACKAGE.tar.gz - - tar zxvf $GEARMAN_PACKAGE.tar.gz - - pushd pecl-gearman-$GEARMAN_PACKAGE - - phpize - - ./configure - - make - - make install - - echo 'extension=gearman.so' > gearman.ini - - phpenv config-add gearman.ini - - popd - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/gearman/README.md b/pkg/gearman/README.md index 9c6efde8a..b1e8bbba2 100644 --- a/pkg/gearman/README.md +++ b/pkg/gearman/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Gearman Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/gearman.png?branch=master)](https://travis-ci.org/php-enqueue/gearman) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/gearman/CI)](https://github.com/php-enqueue/gearman/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/gearman/d/total.png)](https://packagist.org/packages/enqueue/gearman) [![Latest Stable Version](https://poser.pugx.org/enqueue/gearman/version.png)](https://packagist.org/packages/enqueue/gearman) diff --git a/pkg/gps/.github/workflows/ci.yml b/pkg/gps/.github/workflows/ci.yml new file mode 100644 index 000000000..f2accab5f --- /dev/null +++ b/pkg/gps/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/gps/.travis.yml b/pkg/gps/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/gps/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/gps/README.md b/pkg/gps/README.md index fc80363ae..fd63f234d 100644 --- a/pkg/gps/README.md +++ b/pkg/gps/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Google Pub/Sub Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/gps.png?branch=master)](https://travis-ci.org/php-enqueue/gps) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/gps/CI)](https://github.com/php-enqueue/gps/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/gps/d/total.png)](https://packagist.org/packages/enqueue/gps) [![Latest Stable Version](https://poser.pugx.org/enqueue/gps/version.png)](https://packagist.org/packages/enqueue/gps) diff --git a/pkg/job-queue/.github/workflows/ci.yml b/pkg/job-queue/.github/workflows/ci.yml new file mode 100644 index 000000000..ef204f16b --- /dev/null +++ b/pkg/job-queue/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-dist" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/job-queue/.travis.yml b/pkg/job-queue/.travis.yml deleted file mode 100644 index 623b55fe0..000000000 --- a/pkg/job-queue/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - travis_retry composer install --prefer-dist - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/job-queue/README.md b/pkg/job-queue/README.md index e02a724aa..4a9841b28 100644 --- a/pkg/job-queue/README.md +++ b/pkg/job-queue/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Job Queue. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/job-queue.png?branch=master)](https://travis-ci.org/php-enqueue/job-queue) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/job-queue/CI)](https://github.com/php-enqueue/job-queue/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/job-queue/d/total.png)](https://packagist.org/packages/enqueue/job-queue) [![Latest Stable Version](https://poser.pugx.org/enqueue/job-queue/version.png)](https://packagist.org/packages/enqueue/job-queue) diff --git a/pkg/mongodb/.github/workflows/ci.yml b/pkg/mongodb/.github/workflows/ci.yml new file mode 100644 index 000000000..abee78209 --- /dev/null +++ b/pkg/mongodb/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: mongodb + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/mongodb/.travis.yml b/pkg/mongodb/.travis.yml deleted file mode 100644 index 6415d29e8..000000000 --- a/pkg/mongodb/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -sudo: false - -language: php - -php: - - '7.1' - -git: - depth: 10 - -cache: - directories: - - $HOME/.composer/cache - -services: - - mongodb - -before_install: - - echo "extension = mongodb.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional - diff --git a/pkg/mongodb/README.md b/pkg/mongodb/README.md index c57f15fc7..91837470b 100644 --- a/pkg/mongodb/README.md +++ b/pkg/mongodb/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Mongodb Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/mongodb.png?branch=master)](https://travis-ci.org/php-enqueue/mongodb) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/mongodb/CI)](https://github.com/php-enqueue/mongodb/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/mongodb/d/total.png)](https://packagist.org/packages/enqueue/mongodb) [![Latest Stable Version](https://poser.pugx.org/enqueue/mongodb/version.png)](https://packagist.org/packages/enqueue/mongodb) diff --git a/pkg/monitoring/.github/workflows/ci.yml b/pkg/monitoring/.github/workflows/ci.yml new file mode 100644 index 000000000..1dabd6bc3 --- /dev/null +++ b/pkg/monitoring/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/monitoring/.travis.yml b/pkg/monitoring/.travis.yml deleted file mode 100644 index 02ba7238b..000000000 --- a/pkg/monitoring/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/monitoring/README.md b/pkg/monitoring/README.md index c14410cb9..a2fa75dfe 100644 --- a/pkg/monitoring/README.md +++ b/pkg/monitoring/README.md @@ -18,7 +18,7 @@ Queue Monitoring tool. Track sent, consumed messages. Consumers performances. * Provides integration for Enqueue [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/monitoring.png?branch=master)](https://travis-ci.org/php-enqueue/monitoring) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/monitoring/CI)](https://github.com/php-enqueue/monitoring/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/monitoring/d/total.png)](https://packagist.org/packages/enqueue/monitoring) [![Latest Stable Version](https://poser.pugx.org/enqueue/monitoring/version.png)](https://packagist.org/packages/enqueue/monitoring) diff --git a/pkg/null/.github/workflows/ci.yml b/pkg/null/.github/workflows/ci.yml new file mode 100644 index 000000000..f2accab5f --- /dev/null +++ b/pkg/null/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/null/.travis.yml b/pkg/null/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/null/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/null/README.md b/pkg/null/README.md index 46a57b650..c66b46952 100644 --- a/pkg/null/README.md +++ b/pkg/null/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Enqueue Null Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/null.png?branch=master)](https://travis-ci.org/php-enqueue/null) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/null/CI)](https://github.com/php-enqueue/null/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) diff --git a/pkg/pheanstalk/.github/workflows/ci.yml b/pkg/pheanstalk/.github/workflows/ci.yml new file mode 100644 index 000000000..f2accab5f --- /dev/null +++ b/pkg/pheanstalk/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/pheanstalk/.travis.yml b/pkg/pheanstalk/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/pheanstalk/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/pheanstalk/README.md b/pkg/pheanstalk/README.md index d7beebdf8..d318fc7c2 100644 --- a/pkg/pheanstalk/README.md +++ b/pkg/pheanstalk/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Beanstalk Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/pheanstalk.png?branch=master)](https://travis-ci.org/php-enqueue/pheanstalk) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/pheanstalk/CI)](https://github.com/php-enqueue/pheanstalk/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/pheanstalk/d/total.png)](https://packagist.org/packages/enqueue/pheanstalk) [![Latest Stable Version](https://poser.pugx.org/enqueue/pheanstalk/version.png)](https://packagist.org/packages/enqueue/pheanstalk) diff --git a/pkg/rdkafka/.github/workflows/ci.yml b/pkg/rdkafka/.github/workflows/ci.yml new file mode 100644 index 000000000..24af1bbc1 --- /dev/null +++ b/pkg/rdkafka/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - run: php Tests/fix_composer_json.php + + - uses: "ramsey/composer-install@v1" + + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/rdkafka/.travis.yml b/pkg/rdkafka/.travis.yml deleted file mode 100644 index 8210653a3..000000000 --- a/pkg/rdkafka/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - php Tests/fix_composer_json.php - - composer self-update - - composer install - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/rdkafka/README.md b/pkg/rdkafka/README.md index 1502f35c7..2a541eb63 100644 --- a/pkg/rdkafka/README.md +++ b/pkg/rdkafka/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # RdKafka Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/rdkafka.png?branch=master)](https://travis-ci.org/php-enqueue/rdkafka) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/rdkafka/CI)](https://github.com/php-enqueue/rdkafka/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/rdkafka/d/total.png)](https://packagist.org/packages/enqueue/rdkafka) [![Latest Stable Version](https://poser.pugx.org/enqueue/rdkafka/version.png)](https://packagist.org/packages/enqueue/rdkafka) diff --git a/pkg/redis/.github/workflows/ci.yml b/pkg/redis/.github/workflows/ci.yml new file mode 100644 index 000000000..d2311341a --- /dev/null +++ b/pkg/redis/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: redis + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/redis/.travis.yml b/pkg/redis/.travis.yml deleted file mode 100644 index 0b8b0d098..000000000 --- a/pkg/redis/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -before_install: - - echo "extension = redis.so" >> $HOME/.phpenv/versions/$(phpenv version-name)/etc/php.ini - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/redis/README.md b/pkg/redis/README.md index 0206e1e5b..f45bb79ba 100644 --- a/pkg/redis/README.md +++ b/pkg/redis/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Redis Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/redis.png?branch=master)](https://travis-ci.org/php-enqueue/redis) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/redis/CI)](https://github.com/php-enqueue/redis/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/redis/d/total.png)](https://packagist.org/packages/enqueue/redis) [![Latest Stable Version](https://poser.pugx.org/enqueue/redis/version.png)](https://packagist.org/packages/enqueue/redis) diff --git a/pkg/simple-client/.github/workflows/ci.yml b/pkg/simple-client/.github/workflows/ci.yml new file mode 100644 index 000000000..c9683ac90 --- /dev/null +++ b/pkg/simple-client/.github/workflows/ci.yml @@ -0,0 +1,31 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - run: php Tests/fix_composer_json.php + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/simple-client/.travis.yml b/pkg/simple-client/.travis.yml deleted file mode 100644 index ebe714611..000000000 --- a/pkg/simple-client/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - php Tests/fix_composer_json.php - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/simple-client/README.md b/pkg/simple-client/README.md index c9e0b4fa7..b3e5a3f0f 100644 --- a/pkg/simple-client/README.md +++ b/pkg/simple-client/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message Queue. Simple client [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/simple-client.png?branch=master)](https://travis-ci.org/php-enqueue/simple-client) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/simple-client/CI)](https://github.com/php-enqueue/simple-client/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/simple-client/d/total.png)](https://packagist.org/packages/enqueue/simple-client) [![Latest Stable Version](https://poser.pugx.org/enqueue/simple-client/version.png)](https://packagist.org/packages/enqueue/simple-client) diff --git a/pkg/sns/.github/workflows/ci.yml b/pkg/sns/.github/workflows/ci.yml new file mode 100644 index 000000000..f2accab5f --- /dev/null +++ b/pkg/sns/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/sns/.travis.yml b/pkg/sns/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/sns/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/sns/README.md b/pkg/sns/README.md index 62fa9986c..bfcfbce27 100644 --- a/pkg/sns/README.md +++ b/pkg/sns/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Amazon SNS Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/sns.png?branch=master)](https://travis-ci.org/php-enqueue/sns) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/sns/CI)](https://github.com/php-enqueue/sns/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns) [![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) diff --git a/pkg/snsqs/.github/workflows/ci.yml b/pkg/snsqs/.github/workflows/ci.yml new file mode 100644 index 000000000..f2accab5f --- /dev/null +++ b/pkg/snsqs/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/snsqs/.travis.yml b/pkg/snsqs/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/snsqs/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/snsqs/README.md b/pkg/snsqs/README.md index ec5151f01..15d6d979e 100644 --- a/pkg/snsqs/README.md +++ b/pkg/snsqs/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Amazon SNS-SQS Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/snsqs.png?branch=master)](https://travis-ci.org/php-enqueue/snsqs) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/snsqs/CI)](https://github.com/php-enqueue/snsqs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/snsqs/d/total.png)](https://packagist.org/packages/enqueue/snsqs) [![Latest Stable Version](https://poser.pugx.org/enqueue/snsqs/version.png)](https://packagist.org/packages/enqueue/snsqs) diff --git a/pkg/sqs/.github/workflows/ci.yml b/pkg/sqs/.github/workflows/ci.yml new file mode 100644 index 000000000..f2accab5f --- /dev/null +++ b/pkg/sqs/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/sqs/.travis.yml b/pkg/sqs/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/sqs/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/sqs/README.md b/pkg/sqs/README.md index bcc1e83ac..1d173345b 100644 --- a/pkg/sqs/README.md +++ b/pkg/sqs/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Amazon SQS Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/sqs.png?branch=master)](https://travis-ci.org/php-enqueue/sqs) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/sqs/CI)](https://github.com/php-enqueue/sqs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) diff --git a/pkg/stomp/.github/workflows/ci.yml b/pkg/stomp/.github/workflows/ci.yml new file mode 100644 index 000000000..f2accab5f --- /dev/null +++ b/pkg/stomp/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + with: + composer-options: "--prefer-source" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/stomp/.travis.yml b/pkg/stomp/.travis.yml deleted file mode 100644 index ae8b10d3d..000000000 --- a/pkg/stomp/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install --prefer-source - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/stomp/README.md b/pkg/stomp/README.md index 5fbe0d19d..758c7a43b 100644 --- a/pkg/stomp/README.md +++ b/pkg/stomp/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # STOMP Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/stomp.png?branch=master)](https://travis-ci.org/php-enqueue/stomp) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/stomp/CI)](https://github.com/php-enqueue/stomp/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/stomp/d/total.png)](https://packagist.org/packages/enqueue/stomp) [![Latest Stable Version](https://poser.pugx.org/enqueue/stomp/version.png)](https://packagist.org/packages/enqueue/stomp) diff --git a/pkg/wamp/.github/workflows/ci.yml b/pkg/wamp/.github/workflows/ci.yml new file mode 100644 index 000000000..1dabd6bc3 --- /dev/null +++ b/pkg/wamp/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI +on: + pull_request: + push: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4'] + + name: PHP ${{ matrix.php }} tests + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - uses: "ramsey/composer-install@v1" + + - run: vendor/bin/phpunit --exlude-group=functional diff --git a/pkg/wamp/.travis.yml b/pkg/wamp/.travis.yml deleted file mode 100644 index 02ba7238b..000000000 --- a/pkg/wamp/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false - -git: - depth: 10 - -language: php - -php: - - '7.1' - - '7.2' - - '7.3' - - '7.4' - -cache: - directories: - - $HOME/.composer/cache - -install: - - composer self-update - - composer install - -script: - - vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/wamp/README.md b/pkg/wamp/README.md index 67f5c9cef..04d0fdb5c 100644 --- a/pkg/wamp/README.md +++ b/pkg/wamp/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Web Application Messaging Protocol (WAMP) Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://travis-ci.org/php-enqueue/wamp.png?branch=master)](https://travis-ci.org/php-enqueue/wamp) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/wamp/CI)](https://github.com/php-enqueue/wamp/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/wamp/d/total.png)](https://packagist.org/packages/enqueue/wamp) [![Latest Stable Version](https://poser.pugx.org/enqueue/wamp/version.png)](https://packagist.org/packages/enqueue/wamp) From 2d2324599e6400b6927be300b64eb550356fb719 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 10:25:44 +0200 Subject: [PATCH 0881/1142] Trigger CI From 3f82f63f47cdf06d932b3cc7731613cf3183815b Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 10:23:06 +0200 Subject: [PATCH 0882/1142] Add PHP 8 to the build matrix for unit tests This reverts commit d38fc1d2f58fbbec9721f12f910431c55b87d619. --- .github/workflows/ci.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ed066369b..309570124 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -120,6 +120,23 @@ jobs: functional_tests: false rdkafka_tests: true prepare_container: true + - php: 8.0 + symfony_version: 5.2.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false + - php: 8.0 + symfony_version: 5.2.* + unit_tests: false + functional_tests: true + rdkafka_tests: false + prepare_container: true + - php: 8.0 + symfony_version: 5.2.* + unit_tests: false + rdkafka_tests: true + prepare_container: true name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} From 518742c1e192439cf2ac58654d0bfd3537245145 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 10:26:59 +0200 Subject: [PATCH 0883/1142] Allow php8 in all composer.json files --- composer.json | 2 +- pkg/amqp-bunny/composer.json | 2 +- pkg/amqp-ext/composer.json | 2 +- pkg/amqp-lib/composer.json | 2 +- pkg/amqp-tools/composer.json | 2 +- pkg/async-event-dispatcher/composer.json | 2 +- pkg/dbal/composer.json | 2 +- pkg/enqueue-bundle/composer.json | 2 +- pkg/enqueue/composer.json | 2 +- pkg/fs/composer.json | 2 +- pkg/gearman/composer.json | 2 +- pkg/gps/composer.json | 2 +- pkg/job-queue/composer.json | 2 +- pkg/mongodb/composer.json | 2 +- pkg/monitoring/composer.json | 2 +- pkg/null/composer.json | 2 +- pkg/pheanstalk/composer.json | 2 +- pkg/rdkafka/composer.json | 2 +- pkg/redis/composer.json | 2 +- pkg/simple-client/composer.json | 2 +- pkg/sns/composer.json | 2 +- pkg/snsqs/composer.json | 2 +- pkg/sqs/composer.json | 2 +- pkg/stomp/composer.json | 2 +- pkg/wamp/composer.json | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/composer.json b/composer.json index b1ba9ff8b..4348077a4 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "phpstan": "bin/phpstan analyse --memory-limit=512M -c phpstan.neon" }, "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "ext-amqp": "^1.9.3", "ext-gearman": "^2.0", diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 01d6a8c4a..9e7d83bb4 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "bunny/bunny": "^0.4", diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 203908160..18b1f72cb 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "ext-amqp": "^1.9.3", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 2d9d2515f..71867a911 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "php-amqplib/php-amqplib": "^2.10", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index 52c582954..cdb2321fd 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10" diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index d4a72125b..d5adc5f7b 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", "symfony/event-dispatcher": "^4.3|^5" diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index dfeba65f3..bb60783ea 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.6", "ramsey/uuid": "^3|^4" diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 43a73fa34..4773dcbed 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "symfony/framework-bundle": "^4.3|^5", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index e8c3f3ade..3c525f510 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "enqueue/null": "^0.10", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 40cfe59c3..e2b8119f1 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "symfony/filesystem": "^4.3|^5", diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index 92dd3bc09..b88fa542e 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "ext-gearman": "^2.0", "queue-interop/queue-interop": "^0.8" }, diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 116a5dbf8..1d2ed5fd3 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "google/cloud-pubsub": "^1.0", "enqueue/dsn": "^0.10" diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index cbe720e28..d8903f99e 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index d84c6e68f..a894816f7 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -10,7 +10,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "mongodb/mongodb": "^1.2", "ext-mongodb": "^1.5" diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index 92d31ec96..9942ec910 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "enqueue/dsn": "^0.10" }, diff --git a/pkg/null/composer.json b/pkg/null/composer.json index 5c43f40bc..bd00fb0b0 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8" }, "require-dev": { diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index 40a32fb3c..0274089a5 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "pda/pheanstalk": "^3", "queue-interop/queue-interop": "^0.8" }, diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 8db8e9cc3..7128a525f 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "ext-rdkafka": "^3.0.3|^4.0|^5.0", "queue-interop/queue-interop": "^0.8" }, diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index ace7230e5..2bd867650 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "ramsey/uuid": "^3|^4" diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index e06d880af..6b277c6ad 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index cde4dab79..25fd1a345 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "~3.26" diff --git a/pkg/snsqs/composer.json b/pkg/snsqs/composer.json index ddf8d80cf..ec52b67bc 100644 --- a/pkg/snsqs/composer.json +++ b/pkg/snsqs/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "enqueue/sns": "^0.10", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index 1ca52ab41..96dc89252 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "~3.26" diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 0509d34b0..0236070b1 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "enqueue/dsn": "^0.10", "stomp-php/stomp-php": "^4", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index f868b00eb..1ad6b5110 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3", + "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "thruway/client": "^0.5.0", From f63631bc4ff2dd67aa757f8069189d1a10997b0b Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 10:30:57 +0200 Subject: [PATCH 0884/1142] Update doctrine/dbal to 2.12 --- composer.json | 2 +- pkg/dbal/composer.json | 2 +- pkg/job-queue/composer.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 4348077a4..ed2d9fe6f 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "queue-interop/queue-interop": "^0.7|^0.8", "bunny/bunny": "^0.2.4|^0.3|^0.4", "php-amqplib/php-amqplib": "^2.7", - "doctrine/dbal": "^2.6,<2.10", + "doctrine/dbal": "^2.12", "ramsey/uuid": "^2|^3.5|^4.0", "psr/log": "^1", "psr/container": "^1", diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index bb60783ea..fc9c4a595 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", - "doctrine/dbal": "^2.6", + "doctrine/dbal": "^2.12", "ramsey/uuid": "^3|^4" }, "require-dev": { diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index d8903f99e..980e57619 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -11,7 +11,7 @@ "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", "doctrine/orm": "~2.4", - "doctrine/dbal": "<2.10" + "doctrine/dbal": "^2.12" }, "require-dev": { "phpunit/phpunit": "^9.5", From c464121b70b2cff71343fb076ee1013bb8a4f735 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 10:34:21 +0200 Subject: [PATCH 0885/1142] Update php-http/client-common to 2.2.1 --- composer.json | 2 +- pkg/stomp/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index ed2d9fe6f..f11d28a7b 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "aws/aws-sdk-php": "^3.26", "stomp-php/stomp-php": "^4", "php-http/guzzle6-adapter": "^1.1", - "php-http/client-common": "^1.7@dev", + "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "^2.0", "predis/predis": "^1.1", "thruway/client": "^0.5.0", diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 0236070b1..3cc47fbb2 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -11,7 +11,7 @@ "stomp-php/stomp-php": "^4", "queue-interop/queue-interop": "^0.8", "php-http/guzzle6-adapter": "^1.1", - "php-http/client-common": "^1.7@dev", + "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "^2.0" }, "require-dev": { From aafad21dbd41eac104d37db4d924606206a3c3ac Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 10:57:11 +0200 Subject: [PATCH 0886/1142] Try a fork of richardfullmer/rabbitmq-management-api --- composer.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f11d28a7b..1331e0deb 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,12 @@ "cs-lint": "bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff", "phpstan": "bin/phpstan analyse --memory-limit=512M -c phpstan.neon" }, + "repositories": [ + { + "type": "git", + "url": "https://github.com/andrewmy/rabbitmq-management-api.git" + } + ], "require": { "php": "^7.3|^8.0", @@ -33,7 +39,7 @@ "stomp-php/stomp-php": "^4", "php-http/guzzle6-adapter": "^1.1", "php-http/client-common": "^2.2.1", - "richardfullmer/rabbitmq-management-api": "^2.0", + "richardfullmer/rabbitmq-management-api": "dev-http-client-2 as 2.1.0", "predis/predis": "^1.1", "thruway/client": "^0.5.0", "thruway/pawl-transport": "^0.5.0", From d1cec9457f78313bf78e8f9652c8e5e6395701a9 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 10:59:33 +0200 Subject: [PATCH 0887/1142] Derp --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1331e0deb..f40334da2 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "repositories": [ { "type": "git", - "url": "https://github.com/andrewmy/rabbitmq-management-api.git" + "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" } ], "require": { From 46501f627d4e5c3c51c2fd33e081066bfd44bc82 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 11:03:19 +0200 Subject: [PATCH 0888/1142] Replace guzzle6 with 7 --- composer.json | 2 +- pkg/stomp/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index f40334da2..e1c43af85 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "pda/pheanstalk": "^3", "aws/aws-sdk-php": "^3.26", "stomp-php/stomp-php": "^4", - "php-http/guzzle6-adapter": "^1.1", + "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "dev-http-client-2 as 2.1.0", "predis/predis": "^1.1", diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 3cc47fbb2..614ac2601 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -10,7 +10,7 @@ "enqueue/dsn": "^0.10", "stomp-php/stomp-php": "^4", "queue-interop/queue-interop": "^0.8", - "php-http/guzzle6-adapter": "^1.1", + "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "^2.0" }, From dd3ffe034e79ed126c434ec536d124e7b458573f Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 11:20:58 +0200 Subject: [PATCH 0889/1142] Remove referencing non-existent property --- pkg/job-queue/Test/DbalPersistedConnection.php | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/pkg/job-queue/Test/DbalPersistedConnection.php b/pkg/job-queue/Test/DbalPersistedConnection.php index 51160c03b..add0f3ddc 100644 --- a/pkg/job-queue/Test/DbalPersistedConnection.php +++ b/pkg/job-queue/Test/DbalPersistedConnection.php @@ -33,7 +33,6 @@ public function connect() if ($this->hasPersistedConnection()) { $this->_conn = $this->getPersistedConnection(); - $this->setConnected(true); } else { parent::connect(); $this->persistConnection($this->_conn); @@ -66,22 +65,6 @@ public function rollBack() $this->wrapTransactionNestingLevel('rollBack'); } - /** - * @param bool $connected - */ - protected function setConnected($connected) - { - $rc = new \ReflectionClass(Connection::class); - $rp = $rc->hasProperty('isConnected') ? - $rc->getProperty('isConnected') : - $rc->getProperty('_isConnected') - ; - - $rp->setAccessible(true); - $rp->setValue($this, $connected); - $rp->setAccessible(false); - } - /** * @return int */ From fc9d4926f1969147941c820ca4544dbf68613993 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 11:33:54 +0200 Subject: [PATCH 0890/1142] Try a fork of doctrine/mongodb-odm-bundle --- composer.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e1c43af85..cf0ccf8e8 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,10 @@ { "type": "git", "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" + }, + { + "type": "git", + "url": "https://github.com/rimvislt/DoctrineMongoDBBundle.git" } ], "require": { @@ -64,7 +68,7 @@ "symfony/yaml": "^4.3|^5", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2|^2", - "doctrine/mongodb-odm-bundle": "^3.5|^4", + "doctrine/mongodb-odm-bundle": "4.3.x-dev as 4.3.0", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", "friendsofphp/php-cs-fixer": "^2", From 03c31d1eac5a097542012135ab211f339fbd4fff Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 11:36:57 +0200 Subject: [PATCH 0891/1142] Try allowing an older version of odm bundle too --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index cf0ccf8e8..bcf7bdc6f 100644 --- a/composer.json +++ b/composer.json @@ -68,7 +68,7 @@ "symfony/yaml": "^4.3|^5", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2|^2", - "doctrine/mongodb-odm-bundle": "4.3.x-dev as 4.3.0", + "doctrine/mongodb-odm-bundle": "^3.5|4.3.x-dev as 4.3.0", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", "friendsofphp/php-cs-fixer": "^2", From 7c805fd9ffbbbd09c29fcc433b0f852934c8a006 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 11:39:39 +0200 Subject: [PATCH 0892/1142] Nope --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index bcf7bdc6f..cf0ccf8e8 100644 --- a/composer.json +++ b/composer.json @@ -68,7 +68,7 @@ "symfony/yaml": "^4.3|^5", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2|^2", - "doctrine/mongodb-odm-bundle": "^3.5|4.3.x-dev as 4.3.0", + "doctrine/mongodb-odm-bundle": "4.3.x-dev as 4.3.0", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", "friendsofphp/php-cs-fixer": "^2", From b23e7330ebf027bffda24ad844bda4f4a62d4260 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 11:43:51 +0200 Subject: [PATCH 0893/1142] Run stan and cs-fixer with sf 5.2; add php 7.4 + sf 5.2 unit test job --- .github/workflows/ci.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 309570124..cce40d8fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,10 +23,9 @@ jobs: extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M - - run: php ./bin/fix-symfony-version.php "4.3.*" + - run: php ./bin/fix-symfony-version.php "5.2.*" - uses: "ramsey/composer-install@v1" - - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${{ env.GIT_DIFF_FILTERED }} @@ -50,10 +49,9 @@ jobs: extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M - - run: php ./bin/fix-symfony-version.php "4.3.*" + - run: php ./bin/fix-symfony-version.php "5.2.*" - uses: "ramsey/composer-install@v1" - - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} @@ -102,6 +100,12 @@ jobs: functional_tests: false rdkafka_tests: false prepare_container: false + - php: 7.4 + symfony_version: 5.2.* + unit_tests: true + functional_tests: false + rdkafka_tests: false + prepare_container: false - php: 7.3 # same as in the container symfony_version: 4.3.* unit_tests: false From 928f0e8a3488d854dc4855bc5ec837f1ae9e8b89 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 11:53:46 +0200 Subject: [PATCH 0894/1142] Fix exception message variations between versions --- .../Tests/Unit/DependencyInjection/ConfigurationTest.php | 6 +++++- .../Tests/Symfony/ContainerProcessorRegistryTest.php | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index d641227ef..c9356f1ec 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -113,7 +113,11 @@ public function testThrowIfClientDriverOptionsIsNotArray() $processor = new Processor(); $this->expectException(InvalidTypeException::class); - $this->expectExceptionMessage('Invalid type for path "enqueue.default.client.driver_options". Expected array, but got string'); + // Exception messages vary slightly between versions + $this->expectExceptionMessageMatches( + '/Invalid type for path "enqueue\.default\.client\.driver_options"\. Expected "?array"?, but got "?string"?/' + ); + $processor->processConfiguration($configuration, [[ 'default' => [ 'transport' => 'null:', diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index bf6e3cd01..d1c4186c5 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -69,7 +69,11 @@ public function testThrowErrorIfServiceDoesNotImplementProcessorReturnType() $registry = new ContainerProcessorRegistry($containerMock); $this->expectException(\TypeError::class); - $this->expectExceptionMessage('Return value of Enqueue\Symfony\ContainerProcessorRegistry::get() must implement interface Interop\Queue\Processor, instance of stdClass returned'); + // Exception messages vary slightly between versions + $this->expectExceptionMessageMatches( + '/Return value of Enqueue\\Symfony\\ContainerProcessorRegistry::get\(\) .+ Interop\\Queue\\Processor, .?stdClass returned/' + ); + $registry->get('processor-name'); } From 163a6f05698d6992aa061269e81cd80e32a75f3b Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 11:55:58 +0200 Subject: [PATCH 0895/1142] Derp --- pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index d1c4186c5..9b90d3390 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -71,7 +71,7 @@ public function testThrowErrorIfServiceDoesNotImplementProcessorReturnType() $this->expectException(\TypeError::class); // Exception messages vary slightly between versions $this->expectExceptionMessageMatches( - '/Return value of Enqueue\\Symfony\\ContainerProcessorRegistry::get\(\) .+ Interop\\Queue\\Processor, .?stdClass returned/' + '/Return value of Enqueue\\Symfony\\ContainerProcessorRegistry::get\(\) .+ Interop\\Queue\\Processor, .*stdClass returned/' ); $registry->get('processor-name'); From 5ac76b29206a541effff8866a90bceaabc6ceb4d Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 12:02:46 +0200 Subject: [PATCH 0896/1142] Derp --- pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index 9b90d3390..2169e271f 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -71,7 +71,7 @@ public function testThrowErrorIfServiceDoesNotImplementProcessorReturnType() $this->expectException(\TypeError::class); // Exception messages vary slightly between versions $this->expectExceptionMessageMatches( - '/Return value of Enqueue\\Symfony\\ContainerProcessorRegistry::get\(\) .+ Interop\\Queue\\Processor, .*stdClass returned/' + '/Enqueue\\Symfony\\ContainerProcessorRegistry::get\(\) .+ Interop\\Queue\\Processor, .*stdClass returned/' ); $registry->get('processor-name'); From 35a84edddb01c4d02faa8fff08497e4b833f9738 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 12:09:46 +0200 Subject: [PATCH 0897/1142] =?UTF-8?q?=F0=9F=A4=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index 2169e271f..bf7957178 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -71,7 +71,7 @@ public function testThrowErrorIfServiceDoesNotImplementProcessorReturnType() $this->expectException(\TypeError::class); // Exception messages vary slightly between versions $this->expectExceptionMessageMatches( - '/Enqueue\\Symfony\\ContainerProcessorRegistry::get\(\) .+ Interop\\Queue\\Processor, .*stdClass returned/' + '/Enqueue\\Symfony\\ContainerProcessorRegistry\:\:get\(\).+ Interop\\Queue\\Processor, .*stdClass returned/' ); $registry->get('processor-name'); From ab8f784134cd10970b178bb012c7a44c1a746357 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 12:14:59 +0200 Subject: [PATCH 0898/1142] Ok got the regex --- pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index bf7957178..e0dcf2e09 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -71,7 +71,7 @@ public function testThrowErrorIfServiceDoesNotImplementProcessorReturnType() $this->expectException(\TypeError::class); // Exception messages vary slightly between versions $this->expectExceptionMessageMatches( - '/Enqueue\\Symfony\\ContainerProcessorRegistry\:\:get\(\).+ Interop\\Queue\\Processor, .*stdClass returned/' + '/Enqueue\\\\Symfony\\\\ContainerProcessorRegistry::get\(\).+ Interop\\\\Queue\\\\Processor,.*stdClass returned/' ); $registry->get('processor-name'); From c73d4756bb892271b0cf05631ee063bff23c31d5 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 13:51:12 +0200 Subject: [PATCH 0899/1142] Try building php 8 container --- .github/workflows/ci.yml | 2 ++ docker-compose.yml | 7 ++++++- docker/Dockerfile | 15 +++++++++------ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cce40d8fc..cda54921d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -161,6 +161,8 @@ jobs: - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: bin/dev -b + env: + PHP_VERSION: ${{ matrix.php }} if: matrix.prepare_container - run: bin/phpunit --exclude-group=functional diff --git a/docker-compose.yml b/docker-compose.yml index f782de48e..40714364a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,12 @@ version: '2' services: dev: - image: enqueue/dev:latest + # when image publishing gets sorted: + # image: enqueue/dev:${PHP_VERSION} + build: + context: docker + args: + - PHP_VERSION=${PHP_VERSION:7.3} depends_on: - rabbitmq - mysql diff --git a/docker/Dockerfile b/docker/Dockerfile index 86f460f8e..831dd0cd2 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,24 +1,27 @@ -FROM formapro/nginx-php-fpm:7.3-latest-all-exts +ARG PHP_VERSION=7.3 +FROM formapro/nginx-php-fpm:${PHP_VERSION}-latest-all-exts + +ARG PHP_VERSION ## libs RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php7.3-dev php7.3-redis php7.3-pgsql git python php-amqp + apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php-dev php${PHP_VERSION}-redis php${PHP_VERSION}-pgsql git python php-amqp ## librdkafka RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php7.3-dev make && \ + apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php${PHP_VERSION}-dev make && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ git checkout v1.0.0 && \ ./configure && make && make install && \ pecl install rdkafka && \ - echo "extension=rdkafka.so" > /etc/php/7.3/cli/conf.d/10-rdkafka.ini && \ - echo "extension=rdkafka.so" > /etc/php/7.3/fpm/conf.d/10-rdkafka.ini + echo "extension=rdkafka.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-rdkafka.ini && \ + echo "extension=rdkafka.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-rdkafka.ini -COPY ./php/cli.ini /etc/php/7.3/cli/conf.d/1-dev_cli.ini +COPY ./php/cli.ini /etc/php/${PHP_VERSION}/cli/conf.d/1-dev_cli.ini COPY ./bin/dev_entrypoiny.sh /usr/local/bin/entrypoint.sh RUN chmod u+x /usr/local/bin/entrypoint.sh From 86411e437c2eee36fafd199aa7595efe0cb34b98 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 13:57:16 +0200 Subject: [PATCH 0900/1142] Fix the default version parameter --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 40714364a..2bf4d96c7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: build: context: docker args: - - PHP_VERSION=${PHP_VERSION:7.3} + PHP_VERSION: ${PHP_VERSION:-7.3} depends_on: - rabbitmq - mysql From 2de3638d131771853ba7953f91fb1d6141318f73 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 14:05:30 +0200 Subject: [PATCH 0901/1142] Pull silently --- bin/dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/dev b/bin/dev index e5f40ffbd..a50b7ad66 100755 --- a/bin/dev +++ b/bin/dev @@ -6,7 +6,7 @@ set -e while getopts "bustefdp" OPTION; do case $OPTION in b) - docker-compose pull && docker-compose build + docker-compose pull -q && docker-compose build ;; u) docker-compose up From c90b6b896b5876b4f5e689654c3d8b53d2b23cd3 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 14:20:04 +0200 Subject: [PATCH 0902/1142] Stringify the php version arg --- .github/workflows/ci.yml | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cda54921d..68e29dd95 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -162,7 +162,7 @@ jobs: - run: bin/dev -b env: - PHP_VERSION: ${{ matrix.php }} + PHP_VERSION: "${{ matrix.php }}" if: matrix.prepare_container - run: bin/phpunit --exclude-group=functional diff --git a/docker-compose.yml b/docker-compose.yml index 2bf4d96c7..ae4256c42 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: build: context: docker args: - PHP_VERSION: ${PHP_VERSION:-7.3} + PHP_VERSION: "${PHP_VERSION:-7.3}" depends_on: - rabbitmq - mysql From 44f28413f8138ba3c7df1b0062c1ebacac6660c8 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 14:54:56 +0200 Subject: [PATCH 0903/1142] Now it started installing 8 and 7 libs together --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 831dd0cd2..e7b4ac7d6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,12 +6,12 @@ ARG PHP_VERSION ## libs RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php-dev php${PHP_VERSION}-redis php${PHP_VERSION}-pgsql git python php-amqp + apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php${PHP_VERSION}-dev php${PHP_VERSION}-redis php${PHP_VERSION}-pgsql git python php${PHP_VERSION}-amqp ## librdkafka RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php${PHP_VERSION}-dev make && \ + apt-get install -y --no-install-recommends --no-install-suggests g++ php${PHP_VERSION}-pear php${PHP_VERSION}-dev make && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ From 06df4e0e551b120e1dc28f8b2349e81e80145250 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 15:01:52 +0200 Subject: [PATCH 0904/1142] Pear is not versioned --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e7b4ac7d6..17b7cce0e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,7 +11,7 @@ RUN set -x && \ ## librdkafka RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests g++ php${PHP_VERSION}-pear php${PHP_VERSION}-dev make && \ + apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php${PHP_VERSION}-dev make && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ From 8049c47749dbfa8b7ffefe85b07e07fd24eb8e64 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 15:34:24 +0200 Subject: [PATCH 0905/1142] Update the docker hub namespace --- docker/Dockerfile | 2 +- docker/thruway/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 17b7cce0e..2d7f72402 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ ARG PHP_VERSION=7.3 -FROM formapro/nginx-php-fpm:${PHP_VERSION}-latest-all-exts +FROM makasim/nginx-php-fpm:${PHP_VERSION}-latest-all-exts ARG PHP_VERSION diff --git a/docker/thruway/Dockerfile b/docker/thruway/Dockerfile index c9e795478..3bca735b2 100644 --- a/docker/thruway/Dockerfile +++ b/docker/thruway/Dockerfile @@ -1,4 +1,4 @@ -FROM formapro/nginx-php-fpm:latest-all-exts +FROM makasim/nginx-php-fpm:latest-all-exts RUN mkdir -p /thruway WORKDIR /thruway From 19427650f71c88a5acbfd78a10d0aa1119efde27 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 15:44:04 +0200 Subject: [PATCH 0906/1142] Stringify the php version arg --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68e29dd95..306172b5e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -124,19 +124,19 @@ jobs: functional_tests: false rdkafka_tests: true prepare_container: true - - php: 8.0 + - php: "8.0" symfony_version: 5.2.* unit_tests: true functional_tests: false rdkafka_tests: false prepare_container: false - - php: 8.0 + - php: "8.0" symfony_version: 5.2.* unit_tests: false functional_tests: true rdkafka_tests: false prepare_container: true - - php: 8.0 + - php: "8.0" symfony_version: 5.2.* unit_tests: false rdkafka_tests: true From 4423c45237c79ded983ea82d20b4273f79074268 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 25 Jan 2021 22:02:59 +0200 Subject: [PATCH 0907/1142] CI: better composer install step --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 306172b5e..9e9887e2b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,6 +26,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "5.2.*" - uses: "ramsey/composer-install@v1" + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${{ env.GIT_DIFF_FILTERED }} @@ -52,6 +53,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "5.2.*" - uses: "ramsey/composer-install@v1" + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} From 023ff010c5e5bd2b483a51dd707982f8951fa5e2 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 26 Jan 2021 22:01:50 +0200 Subject: [PATCH 0908/1142] Try a fork of stomp-php/stomp-php --- composer.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index cf0ccf8e8..e6f73adc8 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,10 @@ { "type": "git", "url": "https://github.com/rimvislt/DoctrineMongoDBBundle.git" + }, + { + "type": "git", + "url": "https://github.com/andrewmy/stomp-php.git" } ], "require": { @@ -40,7 +44,7 @@ "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3", "aws/aws-sdk-php": "^3.26", - "stomp-php/stomp-php": "^4", + "stomp-php/stomp-php": "dev-php-8-travis as 4.6.1", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "dev-http-client-2 as 2.1.0", From e0f1c2ffcaadfb326878a0dcc5a9b9625e770cb7 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 26 Jan 2021 22:36:29 +0200 Subject: [PATCH 0909/1142] Fix ext-gearman install --- docker/Dockerfile | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 2d7f72402..ab0cc62f7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,8 +5,26 @@ ARG PHP_VERSION ## libs RUN set -x && \ + pecl channel-update pecl.php.net && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests wget curl openssl ca-certificates nano netcat php${PHP_VERSION}-dev php${PHP_VERSION}-redis php${PHP_VERSION}-pgsql git python php${PHP_VERSION}-amqp + apt-get install -y --no-install-recommends --no-install-suggests \ + wget \ + curl \ + openssl \ + ca-certificates \ + nano \ + netcat \ + php${PHP_VERSION}-dev \ + php${PHP_VERSION}-redis \ + php${PHP_VERSION}-pgsql \ + git \ + python \ + php${PHP_VERSION}-amqp \ + libgearman-dev \ + && \ + pecl install gearman && \ + echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini && \ + echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-gearman.ini ## librdkafka RUN set -x && \ From a1eb22f50231daf486556180856554aeea9c7cf4 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 26 Jan 2021 22:45:06 +0200 Subject: [PATCH 0910/1142] Derp --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index ab0cc62f7..93aa22654 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,7 +5,6 @@ ARG PHP_VERSION ## libs RUN set -x && \ - pecl channel-update pecl.php.net && \ apt-get update && \ apt-get install -y --no-install-recommends --no-install-suggests \ wget \ @@ -22,6 +21,7 @@ RUN set -x && \ php${PHP_VERSION}-amqp \ libgearman-dev \ && \ + pecl channel-update pecl.php.net && \ pecl install gearman && \ echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini && \ echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-gearman.ini From 36ed6ac0ac0513e69ef3e8e252a4a74bf473a37c Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 26 Jan 2021 22:56:20 +0200 Subject: [PATCH 0911/1142] Move pear around --- docker/Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 93aa22654..204ea3c41 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -20,6 +20,7 @@ RUN set -x && \ python \ php${PHP_VERSION}-amqp \ libgearman-dev \ + php-pear \ && \ pecl channel-update pecl.php.net && \ pecl install gearman && \ @@ -29,7 +30,10 @@ RUN set -x && \ ## librdkafka RUN set -x && \ apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests g++ php-pear php${PHP_VERSION}-dev make && \ + apt-get install -y --no-install-recommends --no-install-suggests \ + g++ \ + make \ + && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ From a08df5ca634d70d769215c258d23bac02cd3ae76 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 26 Jan 2021 23:08:46 +0200 Subject: [PATCH 0912/1142] Move make around --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 204ea3c41..914c16255 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -21,6 +21,7 @@ RUN set -x && \ php${PHP_VERSION}-amqp \ libgearman-dev \ php-pear \ + make \ && \ pecl channel-update pecl.php.net && \ pecl install gearman && \ @@ -32,7 +33,6 @@ RUN set -x && \ apt-get update && \ apt-get install -y --no-install-recommends --no-install-suggests \ g++ \ - make \ && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ From a26cdf5118930af4c2f388f1e4a760ac2c0f1110 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 2 Feb 2021 02:14:06 +0200 Subject: [PATCH 0913/1142] =?UTF-8?q?doctrine/mongodb-odm-bundle=204.3=20r?= =?UTF-8?q?eleased=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/composer.json b/composer.json index e6f73adc8..2c8a28c50 100644 --- a/composer.json +++ b/composer.json @@ -13,10 +13,6 @@ "type": "git", "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" }, - { - "type": "git", - "url": "https://github.com/rimvislt/DoctrineMongoDBBundle.git" - }, { "type": "git", "url": "https://github.com/andrewmy/stomp-php.git" @@ -72,7 +68,7 @@ "symfony/yaml": "^4.3|^5", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2|^2", - "doctrine/mongodb-odm-bundle": "4.3.x-dev as 4.3.0", + "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", "friendsofphp/php-cs-fixer": "^2", From 54fee9ef14e193b0cd4edcab7067f472ca09d2a5 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 4 Feb 2021 00:55:55 +0200 Subject: [PATCH 0914/1142] =?UTF-8?q?stomp-php/stomp-php=205.0=20released?= =?UTF-8?q?=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 2c8a28c50..27b9a0d11 100644 --- a/composer.json +++ b/composer.json @@ -12,10 +12,6 @@ { "type": "git", "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" - }, - { - "type": "git", - "url": "https://github.com/andrewmy/stomp-php.git" } ], "require": { @@ -40,7 +36,7 @@ "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3", "aws/aws-sdk-php": "^3.26", - "stomp-php/stomp-php": "dev-php-8-travis as 4.6.1", + "stomp-php/stomp-php": "^4|^5", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "dev-http-client-2 as 2.1.0", From 86684ff69d2baaa16692111416038c9097e3b2ac Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 10:01:50 +0200 Subject: [PATCH 0915/1142] Use the proper tagged base docker image --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 914c16255..b28e7078b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ ARG PHP_VERSION=7.3 -FROM makasim/nginx-php-fpm:${PHP_VERSION}-latest-all-exts +FROM makasim/nginx-php-fpm:${PHP_VERSION}-all-exts ARG PHP_VERSION From 073bcbad97ba9ee893ebdf0e327cbe105768445e Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 10:17:16 +0200 Subject: [PATCH 0916/1142] XML extension not found? --- docker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index b28e7078b..5ff2b6318 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -19,6 +19,7 @@ RUN set -x && \ git \ python \ php${PHP_VERSION}-amqp \ + php${PHP_VERSION}-xml \ libgearman-dev \ php-pear \ make \ From a98f7e75830b19d6b9c91abe4162f2e5e78d5007 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 10:48:03 +0200 Subject: [PATCH 0917/1142] =?UTF-8?q?MySQL=20driver=20not=20found=20?= =?UTF-8?q?=F0=9F=A4=A6=E2=80=8D=E2=99=82=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 5ff2b6318..f57663225 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -20,6 +20,7 @@ RUN set -x && \ python \ php${PHP_VERSION}-amqp \ php${PHP_VERSION}-xml \ + php${PHP_VERSION}-mysql \ libgearman-dev \ php-pear \ make \ From 4f8e1ca4b70558c0a5a984c6e5bfcba640321b83 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 11:00:28 +0200 Subject: [PATCH 0918/1142] Gearman already installed --- docker/Dockerfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index f57663225..da1a9fc30 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -25,10 +25,7 @@ RUN set -x && \ php-pear \ make \ && \ - pecl channel-update pecl.php.net && \ - pecl install gearman && \ - echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini && \ - echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-gearman.ini + pecl channel-update pecl.php.net ## librdkafka RUN set -x && \ From ddf1146362cdf9d94cc908334d435b18220e4584 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 11:13:42 +0200 Subject: [PATCH 0919/1142] Revert "Gearman already installed" This reverts commit 33208dae92850d6d50c61aab6ea554e6d5e9580b. --- docker/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index da1a9fc30..f57663225 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -25,7 +25,10 @@ RUN set -x && \ php-pear \ make \ && \ - pecl channel-update pecl.php.net + pecl channel-update pecl.php.net && \ + pecl install gearman && \ + echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini && \ + echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-gearman.ini ## librdkafka RUN set -x && \ From 480eef5f132ab4c47d75f82d37982c2188df5a72 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 11:36:52 +0200 Subject: [PATCH 0920/1142] Fix gearman? --- docker/Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index f57663225..c9d7599c7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -26,9 +26,7 @@ RUN set -x && \ make \ && \ pecl channel-update pecl.php.net && \ - pecl install gearman && \ - echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini && \ - echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-gearman.ini + pecl install gearman ## librdkafka RUN set -x && \ From f67ec8aa21b4e32bb098d540667289aa372bbf22 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 12:37:00 +0200 Subject: [PATCH 0921/1142] Fix curl, conditionally install gearman --- docker/Dockerfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index c9d7599c7..84933dea6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -21,12 +21,18 @@ RUN set -x && \ php${PHP_VERSION}-amqp \ php${PHP_VERSION}-xml \ php${PHP_VERSION}-mysql \ + php${PHP_VERSION}-curl \ libgearman-dev \ php-pear \ make \ && \ pecl channel-update pecl.php.net && \ - pecl install gearman + pecl install gearman && \ + if [ ! -f /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini ]; then \ + echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini && \ + echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-gearman.ini \ + ; \ + fi; ## librdkafka RUN set -x && \ From 684cc26773c5efa254c97d679562aa039629f56e Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 12:53:01 +0200 Subject: [PATCH 0922/1142] Fix 7.3 gearman --- docker/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 84933dea6..2b21de82b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -28,9 +28,9 @@ RUN set -x && \ && \ pecl channel-update pecl.php.net && \ pecl install gearman && \ - if [ ! -f /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini ]; then \ - echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-gearman.ini && \ - echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-gearman.ini \ + if [ ! -f /etc/php/${PHP_VERSION}/cli/conf.d/20-gearman.ini ]; then \ + echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/20-gearman.ini && \ + echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/20-gearman.ini \ ; \ fi; From 0257a50d0ff5c28837d0f85b5671506e7fc0bf7a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 9 Feb 2021 14:01:28 +0200 Subject: [PATCH 0923/1142] Add php 8 to packages' build matrices; normalize composer reqs --- pkg/amqp-bunny/.github/workflows/ci.yml | 2 +- pkg/amqp-ext/.github/workflows/ci.yml | 2 +- pkg/amqp-lib/.github/workflows/ci.yml | 2 +- pkg/amqp-tools/.github/workflows/ci.yml | 2 +- pkg/async-command/.github/workflows/ci.yml | 2 +- pkg/async-command/composer.json | 2 +- pkg/async-event-dispatcher/.github/workflows/ci.yml | 2 +- pkg/dbal/.github/workflows/ci.yml | 2 +- pkg/dsn/.github/workflows/ci.yml | 2 +- pkg/dsn/composer.json | 4 ++-- pkg/enqueue-bundle/.github/workflows/ci.yml | 2 +- pkg/enqueue-bundle/composer.json | 2 +- pkg/enqueue/.github/workflows/ci.yml | 2 +- pkg/fs/.github/workflows/ci.yml | 2 +- pkg/gearman/.github/workflows/ci.yml | 2 +- pkg/gps/.github/workflows/ci.yml | 2 +- pkg/job-queue/.github/workflows/ci.yml | 2 +- pkg/mongodb/.github/workflows/ci.yml | 2 +- pkg/monitoring/.github/workflows/ci.yml | 2 +- pkg/null/.github/workflows/ci.yml | 2 +- pkg/pheanstalk/.github/workflows/ci.yml | 2 +- pkg/rdkafka/.github/workflows/ci.yml | 2 +- pkg/redis/.github/workflows/ci.yml | 2 +- pkg/simple-client/.github/workflows/ci.yml | 2 +- pkg/sns/.github/workflows/ci.yml | 2 +- pkg/snsqs/.github/workflows/ci.yml | 2 +- pkg/sqs/.github/workflows/ci.yml | 2 +- pkg/stomp/.github/workflows/ci.yml | 2 +- pkg/stomp/composer.json | 2 +- pkg/wamp/.github/workflows/ci.yml | 2 +- 30 files changed, 31 insertions(+), 31 deletions(-) diff --git a/pkg/amqp-bunny/.github/workflows/ci.yml b/pkg/amqp-bunny/.github/workflows/ci.yml index bd62476f1..67837ef97 100644 --- a/pkg/amqp-bunny/.github/workflows/ci.yml +++ b/pkg/amqp-bunny/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/amqp-ext/.github/workflows/ci.yml b/pkg/amqp-ext/.github/workflows/ci.yml index 24af1bbc1..fd96b2abe 100644 --- a/pkg/amqp-ext/.github/workflows/ci.yml +++ b/pkg/amqp-ext/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/amqp-lib/.github/workflows/ci.yml b/pkg/amqp-lib/.github/workflows/ci.yml index e60e63b9b..a168dca05 100644 --- a/pkg/amqp-lib/.github/workflows/ci.yml +++ b/pkg/amqp-lib/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/amqp-tools/.github/workflows/ci.yml b/pkg/amqp-tools/.github/workflows/ci.yml index bd62476f1..67837ef97 100644 --- a/pkg/amqp-tools/.github/workflows/ci.yml +++ b/pkg/amqp-tools/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/async-command/.github/workflows/ci.yml b/pkg/async-command/.github/workflows/ci.yml index e60e63b9b..a168dca05 100644 --- a/pkg/async-command/.github/workflows/ci.yml +++ b/pkg/async-command/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 24a24e80a..4317d1eca 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": ">=7.1", + "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", "symfony/console": "^4.3|^5", diff --git a/pkg/async-event-dispatcher/.github/workflows/ci.yml b/pkg/async-event-dispatcher/.github/workflows/ci.yml index e60e63b9b..a168dca05 100644 --- a/pkg/async-event-dispatcher/.github/workflows/ci.yml +++ b/pkg/async-event-dispatcher/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/dbal/.github/workflows/ci.yml b/pkg/dbal/.github/workflows/ci.yml index e60e63b9b..a168dca05 100644 --- a/pkg/dbal/.github/workflows/ci.yml +++ b/pkg/dbal/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/dsn/.github/workflows/ci.yml b/pkg/dsn/.github/workflows/ci.yml index 8486752a8..b23e42104 100644 --- a/pkg/dsn/.github/workflows/ci.yml +++ b/pkg/dsn/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/dsn/composer.json b/pkg/dsn/composer.json index 06ef139e9..3cdac4c2d 100644 --- a/pkg/dsn/composer.json +++ b/pkg/dsn/composer.json @@ -6,10 +6,10 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.1.3" + "php": "^7.3|^8.0" }, "require-dev": { - "phpunit/phpunit": "~7.5" + "phpunit/phpunit": "^9.5" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/enqueue-bundle/.github/workflows/ci.yml b/pkg/enqueue-bundle/.github/workflows/ci.yml index 99b7fc6bf..0185cad38 100644 --- a/pkg/enqueue-bundle/.github/workflows/ci.yml +++ b/pkg/enqueue-bundle/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 4773dcbed..aded35069 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -37,7 +37,7 @@ "enqueue/async-command": "0.10.x-dev", "php-amqplib/php-amqplib": "^2.7", "doctrine/doctrine-bundle": "~1.2|^2", - "doctrine/mongodb-odm-bundle": "^3.5|^4", + "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "symfony/browser-kit": "^4.3|^5", "symfony/expression-language": "^4.3|^5", diff --git a/pkg/enqueue/.github/workflows/ci.yml b/pkg/enqueue/.github/workflows/ci.yml index 390f70724..b39495855 100644 --- a/pkg/enqueue/.github/workflows/ci.yml +++ b/pkg/enqueue/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/fs/.github/workflows/ci.yml b/pkg/fs/.github/workflows/ci.yml index e9a20ead1..2a2fabfb7 100644 --- a/pkg/fs/.github/workflows/ci.yml +++ b/pkg/fs/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/gearman/.github/workflows/ci.yml b/pkg/gearman/.github/workflows/ci.yml index eae3a9cfa..401aab590 100644 --- a/pkg/gearman/.github/workflows/ci.yml +++ b/pkg/gearman/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/gps/.github/workflows/ci.yml b/pkg/gps/.github/workflows/ci.yml index f2accab5f..fd2ae7f2d 100644 --- a/pkg/gps/.github/workflows/ci.yml +++ b/pkg/gps/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/job-queue/.github/workflows/ci.yml b/pkg/job-queue/.github/workflows/ci.yml index ef204f16b..2df5ff80c 100644 --- a/pkg/job-queue/.github/workflows/ci.yml +++ b/pkg/job-queue/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/mongodb/.github/workflows/ci.yml b/pkg/mongodb/.github/workflows/ci.yml index abee78209..7a2a6f365 100644 --- a/pkg/mongodb/.github/workflows/ci.yml +++ b/pkg/mongodb/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/monitoring/.github/workflows/ci.yml b/pkg/monitoring/.github/workflows/ci.yml index 1dabd6bc3..237a49da1 100644 --- a/pkg/monitoring/.github/workflows/ci.yml +++ b/pkg/monitoring/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/null/.github/workflows/ci.yml b/pkg/null/.github/workflows/ci.yml index f2accab5f..fd2ae7f2d 100644 --- a/pkg/null/.github/workflows/ci.yml +++ b/pkg/null/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/pheanstalk/.github/workflows/ci.yml b/pkg/pheanstalk/.github/workflows/ci.yml index f2accab5f..fd2ae7f2d 100644 --- a/pkg/pheanstalk/.github/workflows/ci.yml +++ b/pkg/pheanstalk/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/rdkafka/.github/workflows/ci.yml b/pkg/rdkafka/.github/workflows/ci.yml index 24af1bbc1..fd96b2abe 100644 --- a/pkg/rdkafka/.github/workflows/ci.yml +++ b/pkg/rdkafka/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/redis/.github/workflows/ci.yml b/pkg/redis/.github/workflows/ci.yml index d2311341a..5dc982ea7 100644 --- a/pkg/redis/.github/workflows/ci.yml +++ b/pkg/redis/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/simple-client/.github/workflows/ci.yml b/pkg/simple-client/.github/workflows/ci.yml index c9683ac90..7fcc096a9 100644 --- a/pkg/simple-client/.github/workflows/ci.yml +++ b/pkg/simple-client/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/sns/.github/workflows/ci.yml b/pkg/sns/.github/workflows/ci.yml index f2accab5f..fd2ae7f2d 100644 --- a/pkg/sns/.github/workflows/ci.yml +++ b/pkg/sns/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/snsqs/.github/workflows/ci.yml b/pkg/snsqs/.github/workflows/ci.yml index f2accab5f..fd2ae7f2d 100644 --- a/pkg/snsqs/.github/workflows/ci.yml +++ b/pkg/snsqs/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/sqs/.github/workflows/ci.yml b/pkg/sqs/.github/workflows/ci.yml index f2accab5f..fd2ae7f2d 100644 --- a/pkg/sqs/.github/workflows/ci.yml +++ b/pkg/sqs/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/stomp/.github/workflows/ci.yml b/pkg/stomp/.github/workflows/ci.yml index f2accab5f..fd2ae7f2d 100644 --- a/pkg/stomp/.github/workflows/ci.yml +++ b/pkg/stomp/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 614ac2601..84532e63b 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "enqueue/dsn": "^0.10", - "stomp-php/stomp-php": "^4", + "stomp-php/stomp-php": "^4.0|^5.0", "queue-interop/queue-interop": "^0.8", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", diff --git a/pkg/wamp/.github/workflows/ci.yml b/pkg/wamp/.github/workflows/ci.yml index 1dabd6bc3..237a49da1 100644 --- a/pkg/wamp/.github/workflows/ci.yml +++ b/pkg/wamp/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] + php: ['7.3', '7.4', '8.0'] name: PHP ${{ matrix.php }} tests From f093ee204edc5b7952aa8bc1517bb5fe181ec561 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 16 Feb 2021 23:08:20 +0200 Subject: [PATCH 0924/1142] Use the release from the fork --- composer.json | 2 +- pkg/stomp/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 27b9a0d11..9d899a5f4 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,7 @@ "stomp-php/stomp-php": "^4|^5", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", - "richardfullmer/rabbitmq-management-api": "dev-http-client-2 as 2.1.0", + "richardfullmer/rabbitmq-management-api": "^2.1.1", "predis/predis": "^1.1", "thruway/client": "^0.5.0", "thruway/pawl-transport": "^0.5.0", diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 84532e63b..8a4a243a4 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -12,7 +12,7 @@ "queue-interop/queue-interop": "^0.8", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", - "richardfullmer/rabbitmq-management-api": "^2.0" + "richardfullmer/rabbitmq-management-api": "^2.1.1" }, "require-dev": { "phpunit/phpunit": "^9.5", From 41bbfbd0ea73901826541985c5eb21068ad031f3 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 16 Feb 2021 23:21:02 +0200 Subject: [PATCH 0925/1142] Add the fork repo to the split package --- pkg/stomp/composer.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 8a4a243a4..301631f43 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -5,6 +5,12 @@ "keywords": ["messaging", "queue", "stomp"], "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", + "repositories": [ + { + "type": "git", + "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" + } + ], "require": { "php": "^7.3|^8.0", "enqueue/dsn": "^0.10", From 351d80a4394a3434d841e4be5bd508cd2badf60f Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 17 Feb 2021 08:41:19 +0200 Subject: [PATCH 0926/1142] upd changelog --- CHANGELOG.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a35b9528..bb8681935 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # Change Log +## [0.10.8](https://github.com/php-enqueue/enqueue-dev/tree/0.10.8) (2021-02-17) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.7...0.10.8) + +**Merged pull requests:** + +- Fix package CI [\#1138](https://github.com/php-enqueue/enqueue-dev/pull/1138) ([andrewmy](https://github.com/andrewmy)) +- add sns driver + use profile to establish connection [\#1134](https://github.com/php-enqueue/enqueue-dev/pull/1134) ([fbaudry](https://github.com/fbaudry)) +- Add PHP 8 [\#1132](https://github.com/php-enqueue/enqueue-dev/pull/1132) ([andrewmy](https://github.com/andrewmy)) + +## [0.10.7](https://github.com/php-enqueue/enqueue-dev/tree/0.10.7) (2021-02-03) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.6...0.10.7) + +**Merged pull requests:** + +- PHPUnit 9.5 [\#1131](https://github.com/php-enqueue/enqueue-dev/pull/1131) ([andrewmy](https://github.com/andrewmy)) +- Fix the build matrix [\#1130](https://github.com/php-enqueue/enqueue-dev/pull/1130) ([andrewmy](https://github.com/andrewmy)) +- Disable Travis CI [\#1129](https://github.com/php-enqueue/enqueue-dev/pull/1129) ([makasim](https://github.com/makasim)) +- Add GitHub Action CI [\#1127](https://github.com/php-enqueue/enqueue-dev/pull/1127) ([andrewmy](https://github.com/andrewmy)) +- Allow ext-rdkafka 5 [\#1126](https://github.com/php-enqueue/enqueue-dev/pull/1126) ([andrewmy](https://github.com/andrewmy)) +- Fix - Bad parameter for exception [\#1124](https://github.com/php-enqueue/enqueue-dev/pull/1124) ([atrauzzi](https://github.com/atrauzzi)) +- \[fix\] queue consumption: catch throwable for processing errors [\#1114](https://github.com/php-enqueue/enqueue-dev/pull/1114) ([macghriogair](https://github.com/macghriogair)) +- Ramsey dependency removed in favor to \Enqueue\Util\UUID::generate [\#1110](https://github.com/php-enqueue/enqueue-dev/pull/1110) ([inri13666](https://github.com/inri13666)) +- Added: ability to choose different entity manager [\#1081](https://github.com/php-enqueue/enqueue-dev/pull/1081) ([balabis](https://github.com/balabis)) + ## [0.10.6](https://github.com/php-enqueue/enqueue-dev/tree/0.10.6) (2020-10-16) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.5...0.10.6) From 0ba34ede64c077643e403f91b35962493a5a9f2a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 11 Feb 2021 02:35:46 +0200 Subject: [PATCH 0927/1142] Split tests into different matrices --- .github/workflows/ci.yml | 125 +++++++++++---------------------------- 1 file changed, 33 insertions(+), 92 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e9887e2b..10a614e43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,92 +59,14 @@ jobs: - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} if: env.GIT_DIFF_FILTERED - tests: + unit_tests: runs-on: ubuntu-latest strategy: fail-fast: false matrix: - php: ['7.4'] - include: - - php: 7.3 - symfony_version: 4.3.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.3 - symfony_version: 4.4.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.3 - symfony_version: 5.0.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.4 - symfony_version: 4.3.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.4 - symfony_version: 4.4.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.4 - symfony_version: 5.0.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.4 - symfony_version: 5.2.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: 7.3 # same as in the container - symfony_version: 4.3.* - unit_tests: false - functional_tests: true - rdkafka_tests: false - prepare_container: true - - php: 7.3 # same as in the container - symfony_version: 5.0.* - unit_tests: false - functional_tests: true - rdkafka_tests: false - prepare_container: true - - php: 7.3 # same as in the container - symfony_version: 4.3.* - unit_tests: false - functional_tests: false - rdkafka_tests: true - prepare_container: true - - php: "8.0" - symfony_version: 5.2.* - unit_tests: true - functional_tests: false - rdkafka_tests: false - prepare_container: false - - php: "8.0" - symfony_version: 5.2.* - unit_tests: false - functional_tests: true - rdkafka_tests: false - prepare_container: true - - php: "8.0" - symfony_version: 5.2.* - unit_tests: false - rdkafka_tests: true - prepare_container: true - - name: PHP ${{ matrix.php }} tests on Sf ${{ matrix.symfony_version }}, unit=${{ matrix.unit_tests }}, func=${{ matrix.functional_tests }}, rdkafka=${{ matrix.rdkafka_tests }} + php: ['7.3', '7.4'] + symfony_version: ['4.3.*', '4.4.*', '5.0.*'] + name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }} steps: - uses: actions/checkout@v2 @@ -162,16 +84,35 @@ jobs: - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: bin/dev -b - env: - PHP_VERSION: "${{ matrix.php }}" - if: matrix.prepare_container - - run: bin/phpunit --exclude-group=functional - if: matrix.unit_tests - - run: bin/test.sh --exclude-group=rdkafka - if: matrix.functional_tests + functional_tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.3'] # same as in the container + symfony_version: ['4.3.*', '5.0.*'] + rdkafka_action: ['exclude-group', 'group'] + + name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, rdkafka_action=${{ matrix.rdkafka_action }} + + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: mongodb, redis, :xdebug + ini-values: memory_limit=2048M + + - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" + + - uses: "ramsey/composer-install@v1" + + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php + + - run: bin/dev -b - - run: bin/test.sh --group=rdkafka - if: matrix.rdkafka_tests + - run: bin/test.sh --${{ matrix.rdkafka_action }}=rdkafka From bae2a729adb2f9d72f566cc1a4d5a4b1ab027905 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 11 Feb 2021 02:43:01 +0200 Subject: [PATCH 0928/1142] Add lowest and highest dependencies to the matrix --- .github/workflows/ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 10a614e43..d411b9593 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,7 +66,8 @@ jobs: matrix: php: ['7.3', '7.4'] symfony_version: ['4.3.*', '4.4.*', '5.0.*'] - name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }} + dependencies: ['lowest', 'highest'] + name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} steps: - uses: actions/checkout@v2 @@ -81,6 +82,8 @@ jobs: - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" - uses: "ramsey/composer-install@v1" + with: + dependency-versions: ${{ matrix.dependencies }} - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php @@ -93,9 +96,10 @@ jobs: matrix: php: ['7.3'] # same as in the container symfony_version: ['4.3.*', '5.0.*'] + dependencies: ['lowest', 'highest'] rdkafka_action: ['exclude-group', 'group'] - name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, rdkafka_action=${{ matrix.rdkafka_action }} + name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, rdkafka_action=${{ matrix.rdkafka_action }}, deps=${{ matrix.dependencies }} steps: - uses: actions/checkout@v2 @@ -110,6 +114,8 @@ jobs: - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" - uses: "ramsey/composer-install@v1" + with: + dependency-versions: ${{ matrix.dependencies }} - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php From cb27166ebc34e9502f91064030f4455a589a8614 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 11 Feb 2021 03:45:55 +0200 Subject: [PATCH 0929/1142] Bump some minimal deps --- composer.json | 34 ++++++++++++++++------------------ pkg/amqp-bunny/composer.json | 2 +- pkg/amqp-ext/composer.json | 2 +- pkg/amqp-lib/composer.json | 2 +- pkg/dbal/composer.json | 10 ++++------ pkg/enqueue/composer.json | 2 +- pkg/fs/composer.json | 2 +- pkg/gearman/composer.json | 2 +- pkg/gps/composer.json | 2 +- pkg/mongodb/composer.json | 2 +- pkg/null/composer.json | 2 +- pkg/pheanstalk/composer.json | 2 +- pkg/rdkafka/composer.json | 2 +- pkg/redis/composer.json | 4 ++-- pkg/sns/composer.json | 2 +- pkg/snsqs/composer.json | 2 +- pkg/sqs/composer.json | 2 +- pkg/stomp/composer.json | 2 +- pkg/wamp/composer.json | 2 +- 19 files changed, 38 insertions(+), 42 deletions(-) diff --git a/composer.json b/composer.json index 9d899a5f4..d0d308b48 100644 --- a/composer.json +++ b/composer.json @@ -23,20 +23,21 @@ "ext-rdkafka": "^3.0.3|^4.0|^5.0", "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8", + "queue-interop/queue-interop": "^0.8", "bunny/bunny": "^0.2.4|^0.3|^0.4", "php-amqplib/php-amqplib": "^2.7", "doctrine/dbal": "^2.12", - "ramsey/uuid": "^2|^3.5|^4.0", - "psr/log": "^1", + "ramsey/uuid": "^3.5|^4.0", + "psr/log": "^1.1", "psr/container": "^1", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^0.6.1|^1.0", "doctrine/orm": "~2.4", + "doctrine/persistence": "^1.3.3|^2.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3", "aws/aws-sdk-php": "^3.26", - "stomp-php/stomp-php": "^4|^5", + "stomp-php/stomp-php": "^4.1.4|^5", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "^2.1.1", @@ -50,17 +51,17 @@ "ext-pcntl": "*", "phpunit/phpunit": "^9.5", "phpstan/phpstan": "^0.12", - "queue-interop/queue-spec": "^0.6", - "symfony/browser-kit": "^3.4|^4", - "symfony/config": "^3.4|^4", - "symfony/process": "^3.4|^4", - "symfony/console": "^3.4|^4", - "symfony/dependency-injection": "^3.4|^4", - "symfony/event-dispatcher": "^3.4|^4", - "symfony/expression-language": "^3.4|^4", - "symfony/http-kernel": "^3.4|^4", - "symfony/filesystem": "^3.4|^4", - "symfony/framework-bundle": "^3.4|^4", + "queue-interop/queue-spec": "^0.6.2", + "symfony/browser-kit": "^4.3|^5", + "symfony/config": "^4.3|^5", + "symfony/process": "^4.3|^5", + "symfony/console": "^4.3|^5", + "symfony/dependency-injection": "^4.3|^5", + "symfony/event-dispatcher": "^4.3|^5", + "symfony/expression-language": "^4.3|^5", + "symfony/http-kernel": "^4.3|^5", + "symfony/filesystem": "^4.3|^5", + "symfony/framework-bundle": "^4.3|^5", "symfony/yaml": "^4.3|^5", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "~1.2|^2", @@ -128,8 +129,5 @@ "ext-mongo": "1.6.14" }, "prefer-stable": true - }, - "conflict": { - "doctrine/persistence": "<1.3.0" } } diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 9e7d83bb4..9b8ed2dbb 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -16,7 +16,7 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 18b1f72cb..758f1ab64 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -16,7 +16,7 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6", + "queue-interop/queue-spec": "^0.6.2", "empi89/php-amqp-stubs": "*@dev" }, "support": { diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 71867a911..be75355fc 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -16,7 +16,7 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index fc9c4a595..2e21bf936 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -9,17 +9,15 @@ "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.12", - "ramsey/uuid": "^3|^4" + "doctrine/persistence": "^1.3.3|^2.0", + "ramsey/uuid": "^3.5|^4" }, "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" - }, - "conflict": { - "doctrine/persistence": "<1.3.0" - }, + "queue-interop/queue-spec": "^0.6.2" + } "support": { "email": "opensource@forma-pro.com", "issues": "https://github.com/php-enqueue/enqueue-dev/issues", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 3c525f510..09822cf97 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -11,7 +11,7 @@ "queue-interop/queue-interop": "^0.8", "enqueue/null": "^0.10", "enqueue/dsn": "^0.10", - "ramsey/uuid": "^2|^3.5|^4", + "ramsey/uuid": "^3.5|^4", "psr/log": "^1", "psr/container": "^1" }, diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index e2b8119f1..54f91e378 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -16,7 +16,7 @@ "phpunit/phpunit": "^9.5", "enqueue/null": "0.10.x-dev", "enqueue/test": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6", + "queue-interop/queue-spec": "^0.6.2", "symfony/dependency-injection": "^4.3|^5", "symfony/yaml": "^4.3|^5" }, diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index b88fa542e..4dfdb3781 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -14,7 +14,7 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 1d2ed5fd3..e8b1ed9d8 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -14,7 +14,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index a894816f7..8089c1a4f 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -17,7 +17,7 @@ }, "require-dev": { "phpunit/phpunit": "^9.5", - "queue-interop/queue-spec": "^0.6", + "queue-interop/queue-spec": "^0.6.2", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev" }, diff --git a/pkg/null/composer.json b/pkg/null/composer.json index bd00fb0b0..ab84dc36e 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -12,7 +12,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index 0274089a5..f07603657 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -14,7 +14,7 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 7128a525f..5743a7d17 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -14,7 +14,7 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6", + "queue-interop/queue-spec": "^0.6.2", "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0" }, "support": { diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 2bd867650..4fd68f139 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -9,14 +9,14 @@ "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "ramsey/uuid": "^3|^4" + "ramsey/uuid": "^3.5|^4" }, "require-dev": { "phpunit/phpunit": "^9.5", "predis/predis": "^1.1", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index 25fd1a345..04fc1579d 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -14,7 +14,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/snsqs/composer.json b/pkg/snsqs/composer.json index ec52b67bc..bf68aeb8d 100644 --- a/pkg/snsqs/composer.json +++ b/pkg/snsqs/composer.json @@ -15,7 +15,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index 96dc89252..ed515a248 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -14,7 +14,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 301631f43..87be9a62a 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -24,7 +24,7 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 1ad6b5110..f0892a609 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -16,7 +16,7 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "queue-interop/queue-spec": "^0.6" + "queue-interop/queue-spec": "^0.6.2" }, "support": { "email": "opensource@forma-pro.com", From 86ba387cc26098d008c771883d582dd918470606 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 11 Feb 2021 03:52:52 +0200 Subject: [PATCH 0930/1142] Bump --- composer.json | 4 ++-- pkg/pheanstalk/composer.json | 2 +- pkg/rdkafka/composer.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index d0d308b48..b2f19759e 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "doctrine/orm": "~2.4", "doctrine/persistence": "^1.3.3|^2.0", "mongodb/mongodb": "^1.2", - "pda/pheanstalk": "^3", + "pda/pheanstalk": "^3.1", "aws/aws-sdk-php": "^3.26", "stomp-php/stomp-php": "^4.1.4|^5", "php-http/guzzle7-adapter": "^0.1.1", @@ -67,7 +67,7 @@ "doctrine/doctrine-bundle": "~1.2|^2", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", - "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0", + "kwn/php-rdkafka-stubs": "^2.0.3", "friendsofphp/php-cs-fixer": "^2", "dms/phpunit-arraysubset-asserts": "^0.2.1", "phpspec/prophecy-phpunit": "^2.0" diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index f07603657..bb019e2d9 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "pda/pheanstalk": "^3", + "pda/pheanstalk": "^3.1", "queue-interop/queue-interop": "^0.8" }, "require-dev": { diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 5743a7d17..e322a8492 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -15,7 +15,7 @@ "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6.2", - "kwn/php-rdkafka-stubs": "^1.0.2 | ^2.0" + "kwn/php-rdkafka-stubs": "^2.0.3" }, "support": { "email": "opensource@forma-pro.com", From 01995e1ba6a00b48713a5afd3729bbc74cbe5f54 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 11 Feb 2021 03:54:22 +0200 Subject: [PATCH 0931/1142] Trigger CI From 0ca270959d952b8072629940395396d3500ee567 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 11 Feb 2021 03:56:32 +0200 Subject: [PATCH 0932/1142] Drop ext-rdkafka 3 --- composer.json | 4 ++-- pkg/rdkafka/composer.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index b2f19759e..46aea2155 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "ext-amqp": "^1.9.3", "ext-gearman": "^2.0", "ext-mongodb": "^1.5", - "ext-rdkafka": "^3.0.3|^4.0|^5.0", + "ext-rdkafka": "^4.0|^5.0", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", @@ -122,7 +122,7 @@ "platform": { "ext-amqp": "1.9.3", "ext-gearman": "2.0.3", - "ext-rdkafka": "3.3", + "ext-rdkafka": "4.0", "ext-mongodb": "1.5", "ext-bcmath": "1", "ext-mbstring": "1", diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index e322a8492..72c5535a8 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "ext-rdkafka": "^3.0.3|^4.0|^5.0", + "ext-rdkafka": "^4.0|^5.0", "queue-interop/queue-interop": "^0.8" }, "require-dev": { From f8d94a0ba61d35baa5dfa6513ba9c1ba9b7b8442 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 16 Feb 2021 19:54:41 +0200 Subject: [PATCH 0933/1142] Bump doctrine-bundle --- composer.json | 2 +- pkg/enqueue-bundle/composer.json | 2 +- pkg/job-queue/composer.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 46aea2155..95dda4b3b 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "symfony/framework-bundle": "^4.3|^5", "symfony/yaml": "^4.3|^5", "empi89/php-amqp-stubs": "*@dev", - "doctrine/doctrine-bundle": "~1.2|^2", + "doctrine/doctrine-bundle": "^1.6.12|^2", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^2.0.3", diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index aded35069..35ca6bc18 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -36,7 +36,7 @@ "enqueue/async-event-dispatcher": "0.10.x-dev", "enqueue/async-command": "0.10.x-dev", "php-amqplib/php-amqplib": "^2.7", - "doctrine/doctrine-bundle": "~1.2|^2", + "doctrine/doctrine-bundle": "^1.6.12|^2", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "symfony/browser-kit": "^4.3|^5", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 980e57619..77206a95d 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -16,7 +16,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", - "doctrine/doctrine-bundle": "~1.2|^2", + "doctrine/doctrine-bundle": "^1.6.12|^2", "symfony/browser-kit": "^4.3|^5", "symfony/expression-language": "^4.3|^5", "symfony/framework-bundle": "^4.3|^5", From 502d2ea548c4eebfb79ecc8fdc3747d0d9c1b57b Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 16 Feb 2021 21:49:12 +0200 Subject: [PATCH 0934/1142] Drop doctrine-bundle <2 --- pkg/job-queue/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 77206a95d..b1362ce5b 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -16,7 +16,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", - "doctrine/doctrine-bundle": "^1.6.12|^2", + "doctrine/doctrine-bundle": "^2.0", "symfony/browser-kit": "^4.3|^5", "symfony/expression-language": "^4.3|^5", "symfony/framework-bundle": "^4.3|^5", From 39f8afc8e34e8ab2840657afbeac67c9ca719b8d Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 16 Feb 2021 22:40:02 +0200 Subject: [PATCH 0935/1142] More bumps --- composer.json | 12 +++++++----- pkg/amqp-lib/composer.json | 2 +- pkg/enqueue-bundle/composer.json | 4 ++-- pkg/job-queue/composer.json | 2 +- pkg/monitoring/composer.json | 3 ++- pkg/stomp/composer.json | 2 +- pkg/wamp/composer.json | 3 ++- 7 files changed, 16 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 95dda4b3b..82a484f30 100644 --- a/composer.json +++ b/composer.json @@ -25,19 +25,19 @@ "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "bunny/bunny": "^0.2.4|^0.3|^0.4", - "php-amqplib/php-amqplib": "^2.7", + "php-amqplib/php-amqplib": "^2.12.2", "doctrine/dbal": "^2.12", - "ramsey/uuid": "^3.5|^4.0", + "ramsey/uuid": "^3.5|^4", "psr/log": "^1.1", "psr/container": "^1", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^0.6.1|^1.0", - "doctrine/orm": "~2.4", + "doctrine/orm": "^2.7.4", "doctrine/persistence": "^1.3.3|^2.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3.1", "aws/aws-sdk-php": "^3.26", - "stomp-php/stomp-php": "^4.1.4|^5", + "stomp-php/stomp-php": "^4.5|^5", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "^2.1.1", @@ -45,7 +45,9 @@ "thruway/client": "^0.5.0", "thruway/pawl-transport": "^0.5.0", "influxdb/influxdb-php": "^1.14", - "datadog/php-datadogstatsd": "^1.3" + "datadog/php-datadogstatsd": "^1.3", + "guzzlehttp/guzzle": "^6.3", + "voryx/thruway-common": "^1.0.1" }, "require-dev": { "ext-pcntl": "*", diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index be75355fc..415b3d34e 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "php-amqplib/php-amqplib": "^2.10", + "php-amqplib/php-amqplib": "^2.12.2", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 35ca6bc18..2585e5bdf 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -35,8 +35,8 @@ "enqueue/test": "0.10.x-dev", "enqueue/async-event-dispatcher": "0.10.x-dev", "enqueue/async-command": "0.10.x-dev", - "php-amqplib/php-amqplib": "^2.7", - "doctrine/doctrine-bundle": "^1.6.12|^2", + "php-amqplib/php-amqplib": "^2.12.2", + "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "symfony/browser-kit": "^4.3|^5", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index b1362ce5b..81c265f2f 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", - "doctrine/orm": "~2.4", + "doctrine/orm": "~2.7.4", "doctrine/dbal": "^2.12" }, "require-dev": { diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index 9942ec910..70d52973b 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -16,7 +16,8 @@ "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", "thruway/client": "^0.5", - "thruway/pawl-transport": "^0.5" + "thruway/pawl-transport": "^0.5", + "voryx/thruway-common": "^1.0.1" }, "suggest": { "thruway/client": "Client for Thruway and the WAMP (Web Application Messaging Protocol).", diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 87be9a62a..7e6efc4bf 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -14,7 +14,7 @@ "require": { "php": "^7.3|^8.0", "enqueue/dsn": "^0.10", - "stomp-php/stomp-php": "^4.0|^5.0", + "stomp-php/stomp-php": "^4.5|^5.0", "queue-interop/queue-interop": "^0.8", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index f0892a609..3b93d281f 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -10,7 +10,8 @@ "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "thruway/client": "^0.5.0", - "thruway/pawl-transport": "^0.5.0" + "thruway/pawl-transport": "^0.5.0", + "voryx/thruway-common": "^1.0.1" }, "require-dev": { "phpunit/phpunit": "^9.5", From e4170faa8555201134939e739f203b47852c203a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 16 Feb 2021 23:48:24 +0200 Subject: [PATCH 0936/1142] Retrigger CI From 72a0e0e289ffe90f98b81463aad3f0aa428d2d5a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 13:40:58 +0200 Subject: [PATCH 0937/1142] Bump google/cloud-pubsub --- composer.json | 2 +- pkg/gps/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 82a484f30..80122dbed 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,7 @@ "psr/log": "^1.1", "psr/container": "^1", "makasim/temp-file": "^0.2", - "google/cloud-pubsub": "^0.6.1|^1.0", + "google/cloud-pubsub": "^1.4.3", "doctrine/orm": "^2.7.4", "doctrine/persistence": "^1.3.3|^2.0", "mongodb/mongodb": "^1.2", diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index e8b1ed9d8..53445fe32 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", - "google/cloud-pubsub": "^1.0", + "google/cloud-pubsub": "^1.4.3", "enqueue/dsn": "^0.10" }, "require-dev": { From 20e3d2f590e70027ad3f8d7f5c176daad3b336cc Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 14:41:27 +0200 Subject: [PATCH 0938/1142] Improve Dockerfile for local work --- docker/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 2b21de82b..785898446 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -25,6 +25,7 @@ RUN set -x && \ libgearman-dev \ php-pear \ make \ + unzip \ && \ pecl channel-update pecl.php.net && \ pecl install gearman && \ @@ -56,4 +57,6 @@ RUN chmod u+x /usr/local/bin/entrypoint.sh RUN mkdir -p /mqdev WORKDIR /mqdev +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + CMD /usr/local/bin/entrypoint.sh From d2e4f3980db998b5cc44937351014a7b0bf2c980 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 14:42:53 +0200 Subject: [PATCH 0939/1142] Bump guzzle --- composer.json | 3 ++- pkg/stomp/composer.json | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 80122dbed..6672edeef 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,8 @@ "thruway/pawl-transport": "^0.5.0", "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", - "guzzlehttp/guzzle": "^6.3", + "guzzlehttp/guzzle": "^7.0.1", + "php-http/discovery": "^1.13", "voryx/thruway-common": "^1.0.1" }, "require-dev": { diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 7e6efc4bf..2e4963400 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -18,7 +18,9 @@ "queue-interop/queue-interop": "^0.8", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", - "richardfullmer/rabbitmq-management-api": "^2.1.1" + "richardfullmer/rabbitmq-management-api": "^2.1.1", + "guzzlehttp/guzzle": "^7.0.1", + "php-http/discovery": "^1.13" }, "require-dev": { "phpunit/phpunit": "^9.5", From 2d69640fbcb1bfaf0ca92f8b0160b7d2417375fc Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 14:45:37 +0200 Subject: [PATCH 0940/1142] Re-add php 8 and sf 5.2 --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d411b9593..0ef2330ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,8 +64,8 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4'] - symfony_version: ['4.3.*', '4.4.*', '5.0.*'] + php: ['7.3', '7.4', '8.0'] + symfony_version: ['4.3.*', '4.4.*', '5.0.*', '5.2.*'] dependencies: ['lowest', 'highest'] name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} @@ -94,8 +94,8 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3'] # same as in the container - symfony_version: ['4.3.*', '5.0.*'] + php: ['7.3', '8.0'] # same as in the container + symfony_version: ['4.3.*', '5.0.*', '5.2.*'] dependencies: ['lowest', 'highest'] rdkafka_action: ['exclude-group', 'group'] From f1f873a8a8ecf034465103d60250fc9489df6629 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 15:01:51 +0200 Subject: [PATCH 0941/1142] Remove old sf from php8; fix amqplib requirement --- .github/workflows/ci.yml | 8 ++++++++ composer.json | 2 +- pkg/amqp-lib/composer.json | 2 +- pkg/enqueue-bundle/composer.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0ef2330ef..5023ec4e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,6 +67,14 @@ jobs: php: ['7.3', '7.4', '8.0'] symfony_version: ['4.3.*', '4.4.*', '5.0.*', '5.2.*'] dependencies: ['lowest', 'highest'] + exclude: + - php: '8.0' + symfony_version: '4.3.*' + - php: '8.0' + symfony_version: '4.4.*' + - php: '8.0' + symfony_version: '5.0.*' + name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} steps: diff --git a/composer.json b/composer.json index 6672edeef..f22dd1fc8 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "bunny/bunny": "^0.2.4|^0.3|^0.4", - "php-amqplib/php-amqplib": "^2.12.2", + "php-amqplib/php-amqplib": "^2.12.1", "doctrine/dbal": "^2.12", "ramsey/uuid": "^3.5|^4", "psr/log": "^1.1", diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 415b3d34e..caa903108 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "php-amqplib/php-amqplib": "^2.12.2", + "php-amqplib/php-amqplib": "^2.12.1", "queue-interop/amqp-interop": "^0.8", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 2585e5bdf..d643b8a30 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -35,7 +35,7 @@ "enqueue/test": "0.10.x-dev", "enqueue/async-event-dispatcher": "0.10.x-dev", "enqueue/async-command": "0.10.x-dev", - "php-amqplib/php-amqplib": "^2.12.2", + "php-amqplib/php-amqplib": "^2.12.1", "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", From fb348b15bb5812928e2cbc5b739119475a15b7f5 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 15:03:59 +0200 Subject: [PATCH 0942/1142] Remove old sf from php8 in functional tests --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5023ec4e6..f2abecfff 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,6 +106,11 @@ jobs: symfony_version: ['4.3.*', '5.0.*', '5.2.*'] dependencies: ['lowest', 'highest'] rdkafka_action: ['exclude-group', 'group'] + exclude: + - php: '8.0' + symfony_version: '4.3.*' + - php: '8.0' + symfony_version: '5.0.*' name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, rdkafka_action=${{ matrix.rdkafka_action }}, deps=${{ matrix.dependencies }} From 9e84178aa4d02cc54ed669cfb0bf381ab677380c Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 15:26:13 +0200 Subject: [PATCH 0943/1142] Bump aws-sdk --- composer.json | 2 +- pkg/sns/composer.json | 2 +- pkg/sqs/composer.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index f22dd1fc8..6b0b0c5d9 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "doctrine/persistence": "^1.3.3|^2.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3.1", - "aws/aws-sdk-php": "^3.26", + "aws/aws-sdk-php": "^3.155", "stomp-php/stomp-php": "^4.5|^5", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index 04fc1579d..ef3cf6f87 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -9,7 +9,7 @@ "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "aws/aws-sdk-php": "~3.26" + "aws/aws-sdk-php": "~3.155" }, "require-dev": { "phpunit/phpunit": "^9.5", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index ed515a248..2b2473927 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -9,7 +9,7 @@ "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "aws/aws-sdk-php": "~3.26" + "aws/aws-sdk-php": "~3.155" }, "require-dev": { "phpunit/phpunit": "^9.5", From 6268ab63d49ceee85bb3cbc00e39cb799f53965e Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 16:08:12 +0200 Subject: [PATCH 0944/1142] Back to clunky composer install for better caching --- .github/workflows/ci.yml | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f2abecfff..981b6040b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,7 +66,7 @@ jobs: matrix: php: ['7.3', '7.4', '8.0'] symfony_version: ['4.3.*', '4.4.*', '5.0.*', '5.2.*'] - dependencies: ['lowest', 'highest'] + dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: - php: '8.0' symfony_version: '4.3.*' @@ -80,6 +80,18 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Get Composer Cache Directory + id: composer-cache + run: | + echo "::set-output name=dir::$(composer config cache-files-dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ matrix.php }}-${{ matrix.symfony_version }}-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }} + restore-keys: | + composer-${{ matrix.php }}-${{ matrix.symfony_version }}-${{ matrix.dependencies }}- + - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} @@ -89,9 +101,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" - - uses: "ramsey/composer-install@v1" - with: - dependency-versions: ${{ matrix.dependencies }} + - run: composer install --no-progress ${{ matrix.dependencies }} - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php @@ -104,7 +114,7 @@ jobs: matrix: php: ['7.3', '8.0'] # same as in the container symfony_version: ['4.3.*', '5.0.*', '5.2.*'] - dependencies: ['lowest', 'highest'] + dependencies: ['--prefer-lowest', '--prefer-dist'] rdkafka_action: ['exclude-group', 'group'] exclude: - php: '8.0' @@ -117,6 +127,18 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Get Composer Cache Directory + id: composer-cache + run: | + echo "::set-output name=dir::$(composer config cache-files-dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ matrix.php }}-${{ matrix.symfony_version }}-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }} + restore-keys: | + composer-${{ matrix.php }}-${{ matrix.symfony_version }}-${{ matrix.dependencies }}- + - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} @@ -126,9 +148,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" - - uses: "ramsey/composer-install@v1" - with: - dependency-versions: ${{ matrix.dependencies }} + - run: composer install --no-progress ${{ matrix.dependencies }} - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php From 6c7d6c2cb37201fd38f779c31be0d7184adda510 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 16:10:08 +0200 Subject: [PATCH 0945/1142] Derp --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 981b6040b..ee5f93d7d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,7 +101,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" - - run: composer install --no-progress ${{ matrix.dependencies }} + - run: composer update --no-progress ${{ matrix.dependencies }} - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php @@ -148,7 +148,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "${{ matrix.symfony_version }}" - - run: composer install --no-progress ${{ matrix.dependencies }} + - run: composer update --no-progress ${{ matrix.dependencies }} - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php From 0909932478e50a35992e6a3ed421d9d5a3a48427 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 16:27:36 +0200 Subject: [PATCH 0946/1142] Re-bump doctrine bundle --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 6b0b0c5d9..a3c27ad9b 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "symfony/framework-bundle": "^4.3|^5", "symfony/yaml": "^4.3|^5", "empi89/php-amqp-stubs": "*@dev", - "doctrine/doctrine-bundle": "^1.6.12|^2", + "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^2.0.3", From dd50b60b5e006afa0ce82c24806be65ef826f09b Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 20:57:43 +0200 Subject: [PATCH 0947/1142] Bump amqp-interop and queue-interop --- composer.json | 4 ++-- pkg/amqp-bunny/composer.json | 2 +- pkg/amqp-ext/composer.json | 2 +- pkg/amqp-lib/composer.json | 2 +- pkg/amqp-tools/composer.json | 2 +- pkg/enqueue-bundle/composer.json | 2 +- pkg/enqueue/composer.json | 2 +- pkg/rdkafka/composer.json | 2 +- pkg/simple-client/composer.json | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index a3c27ad9b..2fb2d97d5 100644 --- a/composer.json +++ b/composer.json @@ -22,8 +22,8 @@ "ext-mongodb": "^1.5", "ext-rdkafka": "^4.0|^5.0", - "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.8", + "queue-interop/amqp-interop": "^0.8.2", + "queue-interop/queue-interop": "^0.8.1", "bunny/bunny": "^0.2.4|^0.3|^0.4", "php-amqplib/php-amqplib": "^2.12.1", "doctrine/dbal": "^2.12", diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 9b8ed2dbb..c885c79ec 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "queue-interop/amqp-interop": "^0.8", + "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "bunny/bunny": "^0.4", "enqueue/amqp-tools": "^0.10" diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 758f1ab64..91c572a25 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "ext-amqp": "^1.9.3", - "queue-interop/amqp-interop": "^0.8", + "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" }, diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index caa903108..3aaaa5bf5 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "php-amqplib/php-amqplib": "^2.12.1", - "queue-interop/amqp-interop": "^0.8", + "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" }, diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index cdb2321fd..ccc282006 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "queue-interop/amqp-interop": "^0.8", + "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10" }, diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index d643b8a30..0d8ff66c2 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "symfony/framework-bundle": "^4.3|^5", - "queue-interop/amqp-interop": "^0.8", + "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10" diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 09822cf97..8ff51a47a 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "queue-interop/amqp-interop": "^0.8", + "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/null": "^0.10", "enqueue/dsn": "^0.10", diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 72c5535a8..82c5367fe 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "ext-rdkafka": "^4.0|^5.0", - "queue-interop/queue-interop": "^0.8" + "queue-interop/queue-interop": "^0.8.1" }, "require-dev": { "phpunit/phpunit": "^9.5", diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 6b277c6ad..02e8a93f7 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", - "queue-interop/amqp-interop": "^0.8", + "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "symfony/config": "^4.3|^5" }, From a4b56578b8212772853b9eca568fa9b89b9735fa Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 23:23:46 +0200 Subject: [PATCH 0948/1142] Fix hanging wamp tests with lowest deps --- composer.json | 9 +++++++-- pkg/wamp/composer.json | 13 +++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 2fb2d97d5..6766d0dd4 100644 --- a/composer.json +++ b/composer.json @@ -42,13 +42,18 @@ "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "^2.1.1", "predis/predis": "^1.1", - "thruway/client": "^0.5.0", + "thruway/client": "^0.5.4", "thruway/pawl-transport": "^0.5.0", "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", "guzzlehttp/guzzle": "^7.0.1", "php-http/discovery": "^1.13", - "voryx/thruway-common": "^1.0.1" + "voryx/thruway-common": "^1.0.1", + "react/event-loop": "^1.0", + "react/stream": "^1.0", + "react/cache": "^1.0", + "react/dns": "^1.0", + "react/socket": "^1.0" }, "require-dev": { "ext-pcntl": "*", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 3b93d281f..97072bb72 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -7,11 +7,16 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "queue-interop/queue-interop": "^0.8", - "enqueue/dsn": "^0.10", - "thruway/client": "^0.5.0", + "queue-interop/queue-interop": "^0.8.1", + "enqueue/dsn": "^0.10.8", + "thruway/client": "^0.5.4", "thruway/pawl-transport": "^0.5.0", - "voryx/thruway-common": "^1.0.1" + "voryx/thruway-common": "^1.0.1", + "react/event-loop": "^1.0", + "react/stream": "^1.0", + "react/cache": "^1.0", + "react/dns": "^1.0", + "react/socket": "^1.0" }, "require-dev": { "phpunit/phpunit": "^9.5", From 126cf1516d677828aaf6ab7c26d379c40e25b387 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 17 Feb 2021 23:30:21 +0200 Subject: [PATCH 0949/1142] Fix bunny on php 8 --- composer.json | 2 +- pkg/amqp-bunny/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 6766d0dd4..7c70e513e 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8.1", - "bunny/bunny": "^0.2.4|^0.3|^0.4", + "bunny/bunny": "^0.4|^0.5", "php-amqplib/php-amqplib": "^2.12.1", "doctrine/dbal": "^2.12", "ramsey/uuid": "^3.5|^4", diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index c885c79ec..6efe7ee84 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -9,7 +9,7 @@ "php": "^7.3|^8.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", - "bunny/bunny": "^0.4", + "bunny/bunny": "^0.4|^0.5", "enqueue/amqp-tools": "^0.10" }, "require-dev": { From 956b73a5cae3a2997fa171fbcfaecd9497248e1c Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 18 Feb 2021 11:38:52 +0200 Subject: [PATCH 0950/1142] Fix hanging wamp tests --- composer.json | 9 +++------ pkg/wamp/composer.json | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 7c70e513e..53feff10f 100644 --- a/composer.json +++ b/composer.json @@ -42,18 +42,15 @@ "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "^2.1.1", "predis/predis": "^1.1", - "thruway/client": "^0.5.4", - "thruway/pawl-transport": "^0.5.0", + "thruway/client": "^0.5", + "thruway/pawl-transport": "^0.5.1", "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", "guzzlehttp/guzzle": "^7.0.1", "php-http/discovery": "^1.13", "voryx/thruway-common": "^1.0.1", - "react/event-loop": "^1.0", - "react/stream": "^1.0", - "react/cache": "^1.0", "react/dns": "^1.0", - "react/socket": "^1.0" + "react/event-loop": "^1.0" }, "require-dev": { "ext-pcntl": "*", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 97072bb72..6dd4a6aa0 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -9,14 +9,11 @@ "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8.1", "enqueue/dsn": "^0.10.8", - "thruway/client": "^0.5.4", - "thruway/pawl-transport": "^0.5.0", + "thruway/client": "^0.5", + "thruway/pawl-transport": "^0.5.1", "voryx/thruway-common": "^1.0.1", - "react/event-loop": "^1.0", - "react/stream": "^1.0", - "react/cache": "^1.0", "react/dns": "^1.0", - "react/socket": "^1.0" + "react/event-loop": "^1.0" }, "require-dev": { "phpunit/phpunit": "^9.5", From 594e5161e4b03aa4e25343c550714f5819083ccb Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 18 Feb 2021 12:12:33 +0200 Subject: [PATCH 0951/1142] Drop EOL Symfony versions --- .github/workflows/ci.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee5f93d7d..e8b107bd9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,15 +65,11 @@ jobs: fail-fast: false matrix: php: ['7.3', '7.4', '8.0'] - symfony_version: ['4.3.*', '4.4.*', '5.0.*', '5.2.*'] + symfony_version: ['4.4.*', '5.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: - - php: '8.0' - symfony_version: '4.3.*' - php: '8.0' symfony_version: '4.4.*' - - php: '8.0' - symfony_version: '5.0.*' name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} @@ -113,14 +109,12 @@ jobs: fail-fast: false matrix: php: ['7.3', '8.0'] # same as in the container - symfony_version: ['4.3.*', '5.0.*', '5.2.*'] + symfony_version: ['4.4.*', '5.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] rdkafka_action: ['exclude-group', 'group'] exclude: - php: '8.0' - symfony_version: '4.3.*' - - php: '8.0' - symfony_version: '5.0.*' + symfony_version: '4.4.*' name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, rdkafka_action=${{ matrix.rdkafka_action }}, deps=${{ matrix.dependencies }} From 47b4032642da06a872491ce170a6b906ebf19239 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 18 Feb 2021 12:56:56 +0200 Subject: [PATCH 0952/1142] Fix cache on one of the non-test steps --- .github/workflows/ci.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e8b107bd9..fe696eda4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,6 +43,18 @@ jobs: PATTERNS: | pkg/**/*.php + - name: Get Composer Cache Directory + id: composer-cache + run: | + echo "::set-output name=dir::$(composer config cache-files-dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-cs-check-${{ hashFiles('**/composer.json') }} + restore-keys: | + composer-cs-check- + - uses: shivammathur/setup-php@v2 with: php-version: '7.4' @@ -52,7 +64,7 @@ jobs: - run: php ./bin/fix-symfony-version.php "5.2.*" - - uses: "ramsey/composer-install@v1" + - run: composer update --no-progress - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php From 1160afeae288afd3de9962fb63e90c281ef8ff90 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 18 Feb 2021 13:16:03 +0200 Subject: [PATCH 0953/1142] Retrigger CI From b95c8695e6d2f5cdc00879d023531e0ec420b039 Mon Sep 17 00:00:00 2001 From: Eugene Kirdzei Date: Wed, 17 Mar 2021 17:29:02 +0300 Subject: [PATCH 0954/1142] Upgrade php-amqplib --- pkg/amqp-lib/Tests/AmqpConsumerTest.php | 8 +++++--- pkg/amqp-lib/Tests/AmqpProducerTest.php | 5 ++++- pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php | 5 ++++- pkg/amqp-lib/composer.json | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/pkg/amqp-lib/Tests/AmqpConsumerTest.php b/pkg/amqp-lib/Tests/AmqpConsumerTest.php index 16b59227c..2bd637d94 100644 --- a/pkg/amqp-lib/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-lib/Tests/AmqpConsumerTest.php @@ -27,9 +27,11 @@ public function testShouldImplementConsumerInterface() public function testCouldBeConstructedWithContextAndQueueAsArguments() { - new AmqpConsumer( - $this->createContextMock(), - new AmqpQueue('aName') + self::assertInstanceOf(AmqpConsumer::class, + new AmqpConsumer( + $this->createContextMock(), + new AmqpQueue('aName') + ) ); } diff --git a/pkg/amqp-lib/Tests/AmqpProducerTest.php b/pkg/amqp-lib/Tests/AmqpProducerTest.php index 0bce53361..5746d911a 100644 --- a/pkg/amqp-lib/Tests/AmqpProducerTest.php +++ b/pkg/amqp-lib/Tests/AmqpProducerTest.php @@ -25,7 +25,10 @@ class AmqpProducerTest extends TestCase public function testCouldBeConstructedWithRequiredArguments() { - new AmqpProducer($this->createAmqpChannelMock(), $this->createContextMock()); + self::assertInstanceOf( + AmqpProducer::class, + new AmqpProducer($this->createAmqpChannelMock(), $this->createContextMock()) + ); } public function testShouldImplementProducerInterface() diff --git a/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php index a87349771..a375657b2 100644 --- a/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-lib/Tests/AmqpSubscriptionConsumerTest.php @@ -19,7 +19,10 @@ public function testShouldImplementSubscriptionConsumerInterface() public function testCouldBeConstructedWithAmqpContextAndHeartbeatOnTickAsArguments() { - new AmqpSubscriptionConsumer($this->createAmqpContextMock(), $heartbeatOnTick = true); + self::assertInstanceOf( + AmqpSubscriptionConsumer::class, + new AmqpSubscriptionConsumer($this->createAmqpContextMock(), $heartbeatOnTick = true) + ); } /** diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 3aaaa5bf5..9665a2cca 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "php-amqplib/php-amqplib": "^2.12.1", + "php-amqplib/php-amqplib": "^3.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" From 706a87f608b698c3d877f6a4ed0f18f09c964679 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 17 Mar 2021 18:22:16 +0200 Subject: [PATCH 0955/1142] fix dbal composer.json --- pkg/dbal/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 2e21bf936..8d48ff5dd 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -17,7 +17,7 @@ "enqueue/test": "0.10.x-dev", "enqueue/null": "0.10.x-dev", "queue-interop/queue-spec": "^0.6.2" - } + }, "support": { "email": "opensource@forma-pro.com", "issues": "https://github.com/php-enqueue/enqueue-dev/issues", From e74c80bbaa42b27987fdcf706eb685dcd05f1b6d Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 17 Mar 2021 18:22:22 +0200 Subject: [PATCH 0956/1142] sign release --- bin/release | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/release b/bin/release index c4179d307..dcd8674ca 100755 --- a/bin/release +++ b/bin/release @@ -18,7 +18,7 @@ rm ./CHANGELOG_FUTURE.md CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD` -git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRENT_BRANCH" +git add CHANGELOG.md && git commit -s -m "Release $1" -S && git push origin "$CURRENT_BRANCH" ./bin/subtree-split @@ -43,7 +43,7 @@ do if [[ -z "$LAST_RELEASE" ]]; then echo "There has not been any releases. Releasing $1"; - git tag $1 -s -m "Release $1" + git tag $1 -a -s -m "Release $1" git push origin --tags else echo "Last release $LAST_RELEASE"; @@ -53,7 +53,7 @@ do if [[ ! -z "$CHANGES_SINCE_LAST_RELEASE" ]]; then echo "There are changes since last release. Releasing $1"; - git tag $1 -s -m "Release $1" + git tag $1 -s -m "Release $1" git push origin --tags else echo "No change since last release."; From b57d0683168c6c923275c09f58133c47c3d78c33 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 17 Mar 2021 18:27:23 +0200 Subject: [PATCH 0957/1142] Release 0.10.9 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb8681935..240a507f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## [0.10.9](https://github.com/php-enqueue/enqueue-dev/tree/0.10.9) (2021-03-17) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.8...0.10.9) + +**Merged pull requests:** + +- Upgrade php-amqplib to v3.0 [\#1146](https://github.com/php-enqueue/enqueue-dev/pull/1146) ([masterjus](https://github.com/masterjus)) +- Split tests into different matrices; fix highest/lowest dependencies [\#1139](https://github.com/php-enqueue/enqueue-dev/pull/1139) ([andrewmy](https://github.com/andrewmy)) + ## [0.10.8](https://github.com/php-enqueue/enqueue-dev/tree/0.10.8) (2021-02-17) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.7...0.10.8) From e162b21c110b6f5480a9b4a8c18dc5d031fb26a8 Mon Sep 17 00:00:00 2001 From: Igor Paramonov Date: Thu, 18 Mar 2021 13:03:41 +0200 Subject: [PATCH 0958/1142] [sns] added possibility to define already existing topics (prevent create topic call) #1022 --- pkg/sns/SnsConnectionFactory.php | 11 ++++++--- pkg/sns/SnsContext.php | 5 ++-- .../Tests/SnsConnectionFactoryConfigTest.php | 24 +++++++++++++++++++ pkg/sns/Tests/SnsConnectionFactoryTest.php | 2 ++ 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index b3efd90d7..62e83a180 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -24,13 +24,14 @@ class SnsConnectionFactory implements ConnectionFactory /** * $config = [ - * 'key' => null AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. + * 'key' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. * 'secret' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. * 'token' => null, AWS credentials. If no credentials are provided, the SDK will attempt to load them from the environment. * 'region' => null, (string, required) Region to connect to. See http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of available regions. * 'version' => '2012-11-05', (string, required) The version of the webservice to utilize * 'lazy' => true, Enable lazy connection (boolean) - * 'endpoint' => null (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack + * 'endpoint' => null, (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack + * 'topic_arns' => [], (array) The list of existing topic arns * ]. * * or @@ -71,7 +72,7 @@ public function __construct($config = 'sns:') */ public function createContext(): Context { - return new SnsContext($this->establishConnection(), $this->config); + return new SnsContext($this->establishConnection(), $this->config, $this->config['topic_arns']); } private function establishConnection(): SnsClient @@ -132,6 +133,9 @@ private function parseDsn(string $dsn): array 'version' => $dsn->getString('version'), 'lazy' => $dsn->getBool('lazy'), 'endpoint' => $dsn->getString('endpoint'), + 'topic_arns' => ($topicArns = $dsn->getString('topic_arns')) + ? array_filter(explode(',', $topicArns)) + : [], ]), function ($value) { return null !== $value; }); } @@ -145,6 +149,7 @@ private function defaultConfig(): array 'version' => '2010-03-31', 'lazy' => true, 'endpoint' => null, + 'topic_arns' => [], ]; } } diff --git a/pkg/sns/SnsContext.php b/pkg/sns/SnsContext.php index b489f8d57..669846426 100644 --- a/pkg/sns/SnsContext.php +++ b/pkg/sns/SnsContext.php @@ -31,12 +31,11 @@ class SnsContext implements Context private $topicArns; - public function __construct(SnsClient $client, array $config) + public function __construct(SnsClient $client, array $config, array $topicArns = []) { $this->client = $client; $this->config = $config; - - $this->topicArns = []; + $this->topicArns = $topicArns; } /** diff --git a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php index 5dd3a2baa..ad01ee808 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php @@ -64,6 +64,7 @@ public static function provideConfigs() 'version' => '2010-03-31', 'lazy' => true, 'endpoint' => null, + 'topic_arns' => [], ], ]; @@ -77,6 +78,7 @@ public static function provideConfigs() 'version' => '2010-03-31', 'lazy' => true, 'endpoint' => null, + 'topic_arns' => [], ], ]; @@ -90,6 +92,7 @@ public static function provideConfigs() 'version' => '2010-03-31', 'lazy' => true, 'endpoint' => null, + 'topic_arns' => [], ], ]; @@ -103,6 +106,7 @@ public static function provideConfigs() 'version' => '2010-03-31', 'lazy' => false, 'endpoint' => null, + 'topic_arns' => [], ], ]; @@ -116,6 +120,7 @@ public static function provideConfigs() 'version' => '2010-03-31', 'lazy' => false, 'endpoint' => null, + 'topic_arns' => [], ], ]; @@ -129,6 +134,7 @@ public static function provideConfigs() 'version' => '2010-03-31', 'lazy' => false, 'endpoint' => null, + 'topic_arns' => [], ], ]; @@ -148,6 +154,24 @@ public static function provideConfigs() 'version' => '2010-03-31', 'lazy' => false, 'endpoint' => 'http://localstack:1111/', + 'topic_arns' => [], + ], + ]; + + yield [ + ['dsn' => 'sns:?topic_arns=arn:aws:sns:us-east-1:123456789012:topic1,arn:aws:sns:us-west-2:123456789012:topic2'], + [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => true, + 'endpoint' => null, + 'topic_arns' => [ + 'arn:aws:sns:us-east-1:123456789012:topic1', + 'arn:aws:sns:us-west-2:123456789012:topic2', + ], ], ]; } diff --git a/pkg/sns/Tests/SnsConnectionFactoryTest.php b/pkg/sns/Tests/SnsConnectionFactoryTest.php index 37fe6043a..5cc8f197b 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryTest.php @@ -33,6 +33,7 @@ public function testCouldBeConstructedWithEmptyConfiguration() 'region' => null, 'version' => '2010-03-31', 'endpoint' => null, + 'topic_arns' => [], ], 'config', $factory); } @@ -48,6 +49,7 @@ public function testCouldBeConstructedWithCustomConfiguration() 'region' => null, 'version' => '2010-03-31', 'endpoint' => null, + 'topic_arns' => [], ], 'config', $factory); } From 9730b80b6cd0dbdb68ce353a75c16c3a0dbfe35b Mon Sep 17 00:00:00 2001 From: Igor Paramonov Date: Thu, 18 Mar 2021 13:38:14 +0200 Subject: [PATCH 0959/1142] [sns] fixed topic arns parse --- pkg/sns/SnsConnectionFactory.php | 27 ++++++++++++++++--- .../Tests/SnsConnectionFactoryConfigTest.php | 6 ++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index 62e83a180..f8ebd7504 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -60,6 +60,9 @@ public function __construct($config = 'sns:') unset($config['dsn']); } + if (\array_key_exists('topic_arns', $config) && \is_string($config['topic_arns'])) { + $config['topic_arns'] = $this->extractTopicArns($config['topic_arns']); + } } else { throw new \LogicException(\sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSnsClient::class)); } @@ -133,12 +136,30 @@ private function parseDsn(string $dsn): array 'version' => $dsn->getString('version'), 'lazy' => $dsn->getBool('lazy'), 'endpoint' => $dsn->getString('endpoint'), - 'topic_arns' => ($topicArns = $dsn->getString('topic_arns')) - ? array_filter(explode(',', $topicArns)) - : [], + 'topic_arns' => $this->extractTopicArns($dsn->getString('topic_arns')), ]), function ($value) { return null !== $value; }); } + private function extractTopicArns(?string $topicArns): array + { + if (!$topicArns) { + return []; + } + + return array_column( + array_map(function ($topic) { + list ($name, $arn) = explode('|', $topic); + + return [ + 'name' => $name, + 'arn' => $arn, + ]; + }, explode(';', $topicArns)), + 'arn', + 'name' + ); + } + private function defaultConfig(): array { return [ diff --git a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php index ad01ee808..e9b814202 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php @@ -159,7 +159,7 @@ public static function provideConfigs() ]; yield [ - ['dsn' => 'sns:?topic_arns=arn:aws:sns:us-east-1:123456789012:topic1,arn:aws:sns:us-west-2:123456789012:topic2'], + ['dsn' => 'sns:?topic_arns=topic1|arn:aws:sns:us-east-1:123456789012:topic1;topic2|arn:aws:sns:us-west-2:123456789012:topic2'], [ 'key' => null, 'secret' => null, @@ -169,8 +169,8 @@ public static function provideConfigs() 'lazy' => true, 'endpoint' => null, 'topic_arns' => [ - 'arn:aws:sns:us-east-1:123456789012:topic1', - 'arn:aws:sns:us-west-2:123456789012:topic2', + 'topic1' => 'arn:aws:sns:us-east-1:123456789012:topic1', + 'topic2' => 'arn:aws:sns:us-west-2:123456789012:topic2', ], ], ]; From 5f0bd439c342115f36bf9d9a73c1bfae4b32f6ed Mon Sep 17 00:00:00 2001 From: Igor Paramonov Date: Thu, 18 Mar 2021 13:40:17 +0200 Subject: [PATCH 0960/1142] [sns] handled comments --- pkg/sns/SnsConnectionFactory.php | 4 ++-- pkg/sns/SnsContext.php | 4 ++-- pkg/sns/Tests/Spec/SnsContextTest.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index f8ebd7504..35575036a 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -75,7 +75,7 @@ public function __construct($config = 'sns:') */ public function createContext(): Context { - return new SnsContext($this->establishConnection(), $this->config, $this->config['topic_arns']); + return new SnsContext($this->establishConnection(), $this->config); } private function establishConnection(): SnsClient @@ -148,7 +148,7 @@ private function extractTopicArns(?string $topicArns): array return array_column( array_map(function ($topic) { - list ($name, $arn) = explode('|', $topic); + list($name, $arn) = explode('|', $topic); return [ 'name' => $name, diff --git a/pkg/sns/SnsContext.php b/pkg/sns/SnsContext.php index 669846426..aa00be1aa 100644 --- a/pkg/sns/SnsContext.php +++ b/pkg/sns/SnsContext.php @@ -31,11 +31,11 @@ class SnsContext implements Context private $topicArns; - public function __construct(SnsClient $client, array $config, array $topicArns = []) + public function __construct(SnsClient $client, array $config) { $this->client = $client; $this->config = $config; - $this->topicArns = $topicArns; + $this->topicArns = $config['topic_arns']; } /** diff --git a/pkg/sns/Tests/Spec/SnsContextTest.php b/pkg/sns/Tests/Spec/SnsContextTest.php index 631d4acf1..6713abad0 100644 --- a/pkg/sns/Tests/Spec/SnsContextTest.php +++ b/pkg/sns/Tests/Spec/SnsContextTest.php @@ -20,6 +20,6 @@ protected function createContext() { $client = $this->createMock(SnsClient::class); - return new SnsContext($client, []); + return new SnsContext($client, ['topic_arns' => []]); } } From 74ea3690d117515aaae69634a7e54b4296033cb9 Mon Sep 17 00:00:00 2001 From: Igor Paramonov Date: Thu, 18 Mar 2021 14:07:14 +0200 Subject: [PATCH 0961/1142] [sns] dummy commit, retry tests --- pkg/sns/SnsConnectionFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index 35575036a..76d6ffb91 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -31,7 +31,7 @@ class SnsConnectionFactory implements ConnectionFactory * 'version' => '2012-11-05', (string, required) The version of the webservice to utilize * 'lazy' => true, Enable lazy connection (boolean) * 'endpoint' => null, (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack - * 'topic_arns' => [], (array) The list of existing topic arns + * 'topic_arns' => [], (array) The list of existing topic arns * ]. * * or From daf511c9a335f900b9a9266c81955e6c63a78500 Mon Sep 17 00:00:00 2001 From: Igor Paramonov Date: Thu, 18 Mar 2021 14:47:24 +0200 Subject: [PATCH 0962/1142] [sns] replaced custom parsing by dsn --- pkg/sns/SnsConnectionFactory.php | 22 +------------------ .../Tests/SnsConnectionFactoryConfigTest.php | 2 +- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index 76d6ffb91..81d856b2a 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -136,30 +136,10 @@ private function parseDsn(string $dsn): array 'version' => $dsn->getString('version'), 'lazy' => $dsn->getBool('lazy'), 'endpoint' => $dsn->getString('endpoint'), - 'topic_arns' => $this->extractTopicArns($dsn->getString('topic_arns')), + 'topic_arns' => $dsn->getArray('topic_arns', [])->toArray(), ]), function ($value) { return null !== $value; }); } - private function extractTopicArns(?string $topicArns): array - { - if (!$topicArns) { - return []; - } - - return array_column( - array_map(function ($topic) { - list($name, $arn) = explode('|', $topic); - - return [ - 'name' => $name, - 'arn' => $arn, - ]; - }, explode(';', $topicArns)), - 'arn', - 'name' - ); - } - private function defaultConfig(): array { return [ diff --git a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php index e9b814202..51983b126 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php @@ -159,7 +159,7 @@ public static function provideConfigs() ]; yield [ - ['dsn' => 'sns:?topic_arns=topic1|arn:aws:sns:us-east-1:123456789012:topic1;topic2|arn:aws:sns:us-west-2:123456789012:topic2'], + ['dsn' => 'sns:?topic_arns[topic1]=arn:aws:sns:us-east-1:123456789012:topic1&topic_arns[topic2]=arn:aws:sns:us-west-2:123456789012:topic2'], [ 'key' => null, 'secret' => null, From 5b892110ac784f4836d19c019326a37356d45450 Mon Sep 17 00:00:00 2001 From: Igor Paramonov Date: Thu, 18 Mar 2021 15:38:47 +0200 Subject: [PATCH 0963/1142] [sns] replaced custom parsing by dsn --- pkg/sns/SnsConnectionFactory.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index 81d856b2a..b1b050ec7 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -60,9 +60,6 @@ public function __construct($config = 'sns:') unset($config['dsn']); } - if (\array_key_exists('topic_arns', $config) && \is_string($config['topic_arns'])) { - $config['topic_arns'] = $this->extractTopicArns($config['topic_arns']); - } } else { throw new \LogicException(\sprintf('The config must be either an array of options, a DSN string, null or instance of %s', AwsSnsClient::class)); } From ef7b5c7e3cc07a6b7baa581e6af979baafbb5de7 Mon Sep 17 00:00:00 2001 From: Igor Paramonov Date: Thu, 18 Mar 2021 15:49:21 +0200 Subject: [PATCH 0964/1142] [sns] another dummy commit - trigger rebuild --- pkg/sns/SnsConnectionFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index b1b050ec7..67903ba22 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -31,7 +31,7 @@ class SnsConnectionFactory implements ConnectionFactory * 'version' => '2012-11-05', (string, required) The version of the webservice to utilize * 'lazy' => true, Enable lazy connection (boolean) * 'endpoint' => null, (string, default=null) The full URI of the webservice. This is only required when connecting to a custom endpoint e.g. localstack - * 'topic_arns' => [], (array) The list of existing topic arns + * 'topic_arns' => [], (array) The list of existing topic arns: key - topic name; value - arn * ]. * * or From ffe8590e1ede73d54ca774328016ec91a184c675 Mon Sep 17 00:00:00 2001 From: Maciej Zgadzaj Date: Thu, 3 Dec 2020 11:55:16 +0100 Subject: [PATCH 0965/1142] [gps] Add support for consuming message from external publisher in non-standard format --- pkg/gps/GpsMessage.php | 10 +++------- pkg/gps/Tests/GpsMessageTest.php | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/pkg/gps/GpsMessage.php b/pkg/gps/GpsMessage.php index 5e83e078c..b4a11dc5a 100644 --- a/pkg/gps/GpsMessage.php +++ b/pkg/gps/GpsMessage.php @@ -157,15 +157,11 @@ public function jsonSerialize(): array public static function jsonUnserialize(string $json): self { $data = json_decode($json, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } - return new self($data['body'], $data['properties'], $data['headers']); + return new self($data['body'] ?? $json, $data['properties'] ?? [], $data['headers'] ?? []); } public function getNativeMessage(): ?GoogleMessage diff --git a/pkg/gps/Tests/GpsMessageTest.php b/pkg/gps/Tests/GpsMessageTest.php index d84cd99d9..a43a22315 100644 --- a/pkg/gps/Tests/GpsMessageTest.php +++ b/pkg/gps/Tests/GpsMessageTest.php @@ -38,6 +38,31 @@ public function testCouldBeUnserializedFromJson() $this->assertEquals($message, $unserializedMessage); } + public function testMessageEntityCouldBeUnserializedFromJson() + { + $json = '{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"}}'; + + $unserializedMessage = GpsMessage::jsonUnserialize($json); + + $this->assertInstanceOf(GpsMessage::class, $unserializedMessage); + $decoded = json_decode($json, true); + $this->assertEquals($decoded['body'], $unserializedMessage->getBody()); + $this->assertEquals($decoded['properties'], $unserializedMessage->getProperties()); + $this->assertEquals($decoded['headers'], $unserializedMessage->getHeaders()); + } + + public function testMessagePayloadCouldBeUnserializedFromJson() + { + $json = '{"theBodyPropFoo":"theBodyPropVal"}'; + + $unserializedMessage = GpsMessage::jsonUnserialize($json); + + $this->assertInstanceOf(GpsMessage::class, $unserializedMessage); + $this->assertEquals($json, $unserializedMessage->getBody()); + $this->assertEquals([], $unserializedMessage->getProperties()); + $this->assertEquals([], $unserializedMessage->getHeaders()); + } + public function testThrowIfMalformedJsonGivenOnUnsterilizedFromJson() { $this->expectException(\InvalidArgumentException::class); From 70e59d03e02e83a44bab020155b1362de78b1c8f Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 24 Mar 2021 07:11:55 +0200 Subject: [PATCH 0966/1142] Release 0.10.10 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 240a507f2..954463ec9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## [0.10.10](https://github.com/php-enqueue/enqueue-dev/tree/0.10.10) (2021-03-24) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.9...0.10.10) + +**Merged pull requests:** + +- \[sns\] added possibility to define already existing topics \(prevent create topic call\) \#1022 [\#1147](https://github.com/php-enqueue/enqueue-dev/pull/1147) ([paramonov](https://github.com/paramonov)) +- \[gps\] Add support for consuming message from external publisher in non-standard format [\#1118](https://github.com/php-enqueue/enqueue-dev/pull/1118) ([maciejzgadzaj](https://github.com/maciejzgadzaj)) + ## [0.10.9](https://github.com/php-enqueue/enqueue-dev/tree/0.10.9) (2021-03-17) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.8...0.10.9) From c0937950d5bbda00f3930d20fd9f9b005a512ca7 Mon Sep 17 00:00:00 2001 From: Bartosz F Date: Wed, 24 Mar 2021 08:16:19 +0100 Subject: [PATCH 0967/1142] fallback for not breaking BC --- pkg/sns/SnsContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sns/SnsContext.php b/pkg/sns/SnsContext.php index aa00be1aa..454a5ddb5 100644 --- a/pkg/sns/SnsContext.php +++ b/pkg/sns/SnsContext.php @@ -35,7 +35,7 @@ public function __construct(SnsClient $client, array $config) { $this->client = $client; $this->config = $config; - $this->topicArns = $config['topic_arns']; + $this->topicArns = $config['topic_arns'] ?? []; } /** From 30067d734b737d2289f48a729982b92801d29f64 Mon Sep 17 00:00:00 2001 From: GothShoot <34012335+GothShoot@users.noreply.github.com> Date: Thu, 25 Mar 2021 15:08:41 +0100 Subject: [PATCH 0968/1142] Try to change doctrine/orm version. --- pkg/job-queue/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 81c265f2f..2a41c1b92 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", - "doctrine/orm": "~2.7.4", + "doctrine/orm": "~2.7.4 | ^2.8", "doctrine/dbal": "^2.12" }, "require-dev": { From 6d2e58645977002136a0ff05df4c3a4f020f5821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cle=CC=81ment=20Turbelin?= Date: Fri, 2 Apr 2021 19:56:31 +0200 Subject: [PATCH 0969/1142] register worker callback only once, move to constructor --- pkg/gearman/GearmanConsumer.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/pkg/gearman/GearmanConsumer.php b/pkg/gearman/GearmanConsumer.php index 68f15e045..7c1dea0a1 100644 --- a/pkg/gearman/GearmanConsumer.php +++ b/pkg/gearman/GearmanConsumer.php @@ -25,12 +25,23 @@ class GearmanConsumer implements Consumer */ private $context; + /** + * Message content. + * + * @var mixed + */ + private $message; + public function __construct(GearmanContext $context, GearmanDestination $destination) { $this->context = $context; $this->destination = $destination; $this->worker = $context->createWorker(); + + $this->worker->addFunction($this->destination->getName(), function (\GearmanJob $job) { + $this->message = GearmanMessage::jsonUnserialize($job->workload()); + }); } /** @@ -53,18 +64,14 @@ public function receive(int $timeout = 0): ?Message $this->worker->setTimeout($timeout); try { - $message = null; - - $this->worker->addFunction($this->destination->getName(), function (\GearmanJob $job) use (&$message) { - $message = GearmanMessage::jsonUnserialize($job->workload()); - }); + $this->message = null; $this->worker->work(); } finally { restore_error_handler(); } - return $message; + return $this->message; } /** From d69f276da1d000c9cc4ce192f523151de1cc1de9 Mon Sep 17 00:00:00 2001 From: Henning Date: Wed, 21 Apr 2021 09:01:11 +0200 Subject: [PATCH 0970/1142] add subscription_interval as config for dbal subscription consumer --- pkg/dbal/DbalContext.php | 5 +++++ pkg/dbal/DbalSubscriptionConsumer.php | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index c775efc02..ce164ee27 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -46,6 +46,7 @@ public function __construct($connection, array $config = []) $this->config = array_replace([ 'table_name' => 'enqueue', 'polling_interval' => null, + 'subscription_interval' => null, ], $config); if ($connection instanceof Connection) { @@ -135,6 +136,10 @@ public function createSubscriptionConsumer(): SubscriptionConsumer $consumer->setRedeliveryDelay($this->config['redelivery_delay']); } + if (isset($this->config['subscription_interval'])) { + $consumer->setSubscriptionInterval($this->config['subscription_interval']); + } + return $consumer; } diff --git a/pkg/dbal/DbalSubscriptionConsumer.php b/pkg/dbal/DbalSubscriptionConsumer.php index 60d30cc7e..999679fc6 100644 --- a/pkg/dbal/DbalSubscriptionConsumer.php +++ b/pkg/dbal/DbalSubscriptionConsumer.php @@ -36,6 +36,13 @@ class DbalSubscriptionConsumer implements SubscriptionConsumer */ private $redeliveryDelay; + /** + * Time to wait between subscription requests in milliseconds. + * + * @var int + */ + private $subscriptionInterval = 200; + /** * @param DbalContext $context */ @@ -63,6 +70,13 @@ public function setRedeliveryDelay(int $redeliveryDelay): self return $this; } + public function setSubscriptionInterval(int $subscriptionInterval): self + { + $this->subscriptionInterval = $subscriptionInterval; + + return $this; + } + public function consume(int $timeout = 0): void { if (empty($this->subscribers)) { @@ -92,7 +106,7 @@ public function consume(int $timeout = 0): void * @var DbalConsumer * @var callable $callback */ - list($consumer, $callback) = $this->subscribers[$message->getQueue()]; + [$consumer, $callback] = $this->subscribers[$message->getQueue()]; if (false === call_user_func($callback, $message, $consumer)) { return; @@ -102,7 +116,7 @@ public function consume(int $timeout = 0): void } else { $currentQueueNames = []; - usleep(200000); // 200ms + usleep($this->subscriptionInterval * 1000); // 200ms } if ($timeout && microtime(true) >= $now + $timeout) { From 2da878c014edbdf1264ce437196ae614724bff33 Mon Sep 17 00:00:00 2001 From: gdsmith Date: Thu, 22 Apr 2021 17:45:57 +0400 Subject: [PATCH 0971/1142] Add SqsConsumer methods to SnsQsConsumer --- pkg/snsqs/SnsQsConsumer.php | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pkg/snsqs/SnsQsConsumer.php b/pkg/snsqs/SnsQsConsumer.php index 82209896e..c285ad5df 100644 --- a/pkg/snsqs/SnsQsConsumer.php +++ b/pkg/snsqs/SnsQsConsumer.php @@ -35,6 +35,34 @@ public function __construct(SnsQsContext $context, SqsConsumer $consumer, SnsQsQ $this->queue = $queue; } + public function getVisibilityTimeout(): ?int + { + return $this->consumer->getVisibilityTimeout(); + } + + /** + * The duration (in seconds) that the received messages are hidden from subsequent retrieve + * requests after being retrieved by a ReceiveMessage request. + */ + public function setVisibilityTimeout(int $visibilityTimeout = null): void + { + $this->consumer->setVisibilityTimeout($visibilityTimeout); + } + + public function getMaxNumberOfMessages(): int + { + return $this->consumer->getMaxNumberOfMessages(); + } + + /** + * The maximum number of messages to return. Amazon SQS never returns more messages than this value + * (however, fewer messages might be returned). Valid values are 1 to 10. Default is 1. + */ + public function setMaxNumberOfMessages(int $maxNumberOfMessages): void + { + $this->consumer->setMaxNumberOfMessages($maxNumberOfMessages); + } + public function getQueue(): Queue { return $this->queue; From 7da4666c6c1f460c56bf8529676415a952499ba7 Mon Sep 17 00:00:00 2001 From: Dariusz Gafka Date: Fri, 23 Apr 2021 12:45:04 +0200 Subject: [PATCH 0972/1142] Fix dbal delivery delay to always keep integer --- pkg/dbal/DbalProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index 5435629eb..7cca161fe 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -111,7 +111,7 @@ public function send(Destination $destination, Message $message): void throw new \LogicException(sprintf('TimeToLive must be positive integer but got: "%s"', $timeToLive)); } - $dbalMessage['time_to_live'] = time() + (int) $timeToLive / 1000; + $dbalMessage['time_to_live'] = time() + (int) ($timeToLive / 1000); } try { From bc99baacbf7521420b04b62738cea06dd51d56a7 Mon Sep 17 00:00:00 2001 From: Henning Date: Wed, 28 Apr 2021 09:14:29 +0200 Subject: [PATCH 0973/1142] change option name --- pkg/dbal/DbalContext.php | 18 +++++------------- pkg/dbal/DbalSubscriptionConsumer.php | 16 +++++++++------- pkg/dbal/Tests/DbalContextTest.php | 3 +++ 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index ce164ee27..5fdf6b59e 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -39,14 +39,13 @@ class DbalContext implements Context * Callable must return instance of Doctrine\DBAL\Connection once called. * * @param Connection|callable $connection - * @param array $config */ public function __construct($connection, array $config = []) { $this->config = array_replace([ 'table_name' => 'enqueue', 'polling_interval' => null, - 'subscription_interval' => null, + 'subscription_polling_interval' => null, ], $config); if ($connection instanceof Connection) { @@ -54,11 +53,7 @@ public function __construct($connection, array $config = []) } elseif (is_callable($connection)) { $this->connectionFactory = $connection; } else { - throw new \InvalidArgumentException(sprintf( - 'The connection argument must be either %s or callable that returns %s.', - Connection::class, - Connection::class - )); + throw new \InvalidArgumentException(sprintf('The connection argument must be either %s or callable that returns %s.', Connection::class, Connection::class)); } } @@ -136,8 +131,8 @@ public function createSubscriptionConsumer(): SubscriptionConsumer $consumer->setRedeliveryDelay($this->config['redelivery_delay']); } - if (isset($this->config['subscription_interval'])) { - $consumer->setSubscriptionInterval($this->config['subscription_interval']); + if (isset($this->config['subscription_polling_interval'])) { + $consumer->setPollingInterval($this->config['subscription_polling_interval']); } return $consumer; @@ -207,10 +202,7 @@ public function getDbalConnection(): Connection if (false == $this->connection) { $connection = call_user_func($this->connectionFactory); if (false == $connection instanceof Connection) { - throw new \LogicException(sprintf( - 'The factory must return instance of Doctrine\DBAL\Connection. It returns %s', - is_object($connection) ? get_class($connection) : gettype($connection) - )); + throw new \LogicException(sprintf('The factory must return instance of Doctrine\DBAL\Connection. It returns %s', is_object($connection) ? get_class($connection) : gettype($connection))); } $this->connection = $connection; diff --git a/pkg/dbal/DbalSubscriptionConsumer.php b/pkg/dbal/DbalSubscriptionConsumer.php index 999679fc6..2551043e3 100644 --- a/pkg/dbal/DbalSubscriptionConsumer.php +++ b/pkg/dbal/DbalSubscriptionConsumer.php @@ -41,11 +41,8 @@ class DbalSubscriptionConsumer implements SubscriptionConsumer * * @var int */ - private $subscriptionInterval = 200; + private $pollingInterval = 200; - /** - * @param DbalContext $context - */ public function __construct(DbalContext $context) { $this->context = $context; @@ -70,9 +67,14 @@ public function setRedeliveryDelay(int $redeliveryDelay): self return $this; } - public function setSubscriptionInterval(int $subscriptionInterval): self + public function getPollingInterval(): int + { + return $this->pollingInterval; + } + + public function setPollingInterval(int $msec): self { - $this->subscriptionInterval = $subscriptionInterval; + $this->pollingInterval = $msec; return $this; } @@ -116,7 +118,7 @@ public function consume(int $timeout = 0): void } else { $currentQueueNames = []; - usleep($this->subscriptionInterval * 1000); // 200ms + usleep($this->getPollingInterval() * 1000); } if ($timeout && microtime(true) >= $now + $timeout) { diff --git a/pkg/dbal/Tests/DbalContextTest.php b/pkg/dbal/Tests/DbalContextTest.php index 0b793e6e7..12a13b21a 100644 --- a/pkg/dbal/Tests/DbalContextTest.php +++ b/pkg/dbal/Tests/DbalContextTest.php @@ -39,6 +39,7 @@ public function testCouldBeConstructedWithEmptyConfiguration() $this->assertAttributeEquals([ 'table_name' => 'enqueue', 'polling_interval' => null, + 'subscription_polling_interval' => null, ], 'config', $factory); } @@ -47,11 +48,13 @@ public function testCouldBeConstructedWithCustomConfiguration() $factory = new DbalContext($this->createConnectionMock(), [ 'table_name' => 'theTableName', 'polling_interval' => 12345, + 'subscription_polling_interval' => 12345, ]); $this->assertAttributeEquals([ 'table_name' => 'theTableName', 'polling_interval' => 12345, + 'subscription_polling_interval' => 12345, ], 'config', $factory); } From d4f8face05873ac4a1339a63fbf02870ac649c28 Mon Sep 17 00:00:00 2001 From: Dariusz Gafka Date: Wed, 28 Apr 2021 18:08:32 +0200 Subject: [PATCH 0974/1142] Fix phpcs --- pkg/dbal/DbalProducer.php | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index 7cca161fe..c316272ed 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -35,9 +35,6 @@ class DbalProducer implements Producer */ private $context; - /** - * @param DbalContext $context - */ public function __construct(DbalContext $context) { $this->context = $context; @@ -85,10 +82,7 @@ public function send(Destination $destination, Message $message): void $delay = $message->getDeliveryDelay(); if ($delay) { if (!is_int($delay)) { - throw new \LogicException(sprintf( - 'Delay must be integer but got: "%s"', - is_object($delay) ? get_class($delay) : gettype($delay) - )); + throw new \LogicException(sprintf('Delay must be integer but got: "%s"', is_object($delay) ? get_class($delay) : gettype($delay))); } if ($delay <= 0) { @@ -101,10 +95,7 @@ public function send(Destination $destination, Message $message): void $timeToLive = $message->getTimeToLive(); if ($timeToLive) { if (!is_int($timeToLive)) { - throw new \LogicException(sprintf( - 'TimeToLive must be integer but got: "%s"', - is_object($timeToLive) ? get_class($timeToLive) : gettype($timeToLive) - )); + throw new \LogicException(sprintf('TimeToLive must be integer but got: "%s"', is_object($timeToLive) ? get_class($timeToLive) : gettype($timeToLive))); } if ($timeToLive <= 0) { From 58a792062fa3b3539740059167104010ebeac74f Mon Sep 17 00:00:00 2001 From: Dariusz Gafka Date: Wed, 28 Apr 2021 18:12:01 +0200 Subject: [PATCH 0975/1142] Perform atleast one delivery when rejecting with requeue --- pkg/dbal/DbalConsumer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/DbalConsumer.php b/pkg/dbal/DbalConsumer.php index 98d348996..f1f397441 100644 --- a/pkg/dbal/DbalConsumer.php +++ b/pkg/dbal/DbalConsumer.php @@ -100,14 +100,14 @@ public function reject(Message $message, bool $requeue = false): void { InvalidMessageException::assertMessageInstanceOf($message, DbalMessage::class); - $this->acknowledge($message); - if ($requeue) { $message = clone $message; $message->setRedelivered(false); $this->getContext()->createProducer()->send($this->queue, $message); } + + $this->acknowledge($message); } protected function getContext(): DbalContext From c035f4d554e462dadc56238ead877f8e708dd390 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 28 Apr 2021 20:42:39 +0300 Subject: [PATCH 0976/1142] Release 0.10.11 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 954463ec9..cf8ead19a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## [0.10.11](https://github.com/php-enqueue/enqueue-dev/tree/0.10.11) (2021-04-28) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.10...0.10.11) + +**Merged pull requests:** + +- Perform at least once delivery when rejecting with requeue [\#1165](https://github.com/php-enqueue/enqueue-dev/pull/1165) ([dgafka](https://github.com/dgafka)) +- Fix dbal delivery delay to always keep integer value [\#1161](https://github.com/php-enqueue/enqueue-dev/pull/1161) ([dgafka](https://github.com/dgafka)) +- Add SqsConsumer methods to SnsQsConsumer [\#1160](https://github.com/php-enqueue/enqueue-dev/pull/1160) ([gdsmith](https://github.com/gdsmith)) +- add subscription\_interval as config for dbal subscription consumer [\#1159](https://github.com/php-enqueue/enqueue-dev/pull/1159) ([mordilion](https://github.com/mordilion)) +- register worker callback only once, move to constructor [\#1157](https://github.com/php-enqueue/enqueue-dev/pull/1157) ([cturbelin](https://github.com/cturbelin)) +- Try to change doctrine/orm version for supporting 2.8 \(PHP 8 support\). [\#1155](https://github.com/php-enqueue/enqueue-dev/pull/1155) ([GothShoot](https://github.com/GothShoot)) +- sns context - fallback for not breaking BC with 10.10 previous versions [\#1149](https://github.com/php-enqueue/enqueue-dev/pull/1149) ([bafor](https://github.com/bafor)) + ## [0.10.10](https://github.com/php-enqueue/enqueue-dev/tree/0.10.10) (2021-03-24) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.9...0.10.10) From e2a8101412dd2df324bafa062a42d8a479ff8e73 Mon Sep 17 00:00:00 2001 From: Dariusz Gafka Date: Thu, 29 Apr 2021 18:09:44 +0200 Subject: [PATCH 0977/1142] Fix dbal delivery delay to always keep integer value --- pkg/dbal/DbalProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index c316272ed..e197b14c3 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -89,7 +89,7 @@ public function send(Destination $destination, Message $message): void throw new \LogicException(sprintf('Delay must be positive integer but got: "%s"', $delay)); } - $dbalMessage['delayed_until'] = time() + (int) $delay / 1000; + $dbalMessage['delayed_until'] = time() + (int) ($delay / 1000); } $timeToLive = $message->getTimeToLive(); From 50943d21f0d7b820298c60e191ac15307fc2a969 Mon Sep 17 00:00:00 2001 From: m3m0r7 Date: Sun, 2 May 2021 21:04:28 +0900 Subject: [PATCH 0978/1142] Support dbal v3 --- pkg/dbal/DbalConsumer.php | 1 + pkg/dbal/DbalConsumerHelperTrait.php | 23 +++++++++++------------ pkg/dbal/DbalContext.php | 27 +++++++++++++-------------- pkg/dbal/DbalProducer.php | 27 ++++++++++++++------------- pkg/dbal/DbalSubscriptionConsumer.php | 1 + pkg/dbal/DbalTypeResolverTrait.php | 23 +++++++++++++++++++++++ pkg/dbal/Tests/DbalConsumerTest.php | 8 +++++--- pkg/dbal/composer.json | 2 +- 8 files changed, 69 insertions(+), 43 deletions(-) create mode 100644 pkg/dbal/DbalTypeResolverTrait.php diff --git a/pkg/dbal/DbalConsumer.php b/pkg/dbal/DbalConsumer.php index f1f397441..6e4d25d81 100644 --- a/pkg/dbal/DbalConsumer.php +++ b/pkg/dbal/DbalConsumer.php @@ -15,6 +15,7 @@ class DbalConsumer implements Consumer { use ConsumerPollingTrait; use DbalConsumerHelperTrait; + use DbalTypeResolverTrait; /** * @var DbalContext diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 55ec77c00..ac913f928 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -6,7 +6,6 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\RetryableException; -use Doctrine\DBAL\Types\Type; use Ramsey\Uuid\Uuid; trait DbalConsumerHelperTrait @@ -39,7 +38,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->addOrderBy('priority', 'asc') ->addOrderBy('published_at', 'asc') ->setParameter('queues', $queues, Connection::PARAM_STR_ARRAY) - ->setParameter('delayedUntil', $now, Type::INTEGER) + ->setParameter('delayedUntil', $now, static::resolveDbalType('INTEGER')) ->setMaxResults(1); $update = $this->getConnection()->createQueryBuilder() @@ -48,8 +47,8 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->set('redeliver_after', ':redeliverAfter') ->andWhere('id = :messageId') ->andWhere('delivery_id IS NULL') - ->setParameter('deliveryId', $deliveryId, Type::GUID) - ->setParameter('redeliverAfter', $now + $redeliveryDelay, Type::BIGINT) + ->setParameter('deliveryId', $deliveryId, static::resolveDbalType('GUID')) + ->setParameter('redeliverAfter', $now + $redeliveryDelay, static::resolveDbalType('BIGINT')) ; while (microtime(true) < $endAt) { @@ -60,14 +59,14 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa } $update - ->setParameter('messageId', $result['id'], Type::GUID); + ->setParameter('messageId', $result['id'], static::resolveDbalType('GUID')); if ($update->execute()) { $deliveredMessage = $this->getConnection()->createQueryBuilder() ->select('*') ->from($this->getContext()->getTableName()) ->andWhere('delivery_id = :deliveryId') - ->setParameter('deliveryId', $deliveryId, Type::GUID) + ->setParameter('deliveryId', $deliveryId, static::resolveDbalType('GUID')) ->setMaxResults(1) ->execute() ->fetch(); @@ -103,9 +102,9 @@ protected function redeliverMessages(): void ->set('redelivered', ':redelivered') ->andWhere('redeliver_after < :now') ->andWhere('delivery_id IS NOT NULL') - ->setParameter(':now', time(), Type::BIGINT) - ->setParameter('deliveryId', null, Type::GUID) - ->setParameter('redelivered', true, Type::BOOLEAN) + ->setParameter(':now', time(), static::resolveDbalType('BIGINT')) + ->setParameter('deliveryId', null, static::resolveDbalType('GUID')) + ->setParameter('redelivered', true, static::resolveDbalType('BOOLEAN')) ; try { @@ -131,8 +130,8 @@ protected function removeExpiredMessages(): void ->andWhere('delivery_id IS NULL') ->andWhere('redelivered = :redelivered') - ->setParameter(':now', time(), Type::BIGINT) - ->setParameter('redelivered', false, Type::BOOLEAN) + ->setParameter(':now', time(), static::resolveDbalType('BIGINT')) + ->setParameter('redelivered', false, static::resolveDbalType('BOOLEAN')) ; try { @@ -153,7 +152,7 @@ private function deleteMessage(string $deliveryId): void $this->getConnection()->delete( $this->getContext()->getTableName(), ['delivery_id' => $deliveryId], - ['delivery_id' => Type::GUID] + ['delivery_id' => static::resolveDbalType('GUID')] ); } } diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 5fdf6b59e..263917466 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -6,7 +6,6 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Types\Type; use Interop\Queue\Consumer; use Interop\Queue\Context; use Interop\Queue\Destination; @@ -183,7 +182,7 @@ public function purgeQueue(Queue $queue): void $this->getDbalConnection()->delete( $this->getTableName(), ['queue' => $queue->getQueueName()], - ['queue' => Type::STRING] + ['queue' => static::resolveDbalType('STRING')] ); } @@ -221,18 +220,18 @@ public function createDataBaseTable(): void $table = new Table($this->getTableName()); - $table->addColumn('id', Type::GUID, ['length' => 16, 'fixed' => true]); - $table->addColumn('published_at', Type::BIGINT); - $table->addColumn('body', Type::TEXT, ['notnull' => false]); - $table->addColumn('headers', Type::TEXT, ['notnull' => false]); - $table->addColumn('properties', Type::TEXT, ['notnull' => false]); - $table->addColumn('redelivered', Type::BOOLEAN, ['notnull' => false]); - $table->addColumn('queue', Type::STRING); - $table->addColumn('priority', Type::SMALLINT, ['notnull' => false]); - $table->addColumn('delayed_until', Type::BIGINT, ['notnull' => false]); - $table->addColumn('time_to_live', Type::BIGINT, ['notnull' => false]); - $table->addColumn('delivery_id', Type::GUID, ['length' => 16, 'fixed' => true, 'notnull' => false]); - $table->addColumn('redeliver_after', Type::BIGINT, ['notnull' => false]); + $table->addColumn('id', static::resolveDbalType('GUID'), ['length' => 16, 'fixed' => true]); + $table->addColumn('published_at', static::resolveDbalType('BIGINT')); + $table->addColumn('body', static::resolveDbalType('TEXT'), ['notnull' => false]); + $table->addColumn('headers', static::resolveDbalType('TEXT'), ['notnull' => false]); + $table->addColumn('properties', static::resolveDbalType('TEXT'), ['notnull' => false]); + $table->addColumn('redelivered', static::resolveDbalType('BOOLEAN'), ['notnull' => false]); + $table->addColumn('queue', static::resolveDbalType('STRING')); + $table->addColumn('priority', static::resolveDbalType('SMALLINT'), ['notnull' => false]); + $table->addColumn('delayed_until', static::resolveDbalType('BIGINT'), ['notnull' => false]); + $table->addColumn('time_to_live', static::resolveDbalType('BIGINT'), ['notnull' => false]); + $table->addColumn('delivery_id', static::resolveDbalType('GUID'), ['length' => 16, 'fixed' => true, 'notnull' => false]); + $table->addColumn('redeliver_after', static::resolveDbalType('BIGINT'), ['notnull' => false]); $table->setPrimaryKey(['id']); $table->addIndex(['priority', 'published_at', 'queue', 'delivery_id', 'delayed_until', 'id']); diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index e197b14c3..31c733ecc 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -4,7 +4,6 @@ namespace Enqueue\Dbal; -use Doctrine\DBAL\Types\Type; use Interop\Queue\Destination; use Interop\Queue\Exception\Exception; use Interop\Queue\Exception\InvalidDestinationException; @@ -15,6 +14,8 @@ class DbalProducer implements Producer { + use DbalTypeResolverTrait; + /** * @var int|null */ @@ -107,18 +108,18 @@ public function send(Destination $destination, Message $message): void try { $rowsAffected = $this->context->getDbalConnection()->insert($this->context->getTableName(), $dbalMessage, [ - 'id' => Type::GUID, - 'published_at' => Type::INTEGER, - 'body' => Type::TEXT, - 'headers' => Type::TEXT, - 'properties' => Type::TEXT, - 'priority' => Type::SMALLINT, - 'queue' => Type::STRING, - 'time_to_live' => Type::INTEGER, - 'delayed_until' => Type::INTEGER, - 'redelivered' => Type::SMALLINT, - 'delivery_id' => Type::STRING, - 'redeliver_after' => Type::BIGINT, + 'id' => static::resolveDbalType('GUID'), + 'published_at' => static::resolveDbalType('INTEGER'), + 'body' => static::resolveDbalType('TEXT'), + 'headers' => static::resolveDbalType('TEXT'), + 'properties' => static::resolveDbalType('TEXT'), + 'priority' => static::resolveDbalType('SMALLINT'), + 'queue' => static::resolveDbalType('STRING'), + 'time_to_live' => static::resolveDbalType('INTEGER'), + 'delayed_until' => static::resolveDbalType('INTEGER'), + 'redelivered' => static::resolveDbalType('SMALLINT'), + 'delivery_id' => static::resolveDbalType('STRING'), + 'redeliver_after' => static::resolveDbalType('BIGINT'), ]); if (1 !== $rowsAffected) { diff --git a/pkg/dbal/DbalSubscriptionConsumer.php b/pkg/dbal/DbalSubscriptionConsumer.php index 2551043e3..78e2d75ed 100644 --- a/pkg/dbal/DbalSubscriptionConsumer.php +++ b/pkg/dbal/DbalSubscriptionConsumer.php @@ -11,6 +11,7 @@ class DbalSubscriptionConsumer implements SubscriptionConsumer { use DbalConsumerHelperTrait; + use DbalTypeResolverTrait; /** * @var DbalContext diff --git a/pkg/dbal/DbalTypeResolverTrait.php b/pkg/dbal/DbalTypeResolverTrait.php new file mode 100644 index 000000000..e44f274c8 --- /dev/null +++ b/pkg/dbal/DbalTypeResolverTrait.php @@ -0,0 +1,23 @@ +getConstant($typeName); + } +} diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index add41a1df..c98150257 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -5,12 +5,13 @@ namespace Enqueue\Dbal\Tests; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Types\Type; +use Doctrine\DBAL\Types\Types; use Enqueue\Dbal\DbalConsumer; use Enqueue\Dbal\DbalContext; use Enqueue\Dbal\DbalDestination; use Enqueue\Dbal\DbalMessage; use Enqueue\Dbal\DbalProducer; +use Enqueue\Dbal\DbalTypeResolverTrait; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Consumer; use Interop\Queue\Exception\InvalidMessageException; @@ -22,6 +23,7 @@ class DbalConsumerTest extends TestCase { use ClassExtensionTrait; + use DbalTypeResolverTrait; public function testShouldImplementConsumerInterface() { @@ -72,7 +74,7 @@ public function testShouldDeleteMessageOnAcknowledge() ->with( 'some-table-name', ['delivery_id' => $deliveryId->toString()], - ['delivery_id' => Type::GUID] + ['delivery_id' => static::resolveDbalType('GUID')] ) ; @@ -143,7 +145,7 @@ public function testShouldDeleteMessageFromQueueOnReject() ->with( 'some-table-name', ['delivery_id' => $deliveryId->toString()], - ['delivery_id' => Type::GUID] + ['delivery_id' => static::resolveDbalType('GUID')] ) ; diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 8d48ff5dd..950387387 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -8,7 +8,7 @@ "require": { "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", - "doctrine/dbal": "^2.12", + "doctrine/dbal": "^2.12|^3.1", "doctrine/persistence": "^1.3.3|^2.0", "ramsey/uuid": "^3.5|^4" }, From 39ef70e51bbd3a97705af23703764f9a98d913dc Mon Sep 17 00:00:00 2001 From: m3m0r7 Date: Sun, 2 May 2021 21:09:21 +0900 Subject: [PATCH 0979/1142] Update root composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 53feff10f..41b49cff6 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "queue-interop/queue-interop": "^0.8.1", "bunny/bunny": "^0.4|^0.5", "php-amqplib/php-amqplib": "^2.12.1", - "doctrine/dbal": "^2.12", + "doctrine/dbal": "^2.12|^3.1", "ramsey/uuid": "^3.5|^4", "psr/log": "^1.1", "psr/container": "^1", From 86a230ff0d8c92637111f6c77ae4915f476be280 Mon Sep 17 00:00:00 2001 From: m3m0r7 Date: Mon, 3 May 2021 08:28:08 +0900 Subject: [PATCH 0980/1142] Add DbalTypeResolverTrait into DbalContext class --- pkg/dbal/DbalContext.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 263917466..726d8a42d 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -19,6 +19,8 @@ class DbalContext implements Context { + use DbalTypeResolverTrait; + /** * @var Connection */ From 8a757dc3989e939faf8e42756698e01fce0ef596 Mon Sep 17 00:00:00 2001 From: m3m0r7 Date: Wed, 5 May 2021 10:02:39 +0900 Subject: [PATCH 0981/1142] Remove unused import --- pkg/dbal/Tests/DbalConsumerTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index c98150257..32a9b214b 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -5,7 +5,6 @@ namespace Enqueue\Dbal\Tests; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Types\Types; use Enqueue\Dbal\DbalConsumer; use Enqueue\Dbal\DbalContext; use Enqueue\Dbal\DbalDestination; From d07ff197db8c8aef3697db581265423c6bb358b8 Mon Sep 17 00:00:00 2001 From: m3m0r7 Date: Wed, 12 May 2021 22:01:36 +0900 Subject: [PATCH 0982/1142] Revert to master --- pkg/dbal/DbalConsumer.php | 1 - pkg/dbal/DbalConsumerHelperTrait.php | 23 +++++++++++---------- pkg/dbal/DbalContext.php | 29 +++++++++++++-------------- pkg/dbal/DbalProducer.php | 27 ++++++++++++------------- pkg/dbal/DbalSubscriptionConsumer.php | 1 - pkg/dbal/DbalTypeResolverTrait.php | 23 --------------------- pkg/dbal/Tests/DbalConsumerTest.php | 7 +++---- 7 files changed, 42 insertions(+), 69 deletions(-) delete mode 100644 pkg/dbal/DbalTypeResolverTrait.php diff --git a/pkg/dbal/DbalConsumer.php b/pkg/dbal/DbalConsumer.php index 6e4d25d81..f1f397441 100644 --- a/pkg/dbal/DbalConsumer.php +++ b/pkg/dbal/DbalConsumer.php @@ -15,7 +15,6 @@ class DbalConsumer implements Consumer { use ConsumerPollingTrait; use DbalConsumerHelperTrait; - use DbalTypeResolverTrait; /** * @var DbalContext diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index ac913f928..55ec77c00 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -6,6 +6,7 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\RetryableException; +use Doctrine\DBAL\Types\Type; use Ramsey\Uuid\Uuid; trait DbalConsumerHelperTrait @@ -38,7 +39,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->addOrderBy('priority', 'asc') ->addOrderBy('published_at', 'asc') ->setParameter('queues', $queues, Connection::PARAM_STR_ARRAY) - ->setParameter('delayedUntil', $now, static::resolveDbalType('INTEGER')) + ->setParameter('delayedUntil', $now, Type::INTEGER) ->setMaxResults(1); $update = $this->getConnection()->createQueryBuilder() @@ -47,8 +48,8 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->set('redeliver_after', ':redeliverAfter') ->andWhere('id = :messageId') ->andWhere('delivery_id IS NULL') - ->setParameter('deliveryId', $deliveryId, static::resolveDbalType('GUID')) - ->setParameter('redeliverAfter', $now + $redeliveryDelay, static::resolveDbalType('BIGINT')) + ->setParameter('deliveryId', $deliveryId, Type::GUID) + ->setParameter('redeliverAfter', $now + $redeliveryDelay, Type::BIGINT) ; while (microtime(true) < $endAt) { @@ -59,14 +60,14 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa } $update - ->setParameter('messageId', $result['id'], static::resolveDbalType('GUID')); + ->setParameter('messageId', $result['id'], Type::GUID); if ($update->execute()) { $deliveredMessage = $this->getConnection()->createQueryBuilder() ->select('*') ->from($this->getContext()->getTableName()) ->andWhere('delivery_id = :deliveryId') - ->setParameter('deliveryId', $deliveryId, static::resolveDbalType('GUID')) + ->setParameter('deliveryId', $deliveryId, Type::GUID) ->setMaxResults(1) ->execute() ->fetch(); @@ -102,9 +103,9 @@ protected function redeliverMessages(): void ->set('redelivered', ':redelivered') ->andWhere('redeliver_after < :now') ->andWhere('delivery_id IS NOT NULL') - ->setParameter(':now', time(), static::resolveDbalType('BIGINT')) - ->setParameter('deliveryId', null, static::resolveDbalType('GUID')) - ->setParameter('redelivered', true, static::resolveDbalType('BOOLEAN')) + ->setParameter(':now', time(), Type::BIGINT) + ->setParameter('deliveryId', null, Type::GUID) + ->setParameter('redelivered', true, Type::BOOLEAN) ; try { @@ -130,8 +131,8 @@ protected function removeExpiredMessages(): void ->andWhere('delivery_id IS NULL') ->andWhere('redelivered = :redelivered') - ->setParameter(':now', time(), static::resolveDbalType('BIGINT')) - ->setParameter('redelivered', false, static::resolveDbalType('BOOLEAN')) + ->setParameter(':now', time(), Type::BIGINT) + ->setParameter('redelivered', false, Type::BOOLEAN) ; try { @@ -152,7 +153,7 @@ private function deleteMessage(string $deliveryId): void $this->getConnection()->delete( $this->getContext()->getTableName(), ['delivery_id' => $deliveryId], - ['delivery_id' => static::resolveDbalType('GUID')] + ['delivery_id' => Type::GUID] ); } } diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 726d8a42d..5fdf6b59e 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -6,6 +6,7 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Schema\Table; +use Doctrine\DBAL\Types\Type; use Interop\Queue\Consumer; use Interop\Queue\Context; use Interop\Queue\Destination; @@ -19,8 +20,6 @@ class DbalContext implements Context { - use DbalTypeResolverTrait; - /** * @var Connection */ @@ -184,7 +183,7 @@ public function purgeQueue(Queue $queue): void $this->getDbalConnection()->delete( $this->getTableName(), ['queue' => $queue->getQueueName()], - ['queue' => static::resolveDbalType('STRING')] + ['queue' => Type::STRING] ); } @@ -222,18 +221,18 @@ public function createDataBaseTable(): void $table = new Table($this->getTableName()); - $table->addColumn('id', static::resolveDbalType('GUID'), ['length' => 16, 'fixed' => true]); - $table->addColumn('published_at', static::resolveDbalType('BIGINT')); - $table->addColumn('body', static::resolveDbalType('TEXT'), ['notnull' => false]); - $table->addColumn('headers', static::resolveDbalType('TEXT'), ['notnull' => false]); - $table->addColumn('properties', static::resolveDbalType('TEXT'), ['notnull' => false]); - $table->addColumn('redelivered', static::resolveDbalType('BOOLEAN'), ['notnull' => false]); - $table->addColumn('queue', static::resolveDbalType('STRING')); - $table->addColumn('priority', static::resolveDbalType('SMALLINT'), ['notnull' => false]); - $table->addColumn('delayed_until', static::resolveDbalType('BIGINT'), ['notnull' => false]); - $table->addColumn('time_to_live', static::resolveDbalType('BIGINT'), ['notnull' => false]); - $table->addColumn('delivery_id', static::resolveDbalType('GUID'), ['length' => 16, 'fixed' => true, 'notnull' => false]); - $table->addColumn('redeliver_after', static::resolveDbalType('BIGINT'), ['notnull' => false]); + $table->addColumn('id', Type::GUID, ['length' => 16, 'fixed' => true]); + $table->addColumn('published_at', Type::BIGINT); + $table->addColumn('body', Type::TEXT, ['notnull' => false]); + $table->addColumn('headers', Type::TEXT, ['notnull' => false]); + $table->addColumn('properties', Type::TEXT, ['notnull' => false]); + $table->addColumn('redelivered', Type::BOOLEAN, ['notnull' => false]); + $table->addColumn('queue', Type::STRING); + $table->addColumn('priority', Type::SMALLINT, ['notnull' => false]); + $table->addColumn('delayed_until', Type::BIGINT, ['notnull' => false]); + $table->addColumn('time_to_live', Type::BIGINT, ['notnull' => false]); + $table->addColumn('delivery_id', Type::GUID, ['length' => 16, 'fixed' => true, 'notnull' => false]); + $table->addColumn('redeliver_after', Type::BIGINT, ['notnull' => false]); $table->setPrimaryKey(['id']); $table->addIndex(['priority', 'published_at', 'queue', 'delivery_id', 'delayed_until', 'id']); diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index 31c733ecc..e197b14c3 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -4,6 +4,7 @@ namespace Enqueue\Dbal; +use Doctrine\DBAL\Types\Type; use Interop\Queue\Destination; use Interop\Queue\Exception\Exception; use Interop\Queue\Exception\InvalidDestinationException; @@ -14,8 +15,6 @@ class DbalProducer implements Producer { - use DbalTypeResolverTrait; - /** * @var int|null */ @@ -108,18 +107,18 @@ public function send(Destination $destination, Message $message): void try { $rowsAffected = $this->context->getDbalConnection()->insert($this->context->getTableName(), $dbalMessage, [ - 'id' => static::resolveDbalType('GUID'), - 'published_at' => static::resolveDbalType('INTEGER'), - 'body' => static::resolveDbalType('TEXT'), - 'headers' => static::resolveDbalType('TEXT'), - 'properties' => static::resolveDbalType('TEXT'), - 'priority' => static::resolveDbalType('SMALLINT'), - 'queue' => static::resolveDbalType('STRING'), - 'time_to_live' => static::resolveDbalType('INTEGER'), - 'delayed_until' => static::resolveDbalType('INTEGER'), - 'redelivered' => static::resolveDbalType('SMALLINT'), - 'delivery_id' => static::resolveDbalType('STRING'), - 'redeliver_after' => static::resolveDbalType('BIGINT'), + 'id' => Type::GUID, + 'published_at' => Type::INTEGER, + 'body' => Type::TEXT, + 'headers' => Type::TEXT, + 'properties' => Type::TEXT, + 'priority' => Type::SMALLINT, + 'queue' => Type::STRING, + 'time_to_live' => Type::INTEGER, + 'delayed_until' => Type::INTEGER, + 'redelivered' => Type::SMALLINT, + 'delivery_id' => Type::STRING, + 'redeliver_after' => Type::BIGINT, ]); if (1 !== $rowsAffected) { diff --git a/pkg/dbal/DbalSubscriptionConsumer.php b/pkg/dbal/DbalSubscriptionConsumer.php index 78e2d75ed..2551043e3 100644 --- a/pkg/dbal/DbalSubscriptionConsumer.php +++ b/pkg/dbal/DbalSubscriptionConsumer.php @@ -11,7 +11,6 @@ class DbalSubscriptionConsumer implements SubscriptionConsumer { use DbalConsumerHelperTrait; - use DbalTypeResolverTrait; /** * @var DbalContext diff --git a/pkg/dbal/DbalTypeResolverTrait.php b/pkg/dbal/DbalTypeResolverTrait.php deleted file mode 100644 index e44f274c8..000000000 --- a/pkg/dbal/DbalTypeResolverTrait.php +++ /dev/null @@ -1,23 +0,0 @@ -getConstant($typeName); - } -} diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index 32a9b214b..add41a1df 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -5,12 +5,12 @@ namespace Enqueue\Dbal\Tests; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; use Enqueue\Dbal\DbalConsumer; use Enqueue\Dbal\DbalContext; use Enqueue\Dbal\DbalDestination; use Enqueue\Dbal\DbalMessage; use Enqueue\Dbal\DbalProducer; -use Enqueue\Dbal\DbalTypeResolverTrait; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Consumer; use Interop\Queue\Exception\InvalidMessageException; @@ -22,7 +22,6 @@ class DbalConsumerTest extends TestCase { use ClassExtensionTrait; - use DbalTypeResolverTrait; public function testShouldImplementConsumerInterface() { @@ -73,7 +72,7 @@ public function testShouldDeleteMessageOnAcknowledge() ->with( 'some-table-name', ['delivery_id' => $deliveryId->toString()], - ['delivery_id' => static::resolveDbalType('GUID')] + ['delivery_id' => Type::GUID] ) ; @@ -144,7 +143,7 @@ public function testShouldDeleteMessageFromQueueOnReject() ->with( 'some-table-name', ['delivery_id' => $deliveryId->toString()], - ['delivery_id' => static::resolveDbalType('GUID')] + ['delivery_id' => Type::GUID] ) ; From c9f09f0fe2608781b3ab14379a4fc57604caa585 Mon Sep 17 00:00:00 2001 From: m3m0r7 Date: Wed, 12 May 2021 22:34:05 +0900 Subject: [PATCH 0983/1142] fix for review --- pkg/dbal/DbalConsumerHelperTrait.php | 23 +++++++++---------- pkg/dbal/DbalContext.php | 27 +++++++++++----------- pkg/dbal/DbalProducer.php | 25 ++++++++++---------- pkg/dbal/DbalType.php | 34 ++++++++++++++++++++++++++++ pkg/dbal/Tests/DbalConsumerTest.php | 6 ++--- 5 files changed, 73 insertions(+), 42 deletions(-) create mode 100644 pkg/dbal/DbalType.php diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 55ec77c00..0d57541d6 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -6,7 +6,6 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\RetryableException; -use Doctrine\DBAL\Types\Type; use Ramsey\Uuid\Uuid; trait DbalConsumerHelperTrait @@ -39,7 +38,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->addOrderBy('priority', 'asc') ->addOrderBy('published_at', 'asc') ->setParameter('queues', $queues, Connection::PARAM_STR_ARRAY) - ->setParameter('delayedUntil', $now, Type::INTEGER) + ->setParameter('delayedUntil', $now, DbalType::INTEGER) ->setMaxResults(1); $update = $this->getConnection()->createQueryBuilder() @@ -48,8 +47,8 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa ->set('redeliver_after', ':redeliverAfter') ->andWhere('id = :messageId') ->andWhere('delivery_id IS NULL') - ->setParameter('deliveryId', $deliveryId, Type::GUID) - ->setParameter('redeliverAfter', $now + $redeliveryDelay, Type::BIGINT) + ->setParameter('deliveryId', $deliveryId, DbalType::GUID) + ->setParameter('redeliverAfter', $now + $redeliveryDelay, DbalType::BIGINT) ; while (microtime(true) < $endAt) { @@ -60,14 +59,14 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa } $update - ->setParameter('messageId', $result['id'], Type::GUID); + ->setParameter('messageId', $result['id'], DbalType::GUID); if ($update->execute()) { $deliveredMessage = $this->getConnection()->createQueryBuilder() ->select('*') ->from($this->getContext()->getTableName()) ->andWhere('delivery_id = :deliveryId') - ->setParameter('deliveryId', $deliveryId, Type::GUID) + ->setParameter('deliveryId', $deliveryId, DbalType::GUID) ->setMaxResults(1) ->execute() ->fetch(); @@ -103,9 +102,9 @@ protected function redeliverMessages(): void ->set('redelivered', ':redelivered') ->andWhere('redeliver_after < :now') ->andWhere('delivery_id IS NOT NULL') - ->setParameter(':now', time(), Type::BIGINT) - ->setParameter('deliveryId', null, Type::GUID) - ->setParameter('redelivered', true, Type::BOOLEAN) + ->setParameter(':now', time(), DbalType::BIGINT) + ->setParameter('deliveryId', null, DbalType::GUID) + ->setParameter('redelivered', true, DbalType::BOOLEAN) ; try { @@ -131,8 +130,8 @@ protected function removeExpiredMessages(): void ->andWhere('delivery_id IS NULL') ->andWhere('redelivered = :redelivered') - ->setParameter(':now', time(), Type::BIGINT) - ->setParameter('redelivered', false, Type::BOOLEAN) + ->setParameter(':now', time(), DbalType::BIGINT) + ->setParameter('redelivered', false, DbalType::BOOLEAN) ; try { @@ -153,7 +152,7 @@ private function deleteMessage(string $deliveryId): void $this->getConnection()->delete( $this->getContext()->getTableName(), ['delivery_id' => $deliveryId], - ['delivery_id' => Type::GUID] + ['delivery_id' => DbalType::GUID] ); } } diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 5fdf6b59e..314db5dde 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -6,7 +6,6 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Schema\Table; -use Doctrine\DBAL\Types\Type; use Interop\Queue\Consumer; use Interop\Queue\Context; use Interop\Queue\Destination; @@ -183,7 +182,7 @@ public function purgeQueue(Queue $queue): void $this->getDbalConnection()->delete( $this->getTableName(), ['queue' => $queue->getQueueName()], - ['queue' => Type::STRING] + ['queue' => DbalType::STRING] ); } @@ -221,18 +220,18 @@ public function createDataBaseTable(): void $table = new Table($this->getTableName()); - $table->addColumn('id', Type::GUID, ['length' => 16, 'fixed' => true]); - $table->addColumn('published_at', Type::BIGINT); - $table->addColumn('body', Type::TEXT, ['notnull' => false]); - $table->addColumn('headers', Type::TEXT, ['notnull' => false]); - $table->addColumn('properties', Type::TEXT, ['notnull' => false]); - $table->addColumn('redelivered', Type::BOOLEAN, ['notnull' => false]); - $table->addColumn('queue', Type::STRING); - $table->addColumn('priority', Type::SMALLINT, ['notnull' => false]); - $table->addColumn('delayed_until', Type::BIGINT, ['notnull' => false]); - $table->addColumn('time_to_live', Type::BIGINT, ['notnull' => false]); - $table->addColumn('delivery_id', Type::GUID, ['length' => 16, 'fixed' => true, 'notnull' => false]); - $table->addColumn('redeliver_after', Type::BIGINT, ['notnull' => false]); + $table->addColumn('id', DbalType::GUID, ['length' => 16, 'fixed' => true]); + $table->addColumn('published_at', DbalType::BIGINT); + $table->addColumn('body', DbalType::TEXT, ['notnull' => false]); + $table->addColumn('headers', DbalType::TEXT, ['notnull' => false]); + $table->addColumn('properties', DbalType::TEXT, ['notnull' => false]); + $table->addColumn('redelivered', DbalType::BOOLEAN, ['notnull' => false]); + $table->addColumn('queue', DbalType::STRING); + $table->addColumn('priority', DbalType::SMALLINT, ['notnull' => false]); + $table->addColumn('delayed_until', DbalType::BIGINT, ['notnull' => false]); + $table->addColumn('time_to_live', DbalType::BIGINT, ['notnull' => false]); + $table->addColumn('delivery_id', DbalType::GUID, ['length' => 16, 'fixed' => true, 'notnull' => false]); + $table->addColumn('redeliver_after', DbalType::BIGINT, ['notnull' => false]); $table->setPrimaryKey(['id']); $table->addIndex(['priority', 'published_at', 'queue', 'delivery_id', 'delayed_until', 'id']); diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index e197b14c3..f0cdea849 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -4,7 +4,6 @@ namespace Enqueue\Dbal; -use Doctrine\DBAL\Types\Type; use Interop\Queue\Destination; use Interop\Queue\Exception\Exception; use Interop\Queue\Exception\InvalidDestinationException; @@ -107,18 +106,18 @@ public function send(Destination $destination, Message $message): void try { $rowsAffected = $this->context->getDbalConnection()->insert($this->context->getTableName(), $dbalMessage, [ - 'id' => Type::GUID, - 'published_at' => Type::INTEGER, - 'body' => Type::TEXT, - 'headers' => Type::TEXT, - 'properties' => Type::TEXT, - 'priority' => Type::SMALLINT, - 'queue' => Type::STRING, - 'time_to_live' => Type::INTEGER, - 'delayed_until' => Type::INTEGER, - 'redelivered' => Type::SMALLINT, - 'delivery_id' => Type::STRING, - 'redeliver_after' => Type::BIGINT, + 'id' => DbalType::GUID, + 'published_at' => DbalType::INTEGER, + 'body' => DbalType::TEXT, + 'headers' => DbalType::TEXT, + 'properties' => DbalType::TEXT, + 'priority' => DbalType::SMALLINT, + 'queue' => DbalType::STRING, + 'time_to_live' => DbalType::INTEGER, + 'delayed_until' => DbalType::INTEGER, + 'redelivered' => DbalType::SMALLINT, + 'delivery_id' => DbalType::STRING, + 'redeliver_after' => DbalType::BIGINT, ]); if (1 !== $rowsAffected) { diff --git a/pkg/dbal/DbalType.php b/pkg/dbal/DbalType.php new file mode 100644 index 000000000..63942d253 --- /dev/null +++ b/pkg/dbal/DbalType.php @@ -0,0 +1,34 @@ +with( 'some-table-name', ['delivery_id' => $deliveryId->toString()], - ['delivery_id' => Type::GUID] + ['delivery_id' => DbalType::GUID] ) ; @@ -143,7 +143,7 @@ public function testShouldDeleteMessageFromQueueOnReject() ->with( 'some-table-name', ['delivery_id' => $deliveryId->toString()], - ['delivery_id' => Type::GUID] + ['delivery_id' => DbalType::GUID] ) ; From 628642cf30e8fb3304e32dca21b7ff6ed06cc71c Mon Sep 17 00:00:00 2001 From: m3m0r7 Date: Sat, 15 May 2021 18:58:02 +0900 Subject: [PATCH 0984/1142] Fix code styling --- pkg/dbal/DbalType.php | 48 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/pkg/dbal/DbalType.php b/pkg/dbal/DbalType.php index 63942d253..38a14381f 100644 --- a/pkg/dbal/DbalType.php +++ b/pkg/dbal/DbalType.php @@ -6,29 +6,29 @@ class DbalType { - public const ARRAY = 'array'; - public const ASCII_STRING = 'ascii_string'; - public const BIGINT = 'bigint'; - public const BINARY = 'binary'; - public const BLOB = 'blob'; - public const BOOLEAN = 'boolean'; - public const DATE_MUTABLE = 'date'; - public const DATE_IMMUTABLE = 'date_immutable'; - public const DATEINTERVAL = 'dateinterval'; - public const DATETIME_MUTABLE = 'datetime'; - public const DATETIME_IMMUTABLE = 'datetime_immutable'; - public const DATETIMETZ_MUTABLE = 'datetimetz'; + public const ARRAY = 'array'; + public const ASCII_STRING = 'ascii_string'; + public const BIGINT = 'bigint'; + public const BINARY = 'binary'; + public const BLOB = 'blob'; + public const BOOLEAN = 'boolean'; + public const DATE_MUTABLE = 'date'; + public const DATE_IMMUTABLE = 'date_immutable'; + public const DATEINTERVAL = 'dateinterval'; + public const DATETIME_MUTABLE = 'datetime'; + public const DATETIME_IMMUTABLE = 'datetime_immutable'; + public const DATETIMETZ_MUTABLE = 'datetimetz'; public const DATETIMETZ_IMMUTABLE = 'datetimetz_immutable'; - public const DECIMAL = 'decimal'; - public const FLOAT = 'float'; - public const GUID = 'guid'; - public const INTEGER = 'integer'; - public const JSON = 'json'; - public const OBJECT = 'object'; - public const SIMPLE_ARRAY = 'simple_array'; - public const SMALLINT = 'smallint'; - public const STRING = 'string'; - public const TEXT = 'text'; - public const TIME_MUTABLE = 'time'; - public const TIME_IMMUTABLE = 'time_immutable'; + public const DECIMAL = 'decimal'; + public const FLOAT = 'float'; + public const GUID = 'guid'; + public const INTEGER = 'integer'; + public const JSON = 'json'; + public const OBJECT = 'object'; + public const SIMPLE_ARRAY = 'simple_array'; + public const SMALLINT = 'smallint'; + public const STRING = 'string'; + public const TEXT = 'text'; + public const TIME_MUTABLE = 'time'; + public const TIME_IMMUTABLE = 'time_immutable'; } From 78282ae704aacb42931673b7936ab5aaaea4370d Mon Sep 17 00:00:00 2001 From: David Marland Date: Mon, 24 May 2021 12:09:44 +0100 Subject: [PATCH 0985/1142] ResetServicesExtension to run _after_ message received Resolves https://github.com/php-enqueue/enqueue-dev/issues/1156 Reset the services after message is received, so that logs are flushed without having to wait for a new message --- .../Consumption/Extension/ResetServicesExtension.php | 8 ++++---- .../Consumption/Extension/ResetServicesExtensionTest.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php b/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php index 36eb21782..0bf642197 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/ResetServicesExtension.php @@ -2,11 +2,11 @@ namespace Enqueue\Bundle\Consumption\Extension; -use Enqueue\Consumption\Context\MessageReceived; -use Enqueue\Consumption\MessageReceivedExtensionInterface; +use Enqueue\Consumption\Context\PostMessageReceived; +use Enqueue\Consumption\PostMessageReceivedExtensionInterface; use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; -class ResetServicesExtension implements MessageReceivedExtensionInterface +class ResetServicesExtension implements PostMessageReceivedExtensionInterface { /** * @var ServicesResetter @@ -18,7 +18,7 @@ public function __construct(ServicesResetter $resetter) $this->resetter = $resetter; } - public function onMessageReceived(MessageReceived $context): void + public function onPostMessageReceived(PostMessageReceived $context): void { $context->getLogger()->debug('[ResetServicesExtension] Resetting services.'); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php index bfd772a5c..8d8d3c585 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php @@ -37,7 +37,7 @@ public function testItShouldResetServices() ; $extension = new ResetServicesExtension($resetter); - $extension->onMessageReceived($context); + $extension->onPostMessageReceived($context); } protected function createContext(): MessageReceived From c24953a62d85978d0072bd770f9edaa6a4a4c8a0 Mon Sep 17 00:00:00 2001 From: David Marland Date: Tue, 25 May 2021 12:32:51 +0100 Subject: [PATCH 0986/1142] Fix test --- .../Consumption/Extension/ResetServicesExtensionTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php index 8d8d3c585..18e94f251 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php @@ -4,7 +4,7 @@ use Doctrine\Persistence\ManagerRegistry; use Enqueue\Bundle\Consumption\Extension\ResetServicesExtension; -use Enqueue\Consumption\Context\MessageReceived; +use Enqueue\Consumption\Context\PostMessageReceived; use Interop\Queue\Consumer; use Interop\Queue\Context as InteropContext; use Interop\Queue\Message; @@ -40,9 +40,9 @@ public function testItShouldResetServices() $extension->onPostMessageReceived($context); } - protected function createContext(): MessageReceived + protected function createContext(): PostMessageReceived { - return new MessageReceived( + return new PostMessageReceived( $this->createMock(InteropContext::class), $this->createMock(Consumer::class), $this->createMock(Message::class), From 576f057c0c298b7b84218f95d4cf31163c52bd12 Mon Sep 17 00:00:00 2001 From: aigarszuika Date: Tue, 25 May 2021 17:59:46 +0300 Subject: [PATCH 0987/1142] Changed: Clear Doctrine cache before calculate Root Job Status Before determine Root Job Status Doctrine cache for Job entity must be cleared, otherwise if this root job was processed in previous request by the same enqueue, then it will falsely return old status, which will cause infinite running root jobs --- pkg/job-queue/CalculateRootJobStatusProcessor.php | 1 + pkg/job-queue/Doctrine/JobStorage.php | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/pkg/job-queue/CalculateRootJobStatusProcessor.php b/pkg/job-queue/CalculateRootJobStatusProcessor.php index b9b0c4dfb..bbb40bf3b 100644 --- a/pkg/job-queue/CalculateRootJobStatusProcessor.php +++ b/pkg/job-queue/CalculateRootJobStatusProcessor.php @@ -48,6 +48,7 @@ public function __construct( public function process(Message $message, Context $context) { + $this->jobStorage->clearJobCache(); $data = JSON::decode($message->getBody()); if (!isset($data['jobId'])) { diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 385ee4d38..8268dd791 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -179,6 +179,11 @@ public function saveJob(Job $job, \Closure $lockCallback = null) } } + public function clearJobCache() + { + $this->getEntityManager()->clear($this->entityClass); + } + /** * @return EntityRepository */ From c4da15e78a7c5b73f1266b2c7a5a9a64ef73befd Mon Sep 17 00:00:00 2001 From: aigarszuika Date: Wed, 26 May 2021 10:09:37 +0300 Subject: [PATCH 0988/1142] Changed: Refresh child entity when checking root job status --- pkg/job-queue/CalculateRootJobStatusProcessor.php | 1 - pkg/job-queue/CalculateRootJobStatusService.php | 1 + pkg/job-queue/Doctrine/JobStorage.php | 7 +++++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/job-queue/CalculateRootJobStatusProcessor.php b/pkg/job-queue/CalculateRootJobStatusProcessor.php index bbb40bf3b..b9b0c4dfb 100644 --- a/pkg/job-queue/CalculateRootJobStatusProcessor.php +++ b/pkg/job-queue/CalculateRootJobStatusProcessor.php @@ -48,7 +48,6 @@ public function __construct( public function process(Message $message, Context $context) { - $this->jobStorage->clearJobCache(); $data = JSON::decode($message->getBody()); if (!isset($data['jobId'])) { diff --git a/pkg/job-queue/CalculateRootJobStatusService.php b/pkg/job-queue/CalculateRootJobStatusService.php index 4268158b1..a9d62e3b1 100644 --- a/pkg/job-queue/CalculateRootJobStatusService.php +++ b/pkg/job-queue/CalculateRootJobStatusService.php @@ -69,6 +69,7 @@ protected function calculateRootJobStatus(array $jobs) $success = 0; foreach ($jobs as $job) { + $this->jobStorage->refreshedJobEntity($job); switch ($job->getStatus()) { case Job::STATUS_NEW: $new++; diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 8268dd791..6d20da46f 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -179,9 +179,12 @@ public function saveJob(Job $job, \Closure $lockCallback = null) } } - public function clearJobCache() + /** + * @param Job $job + */ + public function refreshedJobEntity($job) { - $this->getEntityManager()->clear($this->entityClass); + $this->getEntityManager()->refresh($job); } /** From ca6bd302e1125e1801ba164706ef0cc8965d50f2 Mon Sep 17 00:00:00 2001 From: aigarszuika Date: Wed, 26 May 2021 10:15:15 +0300 Subject: [PATCH 0989/1142] Changed: Procedure rename --- pkg/job-queue/CalculateRootJobStatusService.php | 2 +- pkg/job-queue/Doctrine/JobStorage.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/job-queue/CalculateRootJobStatusService.php b/pkg/job-queue/CalculateRootJobStatusService.php index a9d62e3b1..41dd350b9 100644 --- a/pkg/job-queue/CalculateRootJobStatusService.php +++ b/pkg/job-queue/CalculateRootJobStatusService.php @@ -69,7 +69,7 @@ protected function calculateRootJobStatus(array $jobs) $success = 0; foreach ($jobs as $job) { - $this->jobStorage->refreshedJobEntity($job); + $this->jobStorage->refreshJobEntity($job); switch ($job->getStatus()) { case Job::STATUS_NEW: $new++; diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 6d20da46f..b584e4022 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -182,7 +182,7 @@ public function saveJob(Job $job, \Closure $lockCallback = null) /** * @param Job $job */ - public function refreshedJobEntity($job) + public function refreshJobEntity($job) { $this->getEntityManager()->refresh($job); } From 29e0260ca0ec4b0a147cdca5e183f1591f76ddad Mon Sep 17 00:00:00 2001 From: aigarszuika Date: Wed, 26 May 2021 16:40:11 +0300 Subject: [PATCH 0990/1142] Changed: Fix findJobById return cached value. This issue can affect dependent job schedule if it is done by other enqueue job --- pkg/job-queue/Doctrine/JobStorage.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index b584e4022..0ee459e50 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -58,13 +58,18 @@ public function findJobById($id) { $qb = $this->getEntityRepository()->createQueryBuilder('job'); - return $qb + $job = $qb ->addSelect('rootJob') ->leftJoin('job.rootJob', 'rootJob') ->where('job = :id') ->setParameter('id', $id) ->getQuery()->getOneOrNullResult() ; + if ($job) { + $this->refreshJobEntity($job); + } + + return $job; } /** From 04edd9d63f6b3b0b2a8712d4e56eec6e22fcdd31 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 9 Jul 2021 18:48:31 +0300 Subject: [PATCH 0991/1142] Fix snsqs non-SNS SQS message headers --- pkg/snsqs/SnsQsConsumer.php | 1 + pkg/snsqs/Tests/SnsQsConsumerTest.php | 72 +++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 pkg/snsqs/Tests/SnsQsConsumerTest.php diff --git a/pkg/snsqs/SnsQsConsumer.php b/pkg/snsqs/SnsQsConsumer.php index c285ad5df..17ec39ae0 100644 --- a/pkg/snsqs/SnsQsConsumer.php +++ b/pkg/snsqs/SnsQsConsumer.php @@ -135,6 +135,7 @@ private function convertMessage(SqsMessage $sqsMessage): SnsQsMessage } $message->setBody($sqsMessage->getBody()); + $message->setHeaders($sqsMessage->getHeaders()); $message->setProperties($sqsMessage->getProperties()); return $message; diff --git a/pkg/snsqs/Tests/SnsQsConsumerTest.php b/pkg/snsqs/Tests/SnsQsConsumerTest.php new file mode 100644 index 000000000..a16e133b3 --- /dev/null +++ b/pkg/snsqs/Tests/SnsQsConsumerTest.php @@ -0,0 +1,72 @@ +createMock(SnsQsContext::class); + $context->expects($this->once()) + ->method('createMessage') + ->willReturn(new SnsQsMessage()); + + $sqsConsumer = $this->createMock(SqsConsumer::class); + $sqsConsumer->expects($this->once()) + ->method('receive') + ->willReturn(new SqsMessage(json_encode([ + 'Type' => 'Notification', + 'TopicArn' => 'arn:aws:sns:us-east-2:12345:topic-name', + 'Message' => 'The Body', + 'MessageAttributes' => [ + 'Headers' => [ + 'Type' => 'String', + 'Value' => '[{"headerKey":"headerVal"},{"propKey": "propVal"}]', + ], + ], + ]))); + + $consumer = new SnsQsConsumer($context, $sqsConsumer, new SnsQsQueue('queue')); + $result = $consumer->receive(); + + $this->assertInstanceOf(SnsQsMessage::class, $result); + $this->assertSame('The Body', $result->getBody()); + $this->assertSame(['headerKey' => 'headerVal'], $result->getHeaders()); + $this->assertSame(['propKey' => 'propVal'], $result->getProperties()); + } + + public function testReceivesSqsMessage(): void + { + $context = $this->createMock(SnsQsContext::class); + $context->expects($this->once()) + ->method('createMessage') + ->willReturn(new SnsQsMessage()); + + $sqsConsumer = $this->createMock(SqsConsumer::class); + $sqsConsumer->expects($this->once()) + ->method('receive') + ->willReturn(new SqsMessage( + 'The Body', + ['propKey' => 'propVal'], + ['headerKey' => 'headerVal'], + )); + + $consumer = new SnsQsConsumer($context, $sqsConsumer, new SnsQsQueue('queue')); + $result = $consumer->receive(); + + $this->assertInstanceOf(SnsQsMessage::class, $result); + $this->assertSame('The Body', $result->getBody()); + $this->assertSame(['headerKey' => 'headerVal'], $result->getHeaders()); + $this->assertSame(['propKey' => 'propVal'], $result->getProperties()); + } +} From daa6db8a333082b28998dfb3b12c8c62f69a0bf7 Mon Sep 17 00:00:00 2001 From: DigitVE Date: Tue, 13 Jul 2021 23:26:58 +0300 Subject: [PATCH 0992/1142] Added getter for offset field in RdKafkaConsumer class --- pkg/rdkafka/RdKafkaConsumer.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index 3aa568edb..7fbaef755 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -66,6 +66,11 @@ public function setCommitAsync(bool $async): void $this->commitAsync = $async; } + public function getOffset(): ?int + { + return $this->offset; + } + public function setOffset(int $offset = null): void { if ($this->subscribed) { From 3a52f7e348a5f01ef358c14d587dd9270d0196b8 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 23 Jul 2021 15:34:30 +0300 Subject: [PATCH 0993/1142] Use the correct php versions in the matrix --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe696eda4..776511102 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -159,5 +159,7 @@ jobs: - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - run: bin/dev -b + env: + PHP_VERSION: ${{ matrix.php }} - run: bin/test.sh --${{ matrix.rdkafka_action }}=rdkafka From cc2ba6a8646ebecf0d6bda4c404dbe2e0b125726 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 23 Jul 2021 18:07:11 +0300 Subject: [PATCH 0994/1142] Move from 7.3 to 7.4 --- .github/workflows/ci.yml | 2 +- docker-compose.yml | 4 ++-- docker/Dockerfile | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 776511102..9756e22f5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -120,7 +120,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '8.0'] # same as in the container + php: ['7.4', '8.0'] # same as in the container symfony_version: ['4.4.*', '5.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] rdkafka_action: ['exclude-group', 'group'] diff --git a/docker-compose.yml b/docker-compose.yml index ae4256c42..c5fa5545b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,11 +3,11 @@ version: '2' services: dev: # when image publishing gets sorted: - # image: enqueue/dev:${PHP_VERSION} +# image: enqueue/dev:${PHP_VERSION:-7.4} build: context: docker args: - PHP_VERSION: "${PHP_VERSION:-7.3}" + PHP_VERSION: "${PHP_VERSION:-7.4}" depends_on: - rabbitmq - mysql diff --git a/docker/Dockerfile b/docker/Dockerfile index 785898446..30f013cb8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -ARG PHP_VERSION=7.3 +ARG PHP_VERSION=7.4 FROM makasim/nginx-php-fpm:${PHP_VERSION}-all-exts ARG PHP_VERSION From 6598c3fdf2d161b94a5db78f0387b292894051e8 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 23 Jul 2021 20:08:49 +0300 Subject: [PATCH 0995/1142] Bump thruway/client to a php8-compatible version --- composer.json | 2 +- pkg/monitoring/composer.json | 2 +- pkg/wamp/composer.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 41b49cff6..67a821edb 100644 --- a/composer.json +++ b/composer.json @@ -42,7 +42,7 @@ "php-http/client-common": "^2.2.1", "richardfullmer/rabbitmq-management-api": "^2.1.1", "predis/predis": "^1.1", - "thruway/client": "^0.5", + "thruway/client": "^0.5.5", "thruway/pawl-transport": "^0.5.1", "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index 70d52973b..ebc0b1c6e 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -15,7 +15,7 @@ "enqueue/test": "0.10.x-dev", "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", - "thruway/client": "^0.5", + "thruway/client": "^0.5.5", "thruway/pawl-transport": "^0.5", "voryx/thruway-common": "^1.0.1" }, diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 6dd4a6aa0..52ec9626a 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -9,7 +9,7 @@ "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8.1", "enqueue/dsn": "^0.10.8", - "thruway/client": "^0.5", + "thruway/client": "^0.5.5", "thruway/pawl-transport": "^0.5.1", "voryx/thruway-common": "^1.0.1", "react/dns": "^1.0", From 5b00d6cee7e106bb16283547a1973ca92f0ffa28 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 23 Jul 2021 20:16:24 +0300 Subject: [PATCH 0996/1142] Bump php-amqplib/php-amqplib to a php8-compatible version --- composer.json | 2 +- pkg/enqueue-bundle/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 67a821edb..ee8ef1291 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8.1", "bunny/bunny": "^0.4|^0.5", - "php-amqplib/php-amqplib": "^2.12.1", + "php-amqplib/php-amqplib": "^3.0", "doctrine/dbal": "^2.12|^3.1", "ramsey/uuid": "^3.5|^4", "psr/log": "^1.1", diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 0d8ff66c2..035dd2b1b 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -35,7 +35,7 @@ "enqueue/test": "0.10.x-dev", "enqueue/async-event-dispatcher": "0.10.x-dev", "enqueue/async-command": "0.10.x-dev", - "php-amqplib/php-amqplib": "^2.12.1", + "php-amqplib/php-amqplib": "^3.0", "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", From 99c054c8e2a51a6864cac6a906185b75b6b29fcb Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 23 Jul 2021 21:42:30 +0300 Subject: [PATCH 0997/1142] Bump react libs to fix wamp hanging on php 8 --- composer.json | 5 +++-- pkg/wamp/composer.json | 10 +++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index ee8ef1291..b2d066538 100644 --- a/composer.json +++ b/composer.json @@ -49,8 +49,9 @@ "guzzlehttp/guzzle": "^7.0.1", "php-http/discovery": "^1.13", "voryx/thruway-common": "^1.0.1", - "react/dns": "^1.0", - "react/event-loop": "^1.0" + "react/dns": "^1.4", + "react/event-loop": "^1.2", + "react/promise": "^2.8" }, "require-dev": { "ext-pcntl": "*", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 52ec9626a..89bdbf315 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -12,8 +12,9 @@ "thruway/client": "^0.5.5", "thruway/pawl-transport": "^0.5.1", "voryx/thruway-common": "^1.0.1", - "react/dns": "^1.0", - "react/event-loop": "^1.0" + "react/dns": "^1.4", + "react/event-loop": "^1.2", + "react/promise": "^2.8" }, "require-dev": { "phpunit/phpunit": "^9.5", @@ -34,10 +35,13 @@ "/Tests/" ] }, - "minimum-stability": "dev", + "minimum-stability": "beta", "extra": { "branch-alias": { "dev-master": "0.10.x-dev" } + }, + "config": { + "prefer-stable": true } } From 946f48f17add05434d9156cddbfd338362ca571f Mon Sep 17 00:00:00 2001 From: Ralf Siepker Date: Fri, 6 Aug 2021 12:27:26 +0200 Subject: [PATCH 0998/1142] #1190 add index on delivery_id to prevent slow queries --- pkg/dbal/DbalContext.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index 314db5dde..fc1f4a27a 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -238,6 +238,7 @@ public function createDataBaseTable(): void $table->addIndex(['redeliver_after', 'delivery_id']); $table->addIndex(['time_to_live', 'delivery_id']); + $table->addIndex(['delivery_id']); $sm->createTable($table); } From 425d5e0999f33f78217d98a2fee7732a32fb6f60 Mon Sep 17 00:00:00 2001 From: gdsmith Date: Fri, 30 Jul 2021 09:51:32 +0400 Subject: [PATCH 0999/1142] Add setTopicArn methods to SnsContext and SnsQsContext --- pkg/sns/SnsContext.php | 5 +++++ pkg/snsqs/SnsQsContext.php | 29 +++++++++-------------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/pkg/sns/SnsContext.php b/pkg/sns/SnsContext.php index 454a5ddb5..a2de3f949 100644 --- a/pkg/sns/SnsContext.php +++ b/pkg/sns/SnsContext.php @@ -76,6 +76,11 @@ public function declareTopic(SnsDestination $destination): void $this->topicArns[$destination->getTopicName()] = (string) $result->get('TopicArn'); } + public function setTopicArn(SnsDestination $destination, string $arn): void + { + $this->topicArns[$destination->getTopicName()] = $arn; + } + public function deleteTopic(SnsDestination $destination): void { $this->client->deleteTopic($this->getTopicArn($destination)); diff --git a/pkg/snsqs/SnsQsContext.php b/pkg/snsqs/SnsQsContext.php index d520cdb10..766f643a3 100644 --- a/pkg/snsqs/SnsQsContext.php +++ b/pkg/snsqs/SnsQsContext.php @@ -53,11 +53,7 @@ public function __construct($snsContext, $sqsContext) } elseif (is_callable($snsContext)) { $this->snsContextFactory = $snsContext; } else { - throw new \InvalidArgumentException(sprintf( - 'The $snsContext argument must be either %s or callable that returns %s once called.', - SnsContext::class, - SnsContext::class - )); + throw new \InvalidArgumentException(sprintf('The $snsContext argument must be either %s or callable that returns %s once called.', SnsContext::class, SnsContext::class)); } if ($sqsContext instanceof SqsContext) { @@ -65,11 +61,7 @@ public function __construct($snsContext, $sqsContext) } elseif (is_callable($sqsContext)) { $this->sqsContextFactory = $sqsContext; } else { - throw new \InvalidArgumentException(sprintf( - 'The $sqsContext argument must be either %s or callable that returns %s once called.', - SqsContext::class, - SqsContext::class - )); + throw new \InvalidArgumentException(sprintf('The $sqsContext argument must be either %s or callable that returns %s once called.', SqsContext::class, SqsContext::class)); } } @@ -137,6 +129,11 @@ public function declareTopic(SnsQsTopic $topic): void $this->getSnsContext()->declareTopic($topic); } + public function setTopicArn(SnsQsTopic $topic, string $arn): void + { + $this->getSnsContext()->setTopicArn($topic); + } + public function deleteTopic(SnsQsTopic $topic): void { $this->getSnsContext()->deleteTopic($topic); @@ -181,11 +178,7 @@ private function getSnsContext(): SnsContext if (null === $this->snsContext) { $context = call_user_func($this->snsContextFactory); if (false == $context instanceof SnsContext) { - throw new \LogicException(sprintf( - 'The factory must return instance of %s. It returned %s', - SnsContext::class, - is_object($context) ? get_class($context) : gettype($context) - )); + throw new \LogicException(sprintf('The factory must return instance of %s. It returned %s', SnsContext::class, is_object($context) ? get_class($context) : gettype($context))); } $this->snsContext = $context; @@ -199,11 +192,7 @@ private function getSqsContext(): SqsContext if (null === $this->sqsContext) { $context = call_user_func($this->sqsContextFactory); if (false == $context instanceof SqsContext) { - throw new \LogicException(sprintf( - 'The factory must return instance of %s. It returned %s', - SqsContext::class, - is_object($context) ? get_class($context) : gettype($context) - )); + throw new \LogicException(sprintf('The factory must return instance of %s. It returned %s', SqsContext::class, is_object($context) ? get_class($context) : gettype($context))); } $this->sqsContext = $context; From bf279e23f7eed1951da22ed186511da399af2035 Mon Sep 17 00:00:00 2001 From: gdsmith Date: Mon, 23 Aug 2021 16:57:22 +0400 Subject: [PATCH 1000/1142] missing arg --- pkg/snsqs/SnsQsContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/snsqs/SnsQsContext.php b/pkg/snsqs/SnsQsContext.php index 766f643a3..14dbc5acd 100644 --- a/pkg/snsqs/SnsQsContext.php +++ b/pkg/snsqs/SnsQsContext.php @@ -131,7 +131,7 @@ public function declareTopic(SnsQsTopic $topic): void public function setTopicArn(SnsQsTopic $topic, string $arn): void { - $this->getSnsContext()->setTopicArn($topic); + $this->getSnsContext()->setTopicArn($topic, $arn); } public function deleteTopic(SnsQsTopic $topic): void From d99b2e10d3d5c3e0311a475ecae705e02e82acd4 Mon Sep 17 00:00:00 2001 From: Alexander Onatskiy Date: Fri, 11 Jun 2021 21:16:45 +0300 Subject: [PATCH 1001/1142] added possibility to send message attributes using snsqs transport --- pkg/snsqs/SnsQsMessage.php | 29 +++++++++++++++++++++++++-- pkg/snsqs/SnsQsProducer.php | 13 ++---------- pkg/snsqs/Tests/SnsQsProducerTest.php | 22 ++++++++++++++++++++ 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/pkg/snsqs/SnsQsMessage.php b/pkg/snsqs/SnsQsMessage.php index e34a103ff..63a5c1d72 100644 --- a/pkg/snsqs/SnsQsMessage.php +++ b/pkg/snsqs/SnsQsMessage.php @@ -17,12 +17,27 @@ class SnsQsMessage implements Message */ private $sqsMessage; - public function __construct(string $body = '', array $properties = [], array $headers = []) - { + /** + * @var array|null + */ + private $messageAttributes; + + /** + * See AWS documentation for message attribute structure. + * + * @see https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#shape-messageattributevalue + */ + public function __construct( + string $body = '', + array $properties = [], + array $headers = [], + array $messageAttributes = null + ) { $this->body = $body; $this->properties = $properties; $this->headers = $headers; $this->redelivered = false; + $this->messageAttributes = $messageAttributes; } public function setSqsMessage(SqsMessage $message): void @@ -34,4 +49,14 @@ public function getSqsMessage(): SqsMessage { return $this->sqsMessage; } + + public function getMessageAttributes(): ?array + { + return $this->messageAttributes; + } + + public function setMessageAttributes(?array $messageAttributes): void + { + $this->messageAttributes = $messageAttributes; + } } diff --git a/pkg/snsqs/SnsQsProducer.php b/pkg/snsqs/SnsQsProducer.php index bdce7f895..99054286f 100644 --- a/pkg/snsqs/SnsQsProducer.php +++ b/pkg/snsqs/SnsQsProducer.php @@ -51,11 +51,7 @@ public function send(Destination $destination, Message $message): void InvalidMessageException::assertMessageInstanceOf($message, SnsQsMessage::class); if (false == $destination instanceof SnsQsTopic && false == $destination instanceof SnsQsQueue) { - throw new InvalidDestinationException(sprintf( - 'The destination must be an instance of [%s|%s] but got %s.', - SnsQsTopic::class, SnsQsQueue::class, - is_object($destination) ? get_class($destination) : gettype($destination) - )); + throw new InvalidDestinationException(sprintf('The destination must be an instance of [%s|%s] but got %s.', SnsQsTopic::class, SnsQsQueue::class, is_object($destination) ? get_class($destination) : gettype($destination))); } if ($destination instanceof SnsQsTopic) { @@ -64,6 +60,7 @@ public function send(Destination $destination, Message $message): void $message->getProperties(), $message->getHeaders() ); + $snsMessage->setMessageAttributes($message->getMessageAttributes()); $this->getSnsProducer()->send($destination, $snsMessage); } else { @@ -79,10 +76,6 @@ public function send(Destination $destination, Message $message): void /** * Delivery delay is supported by SQSProducer. - * - * @param int|null $deliveryDelay - * - * @return Producer */ public function setDeliveryDelay(int $deliveryDelay = null): Producer { @@ -93,8 +86,6 @@ public function setDeliveryDelay(int $deliveryDelay = null): Producer /** * Delivery delay is supported by SQSProducer. - * - * @return int|null */ public function getDeliveryDelay(): ?int { diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index d0925d15e..4444c888b 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -3,6 +3,7 @@ namespace Enqueue\SnsQs\Tests; use Enqueue\Sns\SnsContext; +use Enqueue\Sns\SnsMessage; use Enqueue\Sns\SnsProducer; use Enqueue\SnsQs\SnsQsMessage; use Enqueue\SnsQs\SnsQsProducer; @@ -91,6 +92,7 @@ public function testShouldGetDeliveryDelayFromSQSProducer() public function testShouldSendSnsTopicMessageToSnsProducer() { $snsMock = $this->createSnsContextMock(); + $snsMock->method('createMessage')->willReturn(new SnsMessage()); $destination = new SnsQsTopic(''); $snsProducerStub = $this->prophesize(SnsProducer::class); @@ -102,6 +104,26 @@ public function testShouldSendSnsTopicMessageToSnsProducer() $producer->send($destination, new SnsQsMessage()); } + public function testShouldSendSnsTopicMessageWithAttributesToSnsProducer() + { + $snsMock = $this->createSnsContextMock(); + $snsMock->method('createMessage')->willReturn(new SnsMessage()); + $destination = new SnsQsTopic(''); + + $snsProducerStub = $this->prophesize(SnsProducer::class); + $snsProducerStub->send( + $destination, + Argument::that(function (SnsMessage $snsMessage) { + return $snsMessage->getMessageAttributes() === ['foo' => 'bar']; + }) + )->shouldBeCalledOnce(); + + $snsMock->method('createProducer')->willReturn($snsProducerStub->reveal()); + + $producer = new SnsQsProducer($snsMock, $this->createSqsContextMock()); + $producer->send($destination, new SnsQsMessage('', [], [], ['foo' => 'bar'])); + } + public function testShouldSendSqsMessageToSqsProducer() { $sqsMock = $this->createSqsContextMock(); From 182636b5465f9b92e137939ca1a89c5e31fdaaaf Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Wed, 25 Aug 2021 11:36:44 +0300 Subject: [PATCH 1002/1142] Release 0.10.13 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf8ead19a..994d639bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## [0.10.13](https://github.com/php-enqueue/enqueue-dev/tree/0.10.13) (2021-08-25) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.12...0.10.13) + +**Merged pull requests:** + +- \[SNSQS\] added possibility to send message attributes using snsqs transport [\#1195](https://github.com/php-enqueue/enqueue-dev/pull/1195) ([onatskyy](https://github.com/onatskyy)) +- Add in missing arg [\#1194](https://github.com/php-enqueue/enqueue-dev/pull/1194) ([gdsmith](https://github.com/gdsmith)) +- \#1190 add index on delivery\_id to prevent slow queries [\#1191](https://github.com/php-enqueue/enqueue-dev/pull/1191) ([commercewerft](https://github.com/commercewerft)) +- Add setTopicArn methods to SnsContext and SnsQsContext [\#1189](https://github.com/php-enqueue/enqueue-dev/pull/1189) ([gdsmith](https://github.com/gdsmith)) + ## [0.10.11](https://github.com/php-enqueue/enqueue-dev/tree/0.10.11) (2021-04-28) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.10...0.10.11) From 847448205caa47a49a75f9371467e1f2bafbf24f Mon Sep 17 00:00:00 2001 From: Diego Borges Date: Tue, 31 Aug 2021 16:09:54 -0300 Subject: [PATCH 1003/1142] Changed: Change partition recovery hierachy in RdKafkaProducer --- pkg/rdkafka/RdKafkaProducer.php | 18 ++++- pkg/rdkafka/Tests/RdKafkaProducerTest.php | 98 +++++++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index db21b9311..de8d3af1e 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -28,6 +28,22 @@ public function __construct(VendorProducer $producer, Serializer $serializer) $this->setSerializer($serializer); } + + /** + * @param RdKafkaTopic $destination + * @param RdKafkaMessage $message + */ + private function getPartition(Destination $destination, Message $message): int + { + if (!is_null($message->getPartition())) { + return $message->getPartition(); + } + if (!is_null($destination->getPartition())) { + return $destination->getPartition(); + } + return RD_KAFKA_PARTITION_UA; + } + /** * @param RdKafkaTopic $destination * @param RdKafkaMessage $message @@ -37,7 +53,7 @@ public function send(Destination $destination, Message $message): void InvalidDestinationException::assertDestinationInstanceOf($destination, RdKafkaTopic::class); InvalidMessageException::assertMessageInstanceOf($message, RdKafkaMessage::class); - $partition = $message->getPartition() ?: $destination->getPartition() ?: RD_KAFKA_PARTITION_UA; + $partition = $this->getPartition($destination, $message); $payload = $this->serializer->toString($message); $key = $message->getKey() ?: $destination->getKey() ?: null; diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index 467f1a43e..01c1c1b4c 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -225,6 +225,104 @@ public function testShouldAllowSerializersToSerializeKeys() $producer->send(new RdKafkaTopic('theQueueName'), $message); } + public function testShouldGetPartitionFromMessage(): void + { + $partition = 1; + + $kafkaTopic = $this->createKafkaTopicMock(); + $kafkaTopic + ->expects($this->once()) + ->method('producev') + ->with( + $partition, + 0, + 'theSerializedMessage', + 'theSerializedKey' + ) + ; + + $kafkaProducer = $this->createKafkaProducerMock(); + $kafkaProducer + ->expects($this->once()) + ->method('newTopic') + ->willReturn($kafkaTopic) + ; + $kafkaProducer + ->expects($this->once()) + ->method('poll') + ->with(0) + ; + $messageHeaders = ['bar' => 'barVal']; + $message = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], $messageHeaders); + $message->setKey('key'); + $message->setPartition($partition); + + $serializer = $this->createSerializerMock(); + $serializer + ->expects($this->once()) + ->method('toString') + ->willReturnCallback(function () use ($message) { + $message->setKey('theSerializedKey'); + + return 'theSerializedMessage'; + }) + ; + + $destination = new RdKafkaTopic('theQueueName'); + + $producer = new RdKafkaProducer($kafkaProducer, $serializer); + $producer->send($destination, $message); + } + + public function testShouldGetPartitionFromDestination(): void + { + $partition = 2; + + $kafkaTopic = $this->createKafkaTopicMock(); + $kafkaTopic + ->expects($this->once()) + ->method('producev') + ->with( + $partition, + 0, + 'theSerializedMessage', + 'theSerializedKey' + ) + ; + + $kafkaProducer = $this->createKafkaProducerMock(); + $kafkaProducer + ->expects($this->once()) + ->method('newTopic') + ->willReturn($kafkaTopic) + ; + $kafkaProducer + ->expects($this->once()) + ->method('poll') + ->with(0) + ; + $messageHeaders = ['bar' => 'barVal']; + $message = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], $messageHeaders); + $message->setKey('key'); + + $serializer = $this->createSerializerMock(); + $serializer + ->expects($this->once()) + ->method('toString') + ->willReturnCallback(function () use ($message) { + $message->setKey('theSerializedKey'); + + return 'theSerializedMessage'; + }) + ; + + $destination = new RdKafkaTopic('theQueueName'); + $destination->setPartition($partition); + + $producer = new RdKafkaProducer($kafkaProducer, $serializer); + $producer->send($destination, $message); + } + /** * @return \PHPUnit\Framework\MockObject\MockObject|ProducerTopic */ From ae77b30364eb898097613faad0719155a99e6d7b Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Wed, 8 Sep 2021 19:09:48 +0200 Subject: [PATCH 1004/1142] Allow psr/log v2 and v3 --- composer.json | 2 +- pkg/enqueue/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index b2d066538..9f3100769 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ "php-amqplib/php-amqplib": "^3.0", "doctrine/dbal": "^2.12|^3.1", "ramsey/uuid": "^3.5|^4", - "psr/log": "^1.1", + "psr/log": "^1.1 || ^2.0 || ^3.0", "psr/container": "^1", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^1.4.3", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 8ff51a47a..a36d5f78c 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -12,7 +12,7 @@ "enqueue/null": "^0.10", "enqueue/dsn": "^0.10", "ramsey/uuid": "^3.5|^4", - "psr/log": "^1", + "psr/log": "^1.0 || ^2.0 || ^3.0", "psr/container": "^1" }, "require-dev": { From f52be4bbc2887aa0b013a1f9a3e493500cc6ce89 Mon Sep 17 00:00:00 2001 From: Henning Date: Thu, 30 Sep 2021 15:21:39 +0200 Subject: [PATCH 1005/1142] just work on the next message based on priority and published_at --- pkg/dbal/DbalSubscriptionConsumer.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/pkg/dbal/DbalSubscriptionConsumer.php b/pkg/dbal/DbalSubscriptionConsumer.php index 2551043e3..5f93aea21 100644 --- a/pkg/dbal/DbalSubscriptionConsumer.php +++ b/pkg/dbal/DbalSubscriptionConsumer.php @@ -94,16 +94,11 @@ public function consume(int $timeout = 0): void $now = time(); $redeliveryDelay = $this->getRedeliveryDelay() / 1000; // milliseconds to seconds - $currentQueueNames = []; while (true) { - if (empty($currentQueueNames)) { - $currentQueueNames = $queueNames; - } - $this->removeExpiredMessages(); $this->redeliverMessages(); - if ($message = $this->fetchMessage($currentQueueNames, $redeliveryDelay)) { + if ($message = $this->fetchMessage($queueNames, $redeliveryDelay)) { /** * @var DbalConsumer * @var callable $callback @@ -113,11 +108,7 @@ public function consume(int $timeout = 0): void if (false === call_user_func($callback, $message, $consumer)) { return; } - - unset($currentQueueNames[$message->getQueue()]); } else { - $currentQueueNames = []; - usleep($this->getPollingInterval() * 1000); } From 232d2ddcee568751208a3fede23bdc0224394b8a Mon Sep 17 00:00:00 2001 From: dgafka Date: Sat, 2 Oct 2021 18:22:53 +0200 Subject: [PATCH 1006/1142] Fix passed parameters for compatibility with newest version of dbal --- pkg/dbal/DbalConsumerHelperTrait.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 0d57541d6..4a3d32997 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -102,7 +102,7 @@ protected function redeliverMessages(): void ->set('redelivered', ':redelivered') ->andWhere('redeliver_after < :now') ->andWhere('delivery_id IS NOT NULL') - ->setParameter(':now', time(), DbalType::BIGINT) + ->setParameter('now', time(), DbalType::BIGINT) ->setParameter('deliveryId', null, DbalType::GUID) ->setParameter('redelivered', true, DbalType::BOOLEAN) ; @@ -130,7 +130,7 @@ protected function removeExpiredMessages(): void ->andWhere('delivery_id IS NULL') ->andWhere('redelivered = :redelivered') - ->setParameter(':now', time(), DbalType::BIGINT) + ->setParameter('now', time(), DbalType::BIGINT) ->setParameter('redelivered', false, DbalType::BOOLEAN) ; From b313429ae354508a633721db2dc0b7f77d82b6e1 Mon Sep 17 00:00:00 2001 From: Henning Date: Thu, 7 Oct 2021 20:03:36 +0200 Subject: [PATCH 1007/1142] add logic to walk through the different queues after each message --- pkg/dbal/DbalConsumerHelperTrait.php | 27 +++++++++++++++++++++++---- pkg/dbal/DbalSubscriptionConsumer.php | 8 +++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 0d57541d6..57071ccce 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -30,16 +30,17 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa $endAt = microtime(true) + 0.2; // add 200ms $select = $this->getConnection()->createQueryBuilder() - ->select('id') + ->select('MIN(id)') + ->addSelect('queue') ->from($this->getContext()->getTableName()) ->andWhere('queue IN (:queues)') ->andWhere('delayed_until IS NULL OR delayed_until <= :delayedUntil') ->andWhere('delivery_id IS NULL') ->addOrderBy('priority', 'asc') ->addOrderBy('published_at', 'asc') + ->groupBy('queue') ->setParameter('queues', $queues, Connection::PARAM_STR_ARRAY) - ->setParameter('delayedUntil', $now, DbalType::INTEGER) - ->setMaxResults(1); + ->setParameter('delayedUntil', $now, DbalType::INTEGER); $update = $this->getConnection()->createQueryBuilder() ->update($this->getContext()->getTableName()) @@ -53,7 +54,12 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa while (microtime(true) < $endAt) { try { - $result = $select->execute()->fetch(); + $results = $select->execute()->fetch(); + if (empty($results)) { + return null; + } + + $result = $this->getResultByQueueList($results, $queues); if (empty($result)) { return null; } @@ -155,4 +161,17 @@ private function deleteMessage(string $deliveryId): void ['delivery_id' => DbalType::GUID] ); } + + private function getResultByQueueList(array $results, array $queues): ?array + { + $results = array_combine(array_column($results, 'queue'), $results); + + foreach ($queues as $queue) { + if (isset($results[$queue])) { + return $results[$queue]; + } + } + + return null; + } } diff --git a/pkg/dbal/DbalSubscriptionConsumer.php b/pkg/dbal/DbalSubscriptionConsumer.php index 5f93aea21..e76c7d8a1 100644 --- a/pkg/dbal/DbalSubscriptionConsumer.php +++ b/pkg/dbal/DbalSubscriptionConsumer.php @@ -87,8 +87,9 @@ public function consume(int $timeout = 0): void $queueNames = []; foreach (array_keys($this->subscribers) as $queueName) { - $queueNames[$queueName] = $queueName; + $queueNames[] = $queueName; } + $queueNames = array_unique($queueNames); $timeout /= 1000; $now = time(); @@ -108,6 +109,11 @@ public function consume(int $timeout = 0): void if (false === call_user_func($callback, $message, $consumer)) { return; } + + $queueNames = array_filter($queueNames, static function ($queueName) use ($message) { + return $message->getQueue() !== $queueName; + }); + $queueNames[] = $message->getQueue(); } else { usleep($this->getPollingInterval() * 1000); } From 1f00e43660aa914b2b7e9816e018d919921e480d Mon Sep 17 00:00:00 2001 From: Henning Date: Thu, 7 Oct 2021 20:17:34 +0200 Subject: [PATCH 1008/1142] small changes reagrding naming --- pkg/dbal/DbalConsumerHelperTrait.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 57071ccce..05581cf7e 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -30,8 +30,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa $endAt = microtime(true) + 0.2; // add 200ms $select = $this->getConnection()->createQueryBuilder() - ->select('MIN(id)') - ->addSelect('queue') + ->select('MIN(id) as id', 'queue') ->from($this->getContext()->getTableName()) ->andWhere('queue IN (:queues)') ->andWhere('delayed_until IS NULL OR delayed_until <= :delayedUntil') From d9af231e19ad603196ff687d0ed7a4216e4dcd17 Mon Sep 17 00:00:00 2001 From: Henning Date: Thu, 7 Oct 2021 21:45:08 +0200 Subject: [PATCH 1009/1142] micro select for each queue --- pkg/dbal/DbalConsumerHelperTrait.php | 40 +++++++++++++--------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index 05581cf7e..14dee6f7a 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -29,18 +29,6 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa $endAt = microtime(true) + 0.2; // add 200ms - $select = $this->getConnection()->createQueryBuilder() - ->select('MIN(id) as id', 'queue') - ->from($this->getContext()->getTableName()) - ->andWhere('queue IN (:queues)') - ->andWhere('delayed_until IS NULL OR delayed_until <= :delayedUntil') - ->andWhere('delivery_id IS NULL') - ->addOrderBy('priority', 'asc') - ->addOrderBy('published_at', 'asc') - ->groupBy('queue') - ->setParameter('queues', $queues, Connection::PARAM_STR_ARRAY) - ->setParameter('delayedUntil', $now, DbalType::INTEGER); - $update = $this->getConnection()->createQueryBuilder() ->update($this->getContext()->getTableName()) ->set('delivery_id', ':deliveryId') @@ -53,12 +41,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa while (microtime(true) < $endAt) { try { - $results = $select->execute()->fetch(); - if (empty($results)) { - return null; - } - - $result = $this->getResultByQueueList($results, $queues); + $result = $this->getResultByQueueList($queues, $now); if (empty($result)) { return null; } @@ -161,13 +144,26 @@ private function deleteMessage(string $deliveryId): void ); } - private function getResultByQueueList(array $results, array $queues): ?array + private function getResultByQueueList(array $queues, int $now): ?array { - $results = array_combine(array_column($results, 'queue'), $results); + $select = $this->getConnection()->createQueryBuilder() + ->select('id') + ->from($this->getContext()->getTableName()) + ->andWhere('queue = :queue') + ->andWhere('delayed_until IS NULL OR delayed_until <= :delayedUntil') + ->andWhere('delivery_id IS NULL') + ->addOrderBy('priority', 'asc') + ->addOrderBy('published_at', 'asc') + ->setParameter('delayedUntil', $now, DbalType::INTEGER) + ->setMaxResults(1); foreach ($queues as $queue) { - if (isset($results[$queue])) { - return $results[$queue]; + $select->setParameter('queue', $queue, DbalType::STRING); + + $result = $select->execute()->fetch(); + + if (!empty($result)) { + return $result; } } From 993f6c113c991077f55c262ea29708ec47d36284 Mon Sep 17 00:00:00 2001 From: maartenderie Date: Fri, 29 Oct 2021 15:03:12 +0200 Subject: [PATCH 1010/1142] RdKafka; Replace composer-modifying for testing with --ignore-platform-req argument --- pkg/rdkafka/.github/workflows/ci.yml | 4 ++-- pkg/rdkafka/Tests/bootstrap.php | 3 +++ pkg/rdkafka/Tests/fix_composer_json.php | 9 --------- 3 files changed, 5 insertions(+), 11 deletions(-) delete mode 100644 pkg/rdkafka/Tests/fix_composer_json.php diff --git a/pkg/rdkafka/.github/workflows/ci.yml b/pkg/rdkafka/.github/workflows/ci.yml index fd96b2abe..5f6516ab0 100644 --- a/pkg/rdkafka/.github/workflows/ci.yml +++ b/pkg/rdkafka/.github/workflows/ci.yml @@ -22,8 +22,8 @@ jobs: php-version: ${{ matrix.php }} coverage: none - - run: php Tests/fix_composer_json.php - - uses: "ramsey/composer-install@v1" + with: # ext-rdkafka not needed for tests, and a pain to install on CI; + composer-options: "--ignore-platform-req=ext-rdkafka" - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/rdkafka/Tests/bootstrap.php b/pkg/rdkafka/Tests/bootstrap.php index bf112623e..1d4816c83 100644 --- a/pkg/rdkafka/Tests/bootstrap.php +++ b/pkg/rdkafka/Tests/bootstrap.php @@ -12,5 +12,8 @@ } } +// Pretend that a high version was installed, opposed to 0.8.5 from kwn/php-rdkafka-stubs +const RD_KAFKA_VERSION = 42424242; + include_once $kafkaStubsDir.'/stubs/constants.php'; include_once $kafkaStubsDir.'/stubs/functions.php'; diff --git a/pkg/rdkafka/Tests/fix_composer_json.php b/pkg/rdkafka/Tests/fix_composer_json.php deleted file mode 100644 index b778f6f69..000000000 --- a/pkg/rdkafka/Tests/fix_composer_json.php +++ /dev/null @@ -1,9 +0,0 @@ - Date: Fri, 29 Oct 2021 15:08:27 +0200 Subject: [PATCH 1011/1142] RdKafka; Replace composer-modifying for testing with --ignore-platform-req argument --- pkg/rdkafka/.github/workflows/ci.yml | 2 ++ pkg/rdkafka/Tests/bootstrap.php | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/rdkafka/.github/workflows/ci.yml b/pkg/rdkafka/.github/workflows/ci.yml index 5f6516ab0..58f56b0a3 100644 --- a/pkg/rdkafka/.github/workflows/ci.yml +++ b/pkg/rdkafka/.github/workflows/ci.yml @@ -26,4 +26,6 @@ jobs: with: # ext-rdkafka not needed for tests, and a pain to install on CI; composer-options: "--ignore-platform-req=ext-rdkafka" + - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/rdkafka/Tests/bootstrap.php b/pkg/rdkafka/Tests/bootstrap.php index 1d4816c83..bf112623e 100644 --- a/pkg/rdkafka/Tests/bootstrap.php +++ b/pkg/rdkafka/Tests/bootstrap.php @@ -12,8 +12,5 @@ } } -// Pretend that a high version was installed, opposed to 0.8.5 from kwn/php-rdkafka-stubs -const RD_KAFKA_VERSION = 42424242; - include_once $kafkaStubsDir.'/stubs/constants.php'; include_once $kafkaStubsDir.'/stubs/functions.php'; From 65498e32c92c6b1fa92a448e3bac1f699c826fd6 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 29 Oct 2021 19:52:35 +0300 Subject: [PATCH 1012/1142] Release 0.10.14 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 994d639bd..45612509a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## [0.10.14](https://github.com/php-enqueue/enqueue-dev/tree/0.10.14) (2021-10-29) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.13...0.10.14) + +**Merged pull requests:** + +- Fix passed parameters for compatibility with newest version of dbal [\#1203](https://github.com/php-enqueue/enqueue-dev/pull/1203) ([dgafka](https://github.com/dgafka)) +- Allow psr/log v2 and v3 [\#1198](https://github.com/php-enqueue/enqueue-dev/pull/1198) ([snapshotpl](https://github.com/snapshotpl)) +- Fix partition's choice for the cases when partition number is zero [\#1196](https://github.com/php-enqueue/enqueue-dev/pull/1196) ([rodrigosarmentopicpay](https://github.com/rodrigosarmentopicpay)) +- Added getter for offset field in RdKafkaConsumer class [\#1184](https://github.com/php-enqueue/enqueue-dev/pull/1184) ([DigitVE](https://github.com/DigitVE)) + ## [0.10.13](https://github.com/php-enqueue/enqueue-dev/tree/0.10.13) (2021-08-25) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.12...0.10.13) From 72bcd7a9ab6df98585c01ace41352baf331f7176 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Fri, 29 Oct 2021 21:23:45 +0200 Subject: [PATCH 1013/1142] Fix doctrine test with wrong json type --- pkg/job-queue/Tests/Functional/Entity/Job.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/job-queue/Tests/Functional/Entity/Job.php b/pkg/job-queue/Tests/Functional/Entity/Job.php index b6e0308a4..ccbf4fda9 100644 --- a/pkg/job-queue/Tests/Functional/Entity/Job.php +++ b/pkg/job-queue/Tests/Functional/Entity/Job.php @@ -95,7 +95,7 @@ class Job extends BaseJob /** * @var array * - * @ORM\Column(name="data", type="json_array", nullable=true) + * @ORM\Column(name="data", type="json", nullable=true) */ protected $data; From acd6195cedb2a0291fe1d838b2af71b3eb154116 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Fri, 29 Oct 2021 21:51:15 +0200 Subject: [PATCH 1014/1142] ping is deprecated - use DummySelectSQL from platform and execute them! --- .../DoctrinePingConnectionExtension.php | 23 ++++++++++++++- .../DoctrinePingConnectionExtensionTest.php | 28 +++++++++++++++---- pkg/enqueue-bundle/composer.json | 6 ++++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php index 77212508f..d02efad25 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php @@ -3,9 +3,11 @@ namespace Enqueue\Bundle\Consumption\Extension; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Exception\ConnectionLost; use Doctrine\Persistence\ManagerRegistry; use Enqueue\Consumption\Context\MessageReceived; use Enqueue\Consumption\MessageReceivedExtensionInterface; +use ErrorException; class DoctrinePingConnectionExtension implements MessageReceivedExtensionInterface { @@ -27,7 +29,7 @@ public function onMessageReceived(MessageReceived $context): void continue; } - if ($connection->ping()) { + if ($this->ping($connection)) { continue; } @@ -43,4 +45,23 @@ public function onMessageReceived(MessageReceived $context): void ); } } + + private function ping(Connection $connection): bool + { + set_error_handler(static function (int $severity, string $message, string $file, int $line): bool { + throw new ErrorException($message, $severity, $severity, $file, $line); + }); + + try { + $dummySelectSQL = $connection->getDatabasePlatform()->getDummySelectSQL(); + + $connection->executeQuery($dummySelectSQL); + + return true; + } catch (ErrorException | ConnectionLost $exception) { + return false; + } finally { + restore_error_handler(); + } + } } diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index b740e64c1..1e98e0079 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -3,6 +3,9 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Driver\DriverException; +use Doctrine\DBAL\Exception\ConnectionLost; +use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\Persistence\ManagerRegistry; use Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension; use Enqueue\Consumption\Context\MessageReceived; @@ -29,10 +32,17 @@ public function testShouldNotReconnectIfConnectionIsOK() ->method('isConnected') ->willReturn(true) ; + + $abstractPlatform = $this->createMock(AbstractPlatform::class); + $abstractPlatform->expects($this->once()) + ->method('getDummySelectSQL') + ->willReturn('dummy') + ; + $connection ->expects($this->once()) - ->method('ping') - ->willReturn(true) + ->method('getDatabasePlatform') + ->willReturn($abstractPlatform) ; $connection ->expects($this->never()) @@ -70,8 +80,8 @@ public function testShouldDoesReconnectIfConnectionFailed() ; $connection ->expects($this->once()) - ->method('ping') - ->willReturn(false) + ->method('getDatabasePlatform') + ->willThrowException(new ConnectionLost('message', $this->createMock(DriverException::class))) ; $connection ->expects($this->once()) @@ -128,10 +138,16 @@ public function testShouldSkipIfConnectionWasNotOpened() ->method('isConnected') ->willReturn(true) ; + $abstractPlatform = $this->createMock(AbstractPlatform::class); + $abstractPlatform->expects($this->once()) + ->method('getDummySelectSQL') + ->willReturn('dummy') + ; + $connection2 ->expects($this->once()) - ->method('ping') - ->willReturn(true) + ->method('getDatabasePlatform') + ->willReturn($abstractPlatform) ; $context = $this->createContext(); diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 035dd2b1b..b7be27e25 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -20,6 +20,12 @@ "source": "https://github.com/php-enqueue/enqueue-dev", "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, + "repositories": [ + { + "type": "git", + "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" + } + ], "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/stomp": "0.10.x-dev", From 4b98940541468d74ffdc34572dd8100f1762b90a Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Fri, 29 Oct 2021 22:01:53 +0200 Subject: [PATCH 1015/1142] Fix for doctrine/dbal v2 and v3 --- .../Extension/DoctrinePingConnectionExtensionTest.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index 1e98e0079..b6ce74728 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -78,10 +78,15 @@ public function testShouldDoesReconnectIfConnectionFailed() ->method('isConnected') ->willReturn(true) ; + + $exception = class_exists(DriverException::class) + ? new ConnectionLost('message', $this->createMock(DriverException::class)) + : new ConnectionLost($this->createMock(Doctrine\DBAL\Driver\Exception::class), null); + $connection ->expects($this->once()) ->method('getDatabasePlatform') - ->willThrowException(new ConnectionLost('message', $this->createMock(DriverException::class))) + ->willThrowException($exception) ; $connection ->expects($this->once()) From 6807e4e7e6b579de5190137522a9593db399690d Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Fri, 29 Oct 2021 22:05:37 +0200 Subject: [PATCH 1016/1142] Simplify test by catch all exceptions --- .../Extension/DoctrinePingConnectionExtension.php | 3 ++- .../Extension/DoctrinePingConnectionExtensionTest.php | 8 +------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php index d02efad25..e4707c1f2 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php @@ -8,6 +8,7 @@ use Enqueue\Consumption\Context\MessageReceived; use Enqueue\Consumption\MessageReceivedExtensionInterface; use ErrorException; +use Throwable; class DoctrinePingConnectionExtension implements MessageReceivedExtensionInterface { @@ -58,7 +59,7 @@ private function ping(Connection $connection): bool $connection->executeQuery($dummySelectSQL); return true; - } catch (ErrorException | ConnectionLost $exception) { + } catch (Throwable $exception) { return false; } finally { restore_error_handler(); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index b6ce74728..94f5f3303 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -3,8 +3,6 @@ namespace Enqueue\Bundle\Tests\Unit\Consumption\Extension; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Driver\DriverException; -use Doctrine\DBAL\Exception\ConnectionLost; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\Persistence\ManagerRegistry; use Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension; @@ -79,14 +77,10 @@ public function testShouldDoesReconnectIfConnectionFailed() ->willReturn(true) ; - $exception = class_exists(DriverException::class) - ? new ConnectionLost('message', $this->createMock(DriverException::class)) - : new ConnectionLost($this->createMock(Doctrine\DBAL\Driver\Exception::class), null); - $connection ->expects($this->once()) ->method('getDatabasePlatform') - ->willThrowException($exception) + ->willThrowException(new \Exception()) ; $connection ->expects($this->once()) From 9e05145e6f519f29521e5c07e15c10620ea3914f Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Fri, 29 Oct 2021 22:08:56 +0200 Subject: [PATCH 1017/1142] Fix test by not use ping method anymore --- .../Extension/DoctrinePingConnectionExtensionTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index 94f5f3303..341ca5c23 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -127,7 +127,7 @@ public function testShouldSkipIfConnectionWasNotOpened() ; $connection1 ->expects($this->never()) - ->method('ping') + ->method('getDatabasePlatform') ; // 2nd connection was opened in the past From 76469abc642c03201f9b654598ef10c6d0d2297e Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Fri, 29 Oct 2021 22:09:38 +0200 Subject: [PATCH 1018/1142] Remove unused class --- .../Consumption/Extension/DoctrinePingConnectionExtension.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php index e4707c1f2..7cc53688d 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php @@ -3,7 +3,6 @@ namespace Enqueue\Bundle\Consumption\Extension; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Exception\ConnectionLost; use Doctrine\Persistence\ManagerRegistry; use Enqueue\Consumption\Context\MessageReceived; use Enqueue\Consumption\MessageReceivedExtensionInterface; From b2d1229c52b17b301591e6126160963b99aebc98 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Fri, 29 Oct 2021 22:26:35 +0200 Subject: [PATCH 1019/1142] DOnt use removed dbal function --- pkg/dbal/Tests/Functional/DbalConsumerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index c95ada687..f5b686cb9 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -173,7 +173,7 @@ private function getQuerySize(): int { return (int) $this->context->getDbalConnection() ->executeQuery('SELECT count(*) FROM '.$this->context->getTableName()) - ->fetchColumn(0) + ->fetchOne() ; } } From f00127c85d1452d2bf1be7ad044e1811513b5a97 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Fri, 29 Oct 2021 22:37:39 +0200 Subject: [PATCH 1020/1142] Fix run ci tests for null package --- pkg/null/.github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/null/.github/workflows/ci.yml b/pkg/null/.github/workflows/ci.yml index fd2ae7f2d..a168dca05 100644 --- a/pkg/null/.github/workflows/ci.yml +++ b/pkg/null/.github/workflows/ci.yml @@ -26,4 +26,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional From f43c2b81a8a499db6cbf459b81ed19e345af96d5 Mon Sep 17 00:00:00 2001 From: ADmad Date: Wed, 20 Oct 2021 17:50:04 +0000 Subject: [PATCH 1021/1142] Allow psr/container v2. --- composer.json | 2 +- pkg/enqueue/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 9f3100769..5153ac607 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ "doctrine/dbal": "^2.12|^3.1", "ramsey/uuid": "^3.5|^4", "psr/log": "^1.1 || ^2.0 || ^3.0", - "psr/container": "^1", + "psr/container": "^1 || ^2.0", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^1.4.3", "doctrine/orm": "^2.7.4", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index a36d5f78c..fdb365761 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -13,7 +13,7 @@ "enqueue/dsn": "^0.10", "ramsey/uuid": "^3.5|^4", "psr/log": "^1.0 || ^2.0 || ^3.0", - "psr/container": "^1" + "psr/container": "^1 || ^2.0" }, "require-dev": { "phpunit/phpunit": "^9.5", From 5b8c771e4080572eaf62b893d047b663e66c0999 Mon Sep 17 00:00:00 2001 From: Kate Simozhenko Date: Tue, 16 Nov 2021 15:51:51 +0200 Subject: [PATCH 1022/1142] add FIFO logic to SNS --- pkg/sns/SnsDestination.php | 30 +++++++++++++++++++++ pkg/sns/SnsMessage.php | 54 ++++++++++++++++++++++++++++++++++++++ pkg/sns/SnsProducer.php | 8 ++++++ 3 files changed, 92 insertions(+) diff --git a/pkg/sns/SnsDestination.php b/pkg/sns/SnsDestination.php index 0db9d914e..7b3b0c5ba 100644 --- a/pkg/sns/SnsDestination.php +++ b/pkg/sns/SnsDestination.php @@ -70,6 +70,36 @@ public function getDeliveryPolicy(): ?int return $this->getAttribute('DeliveryPolicy'); } + /** + * Only FIFO. + * + * Designates a topic as FIFO. You can provide this attribute only during queue creation. + * You can't change it for an existing topic. When you set this attribute, you must provide aMessageGroupId + * explicitly. + * For more information, see https://docs.aws.amazon.com/sns/latest/dg/sns-fifo-topics.html + * + * @param bool $enable + */ + public function setFifoTopic(bool $enable): void + { + $value = $enable ? 'true' : null; + + $this->setAttribute('FifoTopic', $value); + } + + /** + * Only FIFO. + * + * Enables content-based deduplication. + * For more information, see: https://docs.aws.amazon.com/sns/latest/dg/fifo-message-dedup.html + */ + public function setContentBasedDeduplication(bool $enable): void + { + $value = $enable ? 'true' : null; + + $this->setAttribute('ContentBasedDeduplication', $value); + } + public function getAttributes(): array { return $this->attributes; diff --git a/pkg/sns/SnsMessage.php b/pkg/sns/SnsMessage.php index f7311d0b0..9569846ff 100644 --- a/pkg/sns/SnsMessage.php +++ b/pkg/sns/SnsMessage.php @@ -42,6 +42,16 @@ class SnsMessage implements Message */ private $targetArn; + /** + * @var string|null + */ + private $messageGroupId; + + /** + * @var string|null + */ + private $messageDeduplicationId; + /** * SnsMessage constructor. * @@ -220,4 +230,48 @@ public function setTargetArn(?string $targetArn): void { $this->targetArn = $targetArn; } + + /** + * Only FIFO. + * + * The tag that specifies that a message belongs to a specific message group. Messages that belong to the same + * message group are processed in a FIFO manner (however, messages in different message groups might be processed + * out of order). + * To interleave multiple ordered streams within a single queue, use MessageGroupId values (for example, session + * data for multiple users). In this scenario, multiple readers can process the queue, but the session data + * of each user is processed in a FIFO fashion. + * For more information, see: https://docs.aws.amazon.com/sns/latest/dg/fifo-message-grouping.html + * + * @param string|null $id + */ + public function setMessageGroupId(string $id = null): void + { + $this->messageGroupId = $id; + } + + /** + * @return string|null + */ + public function getMessageGroupId(): ?string + { + return $this->messageGroupId; + } + + /** + * Only FIFO. + * + * The token used for deduplication of sent messages. If a message with a particular MessageDeduplicationId is + * sent successfully, any messages sent with the same MessageDeduplicationId are accepted successfully but + * aren't delivered during the 5-minute deduplication interval. + * For more information, see https://docs.aws.amazon.com/sns/latest/dg/fifo-message-dedup.html + */ + public function setMessageDeduplicationId(string $id = null): void + { + $this->messageDeduplicationId = $id; + } + + public function getMessageDeduplicationId(): ?string + { + return $this->messageDeduplicationId; + } } diff --git a/pkg/sns/SnsProducer.php b/pkg/sns/SnsProducer.php index d4eba04d0..bbd46a96f 100644 --- a/pkg/sns/SnsProducer.php +++ b/pkg/sns/SnsProducer.php @@ -77,6 +77,14 @@ public function send(Destination $destination, Message $message): void $arguments['TargetArn'] = $targetArn; } + if ($messageGroupId = $message->getMessageGroupId()) { + $arguments['MessageGroupId'] = $messageGroupId; + } + + if ($messageDeduplicationId = $message->getMessageDeduplicationId()) { + $arguments['MessageDeduplicationId'] = $messageDeduplicationId; + } + $result = $this->context->getSnsClient()->publish($arguments); if (false == $result->hasKey('MessageId')) { From e03f42950c5ddcef4c3054e40ae4d472e331688f Mon Sep 17 00:00:00 2001 From: Kate Simozhenko Date: Thu, 18 Nov 2021 14:59:01 +0200 Subject: [PATCH 1023/1142] fix code style --- .github/workflows/ci.yml | 1 + pkg/sns/SnsDestination.php | 2 -- pkg/sns/SnsMessage.php | 57 +------------------------------------- 3 files changed, 2 insertions(+), 58 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9756e22f5..eba7de96b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,7 @@ jobs: - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php + - run: cd docker && docker build --rm --force-rm --no-cache --pull --tag "enqueue/dev:latest" -f Dockerfile . - run: docker run --workdir="/mqdev" -v "`pwd`:/mqdev" --rm enqueue/dev:latest php -d memory_limit=1024M bin/phpstan analyse -l 1 -c phpstan.neon --error-format=github -- ${{ env.GIT_DIFF_FILTERED }} if: env.GIT_DIFF_FILTERED diff --git a/pkg/sns/SnsDestination.php b/pkg/sns/SnsDestination.php index 7b3b0c5ba..5823fd91e 100644 --- a/pkg/sns/SnsDestination.php +++ b/pkg/sns/SnsDestination.php @@ -77,8 +77,6 @@ public function getDeliveryPolicy(): ?int * You can't change it for an existing topic. When you set this attribute, you must provide aMessageGroupId * explicitly. * For more information, see https://docs.aws.amazon.com/sns/latest/dg/sns-fifo-topics.html - * - * @param bool $enable */ public function setFifoTopic(bool $enable): void { diff --git a/pkg/sns/SnsMessage.php b/pkg/sns/SnsMessage.php index 9569846ff..43c85e553 100644 --- a/pkg/sns/SnsMessage.php +++ b/pkg/sns/SnsMessage.php @@ -58,15 +58,6 @@ class SnsMessage implements Message * See AWS documentation for message attribute structure. * * @see https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#shape-messageattributevalue - * - * @param string $body - * @param array $properties - * @param array $headers - * @param array|null $messageAttributes - * @param string|null $messageStructure - * @param string|null $phoneNumber - * @param string|null $subject - * @param string|null $targetArn */ public function __construct( string $body = '', @@ -89,89 +80,58 @@ public function __construct( $this->redelivered = false; } - /** - * @return string|null - */ public function getSnsMessageId(): ?string { return $this->snsMessageId; } - /** - * @param string|null $snsMessageId - */ public function setSnsMessageId(?string $snsMessageId): void { $this->snsMessageId = $snsMessageId; } - /** - * @return string|null - */ public function getMessageStructure(): ?string { return $this->messageStructure; } - /** - * @param string|null $messageStructure - */ public function setMessageStructure(?string $messageStructure): void { $this->messageStructure = $messageStructure; } - /** - * @return string|null - */ public function getPhoneNumber(): ?string { return $this->phoneNumber; } - /** - * @param string|null $phoneNumber - */ public function setPhoneNumber(?string $phoneNumber): void { $this->phoneNumber = $phoneNumber; } - /** - * @return string|null - */ public function getSubject(): ?string { return $this->subject; } - /** - * @param string|null $subject - */ public function setSubject(?string $subject): void { $this->subject = $subject; } - /** - * @return array|null - */ public function getMessageAttributes(): ?array { return $this->messageAttributes; } - /** - * @param array|null $messageAttributes - */ public function setMessageAttributes(?array $messageAttributes): void { $this->messageAttributes = $messageAttributes; } /** - * @param string $name - * @param null $default + * @param null $default * * @return array|null */ @@ -187,9 +147,6 @@ public function getAttribute(string $name, $default = null) * 'DataType' => '', // REQUIRED * 'StringValue' => '', * ]. - * - * @param string $name - * @param array|null $attribute */ public function setAttribute(string $name, ?array $attribute): void { @@ -201,7 +158,6 @@ public function setAttribute(string $name, ?array $attribute): void } /** - * @param string $name * @param string $dataType String, String.Array, Number, or Binary * @param string|resource|StreamInterface $value */ @@ -215,17 +171,11 @@ public function addAttribute(string $name, string $dataType, $value): void ]; } - /** - * @return string|null - */ public function getTargetArn(): ?string { return $this->targetArn; } - /** - * @param string|null $targetArn - */ public function setTargetArn(?string $targetArn): void { $this->targetArn = $targetArn; @@ -241,17 +191,12 @@ public function setTargetArn(?string $targetArn): void * data for multiple users). In this scenario, multiple readers can process the queue, but the session data * of each user is processed in a FIFO fashion. * For more information, see: https://docs.aws.amazon.com/sns/latest/dg/fifo-message-grouping.html - * - * @param string|null $id */ public function setMessageGroupId(string $id = null): void { $this->messageGroupId = $id; } - /** - * @return string|null - */ public function getMessageGroupId(): ?string { return $this->messageGroupId; From 45b74c92b10d3c399dfc55173306e9ae1545487c Mon Sep 17 00:00:00 2001 From: Ernesto Rodriguez Ortiz Date: Tue, 16 Nov 2021 12:15:20 -0500 Subject: [PATCH 1024/1142] feat(snsqs): allow client http configuration for sns and sqs This changes allow to set in the AWS Sdk client the http configurations: https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_configuration.html#config-http This will make possible to define custom `connect_timeout` and `timeout` to fail fast when the network is not relaible. Reported on https://github.com/php-enqueue/enqueue-dev/issues/1213 --- pkg/sns/SnsConnectionFactory.php | 6 ++++ .../Tests/SnsConnectionFactoryConfigTest.php | 26 +++++++++++++++++ pkg/sns/Tests/SnsConnectionFactoryTest.php | 6 ++-- pkg/sqs/SqsConnectionFactory.php | 6 ++++ .../Tests/SqsConnectionFactoryConfigTest.php | 29 +++++++++++++++++++ pkg/sqs/Tests/SqsConnectionFactoryTest.php | 2 ++ 6 files changed, 73 insertions(+), 2 deletions(-) diff --git a/pkg/sns/SnsConnectionFactory.php b/pkg/sns/SnsConnectionFactory.php index 67903ba22..8a815abad 100644 --- a/pkg/sns/SnsConnectionFactory.php +++ b/pkg/sns/SnsConnectionFactory.php @@ -105,6 +105,10 @@ private function establishConnection(): SnsClient } } + if (isset($this->config['http'])) { + $config['http'] = $this->config['http']; + } + $establishConnection = function () use ($config) { return (new Sdk(['Sns' => $config]))->createMultiRegionSns(); }; @@ -134,6 +138,7 @@ private function parseDsn(string $dsn): array 'lazy' => $dsn->getBool('lazy'), 'endpoint' => $dsn->getString('endpoint'), 'topic_arns' => $dsn->getArray('topic_arns', [])->toArray(), + 'http' => $dsn->getArray('http', [])->toArray(), ]), function ($value) { return null !== $value; }); } @@ -148,6 +153,7 @@ private function defaultConfig(): array 'lazy' => true, 'endpoint' => null, 'topic_arns' => [], + 'http' => [], ]; } } diff --git a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php index 51983b126..de32d4265 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php @@ -65,6 +65,7 @@ public static function provideConfigs() 'lazy' => true, 'endpoint' => null, 'topic_arns' => [], + 'http' => [], ], ]; @@ -79,6 +80,7 @@ public static function provideConfigs() 'lazy' => true, 'endpoint' => null, 'topic_arns' => [], + 'http' => [], ], ]; @@ -93,6 +95,7 @@ public static function provideConfigs() 'lazy' => true, 'endpoint' => null, 'topic_arns' => [], + 'http' => [], ], ]; @@ -107,6 +110,7 @@ public static function provideConfigs() 'lazy' => false, 'endpoint' => null, 'topic_arns' => [], + 'http' => [], ], ]; @@ -121,6 +125,7 @@ public static function provideConfigs() 'lazy' => false, 'endpoint' => null, 'topic_arns' => [], + 'http' => [], ], ]; @@ -135,6 +140,7 @@ public static function provideConfigs() 'lazy' => false, 'endpoint' => null, 'topic_arns' => [], + 'http' => [], ], ]; @@ -155,6 +161,7 @@ public static function provideConfigs() 'lazy' => false, 'endpoint' => 'http://localstack:1111/', 'topic_arns' => [], + 'http' => [], ], ]; @@ -172,6 +179,25 @@ public static function provideConfigs() 'topic1' => 'arn:aws:sns:us-east-1:123456789012:topic1', 'topic2' => 'arn:aws:sns:us-west-2:123456789012:topic2', ], + 'http' => [], + ], + ]; + + yield [ + ['dsn' => 'sns:?http[timeout]=5&http[connect_timeout]=2'], + [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'version' => '2010-03-31', + 'lazy' => true, + 'endpoint' => null, + 'topic_arns' => [], + 'http' => [ + 'timeout' => '5', + 'connect_timeout' => '2', + ], ], ]; } diff --git a/pkg/sns/Tests/SnsConnectionFactoryTest.php b/pkg/sns/Tests/SnsConnectionFactoryTest.php index 5cc8f197b..4e9ad6ec9 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryTest.php @@ -33,7 +33,8 @@ public function testCouldBeConstructedWithEmptyConfiguration() 'region' => null, 'version' => '2010-03-31', 'endpoint' => null, - 'topic_arns' => [], + 'topic_arns' => [], + 'http' => [], ], 'config', $factory); } @@ -49,7 +50,8 @@ public function testCouldBeConstructedWithCustomConfiguration() 'region' => null, 'version' => '2010-03-31', 'endpoint' => null, - 'topic_arns' => [], + 'topic_arns' => [], + 'http' => [], ], 'config', $factory); } diff --git a/pkg/sqs/SqsConnectionFactory.php b/pkg/sqs/SqsConnectionFactory.php index a39cf806a..71e73b705 100644 --- a/pkg/sqs/SqsConnectionFactory.php +++ b/pkg/sqs/SqsConnectionFactory.php @@ -108,6 +108,10 @@ private function establishConnection(): SqsClient } } + if (isset($this->config['http'])) { + $config['http'] = $this->config['http']; + } + $establishConnection = function () use ($config) { return (new Sdk(['Sqs' => $config]))->createMultiRegionSqs(); }; @@ -139,6 +143,7 @@ private function parseDsn(string $dsn): array 'endpoint' => $dsn->getString('endpoint'), 'profile' => $dsn->getString('profile'), 'queue_owner_aws_account_id' => $dsn->getString('queue_owner_aws_account_id'), + 'http' => $dsn->getArray('http', [])->toArray(), ]), function ($value) { return null !== $value; }); } @@ -155,6 +160,7 @@ private function defaultConfig(): array 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ]; } } diff --git a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php index 83c656c0b..6fa9298be 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php @@ -67,6 +67,7 @@ public static function provideConfigs() 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], ]; @@ -83,6 +84,7 @@ public static function provideConfigs() 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], ]; @@ -99,6 +101,7 @@ public static function provideConfigs() 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], ]; @@ -115,6 +118,7 @@ public static function provideConfigs() 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], ]; @@ -131,6 +135,7 @@ public static function provideConfigs() 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], ]; @@ -147,6 +152,7 @@ public static function provideConfigs() 'endpoint' => null, 'profile' => 'staging', 'queue_owner_aws_account_id' => null, + 'http' => [], ], ]; @@ -163,6 +169,7 @@ public static function provideConfigs() 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], ]; @@ -185,6 +192,7 @@ public static function provideConfigs() 'endpoint' => 'http://localstack:1111/', 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], ]; @@ -203,6 +211,27 @@ public static function provideConfigs() 'endpoint' => null, 'profile' => 'staging', 'queue_owner_aws_account_id' => null, + 'http' => [], + ], + ]; + + yield [ + ['dsn' => 'sqs:?http[timeout]=5&http[connect_timeout]=2'], + [ + 'key' => null, + 'secret' => null, + 'token' => null, + 'region' => null, + 'retries' => 3, + 'version' => '2012-11-05', + 'lazy' => true, + 'endpoint' => null, + 'profile' => null, + 'queue_owner_aws_account_id' => null, + 'http' => [ + 'timeout' => '5', + 'connect_timeout' => '2', + ], ], ]; } diff --git a/pkg/sqs/Tests/SqsConnectionFactoryTest.php b/pkg/sqs/Tests/SqsConnectionFactoryTest.php index 9eb072c77..c327522c5 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryTest.php @@ -36,6 +36,7 @@ public function testCouldBeConstructedWithEmptyConfiguration() 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], 'config', $factory); } @@ -54,6 +55,7 @@ public function testCouldBeConstructedWithCustomConfiguration() 'endpoint' => null, 'profile' => null, 'queue_owner_aws_account_id' => null, + 'http' => [], ], 'config', $factory); } From 66f15d0704a21271dc51d0ef0cbcdfb61a8ed940 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 11 Dec 2021 13:00:17 +0200 Subject: [PATCH 1025/1142] Release 0.10.15 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45612509a..a89a3d339 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## [0.10.15](https://github.com/php-enqueue/enqueue-dev/tree/0.10.15) (2021-12-11) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.14...0.10.15) + +**Merged pull requests:** + +- feat\(snsqs\): allow client http configuration for sns and sqs [\#1216](https://github.com/php-enqueue/enqueue-dev/pull/1216) ([eortiz-tracktik](https://github.com/eortiz-tracktik)) +- Add FIFO logic to SNS [\#1214](https://github.com/php-enqueue/enqueue-dev/pull/1214) ([kate-simozhenko](https://github.com/kate-simozhenko)) +- Fix falling tests [\#1211](https://github.com/php-enqueue/enqueue-dev/pull/1211) ([snapshotpl](https://github.com/snapshotpl)) +- RdKafka; Replace composer-modifying for testing with --ignore-platform-req argument [\#1210](https://github.com/php-enqueue/enqueue-dev/pull/1210) ([maartenderie](https://github.com/maartenderie)) +- Allow psr/container v2 [\#1206](https://github.com/php-enqueue/enqueue-dev/pull/1206) ([ADmad](https://github.com/ADmad)) + ## [0.10.14](https://github.com/php-enqueue/enqueue-dev/tree/0.10.14) (2021-10-29) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.13...0.10.14) From d187f6ee03c0d41fd245c1439de1ef48efdf123b Mon Sep 17 00:00:00 2001 From: Shyim <6224096+shyim@users.noreply.github.com> Date: Mon, 13 Dec 2021 16:46:21 +0100 Subject: [PATCH 1026/1142] Fix types for Symfony 5.4 --- pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php | 2 +- pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php b/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php index a63e75431..323d146d1 100644 --- a/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php +++ b/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php @@ -71,7 +71,7 @@ public function ensureString($body) /** * {@inheritdoc} */ - public function getName() + public function getName(): string { return 'enqueue.message_queue'; } diff --git a/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php b/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php index 1f5fdcba7..e4ee5fc6c 100644 --- a/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php +++ b/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php @@ -30,7 +30,7 @@ public function flushMessages() /** * {@inheritdoc} */ - public static function getSubscribedEvents() + public static function getSubscribedEvents(): array { $events = []; From f830b5ee5c4f017d9144e8fde0fc9c401ff1c8d2 Mon Sep 17 00:00:00 2001 From: Shyim <6224096+shyim@users.noreply.github.com> Date: Tue, 4 Jan 2022 16:27:51 +0100 Subject: [PATCH 1027/1142] Fix codestyle --- pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php b/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php index e4ee5fc6c..8fa6fb4f6 100644 --- a/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php +++ b/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php @@ -14,9 +14,6 @@ class FlushSpoolProducerListener implements EventSubscriberInterface */ private $producer; - /** - * @param SpoolProducer $producer - */ public function __construct(SpoolProducer $producer) { $this->producer = $producer; From 626002857cbe02d99901d12dbf38ac18263054a4 Mon Sep 17 00:00:00 2001 From: Henning Date: Mon, 10 Jan 2022 18:47:44 +0100 Subject: [PATCH 1028/1142] if no queue was consumed, then wait the polling interval. Otherweise continue processing the queues! --- pkg/dbal/DbalConsumerHelperTrait.php | 40 +++++++++------------------ pkg/dbal/DbalSubscriptionConsumer.php | 27 ++++++++++++------ 2 files changed, 31 insertions(+), 36 deletions(-) diff --git a/pkg/dbal/DbalConsumerHelperTrait.php b/pkg/dbal/DbalConsumerHelperTrait.php index aba7c9ac7..4a3d32997 100644 --- a/pkg/dbal/DbalConsumerHelperTrait.php +++ b/pkg/dbal/DbalConsumerHelperTrait.php @@ -29,6 +29,18 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa $endAt = microtime(true) + 0.2; // add 200ms + $select = $this->getConnection()->createQueryBuilder() + ->select('id') + ->from($this->getContext()->getTableName()) + ->andWhere('queue IN (:queues)') + ->andWhere('delayed_until IS NULL OR delayed_until <= :delayedUntil') + ->andWhere('delivery_id IS NULL') + ->addOrderBy('priority', 'asc') + ->addOrderBy('published_at', 'asc') + ->setParameter('queues', $queues, Connection::PARAM_STR_ARRAY) + ->setParameter('delayedUntil', $now, DbalType::INTEGER) + ->setMaxResults(1); + $update = $this->getConnection()->createQueryBuilder() ->update($this->getContext()->getTableName()) ->set('delivery_id', ':deliveryId') @@ -41,7 +53,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?DbalMessa while (microtime(true) < $endAt) { try { - $result = $this->getResultByQueueList($queues, $now); + $result = $select->execute()->fetch(); if (empty($result)) { return null; } @@ -143,30 +155,4 @@ private function deleteMessage(string $deliveryId): void ['delivery_id' => DbalType::GUID] ); } - - private function getResultByQueueList(array $queues, int $now): ?array - { - $select = $this->getConnection()->createQueryBuilder() - ->select('id') - ->from($this->getContext()->getTableName()) - ->andWhere('queue = :queue') - ->andWhere('delayed_until IS NULL OR delayed_until <= :delayedUntil') - ->andWhere('delivery_id IS NULL') - ->addOrderBy('priority', 'asc') - ->addOrderBy('published_at', 'asc') - ->setParameter('delayedUntil', $now, DbalType::INTEGER) - ->setMaxResults(1); - - foreach ($queues as $queue) { - $select->setParameter('queue', $queue, DbalType::STRING); - - $result = $select->execute()->fetch(); - - if (!empty($result)) { - return $result; - } - } - - return null; - } } diff --git a/pkg/dbal/DbalSubscriptionConsumer.php b/pkg/dbal/DbalSubscriptionConsumer.php index e76c7d8a1..145496917 100644 --- a/pkg/dbal/DbalSubscriptionConsumer.php +++ b/pkg/dbal/DbalSubscriptionConsumer.php @@ -87,21 +87,29 @@ public function consume(int $timeout = 0): void $queueNames = []; foreach (array_keys($this->subscribers) as $queueName) { - $queueNames[] = $queueName; + $queueNames[$queueName] = $queueName; } - $queueNames = array_unique($queueNames); $timeout /= 1000; $now = time(); $redeliveryDelay = $this->getRedeliveryDelay() / 1000; // milliseconds to seconds + $currentQueueNames = []; + $queueConsumed = false; while (true) { + if (empty($currentQueueNames)) { + $currentQueueNames = $queueNames; + $queueConsumed = false; + } + $this->removeExpiredMessages(); $this->redeliverMessages(); - if ($message = $this->fetchMessage($queueNames, $redeliveryDelay)) { + if ($message = $this->fetchMessage($currentQueueNames, $redeliveryDelay)) { + $queueConsumed = true; + /** - * @var DbalConsumer + * @var DbalConsumer $consumer * @var callable $callback */ [$consumer, $callback] = $this->subscribers[$message->getQueue()]; @@ -110,12 +118,13 @@ public function consume(int $timeout = 0): void return; } - $queueNames = array_filter($queueNames, static function ($queueName) use ($message) { - return $message->getQueue() !== $queueName; - }); - $queueNames[] = $message->getQueue(); + unset($currentQueueNames[$message->getQueue()]); } else { - usleep($this->getPollingInterval() * 1000); + $currentQueueNames = []; + + if (!$queueConsumed) { + usleep($this->getPollingInterval() * 1000); + } } if ($timeout && microtime(true) >= $now + $timeout) { From 1930c72afa831752fee99133dac0c957946d7aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20DECOOL?= Date: Thu, 3 Feb 2022 20:28:44 +0100 Subject: [PATCH 1029/1142] Force makasim/nginx-php-fpm for thruway Docker service --- docker/thruway/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/thruway/Dockerfile b/docker/thruway/Dockerfile index 3bca735b2..042a49d64 100644 --- a/docker/thruway/Dockerfile +++ b/docker/thruway/Dockerfile @@ -1,4 +1,4 @@ -FROM makasim/nginx-php-fpm:latest-all-exts +FROM makasim/nginx-php-fpm:7.4-all-exts RUN mkdir -p /thruway WORKDIR /thruway From d23df867f4f60aa63fb04110b86f9b9c3fea62ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20DECOOL?= Date: Thu, 3 Feb 2022 21:17:40 +0100 Subject: [PATCH 1030/1142] Fix PEAR/pecl usage in Docker --- docker/Dockerfile | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 30f013cb8..da12c39a5 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -22,13 +22,20 @@ RUN set -x && \ php${PHP_VERSION}-xml \ php${PHP_VERSION}-mysql \ php${PHP_VERSION}-curl \ - libgearman-dev \ - php-pear \ make \ - unzip \ + g++ \ + unzip + +## gearman +RUN set -x && \ + apt-get install -y --no-install-recommends --no-install-suggests \ + libgearman-dev \ && \ - pecl channel-update pecl.php.net && \ - pecl install gearman && \ + mkdir -p $HOME/gearman && \ + cd $HOME/gearman && \ + git clone https://github.com/php/pecl-networking-gearman.git . && \ + git checkout gearman-2.1.0 && \ + phpize && ./configure && make && make install && \ if [ ! -f /etc/php/${PHP_VERSION}/cli/conf.d/20-gearman.ini ]; then \ echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/cli/conf.d/20-gearman.ini && \ echo "extension=gearman.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/20-gearman.ini \ @@ -37,16 +44,19 @@ RUN set -x && \ ## librdkafka RUN set -x && \ - apt-get update && \ - apt-get install -y --no-install-recommends --no-install-suggests \ - g++ \ - && \ mkdir -p $HOME/librdkafka && \ cd $HOME/librdkafka && \ git clone https://github.com/edenhill/librdkafka.git . && \ git checkout v1.0.0 && \ - ./configure && make && make install && \ - pecl install rdkafka && \ + ./configure && make && make install + +## php-rdkafka +RUN set -x && \ + mkdir -p $HOME/php-rdkafka && \ + cd $HOME/php-rdkafka && \ + git clone https://github.com/arnaud-lb/php-rdkafka.git . && \ + git checkout 5.0.1 && \ + phpize && ./configure && make all && make install && \ echo "extension=rdkafka.so" > /etc/php/${PHP_VERSION}/cli/conf.d/10-rdkafka.ini && \ echo "extension=rdkafka.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/10-rdkafka.ini From c3901cd398193d433f402b5c5cd477f6c8ad2587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20DECOOL?= Date: Thu, 3 Feb 2022 21:37:27 +0100 Subject: [PATCH 1031/1142] Fix PHP version usage in Docker container --- docker/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index da12c39a5..b1e0d8b03 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -24,7 +24,9 @@ RUN set -x && \ php${PHP_VERSION}-curl \ make \ g++ \ - unzip + unzip \ + && \ + update-alternatives --install /usr/bin/php php /usr/bin/php${PHP_VERSION} 100 ## gearman RUN set -x && \ From a0cc3ea8e26998c80fff7d7d56b406c33b0618c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20DECOOL?= Date: Thu, 3 Feb 2022 22:07:07 +0100 Subject: [PATCH 1032/1142] Fix guzzlehttp/psr7 version --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 5153ac607..da4d3960c 100644 --- a/composer.json +++ b/composer.json @@ -47,6 +47,7 @@ "influxdb/influxdb-php": "^1.14", "datadog/php-datadogstatsd": "^1.3", "guzzlehttp/guzzle": "^7.0.1", + "guzzlehttp/psr7": "^1.0", "php-http/discovery": "^1.13", "voryx/thruway-common": "^1.0.1", "react/dns": "^1.4", From eae9964ccbe281d66882747ae51e84be943dca08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20DECOOL?= Date: Thu, 20 Jan 2022 21:22:27 +0100 Subject: [PATCH 1033/1142] Allow usage of ext-rdkafka 6 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index da4d3960c..0740e385f 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "ext-amqp": "^1.9.3", "ext-gearman": "^2.0", "ext-mongodb": "^1.5", - "ext-rdkafka": "^4.0|^5.0", + "ext-rdkafka": "^4.0|^5.0|^6.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8.1", From d1a2239b58286ca83ab0ca90f407fa9123ce9266 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 10 Feb 2022 18:37:52 +0200 Subject: [PATCH 1034/1142] Replace rabbitmq-management-api with a packagist source --- composer.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 0740e385f..6f04cc787 100644 --- a/composer.json +++ b/composer.json @@ -8,12 +8,6 @@ "cs-lint": "bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff", "phpstan": "bin/phpstan analyse --memory-limit=512M -c phpstan.neon" }, - "repositories": [ - { - "type": "git", - "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" - } - ], "require": { "php": "^7.3|^8.0", @@ -40,7 +34,7 @@ "stomp-php/stomp-php": "^4.5|^5", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", - "richardfullmer/rabbitmq-management-api": "^2.1.1", + "andrewmy/rabbitmq-management-api": "^2.1.2", "predis/predis": "^1.1", "thruway/client": "^0.5.5", "thruway/pawl-transport": "^0.5.1", From c384473ab3e3c0e5cddcf7040658bd77496a16e3 Mon Sep 17 00:00:00 2001 From: oreillysean Date: Sun, 13 Feb 2022 18:25:34 +0000 Subject: [PATCH 1035/1142] Replace rabbitmq-management-api with a packagist source Also fixed small typo that would prevents github actions from working if that is ever needed --- pkg/stomp/.github/workflows/ci.yml | 2 +- pkg/stomp/composer.json | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/pkg/stomp/.github/workflows/ci.yml b/pkg/stomp/.github/workflows/ci.yml index fd2ae7f2d..a168dca05 100644 --- a/pkg/stomp/.github/workflows/ci.yml +++ b/pkg/stomp/.github/workflows/ci.yml @@ -26,4 +26,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 2e4963400..383ce6fe9 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -5,12 +5,6 @@ "keywords": ["messaging", "queue", "stomp"], "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", - "repositories": [ - { - "type": "git", - "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" - } - ], "require": { "php": "^7.3|^8.0", "enqueue/dsn": "^0.10", @@ -18,7 +12,7 @@ "queue-interop/queue-interop": "^0.8", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", - "richardfullmer/rabbitmq-management-api": "^2.1.1", + "andrewmy/rabbitmq-management-api": "^2.1.2", "guzzlehttp/guzzle": "^7.0.1", "php-http/discovery": "^1.13" }, From e132fd32237bea22496eb8b3d64d15f2e117772a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Thu, 10 Feb 2022 18:49:44 +0200 Subject: [PATCH 1036/1142] Add support for Symfony 6 --- .github/workflows/ci.yml | 12 +- .php_cs.php | 12 +- composer.json | 29 ++-- pkg/async-command/composer.json | 16 +- pkg/async-event-dispatcher/composer.json | 12 +- .../Tests/Functional/App/AppKernel.php | 23 ++- .../Tests/Functional/App/CustomAppKernel.php | 23 ++- .../Functional/App/config/config-sf5.yml | 129 ++++++++++++++++ .../Tests/Functional/App/config/config.yml | 5 +- .../App/config/custom-config-sf5.yml | 85 +++++++++++ .../Functional/App/config/custom-config.yml | 2 +- .../Tests/Functional/LazyProducerTest.php | 5 +- .../Tests/Functional/UseCasesTest.php | 7 +- .../Tests/Functional/WebTestCase.php | 5 +- .../DoctrinePingConnectionExtensionTest.php | 2 +- pkg/enqueue-bundle/composer.json | 8 +- pkg/enqueue/Container/Container.php | 2 +- .../DelayRedeliveredMessageExtensionTest.php | 2 +- .../Client/Driver/RabbitMqStompDriverTest.php | 2 +- pkg/enqueue/composer.json | 20 +-- pkg/fs/composer.json | 6 +- .../Tests/Functional/WebTestCase.php | 5 +- .../Tests/Functional/app/AppKernel.php | 23 ++- .../Functional/app/config/config-sf5.yml | 33 ++++ .../Tests/Functional/app/config/config.yml | 2 +- pkg/job-queue/composer.json | 8 +- pkg/simple-client/composer.json | 4 +- pkg/test/TestLogger.php | 144 ++++++++++++++++++ 28 files changed, 505 insertions(+), 121 deletions(-) create mode 100644 pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml create mode 100644 pkg/enqueue-bundle/Tests/Functional/App/config/custom-config-sf5.yml create mode 100644 pkg/job-queue/Tests/Functional/app/config/config-sf5.yml create mode 100644 pkg/test/TestLogger.php diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eba7de96b..4854df188 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,11 +78,15 @@ jobs: fail-fast: false matrix: php: ['7.3', '7.4', '8.0'] - symfony_version: ['4.4.*', '5.2.*'] + symfony_version: ['4.4.*', '5.2.*', '6.0.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: - php: '8.0' symfony_version: '4.4.*' + - php: '7.3' + symfony_version: '6.0.*' + - php: '7.4' + symfony_version: '6.0.*' name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} @@ -122,12 +126,16 @@ jobs: fail-fast: false matrix: php: ['7.4', '8.0'] # same as in the container - symfony_version: ['4.4.*', '5.2.*'] + symfony_version: ['4.4.*', '5.2.*', '6.0.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] rdkafka_action: ['exclude-group', 'group'] exclude: - php: '8.0' symfony_version: '4.4.*' + - php: '7.3' + symfony_version: '6.0.*' + - php: '7.4' + symfony_version: '6.0.*' name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, rdkafka_action=${{ matrix.rdkafka_action }}, deps=${{ matrix.dependencies }} diff --git a/.php_cs.php b/.php_cs.php index e28581304..e1755cb13 100644 --- a/.php_cs.php +++ b/.php_cs.php @@ -1,6 +1,6 @@ setRiskyAllowed(true) ->setRules(array( '@Symfony' => true, @@ -8,9 +8,13 @@ 'array_syntax' => array('syntax' => 'short'), 'combine_consecutive_unsets' => true, // one should use PHPUnit methods to set up expected exception instead of annotations - 'general_phpdoc_annotation_remove' => array('expectedException', 'expectedExceptionMessage', 'expectedExceptionMessageRegExp'), + 'general_phpdoc_annotation_remove' => ['annotations' => + ['expectedException', 'expectedExceptionMessage', 'expectedExceptionMessageRegExp'] + ], 'heredoc_to_nowdoc' => true, - 'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'), + 'no_extra_blank_lines' => ['tokens' => [ + 'break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'] + ], 'no_unreachable_default_argument_value' => true, 'no_useless_else' => true, 'no_useless_return' => true, @@ -18,7 +22,7 @@ 'ordered_imports' => true, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_order' => true, - 'psr4' => true, + 'psr_autoloading' => true, 'strict_param' => true, 'native_function_invocation' => false, )) diff --git a/composer.json b/composer.json index 6f04cc787..fe4e5570f 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ "doctrine/dbal": "^2.12|^3.1", "ramsey/uuid": "^3.5|^4", "psr/log": "^1.1 || ^2.0 || ^3.0", - "psr/container": "^1 || ^2.0", + "psr/container": "^1.1 || ^2.0", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^1.4.3", "doctrine/orm": "^2.7.4", @@ -53,23 +53,23 @@ "phpunit/phpunit": "^9.5", "phpstan/phpstan": "^0.12", "queue-interop/queue-spec": "^0.6.2", - "symfony/browser-kit": "^4.3|^5", - "symfony/config": "^4.3|^5", - "symfony/process": "^4.3|^5", - "symfony/console": "^4.3|^5", - "symfony/dependency-injection": "^4.3|^5", - "symfony/event-dispatcher": "^4.3|^5", - "symfony/expression-language": "^4.3|^5", - "symfony/http-kernel": "^4.3|^5", - "symfony/filesystem": "^4.3|^5", - "symfony/framework-bundle": "^4.3|^5", - "symfony/yaml": "^4.3|^5", + "symfony/browser-kit": "^4.3|^5|^6.0", + "symfony/config": "^4.3|^5|^6.0", + "symfony/process": "^4.3|^5|^6.0", + "symfony/console": "^4.3|^5|^6.0", + "symfony/dependency-injection": "^4.3|^5|^6.0", + "symfony/event-dispatcher": "^4.3|^5|^6.0", + "symfony/expression-language": "^4.3|^5|^6.0", + "symfony/http-kernel": "^4.3|^5|^6.0", + "symfony/filesystem": "^4.3|^5|^6.0", + "symfony/framework-bundle": "^4.3|^5|^6.0", + "symfony/yaml": "^4.3|^5|^6.0", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^2.0.3", - "friendsofphp/php-cs-fixer": "^2", + "friendsofphp/php-cs-fixer": "^3.4", "dms/phpunit-arraysubset-asserts": "^0.2.1", "phpspec/prophecy-phpunit": "^2.0" }, @@ -127,7 +127,8 @@ "ext-mongodb": "1.5", "ext-bcmath": "1", "ext-mbstring": "1", - "ext-mongo": "1.6.14" + "ext-mongo": "1.6.14", + "ext-sockets": "1" }, "prefer-stable": true } diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 4317d1eca..932499ecf 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -9,16 +9,16 @@ "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", - "symfony/console": "^4.3|^5", - "symfony/process": "^4.3|^5" + "symfony/console": "^4.3|^5|^6.0", + "symfony/process": "^4.3|^5|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/dependency-injection": "^4.3|^5", - "symfony/config": "^4.3|^5", - "symfony/http-kernel": "^4.3|^5", - "symfony/filesystem": "^4.3|^5", - "symfony/yaml": "^4.3|^5", + "symfony/dependency-injection": "^4.3|^5|^6.0", + "symfony/config": "^4.3|^5|^6.0", + "symfony/http-kernel": "^4.3|^5|^6.0", + "symfony/filesystem": "^4.3|^5|^6.0", + "symfony/yaml": "^4.3|^5|^6.0", "enqueue/null": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/test": "0.10.x-dev" @@ -31,7 +31,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "suggest": { - "symfony/dependency-injection": "^4.3|^5 If you'd like to use async event dispatcher container extension." + "symfony/dependency-injection": "^4.3|^5|^6.0 If you'd like to use async event dispatcher container extension." }, "autoload": { "psr-4": { "Enqueue\\AsyncCommand\\": "" }, diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index d5adc5f7b..28ed42b4f 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -9,15 +9,15 @@ "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", - "symfony/event-dispatcher": "^4.3|^5" + "symfony/event-dispatcher": "^4.3|^5|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/dependency-injection": "^4.3|^5", - "symfony/config": "^4.3|^5", - "symfony/http-kernel": "^4.3|^5", - "symfony/filesystem": "^4.3|^5", - "symfony/yaml": "^4.3|^5", + "symfony/dependency-injection": "^4.3|^5|^6.0", + "symfony/config": "^4.3|^5|^6.0", + "symfony/http-kernel": "^4.3|^5|^6.0", + "symfony/filesystem": "^4.3|^5|^6.0", + "symfony/yaml": "^4.3|^5|^6.0", "enqueue/null": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/test": "0.10.x-dev" diff --git a/pkg/enqueue-bundle/Tests/Functional/App/AppKernel.php b/pkg/enqueue-bundle/Tests/Functional/App/AppKernel.php index 49ae1c605..3cafeedda 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/AppKernel.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/AppKernel.php @@ -7,10 +7,7 @@ class AppKernel extends Kernel { - /** - * @return array - */ - public function registerBundles() + public function registerBundles(): iterable { $bundles = [ new \Symfony\Bundle\FrameworkBundle\FrameworkBundle(), @@ -21,28 +18,28 @@ public function registerBundles() return $bundles; } - /** - * @return string - */ - public function getCacheDir() + public function getCacheDir(): string { return sys_get_temp_dir().'/EnqueueBundle/cache'; } - /** - * @return string - */ - public function getLogDir() + public function getLogDir(): string { return sys_get_temp_dir().'/EnqueueBundle/cache/logs'; } public function registerContainerConfiguration(LoaderInterface $loader) { + if (self::VERSION_ID < 60000) { + $loader->load(__DIR__.'/config/config-sf5.yml'); + + return; + } + $loader->load(__DIR__.'/config/config.yml'); } - protected function getContainerClass() + protected function getContainerClass(): string { return parent::getContainerClass().'BundleDefault'; } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php b/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php index 2f272bf1b..11fa323d7 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php @@ -38,10 +38,7 @@ public function setEnqueueConfig(array $config) $fs->mkdir(sys_get_temp_dir().'/EnqueueBundleCustom/cache/'.$this->enqueueConfigId); } - /** - * @return array - */ - public function registerBundles() + public function registerBundles(): iterable { $bundles = [ new \Symfony\Bundle\FrameworkBundle\FrameworkBundle(), @@ -52,23 +49,17 @@ public function registerBundles() return $bundles; } - /** - * @return string - */ - public function getCacheDir() + public function getCacheDir(): string { return sys_get_temp_dir().'/EnqueueBundleCustom/cache/'.$this->enqueueConfigId; } - /** - * @return string - */ - public function getLogDir() + public function getLogDir(): string { return sys_get_temp_dir().'/EnqueueBundleCustom/cache/logs/'.$this->enqueueConfigId; } - protected function getContainerClass() + protected function getContainerClass(): string { return parent::getContainerClass().'Custom'.$this->enqueueConfigId; } @@ -78,7 +69,11 @@ protected function getContainerClass() */ protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader) { - $loader->load(__DIR__.'/config/custom-config.yml'); + if (self::VERSION_ID < 60000) { + $loader->load(__DIR__.'/config/custom-config-sf5.yml'); + } else { + $loader->load(__DIR__.'/config/custom-config.yml'); + } $c->loadFromExtension('enqueue', $this->enqueueConfig); } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml new file mode 100644 index 000000000..441dcb120 --- /dev/null +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml @@ -0,0 +1,129 @@ +parameters: + locale: 'en' + secret: 'ThisTokenIsNotSoSecretChangeIt' + + +framework: + #esi: ~ + #translator: { fallback: "%locale%" } + test: ~ + assets: false + session: + # the only option incompatible with Symfony 6 + storage_id: session.storage.mock_file + secret: '%secret%' + router: { resource: '%kernel.project_dir%/config/routing.yml' } + default_locale: '%locale%' + +doctrine: + dbal: + url: "%env(DOCTRINE_DSN)%" + driver: pdo_mysql + charset: UTF8 + +enqueue: + default: + transport: 'null:' + client: + traceable_producer: true + job: true + async_events: true + async_commands: + enabled: true + timeout: 60 + command_name: ~ + queue_name: ~ + +services: + test_enqueue.client.default.traceable_producer: + alias: 'enqueue.client.default.traceable_producer' + public: true + + test_enqueue.transport.default.queue_consumer: + alias: 'enqueue.transport.default.queue_consumer' + public: true + + test_enqueue.client.default.queue_consumer: + alias: 'enqueue.client.default.queue_consumer' + public: true + + test_enqueue.transport.default.rpc_client: + alias: 'enqueue.transport.default.rpc_client' + public: true + + test_enqueue.client.default.producer: + alias: 'enqueue.client.default.producer' + public: true + + test_enqueue.client.default.spool_producer: + alias: 'enqueue.client.default.spool_producer' + public: true + + test_Enqueue\Client\ProducerInterface: + alias: 'Enqueue\Client\ProducerInterface' + public: true + + test_enqueue.client.default.driver: + alias: 'enqueue.client.default.driver' + public: true + + test_enqueue.transport.default.context: + alias: 'enqueue.transport.default.context' + public: true + + test_enqueue.client.consume_command: + alias: 'enqueue.client.consume_command' + public: true + + test.enqueue.client.routes_command: + alias: 'enqueue.client.routes_command' + public: true + + test.enqueue.events.async_processor: + alias: 'enqueue.events.async_processor' + public: true + + test_async_listener: + class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncListener' + public: true + tags: + - { name: 'kernel.event_listener', async: true, event: 'test_async', method: 'onEvent' } + + test_command_subscriber_processor: + class: 'Enqueue\Bundle\Tests\Functional\App\TestCommandSubscriberProcessor' + public: true + tags: + - { name: 'enqueue.command_subscriber', client: 'default' } + + test_topic_subscriber_processor: + class: 'Enqueue\Bundle\Tests\Functional\App\TestTopicSubscriberProcessor' + public: true + tags: + - { name: 'enqueue.topic_subscriber', client: 'default' } + + test_exclusive_command_subscriber_processor: + class: 'Enqueue\Bundle\Tests\Functional\App\TestExclusiveCommandSubscriberProcessor' + public: true + tags: + - { name: 'enqueue.command_subscriber', client: 'default' } + + test_async_subscriber: + class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncSubscriber' + public: true + tags: + - { name: 'kernel.event_subscriber', async: true } + + test_async_event_transformer: + class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncEventTransformer' + public: true + arguments: + - '@enqueue.transport.default.context' + tags: + - {name: 'enqueue.event_transformer', eventName: 'test_async', transformerName: 'test_async' } + - {name: 'enqueue.event_transformer', eventName: 'test_async_subscriber', transformerName: 'test_async' } + + # overwrite async listener with one based on client producer. so we can use traceable producer. + enqueue.events.async_listener: + class: 'Enqueue\Bundle\Tests\Functional\App\AsyncListener' + public: true + arguments: ['@enqueue.client.default.producer', '@enqueue.events.registry'] diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 7b04a3f30..f2a7d336a 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -9,7 +9,7 @@ framework: test: ~ assets: false session: - storage_id: session.storage.mock_file + storage_factory_id: session.storage.factory.mock_file secret: '%secret%' router: { resource: '%kernel.project_dir%/config/routing.yml' } default_locale: '%locale%' @@ -126,3 +126,6 @@ services: class: 'Enqueue\Bundle\Tests\Functional\App\AsyncListener' public: true arguments: ['@enqueue.client.default.producer', '@enqueue.events.registry'] + + locale_aware_listener: + public: true diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config-sf5.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config-sf5.yml new file mode 100644 index 000000000..35192652e --- /dev/null +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config-sf5.yml @@ -0,0 +1,85 @@ +parameters: + locale: 'en' + secret: 'ThisTokenIsNotSoSecretChangeIt' + +framework: + #esi: ~ + #translator: { fallback: "%locale%" } + test: ~ + assets: false + session: + # the only option incompatible with Symfony 6 + storage_id: session.storage.mock_file + secret: '%secret%' + router: { resource: '%kernel.project_dir%/config/routing.yml' } + default_locale: '%locale%' + +doctrine: + dbal: + connections: + custom: + url: "%env(DOCTRINE_DSN)%" + driver: pdo_mysql + charset: UTF8 + +services: + test_enqueue.client.default.driver: + alias: 'enqueue.client.default.driver' + public: true + + test_enqueue.client.default.producer: + alias: 'enqueue.client.default.producer' + public: true + + test_enqueue.client.default.lazy_producer: + alias: 'enqueue.client.default.lazy_producer' + public: true + + test_enqueue.transport.default.context: + alias: 'enqueue.transport.default.context' + public: true + + test_enqueue.transport.consume_command: + alias: 'enqueue.transport.consume_command' + public: true + + test_enqueue.client.consume_command: + alias: 'enqueue.client.consume_command' + public: true + + test_enqueue.client.produce_command: + alias: 'enqueue.client.produce_command' + public: true + + test_enqueue.client.setup_broker_command: + alias: 'enqueue.client.setup_broker_command' + public: true + + test.message.processor: + class: 'Enqueue\Bundle\Tests\Functional\TestProcessor' + public: true + tags: + - { name: 'enqueue.topic_subscriber', client: 'default' } + - { name: 'enqueue.transport.processor', transport: 'default' } + + test.message.command_processor: + class: 'Enqueue\Bundle\Tests\Functional\TestCommandProcessor' + public: true + tags: + - { name: 'enqueue.command_subscriber', client: 'default' } + + test.sqs_client: + public: true + class: 'Aws\Sqs\SqsClient' + arguments: + - + endpoint: '%env(AWS_SQS_ENDPOINT)%' + region: '%env(AWS_SQS_REGION)%' + version: '%env(AWS_SQS_VERSION)%' + credentials: + key: '%env(AWS_SQS_KEY)%' + secret: '%env(AWS_SQS_SECRET)%' + + test.sqs_custom_connection_factory_factory: + class: 'Enqueue\Bundle\Tests\Functional\App\SqsCustomConnectionFactoryFactory' + arguments: ['@service_container'] diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml index 37c4660a0..d02f3002d 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/custom-config.yml @@ -8,7 +8,7 @@ framework: test: ~ assets: false session: - storage_id: session.storage.mock_file + storage_factory_id: session.storage.factory.mock_file secret: '%secret%' router: { resource: '%kernel.project_dir%/config/routing.yml' } default_locale: '%locale%' diff --git a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php index 19f139b69..858b80a1c 100644 --- a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php @@ -47,10 +47,7 @@ public function testShouldAllowGetLazyProducerWithoutError() $producer->sendEvent('foo', 'foo'); } - /** - * @return string - */ - public static function getKernelClass() + public static function getKernelClass(): string { include_once __DIR__.'/App/CustomAppKernel.php'; diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index af4159c25..ad278d599 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -18,7 +18,7 @@ */ class UseCasesTest extends WebTestCase { - const RECEIVE_TIMEOUT = 500; + private const RECEIVE_TIMEOUT = 500; protected function setUp(): void { @@ -360,10 +360,7 @@ public function testTransportConsumeCommandShouldConsumeOneMessage() $this->assertEquals($expectedBody, $processor->message->getBody()); } - /** - * @return string - */ - public static function getKernelClass() + public static function getKernelClass(): string { include_once __DIR__.'/App/CustomAppKernel.php'; diff --git a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php index ca462ea1e..6a348a9f3 100644 --- a/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php +++ b/pkg/enqueue-bundle/Tests/Functional/WebTestCase.php @@ -39,10 +39,7 @@ protected function tearDown(): void static::$client = null; } - /** - * @return string - */ - public static function getKernelClass() + public static function getKernelClass(): string { include_once __DIR__.'/App/AppKernel.php'; diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index 341ca5c23..c530eeaa9 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -7,13 +7,13 @@ use Doctrine\Persistence\ManagerRegistry; use Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension; use Enqueue\Consumption\Context\MessageReceived; +use Enqueue\Test\TestLogger; use Interop\Queue\Consumer; use Interop\Queue\Context as InteropContext; use Interop\Queue\Message; use Interop\Queue\Processor; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; -use Psr\Log\Test\TestLogger; class DoctrinePingConnectionExtensionTest extends TestCase { diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index b7be27e25..835380458 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "symfony/framework-bundle": "^4.3|^5", + "symfony/framework-bundle": "^4.3|^5|^6.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/enqueue": "^0.10", @@ -45,9 +45,9 @@ "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", - "symfony/browser-kit": "^4.3|^5", - "symfony/expression-language": "^4.3|^5", - "symfony/yaml": "^4.3|^5" + "symfony/browser-kit": "^4.3|^5|^6.0", + "symfony/expression-language": "^4.3|^5|^6.0", + "symfony/yaml": "^4.3|^5|^6.0" }, "suggest": { "enqueue/async-command": "If want to run Symfony command via message queue", diff --git a/pkg/enqueue/Container/Container.php b/pkg/enqueue/Container/Container.php index 255def33b..5abec276c 100644 --- a/pkg/enqueue/Container/Container.php +++ b/pkg/enqueue/Container/Container.php @@ -25,7 +25,7 @@ public function get($id) return $this->services[$id]; } - public function has($id) + public function has(string $id): bool { return array_key_exists($id, $this->services); } diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php index a92dc8df1..0481d27d8 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php @@ -10,6 +10,7 @@ use Enqueue\Consumption\Result; use Enqueue\Null\NullMessage; use Enqueue\Null\NullQueue; +use Enqueue\Test\TestLogger; use Interop\Queue\Consumer; use Interop\Queue\Context as InteropContext; use Interop\Queue\Destination; @@ -19,7 +20,6 @@ use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; -use Psr\Log\Test\TestLogger; class DelayRedeliveredMessageExtensionTest extends TestCase { diff --git a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php index fbcb68644..9fc72be1e 100644 --- a/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RabbitMqStompDriverTest.php @@ -18,13 +18,13 @@ use Enqueue\Stomp\StompMessage; use Enqueue\Stomp\StompProducer; use Enqueue\Test\ClassExtensionTrait; +use Enqueue\Test\TestLogger; use Interop\Queue\Context; use Interop\Queue\Message as InteropMessage; use Interop\Queue\Producer as InteropProducer; use Interop\Queue\Queue as InteropQueue; use Interop\Queue\Topic as InteropTopic; use PHPUnit\Framework\TestCase; -use Psr\Log\Test\TestLogger; class RabbitMqStompDriverTest extends TestCase { diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index fdb365761..82c77527e 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -13,16 +13,16 @@ "enqueue/dsn": "^0.10", "ramsey/uuid": "^3.5|^4", "psr/log": "^1.0 || ^2.0 || ^3.0", - "psr/container": "^1 || ^2.0" + "psr/container": "^1.1 || ^2.0" }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/console": "^4.3|^5", - "symfony/dependency-injection": "^4.3|^5", - "symfony/config": "^4.3|^5", - "symfony/event-dispatcher": "^4.3|^5", - "symfony/http-kernel": "^4.3|^5", - "symfony/yaml": "^4.3|^5", + "symfony/console": "^4.3|^5|^6.0", + "symfony/dependency-injection": "^4.3|^5|^6.0", + "symfony/config": "^4.3|^5|^6.0", + "symfony/event-dispatcher": "^4.3|^5|^6.0", + "symfony/http-kernel": "^4.3|^5|^6.0", + "symfony/yaml": "^4.3|^5|^6.0", "enqueue/amqp-ext": "0.10.x-dev", "enqueue/amqp-lib": "0.10.x-dev", "enqueue/amqp-bunny": "0.10.x-dev", @@ -42,9 +42,9 @@ "enqueue/dsn": "0.10.x-dev" }, "suggest": { - "symfony/console": "^2.8|^3|^4|^5 If you want to use cli commands", - "symfony/dependency-injection": "^4.3|^5", - "symfony/config": "^4.3|^5", + "symfony/console": "^2.8|^3|^4|^5|^6.0 If you want to use cli commands", + "symfony/dependency-injection": "^4.3|^5|^6.0", + "symfony/config": "^4.3|^5|^6.0", "enqueue/amqp-ext": "AMQP transport (based on php extension)", "enqueue/stomp": "STOMP transport", "enqueue/fs": "Filesystem transport", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 54f91e378..193d603d3 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -9,7 +9,7 @@ "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "symfony/filesystem": "^4.3|^5", + "symfony/filesystem": "^4.3|^5|^6.0", "makasim/temp-file": "^0.2@stable" }, "require-dev": { @@ -17,8 +17,8 @@ "enqueue/null": "0.10.x-dev", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6.2", - "symfony/dependency-injection": "^4.3|^5", - "symfony/yaml": "^4.3|^5" + "symfony/dependency-injection": "^4.3|^5|^6.0", + "symfony/yaml": "^4.3|^5|^6.0" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/job-queue/Tests/Functional/WebTestCase.php b/pkg/job-queue/Tests/Functional/WebTestCase.php index 90a8188dd..cd990384a 100644 --- a/pkg/job-queue/Tests/Functional/WebTestCase.php +++ b/pkg/job-queue/Tests/Functional/WebTestCase.php @@ -40,10 +40,7 @@ protected function tearDown(): void static::ensureKernelShutdown(); } - /** - * @return string - */ - public static function getKernelClass() + public static function getKernelClass(): string { require_once __DIR__.'/app/AppKernel.php'; diff --git a/pkg/job-queue/Tests/Functional/app/AppKernel.php b/pkg/job-queue/Tests/Functional/app/AppKernel.php index 9e6a24812..3cef602c2 100644 --- a/pkg/job-queue/Tests/Functional/app/AppKernel.php +++ b/pkg/job-queue/Tests/Functional/app/AppKernel.php @@ -7,10 +7,7 @@ class AppKernel extends Kernel { - /** - * @return array - */ - public function registerBundles() + public function registerBundles(): iterable { $bundles = [ new \Symfony\Bundle\FrameworkBundle\FrameworkBundle(), @@ -20,28 +17,28 @@ public function registerBundles() return $bundles; } - /** - * @return string - */ - public function getCacheDir() + public function getCacheDir(): string { return sys_get_temp_dir().'/EnqueueJobQueue/cache'; } - /** - * @return string - */ - public function getLogDir() + public function getLogDir(): string { return sys_get_temp_dir().'/EnqueueJobQueue/cache/logs'; } public function registerContainerConfiguration(LoaderInterface $loader) { + if (self::VERSION_ID < 60000) { + $loader->load(__DIR__.'/config/config-sf5.yml'); + + return; + } + $loader->load(__DIR__.'/config/config.yml'); } - protected function getContainerClass() + protected function getContainerClass(): string { return parent::getContainerClass().'JobQueue'; } diff --git a/pkg/job-queue/Tests/Functional/app/config/config-sf5.yml b/pkg/job-queue/Tests/Functional/app/config/config-sf5.yml new file mode 100644 index 000000000..dd3467e11 --- /dev/null +++ b/pkg/job-queue/Tests/Functional/app/config/config-sf5.yml @@ -0,0 +1,33 @@ +parameters: + locale: 'en' + secret: 'ThisTokenIsNotSoSecretChangeIt' + +framework: + #esi: ~ + #translator: { fallback: "%locale%" } + test: ~ + assets: false + session: + # the only option incompatible with Symfony 6 + storage_id: session.storage.mock_file + secret: "%secret%" + router: { resource: "%kernel.project_dir%/config/routing.yml" } + default_locale: "%locale%" + +doctrine: + dbal: + url: "%env(DOCTRINE_DSN)%" + driver: pdo_mysql + charset: UTF8 + wrapper_class: "Enqueue\\JobQueue\\Test\\DbalPersistedConnection" + orm: + auto_generate_proxy_classes: true + auto_mapping: true + mappings: + TestEntity: + mapping: true + type: annotation + dir: '%kernel.project_dir%/Tests/Functional/Entity' + alias: 'EnqueueJobQueue' + prefix: 'Enqueue\JobQueue\Tests\Functional\Entity' + is_bundle: false diff --git a/pkg/job-queue/Tests/Functional/app/config/config.yml b/pkg/job-queue/Tests/Functional/app/config/config.yml index b6d642b82..47cded132 100644 --- a/pkg/job-queue/Tests/Functional/app/config/config.yml +++ b/pkg/job-queue/Tests/Functional/app/config/config.yml @@ -8,7 +8,7 @@ framework: test: ~ assets: false session: - storage_id: session.storage.mock_file + storage_factory_id: session.storage.factory.mock_file secret: "%secret%" router: { resource: "%kernel.project_dir%/config/routing.yml" } default_locale: "%locale%" diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 2a41c1b92..998245e4b 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -17,10 +17,10 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "doctrine/doctrine-bundle": "^2.0", - "symfony/browser-kit": "^4.3|^5", - "symfony/expression-language": "^4.3|^5", - "symfony/framework-bundle": "^4.3|^5", - "symfony/yaml": "^4.3|^5" + "symfony/browser-kit": "^4.3|^5|^6.0", + "symfony/expression-language": "^4.3|^5|^6.0", + "symfony/framework-bundle": "^4.3|^5|^6.0", + "symfony/yaml": "^4.3|^5|^6.0" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 02e8a93f7..037bf3fcd 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.10", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", - "symfony/config": "^4.3|^5" + "symfony/config": "^4.3|^5|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", @@ -18,7 +18,7 @@ "enqueue/amqp-ext": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "symfony/yaml": "^4.3|^5" + "symfony/yaml": "^4.3|^5|^6.0" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/test/TestLogger.php b/pkg/test/TestLogger.php new file mode 100644 index 000000000..d61c67932 --- /dev/null +++ b/pkg/test/TestLogger.php @@ -0,0 +1,144 @@ + 0) { + $genericMethod = $matches[1].('Records' !== $matches[3] ? 'Record' : '').$matches[3]; + $level = strtolower($matches[2]); + if (method_exists($this, $genericMethod)) { + $args[] = $level; + + return call_user_func_array([$this, $genericMethod], $args); + } + } + throw new \BadMethodCallException('Call to undefined method TestLogger::'.$method.'()'); + } + + public function log($level, $message, array $context = []): void + { + $record = [ + 'level' => $level, + 'message' => $message, + 'context' => $context, + ]; + + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + public function hasRecords($level) + { + return isset($this->recordsByLevel[$level]); + } + + public function hasRecord($record, $level) + { + if (is_string($record)) { + $record = ['message' => $record]; + } + + return $this->hasRecordThatPasses(function ($rec) use ($record) { + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + + return true; + }, $level); + } + + public function hasRecordThatContains($message, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($message) { + return false !== strpos($rec['message'], $message); + }, $level); + } + + public function hasRecordThatMatches($regex, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($regex) { + return preg_match($regex, $rec['message']) > 0; + }, $level); + } + + public function hasRecordThatPasses(callable $predicate, $level) + { + if (!isset($this->recordsByLevel[$level])) { + return false; + } + foreach ($this->recordsByLevel[$level] as $i => $rec) { + if (call_user_func($predicate, $rec, $i)) { + return true; + } + } + + return false; + } + + public function reset() + { + $this->records = []; + $this->recordsByLevel = []; + } +} From 0ea448c3c3ca1fefdb3715e939c33012b815a391 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 15 Feb 2022 21:25:41 +0200 Subject: [PATCH 1037/1142] Clean up and typos --- pkg/async-event-dispatcher/README.md | 8 ++++---- pkg/enqueue-bundle/composer.json | 6 ------ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/pkg/async-event-dispatcher/README.md b/pkg/async-event-dispatcher/README.md index 1ba408fa7..f1629b59a 100644 --- a/pkg/async-event-dispatcher/README.md +++ b/pkg/async-event-dispatcher/README.md @@ -10,12 +10,12 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Symfony Async Event Dispatcher. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/async-event-dispathcer/CI)](https://github.com/php-enqueue/async-event-dispathcer/actions?query=workflow%3ACI) -[![Total Downloads](https://poser.pugx.org/enqueue/async-event-dispathcer/d/total.png)](https://packagist.org/packages/enqueue/async-event-dispathcer) -[![Latest Stable Version](https://poser.pugx.org/enqueue/async-event-dispathcer/version.png)](https://packagist.org/packages/enqueue/async-event-dispathcer) +[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/async-event-dispatcher/CI)](https://github.com/php-enqueue/async-event-dispathcer/actions?query=workflow%3ACI) +[![Total Downloads](https://poser.pugx.org/enqueue/async-event-dispathcer/d/total.png)](https://packagist.org/packages/enqueue/async-event-dispatcher) +[![Latest Stable Version](https://poser.pugx.org/enqueue/async-event-dispathcer/version.png)](https://packagist.org/packages/enqueue/async-event-dispatcher) It contains an extension to Symfony's [EventDispatcher](https://symfony.com/doc/current/components/event_dispatcher.html) component. -It allows to processes events in background by sending them to MQ. +It allows to process events in background by sending them to MQ. ## Resources diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 835380458..70eda07bd 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -20,12 +20,6 @@ "source": "https://github.com/php-enqueue/enqueue-dev", "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, - "repositories": [ - { - "type": "git", - "url": "https://github.com/andrewmy/php-rabbitmq-management-api.git" - } - ], "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/stomp": "0.10.x-dev", From e10a894a146792a362e50c48f17bfe15153f2124 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 15 Feb 2022 21:47:24 +0200 Subject: [PATCH 1038/1142] Fix events compatibility --- .../DependencyInjection/AsyncEventsPass.php | 51 +++++++++++++++---- .../Functional/App/config/config-sf5.yml | 4 +- .../Tests/Functional/App/config/config.yml | 4 +- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php index 5371eb869..e57d710f7 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php @@ -6,6 +6,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Kernel; class AsyncEventsPass implements CompilerPassInterface { @@ -21,6 +22,9 @@ public function process(ContainerBuilder $container): void $defaultClient = $container->getParameter('enqueue.default_client'); + // TODO: Remove when dropping Symfony < 5.3 + $useLegacyDispatcherConfig = (Kernel::VERSION_ID < 50300); + $registeredToEvent = []; foreach ($container->findTaggedServiceIds('kernel.event_listener') as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { @@ -32,8 +36,10 @@ public function process(ContainerBuilder $container): void $service = $container->getDefinition($serviceId); - $service->clearTag('kernel.event_listener'); - $service->addTag('enqueue.async_event_listener', $tagAttribute); + if ($useLegacyDispatcherConfig) { + $service->clearTag('kernel.event_listener'); + $service->addTag('enqueue.async_event_listener', $tagAttribute); + } if (false == isset($registeredToEvent[$event])) { $container->getDefinition('enqueue.events.async_listener') @@ -43,6 +49,16 @@ public function process(ContainerBuilder $container): void ]) ; + if (!$useLegacyDispatcherConfig) { + $container->getDefinition('enqueue.events.async_listener') + ->addTag('kernel.event_listener', [ + 'event' => $event, + 'method' => 'onEvent', + 'dispatcher' => 'enqueue.events.event_dispatcher', + ]) + ; + } + $container->getDefinition('enqueue.events.async_processor') ->addTag('enqueue.processor', [ 'topic' => 'event.'.$event, @@ -62,8 +78,11 @@ public function process(ContainerBuilder $container): void } $service = $container->getDefinition($serviceId); - $service->clearTag('kernel.event_subscriber'); - $service->addTag('enqueue.async_event_subscriber', $tagAttribute); + + if ($useLegacyDispatcherConfig) { + $service->clearTag('kernel.event_subscriber'); + $service->addTag('enqueue.async_event_subscriber', $tagAttribute); + } /** @var EventSubscriberInterface $serviceClass */ $serviceClass = $service->getClass(); @@ -77,6 +96,16 @@ public function process(ContainerBuilder $container): void ]) ; + if (!$useLegacyDispatcherConfig) { + $container->getDefinition('enqueue.events.async_listener') + ->addTag('kernel.event_listener', [ + 'event' => $event, + 'method' => 'onEvent', + 'dispatcher' => 'enqueue.events.event_dispatcher', + ]) + ; + } + $container->getDefinition('enqueue.events.async_processor') ->addTag('enqueue.processor', [ 'topicName' => 'event.'.$event, @@ -90,11 +119,13 @@ public function process(ContainerBuilder $container): void } } - $registerListenersPass = new RegisterListenersPass( - 'enqueue.events.event_dispatcher', - 'enqueue.async_event_listener', - 'enqueue.async_event_subscriber' - ); - $registerListenersPass->process($container); + if ($useLegacyDispatcherConfig) { + $registerListenersPass = new RegisterListenersPass( + 'enqueue.events.event_dispatcher', + 'enqueue.async_event_listener', + 'enqueue.async_event_subscriber' + ); + $registerListenersPass->process($container); + } } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml index 441dcb120..3a4f7795d 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml @@ -9,7 +9,7 @@ framework: test: ~ assets: false session: - # the only option incompatible with Symfony 6 + # option incompatible with Symfony 6 storage_id: session.storage.mock_file secret: '%secret%' router: { resource: '%kernel.project_dir%/config/routing.yml' } @@ -88,6 +88,7 @@ services: public: true tags: - { name: 'kernel.event_listener', async: true, event: 'test_async', method: 'onEvent' } + # In Symfony 6 you would also add "dispatcher: 'enqueue.events.event_dispatcher'" test_command_subscriber_processor: class: 'Enqueue\Bundle\Tests\Functional\App\TestCommandSubscriberProcessor' @@ -112,6 +113,7 @@ services: public: true tags: - { name: 'kernel.event_subscriber', async: true } + # In Symfony 6 you would also add "dispatcher: 'enqueue.events.event_dispatcher'" test_async_event_transformer: class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncEventTransformer' diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index f2a7d336a..0a33b27a7 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -86,7 +86,7 @@ services: class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncListener' public: true tags: - - { name: 'kernel.event_listener', async: true, event: 'test_async', method: 'onEvent' } + - { name: 'kernel.event_listener', async: true, event: 'test_async', method: 'onEvent', dispatcher: 'enqueue.events.event_dispatcher' } test_command_subscriber_processor: class: 'Enqueue\Bundle\Tests\Functional\App\TestCommandSubscriberProcessor' @@ -110,7 +110,7 @@ services: class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncSubscriber' public: true tags: - - { name: 'kernel.event_subscriber', async: true } + - { name: 'kernel.event_subscriber', async: true, dispatcher: 'enqueue.events.event_dispatcher' } test_async_event_transformer: class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncEventTransformer' From 8f0bcd6541df947e4b09fbc9f7c2621d9a8d2593 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 16 Feb 2022 10:14:37 +0200 Subject: [PATCH 1039/1142] Update docs --- docs/bundle/async_events.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/bundle/async_events.md b/docs/bundle/async_events.md index 7264f5f20..99b674a76 100644 --- a/docs/bundle/async_events.md +++ b/docs/bundle/async_events.md @@ -39,7 +39,7 @@ enqueue: ## Usage -To make your listener async you have add `async: true` attribute to the tag `kernel.event_listener`, like this: +To make your listener async you have add `async: true` (every version) and `dispatcher: 'enqueue.events.event_dispatcher'` (since Symfony 5.3) attributes to the tag `kernel.event_listener`, like this: ```yaml # app/config/config.yml @@ -48,7 +48,7 @@ services: acme.foo_listener: class: 'AcmeBundle\Listener\FooListener' tags: - - { name: 'kernel.event_listener', async: true, event: 'foo', method: 'onEvent' } + - { name: 'kernel.event_listener', async: true, event: 'foo', method: 'onEvent', dispatcher: 'enqueue.events.event_dispatcher' } ``` or to `kernel.event_subscriber`: @@ -60,7 +60,7 @@ services: test_async_subscriber: class: 'AcmeBundle\Listener\TestAsyncSubscriber' tags: - - { name: 'kernel.event_subscriber', async: true } + - { name: 'kernel.event_subscriber', async: true, dispatcher: 'enqueue.events.event_dispatcher' } ``` That's basically it. The rest of the doc describes advanced features. @@ -78,7 +78,7 @@ services: public: false arguments: ['@enqueue.transport.default.context', '@enqueue.events.registry', 'a_queue_name'] tags: - - { name: 'kernel.event_listener', event: 'foo', method: 'onEvent' } + - { name: 'kernel.event_listener', event: 'foo', method: 'onEvent', dispatcher: 'enqueue.events.event_dispatcher' } ``` From e82d4ae973435fd83cbeb3f969137ae456bb2c65 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 16 Feb 2022 13:14:49 +0200 Subject: [PATCH 1040/1142] =?UTF-8?q?Drop=20Symfony=20<=205.1=20?= =?UTF-8?q?=F0=9F=94=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 8 +- composer.json | 22 ++-- docs/bundle/async_events.md | 2 +- pkg/async-command/composer.json | 16 +-- .../AsyncEventDispatcher.php | 47 ++------ pkg/async-event-dispatcher/AsyncListener.php | 66 +++--------- .../DependencyInjection/AsyncEventsPass.php | 56 +++------- .../EventTransformer.php | 69 ++++-------- .../PhpSerializerEventTransformer.php | 27 +---- .../Tests/AsyncListenerTest.php | 8 +- pkg/async-event-dispatcher/composer.json | 14 +-- .../Profiler/MessageQueueCollector.php | 26 +---- .../Tests/Functional/App/AsyncListener.php | 33 ++---- .../App/TestAsyncEventTransformer.php | 102 +++++------------- .../Functional/App/config/config-sf5.yml | 6 +- pkg/enqueue-bundle/composer.json | 8 +- pkg/enqueue/composer.json | 18 ++-- pkg/fs/composer.json | 6 +- pkg/job-queue/composer.json | 8 +- pkg/simple-client/composer.json | 4 +- 20 files changed, 151 insertions(+), 395 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4854df188..35e32c10f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,11 +78,9 @@ jobs: fail-fast: false matrix: php: ['7.3', '7.4', '8.0'] - symfony_version: ['4.4.*', '5.2.*', '6.0.*'] + symfony_version: ['5.2.*', '6.0.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: - - php: '8.0' - symfony_version: '4.4.*' - php: '7.3' symfony_version: '6.0.*' - php: '7.4' @@ -126,12 +124,10 @@ jobs: fail-fast: false matrix: php: ['7.4', '8.0'] # same as in the container - symfony_version: ['4.4.*', '5.2.*', '6.0.*'] + symfony_version: ['5.2.*', '6.0.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] rdkafka_action: ['exclude-group', 'group'] exclude: - - php: '8.0' - symfony_version: '4.4.*' - php: '7.3' symfony_version: '6.0.*' - php: '7.4' diff --git a/composer.json b/composer.json index fe4e5570f..d4aa772c4 100644 --- a/composer.json +++ b/composer.json @@ -53,17 +53,17 @@ "phpunit/phpunit": "^9.5", "phpstan/phpstan": "^0.12", "queue-interop/queue-spec": "^0.6.2", - "symfony/browser-kit": "^4.3|^5|^6.0", - "symfony/config": "^4.3|^5|^6.0", - "symfony/process": "^4.3|^5|^6.0", - "symfony/console": "^4.3|^5|^6.0", - "symfony/dependency-injection": "^4.3|^5|^6.0", - "symfony/event-dispatcher": "^4.3|^5|^6.0", - "symfony/expression-language": "^4.3|^5|^6.0", - "symfony/http-kernel": "^4.3|^5|^6.0", - "symfony/filesystem": "^4.3|^5|^6.0", - "symfony/framework-bundle": "^4.3|^5|^6.0", - "symfony/yaml": "^4.3|^5|^6.0", + "symfony/browser-kit": "^5.1|^6.0", + "symfony/config": "^5.1|^6.0", + "symfony/process": "^5.1|^6.0", + "symfony/console": "^5.1|^6.0", + "symfony/dependency-injection": "^5.1|^6.0", + "symfony/event-dispatcher": "^5.1|^6.0", + "symfony/expression-language": "^5.1|^6.0", + "symfony/http-kernel": "^5.1|^6.0", + "symfony/filesystem": "^5.1|^6.0", + "symfony/framework-bundle": "^5.1|^6.0", + "symfony/yaml": "^5.1|^6.0", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", diff --git a/docs/bundle/async_events.md b/docs/bundle/async_events.md index 99b674a76..d2d256146 100644 --- a/docs/bundle/async_events.md +++ b/docs/bundle/async_events.md @@ -39,7 +39,7 @@ enqueue: ## Usage -To make your listener async you have add `async: true` (every version) and `dispatcher: 'enqueue.events.event_dispatcher'` (since Symfony 5.3) attributes to the tag `kernel.event_listener`, like this: +To make your listener async you have add `async: true` and `dispatcher: 'enqueue.events.event_dispatcher'` attributes to the tag `kernel.event_listener`, like this: ```yaml # app/config/config.yml diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 932499ecf..98b90ad83 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -9,16 +9,16 @@ "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", - "symfony/console": "^4.3|^5|^6.0", - "symfony/process": "^4.3|^5|^6.0" + "symfony/console": "^5.1|^6.0", + "symfony/process": "^5.1|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/dependency-injection": "^4.3|^5|^6.0", - "symfony/config": "^4.3|^5|^6.0", - "symfony/http-kernel": "^4.3|^5|^6.0", - "symfony/filesystem": "^4.3|^5|^6.0", - "symfony/yaml": "^4.3|^5|^6.0", + "symfony/dependency-injection": "^5.1|^6.0", + "symfony/config": "^5.1|^6.0", + "symfony/http-kernel": "^5.1|^6.0", + "symfony/filesystem": "^5.1|^6.0", + "symfony/yaml": "^5.1|^6.0", "enqueue/null": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/test": "0.10.x-dev" @@ -31,7 +31,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "suggest": { - "symfony/dependency-injection": "^4.3|^5|^6.0 If you'd like to use async event dispatcher container extension." + "symfony/dependency-injection": "^5.1|^6.0 If you'd like to use async event dispatcher container extension." }, "autoload": { "psr-4": { "Enqueue\\AsyncCommand\\": "" }, diff --git a/pkg/async-event-dispatcher/AsyncEventDispatcher.php b/pkg/async-event-dispatcher/AsyncEventDispatcher.php index 153fdc111..fa7393ea6 100644 --- a/pkg/async-event-dispatcher/AsyncEventDispatcher.php +++ b/pkg/async-event-dispatcher/AsyncEventDispatcher.php @@ -2,48 +2,17 @@ namespace Enqueue\AsyncEventDispatcher; -use Symfony\Component\EventDispatcher\Event; - -if (class_exists(Event::class)) { - /** - * Symfony < 5.0. - */ - class AsyncEventDispatcher extends AbstractAsyncEventDispatcher +class AsyncEventDispatcher extends AbstractAsyncEventDispatcher +{ + public function dispatch(object $event, string $eventName = null): object { - /** - * {@inheritdoc} - */ - public function dispatch($event, $eventName = null) - { - $this->parentDispatch($event, $eventName); - - return $this->trueEventDispatcher->dispatch($event, $eventName); - } + $this->parentDispatch($event, $eventName); - protected function parentDispatch($event, $eventName) - { - parent::dispatch($event, $eventName); - } + return $this->trueEventDispatcher->dispatch($event, $eventName); } -} else { - /** - * Symfony >= 5.0. - */ - class AsyncEventDispatcher extends AbstractAsyncEventDispatcher - { - /** - * {@inheritdoc} - */ - public function dispatch(object $event, string $eventName = null): object - { - $this->parentDispatch($event, $eventName); - return $this->trueEventDispatcher->dispatch($event, $eventName); - } - - protected function parentDispatch($event, $eventName) - { - return parent::dispatch($event, $eventName); - } + protected function parentDispatch($event, $eventName) + { + return parent::dispatch($event, $eventName); } } diff --git a/pkg/async-event-dispatcher/AsyncListener.php b/pkg/async-event-dispatcher/AsyncListener.php index ccbe5b038..2be4976fb 100644 --- a/pkg/async-event-dispatcher/AsyncListener.php +++ b/pkg/async-event-dispatcher/AsyncListener.php @@ -2,66 +2,28 @@ namespace Enqueue\AsyncEventDispatcher; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Contracts\EventDispatcher\Event as ContractEvent; +use Symfony\Contracts\EventDispatcher\Event; -if (class_exists(Event::class)) { - /** - * Symfony < 5.0. - */ - class AsyncListener extends AbstractAsyncListener +class AsyncListener extends AbstractAsyncListener +{ + public function __invoke(Event $event, $eventName) { - /** - * @param Event|ContractEvent $event - * @param string $eventName - */ - public function __invoke($event, $eventName) - { - $this->onEvent($event, $eventName); - } - - /** - * @param Event|ContractEvent $event - * @param string $eventName - */ - public function onEvent($event, $eventName) - { - if (false == isset($this->syncMode[$eventName])) { - $transformerName = $this->registry->getTransformerNameForEvent($eventName); - - $message = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); - $message->setProperty('event_name', $eventName); - $message->setProperty('transformer_name', $transformerName); - - $this->context->createProducer()->send($this->eventQueue, $message); - } - } + $this->onEvent($event, $eventName); } -} else { + /** - * Symfony >= 5.0. + * @param string $eventName */ - class AsyncListener extends AbstractAsyncListener + public function onEvent(Event $event, $eventName) { - public function __invoke(ContractEvent $event, $eventName) - { - $this->onEvent($event, $eventName); - } - - /** - * @param string $eventName - */ - public function onEvent(ContractEvent $event, $eventName) - { - if (false == isset($this->syncMode[$eventName])) { - $transformerName = $this->registry->getTransformerNameForEvent($eventName); + if (false == isset($this->syncMode[$eventName])) { + $transformerName = $this->registry->getTransformerNameForEvent($eventName); - $message = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); - $message->setProperty('event_name', $eventName); - $message->setProperty('transformer_name', $transformerName); + $message = $this->registry->getTransformer($transformerName)->toMessage($eventName, $event); + $message->setProperty('event_name', $eventName); + $message->setProperty('transformer_name', $transformerName); - $this->context->createProducer()->send($this->eventQueue, $message); - } + $this->context->createProducer()->send($this->eventQueue, $message); } } } diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php index e57d710f7..5eecd09ea 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php @@ -22,9 +22,6 @@ public function process(ContainerBuilder $container): void $defaultClient = $container->getParameter('enqueue.default_client'); - // TODO: Remove when dropping Symfony < 5.3 - $useLegacyDispatcherConfig = (Kernel::VERSION_ID < 50300); - $registeredToEvent = []; foreach ($container->findTaggedServiceIds('kernel.event_listener') as $serviceId => $tagAttributes) { foreach ($tagAttributes as $tagAttribute) { @@ -34,13 +31,6 @@ public function process(ContainerBuilder $container): void $event = $tagAttribute['event']; - $service = $container->getDefinition($serviceId); - - if ($useLegacyDispatcherConfig) { - $service->clearTag('kernel.event_listener'); - $service->addTag('enqueue.async_event_listener', $tagAttribute); - } - if (false == isset($registeredToEvent[$event])) { $container->getDefinition('enqueue.events.async_listener') ->addTag('kernel.event_listener', [ @@ -49,15 +39,13 @@ public function process(ContainerBuilder $container): void ]) ; - if (!$useLegacyDispatcherConfig) { - $container->getDefinition('enqueue.events.async_listener') - ->addTag('kernel.event_listener', [ - 'event' => $event, - 'method' => 'onEvent', - 'dispatcher' => 'enqueue.events.event_dispatcher', - ]) - ; - } + $container->getDefinition('enqueue.events.async_listener') + ->addTag('kernel.event_listener', [ + 'event' => $event, + 'method' => 'onEvent', + 'dispatcher' => 'enqueue.events.event_dispatcher', + ]) + ; $container->getDefinition('enqueue.events.async_processor') ->addTag('enqueue.processor', [ @@ -79,11 +67,6 @@ public function process(ContainerBuilder $container): void $service = $container->getDefinition($serviceId); - if ($useLegacyDispatcherConfig) { - $service->clearTag('kernel.event_subscriber'); - $service->addTag('enqueue.async_event_subscriber', $tagAttribute); - } - /** @var EventSubscriberInterface $serviceClass */ $serviceClass = $service->getClass(); @@ -96,15 +79,13 @@ public function process(ContainerBuilder $container): void ]) ; - if (!$useLegacyDispatcherConfig) { - $container->getDefinition('enqueue.events.async_listener') - ->addTag('kernel.event_listener', [ - 'event' => $event, - 'method' => 'onEvent', - 'dispatcher' => 'enqueue.events.event_dispatcher', - ]) - ; - } + $container->getDefinition('enqueue.events.async_listener') + ->addTag('kernel.event_listener', [ + 'event' => $event, + 'method' => 'onEvent', + 'dispatcher' => 'enqueue.events.event_dispatcher', + ]) + ; $container->getDefinition('enqueue.events.async_processor') ->addTag('enqueue.processor', [ @@ -118,14 +99,5 @@ public function process(ContainerBuilder $container): void } } } - - if ($useLegacyDispatcherConfig) { - $registerListenersPass = new RegisterListenersPass( - 'enqueue.events.event_dispatcher', - 'enqueue.async_event_listener', - 'enqueue.async_event_subscriber' - ); - $registerListenersPass->process($container); - } } } diff --git a/pkg/async-event-dispatcher/EventTransformer.php b/pkg/async-event-dispatcher/EventTransformer.php index 352930cef..cee8635bd 100644 --- a/pkg/async-event-dispatcher/EventTransformer.php +++ b/pkg/async-event-dispatcher/EventTransformer.php @@ -3,61 +3,28 @@ namespace Enqueue\AsyncEventDispatcher; use Interop\Queue\Message; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Contracts\EventDispatcher\Event as ContractEvent; +use Symfony\Contracts\EventDispatcher\Event; -if (class_exists(Event::class)) { +interface EventTransformer +{ /** - * Symfony < 5.0. + * @param string $eventName + * + * @return Message */ - interface EventTransformer - { - /** - * @param string $eventName - * @param ContractEvent|Event|null $event - * - * @return Message - */ - public function toMessage($eventName, $event = null); + public function toMessage($eventName, Event $event = null); - /** - * If you able to transform message back to event return it. - * If you failed to transform for some reason you can return a string status. - * - * @param mixed $eventName - * - * @return ContractEvent|Event|string|object - * - * @see Process constants) or an object that implements __toString method. - * The object must have a __toString method is supposed to be used as Processor::process return value. - */ - public function toEvent($eventName, Message $message); - } -} else { /** - * Symfony >= 5.0. + * If you able to transform message back to event return it. + * If you failed to transform for some reason you can return a string status. + * + * @param mixed $eventNAme + * @param mixed $eventName + * + * @return Event|string|object + * + * @see Process constants) or an object that implements __toString method. + * The object must have a __toString method is supposed to be used as Processor::process return value. */ - interface EventTransformer - { - /** - * @param string $eventName - * - * @return Message - */ - public function toMessage($eventName, ContractEvent $event = null); - - /** - * If you able to transform message back to event return it. - * If you failed to transform for some reason you can return a string status. - * - * @param mixed $eventNAme - * @param mixed $eventName - * - * @return ContractEvent|string|object - * - * @see Process constants) or an object that implements __toString method. - * The object must have a __toString method is supposed to be used as Processor::process return value. - */ - public function toEvent($eventName, Message $message); - } + public function toEvent($eventName, Message $message); } diff --git a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php index c6a3e2c97..1204e9591 100644 --- a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php +++ b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php @@ -2,29 +2,12 @@ namespace Enqueue\AsyncEventDispatcher; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Contracts\EventDispatcher\Event as ContractEvent; +use Symfony\Contracts\EventDispatcher\Event; -if (class_exists(Event::class)) { - /** - * Symfony < 5.0. - */ - class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer +class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer +{ + public function toMessage($eventName, Event $event = null) { - public function toMessage($eventName, $event = null) - { - return $this->context->createMessage(serialize($event)); - } - } -} else { - /** - * Symfony >= 5.0. - */ - class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer - { - public function toMessage($eventName, ContractEvent $event = null) - { - return $this->context->createMessage(serialize($event)); - } + return $this->context->createMessage(serialize($event)); } } diff --git a/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php b/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php index f00635245..d888c0228 100644 --- a/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php +++ b/pkg/async-event-dispatcher/Tests/AsyncListenerTest.php @@ -13,10 +13,8 @@ use Interop\Queue\Producer; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; -use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\GenericEvent; -use Symfony\Component\HttpKernel\Kernel; -use Symfony\Contracts\EventDispatcher\Event as ContractEvent; +use Symfony\Contracts\EventDispatcher\Event; class AsyncListenerTest extends TestCase { @@ -73,9 +71,7 @@ public function testShouldDoNothingIfSyncModeOn() $listener->syncMode('fooEvent'); - $eventClass = Kernel::VERSION_ID >= 50000 ? ContractEvent::class : Event::class; - - $listener->onEvent(new $eventClass(), 'fooEvent'); + $listener->onEvent(new Event(), 'fooEvent'); $listener->onEvent(new GenericEvent(), 'fooEvent'); } diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index 28ed42b4f..3f124dc8f 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -9,15 +9,15 @@ "php": "^7.3|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", - "symfony/event-dispatcher": "^4.3|^5|^6.0" + "symfony/event-dispatcher": "^5.1|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/dependency-injection": "^4.3|^5|^6.0", - "symfony/config": "^4.3|^5|^6.0", - "symfony/http-kernel": "^4.3|^5|^6.0", - "symfony/filesystem": "^4.3|^5|^6.0", - "symfony/yaml": "^4.3|^5|^6.0", + "symfony/dependency-injection": "^5.1|^6.0", + "symfony/config": "^5.1|^6.0", + "symfony/http-kernel": "^5.1|^6.0", + "symfony/filesystem": "^5.1|^6.0", + "symfony/yaml": "^5.1|^6.0", "enqueue/null": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/test": "0.10.x-dev" @@ -30,7 +30,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "suggest": { - "symfony/dependency-injection": "^2.8|^3|^4|^5 If you'd like to use async event dispatcher container extension." + "symfony/dependency-injection": "^5.1|^6.0 If you'd like to use async event dispatcher container extension." }, "autoload": { "psr-4": { "Enqueue\\AsyncEventDispatcher\\": "" }, diff --git a/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php b/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php index e44429413..7fc6699c5 100644 --- a/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php +++ b/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php @@ -4,28 +4,12 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\Kernel; +use Throwable; -if (Kernel::MAJOR_VERSION < 5) { - class MessageQueueCollector extends AbstractMessageQueueCollector +class MessageQueueCollector extends AbstractMessageQueueCollector +{ + public function collect(Request $request, Response $response, Throwable $exception = null) { - /** - * {@inheritdoc} - */ - public function collect(Request $request, Response $response, \Exception $exception = null) - { - $this->collectInternal($request, $response); - } - } -} else { - class MessageQueueCollector extends AbstractMessageQueueCollector - { - /** - * {@inheritdoc} - */ - public function collect(Request $request, Response $response, \Throwable $exception = null) - { - $this->collectInternal($request, $response); - } + $this->collectInternal($request, $response); } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php b/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php index 2248dc5d1..23ab4af79 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/AsyncListener.php @@ -2,36 +2,15 @@ namespace Enqueue\Bundle\Tests\Functional\App; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Contracts\EventDispatcher\Event as ContractEvent; +use Symfony\Contracts\EventDispatcher\Event; -if (class_exists(Event::class)) { +class AsyncListener extends AbstractAsyncListener +{ /** - * Symfony < 5.0. + * @param string $eventName */ - class AsyncListener extends AbstractAsyncListener + public function onEvent(Event $event, $eventName) { - /** - * @param Event|ContractEvent $event - * @param string $eventName - */ - public function onEvent($event, $eventName) - { - $this->onEventInternal($event, $eventName); - } - } -} else { - /** - * Symfony >= 5.0. - */ - class AsyncListener extends AbstractAsyncListener - { - /** - * @param string $eventName - */ - public function onEvent(ContractEvent $event, $eventName) - { - $this->onEventInternal($event, $eventName); - } + $this->onEventInternal($event, $eventName); } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php index 7c85e076c..2a734682d 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php @@ -6,96 +6,46 @@ use Enqueue\Util\JSON; use Interop\Queue\Context; use Interop\Queue\Message; -use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\GenericEvent; -use Symfony\Contracts\EventDispatcher\Event as ContractEvent; +use Symfony\Contracts\EventDispatcher\Event; -if (class_exists(Event::class)) { +class TestAsyncEventTransformer implements EventTransformer +{ /** - * Symfony < 5.0. + * @var Context */ - class TestAsyncEventTransformer implements EventTransformer + private $context; + + public function __construct(Context $context) { - /** - * @var Context - */ - private $context; + $this->context = $context; + } - public function __construct(Context $context) - { - $this->context = $context; + public function toMessage($eventName, Event $event = null) + { + if (Event::class === get_class($event)) { + return $this->context->createMessage(json_encode('')); } - public function toMessage($eventName, $event = null) - { - if (Event::class === get_class($event) || ContractEvent::class === get_class($event)) { - return $this->context->createMessage(json_encode('')); - } - - /** @var GenericEvent $event */ - if (false == $event instanceof GenericEvent) { - throw new \LogicException('Must be GenericEvent'); - } - - return $this->context->createMessage(json_encode([ - 'subject' => $event->getSubject(), - 'arguments' => $event->getArguments(), - ])); + /** @var GenericEvent $event */ + if (false == $event instanceof GenericEvent) { + throw new \LogicException('Must be GenericEvent'); } - public function toEvent($eventName, Message $message) - { - $data = JSON::decode($message->getBody()); - - if ('' === $data) { - return new Event(); - } - - return new GenericEvent($data['subject'], $data['arguments']); - } + return $this->context->createMessage(json_encode([ + 'subject' => $event->getSubject(), + 'arguments' => $event->getArguments(), + ])); } -} else { - /** - * Symfony >= 5.0. - */ - class TestAsyncEventTransformer implements EventTransformer - { - /** - * @var Context - */ - private $context; - - public function __construct(Context $context) - { - $this->context = $context; - } - - public function toMessage($eventName, ContractEvent $event = null) - { - if (ContractEvent::class === get_class($event)) { - return $this->context->createMessage(json_encode('')); - } - /** @var GenericEvent $event */ - if (false == $event instanceof GenericEvent) { - throw new \LogicException('Must be GenericEvent'); - } + public function toEvent($eventName, Message $message) + { + $data = JSON::decode($message->getBody()); - return $this->context->createMessage(json_encode([ - 'subject' => $event->getSubject(), - 'arguments' => $event->getArguments(), - ])); + if ('' === $data) { + return new Event(); } - public function toEvent($eventName, Message $message) - { - $data = JSON::decode($message->getBody()); - - if ('' === $data) { - return new ContractEvent(); - } - - return new GenericEvent($data['subject'], $data['arguments']); - } + return new GenericEvent($data['subject'], $data['arguments']); } } diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml index 3a4f7795d..e202bb86f 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config-sf5.yml @@ -87,8 +87,7 @@ services: class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncListener' public: true tags: - - { name: 'kernel.event_listener', async: true, event: 'test_async', method: 'onEvent' } - # In Symfony 6 you would also add "dispatcher: 'enqueue.events.event_dispatcher'" + - { name: 'kernel.event_listener', async: true, event: 'test_async', method: 'onEvent', dispatcher: 'enqueue.events.event_dispatcher' } test_command_subscriber_processor: class: 'Enqueue\Bundle\Tests\Functional\App\TestCommandSubscriberProcessor' @@ -112,8 +111,7 @@ services: class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncSubscriber' public: true tags: - - { name: 'kernel.event_subscriber', async: true } - # In Symfony 6 you would also add "dispatcher: 'enqueue.events.event_dispatcher'" + - { name: 'kernel.event_subscriber', async: true, dispatcher: 'enqueue.events.event_dispatcher' } test_async_event_transformer: class: 'Enqueue\Bundle\Tests\Functional\App\TestAsyncEventTransformer' diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 70eda07bd..ab4ed1e4f 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "symfony/framework-bundle": "^4.3|^5|^6.0", + "symfony/framework-bundle": "^5.1|^6.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/enqueue": "^0.10", @@ -39,9 +39,9 @@ "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", - "symfony/browser-kit": "^4.3|^5|^6.0", - "symfony/expression-language": "^4.3|^5|^6.0", - "symfony/yaml": "^4.3|^5|^6.0" + "symfony/browser-kit": "^5.1|^6.0", + "symfony/expression-language": "^5.1|^6.0", + "symfony/yaml": "^5.1|^6.0" }, "suggest": { "enqueue/async-command": "If want to run Symfony command via message queue", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 82c77527e..0798bf44e 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -17,12 +17,12 @@ }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/console": "^4.3|^5|^6.0", - "symfony/dependency-injection": "^4.3|^5|^6.0", - "symfony/config": "^4.3|^5|^6.0", - "symfony/event-dispatcher": "^4.3|^5|^6.0", - "symfony/http-kernel": "^4.3|^5|^6.0", - "symfony/yaml": "^4.3|^5|^6.0", + "symfony/console": "^5.1|^6.0", + "symfony/dependency-injection": "^5.1|^6.0", + "symfony/config": "^5.1|^6.0", + "symfony/event-dispatcher": "^5.1|^6.0", + "symfony/http-kernel": "^5.1|^6.0", + "symfony/yaml": "^5.1|^6.0", "enqueue/amqp-ext": "0.10.x-dev", "enqueue/amqp-lib": "0.10.x-dev", "enqueue/amqp-bunny": "0.10.x-dev", @@ -42,9 +42,9 @@ "enqueue/dsn": "0.10.x-dev" }, "suggest": { - "symfony/console": "^2.8|^3|^4|^5|^6.0 If you want to use cli commands", - "symfony/dependency-injection": "^4.3|^5|^6.0", - "symfony/config": "^4.3|^5|^6.0", + "symfony/console": "^5.1|^6.0 If you want to use cli commands", + "symfony/dependency-injection": "^5.1|^6.0", + "symfony/config": "^5.1|^6.0", "enqueue/amqp-ext": "AMQP transport (based on php extension)", "enqueue/stomp": "STOMP transport", "enqueue/fs": "Filesystem transport", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index 193d603d3..e22929097 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -9,7 +9,7 @@ "php": "^7.3|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "symfony/filesystem": "^4.3|^5|^6.0", + "symfony/filesystem": "^5.1|^6.0", "makasim/temp-file": "^0.2@stable" }, "require-dev": { @@ -17,8 +17,8 @@ "enqueue/null": "0.10.x-dev", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6.2", - "symfony/dependency-injection": "^4.3|^5|^6.0", - "symfony/yaml": "^4.3|^5|^6.0" + "symfony/dependency-injection": "^5.1|^6.0", + "symfony/yaml": "^5.1|^6.0" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 998245e4b..d4d1fe706 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -17,10 +17,10 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "doctrine/doctrine-bundle": "^2.0", - "symfony/browser-kit": "^4.3|^5|^6.0", - "symfony/expression-language": "^4.3|^5|^6.0", - "symfony/framework-bundle": "^4.3|^5|^6.0", - "symfony/yaml": "^4.3|^5|^6.0" + "symfony/browser-kit": "^5.1|^6.0", + "symfony/expression-language": "^5.1|^6.0", + "symfony/framework-bundle": "^5.1|^6.0", + "symfony/yaml": "^5.1|^6.0" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 037bf3fcd..f12215eac 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.10", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", - "symfony/config": "^4.3|^5|^6.0" + "symfony/config": "^5.1|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", @@ -18,7 +18,7 @@ "enqueue/amqp-ext": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "symfony/yaml": "^4.3|^5|^6.0" + "symfony/yaml": "^5.1|^6.0" }, "support": { "email": "opensource@forma-pro.com", From dc3f0d62b8fcf5fe4ace2e0067d9fbf7597a93a4 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 16 Feb 2022 13:18:28 +0200 Subject: [PATCH 1041/1142] Remove unused uses --- .../DependencyInjection/AsyncEventsPass.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php index 5eecd09ea..42774adf7 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncEventsPass.php @@ -4,9 +4,7 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\HttpKernel\Kernel; class AsyncEventsPass implements CompilerPassInterface { From 1e4f7c382ab5c2450e0bca2a100a818bebb12391 Mon Sep 17 00:00:00 2001 From: Lucas Rivoiro Date: Fri, 25 Feb 2022 15:26:56 -0300 Subject: [PATCH 1042/1142] Upgrade version of rdkafka to 6.0 --- pkg/rdkafka/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 82c5367fe..2b5ec5541 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "ext-rdkafka": "^4.0|^5.0", + "ext-rdkafka": "^4.0|^5.0|^6.0", "queue-interop/queue-interop": "^0.8.1" }, "require-dev": { From 5d6263384be630c52e41d0c8ac9a89e5b444995f Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Mon, 7 Mar 2022 16:42:13 +0200 Subject: [PATCH 1043/1142] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fde09e871..5a4d6b757 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) +

Enqueue logo

From d0c3c572ec9c164370cbfb5e59e7a01b41d2eedf Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Thu, 28 Apr 2022 13:09:29 +0300 Subject: [PATCH 1044/1142] Release 0.10.16 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a89a3d339..3a0d73ba7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## [0.10.16](https://github.com/php-enqueue/enqueue-dev/tree/0.10.16) (2022-04-28) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.15...0.10.16) + +**Merged pull requests:** + +- Upgrade ext-rdkafka to 6.0 [\#1241](https://github.com/php-enqueue/enqueue-dev/pull/1241) ([lucasrivoiro](https://github.com/lucasrivoiro)) +- Replace rabbitmq-management-api with a packagist source and fixed small github actions typo [\#1240](https://github.com/php-enqueue/enqueue-dev/pull/1240) ([oreillysean](https://github.com/oreillysean)) +- Add support for Symfony 6; drop \< 5.1 [\#1239](https://github.com/php-enqueue/enqueue-dev/pull/1239) ([andrewmy](https://github.com/andrewmy)) +- Replace rabbitmq-management-api with a packagist source [\#1238](https://github.com/php-enqueue/enqueue-dev/pull/1238) ([andrewmy](https://github.com/andrewmy)) +- Fix CI [\#1237](https://github.com/php-enqueue/enqueue-dev/pull/1237) ([jdecool](https://github.com/jdecool)) +- Allow ext-rdkafka 6 usage [\#1233](https://github.com/php-enqueue/enqueue-dev/pull/1233) ([jdecool](https://github.com/jdecool)) +- Fix types for Symfony 5.4 [\#1225](https://github.com/php-enqueue/enqueue-dev/pull/1225) ([shyim](https://github.com/shyim)) + ## [0.10.15](https://github.com/php-enqueue/enqueue-dev/tree/0.10.15) (2021-12-11) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.14...0.10.15) From 2a780c212b98fe2fc463283253005ef44d125384 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 17 May 2022 16:50:22 +0300 Subject: [PATCH 1045/1142] Release 0.10.17 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a0d73ba7..111302e07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## [0.10.17](https://github.com/php-enqueue/enqueue-dev/tree/0.10.17) (2022-05-17) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.16...0.10.17) + +**Merged pull requests:** + +- Disable sleep while queue items available [\#1250](https://github.com/php-enqueue/enqueue-dev/pull/1250) ([mordilion](https://github.com/mordilion)) + ## [0.10.16](https://github.com/php-enqueue/enqueue-dev/tree/0.10.16) (2022-04-28) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.15...0.10.16) From 4974df8851631b7e8b278226a64d28c9e328fa5e Mon Sep 17 00:00:00 2001 From: meidlinga Date: Wed, 1 Jun 2022 17:07:05 +0200 Subject: [PATCH 1046/1142] chore: Update dependency dbal --- pkg/job-queue/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index d4d1fe706..1525c5c8e 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -11,7 +11,7 @@ "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", "doctrine/orm": "~2.7.4 | ^2.8", - "doctrine/dbal": "^2.12" + "doctrine/dbal": "^2.12 | ^3.0" }, "require-dev": { "phpunit/phpunit": "^9.5", From 36d201cbd44eb82a5e0a595ddeb7aefd37786a8c Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Wed, 8 Jun 2022 10:56:47 +0200 Subject: [PATCH 1047/1142] Ensure pass consumer tag as string to bunny amqp (fixes 8.1 compatibility) --- pkg/amqp-bunny/AmqpSubscriptionConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/amqp-bunny/AmqpSubscriptionConsumer.php b/pkg/amqp-bunny/AmqpSubscriptionConsumer.php index 4fff4f8ab..b36bcd949 100644 --- a/pkg/amqp-bunny/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-bunny/AmqpSubscriptionConsumer.php @@ -88,7 +88,7 @@ public function subscribe(Consumer $consumer, callable $callback): void $frame = $this->context->getBunnyChannel()->consume( $bunnyCallback, $consumer->getQueue()->getQueueName(), - $consumer->getConsumerTag(), + $consumer->getConsumerTag() ?? '', (bool) ($consumer->getFlags() & InteropAmqpConsumer::FLAG_NOLOCAL), (bool) ($consumer->getFlags() & InteropAmqpConsumer::FLAG_NOACK), (bool) ($consumer->getFlags() & InteropAmqpConsumer::FLAG_EXCLUSIVE), From 6868ce0c818a9191f91d07bb547e97884fd8af26 Mon Sep 17 00:00:00 2001 From: Markus Schmid Date: Tue, 19 Jul 2022 11:55:59 +0200 Subject: [PATCH 1048/1142] symfony config: allow null values for connection_factory_class and factory_service --- .../DependencyInjection/TransportFactory.php | 8 ++++---- .../DependencyInjection/TransportFactoryTest.php | 14 +++++++++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php b/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php index 54dba4bf7..944b1a30d 100644 --- a/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php +++ b/pkg/enqueue/Symfony/DependencyInjection/TransportFactory.php @@ -132,15 +132,15 @@ public function buildConnectionFactory(ContainerBuilder $container, array $confi $container->register($factoryFactoryId, $config['factory_class'] ?? ConnectionFactoryFactory::class); $factoryFactoryService = new Reference( - array_key_exists('factory_service', $config) ? $config['factory_service'] : $factoryFactoryId + $config['factory_service'] ?? $factoryFactoryId ); unset($config['factory_service'], $config['factory_class']); - if (array_key_exists('connection_factory_class', $config)) { - $connectionFactoryClass = $config['connection_factory_class']; - unset($config['connection_factory_class']); + $connectionFactoryClass = $config['connection_factory_class'] ?? null; + unset($config['connection_factory_class']); + if (isset($connectionFactoryClass)) { $container->register($factoryId, $connectionFactoryClass) ->addArgument($config) ; diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php index 68868716b..a4f9d451a 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php @@ -259,7 +259,14 @@ public function testShouldBuildConnectionFactoryFromDSN() $transport = new TransportFactory('default'); - $transport->buildConnectionFactory($container, ['dsn' => 'foo://bar/baz']); + $config = [ + 'dsn' => 'foo://bar/baz', + 'connection_factory_class' => null, + 'factory_service' => null, + 'factory_class' => null, + ]; + + $transport->buildConnectionFactory($container, $config); $this->assertTrue($container->hasDefinition('enqueue.transport.default.connection_factory')); @@ -272,6 +279,11 @@ public function testShouldBuildConnectionFactoryFromDSN() [['dsn' => 'foo://bar/baz']], $container->getDefinition('enqueue.transport.default.connection_factory')->getArguments()) ; + + $this->assertEquals( + [new Reference('enqueue.transport.default.connection_factory_factory'), 'create'], + $container->getDefinition('enqueue.transport.default.connection_factory')->getFactory()) + ; } public function testShouldBuildConnectionFactoryUsingCustomFactoryClass() From 66865187fe180396778b9f9b50b96e9a2a4a7590 Mon Sep 17 00:00:00 2001 From: Markus Schmid Date: Tue, 19 Jul 2022 12:20:29 +0200 Subject: [PATCH 1049/1142] remove duplicated test --- .../Symfony/DependencyInjection/TransportFactoryTest.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php index a4f9d451a..c5ff1c818 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php @@ -279,11 +279,6 @@ public function testShouldBuildConnectionFactoryFromDSN() [['dsn' => 'foo://bar/baz']], $container->getDefinition('enqueue.transport.default.connection_factory')->getArguments()) ; - - $this->assertEquals( - [new Reference('enqueue.transport.default.connection_factory_factory'), 'create'], - $container->getDefinition('enqueue.transport.default.connection_factory')->getFactory()) - ; } public function testShouldBuildConnectionFactoryUsingCustomFactoryClass() From 62e5a0462285d45ba6c160f77d42d9734d7356f3 Mon Sep 17 00:00:00 2001 From: Quentin Dreyer Date: Wed, 20 Jul 2022 12:00:16 +0200 Subject: [PATCH 1050/1142] fix: allow falsy keys --- pkg/rdkafka/RdKafkaProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index d5380b590..59efd69ab 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -39,7 +39,7 @@ public function send(Destination $destination, Message $message): void $partition = $this->getPartition($destination, $message); $payload = $this->serializer->toString($message); - $key = $message->getKey() ?: $destination->getKey() ?: null; + $key = $message->getKey() ?? $destination->getKey() ?? null; $topic = $this->producer->newTopic($destination->getTopicName(), $destination->getConf()); From dbe56f20d4708d1ab8171286289eb505ea571623 Mon Sep 17 00:00:00 2001 From: Quentin Dreyer Date: Wed, 20 Jul 2022 12:41:20 +0200 Subject: [PATCH 1051/1142] test: allow falsy keys --- pkg/rdkafka/Tests/RdKafkaProducerTest.php | 60 +++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index 01c1c1b4c..512cc9f5a 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -323,6 +323,66 @@ public function testShouldGetPartitionFromDestination(): void $producer->send($destination, $message); } + public function testShouldAllowFalsyKeyFromMessage(): void + { + $key = 0; + + $kafkaTopic = $this->createKafkaTopicMock(); + $kafkaTopic + ->expects($this->once()) + ->method('producev') + ->with( + RD_KAFKA_PARTITION_UA, + 0, + '', + $key + ) + ; + + $kafkaProducer = $this->createKafkaProducerMock(); + $kafkaProducer + ->expects($this->once()) + ->method('newTopic') + ->willReturn($kafkaTopic) + ; + + $message = new RdKafkaMessage(); + $message->setKey($key); + + $producer = new RdKafkaProducer($kafkaProducer, $this->createSerializerMock()); + $producer->send(new RdKafkaTopic(''), $message); + } + + public function testShouldAllowFalsyKeyFromDestination(): void + { + $key = 0; + + $kafkaTopic = $this->createKafkaTopicMock(); + $kafkaTopic + ->expects($this->once()) + ->method('producev') + ->with( + RD_KAFKA_PARTITION_UA, + 0, + '', + $key + ) + ; + + $kafkaProducer = $this->createKafkaProducerMock(); + $kafkaProducer + ->expects($this->once()) + ->method('newTopic') + ->willReturn($kafkaTopic) + ; + + $destination = new RdKafkaTopic(''); + $destination->setKey($key); + + $producer = new RdKafkaProducer($kafkaProducer, $this->createSerializerMock()); + $producer->send($destination, new RdKafkaMessage()); + } + /** * @return \PHPUnit\Framework\MockObject\MockObject|ProducerTopic */ From 664374b1f2f66a167404ca47e29793d88d6ff8e5 Mon Sep 17 00:00:00 2001 From: qkdreyer Date: Wed, 20 Jul 2022 12:51:11 +0200 Subject: [PATCH 1052/1142] style: fix code style checks --- pkg/rdkafka/RdKafkaProducer.php | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index 59efd69ab..a3c977f83 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -37,7 +37,7 @@ public function send(Destination $destination, Message $message): void InvalidDestinationException::assertDestinationInstanceOf($destination, RdKafkaTopic::class); InvalidMessageException::assertMessageInstanceOf($message, RdKafkaMessage::class); - $partition = $this->getPartition($destination, $message); + $partition = $message->getPartition() ?? $destination->getPartition() ?? RD_KAFKA_PARTITION_UA; $payload = $this->serializer->toString($message); $key = $message->getKey() ?? $destination->getKey() ?? null; @@ -122,21 +122,4 @@ public function flush(int $timeout): void $this->producer->flush($timeout); } } - - /** - * @param RdKafkaTopic $destination - * @param RdKafkaMessage $message - */ - private function getPartition(Destination $destination, Message $message): int - { - if (null !== $message->getPartition()) { - return $message->getPartition(); - } - - if (null !== $destination->getPartition()) { - return $destination->getPartition(); - } - - return \RD_KAFKA_PARTITION_UA; - } } From b4ad124f11ed8a736d8b33b4fb3c699751d25662 Mon Sep 17 00:00:00 2001 From: Alden Weddleton Date: Fri, 22 Jul 2022 11:46:55 -0400 Subject: [PATCH 1053/1142] fix: parenthesis missing allowed invalid delays Missing parenthesis here would allow the delay to be a fraction of a second and cause an error if the delay provided was not a multiple of 1000. --- pkg/sqs/SqsProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sqs/SqsProducer.php b/pkg/sqs/SqsProducer.php index b33d57fb8..e50b7aa30 100644 --- a/pkg/sqs/SqsProducer.php +++ b/pkg/sqs/SqsProducer.php @@ -56,7 +56,7 @@ public function send(Destination $destination, Message $message): void ]; if (null !== $this->deliveryDelay) { - $arguments['DelaySeconds'] = (int) $this->deliveryDelay / 1000; + $arguments['DelaySeconds'] = (int) ($this->deliveryDelay / 1000); } if ($message->getDelaySeconds()) { From a5c8d9691511e4a6af0ebfc9680bdfc9c389a473 Mon Sep 17 00:00:00 2001 From: Alden Weddleton Date: Fri, 22 Jul 2022 11:57:28 -0400 Subject: [PATCH 1054/1142] fix: round delay up to next second --- pkg/sqs/SqsProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sqs/SqsProducer.php b/pkg/sqs/SqsProducer.php index e50b7aa30..98c133acc 100644 --- a/pkg/sqs/SqsProducer.php +++ b/pkg/sqs/SqsProducer.php @@ -56,7 +56,7 @@ public function send(Destination $destination, Message $message): void ]; if (null !== $this->deliveryDelay) { - $arguments['DelaySeconds'] = (int) ($this->deliveryDelay / 1000); + $arguments['DelaySeconds'] = (int) ceil($this->deliveryDelay / 1000); } if ($message->getDelaySeconds()) { From cf976e7515c22203743e9635c9cb8ec85e1ed037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C5=ABnas=20Dronga?= Date: Thu, 6 Oct 2022 13:52:42 +0300 Subject: [PATCH 1055/1142] replace amqp-lib deprecated public property with getters --- pkg/amqp-lib/AmqpContext.php | 6 +++--- pkg/amqp-lib/AmqpSubscriptionConsumer.php | 4 ++-- pkg/amqp-lib/Tests/AmqpConsumerTest.php | 9 ++------- pkg/amqp-lib/composer.json | 2 +- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/pkg/amqp-lib/AmqpContext.php b/pkg/amqp-lib/AmqpContext.php index 32f60c21b..34569659d 100644 --- a/pkg/amqp-lib/AmqpContext.php +++ b/pkg/amqp-lib/AmqpContext.php @@ -309,9 +309,9 @@ public function convertMessage(LibAMQPMessage $amqpMessage): InteropAmqpMessage unset($headers['application_headers']); $message = new AmqpMessage($amqpMessage->getBody(), $properties, $headers); - $message->setDeliveryTag((int) $amqpMessage->delivery_info['delivery_tag']); - $message->setRedelivered($amqpMessage->delivery_info['redelivered']); - $message->setRoutingKey($amqpMessage->delivery_info['routing_key']); + $message->setDeliveryTag((int) $amqpMessage->getDeliveryTag()); + $message->setRedelivered($amqpMessage->isRedelivered()); + $message->setRoutingKey($amqpMessage->getRoutingKey()); return $message; } diff --git a/pkg/amqp-lib/AmqpSubscriptionConsumer.php b/pkg/amqp-lib/AmqpSubscriptionConsumer.php index e70b61a24..5d59ddf82 100644 --- a/pkg/amqp-lib/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-lib/AmqpSubscriptionConsumer.php @@ -102,13 +102,13 @@ public function subscribe(Consumer $consumer, callable $callback): void $libCallback = function (LibAMQPMessage $message) { $receivedMessage = $this->context->convertMessage($message); - $receivedMessage->setConsumerTag($message->delivery_info['consumer_tag']); + $receivedMessage->setConsumerTag($message->getConsumerTag()); /** * @var AmqpConsumer * @var callable $callback */ - list($consumer, $callback) = $this->subscribers[$message->delivery_info['consumer_tag']]; + list($consumer, $callback) = $this->subscribers[$message->getConsumerTag()]; if (false === call_user_func($callback, $receivedMessage, $consumer)) { throw new StopBasicConsumptionException(); diff --git a/pkg/amqp-lib/Tests/AmqpConsumerTest.php b/pkg/amqp-lib/Tests/AmqpConsumerTest.php index 2bd637d94..3961e1ab9 100644 --- a/pkg/amqp-lib/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-lib/Tests/AmqpConsumerTest.php @@ -115,10 +115,7 @@ public function testOnRejectShouldRejectMessage() public function testShouldReturnMessageOnReceiveNoWait() { $libMessage = new \PhpAmqpLib\Message\AMQPMessage('body'); - $libMessage->delivery_info['delivery_tag'] = 'delivery-tag'; - $libMessage->delivery_info['routing_key'] = 'routing-key'; - $libMessage->delivery_info['redelivered'] = true; - $libMessage->delivery_info['routing_key'] = 'routing-key'; + $libMessage->setDeliveryInfo('delivery-tag', true, '', 'routing-key'); $message = new AmqpMessage(); @@ -152,9 +149,7 @@ public function testShouldReturnMessageOnReceiveNoWait() public function testShouldReturnMessageOnReceiveWithReceiveMethodBasicGet() { $libMessage = new \PhpAmqpLib\Message\AMQPMessage('body'); - $libMessage->delivery_info['delivery_tag'] = 'delivery-tag'; - $libMessage->delivery_info['routing_key'] = 'routing-key'; - $libMessage->delivery_info['redelivered'] = true; + $libMessage->setDeliveryInfo('delivery-tag', true, '', 'routing-key'); $message = new AmqpMessage(); diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 9665a2cca..3f66bf7b3 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", - "php-amqplib/php-amqplib": "^3.0", + "php-amqplib/php-amqplib": "^3.2", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" From c62e3613486ae908f98352b68efd31db8dd81dc9 Mon Sep 17 00:00:00 2001 From: Emil Masiakowski Date: Wed, 9 Nov 2022 12:03:52 +0100 Subject: [PATCH 1056/1142] code style fix (native_constant_invocation) --- pkg/amqp-ext/AmqpSubscriptionConsumer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/amqp-ext/AmqpSubscriptionConsumer.php b/pkg/amqp-ext/AmqpSubscriptionConsumer.php index 4b03f6bbb..08a3df1c6 100644 --- a/pkg/amqp-ext/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-ext/AmqpSubscriptionConsumer.php @@ -68,7 +68,7 @@ public function consume(int $timeout = 0): void } finally { $extConnection->setReadTimeout($consumeTimeout); } - }, AMQP_JUST_CONSUME); + }, \AMQP_JUST_CONSUME); } catch (\AMQPQueueException $e) { if ('Consumer timeout exceed' == $e->getMessage()) { return; From ca0bf22cb0eca5aa62135fa5a3768e420479a6ea Mon Sep 17 00:00:00 2001 From: alexanderonatskiy Date: Tue, 15 Nov 2022 16:36:37 +0100 Subject: [PATCH 1057/1142] added possibility to send FIFO-related parameters using snsqs transport --- pkg/snsqs/SnsQsMessage.php | 46 +++++++++++++++++++++ pkg/snsqs/SnsQsProducer.php | 5 +++ pkg/snsqs/Tests/SnsQsProducerTest.php | 58 +++++++++++++++++++++++++-- 3 files changed, 106 insertions(+), 3 deletions(-) diff --git a/pkg/snsqs/SnsQsMessage.php b/pkg/snsqs/SnsQsMessage.php index 63a5c1d72..c804b1860 100644 --- a/pkg/snsqs/SnsQsMessage.php +++ b/pkg/snsqs/SnsQsMessage.php @@ -22,6 +22,16 @@ class SnsQsMessage implements Message */ private $messageAttributes; + /** + * @var string|null + */ + private $messageGroupId; + + /** + * @var string|null + */ + private $messageDeduplicationId; + /** * See AWS documentation for message attribute structure. * @@ -59,4 +69,40 @@ public function setMessageAttributes(?array $messageAttributes): void { $this->messageAttributes = $messageAttributes; } + + /** + * Only FIFO. + * + * The token used for deduplication of sent messages. If a message with a particular MessageDeduplicationId is sent successfully, + * any messages sent with the same MessageDeduplicationId are accepted successfully but aren't delivered during the 5-minute + * deduplication interval. For more information, see http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing. + */ + public function setMessageDeduplicationId(string $id = null): void + { + $this->messageDeduplicationId = $id; + } + + public function getMessageDeduplicationId(): ?string + { + return $this->messageDeduplicationId; + } + + /** + * Only FIFO. + * + * The tag that specifies that a message belongs to a specific message group. Messages that belong to the same message group + * are processed in a FIFO manner (however, messages in different message groups might be processed out of order). + * To interleave multiple ordered streams within a single queue, use MessageGroupId values (for example, session data + * for multiple users). In this scenario, multiple readers can process the queue, but the session data + * of each user is processed in a FIFO fashion. + */ + public function setMessageGroupId(string $id = null): void + { + $this->messageGroupId = $id; + } + + public function getMessageGroupId(): ?string + { + return $this->messageGroupId; + } } diff --git a/pkg/snsqs/SnsQsProducer.php b/pkg/snsqs/SnsQsProducer.php index 99054286f..6bc66e8f8 100644 --- a/pkg/snsqs/SnsQsProducer.php +++ b/pkg/snsqs/SnsQsProducer.php @@ -61,6 +61,8 @@ public function send(Destination $destination, Message $message): void $message->getHeaders() ); $snsMessage->setMessageAttributes($message->getMessageAttributes()); + $snsMessage->setMessageGroupId($message->getMessageGroupId()); + $snsMessage->setMessageDeduplicationId($message->getMessageDeduplicationId()); $this->getSnsProducer()->send($destination, $snsMessage); } else { @@ -70,6 +72,9 @@ public function send(Destination $destination, Message $message): void $message->getHeaders() ); + $sqsMessage->setMessageGroupId($message->getMessageGroupId()); + $sqsMessage->setMessageDeduplicationId($message->getMessageDeduplicationId()); + $this->getSqsProducer()->send($destination, $sqsMessage); } } diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index 4444c888b..17ea339ec 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -10,6 +10,7 @@ use Enqueue\SnsQs\SnsQsQueue; use Enqueue\SnsQs\SnsQsTopic; use Enqueue\Sqs\SqsContext; +use Enqueue\Sqs\SqsMessage; use Enqueue\Sqs\SqsProducer; use Enqueue\Test\ClassExtensionTrait; use Interop\Queue\Destination; @@ -124,20 +125,71 @@ public function testShouldSendSnsTopicMessageWithAttributesToSnsProducer() $producer->send($destination, new SnsQsMessage('', [], [], ['foo' => 'bar'])); } + public function testShouldSendToSnsTopicMessageWithGroupIdAndDeduplicationId() + { + $snsMock = $this->createSnsContextMock(); + $snsMock->method('createMessage')->willReturn(new SnsMessage()); + $destination = new SnsQsTopic(''); + + $snsProducerStub = $this->prophesize(SnsProducer::class); + $snsProducerStub->send( + $destination, + Argument::that(function (SnsMessage $snsMessage) { + return 'group-id' === $snsMessage->getMessageGroupId() + && 'deduplication-id' === $snsMessage->getMessageDeduplicationId(); + }) + )->shouldBeCalledOnce(); + + $snsMock->method('createProducer')->willReturn($snsProducerStub->reveal()); + + $snsMessage = new SnsQsMessage(); + $snsMessage->setMessageGroupId('group-id'); + $snsMessage->setMessageDeduplicationId('deduplication-id'); + + $producer = new SnsQsProducer($snsMock, $this->createSqsContextMock()); + $producer->send($destination, $snsMessage); + } + public function testShouldSendSqsMessageToSqsProducer() { $sqsMock = $this->createSqsContextMock(); + $sqsMock->method('createMessage')->willReturn(new SqsMessage()); $destination = new SnsQsQueue(''); - $snsProducerStub = $this->prophesize(SqsProducer::class); - $snsProducerStub->send($destination, Argument::any())->shouldBeCalledOnce(); + $sqsProducerStub = $this->prophesize(SqsProducer::class); + $sqsProducerStub->send($destination, Argument::any())->shouldBeCalledOnce(); - $sqsMock->method('createProducer')->willReturn($snsProducerStub->reveal()); + $sqsMock->method('createProducer')->willReturn($sqsProducerStub->reveal()); $producer = new SnsQsProducer($this->createSnsContextMock(), $sqsMock); $producer->send($destination, new SnsQsMessage()); } + public function testShouldSendToSqsMessageWithGroupIdAndDeduplicationId() + { + $sqsMock = $this->createSqsContextMock(); + $sqsMock->method('createMessage')->willReturn(new SqsMessage()); + $destination = new SnsQsQueue(''); + + $sqsProducerStub = $this->prophesize(SqsProducer::class); + $sqsProducerStub->send( + $destination, + Argument::that(function (SqsMessage $sqsMessage) { + return 'group-id' === $sqsMessage->getMessageGroupId() + && 'deduplication-id' === $sqsMessage->getMessageDeduplicationId(); + }) + )->shouldBeCalledOnce(); + + $sqsMock->method('createProducer')->willReturn($sqsProducerStub->reveal()); + + $sqsMessage = new SnsQsMessage(); + $sqsMessage->setMessageGroupId('group-id'); + $sqsMessage->setMessageDeduplicationId('deduplication-id'); + + $producer = new SnsQsProducer($this->createSnsContextMock(), $sqsMock); + $producer->send($destination, $sqsMessage); + } + /** * @return \PHPUnit\Framework\MockObject\MockObject|SnsContext */ From 2ff0938fa6c2aef1ef326c6321d00985f356b656 Mon Sep 17 00:00:00 2001 From: Damian Dziaduch Date: Fri, 27 Jan 2023 17:38:00 +0100 Subject: [PATCH 1058/1142] Add combined index With multiple queues and thousands of messages, MongoDB is doing a full collection scan. The combined index solves that. --- pkg/mongodb/MongodbContext.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/mongodb/MongodbContext.php b/pkg/mongodb/MongodbContext.php index e6f5a579c..2e52ebdb2 100644 --- a/pkg/mongodb/MongodbContext.php +++ b/pkg/mongodb/MongodbContext.php @@ -161,5 +161,6 @@ public function createCollection(): void $collection->createIndex(['queue' => 1], ['name' => 'enqueue_queue']); $collection->createIndex(['priority' => -1, 'published_at' => 1], ['name' => 'enqueue_priority']); $collection->createIndex(['delayed_until' => 1], ['name' => 'enqueue_delayed']); + $collection->createIndex(['queue' => 1, 'priority' => -1, 'published_at' => 1, 'delayed_until' => 1], ['name' => 'enqueue_combined']); } } From 68e7f621e14d4d976ec6026de0ebb4b4895cf093 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 8 Feb 2023 15:36:30 +0200 Subject: [PATCH 1059/1142] Fix AWS SDK token parameter --- pkg/sns/Tests/SnsClientTest.php | 4 ++-- pkg/sqs/Tests/SqsClientTest.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/sns/Tests/SnsClientTest.php b/pkg/sns/Tests/SnsClientTest.php index e56a18790..ff87736de 100644 --- a/pkg/sns/Tests/SnsClientTest.php +++ b/pkg/sns/Tests/SnsClientTest.php @@ -16,7 +16,7 @@ public function testShouldAllowGetAwsClientIfSingleClientProvided() $awsClient = (new Sdk(['Sns' => [ 'key' => '', 'secret' => '', - 'token' => '', + 'token' => false, 'region' => '', 'version' => '2010-03-31', 'endpoint' => 'http://localhost/', @@ -32,7 +32,7 @@ public function testShouldAllowGetAwsClientIfMultipleClientProvided() $awsClient = (new Sdk(['Sns' => [ 'key' => '', 'secret' => '', - 'token' => '', + 'token' => false, 'region' => '', 'version' => '2010-03-31', 'endpoint' => 'http://localhost/', diff --git a/pkg/sqs/Tests/SqsClientTest.php b/pkg/sqs/Tests/SqsClientTest.php index 08c44a307..6edb9ffe9 100644 --- a/pkg/sqs/Tests/SqsClientTest.php +++ b/pkg/sqs/Tests/SqsClientTest.php @@ -16,7 +16,7 @@ public function testShouldAllowGetAwsClientIfSingleClientProvided() $awsClient = (new Sdk(['Sqs' => [ 'key' => '', 'secret' => '', - 'token' => '', + 'token' => false, 'region' => '', 'version' => '2012-11-05', 'endpoint' => 'http://localhost/', @@ -32,7 +32,7 @@ public function testShouldAllowGetAwsClientIfMultipleClientProvided() $awsClient = (new Sdk(['Sqs' => [ 'key' => '', 'secret' => '', - 'token' => '', + 'token' => false, 'region' => '', 'version' => '2012-11-05', 'endpoint' => 'http://localhost/', From 8b1bb2200f3970975ce35d12c5776642c335d5c5 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Wed, 8 Feb 2023 16:01:09 +0200 Subject: [PATCH 1060/1142] Try skipping the token --- pkg/sns/Tests/SnsClientTest.php | 2 -- pkg/sqs/Tests/SqsClientTest.php | 2 -- 2 files changed, 4 deletions(-) diff --git a/pkg/sns/Tests/SnsClientTest.php b/pkg/sns/Tests/SnsClientTest.php index ff87736de..e4fb15402 100644 --- a/pkg/sns/Tests/SnsClientTest.php +++ b/pkg/sns/Tests/SnsClientTest.php @@ -16,7 +16,6 @@ public function testShouldAllowGetAwsClientIfSingleClientProvided() $awsClient = (new Sdk(['Sns' => [ 'key' => '', 'secret' => '', - 'token' => false, 'region' => '', 'version' => '2010-03-31', 'endpoint' => 'http://localhost/', @@ -32,7 +31,6 @@ public function testShouldAllowGetAwsClientIfMultipleClientProvided() $awsClient = (new Sdk(['Sns' => [ 'key' => '', 'secret' => '', - 'token' => false, 'region' => '', 'version' => '2010-03-31', 'endpoint' => 'http://localhost/', diff --git a/pkg/sqs/Tests/SqsClientTest.php b/pkg/sqs/Tests/SqsClientTest.php index 6edb9ffe9..d7c583fd1 100644 --- a/pkg/sqs/Tests/SqsClientTest.php +++ b/pkg/sqs/Tests/SqsClientTest.php @@ -16,7 +16,6 @@ public function testShouldAllowGetAwsClientIfSingleClientProvided() $awsClient = (new Sdk(['Sqs' => [ 'key' => '', 'secret' => '', - 'token' => false, 'region' => '', 'version' => '2012-11-05', 'endpoint' => 'http://localhost/', @@ -32,7 +31,6 @@ public function testShouldAllowGetAwsClientIfMultipleClientProvided() $awsClient = (new Sdk(['Sqs' => [ 'key' => '', 'secret' => '', - 'token' => false, 'region' => '', 'version' => '2012-11-05', 'endpoint' => 'http://localhost/', From 7a9f216b862c3ec4ba96150f93d6153784b22ccc Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 23 Dec 2022 09:43:09 +0200 Subject: [PATCH 1061/1142] Add setting subscription attributes to Sns and SnsQs --- pkg/sns/SnsClient.php | 5 +++++ pkg/sns/SnsContext.php | 10 ++++++++++ pkg/snsqs/SnsQsContext.php | 11 +++++++++++ 3 files changed, 26 insertions(+) diff --git a/pkg/sns/SnsClient.php b/pkg/sns/SnsClient.php index 2d33faf25..d9973f286 100644 --- a/pkg/sns/SnsClient.php +++ b/pkg/sns/SnsClient.php @@ -60,6 +60,11 @@ public function unsubscribe(array $args): Result return $this->callApi('unsubscribe', $args); } + public function setSubscriptionAttributes(array $args): Result + { + return $this->callApi('setSubscriptionAttributes', $args); + } + public function listSubscriptionsByTopic(array $args): Result { return $this->callApi('ListSubscriptionsByTopic', $args); diff --git a/pkg/sns/SnsContext.php b/pkg/sns/SnsContext.php index a2de3f949..2e19164d9 100644 --- a/pkg/sns/SnsContext.php +++ b/pkg/sns/SnsContext.php @@ -145,6 +145,16 @@ public function getSubscriptions(SnsDestination $destination): array return $subscriptions; } + public function setSubscriptionAttributes(SnsSubscribe $subscribe): void + { + foreach ($this->getSubscriptions($subscribe->getTopic()) as $subscription) { + $this->client->setSubscriptionAttributes(array_merge( + $subscribe->getAttributes(), + ['SubscriptionArn' => $subscription['SubscriptionArn']], + )); + } + } + public function getTopicArn(SnsDestination $destination): string { if (false == array_key_exists($destination->getTopicName(), $this->topicArns)) { diff --git a/pkg/snsqs/SnsQsContext.php b/pkg/snsqs/SnsQsContext.php index 14dbc5acd..4a7121681 100644 --- a/pkg/snsqs/SnsQsContext.php +++ b/pkg/snsqs/SnsQsContext.php @@ -173,6 +173,17 @@ public function close(): void $this->getSqsContext()->close(); } + public function setSubscriptionAttributes(SnsQsTopic $topic, SnsQsQueue $queue, array $attributes): void + { + $this->getSnsContext()->setSubscriptionAttributes(new SnsSubscribe( + $topic, + $this->getSqsContext()->getQueueArn($queue), + SnsSubscribe::PROTOCOL_SQS, + false, + $attributes, + )); + } + private function getSnsContext(): SnsContext { if (null === $this->snsContext) { From 44e7f359fa0b31c11a656e76b73c70bb7e88c4e6 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 13 Feb 2023 23:28:51 +0200 Subject: [PATCH 1062/1142] Disable PHP-HTTP discovery plugin --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d4aa772c4..b454f84fd 100644 --- a/composer.json +++ b/composer.json @@ -130,6 +130,9 @@ "ext-mongo": "1.6.14", "ext-sockets": "1" }, - "prefer-stable": true + "prefer-stable": true, + "allow-plugins": { + "php-http/discovery": false + } } } From e559948c1fcf98e821686a87257ab2a04a2d7516 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 17 Feb 2023 18:55:17 +0200 Subject: [PATCH 1063/1142] Fix CS --- pkg/sns/SnsClient.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pkg/sns/SnsClient.php b/pkg/sns/SnsClient.php index d9973f286..91bce56eb 100644 --- a/pkg/sns/SnsClient.php +++ b/pkg/sns/SnsClient.php @@ -140,11 +140,6 @@ private function resolveClient(): void } } - throw new \LogicException(sprintf( - 'The input client must be an instance of "%s" or "%s" or a callable that returns one of those. Got "%s"', - AwsSnsClient::class, - MultiRegionClient::class, - is_object($client) ? get_class($client) : gettype($client) - )); + throw new \LogicException(sprintf('The input client must be an instance of "%s" or "%s" or a callable that returns one of those. Got "%s"', AwsSnsClient::class, MultiRegionClient::class, is_object($client) ? get_class($client) : gettype($client))); } } From 6545ef7907151bdebca77dfe4d57ebc4502cdf74 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 17 Feb 2023 19:38:31 +0200 Subject: [PATCH 1064/1142] Add unit tests --- pkg/sns/Tests/Spec/SnsContextTest.php | 31 ++++++++++++++++++++- pkg/snsqs/Tests/Spec/SnsQsContextTest.php | 34 +++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/pkg/sns/Tests/Spec/SnsContextTest.php b/pkg/sns/Tests/Spec/SnsContextTest.php index 6713abad0..9592d403f 100644 --- a/pkg/sns/Tests/Spec/SnsContextTest.php +++ b/pkg/sns/Tests/Spec/SnsContextTest.php @@ -2,13 +2,16 @@ namespace Enqueue\Sns\Tests\Spec; +use Aws\Result; use Enqueue\Sns\SnsClient; use Enqueue\Sns\SnsContext; +use Enqueue\Sns\SnsDestination; +use Enqueue\Sns\SnsSubscribe; use Interop\Queue\Spec\ContextSpec; class SnsContextTest extends ContextSpec { - public function testShouldCreateConsumerOnCreateConsumerMethodCall() + public function testShouldCreateConsumerOnCreateConsumerMethodCall(): void { $this->expectException(\LogicException::class); $this->expectExceptionMessage('SNS transport does not support consumption. You should consider using SQS instead.'); @@ -16,6 +19,32 @@ public function testShouldCreateConsumerOnCreateConsumerMethodCall() parent::testShouldCreateConsumerOnCreateConsumerMethodCall(); } + public function testSetsSubscriptionAttributes(): void + { + $client = $this->createMock(SnsClient::class); + $client->expects($this->once()) + ->method('listSubscriptionsByTopic') + ->willReturn(new Result(['Subscriptions' => [ + ['SubscriptionArn' => 'arn1'], + ['SubscriptionArn' => 'arn2'], + ]])); + $client->expects($this->exactly(2)) + ->method('setSubscriptionAttributes') + ->withConsecutive( + [$this->equalTo(['attr1' => 'value1', 'SubscriptionArn' => 'arn1'])], + [$this->equalTo(['attr1' => 'value1', 'SubscriptionArn' => 'arn2'])], + ); + + $context = new SnsContext($client, ['topic_arns' => ['topic1' => 'topicArn1']]); + $context->setSubscriptionAttributes(new SnsSubscribe( + new SnsDestination('topic1'), + 'endpoint1', + 'protocol1', + false, + ['attr1' => 'value1'], + )); + } + protected function createContext() { $client = $this->createMock(SnsClient::class); diff --git a/pkg/snsqs/Tests/Spec/SnsQsContextTest.php b/pkg/snsqs/Tests/Spec/SnsQsContextTest.php index 8554fcde6..c4fc61960 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsContextTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsContextTest.php @@ -3,13 +3,47 @@ namespace Enqueue\SnsQs\Tests\Spec; use Enqueue\Sns\SnsContext; +use Enqueue\Sns\SnsSubscribe; use Enqueue\SnsQs\SnsQsContext; +use Enqueue\SnsQs\SnsQsQueue; +use Enqueue\SnsQs\SnsQsTopic; use Enqueue\Sqs\SqsConsumer; use Enqueue\Sqs\SqsContext; use Interop\Queue\Spec\ContextSpec; class SnsQsContextTest extends ContextSpec { + public function testSetsSubscriptionAttributes(): void + { + $topic = new SnsQsTopic('topic1'); + + $snsContext = $this->createMock(SnsContext::class); + $snsContext->expects($this->once()) + ->method('setSubscriptionAttributes') + ->with($this->equalTo(new SnsSubscribe( + $topic, + 'queueArn1', + 'sqs', + false, + ['attr1' => 'value1'], + ))); + + $sqsContext = $this->createMock(SqsContext::class); + $sqsContext->expects($this->any()) + ->method('createConsumer') + ->willReturn($this->createMock(SqsConsumer::class)); + $sqsContext->expects($this->any()) + ->method('getQueueArn') + ->willReturn('queueArn1'); + + $context = new SnsQsContext($snsContext, $sqsContext); + $context->setSubscriptionAttributes( + $topic, + new SnsQsQueue('queue1'), + ['attr1' => 'value1'], + ); + } + protected function createContext() { $sqsContext = $this->createMock(SqsContext::class); From 4cb62baf527297d25fbba0700d34f433837f7bf6 Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Sat, 25 Feb 2023 22:18:02 -0500 Subject: [PATCH 1065/1142] Fix Shield URLs in READMEs --- README.md | 36 ++++++++++++++-------------- pkg/amqp-bunny/README.md | 2 +- pkg/amqp-ext/README.md | 2 +- pkg/amqp-lib/README.md | 2 +- pkg/amqp-tools/README.md | 2 +- pkg/async-command/README.md | 2 +- pkg/async-event-dispatcher/README.md | 2 +- pkg/dbal/README.md | 2 +- pkg/enqueue-bundle/README.md | 2 +- pkg/enqueue/README.md | 2 +- pkg/fs/README.md | 2 +- pkg/gearman/README.md | 2 +- pkg/gps/README.md | 2 +- pkg/job-queue/README.md | 2 +- pkg/mongodb/README.md | 2 +- pkg/monitoring/README.md | 2 +- pkg/null/README.md | 2 +- pkg/pheanstalk/README.md | 2 +- pkg/rdkafka/README.md | 2 +- pkg/redis/README.md | 2 +- pkg/simple-client/README.md | 2 +- pkg/sns/README.md | 2 +- pkg/snsqs/README.md | 2 +- pkg/sqs/README.md | 2 +- pkg/stomp/README.md | 2 +- pkg/wamp/README.md | 2 +- 26 files changed, 43 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 5a4d6b757..5e0dacec3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

Enqueue Chat - Build Status + Build Status Total Downloads Latest Stable Version License @@ -32,71 +32,71 @@ Features: * Battle-tested. Used in production. * Supported transports * [AMQP(s)](https://php-enqueue.github.io/transport/amqp/) based on [PHP AMQP extension](https://github.com/pdezwart/php-amqp) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-ext/CI)](https://github.com/php-enqueue/amqp-ext/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/amqp-ext/ci.yml?branch=master)](https://github.com/php-enqueue/amqp-ext/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-ext/d/total.png)](https://packagist.org/packages/enqueue/amqp-ext/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-ext/version.png)](https://packagist.org/packages/enqueue/amqp-ext) * [AMQP](https://php-enqueue.github.io/transport/amqp_bunny/) based on [bunny](https://github.com/jakubkulhan/bunny) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-bunny/CI)](https://github.com/php-enqueue/amqp-bunny/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/amqp-bunny/ci.yml?branch=master)](https://github.com/php-enqueue/amqp-bunny/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-bunny/d/total.png)](https://packagist.org/packages/enqueue/amqp-bunny/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-bunny/version.png)](https://packagist.org/packages/enqueue/amqp-bunny) * [AMQP(s)](https://php-enqueue.github.io/transport/amqp_lib/) based on [php-amqplib](https://github.com/php-amqplib/php-amqplib) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-lib/CI)](https://github.com/php-enqueue/amqp-lib/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/amqp-lib/ci.yml?branch=master)](https://github.com/php-enqueue/amqp-lib/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-lib/d/total.png)](https://packagist.org/packages/enqueue/amqp-lib/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-lib/version.png)](https://packagist.org/packages/enqueue/amqp-lib) * [Beanstalk](https://php-enqueue.github.io/transport/pheanstalk/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/pheanstalk/CI)](https://github.com/php-enqueue/pheanstalk/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/pheanstalk/ci.yml?branch=master)](https://github.com/php-enqueue/pheanstalk/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/pheanstalk/d/total.png)](https://packagist.org/packages/enqueue/pheanstalk/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/pheanstalk/version.png)](https://packagist.org/packages/enqueue/pheanstalk) * [STOMP](https://php-enqueue.github.io/transport/stomp/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/stomp/CI)](https://github.com/php-enqueue/stomp/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/stomp/ci.yml?branch=master)](https://github.com/php-enqueue/stomp/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/stomp/d/total.png)](https://packagist.org/packages/enqueue/stomp/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/stomp/version.png)](https://packagist.org/packages/enqueue/stomp) * [Amazon SQS](https://php-enqueue.github.io/transport/sqs/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/sqs/CI)](https://github.com/php-enqueue/sqs/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/sqs/ci.yml?branch=master)](https://github.com/php-enqueue/sqs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) * [Amazon SNS](https://php-enqueue.github.io/transport/sns/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/sns/CI)](https://github.com/php-enqueue/sns/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/sns/ci.yml?branch=master)](https://github.com/php-enqueue/sns/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) * [Amazon SNS\SQS](https://php-enqueue.github.io/transport/snsqs/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/snsqs/CI)](https://github.com/php-enqueue/snsqs/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/snsqs/ci.yml?branch=master)](https://github.com/php-enqueue/snsqs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/snsqs/d/total.png)](https://packagist.org/packages/enqueue/snsqs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/snsqs/version.png)](https://packagist.org/packages/enqueue/snsqs) * [Google PubSub](https://php-enqueue.github.io/transport/gps/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/gps/CI)](https://github.com/php-enqueue/gps/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/gps/ci.yml?branch=master)](https://github.com/php-enqueue/gps/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/gps/d/total.png)](https://packagist.org/packages/enqueue/gps/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/gps/version.png)](https://packagist.org/packages/enqueue/gps) * [Kafka](https://php-enqueue.github.io/transport/kafka/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/rdkafka/CI)](https://github.com/php-enqueue/rdkafka/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/rdkafka/ci.yml?branch=master)](https://github.com/php-enqueue/rdkafka/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/rdkafka/d/total.png)](https://packagist.org/packages/enqueue/rdkafka/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/rdkafka/version.png)](https://packagist.org/packages/enqueue/rdkafka) * [Redis](https://php-enqueue.github.io/transport/redis/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/redis/CI)](https://github.com/php-enqueue/redis/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/redis/ci.yml?branch=master)](https://github.com/php-enqueue/redis/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/redis/d/total.png)](https://packagist.org/packages/enqueue/redis/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/redis/version.png)](https://packagist.org/packages/enqueue/redis) * [Gearman](https://php-enqueue.github.io/transport/gearman/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/gearman/CI)](https://github.com/php-enqueue/gearman/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/gearman/ci.yml?branch=master)](https://github.com/php-enqueue/gearman/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/gearman/d/total.png)](https://packagist.org/packages/enqueue/gearman/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/gearman/version.png)](https://packagist.org/packages/enqueue/gearman) * [Doctrine DBAL](https://php-enqueue.github.io/transport/dbal/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/dbal/CI)](https://github.com/php-enqueue/dbal/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/dbal/ci.yml?branch=master)](https://github.com/php-enqueue/dbal/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/dbal/d/total.png)](https://packagist.org/packages/enqueue/dbal/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/dbal/version.png)](https://packagist.org/packages/enqueue/dbal) * [Filesystem](https://php-enqueue.github.io/transport/filesystem/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/fs/CI)](https://github.com/php-enqueue/fs/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/fs/ci.yml?branch=master)](https://github.com/php-enqueue/fs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/fs/d/total.png)](https://packagist.org/packages/enqueue/fs/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/fs/version.png)](https://packagist.org/packages/enqueue/fs) * [Mongodb](https://php-enqueue.github.io/transport/mongodb/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/mongodb/CI)](https://github.com/php-enqueue/mongodb/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/mongodb/ci.yml?branch=master)](https://github.com/php-enqueue/mongodb/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/mongodb/d/total.png)](https://packagist.org/packages/enqueue/mongodb/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/mongodb/version.png)](https://packagist.org/packages/enqueue/mongodb) * [WAMP](https://php-enqueue.github.io/transport/wamp/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/wamp/CI)](https://github.com/php-enqueue/wamp/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/wamp/ci.yml?branch=master)](https://github.com/php-enqueue/wamp/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/wamp/d/total.png)](https://packagist.org/packages/enqueue/wamp/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/wamp/version.png)](https://packagist.org/packages/enqueue/wamp) * [Null](https://php-enqueue.github.io/transport/null/) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/null/CI)](https://github.com/php-enqueue/null/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/null/ci.yml?branch=master)](https://github.com/php-enqueue/null/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null/stats) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) * [the others are coming](https://github.com/php-enqueue/enqueue-dev/issues/284) diff --git a/pkg/amqp-bunny/README.md b/pkg/amqp-bunny/README.md index 41754124f..09f4005fe 100644 --- a/pkg/amqp-bunny/README.md +++ b/pkg/amqp-bunny/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # AMQP Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-bunny/CI)](https://github.com/php-enqueue/amqp-bunny/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/amqp-bunny/ci.yml?branch=master)](https://github.com/php-enqueue/amqp-bunny/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-bunny/d/total.png)](https://packagist.org/packages/enqueue/amqp-bunny) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-bunny/version.png)](https://packagist.org/packages/enqueue/amqp-bunny) diff --git a/pkg/amqp-ext/README.md b/pkg/amqp-ext/README.md index f739aa94a..1b254a860 100644 --- a/pkg/amqp-ext/README.md +++ b/pkg/amqp-ext/README.md @@ -8,7 +8,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # AMQP Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-ext/CI)](https://github.com/php-enqueue/amqp-ext/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/amqp-ext/ci.yml?branch=master)](https://github.com/php-enqueue/amqp-ext/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-ext/d/total.png)](https://packagist.org/packages/enqueue/amqp-ext) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-ext/version.png)](https://packagist.org/packages/enqueue/amqp-ext) diff --git a/pkg/amqp-lib/README.md b/pkg/amqp-lib/README.md index 64a1cd684..f85ce7c5f 100644 --- a/pkg/amqp-lib/README.md +++ b/pkg/amqp-lib/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # AMQP Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-lib/CI)](https://github.com/php-enqueue/amqp-lib/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/amqp-lib/ci.yml?branch=master)](https://github.com/php-enqueue/amqp-lib/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-lib/d/total.png)](https://packagist.org/packages/enqueue/amqp-lib) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-lib/version.png)](https://packagist.org/packages/enqueue/amqp-lib) diff --git a/pkg/amqp-tools/README.md b/pkg/amqp-tools/README.md index 8d3f35dc0..16cb1667f 100644 --- a/pkg/amqp-tools/README.md +++ b/pkg/amqp-tools/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # AMQP tools [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/amqp-tools/CI)](https://github.com/php-enqueue/amqp-tools/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/amqp-tools/ci.yml?branch=master)](https://github.com/php-enqueue/amqp-tools/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/amqp-tools/d/total.png)](https://packagist.org/packages/enqueue/amqp-tools) [![Latest Stable Version](https://poser.pugx.org/enqueue/amqp-tools/version.png)](https://packagist.org/packages/enqueue/amqp-tools) diff --git a/pkg/async-command/README.md b/pkg/async-command/README.md index cb6eef58c..711e97163 100644 --- a/pkg/async-command/README.md +++ b/pkg/async-command/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Symfony Async Command. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/async-command/CI)](https://github.com/php-enqueue/async-command/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/async-command/ci.yml?branch=master)](https://github.com/php-enqueue/async-command/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/async-command/d/total.png)](https://packagist.org/packages/enqueue/async-command) [![Latest Stable Version](https://poser.pugx.org/enqueue/async-command/version.png)](https://packagist.org/packages/enqueue/async-command) diff --git a/pkg/async-event-dispatcher/README.md b/pkg/async-event-dispatcher/README.md index f1629b59a..c4804d981 100644 --- a/pkg/async-event-dispatcher/README.md +++ b/pkg/async-event-dispatcher/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Symfony Async Event Dispatcher. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/async-event-dispatcher/CI)](https://github.com/php-enqueue/async-event-dispathcer/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/async-event-dispatcher/ci.yml?branch=master)](https://github.com/php-enqueue/async-event-dispathcer/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/async-event-dispathcer/d/total.png)](https://packagist.org/packages/enqueue/async-event-dispatcher) [![Latest Stable Version](https://poser.pugx.org/enqueue/async-event-dispathcer/version.png)](https://packagist.org/packages/enqueue/async-event-dispatcher) diff --git a/pkg/dbal/README.md b/pkg/dbal/README.md index 7f4d2d007..97ed98367 100644 --- a/pkg/dbal/README.md +++ b/pkg/dbal/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Doctrine DBAL Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/dbal/CI)](https://github.com/php-enqueue/dbal/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/dbal/ci.yml?branch=master)](https://github.com/php-enqueue/dbal/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/dbal/d/total.png)](https://packagist.org/packages/enqueue/dbal) [![Latest Stable Version](https://poser.pugx.org/enqueue/dbal/version.png)](https://packagist.org/packages/enqueue/dbal) diff --git a/pkg/enqueue-bundle/README.md b/pkg/enqueue-bundle/README.md index 4f103b3df..2b8bbfe68 100644 --- a/pkg/enqueue-bundle/README.md +++ b/pkg/enqueue-bundle/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message Queue Bundle [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/enqueue-bundle/CI)](https://github.com/php-enqueue/enqueue-bundle/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/enqueue-bundle/ci.yml?branch=master)](https://github.com/php-enqueue/enqueue-bundle/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/enqueue-bundle/d/total.png)](https://packagist.org/packages/enqueue/enqueue-bundle) [![Latest Stable Version](https://poser.pugx.org/enqueue/enqueue-bundle/version.png)](https://packagist.org/packages/enqueue/enqueue-bundle) diff --git a/pkg/enqueue/README.md b/pkg/enqueue/README.md index f61715759..9e1dd50c3 100644 --- a/pkg/enqueue/README.md +++ b/pkg/enqueue/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message Queue. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/enqueue/CI)](https://github.com/php-enqueue/enqueue/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/enqueue/ci.yml?branch=master)](https://github.com/php-enqueue/enqueue/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/enqueue/d/total.png)](https://packagist.org/packages/enqueue/enqueue) [![Latest Stable Version](https://poser.pugx.org/enqueue/enqueue/version.png)](https://packagist.org/packages/enqueue/enqueue) diff --git a/pkg/fs/README.md b/pkg/fs/README.md index 596c60f29..1f2e0b88a 100644 --- a/pkg/fs/README.md +++ b/pkg/fs/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Enqueue Filesystem Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/fs/CI)](https://github.com/php-enqueue/fs/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/fs/ci.yml?branch=master)](https://github.com/php-enqueue/fs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/fs/d/total.png)](https://packagist.org/packages/enqueue/fs) [![Latest Stable Version](https://poser.pugx.org/enqueue/fs/version.png)](https://packagist.org/packages/enqueue/fs) diff --git a/pkg/gearman/README.md b/pkg/gearman/README.md index b1e8bbba2..4aedb72d2 100644 --- a/pkg/gearman/README.md +++ b/pkg/gearman/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Gearman Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/gearman/CI)](https://github.com/php-enqueue/gearman/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/gearman/ci.yml?branch=master)](https://github.com/php-enqueue/gearman/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/gearman/d/total.png)](https://packagist.org/packages/enqueue/gearman) [![Latest Stable Version](https://poser.pugx.org/enqueue/gearman/version.png)](https://packagist.org/packages/enqueue/gearman) diff --git a/pkg/gps/README.md b/pkg/gps/README.md index fd63f234d..4f2a0e6ac 100644 --- a/pkg/gps/README.md +++ b/pkg/gps/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Google Pub/Sub Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/gps/CI)](https://github.com/php-enqueue/gps/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/gps/ci.yml?branch=master)](https://github.com/php-enqueue/gps/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/gps/d/total.png)](https://packagist.org/packages/enqueue/gps) [![Latest Stable Version](https://poser.pugx.org/enqueue/gps/version.png)](https://packagist.org/packages/enqueue/gps) diff --git a/pkg/job-queue/README.md b/pkg/job-queue/README.md index 4a9841b28..6fe624105 100644 --- a/pkg/job-queue/README.md +++ b/pkg/job-queue/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Job Queue. [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/job-queue/CI)](https://github.com/php-enqueue/job-queue/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/job-queue/ci.yml?branch=master)](https://github.com/php-enqueue/job-queue/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/job-queue/d/total.png)](https://packagist.org/packages/enqueue/job-queue) [![Latest Stable Version](https://poser.pugx.org/enqueue/job-queue/version.png)](https://packagist.org/packages/enqueue/job-queue) diff --git a/pkg/mongodb/README.md b/pkg/mongodb/README.md index 91837470b..2e9bbd1fc 100644 --- a/pkg/mongodb/README.md +++ b/pkg/mongodb/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Mongodb Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/mongodb/CI)](https://github.com/php-enqueue/mongodb/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/mongodb/ci.yml?branch=master)](https://github.com/php-enqueue/mongodb/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/mongodb/d/total.png)](https://packagist.org/packages/enqueue/mongodb) [![Latest Stable Version](https://poser.pugx.org/enqueue/mongodb/version.png)](https://packagist.org/packages/enqueue/mongodb) diff --git a/pkg/monitoring/README.md b/pkg/monitoring/README.md index a2fa75dfe..dfd33f056 100644 --- a/pkg/monitoring/README.md +++ b/pkg/monitoring/README.md @@ -18,7 +18,7 @@ Queue Monitoring tool. Track sent, consumed messages. Consumers performances. * Provides integration for Enqueue [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/monitoring/CI)](https://github.com/php-enqueue/monitoring/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/monitoring/ci.yml?branch=master)](https://github.com/php-enqueue/monitoring/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/monitoring/d/total.png)](https://packagist.org/packages/enqueue/monitoring) [![Latest Stable Version](https://poser.pugx.org/enqueue/monitoring/version.png)](https://packagist.org/packages/enqueue/monitoring) diff --git a/pkg/null/README.md b/pkg/null/README.md index c66b46952..7d78ae0d6 100644 --- a/pkg/null/README.md +++ b/pkg/null/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Enqueue Null Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/null/CI)](https://github.com/php-enqueue/null/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/null/ci.yml?branch=master)](https://github.com/php-enqueue/null/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/null/d/total.png)](https://packagist.org/packages/enqueue/null) [![Latest Stable Version](https://poser.pugx.org/enqueue/null/version.png)](https://packagist.org/packages/enqueue/null) diff --git a/pkg/pheanstalk/README.md b/pkg/pheanstalk/README.md index d318fc7c2..6461741cf 100644 --- a/pkg/pheanstalk/README.md +++ b/pkg/pheanstalk/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Beanstalk Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/pheanstalk/CI)](https://github.com/php-enqueue/pheanstalk/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/pheanstalk/ci.yml?branch=master)](https://github.com/php-enqueue/pheanstalk/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/pheanstalk/d/total.png)](https://packagist.org/packages/enqueue/pheanstalk) [![Latest Stable Version](https://poser.pugx.org/enqueue/pheanstalk/version.png)](https://packagist.org/packages/enqueue/pheanstalk) diff --git a/pkg/rdkafka/README.md b/pkg/rdkafka/README.md index 2a541eb63..94f24e510 100644 --- a/pkg/rdkafka/README.md +++ b/pkg/rdkafka/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # RdKafka Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/rdkafka/CI)](https://github.com/php-enqueue/rdkafka/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/rdkafka/ci.yml?branch=master)](https://github.com/php-enqueue/rdkafka/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/rdkafka/d/total.png)](https://packagist.org/packages/enqueue/rdkafka) [![Latest Stable Version](https://poser.pugx.org/enqueue/rdkafka/version.png)](https://packagist.org/packages/enqueue/rdkafka) diff --git a/pkg/redis/README.md b/pkg/redis/README.md index f45bb79ba..7b368bb35 100644 --- a/pkg/redis/README.md +++ b/pkg/redis/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Redis Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/redis/CI)](https://github.com/php-enqueue/redis/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/redis/ci.yml?branch=master)](https://github.com/php-enqueue/redis/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/redis/d/total.png)](https://packagist.org/packages/enqueue/redis) [![Latest Stable Version](https://poser.pugx.org/enqueue/redis/version.png)](https://packagist.org/packages/enqueue/redis) diff --git a/pkg/simple-client/README.md b/pkg/simple-client/README.md index b3e5a3f0f..8ecb67059 100644 --- a/pkg/simple-client/README.md +++ b/pkg/simple-client/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Message Queue. Simple client [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/simple-client/CI)](https://github.com/php-enqueue/simple-client/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/simple-client/ci.yml?branch=master)](https://github.com/php-enqueue/simple-client/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/simple-client/d/total.png)](https://packagist.org/packages/enqueue/simple-client) [![Latest Stable Version](https://poser.pugx.org/enqueue/simple-client/version.png)](https://packagist.org/packages/enqueue/simple-client) diff --git a/pkg/sns/README.md b/pkg/sns/README.md index bfcfbce27..bfc7a4012 100644 --- a/pkg/sns/README.md +++ b/pkg/sns/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Amazon SNS Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/sns/CI)](https://github.com/php-enqueue/sns/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/sns/ci.yml?branch=master)](https://github.com/php-enqueue/sns/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/sns/d/total.png)](https://packagist.org/packages/enqueue/sns) [![Latest Stable Version](https://poser.pugx.org/enqueue/sns/version.png)](https://packagist.org/packages/enqueue/sns) diff --git a/pkg/snsqs/README.md b/pkg/snsqs/README.md index 15d6d979e..94a22776d 100644 --- a/pkg/snsqs/README.md +++ b/pkg/snsqs/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Amazon SNS-SQS Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/snsqs/CI)](https://github.com/php-enqueue/snsqs/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/snsqs/ci.yml?branch=master)](https://github.com/php-enqueue/snsqs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/snsqs/d/total.png)](https://packagist.org/packages/enqueue/snsqs) [![Latest Stable Version](https://poser.pugx.org/enqueue/snsqs/version.png)](https://packagist.org/packages/enqueue/snsqs) diff --git a/pkg/sqs/README.md b/pkg/sqs/README.md index 1d173345b..7f4170bf2 100644 --- a/pkg/sqs/README.md +++ b/pkg/sqs/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Amazon SQS Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/sqs/CI)](https://github.com/php-enqueue/sqs/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/sqs/ci.yml?branch=master)](https://github.com/php-enqueue/sqs/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/sqs/d/total.png)](https://packagist.org/packages/enqueue/sqs) [![Latest Stable Version](https://poser.pugx.org/enqueue/sqs/version.png)](https://packagist.org/packages/enqueue/sqs) diff --git a/pkg/stomp/README.md b/pkg/stomp/README.md index 758c7a43b..e8a98e433 100644 --- a/pkg/stomp/README.md +++ b/pkg/stomp/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # STOMP Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/stomp/CI)](https://github.com/php-enqueue/stomp/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/stomp/ci.yml?branch=master)](https://github.com/php-enqueue/stomp/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/stomp/d/total.png)](https://packagist.org/packages/enqueue/stomp) [![Latest Stable Version](https://poser.pugx.org/enqueue/stomp/version.png)](https://packagist.org/packages/enqueue/stomp) diff --git a/pkg/wamp/README.md b/pkg/wamp/README.md index 04d0fdb5c..ee0bcaa17 100644 --- a/pkg/wamp/README.md +++ b/pkg/wamp/README.md @@ -10,7 +10,7 @@ Enqueue is an MIT-licensed open source project with its ongoing development made # Web Application Messaging Protocol (WAMP) Transport [![Gitter](https://badges.gitter.im/php-enqueue/Lobby.svg)](https://gitter.im/php-enqueue/Lobby) -[![Build Status](https://img.shields.io/github/workflow/status/php-enqueue/wamp/CI)](https://github.com/php-enqueue/wamp/actions?query=workflow%3ACI) +[![Build Status](https://img.shields.io/github/actions/workflow/status/php-enqueue/wamp/ci.yml?branch=master)](https://github.com/php-enqueue/wamp/actions?query=workflow%3ACI) [![Total Downloads](https://poser.pugx.org/enqueue/wamp/d/total.png)](https://packagist.org/packages/enqueue/wamp) [![Latest Stable Version](https://poser.pugx.org/enqueue/wamp/version.png)](https://packagist.org/packages/enqueue/wamp) From 7dbb7ec5105775436817118323d742cfb5bd3ade Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 18 Mar 2023 13:50:24 +0200 Subject: [PATCH 1066/1142] split on mac m1 --- bin/splitsh-lite-m1 | Bin 0 -> 8387474 bytes bin/subtree-split | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100755 bin/splitsh-lite-m1 diff --git a/bin/splitsh-lite-m1 b/bin/splitsh-lite-m1 new file mode 100755 index 0000000000000000000000000000000000000000..55814ab43bca4d08d5fc77dbcde1fd0297249bf8 GIT binary patch literal 8387474 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�V{keJ`w$Xxyz32kj~Aivcg5+3%=Q@`O$i8 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 z�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

C;NCNZ5P7ll-gX% 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

#@S@OjnqxLB&f%sOT5Q}cdQ=pTF|#fZY8gJ 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

)jJLwbQd;gD>Cy%Y|vfUpyZ=B@_geg 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%0A*& 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

4VG=U2!kOt-5UYQV@r${3xNami8Y?bx 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%0AtbkVLH+}1<89mOu~ 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�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%0AhuOcra?Q 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

NV?0@hiTYLLkNU~?k?{)?;^O;` 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

N6ak{r-tQ&iI!L;C#9|NZ&P`uvZ5epe8V-?3bu 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

K>y))|hYveDt#ll6t;*lZvi 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

;yqQca!Q`h-LHQE-$afWw|wKcg%Et``2L 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

?H z4{l0AK5LVCg`W+P3YXpr)Boup z*^^%$2mPIAn&KH|N$_zB!c@=VHttOL7D`-;r)l4??bs>(B>R9Bu$c;d%lp;C2E?12 z=*uZRnFilXTdAc{o%1#KV{&>xW+#q!ZSR@>dBGMLXX#Dp)f1GiN$>~GdxoXICs;>} z+nFpkv)syZJIfc4FR58BEn;4PZ-bfZfd~CAy|GL12W6(9yOnF0$yrdgT&w~ z)r+Gcp4A1Okp`bAq(OiErP)E1;I2X;OuiCkUj@Z`g&5_zgU6M*420dvf8S1`56rWl zCnCOeke%E^Mmczlv+Yk9FI42no*4wBB2|vGONoHH89d1;9O8x-m}JC_7J?(~%<-r@VTT%2Sx<8D*#r#2o zDU1wFqMP+7>w4h~s;wS6n8$#HNH{}(YnI9M!h}(=DdMg$7YlwD2>=}#u`e*`T;u?} zz-NMU#SuK^>~EZT(wSd4sY$3$Cgqc!Bwc_Q2bpH+e=aCnmI5c|2!; zK2|7|ya9u5qZ8CyO3}a8jA}$D)N~N2akDut7^d$r0Yn7BF?urS73{bhBUy2OiW(HA zvxf|I06zI-_y>nnL^s|~JTq>SaI`OPVMLkJ1Pbugp~fD}vjkr>V(MVWyFEKT=GzlD z0vETM>ABc^0jPw<%&oJ86R!y-UX;DO&P3OE&4j(#n2Stuu`!=D1f0nl7u}}3Jt2{$ zFoW;{ShZC?f}gfY>N5`|65~B*Xgbj?G(g+}9I==?FxsP>>$!m!vY7}dZWsmkyaes| zi?NuYdkx>w!%}#UJuQ4sbXvp5px{&*c2RLm=t;S0yvUm}%$Z0o+#Vq1$h!9=qx~A;>VrzlGmlK(bHOWLuXEQXi$MKFuh|r!Qr-H8i31jgD zeuO8snVDfd)edfz-|tz*uNL|?^=+tlBDlxw*4#Dh zSr$wqlT~oQewC}K(?u?^coPrGUaSv1I>plqWf-*RQR^Ox!q2AW=G0x2nj2DcUs_%r zjR9lI+kgRP0;)z7Fo6;1zC>=`8z}bAetedcJF3N?Q2r$% z->4aoc6v$KQKce6gvxRZfwfGY!_{RWA>i}(jP@R0SmbFu*kBksj1#rpB_ZCra%X}QfbEF zZFxnD>E_j2CEZ27t<2hP%-SydZMPK)_tp%>c7dhTISwW;UGHSBjGB?cC}pLE2vKe; zrIzM;{vY))G|enSJX@+1Stx-t2Y5bnmp{FdW--oq`PS=nRLaRP!h)(9vJ+Rm0evF< z)dTz%na`@zE5BNDsj*GI+A8N}gMEy7Ctte3-J2(`3fIe%$U^?sMQGB9#BeB`U`nvhsejQ}(5G01O zkcXjwJ2XBhd1-ANFu)K7C7{3n6PQ|{=ytoX-3g&(v zpJE`hOQjc&<4f94Jk7kb_0&u9Cthf%`LgY~=_T8r_&=Ze_nvrp`)TWpc~6+%=cD=K z$d$&YwjY{))Y?mJ_)%N&Z%sz-OKmjbt~7=#Pd81v0IKSa4A+3h1cM|wf*!$N(6vf; zDbDtBd^VY_i9MyYUIm{cRajmk9_^>h@E{#@OZ|`qvUC^IN>Md&Z4LKHr0Dv>=2ANj zxbI+DW9FW&#kJui?oLJrMj{MRJRbKJ=F&OFJWL`<;d0MRslGH*0fhz`0GZ>Sxjq#3 zsptzc$){e6>M`frxHG`*b6IQIzMU4BqBzTo*-?yW=EI`NzDE*iC1uUmVHta_k9{V! zeTNpsLFe0PO(ABeoN)yuvs%?OGdN6~*8Q@5o4^vLQU&3-)|vKTO6h5KD<;@eA$SLm z_s4yEq;Ku4HhkfB4P>;FSypdN(pR6JXgem1+Pb z$#0FHg#E2)hM^&*ru5w=z6aA@_8Yl(MvAGRbrR5G^ z5Ums%^wRoYLEGL8kpOGC{9BphL*O@1y0qELp$xJ(psxq|dI+dGJdCR~21K+MBCMQ# z!ipq7qD2>qx*?7Rr3b?xOE!DPog6NzH#=**XOF!yxGNn{0|-+>@lE!hHcGd7Awe{( zj`VGwA}4S0Bw{~pIe2SSDR^$p_igi08-L72pJ0l*FT$63 zOn9|5pS0l>)?98wpyP{7H6BP+hg)n&5Yde`yvfF2glY0)_n5UmZjap;h#e+;xf*fK zbI5BRPh^bRAnG?tp~0bsxekQh7S0gvfSU+4lI>CKXB(D@5D7qI6|QC3tkLYLhc!mB zQO1Er?wL^3B1Ki-$7qVao%o`o39kq0YS z5z?kqrTGgcIX-E>QYknb*5OX%Nj(j#Eo%xO%FXx;vB;!_mVEOqBh)O zCN~>`_vURzT>gSdk55ie;cqk89Egw4+E1Z+Qxcn-^pwxWq%a_jL32@jgFc$4Di?L! zITANoqK9TmB|Ui-+)0LUAFe)V z`iWK_Bs~T_72TZ&e;axAzlMPIdqMauIb94>kAEI7D79K1u@1X0>n}_c&r`&@R5_c> z8~s4f^)0HVQgD|^&oebX^*j@u&-6#ooaZLtJR9ab({(<$O}X}(jUwxqbx$y#0XwSp zI(KYzG|1%j=5;)R0&N!|3L6y>zm-`F1Ll9d%DlSyO4MnGn?vG5n+KyWA82VoYjn?i z7TJvi{i>`=cMY*2V`mqO3+JGN81;%3m^@$$&pKAHu`s+KKk9L6jZ;Yx+!cenFrL88 z?zL6i>|Ec%)26{_31dE4nCA3(TSEqc_EI*8_SMp`A{N{lxm#3u)>40#J)jrc`3%#v z^sF_1vDu%c9ZBNnwdeQNJZH0KQGT~HaL%5b4|W|elXC;=I!!)uS+%O3TX!s4I7UQV zy)}JABH`PPo~a6aXQ0xPz+kXyV(bM9M@te@lKRni1b>kr!7J*uW~rB<)7UHg@&Xm_ z0$7yU(pZ(tArLCPkgJzb^Gfb`m9LZ6(&>h|HcF8+%e2aFw`<-9T{25IOlluQgqIeW#}M-g+=^ zkKhzWiJ3w4dWMr$j)A6f;@pjRB5Jt>-e$Ato7-%;=3GNUf;otFSl?%ow1z8B2B$2b>u4XwS5ta`Yyo-awJ5GJ&RU>dF_*MLhR}J^}PjtBAG5oTfGUNkT#&P$K z7NBo+s#>cAzG~rl>{uBCqB3U)1`nVlZz_@Gy_XI4UF!TPKGWEW0Cg z#RyZ6ylC`_@XD?pqs-fg0`2RDEZN1YOgI_NvmIo^m{*w;N;9}sNKkk4O2H@y6^auT zzZ3!V43K#X=`1kML$oAgmoT@U1fDCoYD>u=GzaYsg)8Q=$ZZ>Z;WN60qad3UR>G^< zjD53!4YJFak+u}Ry@K+SnWydppUGw99t3!gXXl$5uQb0H41#7u|8QgVXpdoE8wLwY zV{V*;=;M7!mEO z&dh-)_`b8GHT}LbcRAZEp)f44)R{#EVwAq^$^;s51TLR&u5USak1O2m>^;u-HoV)J zdthZ4Zoie}zkNG&w{x5FcoD9Lb8&Etz+--f=;OCnSDc_5g+j-jvLMtP3Wsshrm43mzo zk_?i4n>6EC@d@$|`$H<0paQF+Q|(8aE$slmm@@P)ReQY12A}1(5Men6Gfk>V-3_B_ zIT@{wBtwOUx6hD0l!2Eo7^C9lUpW)J41k~`!!bIcjxGZ1vo{GnBZ6Xvk@mW1KC&8dZqw~Yoc;L)yurMq!{8&>x9;ItVmhVH_kWaI zXBr4g%onu7A)@>%NdeCv@%~)Z?~Tv?nh=pg_E|=kAexV0m%g)gJD^FnB66of*Hg?E zgv(Kqb>G6h#(YCoCZOl>oZQ47aPmsw6Ps;=lN%@!&NZXw7$`>U+tRG<&~Kv(O3yV% z;R|5iU1HHXJ@p8D>fe7vLse zwOtMFDEE$Q06mf?no+R?EHY1N4Z!fqsX5AXpe5KjaiXcqIh^u)LwbpR#=Ohohr7xb zdaEMkm;C6QosUkZADxPCr+u4lCT`+VGl&)FA@Ds&6)pCebQK_YIxUkG-#$QM4%D+- zeTXA040Lk2aT{RwcM-!Vp^6s$u#yT;2YK;|Oyv>OO{#xhq&xQEbL84DLW;j6juGIt zE<2}OsrBIR(2ahID>UVBaSL$iFw-zV|4vmN0P!gn|6vmB_;$gvB3}fHJsc&>w&eBN zVre&-NzWl5V(QaY1`o0Lt1;?mC{%7tX&0O9y;w=-y!@5*w=L+r}JkmKPI~RV$*e|ll6jwxc3x4zc<>fBECvmXPX zr8dxg8~#3-nFsLh3_d?ydl$1T2>xJ)S&*j~y6N`NsW;aIU$txUp_^go7<6Tv&4Unc7(QY57rGKHwc##Nn_fbp4%7@Pf835Q>JiMe5W&8Dt*UbK z2~}WgiZRPk0NGlKz`dsbl^i@$^Uju7v`)=#!97k+*lW#{`2Q*<=}S$PtCc@!dM?C^ z?Rw>${iz9`Fy^O*>AWo>^G*!A1Xd}J^FY`Ii|R`nC*c%b4bv(v7h2;+eZQZTZ3KxF zAngyB_&-ej0h9hu?YlVVv!;$U^2OQ(i!Lqv=q6I31`DrhWDPw6{Jdt=2d3c{pDBzY1syw*AH=J)nMIx?g?&bbE#S zyUyg-{7CnIjsnQ$!|1@#@AKT3fGeyoq3;qZ&{R9WnRY=Jx?_ z!2zzV%}4TWUHzbK5FyXtwf?elKk}FBDQw%*KGI%~%$c8lIjVmtO7Dv5UyIUjM)fD1 z{ZP?-CUl?8I(`$UkEit`+|RR?5~&7^OP+eMMZ{nACAKeURq-MvnGnfuG7rj{-6pcB>uPfXK-l>Y7~0>+hxGMf$sY2BVWN=3f^5w zGxJ4xcY8rST1Ie12HELYcpeYmc6Bd&UN?*ekBd<$r>;)abRDZ7MY^&&871o8VHRj1 zKCj+P8+A%F)qB$JFPb^k-bR0=uQ6B|XbcyI8l%}rb37euPGob>u=CQ%`uudNzA#73wk&)Kat1DbPV?~T@qiWU(MsJRC-+70~1_>_jl2NUz%#6FtjVdPt* zcpb8)4-7vm4%fx;>2b?Ta5Z}oWK~-L`>f=AW*<;RJ#=_ioMFhvf-Q9seh=x2Y$Yre z#vghlhBAf4Tf^~NLU(Hz-x9XHY#AO9DU=ll2{}K+a&OyyjV+SzQkOoTMt@4>0&&b9 zq~-BcaJjftS#>7in!KW+A4?z4LvJZPp-)m^kIs%scpvhZb#lW8;?jS_ zz8H$!?eI7dJ(qxHrHPRHh{}Z@Gkr9#g`to~fQw^dyL-KF*ap*BZ)zJfmg<2{a3UwF zx`m=LjygkE%~hTC zZC7s)1dXIz<^S@BJoNIOH@5V0#g}Z zQGQ88l97ZeuV%bR4tr#)rDg{Z6wnSX*%@@SFVvlsG!AOE);(;tO6geeZOym2!94cc zPvwVaw$iiVMN(l>lO@^}#{f*+FsKUCLi$FBfgr^;#BJNQ;$cwd6{W-R&VuL>HH_r_8uIN#Z<*iOR2ajt*x17j*J}y~lmUn)e{K8goj#iJUSv`MT2W>)Ra` zJfrnj2}py*;-C4(wzDgor}w-=sp9;3A$wx;t$%Pv^aW%DbN9A0Vy^t6O}E`?+Y>pj zhkDBPP8Z$nnm3{PwLiAeJ&a_OMrnb_7vat`!?B(lzV5G zNVOr(8=PQ<%@}4VaSO~0%n5z^7Re+GYKVPi2u@iNDhF93aC*4LznyZ_^GW4Ec$DtL z&0x+^gmhu^U=}jRWlRCnN%D|m9(O|!$3X*;5eJR-ZwgKl)+uclhfxZVp+IB;i7X|IXzC#qzX+r#n3p_ z(&N86r$E!;V!0KQfx@9RjP zj+2b&>SyEhdAyD!$)UU~5Yu~}p|C|LhVHZ6jbVwI0e7$~qd0vSX@nGTHvJ}M~66hg%w+(&q8Xj-08N5+;) zqN&QQZTSESuQcHm6L`hkJ#c!fRIrI}SNeAOtUW`swqqr843B4QGsgby_<~C>h@u?p z2b~qW34rqH%srdop0>77`%Y#b$RMfwX;4$mX8H`=q3LpCM|y3VeKL)&#(|rTy2jZX zT=W??a4R^H8Kw-G!G)U7PjVuR9s@)cW|cN3t4bX4_#{dPNCi!&k+MxyGuOH|Y!$;X?c0)X ziOynA-gf%!JQ+j2XIHbsdg z^aZLtP}y}1F3uG8c3Zf`x}T=$mK4A4CLiZ5>iKy-jVLlK_e6P8CP{BMBjIOaSfu3nDTrG?P zP3y9IF>NdG58Zg|S4fmtj3$&2mrOXtsG}gaDlvb!L|p-#;@X9b0=?iji9~?F0>GXo z?|{_6r)wTXO64UuRJ<0P5*01snRf@JhL{Dvj7X_ZB*X&$!ZOv0qNp{;RAwO8fyuAI zϓ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

0>_JaWvX!Q<@WYv4|ve!)%h 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�Sbv`5Q+HxKB1ygI(6H%|8Qad&} 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

=moQ2Q1b$2qbL(|9RcaVInrg{~hBDO& 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ˢ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µ|ooLpUA(T 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

mH#rkgq1JW{pfAL*tk~J^beses-p| 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Ξ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 z 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

0K|}ccFrdyj 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%0A`j$yRNsWcXZAls*ztJw||dA3{2R#|5ib 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 z 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/f`!zOWlPWEoZHN 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

S!5h0&0n>%tdZ7}g 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π9tb@6U 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

i035Z+Z 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�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ⅈ$73y3W;M} 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%0DI>o|CF{x6#L-_E%;|Z9tBA{q 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 t9<{z0FuRNA%lWh_t@*Vt)>3e$Mw_vJdw58Yqd= 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

eAbGa5i~m`!7ThC~sx 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/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%0DTlEHqSBaql+QreWkLVBP6pV<4}h4ey<4Duzx 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 z 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%0A>@sky(h^daFPEF^>1g)r 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�uR3RjCkV8Zs}2rT;LjgqXa-BU4IBj0;4~g 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�lzIxFC6I)}@csxVP@WnwxXpBGB;$zI~?d8PXRR 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 z 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

`#k0M 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�xI2dEqumNNKkCB=|aUc*Vzbi>k+u0>lz8Vk= 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

VN@YcKIw8*t{Um5qKYmE2dCC&q?GauaVh+Li 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

;4$@I~Nm;7h=Vfz#L#MFc0Vk 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

uk_r7T4EirRI! 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 z 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%0DnqznC#9&V@jw`0pG3-ar2x$i)>!O>5c`q%m?aAZ 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 GvHt@_NxV}4 literal 0 HcmV?d00001 diff --git a/bin/subtree-split b/bin/subtree-split index c4caa3485..1d73a4e8c 100755 --- a/bin/subtree-split +++ b/bin/subtree-split @@ -10,7 +10,7 @@ function split() # split_new_repo $1 $2 - SHA1=`./bin/splitsh-lite --prefix=$1` + SHA1=`./bin/splitsh-lite-m1 --prefix=$1` git push $2 "$SHA1:refs/heads/$CURRENT_BRANCH" } @@ -32,7 +32,7 @@ function split_new_repo() git push origin master; ); - SHA1=`./bin/splitsh-lite --prefix=$1` + SHA1=`./bin/splitsh-lite-m1 --prefix=$1` git fetch $2 git push $2 "$SHA1:$CURRENT_BRANCH" -f } From 5b9fa5e38e8884c06c8b4201737450f7e76c2757 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 18 Mar 2023 14:11:06 +0200 Subject: [PATCH 1067/1142] Release 0.10.18. Upd changelog --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 111302e07..74758242a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Change Log +## [0.10.18](https://github.com/php-enqueue/enqueue-dev/tree/0.10.18) (2023-03-18) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.17...0.10.18) + +**Merged pull requests:** + +- Fix Shield URLs in READMEs [\#1289](https://github.com/php-enqueue/enqueue-dev/pull/1289) ([amayer5125](https://github.com/amayer5125)) +- Fix AWS SDK token parameter [\#1284](https://github.com/php-enqueue/enqueue-dev/pull/1284) ([andrewmy](https://github.com/andrewmy)) +- MongoDB - Add combined index [\#1283](https://github.com/php-enqueue/enqueue-dev/pull/1283) ([ddziaduch](https://github.com/ddziaduch)) +- Add setting subscription attributes to Sns and SnsQs [\#1281](https://github.com/php-enqueue/enqueue-dev/pull/1281) ([andrewmy](https://github.com/andrewmy)) +- code style fix \(native\_constant\_invocation\) [\#1276](https://github.com/php-enqueue/enqueue-dev/pull/1276) ([EmilMassey](https://github.com/EmilMassey)) +- \[amqp-lib\] Replace amqp-lib deprecated public property with getters [\#1273](https://github.com/php-enqueue/enqueue-dev/pull/1273) ([ramunasd](https://github.com/ramunasd)) +- fix: parenthesis missing allowed invalid delays [\#1266](https://github.com/php-enqueue/enqueue-dev/pull/1266) ([aldenw](https://github.com/aldenw)) +- Allow rdkafka falsy keys [\#1264](https://github.com/php-enqueue/enqueue-dev/pull/1264) ([qkdreyer](https://github.com/qkdreyer)) +- Symfony config allow null [\#1263](https://github.com/php-enqueue/enqueue-dev/pull/1263) ([h0raz](https://github.com/h0raz)) +- Ensure pass consumer tag as string to bunny amqp [\#1255](https://github.com/php-enqueue/enqueue-dev/pull/1255) ([snapshotpl](https://github.com/snapshotpl)) +- chore: Update dependency dbal [\#1253](https://github.com/php-enqueue/enqueue-dev/pull/1253) ([meidlinga](https://github.com/meidlinga)) + ## [0.10.17](https://github.com/php-enqueue/enqueue-dev/tree/0.10.17) (2022-05-17) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.16...0.10.17) From b9e68a043345b1c00437037e9f722188a413a843 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 17 Feb 2023 19:56:29 +0200 Subject: [PATCH 1068/1142] Add PHP 8.1 and Symfony 6.1 & .2 to CI --- .github/workflows/ci.yml | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 35e32c10f..8860c2e0d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M - - run: php ./bin/fix-symfony-version.php "5.2.*" + - run: php ./bin/fix-symfony-version.php "5.4.*" - uses: "ramsey/composer-install@v1" @@ -63,7 +63,7 @@ jobs: extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M - - run: php ./bin/fix-symfony-version.php "5.2.*" + - run: php ./bin/fix-symfony-version.php "5.4.*" - run: composer update --no-progress @@ -77,14 +77,20 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] - symfony_version: ['5.2.*', '6.0.*'] + php: ['7.4', '8.0', '8.1'] + symfony_version: ['5.4.*', '6.0.*', '6.1.*', '6.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: - - php: '7.3' - symfony_version: '6.0.*' - php: '7.4' symfony_version: '6.0.*' + - php: '7.4' + symfony_version: '6.1.*' + - php: '7.4' + symfony_version: '6.2.*' + - php: '8.0' + symfony_version: '6.1.*' + - php: '8.0' + symfony_version: '6.2.*' name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} @@ -123,15 +129,21 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.4', '8.0'] # same as in the container - symfony_version: ['5.2.*', '6.0.*'] + php: ['7.4', '8.0', '8.1'] # same as in the container + symfony_version: ['5.4.*', '6.0.*', '6.1.*', '6.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] rdkafka_action: ['exclude-group', 'group'] exclude: - - php: '7.3' - symfony_version: '6.0.*' - php: '7.4' symfony_version: '6.0.*' + - php: '7.4' + symfony_version: '6.1.*' + - php: '7.4' + symfony_version: '6.2.*' + - php: '8.0' + symfony_version: '6.1.*' + - php: '8.0' + symfony_version: '6.2.*' name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, rdkafka_action=${{ matrix.rdkafka_action }}, deps=${{ matrix.dependencies }} From 757eb4bd9b5d34127ccdc0353e43d5153a8d92e9 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 17 Feb 2023 20:13:03 +0200 Subject: [PATCH 1069/1142] Drop sf 6.0, remove 6.1 --- .github/workflows/ci.yml | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8860c2e0d..830840b76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,17 +78,11 @@ jobs: fail-fast: false matrix: php: ['7.4', '8.0', '8.1'] - symfony_version: ['5.4.*', '6.0.*', '6.1.*', '6.2.*'] + symfony_version: ['5.4.*', '6.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: - - php: '7.4' - symfony_version: '6.0.*' - - php: '7.4' - symfony_version: '6.1.*' - php: '7.4' symfony_version: '6.2.*' - - php: '8.0' - symfony_version: '6.1.*' - php: '8.0' symfony_version: '6.2.*' @@ -130,18 +124,12 @@ jobs: fail-fast: false matrix: php: ['7.4', '8.0', '8.1'] # same as in the container - symfony_version: ['5.4.*', '6.0.*', '6.1.*', '6.2.*'] + symfony_version: ['5.4.*', '6.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] rdkafka_action: ['exclude-group', 'group'] exclude: - - php: '7.4' - symfony_version: '6.0.*' - - php: '7.4' - symfony_version: '6.1.*' - php: '7.4' symfony_version: '6.2.*' - - php: '8.0' - symfony_version: '6.1.*' - php: '8.0' symfony_version: '6.2.*' From 716764a1e2b3ece1cfa71f1596273d5fbb03c8e3 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Sun, 19 Feb 2023 15:13:41 +0200 Subject: [PATCH 1070/1142] Properly drop old PHP and Symfony versions --- composer.json | 24 ++++++++++++------------ pkg/amqp-bunny/composer.json | 2 +- pkg/amqp-ext/composer.json | 2 +- pkg/amqp-lib/composer.json | 2 +- pkg/amqp-tools/composer.json | 2 +- pkg/async-command/composer.json | 18 +++++++++--------- pkg/async-event-dispatcher/composer.json | 16 ++++++++-------- pkg/dbal/composer.json | 2 +- pkg/dsn/composer.json | 2 +- pkg/enqueue-bundle/composer.json | 10 +++++----- pkg/enqueue/composer.json | 20 ++++++++++---------- pkg/fs/composer.json | 8 ++++---- pkg/gearman/composer.json | 2 +- pkg/gps/composer.json | 2 +- pkg/job-queue/composer.json | 10 +++++----- pkg/mongodb/composer.json | 2 +- pkg/monitoring/composer.json | 2 +- pkg/null/composer.json | 2 +- pkg/pheanstalk/composer.json | 2 +- pkg/rdkafka/composer.json | 2 +- pkg/redis/composer.json | 2 +- pkg/simple-client/composer.json | 6 +++--- pkg/sns/composer.json | 2 +- pkg/snsqs/composer.json | 2 +- pkg/sqs/composer.json | 2 +- pkg/stomp/composer.json | 2 +- pkg/wamp/composer.json | 2 +- 27 files changed, 75 insertions(+), 75 deletions(-) diff --git a/composer.json b/composer.json index b454f84fd..d2874af50 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "phpstan": "bin/phpstan analyse --memory-limit=512M -c phpstan.neon" }, "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "ext-amqp": "^1.9.3", "ext-gearman": "^2.0", @@ -53,17 +53,17 @@ "phpunit/phpunit": "^9.5", "phpstan/phpstan": "^0.12", "queue-interop/queue-spec": "^0.6.2", - "symfony/browser-kit": "^5.1|^6.0", - "symfony/config": "^5.1|^6.0", - "symfony/process": "^5.1|^6.0", - "symfony/console": "^5.1|^6.0", - "symfony/dependency-injection": "^5.1|^6.0", - "symfony/event-dispatcher": "^5.1|^6.0", - "symfony/expression-language": "^5.1|^6.0", - "symfony/http-kernel": "^5.1|^6.0", - "symfony/filesystem": "^5.1|^6.0", - "symfony/framework-bundle": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/framework-bundle": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 6efe7ee84..5bffcebd8 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "bunny/bunny": "^0.4|^0.5", diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 91c572a25..57fb5b20c 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "ext-amqp": "^1.9.3", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index 3f66bf7b3..dfb73a311 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "php-amqplib/php-amqplib": "^3.2", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index ccc282006..55f82f5d7 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10" diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 98b90ad83..48fd6f089 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -6,19 +6,19 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", - "symfony/console": "^5.1|^6.0", - "symfony/process": "^5.1|^6.0" + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/dependency-injection": "^5.1|^6.0", - "symfony/config": "^5.1|^6.0", - "symfony/http-kernel": "^5.1|^6.0", - "symfony/filesystem": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0", "enqueue/null": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/test": "0.10.x-dev" @@ -31,7 +31,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "suggest": { - "symfony/dependency-injection": "^5.1|^6.0 If you'd like to use async event dispatcher container extension." + "symfony/dependency-injection": "^5.4|^6.0 If you'd like to use async event dispatcher container extension." }, "autoload": { "psr-4": { "Enqueue\\AsyncCommand\\": "" }, diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index 3f124dc8f..a2cef0d79 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -6,18 +6,18 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", - "symfony/event-dispatcher": "^5.1|^6.0" + "symfony/event-dispatcher": "^5.4|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/dependency-injection": "^5.1|^6.0", - "symfony/config": "^5.1|^6.0", - "symfony/http-kernel": "^5.1|^6.0", - "symfony/filesystem": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0", "enqueue/null": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/test": "0.10.x-dev" @@ -30,7 +30,7 @@ "docs": "https://github.com/php-enqueue/enqueue-dev/blob/master/docs/index.md" }, "suggest": { - "symfony/dependency-injection": "^5.1|^6.0 If you'd like to use async event dispatcher container extension." + "symfony/dependency-injection": "^5.4|^6.0 If you'd like to use async event dispatcher container extension." }, "autoload": { "psr-4": { "Enqueue\\AsyncEventDispatcher\\": "" }, diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 950387387..0e05824c6 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.12|^3.1", "doctrine/persistence": "^1.3.3|^2.0", diff --git a/pkg/dsn/composer.json b/pkg/dsn/composer.json index 3cdac4c2d..94fb18a9f 100644 --- a/pkg/dsn/composer.json +++ b/pkg/dsn/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0" + "php": "^7.4|^8.0" }, "require-dev": { "phpunit/phpunit": "^9.5" diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index ab4ed1e4f..618b4ea7a 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", - "symfony/framework-bundle": "^5.1|^6.0", + "php": "^7.4|^8.0", + "symfony/framework-bundle": "^5.4|^6.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/enqueue": "^0.10", @@ -39,9 +39,9 @@ "doctrine/doctrine-bundle": "^2.0", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", - "symfony/browser-kit": "^5.1|^6.0", - "symfony/expression-language": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0" + "symfony/browser-kit": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "enqueue/async-command": "If want to run Symfony command via message queue", diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 0798bf44e..0da00ee4b 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/null": "^0.10", @@ -17,12 +17,12 @@ }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/console": "^5.1|^6.0", - "symfony/dependency-injection": "^5.1|^6.0", - "symfony/config": "^5.1|^6.0", - "symfony/event-dispatcher": "^5.1|^6.0", - "symfony/http-kernel": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0", + "symfony/console": "^5.41|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0", "enqueue/amqp-ext": "0.10.x-dev", "enqueue/amqp-lib": "0.10.x-dev", "enqueue/amqp-bunny": "0.10.x-dev", @@ -42,9 +42,9 @@ "enqueue/dsn": "0.10.x-dev" }, "suggest": { - "symfony/console": "^5.1|^6.0 If you want to use cli commands", - "symfony/dependency-injection": "^5.1|^6.0", - "symfony/config": "^5.1|^6.0", + "symfony/console": "^5.4|^6.0 If you want to use cli commands", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", "enqueue/amqp-ext": "AMQP transport (based on php extension)", "enqueue/stomp": "STOMP transport", "enqueue/fs": "Filesystem transport", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index e22929097..b44900541 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -6,10 +6,10 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "symfony/filesystem": "^5.1|^6.0", + "symfony/filesystem": "^5.4|^6.0", "makasim/temp-file": "^0.2@stable" }, "require-dev": { @@ -17,8 +17,8 @@ "enqueue/null": "0.10.x-dev", "enqueue/test": "0.10.x-dev", "queue-interop/queue-spec": "^0.6.2", - "symfony/dependency-injection": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0" + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index 4dfdb3781..eb06f62e3 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "ext-gearman": "^2.0", "queue-interop/queue-interop": "^0.8" }, diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 53445fe32..2da6b7468 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "google/cloud-pubsub": "^1.4.3", "enqueue/dsn": "^0.10" diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 1525c5c8e..5fafab868 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", @@ -17,10 +17,10 @@ "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", "doctrine/doctrine-bundle": "^2.0", - "symfony/browser-kit": "^5.1|^6.0", - "symfony/expression-language": "^5.1|^6.0", - "symfony/framework-bundle": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0" + "symfony/browser-kit": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/framework-bundle": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index 8089c1a4f..775452949 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -10,7 +10,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "mongodb/mongodb": "^1.2", "ext-mongodb": "^1.5" diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index ebc0b1c6e..e19da2fa9 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "enqueue/enqueue": "^0.10", "enqueue/dsn": "^0.10" }, diff --git a/pkg/null/composer.json b/pkg/null/composer.json index ab84dc36e..0f4ac4eeb 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8" }, "require-dev": { diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index bb019e2d9..8d920a4ff 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "pda/pheanstalk": "^3.1", "queue-interop/queue-interop": "^0.8" }, diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 2b5ec5541..068b9d204 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "ext-rdkafka": "^4.0|^5.0|^6.0", "queue-interop/queue-interop": "^0.8.1" }, diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 4fd68f139..4742b3385 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "ramsey/uuid": "^3.5|^4" diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index f12215eac..7cb07b6b3 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -6,11 +6,11 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "enqueue/enqueue": "^0.10", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", - "symfony/config": "^5.1|^6.0" + "symfony/config": "^5.4|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.5", @@ -18,7 +18,7 @@ "enqueue/amqp-ext": "0.10.x-dev", "enqueue/fs": "0.10.x-dev", "enqueue/null": "0.10.x-dev", - "symfony/yaml": "^5.1|^6.0" + "symfony/yaml": "^5.4|^6.0" }, "support": { "email": "opensource@forma-pro.com", diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index ef3cf6f87..297fac858 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "~3.155" diff --git a/pkg/snsqs/composer.json b/pkg/snsqs/composer.json index bf68aeb8d..27a4e038e 100644 --- a/pkg/snsqs/composer.json +++ b/pkg/snsqs/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "enqueue/sns": "^0.10", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index 2b2473927..d48b89015 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "~3.155" diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 383ce6fe9..461205852 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "enqueue/dsn": "^0.10", "stomp-php/stomp-php": "^4.5|^5.0", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index 89bdbf315..be0321c6f 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8.1", "enqueue/dsn": "^0.10.8", "thruway/client": "^0.5.5", From beacd0ac72b3d01d5b6dfda644bf03bae97a3105 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 20 Mar 2023 14:34:29 +0200 Subject: [PATCH 1071/1142] Install the mongodb extension again? --- docker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index b1e0d8b03..381d40b0d 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -22,6 +22,7 @@ RUN set -x && \ php${PHP_VERSION}-xml \ php${PHP_VERSION}-mysql \ php${PHP_VERSION}-curl \ + php${PHP_VERSION}-mongodb \ make \ g++ \ unzip \ From 8f4520b7a2fe7cb607e99c1965b806ff8cfd340a Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 20 Mar 2023 14:56:25 +0200 Subject: [PATCH 1072/1142] Install the mbstring extension --- docker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 381d40b0d..4c288b041 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -23,6 +23,7 @@ RUN set -x && \ php${PHP_VERSION}-mysql \ php${PHP_VERSION}-curl \ php${PHP_VERSION}-mongodb \ + php${PHP_VERSION}-mbstring \ make \ g++ \ unzip \ From 4a140981e51dd80cd29e0939ee158f2d27647ca9 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 20 Mar 2023 16:38:26 +0200 Subject: [PATCH 1073/1142] Remove special group for rdkafka tests --- pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php | 3 --- pkg/rdkafka/Tests/JsonSerializerTest.php | 3 --- pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php | 3 --- pkg/rdkafka/Tests/RdKafkaConsumerTest.php | 3 --- pkg/rdkafka/Tests/RdKafkaContextTest.php | 3 --- pkg/rdkafka/Tests/RdKafkaMessageTest.php | 3 --- pkg/rdkafka/Tests/RdKafkaProducerTest.php | 3 --- pkg/rdkafka/Tests/RdKafkaTopicTest.php | 3 --- pkg/rdkafka/Tests/Spec/RdKafkaConnectionFactoryTest.php | 3 --- pkg/rdkafka/Tests/Spec/RdKafkaContextTest.php | 3 --- pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php | 3 --- pkg/rdkafka/Tests/Spec/RdKafkaQueueTest.php | 3 --- .../Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php | 1 - pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php | 3 --- 14 files changed, 40 deletions(-) diff --git a/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php index 659590ba3..3b92042dd 100644 --- a/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php @@ -19,9 +19,6 @@ use Interop\Queue\Queue as InteropQueue; use PHPUnit\Framework\TestCase; -/** - * @group rdkafka - */ class RdKafkaDriverTest extends TestCase { use ClassExtensionTrait; diff --git a/pkg/rdkafka/Tests/JsonSerializerTest.php b/pkg/rdkafka/Tests/JsonSerializerTest.php index 84f09a698..d4db377d3 100644 --- a/pkg/rdkafka/Tests/JsonSerializerTest.php +++ b/pkg/rdkafka/Tests/JsonSerializerTest.php @@ -8,9 +8,6 @@ use Enqueue\Test\ClassExtensionTrait; use PHPUnit\Framework\TestCase; -/** - * @group rdkafka - */ class JsonSerializerTest extends TestCase { use ClassExtensionTrait; diff --git a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php index 8af3e8501..62ccc7612 100644 --- a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php @@ -6,9 +6,6 @@ use Enqueue\Test\ReadAttributeTrait; use PHPUnit\Framework\TestCase; -/** - * @group rdkafka - */ class RdKafkaConnectionFactoryTest extends TestCase { use ReadAttributeTrait; diff --git a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php index b40916c15..627831982 100644 --- a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php @@ -11,9 +11,6 @@ use RdKafka\KafkaConsumer; use RdKafka\Message; -/** - * @group rdkafka - */ class RdKafkaConsumerTest extends TestCase { public function testCouldBeConstructedWithRequiredArguments() diff --git a/pkg/rdkafka/Tests/RdKafkaContextTest.php b/pkg/rdkafka/Tests/RdKafkaContextTest.php index 227eea792..dc1b597de 100644 --- a/pkg/rdkafka/Tests/RdKafkaContextTest.php +++ b/pkg/rdkafka/Tests/RdKafkaContextTest.php @@ -10,9 +10,6 @@ use Interop\Queue\Exception\TemporaryQueueNotSupportedException; use PHPUnit\Framework\TestCase; -/** - * @group rdkafka - */ class RdKafkaContextTest extends TestCase { public function testThrowNotImplementedOnCreateTemporaryQueue() diff --git a/pkg/rdkafka/Tests/RdKafkaMessageTest.php b/pkg/rdkafka/Tests/RdKafkaMessageTest.php index c2e5c224a..9bcc34642 100644 --- a/pkg/rdkafka/Tests/RdKafkaMessageTest.php +++ b/pkg/rdkafka/Tests/RdKafkaMessageTest.php @@ -6,9 +6,6 @@ use PHPUnit\Framework\TestCase; use RdKafka\Message; -/** - * @group rdkafka - */ class RdKafkaMessageTest extends TestCase { public function testCouldSetGetPartition() diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index 512cc9f5a..eec4b364e 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -15,9 +15,6 @@ use RdKafka\ProducerTopic; use RdKafka\TopicConf; -/** - * @group rdkafka - */ class RdKafkaProducerTest extends TestCase { public function testCouldBeConstructedWithKafkaProducerAndSerializerAsArguments() diff --git a/pkg/rdkafka/Tests/RdKafkaTopicTest.php b/pkg/rdkafka/Tests/RdKafkaTopicTest.php index 5ed22885a..d0bc8cc13 100644 --- a/pkg/rdkafka/Tests/RdKafkaTopicTest.php +++ b/pkg/rdkafka/Tests/RdKafkaTopicTest.php @@ -6,9 +6,6 @@ use PHPUnit\Framework\TestCase; use RdKafka\TopicConf; -/** - * @group rdkafka - */ class RdKafkaTopicTest extends TestCase { public function testCouldSetGetPartition() diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaConnectionFactoryTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaConnectionFactoryTest.php index 3327c952d..a582aadca 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaConnectionFactoryTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaConnectionFactoryTest.php @@ -5,9 +5,6 @@ use Enqueue\RdKafka\RdKafkaConnectionFactory; use Interop\Queue\Spec\ConnectionFactorySpec; -/** - * @group rdkafka - */ class RdKafkaConnectionFactoryTest extends ConnectionFactorySpec { protected function createConnectionFactory() diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaContextTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaContextTest.php index fe9625677..d049ca74f 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaContextTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaContextTest.php @@ -5,9 +5,6 @@ use Enqueue\RdKafka\RdKafkaContext; use Interop\Queue\Spec\ContextSpec; -/** - * @group rdkafka - */ class RdKafkaContextTest extends ContextSpec { protected function createContext() diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php index a29780b0f..df54fa58b 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php @@ -5,9 +5,6 @@ use Enqueue\RdKafka\RdKafkaMessage; use Interop\Queue\Spec\MessageSpec; -/** - * @group rdkafka - */ class RdKafkaMessageTest extends MessageSpec { /** diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaQueueTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaQueueTest.php index 93bc7ac14..863f3e3c5 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaQueueTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaQueueTest.php @@ -5,9 +5,6 @@ use Enqueue\RdKafka\RdKafkaTopic; use Interop\Queue\Spec\QueueSpec; -/** - * @group rdkafka - */ class RdKafkaQueueTest extends QueueSpec { protected function createQueue() diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php index d756f23e2..afe344ae1 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php @@ -7,7 +7,6 @@ use Interop\Queue\Spec\SendToAndReceiveFromTopicSpec; /** - * @group rdkafka * @group functional * @retry 5 */ diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php index 26aacc78d..c5d43ee61 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php @@ -5,9 +5,6 @@ use Enqueue\RdKafka\RdKafkaTopic; use Interop\Queue\Spec\TopicSpec; -/** - * @group rdkafka - */ class RdKafkaTopicTest extends TopicSpec { /** From 8403eb4bcded283612b8111f0dd8e0ab58c0cb1f Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 20 Mar 2023 16:38:41 +0200 Subject: [PATCH 1074/1142] Skip Gearman tests on PHP 8.1 --- .github/workflows/ci.yml | 8 +++++++- pkg/gearman/Tests/GearmanContextTest.php | 1 + pkg/gearman/Tests/Spec/GearmanContextTest.php | 1 + .../Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php | 1 + .../Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php | 1 + .../Spec/GearmanSendToTopicAndReceiveFromQueueTest.php | 1 + .../GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php | 1 + 7 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 830840b76..a7ea3c0bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -167,4 +167,10 @@ jobs: env: PHP_VERSION: ${{ matrix.php }} - - run: bin/test.sh --${{ matrix.rdkafka_action }}=rdkafka + # TODO: convert these two steps into one w/o excludes when Gearman extension gets a release for PHP 8.1 + # See https://github.com/php/pecl-networking-gearman/issues/16 + - run: bin/test.sh + if: ${{ matrix.php }} != '8.1' + + - run: bin/test.sh --exclude-group=gearman + if: ${{ matrix.php }} == '8.1' diff --git a/pkg/gearman/Tests/GearmanContextTest.php b/pkg/gearman/Tests/GearmanContextTest.php index 484ab00a0..f2b70d11b 100644 --- a/pkg/gearman/Tests/GearmanContextTest.php +++ b/pkg/gearman/Tests/GearmanContextTest.php @@ -12,6 +12,7 @@ /** * @group functional + * @group gearman */ class GearmanContextTest extends TestCase { diff --git a/pkg/gearman/Tests/Spec/GearmanContextTest.php b/pkg/gearman/Tests/Spec/GearmanContextTest.php index 431465cc5..7bfeee374 100644 --- a/pkg/gearman/Tests/Spec/GearmanContextTest.php +++ b/pkg/gearman/Tests/Spec/GearmanContextTest.php @@ -7,6 +7,7 @@ /** * @group functional + * @group gearman */ class GearmanContextTest extends ContextSpec { diff --git a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php index 80b13f8df..11bbf730d 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php @@ -9,6 +9,7 @@ /** * @group functional + * @group gearman */ class GearmanSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { diff --git a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php index 590b8ede5..86ce5b189 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php @@ -8,6 +8,7 @@ /** * @group functional + * @group gearman */ class GearmanSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { diff --git a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php index 4d53934ff..c3f470528 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php @@ -8,6 +8,7 @@ /** * @group functional + * @group gearman */ class GearmanSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFromQueueSpec { diff --git a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php index 26e6f79a4..25c3596a1 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -8,6 +8,7 @@ /** * @group functional + * @group gearman */ class GearmanSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveNoWaitFromQueueSpec { From 28292de937bc85c0fa55df78ab310a15709631c5 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 20 Mar 2023 16:49:00 +0200 Subject: [PATCH 1075/1142] Fix CS --- pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php | 3 --- .../Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php | 3 +-- pkg/rdkafka/Tests/JsonSerializerTest.php | 2 +- pkg/rdkafka/Tests/RdKafkaConsumerTest.php | 4 ++-- pkg/rdkafka/Tests/RdKafkaProducerTest.php | 2 +- .../Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php | 1 + 6 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php b/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php index 3b92042dd..c5e40e71d 100644 --- a/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php +++ b/pkg/enqueue/Tests/Client/Driver/RdKafkaDriverTest.php @@ -99,9 +99,6 @@ protected function createQueue(string $name): InteropQueue return new RdKafkaTopic($name); } - /** - * @return RdKafkaTopic - */ protected function createTopic(string $name): RdKafkaTopic { return new RdKafkaTopic($name); diff --git a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php index 11bbf730d..47bf182c2 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php @@ -24,8 +24,7 @@ protected function createContext() } /** - * @param Context $context - * @param string $queueName + * @param string $queueName * * @return Queue */ diff --git a/pkg/rdkafka/Tests/JsonSerializerTest.php b/pkg/rdkafka/Tests/JsonSerializerTest.php index d4db377d3..d10479def 100644 --- a/pkg/rdkafka/Tests/JsonSerializerTest.php +++ b/pkg/rdkafka/Tests/JsonSerializerTest.php @@ -39,7 +39,7 @@ public function testThrowIfFailedToEncodeMessageToJson() $resource = fopen(__FILE__, 'r'); - //guard + // guard $this->assertIsResource($resource); $message = new RdKafkaMessage('theBody', ['aProp' => $resource]); diff --git a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php index 627831982..4f2b806c6 100644 --- a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php @@ -195,7 +195,7 @@ public function testShouldReceiveFromQueueAndReturnMessageIfMessageInQueue() { $destination = new RdKafkaTopic('dest'); - $expectedMessage = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); + $expectedMessage = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); $kafkaMessage = new Message(); $kafkaMessage->err = RD_KAFKA_RESP_ERR_NO_ERROR; @@ -260,7 +260,7 @@ public function testShouldAllowGetPreviouslySetSerializer() $expectedSerializer = $this->createSerializerMock(); - //guard + // guard $this->assertNotSame($consumer->getSerializer(), $expectedSerializer); $consumer->setSerializer($expectedSerializer); diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index eec4b364e..ecfa4c6fc 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -169,7 +169,7 @@ public function testShouldAllowGetPreviouslySetSerializer() $expectedSerializer = $this->createSerializerMock(); - //guard + // guard $this->assertNotSame($producer->getSerializer(), $expectedSerializer); $producer->setSerializer($expectedSerializer); diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php index afe344ae1..9a969d420 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaSendToAndReceiveFromTopicTest.php @@ -8,6 +8,7 @@ /** * @group functional + * * @retry 5 */ class RdKafkaSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec From 80cb92aa3eaceb8693b2bbbe12da72c245e6b039 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 20 Mar 2023 16:59:18 +0200 Subject: [PATCH 1076/1142] Remove rdkafka group from CI matrix --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a7ea3c0bb..3a324886a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -126,14 +126,13 @@ jobs: php: ['7.4', '8.0', '8.1'] # same as in the container symfony_version: ['5.4.*', '6.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] - rdkafka_action: ['exclude-group', 'group'] exclude: - php: '7.4' symfony_version: '6.2.*' - php: '8.0' symfony_version: '6.2.*' - name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, rdkafka_action=${{ matrix.rdkafka_action }}, deps=${{ matrix.dependencies }} + name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} steps: - uses: actions/checkout@v2 From 0b6dff350eb121b0f801034a81494993228b743c Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 20 Mar 2023 17:41:04 +0200 Subject: [PATCH 1077/1142] Fix gearman skipping expressions --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a324886a..af5814ffb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -169,7 +169,7 @@ jobs: # TODO: convert these two steps into one w/o excludes when Gearman extension gets a release for PHP 8.1 # See https://github.com/php/pecl-networking-gearman/issues/16 - run: bin/test.sh - if: ${{ matrix.php }} != '8.1' + if: ${{ matrix.php != '8.1' }} - run: bin/test.sh --exclude-group=gearman - if: ${{ matrix.php }} == '8.1' + if: ${{ matrix.php == '8.1' }} From 37be56508bbcd8db5e16dfe5868291adc5347299 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 21 Mar 2023 12:35:53 +0200 Subject: [PATCH 1078/1142] Bump doctrine packages --- composer.json | 7 ++++--- pkg/dbal/composer.json | 2 +- pkg/enqueue-bundle/composer.json | 2 +- pkg/job-queue/composer.json | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index d2874af50..119908e4f 100644 --- a/composer.json +++ b/composer.json @@ -26,8 +26,8 @@ "psr/container": "^1.1 || ^2.0", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^1.4.3", - "doctrine/orm": "^2.7.4", - "doctrine/persistence": "^1.3.3|^2.0", + "doctrine/orm": "^2.10", + "doctrine/persistence": "^2.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3.1", "aws/aws-sdk-php": "^3.155", @@ -65,7 +65,7 @@ "symfony/framework-bundle": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0", "empi89/php-amqp-stubs": "*@dev", - "doctrine/doctrine-bundle": "^2.0", + "doctrine/doctrine-bundle": "^2.3.2", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^2.0.3", @@ -136,3 +136,4 @@ } } } + diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index 0e05824c6..cf7bfb97a 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -9,7 +9,7 @@ "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.12|^3.1", - "doctrine/persistence": "^1.3.3|^2.0", + "doctrine/persistence": "^2.0", "ramsey/uuid": "^3.5|^4" }, "require-dev": { diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 618b4ea7a..2af8a0f7c 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -36,7 +36,7 @@ "enqueue/async-event-dispatcher": "0.10.x-dev", "enqueue/async-command": "0.10.x-dev", "php-amqplib/php-amqplib": "^3.0", - "doctrine/doctrine-bundle": "^2.0", + "doctrine/doctrine-bundle": "^2.3.2", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", "symfony/browser-kit": "^5.4|^6.0", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 5fafab868..4856a0e24 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -10,13 +10,13 @@ "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", - "doctrine/orm": "~2.7.4 | ^2.8", + "doctrine/orm": "^2.10", "doctrine/dbal": "^2.12 | ^3.0" }, "require-dev": { "phpunit/phpunit": "^9.5", "enqueue/test": "0.10.x-dev", - "doctrine/doctrine-bundle": "^2.0", + "doctrine/doctrine-bundle": "^2.3.2", "symfony/browser-kit": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/framework-bundle": "^5.4|^6.0", From 322d0fe4f7a2ec8050ddd26785b56b8c6aff9a88 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 21 Mar 2023 13:30:52 +0200 Subject: [PATCH 1079/1142] Require symfony/validator in the bundle tests --- composer.json | 1 + pkg/enqueue-bundle/composer.json | 1 + 2 files changed, 2 insertions(+) diff --git a/composer.json b/composer.json index 119908e4f..5c346cd5e 100644 --- a/composer.json +++ b/composer.json @@ -63,6 +63,7 @@ "symfony/http-kernel": "^5.4|^6.0", "symfony/filesystem": "^5.4|^6.0", "symfony/framework-bundle": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "^2.3.2", diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 2af8a0f7c..7ee50c269 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -41,6 +41,7 @@ "alcaeus/mongo-php-adapter": "^1.0", "symfony/browser-kit": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, "suggest": { From 178ebda8b649d408d5cd6573e85e2b70b6c87d54 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 21 Mar 2023 14:12:14 +0200 Subject: [PATCH 1080/1142] Try removing the locale_aware_listener from bundle test fixture app --- pkg/enqueue-bundle/Tests/Functional/App/config/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml index 0a33b27a7..d3ca2a37f 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml +++ b/pkg/enqueue-bundle/Tests/Functional/App/config/config.yml @@ -126,6 +126,3 @@ services: class: 'Enqueue\Bundle\Tests\Functional\App\AsyncListener' public: true arguments: ['@enqueue.client.default.producer', '@enqueue.events.registry'] - - locale_aware_listener: - public: true From 428e8785459355582146c8b85ccf5b4f5ce5d4bc Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Tue, 21 Mar 2023 17:12:07 +0200 Subject: [PATCH 1081/1142] Bump orm to one depending on lexer working correctly on PHP 8.1 --- composer.json | 2 +- pkg/job-queue/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 5c346cd5e..b6f0be530 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "psr/container": "^1.1 || ^2.0", "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^1.4.3", - "doctrine/orm": "^2.10", + "doctrine/orm": "^2.12", "doctrine/persistence": "^2.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3.1", diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 4856a0e24..55d37d5da 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -10,7 +10,7 @@ "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", - "doctrine/orm": "^2.10", + "doctrine/orm": "^2.12", "doctrine/dbal": "^2.12 | ^3.0" }, "require-dev": { From 66e161fbef60289ed3b5bf1a6fedde3cbf10ed71 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Fri, 17 Feb 2023 20:28:49 +0200 Subject: [PATCH 1082/1142] Add PHP 8.2, skip gearman too --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index af5814ffb..d3319ca9e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,7 +77,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.4', '8.0', '8.1'] + php: ['7.4', '8.0', '8.1', '8.2'] symfony_version: ['5.4.*', '6.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: @@ -123,7 +123,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.4', '8.0', '8.1'] # same as in the container + php: ['7.4', '8.0', '8.1', '8.2'] # same as in the container symfony_version: ['5.4.*', '6.2.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: @@ -169,7 +169,7 @@ jobs: # TODO: convert these two steps into one w/o excludes when Gearman extension gets a release for PHP 8.1 # See https://github.com/php/pecl-networking-gearman/issues/16 - run: bin/test.sh - if: ${{ matrix.php != '8.1' }} + if: ${{ matrix.php != '8.1' && matrix.php != '8.2' }} - run: bin/test.sh --exclude-group=gearman - if: ${{ matrix.php == '8.1' }} + if: ${{ matrix.php == '8.1' && matrix.php != '8.2' }} From 0c6ff18483afd2fecf8cc66bcf989c0333ecb9e7 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 23 Mar 2023 10:50:55 +0100 Subject: [PATCH 1083/1142] Update and fix pkg test with 8.1 and 8.2 PHP support --- pkg/amqp-bunny/.github/workflows/ci.yml | 2 +- pkg/amqp-ext/.github/workflows/ci.yml | 2 +- pkg/amqp-lib/.github/workflows/ci.yml | 2 +- pkg/amqp-tools/.github/workflows/ci.yml | 2 +- pkg/async-command/.github/workflows/ci.yml | 2 +- pkg/async-event-dispatcher/.github/workflows/ci.yml | 2 +- pkg/dbal/.github/workflows/ci.yml | 2 +- pkg/dsn/.github/workflows/ci.yml | 2 +- pkg/enqueue-bundle/.github/workflows/ci.yml | 2 +- pkg/enqueue/.github/workflows/ci.yml | 2 +- pkg/fs/.github/workflows/ci.yml | 2 +- pkg/gearman/.github/workflows/ci.yml | 2 +- pkg/gps/.github/workflows/ci.yml | 4 ++-- pkg/job-queue/.github/workflows/ci.yml | 4 ++-- pkg/mongodb/.github/workflows/ci.yml | 4 ++-- pkg/monitoring/.github/workflows/ci.yml | 4 ++-- pkg/null/.github/workflows/ci.yml | 2 +- pkg/pheanstalk/.github/workflows/ci.yml | 4 ++-- pkg/rdkafka/.github/workflows/ci.yml | 2 +- pkg/redis/.github/workflows/ci.yml | 4 ++-- pkg/simple-client/.github/workflows/ci.yml | 4 ++-- pkg/sns/.github/workflows/ci.yml | 4 ++-- pkg/snsqs/.github/workflows/ci.yml | 4 ++-- pkg/sqs/.github/workflows/ci.yml | 4 ++-- pkg/stomp/.github/workflows/ci.yml | 2 +- pkg/wamp/.github/workflows/ci.yml | 4 ++-- 26 files changed, 37 insertions(+), 37 deletions(-) diff --git a/pkg/amqp-bunny/.github/workflows/ci.yml b/pkg/amqp-bunny/.github/workflows/ci.yml index 67837ef97..5448d7b1a 100644 --- a/pkg/amqp-bunny/.github/workflows/ci.yml +++ b/pkg/amqp-bunny/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/amqp-ext/.github/workflows/ci.yml b/pkg/amqp-ext/.github/workflows/ci.yml index fd96b2abe..d48deb0af 100644 --- a/pkg/amqp-ext/.github/workflows/ci.yml +++ b/pkg/amqp-ext/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/amqp-lib/.github/workflows/ci.yml b/pkg/amqp-lib/.github/workflows/ci.yml index a168dca05..0492424e8 100644 --- a/pkg/amqp-lib/.github/workflows/ci.yml +++ b/pkg/amqp-lib/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/amqp-tools/.github/workflows/ci.yml b/pkg/amqp-tools/.github/workflows/ci.yml index 67837ef97..5448d7b1a 100644 --- a/pkg/amqp-tools/.github/workflows/ci.yml +++ b/pkg/amqp-tools/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/async-command/.github/workflows/ci.yml b/pkg/async-command/.github/workflows/ci.yml index a168dca05..0492424e8 100644 --- a/pkg/async-command/.github/workflows/ci.yml +++ b/pkg/async-command/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/async-event-dispatcher/.github/workflows/ci.yml b/pkg/async-event-dispatcher/.github/workflows/ci.yml index a168dca05..0492424e8 100644 --- a/pkg/async-event-dispatcher/.github/workflows/ci.yml +++ b/pkg/async-event-dispatcher/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/dbal/.github/workflows/ci.yml b/pkg/dbal/.github/workflows/ci.yml index a168dca05..0492424e8 100644 --- a/pkg/dbal/.github/workflows/ci.yml +++ b/pkg/dbal/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/dsn/.github/workflows/ci.yml b/pkg/dsn/.github/workflows/ci.yml index b23e42104..71bcbbd61 100644 --- a/pkg/dsn/.github/workflows/ci.yml +++ b/pkg/dsn/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/enqueue-bundle/.github/workflows/ci.yml b/pkg/enqueue-bundle/.github/workflows/ci.yml index 0185cad38..4c397bef1 100644 --- a/pkg/enqueue-bundle/.github/workflows/ci.yml +++ b/pkg/enqueue-bundle/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/enqueue/.github/workflows/ci.yml b/pkg/enqueue/.github/workflows/ci.yml index b39495855..28a46e908 100644 --- a/pkg/enqueue/.github/workflows/ci.yml +++ b/pkg/enqueue/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/fs/.github/workflows/ci.yml b/pkg/fs/.github/workflows/ci.yml index 2a2fabfb7..65cfbbb2d 100644 --- a/pkg/fs/.github/workflows/ci.yml +++ b/pkg/fs/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/gearman/.github/workflows/ci.yml b/pkg/gearman/.github/workflows/ci.yml index 401aab590..28ae81b0f 100644 --- a/pkg/gearman/.github/workflows/ci.yml +++ b/pkg/gearman/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/gps/.github/workflows/ci.yml b/pkg/gps/.github/workflows/ci.yml index fd2ae7f2d..0492424e8 100644 --- a/pkg/gps/.github/workflows/ci.yml +++ b/pkg/gps/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -26,4 +26,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/job-queue/.github/workflows/ci.yml b/pkg/job-queue/.github/workflows/ci.yml index 2df5ff80c..28a9a9c02 100644 --- a/pkg/job-queue/.github/workflows/ci.yml +++ b/pkg/job-queue/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -26,4 +26,4 @@ jobs: with: composer-options: "--prefer-dist" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/mongodb/.github/workflows/ci.yml b/pkg/mongodb/.github/workflows/ci.yml index 7a2a6f365..415baf634 100644 --- a/pkg/mongodb/.github/workflows/ci.yml +++ b/pkg/mongodb/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -27,4 +27,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/monitoring/.github/workflows/ci.yml b/pkg/monitoring/.github/workflows/ci.yml index 237a49da1..5448d7b1a 100644 --- a/pkg/monitoring/.github/workflows/ci.yml +++ b/pkg/monitoring/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -24,4 +24,4 @@ jobs: - uses: "ramsey/composer-install@v1" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/null/.github/workflows/ci.yml b/pkg/null/.github/workflows/ci.yml index a168dca05..0492424e8 100644 --- a/pkg/null/.github/workflows/ci.yml +++ b/pkg/null/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/pheanstalk/.github/workflows/ci.yml b/pkg/pheanstalk/.github/workflows/ci.yml index fd2ae7f2d..0492424e8 100644 --- a/pkg/pheanstalk/.github/workflows/ci.yml +++ b/pkg/pheanstalk/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -26,4 +26,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/rdkafka/.github/workflows/ci.yml b/pkg/rdkafka/.github/workflows/ci.yml index 58f56b0a3..9e0ceb121 100644 --- a/pkg/rdkafka/.github/workflows/ci.yml +++ b/pkg/rdkafka/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/redis/.github/workflows/ci.yml b/pkg/redis/.github/workflows/ci.yml index 5dc982ea7..57d501bee 100644 --- a/pkg/redis/.github/workflows/ci.yml +++ b/pkg/redis/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -27,4 +27,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/simple-client/.github/workflows/ci.yml b/pkg/simple-client/.github/workflows/ci.yml index 7fcc096a9..6b24b0f30 100644 --- a/pkg/simple-client/.github/workflows/ci.yml +++ b/pkg/simple-client/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -28,4 +28,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/sns/.github/workflows/ci.yml b/pkg/sns/.github/workflows/ci.yml index fd2ae7f2d..0492424e8 100644 --- a/pkg/sns/.github/workflows/ci.yml +++ b/pkg/sns/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -26,4 +26,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/snsqs/.github/workflows/ci.yml b/pkg/snsqs/.github/workflows/ci.yml index fd2ae7f2d..0492424e8 100644 --- a/pkg/snsqs/.github/workflows/ci.yml +++ b/pkg/snsqs/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -26,4 +26,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/sqs/.github/workflows/ci.yml b/pkg/sqs/.github/workflows/ci.yml index fd2ae7f2d..0492424e8 100644 --- a/pkg/sqs/.github/workflows/ci.yml +++ b/pkg/sqs/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -26,4 +26,4 @@ jobs: with: composer-options: "--prefer-source" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional diff --git a/pkg/stomp/.github/workflows/ci.yml b/pkg/stomp/.github/workflows/ci.yml index a168dca05..0492424e8 100644 --- a/pkg/stomp/.github/workflows/ci.yml +++ b/pkg/stomp/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests diff --git a/pkg/wamp/.github/workflows/ci.yml b/pkg/wamp/.github/workflows/ci.yml index 237a49da1..5448d7b1a 100644 --- a/pkg/wamp/.github/workflows/ci.yml +++ b/pkg/wamp/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.3', '7.4', '8.0'] + php: ['7.4', '8.0', '8.1', '8.2'] name: PHP ${{ matrix.php }} tests @@ -24,4 +24,4 @@ jobs: - uses: "ramsey/composer-install@v1" - - run: vendor/bin/phpunit --exlude-group=functional + - run: vendor/bin/phpunit --exclude-group=functional From 662ec8324e691ba51ef740d7272cbff60b9bc988 Mon Sep 17 00:00:00 2001 From: Honza Novak Date: Wed, 29 Mar 2023 13:30:49 +0200 Subject: [PATCH 1084/1142] Replaced from json_array to json due to Doctrine Dbal 3.0 --- pkg/job-queue/Doctrine/mapping/Job.orm.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/job-queue/Doctrine/mapping/Job.orm.xml b/pkg/job-queue/Doctrine/mapping/Job.orm.xml index e6fcbdde5..d6f481562 100644 --- a/pkg/job-queue/Doctrine/mapping/Job.orm.xml +++ b/pkg/job-queue/Doctrine/mapping/Job.orm.xml @@ -12,7 +12,7 @@ - + From 9d39fdc6ee4eb7217f01c6fcdc9db310bac75c84 Mon Sep 17 00:00:00 2001 From: alexanderonatskiy Date: Mon, 3 Apr 2023 20:18:34 +0200 Subject: [PATCH 1085/1142] renamed test --- pkg/snsqs/Tests/SnsQsProducerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index 17ea339ec..aa3e28971 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -165,7 +165,7 @@ public function testShouldSendSqsMessageToSqsProducer() $producer->send($destination, new SnsQsMessage()); } - public function testShouldSendToSqsMessageWithGroupIdAndDeduplicationId() + public function testShouldSendToSqsProducerMessageWithGroupIdAndDeduplicationId() { $sqsMock = $this->createSqsContextMock(); $sqsMock->method('createMessage')->willReturn(new SqsMessage()); From c63642e16c2526f71dc81e0d65a99a5b5c69bc1c Mon Sep 17 00:00:00 2001 From: Sebastian Plagemann Date: Thu, 13 Apr 2023 14:29:07 +0200 Subject: [PATCH 1086/1142] Add support for rediss and phpredis --- pkg/redis/PhpRedis.php | 6 ++-- .../RedisConnectionFactoryConfigTest.php | 32 +++++++++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/pkg/redis/PhpRedis.php b/pkg/redis/PhpRedis.php index 241677f68..d6f5baffa 100644 --- a/pkg/redis/PhpRedis.php +++ b/pkg/redis/PhpRedis.php @@ -94,7 +94,7 @@ public function connect(): void return; } - $supportedSchemes = ['redis', 'tcp', 'unix']; + $supportedSchemes = ['redis', 'rediss', 'tcp', 'unix']; if (false == in_array($this->config['scheme'], $supportedSchemes, true)) { throw new \LogicException(sprintf( 'The given scheme protocol "%s" is not supported by php extension. It must be one of "%s"', @@ -107,9 +107,11 @@ public function connect(): void $connectionMethod = $this->config['persistent'] ? 'pconnect' : 'connect'; + $host = $this->config['scheme'] === 'rediss' ? 'tls://' . $this->config['host'] : $this->config['host']; + $result = call_user_func( [$this->redis, $connectionMethod], - 'unix' === $this->config['scheme'] ? $this->config['path'] : $this->config['host'], + 'unix' === $this->config['scheme'] ? $this->config['path'] : $host, $this->config['port'], $this->config['timeout'], $this->config['persistent'] ? ($this->config['phpredis_persistent_id'] ?? null) : null, diff --git a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php index 13eba9589..065d6f971 100644 --- a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php +++ b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php @@ -51,15 +51,6 @@ public function testCouldBeCreatedWithRedisInstance() $this->assertSame($redisMock, $context->getRedis()); } - public function testThrowIfRedissConnectionUsedWithPhpRedisExtension() - { - $factory = new RedisConnectionFactory('rediss+phpredis:?lazy=0'); - - $this->expectException(\LogicException::class); - $this->expectExceptionMessage('The given scheme protocol "rediss" is not supported by php extension. It must be one of "redis", "tcp", "unix"'); - $factory->createContext(); - } - /** * @dataProvider provideConfigs * @@ -273,6 +264,29 @@ public static function provideConfigs() ], ]; + //check tls connection for predis library + yield [ + 'rediss+phpredis://localhost:1234?foo=bar&async=1', + [ + 'host' => 'tls://localhost', + 'scheme' => 'rediss', + 'port' => 1234, + 'timeout' => 5., + 'database' => null, + 'password' => null, + 'scheme_extensions' => ['phpredis'], + 'path' => null, + 'async' => true, + 'persistent' => false, + 'lazy' => true, + 'read_write_timeout' => null, + 'predis_options' => null, + 'ssl' => null, + 'foo' => 'bar', + 'redelivery_delay' => 300, + ], + ]; + yield [ ['host' => 'localhost', 'port' => 1234, 'foo' => 'bar'], [ From 66ed6d5523298aa1eb0b6c85099e389c32968512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Lenczewski?= Date: Thu, 4 May 2023 17:48:18 +0200 Subject: [PATCH 1087/1142] Allow doctrine/persistence 3.1 version --- pkg/dbal/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index cf7bfb97a..a4dfa5e1a 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -9,7 +9,7 @@ "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.12|^3.1", - "doctrine/persistence": "^2.0", + "doctrine/persistence": "^2.0|^3.1", "ramsey/uuid": "^3.5|^4" }, "require-dev": { From e59ba58dc299a80eda705c0af84b7a75527bf0a5 Mon Sep 17 00:00:00 2001 From: jlabedo Date: Sun, 5 Mar 2023 12:43:04 +0000 Subject: [PATCH 1088/1142] Update doctrine/persistence --- composer.json | 2 +- pkg/dbal/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index b6f0be530..4e80fe7b0 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,7 @@ "makasim/temp-file": "^0.2", "google/cloud-pubsub": "^1.4.3", "doctrine/orm": "^2.12", - "doctrine/persistence": "^2.0", + "doctrine/persistence": "^2.0|^3.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3.1", "aws/aws-sdk-php": "^3.155", diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index cf7bfb97a..a4d4af7f4 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -9,7 +9,7 @@ "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.12|^3.1", - "doctrine/persistence": "^2.0", + "doctrine/persistence": "^2.0|^3.0", "ramsey/uuid": "^3.5|^4" }, "require-dev": { From dd015020617e465ed4198d0969e2d02e8e6ff144 Mon Sep 17 00:00:00 2001 From: Ernesto Rodriguez Ortiz Date: Sat, 20 May 2023 00:01:34 -0400 Subject: [PATCH 1089/1142] fix: do not reset attemps header when message is requeue --- pkg/redis/RedisConsumer.php | 5 +---- pkg/redis/Tests/RedisConnectionFactoryConfigTest.php | 11 +++++------ pkg/redis/Tests/RedisConsumerTest.php | 1 + 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/pkg/redis/RedisConsumer.php b/pkg/redis/RedisConsumer.php index 6ff23f41e..9c93b642a 100644 --- a/pkg/redis/RedisConsumer.php +++ b/pkg/redis/RedisConsumer.php @@ -42,9 +42,6 @@ public function getRedeliveryDelay(): ?int return $this->redeliveryDelay; } - /** - * @param int $delay - */ public function setRedeliveryDelay(int $delay): void { $this->redeliveryDelay = $delay; @@ -103,7 +100,7 @@ public function reject(Message $message, bool $requeue = false): void if ($requeue) { $message = $this->getContext()->getSerializer()->toMessage($message->getReservedKey()); - $message->setHeader('attempts', 0); + $message->setRedelivered(true); if ($message->getTimeToLive()) { $message->setHeader('expires_at', time() + $message->getTimeToLive()); diff --git a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php index 065d6f971..88c8a94b9 100644 --- a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php +++ b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php @@ -195,7 +195,7 @@ public static function provideConfigs() ], ]; - //check normal redis connection for php redis extension + // check normal redis connection for php redis extension yield [ 'redis+phpredis://localhost:1234?foo=bar', [ @@ -218,7 +218,7 @@ public static function provideConfigs() ], ]; - //check normal redis connection for predis library + // check normal redis connection for predis library yield [ 'redis+predis://localhost:1234?foo=bar', [ @@ -241,7 +241,7 @@ public static function provideConfigs() ], ]; - //check tls connection for predis library + // check tls connection for predis library yield [ 'rediss+predis://localhost:1234?foo=bar&async=1', [ @@ -264,11 +264,11 @@ public static function provideConfigs() ], ]; - //check tls connection for predis library + // check tls connection for predis library yield [ 'rediss+phpredis://localhost:1234?foo=bar&async=1', [ - 'host' => 'tls://localhost', + 'host' => 'localhost', 'scheme' => 'rediss', 'port' => 1234, 'timeout' => 5., @@ -376,7 +376,6 @@ public static function provideConfigs() ]; // from predis doc - yield [ 'tls://127.0.0.1?ssl[cafile]=private.pem&ssl[verify_peer]=1', [ diff --git a/pkg/redis/Tests/RedisConsumerTest.php b/pkg/redis/Tests/RedisConsumerTest.php index ed67bd73b..2908134fa 100644 --- a/pkg/redis/Tests/RedisConsumerTest.php +++ b/pkg/redis/Tests/RedisConsumerTest.php @@ -112,6 +112,7 @@ public function testShouldSendSameMessageToDestinationOnReQueue() $message = new RedisMessage(); $message->setBody('text'); + $message->setHeader('attempts', 0); $message->setReservedKey($serializer->toString($message)); $consumer = new RedisConsumer($contextMock, new RedisDestination('aQueue')); From 1f2e5467c5366c3a72aaa42cf6c0d9f8e94e9612 Mon Sep 17 00:00:00 2001 From: Andrew M-Y Date: Mon, 12 Jun 2023 10:43:51 +0300 Subject: [PATCH 1090/1142] Add Symfony 6.3 to CI --- .github/workflows/ci.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d3319ca9e..616470279 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,13 +78,17 @@ jobs: fail-fast: false matrix: php: ['7.4', '8.0', '8.1', '8.2'] - symfony_version: ['5.4.*', '6.2.*'] + symfony_version: ['5.4.*', '6.2.*', '6.3.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: - php: '7.4' symfony_version: '6.2.*' + - php: '7.4' + symfony_version: '6.3.*' - php: '8.0' symfony_version: '6.2.*' + - php: '8.0' + symfony_version: '6.3.*' name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} @@ -124,13 +128,17 @@ jobs: fail-fast: false matrix: php: ['7.4', '8.0', '8.1', '8.2'] # same as in the container - symfony_version: ['5.4.*', '6.2.*'] + symfony_version: ['5.4.*', '6.2.*', '6.3.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] exclude: - php: '7.4' symfony_version: '6.2.*' + - php: '7.4' + symfony_version: '6.3.*' - php: '8.0' symfony_version: '6.2.*' + - php: '8.0' + symfony_version: '6.3.*' name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} From ee4eb10cb09baf7315fb26f7feaa50f3225d621a Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Mon, 12 Jun 2023 15:39:04 +0200 Subject: [PATCH 1091/1142] Add throws tag --- pkg/enqueue/Client/PreSendCommandExtensionInterface.php | 3 +++ pkg/enqueue/Client/PreSendEventExtensionInterface.php | 3 +++ pkg/enqueue/Client/ProducerInterface.php | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/pkg/enqueue/Client/PreSendCommandExtensionInterface.php b/pkg/enqueue/Client/PreSendCommandExtensionInterface.php index b2f6c7a5f..cefec097f 100644 --- a/pkg/enqueue/Client/PreSendCommandExtensionInterface.php +++ b/pkg/enqueue/Client/PreSendCommandExtensionInterface.php @@ -4,5 +4,8 @@ interface PreSendCommandExtensionInterface { + /** + * @throws \Exception + */ public function onPreSendCommand(PreSend $context): void; } diff --git a/pkg/enqueue/Client/PreSendEventExtensionInterface.php b/pkg/enqueue/Client/PreSendEventExtensionInterface.php index 1eaaae562..ecb0519c2 100644 --- a/pkg/enqueue/Client/PreSendEventExtensionInterface.php +++ b/pkg/enqueue/Client/PreSendEventExtensionInterface.php @@ -4,5 +4,8 @@ interface PreSendEventExtensionInterface { + /** + * @throws \Exception + */ public function onPreSendEvent(PreSend $context): void; } diff --git a/pkg/enqueue/Client/ProducerInterface.php b/pkg/enqueue/Client/ProducerInterface.php index 1c7b056cf..3c884808a 100644 --- a/pkg/enqueue/Client/ProducerInterface.php +++ b/pkg/enqueue/Client/ProducerInterface.php @@ -10,6 +10,8 @@ interface ProducerInterface * The message could be pretty much everything as long as you have a client extension that transforms a body to string on onPreSendEvent. * * @param string|array|Message $message + * + * @throws \Exception */ public function sendEvent(string $topic, $message): void; @@ -18,6 +20,8 @@ public function sendEvent(string $topic, $message): void; * The promise is returned if needReply argument is true. * * @param string|array|Message $message + * + * @throws \Exception */ public function sendCommand(string $command, $message, bool $needReply = false): ?Promise; } From c80127486d9e77204942e59abcc879a73599bd6f Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Tue, 4 Apr 2023 00:23:40 +0200 Subject: [PATCH 1092/1142] Add explicit @return --- pkg/enqueue/Client/DelegateProcessor.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/enqueue/Client/DelegateProcessor.php b/pkg/enqueue/Client/DelegateProcessor.php index 18985b454..e8a72add2 100644 --- a/pkg/enqueue/Client/DelegateProcessor.php +++ b/pkg/enqueue/Client/DelegateProcessor.php @@ -24,6 +24,8 @@ public function __construct(ProcessorRegistryInterface $registry) /** * {@inheritdoc} + * + * @return string|object */ public function process(InteropMessage $message, Context $context) { From aadd3d9b8eceb2393da81ec74acaf572dc55f792 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Tue, 16 May 2023 16:32:17 +0200 Subject: [PATCH 1093/1142] Fix cs --- pkg/enqueue/Client/DelegateProcessor.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pkg/enqueue/Client/DelegateProcessor.php b/pkg/enqueue/Client/DelegateProcessor.php index e8a72add2..0fbe9c200 100644 --- a/pkg/enqueue/Client/DelegateProcessor.php +++ b/pkg/enqueue/Client/DelegateProcessor.php @@ -14,9 +14,6 @@ class DelegateProcessor implements Processor */ private $registry; - /** - * @param ProcessorRegistryInterface $registry - */ public function __construct(ProcessorRegistryInterface $registry) { $this->registry = $registry; @@ -31,10 +28,7 @@ public function process(InteropMessage $message, Context $context) { $processorName = $message->getProperty(Config::PROCESSOR); if (false == $processorName) { - throw new \LogicException(sprintf( - 'Got message without required parameter: "%s"', - Config::PROCESSOR - )); + throw new \LogicException(sprintf('Got message without required parameter: "%s"', Config::PROCESSOR)); } return $this->registry->get($processorName)->process($message, $context); From 1151684b793d6edd2aec4dedeed00557f0e837d9 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Tue, 4 Jul 2023 14:49:32 +0200 Subject: [PATCH 1094/1142] Precise phpdoc for static analysis --- pkg/enqueue/Client/CommandSubscriberInterface.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkg/enqueue/Client/CommandSubscriberInterface.php b/pkg/enqueue/Client/CommandSubscriberInterface.php index 9ee09d0ab..d7b06daaf 100644 --- a/pkg/enqueue/Client/CommandSubscriberInterface.php +++ b/pkg/enqueue/Client/CommandSubscriberInterface.php @@ -2,6 +2,15 @@ namespace Enqueue\Client; +/** + * @phpstan-type CommandConfig = array{ + * command: string, + * processor?: string, + * queue?: string, + * prefix_queue?: bool, + * exclusive?: bool, + * } + */ interface CommandSubscriberInterface { /** @@ -44,6 +53,8 @@ interface CommandSubscriberInterface * Note: If you set "prefix_queue" to true then the "queue" is used as is and therefor the driver is not used to create a transport queue name. * * @return string|array + * + * @phpstan-return string|CommandConfig|array */ public static function getSubscribedCommand(); } From 46f0fd72e957a4071737c80d1fb4d0d1db21b8c1 Mon Sep 17 00:00:00 2001 From: Felippe Roberto Bayestorff Duarte Date: Tue, 8 Aug 2023 17:59:25 -0300 Subject: [PATCH 1095/1142] Add return type to flush function in RdkafkaProducer to be compatible to php-rdkafka flush function --- pkg/rdkafka/RdKafkaProducer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index a3c977f83..64b9ea3a7 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -115,11 +115,11 @@ public function getTimeToLive(): ?int return null; } - public function flush(int $timeout): void + public function flush(int $timeout): ?int { // Flush method is exposed in phprdkafka 4.0 if (method_exists($this->producer, 'flush')) { - $this->producer->flush($timeout); + return $this->producer->flush($timeout); } } } From bbe1e6e65fa5a8242dcac19e8de39e5669b2c11a Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Wed, 16 Aug 2023 18:31:45 +0200 Subject: [PATCH 1096/1142] Use `#[AsCommand]` attribute on commands Fixes the following deprecations: ```json { "message": "Since symfony/console 6.1: Relying on the static property \"$defaultName\" for setting a command name is deprecated. Add the \"Symfony\\Component\\Console\\Attribute\\AsCommand\" attribute to the \"Enqueue\\Symfony\\Consumption\\ConfigurableConsumeCommand\" class instead.", "count": 1 }, { "message": "Since symfony/console 6.1: Relying on the static property \"$defaultName\" for setting a command name is deprecated. Add the \"Symfony\\Component\\Console\\Attribute\\AsCommand\" attribute to the \"Enqueue\\Symfony\\Client\\ConsumeCommand\" class instead.", "count": 1 }, { "message": "Since symfony/console 6.1: Relying on the static property \"$defaultName\" for setting a command name is deprecated. Add the \"Symfony\\Component\\Console\\Attribute\\AsCommand\" attribute to the \"Enqueue\\Symfony\\Client\\ProduceCommand\" class instead.", "count": 1 }, { "message": "Since symfony/console 6.1: Relying on the static property \"$defaultName\" for setting a command name is deprecated. Add the \"Symfony\\Component\\Console\\Attribute\\AsCommand\" attribute to the \"Enqueue\\Symfony\\Client\\SetupBrokerCommand\" class instead.", "count": 1 }, { "message": "Since symfony/console 6.1: Relying on the static property \"$defaultName\" for setting a command name is deprecated. Add the \"Symfony\\Component\\Console\\Attribute\\AsCommand\" attribute to the \"Enqueue\\Symfony\\Client\\RoutesCommand\" class instead.", "count": 1 }, ``` --- pkg/enqueue/Symfony/Client/ConsumeCommand.php | 6 ++++-- pkg/enqueue/Symfony/Client/ProduceCommand.php | 2 ++ pkg/enqueue/Symfony/Client/RoutesCommand.php | 2 ++ pkg/enqueue/Symfony/Client/SetupBrokerCommand.php | 2 ++ .../Symfony/Consumption/ConfigurableConsumeCommand.php | 4 +++- pkg/enqueue/Symfony/Consumption/ConsumeCommand.php | 4 +++- 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index 4b65f6276..39af6d592 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -13,18 +13,20 @@ use Interop\Queue\Processor; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand('enqueue:consume')] class ConsumeCommand extends Command { + use ChooseLoggerCommandTrait; use LimitsExtensionsCommandTrait; - use SetupBrokerExtensionCommandTrait; use QueueConsumerOptionsCommandTrait; - use ChooseLoggerCommandTrait; + use SetupBrokerExtensionCommandTrait; protected static $defaultName = 'enqueue:consume'; diff --git a/pkg/enqueue/Symfony/Client/ProduceCommand.php b/pkg/enqueue/Symfony/Client/ProduceCommand.php index 667871c71..6064f82e1 100644 --- a/pkg/enqueue/Symfony/Client/ProduceCommand.php +++ b/pkg/enqueue/Symfony/Client/ProduceCommand.php @@ -6,12 +6,14 @@ use Enqueue\Client\ProducerInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand('enqueue:produce')] class ProduceCommand extends Command { protected static $defaultName = 'enqueue:produce'; diff --git a/pkg/enqueue/Symfony/Client/RoutesCommand.php b/pkg/enqueue/Symfony/Client/RoutesCommand.php index 5419f3beb..59a4a4d98 100644 --- a/pkg/enqueue/Symfony/Client/RoutesCommand.php +++ b/pkg/enqueue/Symfony/Client/RoutesCommand.php @@ -6,6 +6,7 @@ use Enqueue\Client\Route; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Helper\TableSeparator; @@ -13,6 +14,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand('enqueue:routes')] class RoutesCommand extends Command { protected static $defaultName = 'enqueue:routes'; diff --git a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php index 65d52ee31..68aebb582 100644 --- a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php +++ b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php @@ -5,12 +5,14 @@ use Enqueue\Client\DriverInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Logger\ConsoleLogger; use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand('enqueue:setup-broker')] class SetupBrokerCommand extends Command { protected static $defaultName = 'enqueue:setup-broker'; diff --git a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php index 9ec8a36f3..234eb0497 100644 --- a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php @@ -8,17 +8,19 @@ use Enqueue\ProcessorRegistryInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand('enqueue:transport:consume')] class ConfigurableConsumeCommand extends Command { + use ChooseLoggerCommandTrait; use LimitsExtensionsCommandTrait; use QueueConsumerOptionsCommandTrait; - use ChooseLoggerCommandTrait; protected static $defaultName = 'enqueue:transport:consume'; diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index b1a54c163..870cc5f60 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -7,16 +7,18 @@ use Enqueue\Consumption\QueueConsumerInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand('enqueue:transport:consume')] class ConsumeCommand extends Command { + use ChooseLoggerCommandTrait; use LimitsExtensionsCommandTrait; use QueueConsumerOptionsCommandTrait; - use ChooseLoggerCommandTrait; protected static $defaultName = 'enqueue:transport:consume'; From 70d811746947e7d34a568977875a84c8f3ba5715 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Wed, 16 Aug 2023 18:30:40 +0200 Subject: [PATCH 1097/1142] Run PHPStan on 8.0 This way it understands attributes. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 616470279..c29d8430c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: - uses: shivammathur/setup-php@v2 with: - php-version: '7.4' + php-version: '8.2' coverage: none extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M From 3954dedf0b1544bd0632f83110df0e2a181a7a7d Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 17 Aug 2023 13:04:45 +0200 Subject: [PATCH 1098/1142] Change PHP version in Docker to 8.2 --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 4c288b041..b2f30c62e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -ARG PHP_VERSION=7.4 +ARG PHP_VERSION=8.2 FROM makasim/nginx-php-fpm:${PHP_VERSION}-all-exts ARG PHP_VERSION From 774ccdf605699fa7e65ce9d674526eac139d19d6 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Sun, 15 Oct 2023 11:30:54 +0200 Subject: [PATCH 1099/1142] Fix CI Credits to VincentLanglet --- pkg/sns/Tests/SnsClientTest.php | 4 ++-- pkg/sqs/Tests/SqsClientTest.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/sns/Tests/SnsClientTest.php b/pkg/sns/Tests/SnsClientTest.php index e4fb15402..a029f4fd0 100644 --- a/pkg/sns/Tests/SnsClientTest.php +++ b/pkg/sns/Tests/SnsClientTest.php @@ -16,7 +16,7 @@ public function testShouldAllowGetAwsClientIfSingleClientProvided() $awsClient = (new Sdk(['Sns' => [ 'key' => '', 'secret' => '', - 'region' => '', + 'region' => 'us-west-2', 'version' => '2010-03-31', 'endpoint' => 'http://localhost/', ]]))->createSns(); @@ -31,7 +31,7 @@ public function testShouldAllowGetAwsClientIfMultipleClientProvided() $awsClient = (new Sdk(['Sns' => [ 'key' => '', 'secret' => '', - 'region' => '', + 'region' => 'us-west-2', 'version' => '2010-03-31', 'endpoint' => 'http://localhost/', ]]))->createMultiRegionSns(); diff --git a/pkg/sqs/Tests/SqsClientTest.php b/pkg/sqs/Tests/SqsClientTest.php index d7c583fd1..ff6a966d4 100644 --- a/pkg/sqs/Tests/SqsClientTest.php +++ b/pkg/sqs/Tests/SqsClientTest.php @@ -16,7 +16,7 @@ public function testShouldAllowGetAwsClientIfSingleClientProvided() $awsClient = (new Sdk(['Sqs' => [ 'key' => '', 'secret' => '', - 'region' => '', + 'region' => 'us-west-2', 'version' => '2012-11-05', 'endpoint' => 'http://localhost/', ]]))->createSqs(); @@ -31,7 +31,7 @@ public function testShouldAllowGetAwsClientIfMultipleClientProvided() $awsClient = (new Sdk(['Sqs' => [ 'key' => '', 'secret' => '', - 'region' => '', + 'region' => 'us-west-2', 'version' => '2012-11-05', 'endpoint' => 'http://localhost/', ]]))->createMultiRegionSqs(); From 9697ce617972b9a735d525c155af139630f8b333 Mon Sep 17 00:00:00 2001 From: Alex Ostrovsky Date: Fri, 3 Nov 2023 10:33:26 +0100 Subject: [PATCH 1100/1142] feat: update ext-amqp to use v2 --- composer.json | 2 +- pkg/amqp-ext/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 4e80fe7b0..5c0108e27 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "require": { "php": "^7.4|^8.0", - "ext-amqp": "^1.9.3", + "ext-amqp": "^1.9.3|^2.0.0", "ext-gearman": "^2.0", "ext-mongodb": "^1.5", "ext-rdkafka": "^4.0|^5.0|^6.0", diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index 57fb5b20c..b81363bb9 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "php": "^7.4|^8.0", - "ext-amqp": "^1.9.3", + "ext-amqp": "^1.9.3|^2.0.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/amqp-tools": "^0.10" From 805e3e62d3fad0c91673af5927c371285fcbcea0 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Mon, 6 May 2024 11:25:31 +0200 Subject: [PATCH 1101/1142] feat(GPS): allow send attributes in Google PubSub message. --- docs/transport/gps.md | 15 +++++++++++++++ pkg/gps/GpsMessage.php | 22 +++++++++++++++++----- pkg/gps/GpsProducer.php | 7 ++++--- pkg/gps/Tests/GpsMessageTest.php | 11 ++++++++++- pkg/gps/Tests/GpsProducerTest.php | 31 +++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 9 deletions(-) diff --git a/docs/transport/gps.md b/docs/transport/gps.md index b56f5c949..0ed47afe5 100644 --- a/docs/transport/gps.md +++ b/docs/transport/gps.md @@ -62,6 +62,21 @@ $context->declareTopic($fooTopic); $context->createProducer()->send($fooTopic, $message); ``` +You can send attributes using headers : + +```php +createTopic('foo'); +$attributes = ['key1' => 'value1']; +$message = $context->createMessage('Hello world!', [], ['attributes' => $attributes]); + +$context->declareTopic($fooTopic); + +$context->createProducer()->send($fooTopic, $message); +``` + ## Consume message: Before you can consume message you have to subscribe a queue to the topic. diff --git a/pkg/gps/GpsMessage.php b/pkg/gps/GpsMessage.php index b4a11dc5a..e638c26ad 100644 --- a/pkg/gps/GpsMessage.php +++ b/pkg/gps/GpsMessage.php @@ -34,10 +34,17 @@ class GpsMessage implements Message, \JsonSerializable */ private $nativeMessage; + /** + * @var array + */ + private $attributes; + public function __construct(string $body = '', array $properties = [], array $headers = []) { $this->body = $body; $this->properties = $properties; + $this->attributes = $headers['attributes'] ?? []; + unset($headers['attributes']); $this->headers = $headers; $this->redelivered = false; @@ -103,7 +110,7 @@ public function isRedelivered(): bool return $this->redelivered; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', $correlationId); } @@ -113,7 +120,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', $messageId); } @@ -130,12 +137,12 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -169,8 +176,13 @@ public function getNativeMessage(): ?GoogleMessage return $this->nativeMessage; } - public function setNativeMessage(GoogleMessage $message = null): void + public function setNativeMessage(?GoogleMessage $message = null): void { $this->nativeMessage = $message; } + + public function getAttributes(): array + { + return $this->attributes; + } } diff --git a/pkg/gps/GpsProducer.php b/pkg/gps/GpsProducer.php index 86c9052c0..e2e6d4046 100644 --- a/pkg/gps/GpsProducer.php +++ b/pkg/gps/GpsProducer.php @@ -39,10 +39,11 @@ public function send(Destination $destination, Message $message): void $topic = $this->context->getClient()->topic($destination->getTopicName()); $topic->publish([ 'data' => json_encode($message), + 'attributes' => $message->getAttributes(), ]); } - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $deliveryDelay) { return $this; @@ -56,7 +57,7 @@ public function getDeliveryDelay(): ?int return null; } - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (null === $priority) { return $this; @@ -70,7 +71,7 @@ public function getPriority(): ?int return null; } - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { if (null === $timeToLive) { return $this; diff --git a/pkg/gps/Tests/GpsMessageTest.php b/pkg/gps/Tests/GpsMessageTest.php index a43a22315..c78372e88 100644 --- a/pkg/gps/Tests/GpsMessageTest.php +++ b/pkg/gps/Tests/GpsMessageTest.php @@ -29,7 +29,7 @@ public function testCouldBeUnserializedFromJson() $json = json_encode($message); - //guard + // guard $this->assertNotEmpty($json); $unserializedMessage = GpsMessage::jsonUnserialize($json); @@ -70,4 +70,13 @@ public function testThrowIfMalformedJsonGivenOnUnsterilizedFromJson() GpsMessage::jsonUnserialize('{]'); } + + public function testGetAttributes() + { + $message = new GpsMessage('the body', [], ['attributes' => ['key1' => 'value1']]); + + $attributes = $message->getAttributes(); + + $this->assertSame(['key1' => 'value1'], $attributes); + } } diff --git a/pkg/gps/Tests/GpsProducerTest.php b/pkg/gps/Tests/GpsProducerTest.php index 1e1bfae41..9e39078e4 100644 --- a/pkg/gps/Tests/GpsProducerTest.php +++ b/pkg/gps/Tests/GpsProducerTest.php @@ -55,6 +55,37 @@ public function testShouldSendMessage() $producer->send($topic, $message); } + public function testShouldSendMessageWithAttributes() + { + $topic = new GpsTopic('topic-name'); + $message = new GpsMessage('', [], ['attributes' => ['key1' => 'value1']]); + + $gtopic = $this->createGTopicMock(); + $gtopic + ->expects($this->once()) + ->method('publish') + ->with($this->identicalTo(['data' => '{"body":"","properties":[],"headers":[]}', 'attributes' => ['key1' => 'value1']])) + ; + + $client = $this->createPubSubClientMock(); + $client + ->expects($this->once()) + ->method('topic') + ->with('topic-name') + ->willReturn($gtopic) + ; + + $context = $this->createContextMock(); + $context + ->expects($this->once()) + ->method('getClient') + ->willReturn($client) + ; + + $producer = new GpsProducer($context); + $producer->send($topic, $message); + } + /** * @return GpsContext|\PHPUnit\Framework\MockObject\MockObject|GpsContext */ From 46929e0e080f41f87cabae9d39ef0d0a9e9698d0 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Tue, 2 Jul 2024 16:33:31 +0200 Subject: [PATCH 1102/1142] Fixing CI --- pkg/gps/Tests/GpsProducerTest.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/gps/Tests/GpsProducerTest.php b/pkg/gps/Tests/GpsProducerTest.php index 9e39078e4..a677e1328 100644 --- a/pkg/gps/Tests/GpsProducerTest.php +++ b/pkg/gps/Tests/GpsProducerTest.php @@ -33,8 +33,11 @@ public function testShouldSendMessage() $gtopic ->expects($this->once()) ->method('publish') - ->with($this->identicalTo(['data' => '{"body":"","properties":[],"headers":[]}'])) - ; + ->with($this->identicalTo([ + 'data' => '{"body":"","properties":[],"headers":[]}', + 'attributes' => [], + ]) + ); $client = $this->createPubSubClientMock(); $client From 8495deb8581c11cea0bcc855a58c2def9a9e360d Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Fri, 5 Jul 2024 11:01:10 +0200 Subject: [PATCH 1103/1142] Don't send attributes if it's empty --- pkg/gps/GpsProducer.php | 12 ++++++++---- pkg/gps/Tests/GpsProducerTest.php | 1 - 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/gps/GpsProducer.php b/pkg/gps/GpsProducer.php index e2e6d4046..b36fad19d 100644 --- a/pkg/gps/GpsProducer.php +++ b/pkg/gps/GpsProducer.php @@ -37,10 +37,14 @@ public function send(Destination $destination, Message $message): void /** @var Topic $topic */ $topic = $this->context->getClient()->topic($destination->getTopicName()); - $topic->publish([ - 'data' => json_encode($message), - 'attributes' => $message->getAttributes(), - ]); + + $params = ['data' => json_encode($message)]; + + if (count($message->getAttributes()) > 0) { + $params['attributes'] = $message->getAttributes(); + } + + $topic->publish($params); } public function setDeliveryDelay(?int $deliveryDelay = null): Producer diff --git a/pkg/gps/Tests/GpsProducerTest.php b/pkg/gps/Tests/GpsProducerTest.php index a677e1328..5e42938a5 100644 --- a/pkg/gps/Tests/GpsProducerTest.php +++ b/pkg/gps/Tests/GpsProducerTest.php @@ -35,7 +35,6 @@ public function testShouldSendMessage() ->method('publish') ->with($this->identicalTo([ 'data' => '{"body":"","properties":[],"headers":[]}', - 'attributes' => [], ]) ); From 076aeddbf317b2b5e3c3774db12342d28c6e0ede Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Thu, 1 Aug 2024 15:36:06 +0200 Subject: [PATCH 1104/1142] Set delevery tags on AMQP --- pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php index a90b1d306..ee53ad90b 100644 --- a/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php +++ b/pkg/amqp-ext/Tests/Functional/AmqpCommonUseCasesTest.php @@ -112,6 +112,7 @@ public function testProduceAndReceiveOneMessageSentDirectlyToTemporaryQueue() $queue = $this->amqpContext->createTemporaryQueue(); $message = $this->amqpContext->createMessage(__METHOD__); + $message->setDeliveryTag(145); $producer = $this->amqpContext->createProducer(); $producer->send($queue, $message); @@ -137,6 +138,7 @@ public function testProduceAndReceiveOneMessageSentDirectlyToTopic() $this->amqpContext->bind(new AmqpBind($topic, $queue)); $message = $this->amqpContext->createMessage(__METHOD__); + $message->setDeliveryTag(145); $producer = $this->amqpContext->createProducer(); $producer->send($topic, $message); @@ -158,10 +160,11 @@ public function testConsumerReceiveMessageFromTopicDirectly() $this->amqpContext->declareTopic($topic); $consumer = $this->amqpContext->createConsumer($topic); - //guard + // guard $this->assertNull($consumer->receive(1000)); $message = $this->amqpContext->createMessage(__METHOD__); + $message->setDeliveryTag(145); $producer = $this->amqpContext->createProducer(); $producer->send($topic, $message); @@ -181,10 +184,11 @@ public function testConsumerReceiveMessageWithZeroTimeout() $this->amqpContext->declareTopic($topic); $consumer = $this->amqpContext->createConsumer($topic); - //guard + // guard $this->assertNull($consumer->receive(1000)); $message = $this->amqpContext->createMessage(__METHOD__); + $message->setDeliveryTag(145); $producer = $this->amqpContext->createProducer(); $producer->send($topic, $message); @@ -205,6 +209,7 @@ public function testPurgeMessagesFromQueue() $consumer = $this->amqpContext->createConsumer($queue); $message = $this->amqpContext->createMessage(__METHOD__); + $message->setDeliveryTag(145); $producer = $this->amqpContext->createProducer(); $producer->send($queue, $message); From 21a36c9931d7222f89d0ce6f83d077186e9c713b Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Fri, 2 Aug 2024 11:21:00 +0200 Subject: [PATCH 1105/1142] Use new image of localstack to fixing error in SQS and SNS in CI --- docker-compose.yml | 18 +++++++++--------- docker/bin/test.sh | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index c5fa5545b..b6696e9c0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: build: context: docker args: - PHP_VERSION: "${PHP_VERSION:-7.4}" + PHP_VERSION: "${PHP_VERSION:-8.2}" depends_on: - rabbitmq - mysql @@ -38,16 +38,16 @@ services: - PREDIS_DSN=redis+predis://redis - PHPREDIS_DSN=redis+phpredis://redis - GPS_DSN=gps:?projectId=mqdev&emulatorHost=http://google-pubsub:8085 - - SQS_DSN=sqs:?key=key&secret=secret®ion=us-east-1&endpoint=http://localstack:4576&version=latest - - SNS_DSN=sns:?key=key&secret=secret®ion=us-east-1&endpoint=http://localstack:4575&version=latest - - SNSQS_DSN=snsqs:?key=key&secret=secret®ion=us-east-1&sns_endpoint=http://localstack:4575&sqs_endpoint=http://localstack:4576&version=latest + - SQS_DSN=sqs:?key=key&secret=secret®ion=us-east-1&endpoint=http://localstack:4566&version=latest + - SNS_DSN=sns:?key=key&secret=secret®ion=us-east-1&endpoint=http://localstack:4566&version=latest + - SNSQS_DSN=snsqs:?key=key&secret=secret®ion=us-east-1&sns_endpoint=http://localstack:4566&sqs_endpoint=http://localstack:4566&version=latest - WAMP_DSN=wamp://thruway:9090 - REDIS_HOST=redis - REDIS_PORT=6379 - AWS_SQS_KEY=key - AWS_SQS_SECRET=secret - AWS_SQS_REGION=us-east-1 - - AWS_SQS_ENDPOINT=http://localstack:4576 + - AWS_SQS_ENDPOINT=http://localstack:4566 - AWS_SQS_VERSION=latest - BEANSTALKD_DSN=beanstalk://beanstalkd:11300 - GEARMAN_DSN=gearman://gearmand:4730 @@ -127,13 +127,13 @@ services: - '9090:9090' localstack: - image: 'localstack/localstack:0.8.10' + image: 'localstack/localstack' ports: - - '4576:4576' - - '4575:4575' + - "127.0.0.1:4566:4566" # LocalStack Gateway + - "127.0.0.1:4510-4559:4510-4559" # external services port range environment: HOSTNAME_EXTERNAL: 'localstack' - SERVICES: 'sqs,sns' + SERVICES: 's3,sqs,sns' influxdb: image: 'influxdb:latest' diff --git a/docker/bin/test.sh b/docker/bin/test.sh index 2070584bb..cfc94aab5 100755 --- a/docker/bin/test.sh +++ b/docker/bin/test.sh @@ -39,7 +39,7 @@ waitForService gearmand 4730 50 waitForService kafka 9092 50 waitForService mongo 27017 50 waitForService thruway 9090 50 -waitForService localstack 4576 50 +waitForService localstack 4566 50 php docker/bin/refresh-mysql-database.php || exit 1 php docker/bin/refresh-postgres-database.php || exit 1 From 20fe023c764dd69832798f38572a2a9c697f3d4e Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Tue, 6 Aug 2024 14:29:51 +0200 Subject: [PATCH 1106/1142] revert docker php version --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index b6696e9c0..3198e285f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: build: context: docker args: - PHP_VERSION: "${PHP_VERSION:-8.2}" + PHP_VERSION: "${PHP_VERSION:-7.4}" depends_on: - rabbitmq - mysql From 45b7a63aa65ea2db03013259cbe157457cf09191 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Tue, 6 Aug 2024 15:07:56 +0200 Subject: [PATCH 1107/1142] Replace docker compose V2 instead V1 --- bin/dev | 2 +- bin/test.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/dev b/bin/dev index a50b7ad66..b7434741b 100755 --- a/bin/dev +++ b/bin/dev @@ -6,7 +6,7 @@ set -e while getopts "bustefdp" OPTION; do case $OPTION in b) - docker-compose pull -q && docker-compose build + docker compose pull -q && docker compose build ;; u) docker-compose up diff --git a/bin/test.sh b/bin/test.sh index f392e616b..5cb858ad6 100755 --- a/bin/test.sh +++ b/bin/test.sh @@ -3,4 +3,4 @@ set -x set -e -docker-compose run --workdir="/mqdev" --rm dev ./docker/bin/test.sh $@ +docker compose run --workdir="/mqdev" --rm dev ./docker/bin/test.sh $@ From cdfd18eb980bdccaf7e37e2854ff6bdd31d2e761 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Wed, 7 Aug 2024 10:51:35 +0200 Subject: [PATCH 1108/1142] Remove all docker-composer and use docker compose --- bin/changelog | 4 ++-- bin/dev | 6 +++--- docs/contribution.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/changelog b/bin/changelog index 8a9296175..b2dff8b4f 100755 --- a/bin/changelog +++ b/bin/changelog @@ -8,6 +8,6 @@ then exit 1 fi -docker-compose run -e CHANGELOG_GITHUB_TOKEN=${CHANGELOG_GITHUB_TOKEN:-""} --workdir="/mqdev" --rm generate-changelog github_changelog_generator --future-release "$1" --no-issues --unreleased-only --output "CHANGELOG_FUTURE.md" +docker compose run -e CHANGELOG_GITHUB_TOKEN=${CHANGELOG_GITHUB_TOKEN:-""} --workdir="/mqdev" --rm generate-changelog github_changelog_generator --future-release "$1" --no-issues --unreleased-only --output "CHANGELOG_FUTURE.md" -#git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRENT_BRANCH" \ No newline at end of file +#git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRENT_BRANCH" diff --git a/bin/dev b/bin/dev index b7434741b..45a3e7124 100755 --- a/bin/dev +++ b/bin/dev @@ -9,10 +9,10 @@ while getopts "bustefdp" OPTION; do docker compose pull -q && docker compose build ;; u) - docker-compose up + docker compose up ;; s) - docker-compose stop + docker compose stop ;; e) docker exec -it mqdev_dev_1 /bin/bash @@ -21,7 +21,7 @@ while getopts "bustefdp" OPTION; do ./bin/php-cs-fixer fix ;; - d) docker-compose run --workdir="/mqdev" --rm dev php pkg/enqueue-bundle/Tests/Functional/app/console.php config:dump-reference enqueue -vvv + d) docker compose run --workdir="/mqdev" --rm dev php pkg/enqueue-bundle/Tests/Functional/app/console.php config:dump-reference enqueue -vvv ;; \?) echo "Invalid option: -$OPTARG" >&2 diff --git a/docs/contribution.md b/docs/contribution.md index 455f6950e..68d051fc5 100644 --- a/docs/contribution.md +++ b/docs/contribution.md @@ -49,6 +49,6 @@ Once everything is done open a pull request on official repository. ## WTF?! -* If you get `rabbitmqssl: forward host lookup failed: Unknown host, wait for service rabbitmqssl:5671` do `docker-compose down`. +* If you get `rabbitmqssl: forward host lookup failed: Unknown host, wait for service rabbitmqssl:5671` do `docker compose down`. [back to index](index.md) From a1831b7b31a8da8ce46a370175b47a9f19606c7a Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Thu, 8 Aug 2024 10:52:57 +0200 Subject: [PATCH 1109/1142] try a composer update --- composer.json | 3 +-- pkg/sns/composer.json | 2 +- pkg/sqs/composer.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 5c0108e27..437fee594 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "doctrine/persistence": "^2.0|^3.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3.1", - "aws/aws-sdk-php": "^3.155", + "aws/aws-sdk-php": "^3.319", "stomp-php/stomp-php": "^4.5|^5", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", @@ -137,4 +137,3 @@ } } } - diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index 297fac858..0a074ea28 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -9,7 +9,7 @@ "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "aws/aws-sdk-php": "~3.155" + "aws/aws-sdk-php": "~3.319" }, "require-dev": { "phpunit/phpunit": "^9.5", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index d48b89015..fe4793da1 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -9,7 +9,7 @@ "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "aws/aws-sdk-php": "~3.155" + "aws/aws-sdk-php": "~3.319" }, "require-dev": { "phpunit/phpunit": "^9.5", From 50c6b12745f0a60d8db5a4a8fcfce7c69cb21413 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Thu, 8 Aug 2024 17:14:47 +0200 Subject: [PATCH 1110/1142] try fix --- .../SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php index e370c1f32..a5fc7f72f 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -8,6 +8,7 @@ /** * @group functional + * * @retry 5 */ class SnsQsSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveNoWaitFromQueueSpec @@ -15,6 +16,14 @@ class SnsQsSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiv use RetryTrait; use SnsQsFactoryTrait; + protected function setUp(): void + { + try { + $this->cleanUpSnsQs(); + } catch (\Exception $e) { + } + } + protected function tearDown(): void { parent::tearDown(); From 850f6a916374472f0dcc569705ac1ab4c4b695cb Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Fri, 9 Aug 2024 15:58:14 +0200 Subject: [PATCH 1111/1142] move the snsqs tests at the end --- phpunit.xml.dist | 8 ++++---- .../SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php | 8 -------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 1cd38e68b..f5ba01d8f 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -68,10 +68,6 @@ pkg/sns/Tests - - pkg/snsqs/Tests - - pkg/pheanstalk/Tests @@ -123,6 +119,10 @@ pkg/monitoring/Tests + + + pkg/snsqs/Tests + diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php index a5fc7f72f..433fcf3a7 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -16,14 +16,6 @@ class SnsQsSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiv use RetryTrait; use SnsQsFactoryTrait; - protected function setUp(): void - { - try { - $this->cleanUpSnsQs(); - } catch (\Exception $e) { - } - } - protected function tearDown(): void { parent::tearDown(); From d748405a0ae94b41880b4ba4da143e04385ca732 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Mon, 12 Aug 2024 09:32:16 +0200 Subject: [PATCH 1112/1142] use lower version of aws sdk php --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 437fee594..e17ab6570 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "doctrine/persistence": "^2.0|^3.0", "mongodb/mongodb": "^1.2", "pda/pheanstalk": "^3.1", - "aws/aws-sdk-php": "^3.319", + "aws/aws-sdk-php": "^3.290", "stomp-php/stomp-php": "^4.5|^5", "php-http/guzzle7-adapter": "^0.1.1", "php-http/client-common": "^2.2.1", From 10dea2a14d54d85dd5408d3a34d632ec0cd8b8e9 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Mon, 12 Aug 2024 10:28:46 +0200 Subject: [PATCH 1113/1142] Use a property attributes instead of a key in headers --- docs/transport/gps.md | 15 --------------- pkg/gps/GpsMessage.php | 20 ++++++++++++-------- pkg/gps/Tests/GpsMessageTest.php | 2 +- pkg/gps/Tests/GpsProducerTest.php | 5 ++--- 4 files changed, 15 insertions(+), 27 deletions(-) diff --git a/docs/transport/gps.md b/docs/transport/gps.md index 0ed47afe5..b56f5c949 100644 --- a/docs/transport/gps.md +++ b/docs/transport/gps.md @@ -62,21 +62,6 @@ $context->declareTopic($fooTopic); $context->createProducer()->send($fooTopic, $message); ``` -You can send attributes using headers : - -```php -createTopic('foo'); -$attributes = ['key1' => 'value1']; -$message = $context->createMessage('Hello world!', [], ['attributes' => $attributes]); - -$context->declareTopic($fooTopic); - -$context->createProducer()->send($fooTopic, $message); -``` - ## Consume message: Before you can consume message you have to subscribe a queue to the topic. diff --git a/pkg/gps/GpsMessage.php b/pkg/gps/GpsMessage.php index e638c26ad..4fff14859 100644 --- a/pkg/gps/GpsMessage.php +++ b/pkg/gps/GpsMessage.php @@ -24,6 +24,11 @@ class GpsMessage implements Message, \JsonSerializable */ private $headers; + /** + * @var array + */ + private $attributes; + /** * @var bool */ @@ -34,18 +39,12 @@ class GpsMessage implements Message, \JsonSerializable */ private $nativeMessage; - /** - * @var array - */ - private $attributes; - - public function __construct(string $body = '', array $properties = [], array $headers = []) + public function __construct(string $body = '', array $properties = [], array $headers = [], array $attributes = []) { $this->body = $body; $this->properties = $properties; - $this->attributes = $headers['attributes'] ?? []; - unset($headers['attributes']); $this->headers = $headers; + $this->attributes = $attributes; $this->redelivered = false; } @@ -181,6 +180,11 @@ public function setNativeMessage(?GoogleMessage $message = null): void $this->nativeMessage = $message; } + public function setAttributes(array $attributes): void + { + $this->attributes = $attributes; + } + public function getAttributes(): array { return $this->attributes; diff --git a/pkg/gps/Tests/GpsMessageTest.php b/pkg/gps/Tests/GpsMessageTest.php index c78372e88..5b48ca0ca 100644 --- a/pkg/gps/Tests/GpsMessageTest.php +++ b/pkg/gps/Tests/GpsMessageTest.php @@ -73,7 +73,7 @@ public function testThrowIfMalformedJsonGivenOnUnsterilizedFromJson() public function testGetAttributes() { - $message = new GpsMessage('the body', [], ['attributes' => ['key1' => 'value1']]); + $message = new GpsMessage('the body', [], [], ['key1' => 'value1']); $attributes = $message->getAttributes(); diff --git a/pkg/gps/Tests/GpsProducerTest.php b/pkg/gps/Tests/GpsProducerTest.php index 5e42938a5..c7de83e44 100644 --- a/pkg/gps/Tests/GpsProducerTest.php +++ b/pkg/gps/Tests/GpsProducerTest.php @@ -35,8 +35,7 @@ public function testShouldSendMessage() ->method('publish') ->with($this->identicalTo([ 'data' => '{"body":"","properties":[],"headers":[]}', - ]) - ); + ])); $client = $this->createPubSubClientMock(); $client @@ -60,7 +59,7 @@ public function testShouldSendMessage() public function testShouldSendMessageWithAttributes() { $topic = new GpsTopic('topic-name'); - $message = new GpsMessage('', [], ['attributes' => ['key1' => 'value1']]); + $message = new GpsMessage('', [], [], ['key1' => 'value1']); $gtopic = $this->createGTopicMock(); $gtopic From 9aed45578a3ff99ae1982d84934c3c89ce06bb94 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Mon, 12 Aug 2024 11:19:35 +0200 Subject: [PATCH 1114/1142] Update the composer of sqs and sns --- pkg/sns/composer.json | 2 +- pkg/sqs/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index 0a074ea28..3bf50bdaf 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -9,7 +9,7 @@ "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "aws/aws-sdk-php": "~3.319" + "aws/aws-sdk-php": "^3.290" }, "require-dev": { "phpunit/phpunit": "^9.5", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index fe4793da1..cd50faf29 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -9,7 +9,7 @@ "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", - "aws/aws-sdk-php": "~3.319" + "aws/aws-sdk-php": "^3.290" }, "require-dev": { "phpunit/phpunit": "^9.5", From e2fae176f5d1724f005b3e40771117c70070d303 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Mon, 12 Aug 2024 11:50:14 +0200 Subject: [PATCH 1115/1142] unserialize the attributes --- pkg/gps/GpsMessage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gps/GpsMessage.php b/pkg/gps/GpsMessage.php index 4fff14859..1686ec937 100644 --- a/pkg/gps/GpsMessage.php +++ b/pkg/gps/GpsMessage.php @@ -167,7 +167,7 @@ public static function jsonUnserialize(string $json): self throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } - return new self($data['body'] ?? $json, $data['properties'] ?? [], $data['headers'] ?? []); + return new self($data['body'] ?? $json, $data['properties'] ?? [], $data['headers'] ?? [], $data['attributes'] ?? []); } public function getNativeMessage(): ?GoogleMessage From 719e9e8ace7a8b6d90ad340a2fd1540314665469 Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Mon, 12 Aug 2024 13:55:42 +0200 Subject: [PATCH 1116/1142] get attributes in unserialization --- pkg/gps/GpsMessage.php | 1 + pkg/gps/Tests/GpsMessageTest.php | 10 ++++++---- pkg/gps/Tests/GpsProducerTest.php | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pkg/gps/GpsMessage.php b/pkg/gps/GpsMessage.php index 1686ec937..684a7ba7b 100644 --- a/pkg/gps/GpsMessage.php +++ b/pkg/gps/GpsMessage.php @@ -157,6 +157,7 @@ public function jsonSerialize(): array 'body' => $this->getBody(), 'properties' => $this->getProperties(), 'headers' => $this->getHeaders(), + 'attributes' => $this->getAttributes(), ]; } diff --git a/pkg/gps/Tests/GpsMessageTest.php b/pkg/gps/Tests/GpsMessageTest.php index 5b48ca0ca..ee9e652cd 100644 --- a/pkg/gps/Tests/GpsMessageTest.php +++ b/pkg/gps/Tests/GpsMessageTest.php @@ -18,14 +18,14 @@ public function testCouldSetGetNativeMessage() public function testColdBeSerializedToJson() { - $message = new GpsMessage('theBody', ['thePropFoo' => 'thePropFooVal'], ['theHeaderFoo' => 'theHeaderFooVal']); + $message = new GpsMessage('theBody', ['thePropFoo' => 'thePropFooVal'], ['theHeaderFoo' => 'theHeaderFooVal'], ['theAttributeFoo' => 'theAttributeFooVal']); - $this->assertEquals('{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"}}', json_encode($message)); + $this->assertEquals('{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"},"attributes":{"theAttributeFoo":"theAttributeFooVal"}}', json_encode($message)); } public function testCouldBeUnserializedFromJson() { - $message = new GpsMessage('theBody', ['thePropFoo' => 'thePropFooVal'], ['theHeaderFoo' => 'theHeaderFooVal']); + $message = new GpsMessage('theBody', ['thePropFoo' => 'thePropFooVal'], ['theHeaderFoo' => 'theHeaderFooVal'], ['theAttributeFoo' => 'theAttributeFooVal']); $json = json_encode($message); @@ -40,7 +40,7 @@ public function testCouldBeUnserializedFromJson() public function testMessageEntityCouldBeUnserializedFromJson() { - $json = '{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"}}'; + $json = '{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"},"attributes":{"theAttributeFoo":"theAttributeFooVal"}}'; $unserializedMessage = GpsMessage::jsonUnserialize($json); @@ -49,6 +49,7 @@ public function testMessageEntityCouldBeUnserializedFromJson() $this->assertEquals($decoded['body'], $unserializedMessage->getBody()); $this->assertEquals($decoded['properties'], $unserializedMessage->getProperties()); $this->assertEquals($decoded['headers'], $unserializedMessage->getHeaders()); + $this->assertEquals($decoded['attributes'], $unserializedMessage->getAttributes()); } public function testMessagePayloadCouldBeUnserializedFromJson() @@ -61,6 +62,7 @@ public function testMessagePayloadCouldBeUnserializedFromJson() $this->assertEquals($json, $unserializedMessage->getBody()); $this->assertEquals([], $unserializedMessage->getProperties()); $this->assertEquals([], $unserializedMessage->getHeaders()); + $this->assertEquals([], $unserializedMessage->getAttributes()); } public function testThrowIfMalformedJsonGivenOnUnsterilizedFromJson() diff --git a/pkg/gps/Tests/GpsProducerTest.php b/pkg/gps/Tests/GpsProducerTest.php index c7de83e44..34dc2504f 100644 --- a/pkg/gps/Tests/GpsProducerTest.php +++ b/pkg/gps/Tests/GpsProducerTest.php @@ -34,7 +34,7 @@ public function testShouldSendMessage() ->expects($this->once()) ->method('publish') ->with($this->identicalTo([ - 'data' => '{"body":"","properties":[],"headers":[]}', + 'data' => '{"body":"","properties":[],"headers":[],"attributes":[]}', ])); $client = $this->createPubSubClientMock(); @@ -65,7 +65,7 @@ public function testShouldSendMessageWithAttributes() $gtopic ->expects($this->once()) ->method('publish') - ->with($this->identicalTo(['data' => '{"body":"","properties":[],"headers":[]}', 'attributes' => ['key1' => 'value1']])) + ->with($this->identicalTo(['data' => '{"body":"","properties":[],"headers":[],"attributes":{"key1":"value1"}}', 'attributes' => ['key1' => 'value1']])) ; $client = $this->createPubSubClientMock(); From cf6bbec9f1aa225e6000014adc86b42b5aec455f Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Mon, 12 Aug 2024 14:12:18 +0200 Subject: [PATCH 1117/1142] uncomment on chagelog and set a version of localstack image --- bin/changelog | 2 +- docker-compose.yml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/changelog b/bin/changelog index b2dff8b4f..ba2db0813 100755 --- a/bin/changelog +++ b/bin/changelog @@ -10,4 +10,4 @@ fi docker compose run -e CHANGELOG_GITHUB_TOKEN=${CHANGELOG_GITHUB_TOKEN:-""} --workdir="/mqdev" --rm generate-changelog github_changelog_generator --future-release "$1" --no-issues --unreleased-only --output "CHANGELOG_FUTURE.md" -#git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRENT_BRANCH" + git add CHANGELOG.md && git commit -m "Release $1" -S && git push origin "$CURRENT_BRANCH" diff --git a/docker-compose.yml b/docker-compose.yml index 3198e285f..a5b884b31 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,6 +83,7 @@ services: mysql: image: mysql:5.7 + platform: linux/amd64 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: mqdev @@ -127,7 +128,7 @@ services: - '9090:9090' localstack: - image: 'localstack/localstack' + image: 'localstack/localstack:3.6.0' ports: - "127.0.0.1:4566:4566" # LocalStack Gateway - "127.0.0.1:4510-4559:4510-4559" # external services port range From 2d41b6ec6fea931cfd811c915f38b7cae54de16e Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 12 Aug 2024 16:35:28 +0300 Subject: [PATCH 1118/1142] release 0.10.21 --- CHANGELOG.md | 21 +++++++++++++++++++++ bin/release | 6 ++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74758242a..e4eadf90b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Change Log +## [0.10.21](https://github.com/php-enqueue/enqueue-dev/tree/0.10.21) (2024-08-12) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.20...0.10.21) + +**Merged pull requests:** + +- feat\(GPS\): allow send attributes in Google PubSub message. [\#1349](https://github.com/php-enqueue/enqueue-dev/pull/1349) ([p-pichet](https://github.com/p-pichet)) + +## [0.10.19](https://github.com/php-enqueue/enqueue-dev/tree/0.10.19) (2023-07-15) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.18...0.10.19) + +**Merged pull requests:** + +- fix: do not reset attemps header when message is requeue [\#1301](https://github.com/php-enqueue/enqueue-dev/pull/1301) ([eortiz-tracktik](https://github.com/eortiz-tracktik)) +- Allow doctrine/persistence 3.1 version [\#1300](https://github.com/php-enqueue/enqueue-dev/pull/1300) ([xNarkon](https://github.com/xNarkon)) +- Add support for rediss and phpredis [\#1297](https://github.com/php-enqueue/enqueue-dev/pull/1297) ([splagemann](https://github.com/splagemann)) +- Replaced `json\_array` with `json` due to Doctrine Dbal 3.0 [\#1294](https://github.com/php-enqueue/enqueue-dev/pull/1294) ([NovakHonza](https://github.com/NovakHonza)) +- pkg PHP 8.1 and 8.2 support [\#1292](https://github.com/php-enqueue/enqueue-dev/pull/1292) ([snapshotpl](https://github.com/snapshotpl)) +- Update doctrine/persistence [\#1290](https://github.com/php-enqueue/enqueue-dev/pull/1290) ([jlabedo](https://github.com/jlabedo)) +- Add PHP 8.1 and 8.2, Symfony 6.2 to CI [\#1285](https://github.com/php-enqueue/enqueue-dev/pull/1285) ([andrewmy](https://github.com/andrewmy)) +- \[SNSQS\] added possibility to send FIFO-related parameters using snsqs transport [\#1278](https://github.com/php-enqueue/enqueue-dev/pull/1278) ([onatskyy](https://github.com/onatskyy)) + ## [0.10.18](https://github.com/php-enqueue/enqueue-dev/tree/0.10.18) (2023-03-18) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.17...0.10.18) diff --git a/bin/release b/bin/release index dcd8674ca..f1f7a07f1 100755 --- a/bin/release +++ b/bin/release @@ -43,7 +43,8 @@ do if [[ -z "$LAST_RELEASE" ]]; then echo "There has not been any releases. Releasing $1"; - git tag $1 -a -s -m "Release $1" + #git tag $1 -a -s -m "Release $1" + git tag $1 -a -m "Release $1" git push origin --tags else echo "Last release $LAST_RELEASE"; @@ -53,7 +54,8 @@ do if [[ ! -z "$CHANGES_SINCE_LAST_RELEASE" ]]; then echo "There are changes since last release. Releasing $1"; - git tag $1 -s -m "Release $1" + #git tag $1 -s -m "Release $1" + git tag $1 -m "Release $1" git push origin --tags else echo "No change since last release."; From c8c4993ac9c40c298382be6fdd7c04858fa1b1fb Mon Sep 17 00:00:00 2001 From: philippe PICHET Date: Tue, 13 Aug 2024 10:37:42 +0200 Subject: [PATCH 1119/1142] GPS: revert the attributes and use the headers instead. --- pkg/gps/GpsMessage.php | 21 ++------------------- pkg/gps/GpsProducer.php | 4 ++-- pkg/gps/Tests/GpsMessageTest.php | 19 ++++--------------- pkg/gps/Tests/GpsProducerTest.php | 8 ++++---- 4 files changed, 12 insertions(+), 40 deletions(-) diff --git a/pkg/gps/GpsMessage.php b/pkg/gps/GpsMessage.php index 684a7ba7b..b7e2bf484 100644 --- a/pkg/gps/GpsMessage.php +++ b/pkg/gps/GpsMessage.php @@ -24,11 +24,6 @@ class GpsMessage implements Message, \JsonSerializable */ private $headers; - /** - * @var array - */ - private $attributes; - /** * @var bool */ @@ -39,12 +34,11 @@ class GpsMessage implements Message, \JsonSerializable */ private $nativeMessage; - public function __construct(string $body = '', array $properties = [], array $headers = [], array $attributes = []) + public function __construct(string $body = '', array $properties = [], array $headers = []) { $this->body = $body; $this->properties = $properties; $this->headers = $headers; - $this->attributes = $attributes; $this->redelivered = false; } @@ -157,7 +151,6 @@ public function jsonSerialize(): array 'body' => $this->getBody(), 'properties' => $this->getProperties(), 'headers' => $this->getHeaders(), - 'attributes' => $this->getAttributes(), ]; } @@ -168,7 +161,7 @@ public static function jsonUnserialize(string $json): self throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } - return new self($data['body'] ?? $json, $data['properties'] ?? [], $data['headers'] ?? [], $data['attributes'] ?? []); + return new self($data['body'] ?? $json, $data['properties'] ?? [], $data['headers'] ?? []); } public function getNativeMessage(): ?GoogleMessage @@ -180,14 +173,4 @@ public function setNativeMessage(?GoogleMessage $message = null): void { $this->nativeMessage = $message; } - - public function setAttributes(array $attributes): void - { - $this->attributes = $attributes; - } - - public function getAttributes(): array - { - return $this->attributes; - } } diff --git a/pkg/gps/GpsProducer.php b/pkg/gps/GpsProducer.php index b36fad19d..7e307636f 100644 --- a/pkg/gps/GpsProducer.php +++ b/pkg/gps/GpsProducer.php @@ -40,8 +40,8 @@ public function send(Destination $destination, Message $message): void $params = ['data' => json_encode($message)]; - if (count($message->getAttributes()) > 0) { - $params['attributes'] = $message->getAttributes(); + if (count($message->getHeaders()) > 0) { + $params['attributes'] = $message->getHeaders(); } $topic->publish($params); diff --git a/pkg/gps/Tests/GpsMessageTest.php b/pkg/gps/Tests/GpsMessageTest.php index ee9e652cd..8182333cc 100644 --- a/pkg/gps/Tests/GpsMessageTest.php +++ b/pkg/gps/Tests/GpsMessageTest.php @@ -18,14 +18,14 @@ public function testCouldSetGetNativeMessage() public function testColdBeSerializedToJson() { - $message = new GpsMessage('theBody', ['thePropFoo' => 'thePropFooVal'], ['theHeaderFoo' => 'theHeaderFooVal'], ['theAttributeFoo' => 'theAttributeFooVal']); + $message = new GpsMessage('theBody', ['thePropFoo' => 'thePropFooVal'], ['theHeaderFoo' => 'theHeaderFooVal']); - $this->assertEquals('{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"},"attributes":{"theAttributeFoo":"theAttributeFooVal"}}', json_encode($message)); + $this->assertEquals('{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"}}', json_encode($message)); } public function testCouldBeUnserializedFromJson() { - $message = new GpsMessage('theBody', ['thePropFoo' => 'thePropFooVal'], ['theHeaderFoo' => 'theHeaderFooVal'], ['theAttributeFoo' => 'theAttributeFooVal']); + $message = new GpsMessage('theBody', ['thePropFoo' => 'thePropFooVal'], ['theHeaderFoo' => 'theHeaderFooVal']); $json = json_encode($message); @@ -40,7 +40,7 @@ public function testCouldBeUnserializedFromJson() public function testMessageEntityCouldBeUnserializedFromJson() { - $json = '{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"},"attributes":{"theAttributeFoo":"theAttributeFooVal"}}'; + $json = '{"body":"theBody","properties":{"thePropFoo":"thePropFooVal"},"headers":{"theHeaderFoo":"theHeaderFooVal"}}'; $unserializedMessage = GpsMessage::jsonUnserialize($json); @@ -49,7 +49,6 @@ public function testMessageEntityCouldBeUnserializedFromJson() $this->assertEquals($decoded['body'], $unserializedMessage->getBody()); $this->assertEquals($decoded['properties'], $unserializedMessage->getProperties()); $this->assertEquals($decoded['headers'], $unserializedMessage->getHeaders()); - $this->assertEquals($decoded['attributes'], $unserializedMessage->getAttributes()); } public function testMessagePayloadCouldBeUnserializedFromJson() @@ -62,7 +61,6 @@ public function testMessagePayloadCouldBeUnserializedFromJson() $this->assertEquals($json, $unserializedMessage->getBody()); $this->assertEquals([], $unserializedMessage->getProperties()); $this->assertEquals([], $unserializedMessage->getHeaders()); - $this->assertEquals([], $unserializedMessage->getAttributes()); } public function testThrowIfMalformedJsonGivenOnUnsterilizedFromJson() @@ -72,13 +70,4 @@ public function testThrowIfMalformedJsonGivenOnUnsterilizedFromJson() GpsMessage::jsonUnserialize('{]'); } - - public function testGetAttributes() - { - $message = new GpsMessage('the body', [], [], ['key1' => 'value1']); - - $attributes = $message->getAttributes(); - - $this->assertSame(['key1' => 'value1'], $attributes); - } } diff --git a/pkg/gps/Tests/GpsProducerTest.php b/pkg/gps/Tests/GpsProducerTest.php index 34dc2504f..3079d3c7c 100644 --- a/pkg/gps/Tests/GpsProducerTest.php +++ b/pkg/gps/Tests/GpsProducerTest.php @@ -34,7 +34,7 @@ public function testShouldSendMessage() ->expects($this->once()) ->method('publish') ->with($this->identicalTo([ - 'data' => '{"body":"","properties":[],"headers":[],"attributes":[]}', + 'data' => '{"body":"","properties":[],"headers":[]}', ])); $client = $this->createPubSubClientMock(); @@ -56,16 +56,16 @@ public function testShouldSendMessage() $producer->send($topic, $message); } - public function testShouldSendMessageWithAttributes() + public function testShouldSendMessageWithHeaders() { $topic = new GpsTopic('topic-name'); - $message = new GpsMessage('', [], [], ['key1' => 'value1']); + $message = new GpsMessage('', [], ['key1' => 'value1']); $gtopic = $this->createGTopicMock(); $gtopic ->expects($this->once()) ->method('publish') - ->with($this->identicalTo(['data' => '{"body":"","properties":[],"headers":[],"attributes":{"key1":"value1"}}', 'attributes' => ['key1' => 'value1']])) + ->with($this->identicalTo(['data' => '{"body":"","properties":[],"headers":{"key1":"value1"}}', 'attributes' => ['key1' => 'value1']])) ; $client = $this->createPubSubClientMock(); From dbad0a2003c1373c151da52df22bc709bec9f7a4 Mon Sep 17 00:00:00 2001 From: Damian Dziaduch Date: Tue, 17 Sep 2024 14:45:33 +0200 Subject: [PATCH 1120/1142] Drop useless call to end method Due to this, upgrading from SF 6.4.7 to more recent versions is impossible. --- .../Symfony/Client/DependencyInjection/ClientFactory.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php index 2eede31b7..be020dcff 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/ClientFactory.php @@ -74,12 +74,8 @@ public static function getConfiguration(bool $debug, string $name = 'client'): N ->scalarNode('router_processor')->defaultNull()->end() ->integerNode('redelivered_delay_time')->min(0)->defaultValue(0)->end() ->scalarNode('default_queue')->defaultValue('default')->cannotBeEmpty()->end() - ->arrayNode('driver_options') - ->addDefaultsIfNotSet() - ->info('The array contains driver specific options') - ->ignoreExtraKeys(false) + ->arrayNode('driver_options')->addDefaultsIfNotSet()->info('The array contains driver specific options')->ignoreExtraKeys(false)->end() ->end() - ->end()->end() ; return $builder; From 867d45f41aa0f70df78d74e8ace7673076488e50 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Tue, 1 Oct 2024 17:08:25 +0300 Subject: [PATCH 1121/1142] Release 0.10.23 --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4eadf90b..d592f71cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## [0.10.23](https://github.com/php-enqueue/enqueue-dev/tree/0.10.23) (2024-10-01) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.22...0.10.23) + +**Merged pull requests:** + +- Drop useless call to end method [\#1359](https://github.com/php-enqueue/enqueue-dev/pull/1359) ([ddziaduch](https://github.com/ddziaduch)) + +## [0.10.22](https://github.com/php-enqueue/enqueue-dev/tree/0.10.22) (2024-08-13) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.21...0.10.22) + +**Merged pull requests:** + +- GPS: revert the attributes and use the headers instead. [\#1355](https://github.com/php-enqueue/enqueue-dev/pull/1355) ([p-pichet](https://github.com/p-pichet)) + ## [0.10.21](https://github.com/php-enqueue/enqueue-dev/tree/0.10.21) (2024-08-12) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.20...0.10.21) From 4492e2112f08d369daf5cc59aa8e358b54409e1b Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Thu, 14 Nov 2024 13:08:33 +0300 Subject: [PATCH 1122/1142] add symfony 7 support --- .github/workflows/ci.yml | 30 ++++++------------------------ pkg/enqueue-bundle/composer.json | 17 +++++++++++------ 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c29d8430c..21cc407be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,7 +58,7 @@ jobs: - uses: shivammathur/setup-php@v2 with: - php-version: '7.4' + php-version: '8.2' coverage: none extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M @@ -77,18 +77,9 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.4', '8.0', '8.1', '8.2'] - symfony_version: ['5.4.*', '6.2.*', '6.3.*'] + php: ['8.1', '8.2'] + symfony_version: ['6.2.*', '6.3.*', '6.4.*', '7.0.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] - exclude: - - php: '7.4' - symfony_version: '6.2.*' - - php: '7.4' - symfony_version: '6.3.*' - - php: '8.0' - symfony_version: '6.2.*' - - php: '8.0' - symfony_version: '6.3.*' name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} @@ -127,18 +118,9 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.4', '8.0', '8.1', '8.2'] # same as in the container - symfony_version: ['5.4.*', '6.2.*', '6.3.*'] - dependencies: ['--prefer-lowest', '--prefer-dist'] - exclude: - - php: '7.4' - symfony_version: '6.2.*' - - php: '7.4' - symfony_version: '6.3.*' - - php: '8.0' - symfony_version: '6.2.*' - - php: '8.0' - symfony_version: '6.3.*' + php: [ '8.1', '8.2' ] + symfony_version: [ '6.2.*', '6.3.*', '6.4.*', '7.0.*' ] + dependencies: [ '--prefer-lowest', '--prefer-dist' ] name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 7ee50c269..1a070ee50 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -6,8 +6,8 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", - "symfony/framework-bundle": "^5.4|^6.0", + "php": "^8.1", + "symfony/framework-bundle": "^6.2|^7.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/enqueue": "^0.10", @@ -39,10 +39,10 @@ "doctrine/doctrine-bundle": "^2.3.2", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "alcaeus/mongo-php-adapter": "^1.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/browser-kit": "^6.2|^7.0", + "symfony/expression-language": "^6.2|^7.0", + "symfony/validator": "^6.2|^7.0", + "symfony/yaml": "^6.2|^7.0" }, "suggest": { "enqueue/async-command": "If want to run Symfony command via message queue", @@ -58,5 +58,10 @@ "branch-alias": { "dev-master": "0.10.x-dev" } + }, + "config": { + "allow-plugins": { + "php-http/discovery": true + } } } From 15a98812a355601fafab7b2a09cf0f6677f7ceba Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Thu, 14 Nov 2024 13:22:17 +0300 Subject: [PATCH 1123/1142] fix deprecations --- pkg/enqueue/Doctrine/DoctrineSchemaCompilerPass.php | 2 +- pkg/enqueue/Symfony/Client/ConsumeCommand.php | 2 -- pkg/enqueue/Symfony/Client/ProduceCommand.php | 2 -- pkg/enqueue/Symfony/Client/RoutesCommand.php | 2 -- pkg/enqueue/Symfony/Client/SetupBrokerCommand.php | 2 -- pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php | 2 -- pkg/enqueue/Symfony/Consumption/ConsumeCommand.php | 2 -- 7 files changed, 1 insertion(+), 13 deletions(-) diff --git a/pkg/enqueue/Doctrine/DoctrineSchemaCompilerPass.php b/pkg/enqueue/Doctrine/DoctrineSchemaCompilerPass.php index 25016a761..0eb378470 100644 --- a/pkg/enqueue/Doctrine/DoctrineSchemaCompilerPass.php +++ b/pkg/enqueue/Doctrine/DoctrineSchemaCompilerPass.php @@ -11,7 +11,7 @@ class DoctrineSchemaCompilerPass implements CompilerPassInterface { - public function process(ContainerBuilder $container) + public function process(ContainerBuilder $container): void { if (false === $container->hasDefinition('doctrine')) { return; diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index 39af6d592..c97dd3a33 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -28,8 +28,6 @@ class ConsumeCommand extends Command use QueueConsumerOptionsCommandTrait; use SetupBrokerExtensionCommandTrait; - protected static $defaultName = 'enqueue:consume'; - /** * @var ContainerInterface */ diff --git a/pkg/enqueue/Symfony/Client/ProduceCommand.php b/pkg/enqueue/Symfony/Client/ProduceCommand.php index 6064f82e1..512dd5f25 100644 --- a/pkg/enqueue/Symfony/Client/ProduceCommand.php +++ b/pkg/enqueue/Symfony/Client/ProduceCommand.php @@ -16,8 +16,6 @@ #[AsCommand('enqueue:produce')] class ProduceCommand extends Command { - protected static $defaultName = 'enqueue:produce'; - /** * @var ContainerInterface */ diff --git a/pkg/enqueue/Symfony/Client/RoutesCommand.php b/pkg/enqueue/Symfony/Client/RoutesCommand.php index 59a4a4d98..99979d5c1 100644 --- a/pkg/enqueue/Symfony/Client/RoutesCommand.php +++ b/pkg/enqueue/Symfony/Client/RoutesCommand.php @@ -17,8 +17,6 @@ #[AsCommand('enqueue:routes')] class RoutesCommand extends Command { - protected static $defaultName = 'enqueue:routes'; - /** * @var ContainerInterface */ diff --git a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php index 68aebb582..78bb4041d 100644 --- a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php +++ b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php @@ -15,8 +15,6 @@ #[AsCommand('enqueue:setup-broker')] class SetupBrokerCommand extends Command { - protected static $defaultName = 'enqueue:setup-broker'; - /** * @var ContainerInterface */ diff --git a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php index 234eb0497..2847ca569 100644 --- a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php @@ -22,8 +22,6 @@ class ConfigurableConsumeCommand extends Command use LimitsExtensionsCommandTrait; use QueueConsumerOptionsCommandTrait; - protected static $defaultName = 'enqueue:transport:consume'; - /** * @var ContainerInterface */ diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index 870cc5f60..c8de790b8 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -20,8 +20,6 @@ class ConsumeCommand extends Command use LimitsExtensionsCommandTrait; use QueueConsumerOptionsCommandTrait; - protected static $defaultName = 'enqueue:transport:consume'; - /** * @var ContainerInterface */ From 828bd2f818561e0f0db581b1735db9505e5791cd Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Thu, 14 Nov 2024 15:04:57 +0300 Subject: [PATCH 1124/1142] fix tests --- .../Symfony/Client/ConsumeCommandTest.php | 20 +++++++++++++++---- .../Symfony/Client/ProduceCommandTest.php | 18 ++++++++++++++--- .../Symfony/Client/RoutesCommandTest.php | 18 ++++++++++++++--- .../Symfony/Client/SetupBrokerCommandTest.php | 18 ++++++++++++++--- .../Client/SimpleConsumeCommandTest.php | 7 ------- .../Client/SimpleProduceCommandTest.php | 7 ------- .../Client/SimpleRoutesCommandTest.php | 7 ------- .../Client/SimpleSetupBrokerCommandTest.php | 7 ------- .../ConfigurableConsumeCommandTest.php | 20 +++++++++++++++---- .../Consumption/ConsumeCommandTest.php | 20 +++++++++++++++---- .../Consumption/SimpleConsumeCommandTest.php | 7 ------- 11 files changed, 93 insertions(+), 56 deletions(-) diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 1d94e6e51..8076aaf76 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -22,6 +22,7 @@ use Interop\Queue\Queue; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Tester\CommandTester; @@ -44,11 +45,22 @@ public function testCouldBeConstructedWithRequiredAttributes() new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); } - public function testShouldHaveCommandName() + public function testShouldHaveAsCommandAttributeWithCommandName() { - $command = new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); + $commandClass = ConsumeCommand::class; + + $reflectionClass = new \ReflectionClass($commandClass); + + $attributes = $reflectionClass->getAttributes(AsCommand::class); + + $this->assertNotEmpty($attributes, 'The command does not have the AsCommand attribute.'); + + // Get the first attribute instance (assuming there is only one AsCommand attribute) + $asCommandAttribute = $attributes[0]; - $this->assertEquals('enqueue:consume', $command->getName()); + // Verify the 'name' parameter value + $attributeInstance = $asCommandAttribute->newInstance(); + $this->assertEquals('enqueue:consume', $attributeInstance->name, 'The command name is not set correctly in the AsCommand attribute.'); } public function testShouldHaveExpectedOptions() @@ -641,7 +653,7 @@ private function createContextWithoutSubscriptionConsumerMock(): InteropContext /** * @return \PHPUnit\Framework\MockObject\MockObject|InteropContext */ - private function createContextStub(Consumer $consumer = null): InteropContext + private function createContextStub(?Consumer $consumer = null): InteropContext { $context = $this->createContextWithoutSubscriptionConsumerMock(); $context diff --git a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php index 0dffc3d42..2efc4769f 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php @@ -9,6 +9,7 @@ use Enqueue\Test\ClassExtensionTrait; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Tester\CommandTester; @@ -31,11 +32,22 @@ public function testCouldBeConstructedWithContainerAsFirstArgument() new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); } - public function testShouldHaveCommandName() + public function testShouldHaveAsCommandAttributeWithCommandName() { - $command = new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); + $commandClass = ProduceCommand::class; + + $reflectionClass = new \ReflectionClass($commandClass); + + $attributes = $reflectionClass->getAttributes(AsCommand::class); + + $this->assertNotEmpty($attributes, 'The command does not have the AsCommand attribute.'); + + // Get the first attribute instance (assuming there is only one AsCommand attribute) + $asCommandAttribute = $attributes[0]; - $this->assertEquals('enqueue:produce', $command->getName()); + // Verify the 'name' parameter value + $attributeInstance = $asCommandAttribute->newInstance(); + $this->assertEquals('enqueue:produce', $attributeInstance->name, 'The command name is not set correctly in the AsCommand attribute.'); } public function testShouldHaveExpectedOptions() diff --git a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php index 04980c135..c2168c4f8 100644 --- a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php @@ -11,6 +11,7 @@ use Enqueue\Test\ClassExtensionTrait; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Tester\CommandTester; @@ -33,11 +34,22 @@ public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); } - public function testShouldHaveCommandName() + public function testShouldHaveAsCommandAttributeWithCommandName() { - $command = new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); + $commandClass = RoutesCommand::class; + + $reflectionClass = new \ReflectionClass($commandClass); + + $attributes = $reflectionClass->getAttributes(AsCommand::class); + + $this->assertNotEmpty($attributes, 'The command does not have the AsCommand attribute.'); + + // Get the first attribute instance (assuming there is only one AsCommand attribute) + $asCommandAttribute = $attributes[0]; - $this->assertEquals('enqueue:routes', $command->getName()); + // Verify the 'name' parameter value + $attributeInstance = $asCommandAttribute->newInstance(); + $this->assertEquals('enqueue:routes', $attributeInstance->name, 'The command name is not set correctly in the AsCommand attribute.'); } public function testShouldHaveCommandAliases() diff --git a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php index 82345b2bf..89ca379b5 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php @@ -8,6 +8,7 @@ use Enqueue\Test\ClassExtensionTrait; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Tester\CommandTester; @@ -30,11 +31,22 @@ public function testCouldBeConstructedWithContainerAsFirstArgument() new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); } - public function testShouldHaveCommandName() + public function testShouldHaveAsCommandAttributeWithCommandName() { - $command = new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); + $commandClass = SetupBrokerCommand::class; + + $reflectionClass = new \ReflectionClass($commandClass); + + $attributes = $reflectionClass->getAttributes(AsCommand::class); + + $this->assertNotEmpty($attributes, 'The command does not have the AsCommand attribute.'); + + // Get the first attribute instance (assuming there is only one AsCommand attribute) + $asCommandAttribute = $attributes[0]; - $this->assertEquals('enqueue:setup-broker', $command->getName()); + // Verify the 'name' parameter value + $attributeInstance = $asCommandAttribute->newInstance(); + $this->assertEquals('enqueue:setup-broker', $attributeInstance->name, 'The command name is not set correctly in the AsCommand attribute.'); } public function testShouldHaveCommandAliases() diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php index fb89dae32..60d409325 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php @@ -34,13 +34,6 @@ public function testCouldBeConstructedWithRequiredAttributes() new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); } - public function testShouldHaveCommandName() - { - $command = new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); - - $this->assertEquals('enqueue:consume', $command->getName()); - } - public function testShouldHaveExpectedOptions() { $command = new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php index 71ac20f38..2775870b6 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php @@ -28,13 +28,6 @@ public function testCouldBeConstructedWithContainerAsFirstArgument() new SimpleProduceCommand($this->createProducerMock()); } - public function testShouldHaveCommandName() - { - $command = new SimpleProduceCommand($this->createProducerMock()); - - $this->assertEquals('enqueue:produce', $command->getName()); - } - public function testShouldHaveExpectedOptions() { $command = new SimpleProduceCommand($this->createProducerMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php index 469334b02..356f3f9f4 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php @@ -30,13 +30,6 @@ public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() new SimpleRoutesCommand($this->createDriverMock()); } - public function testShouldHaveCommandName() - { - $command = new SimpleRoutesCommand($this->createDriverMock()); - - $this->assertEquals('enqueue:routes', $command->getName()); - } - public function testShouldHaveCommandAliases() { $command = new SimpleRoutesCommand($this->createDriverMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php index f9a66129c..91802ff11 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php @@ -28,13 +28,6 @@ public function testCouldBeConstructedWithContainerAsFirstArgument() new SimpleSetupBrokerCommand($this->createClientDriverMock()); } - public function testShouldHaveCommandName() - { - $command = new SimpleSetupBrokerCommand($this->createClientDriverMock()); - - $this->assertEquals('enqueue:setup-broker', $command->getName()); - } - public function testShouldHaveCommandAliases() { $command = new SimpleSetupBrokerCommand($this->createClientDriverMock()); diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index c788d5e75..84d6dff84 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -15,6 +15,7 @@ use Interop\Queue\Queue as InteropQueue; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Tester\CommandTester; @@ -37,11 +38,22 @@ public function testCouldBeConstructedWithRequiredAttributes() new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class), 'default'); } - public function testShouldHaveCommandName() + public function testShouldHaveAsCommandAttributeWithCommandName() { - $command = new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class), 'default'); + $commandClass = ConfigurableConsumeCommand::class; + + $reflectionClass = new \ReflectionClass($commandClass); + + $attributes = $reflectionClass->getAttributes(AsCommand::class); + + $this->assertNotEmpty($attributes, 'The command does not have the AsCommand attribute.'); + + // Get the first attribute instance (assuming there is only one AsCommand attribute) + $asCommandAttribute = $attributes[0]; - $this->assertEquals('enqueue:transport:consume', $command->getName()); + // Verify the 'name' parameter value + $attributeInstance = $asCommandAttribute->newInstance(); + $this->assertEquals('enqueue:transport:consume', $attributeInstance->name, 'The command name is not set correctly in the AsCommand attribute.'); } public function testShouldHaveExpectedOptions() @@ -192,7 +204,7 @@ public function testShouldExecuteConsumptionWithSeveralCustomQueues() public function testShouldExecuteConsumptionWhenProcessorImplementsQueueSubscriberInterface() { - $processor = new class() implements Processor, QueueSubscriberInterface { + $processor = new class implements Processor, QueueSubscriberInterface { public function process(InteropMessage $message, Context $context) { } diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index 348397137..3c16cde3d 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -17,6 +17,7 @@ use Interop\Queue\Queue; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Tester\CommandTester; @@ -39,11 +40,22 @@ public function testCouldBeConstructedWithRequiredAttributes() new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); } - public function testShouldHaveCommandName() + public function testShouldHaveAsCommandAttributeWithCommandName() { - $command = new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); + $commandClass = ConsumeCommand::class; + + $reflectionClass = new \ReflectionClass($commandClass); + + $attributes = $reflectionClass->getAttributes(AsCommand::class); + + $this->assertNotEmpty($attributes, 'The command does not have the AsCommand attribute.'); + + // Get the first attribute instance (assuming there is only one AsCommand attribute) + $asCommandAttribute = $attributes[0]; - $this->assertEquals('enqueue:transport:consume', $command->getName()); + // Verify the 'name' parameter value + $attributeInstance = $asCommandAttribute->newInstance(); + $this->assertEquals('enqueue:transport:consume', $attributeInstance->name, 'The command name is not set correctly in the AsCommand attribute.'); } public function testShouldHaveExpectedOptions() @@ -185,7 +197,7 @@ private function createContextWithoutSubscriptionConsumerMock(): InteropContext /** * @return \PHPUnit\Framework\MockObject\MockObject|InteropContext */ - private function createContextStub(Consumer $consumer = null): InteropContext + private function createContextStub(?Consumer $consumer = null): InteropContext { $context = $this->createContextWithoutSubscriptionConsumerMock(); $context diff --git a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php index 19b9d76f8..d54a70e58 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php @@ -29,13 +29,6 @@ public function testCouldBeConstructedWithRequiredAttributes() new SimpleConsumeCommand($this->createQueueConsumerMock()); } - public function testShouldHaveCommandName() - { - $command = new SimpleConsumeCommand($this->createQueueConsumerMock()); - - $this->assertEquals('enqueue:transport:consume', $command->getName()); - } - public function testShouldHaveExpectedOptions() { $command = new SimpleConsumeCommand($this->createQueueConsumerMock()); From 4c1b0cddbd62a75832304123b679217f8f952261 Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Thu, 14 Nov 2024 15:24:42 +0300 Subject: [PATCH 1125/1142] fix code style --- pkg/enqueue/Symfony/Client/ConsumeCommand.php | 4 ++-- pkg/enqueue/Symfony/Client/ProduceCommand.php | 2 +- pkg/enqueue/Symfony/Client/RoutesCommand.php | 2 +- pkg/enqueue/Symfony/Client/SetupBrokerCommand.php | 2 +- .../Symfony/Consumption/ConfigurableConsumeCommand.php | 4 ++-- pkg/enqueue/Symfony/Consumption/ConsumeCommand.php | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index c97dd3a33..5a0676705 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -58,7 +58,7 @@ public function __construct( string $defaultClient, string $queueConsumerIdPattern = 'enqueue.client.%s.queue_consumer', string $driverIdPattern = 'enqueue.client.%s.driver', - string $processorIdPatter = 'enqueue.client.%s.delegate_processor' + string $processorIdPatter = 'enqueue.client.%s.delegate_processor', ) { $this->container = $container; $this->defaultClient = $defaultClient; @@ -66,7 +66,7 @@ public function __construct( $this->driverIdPattern = $driverIdPattern; $this->processorIdPattern = $processorIdPatter; - parent::__construct(self::$defaultName); + parent::__construct(); } protected function configure(): void diff --git a/pkg/enqueue/Symfony/Client/ProduceCommand.php b/pkg/enqueue/Symfony/Client/ProduceCommand.php index 512dd5f25..bd23c16c3 100644 --- a/pkg/enqueue/Symfony/Client/ProduceCommand.php +++ b/pkg/enqueue/Symfony/Client/ProduceCommand.php @@ -37,7 +37,7 @@ public function __construct(ContainerInterface $container, string $defaultClient $this->defaultClient = $defaultClient; $this->producerIdPattern = $producerIdPattern; - parent::__construct(static::$defaultName); + parent::__construct(); } protected function configure(): void diff --git a/pkg/enqueue/Symfony/Client/RoutesCommand.php b/pkg/enqueue/Symfony/Client/RoutesCommand.php index 99979d5c1..0646e37bb 100644 --- a/pkg/enqueue/Symfony/Client/RoutesCommand.php +++ b/pkg/enqueue/Symfony/Client/RoutesCommand.php @@ -43,7 +43,7 @@ public function __construct(ContainerInterface $container, string $defaultClient $this->defaultClient = $defaultClient; $this->driverIdPatter = $driverIdPatter; - parent::__construct(static::$defaultName); + parent::__construct(); } protected function configure(): void diff --git a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php index 78bb4041d..b74902aa6 100644 --- a/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php +++ b/pkg/enqueue/Symfony/Client/SetupBrokerCommand.php @@ -36,7 +36,7 @@ public function __construct(ContainerInterface $container, string $defaultClient $this->defaultClient = $defaultClient; $this->driverIdPattern = $driverIdPattern; - parent::__construct(static::$defaultName); + parent::__construct(); } protected function configure(): void diff --git a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php index 2847ca569..230a0dc69 100644 --- a/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConfigurableConsumeCommand.php @@ -46,14 +46,14 @@ public function __construct( ContainerInterface $container, string $defaultTransport, string $queueConsumerIdPattern = 'enqueue.transport.%s.queue_consumer', - string $processorRegistryIdPattern = 'enqueue.transport.%s.processor_registry' + string $processorRegistryIdPattern = 'enqueue.transport.%s.processor_registry', ) { $this->container = $container; $this->defaultTransport = $defaultTransport; $this->queueConsumerIdPattern = $queueConsumerIdPattern; $this->processorRegistryIdPattern = $processorRegistryIdPattern; - parent::__construct(static::$defaultName); + parent::__construct(); } protected function configure(): void diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index c8de790b8..1c82f3cfb 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -41,7 +41,7 @@ public function __construct(ContainerInterface $container, string $defaultTransp $this->defaultTransport = $defaultTransport; $this->queueConsumerIdPattern = $queueConsumerIdPattern; - parent::__construct(static::$defaultName); + parent::__construct(); } protected function configure(): void From 922b26c8f0e77df031c477c7edc53f28026c167f Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Fri, 15 Nov 2024 00:58:58 +0300 Subject: [PATCH 1126/1142] fix sf 7 dependencies --- .github/workflows/ci.yml | 6 ++++++ composer.json | 3 ++- pkg/enqueue-bundle/composer.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 21cc407be..1f3b500e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,6 +80,9 @@ jobs: php: ['8.1', '8.2'] symfony_version: ['6.2.*', '6.3.*', '6.4.*', '7.0.*'] dependencies: ['--prefer-lowest', '--prefer-dist'] + exclude: + - php: '8.1' + symfony_version: '7.0.*' name: PHP ${{ matrix.php }} unit tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} @@ -121,6 +124,9 @@ jobs: php: [ '8.1', '8.2' ] symfony_version: [ '6.2.*', '6.3.*', '6.4.*', '7.0.*' ] dependencies: [ '--prefer-lowest', '--prefer-dist' ] + exclude: + - php: '8.1' + symfony_version: '7.0.*' name: PHP ${{ matrix.php }} functional tests on Sf ${{ matrix.symfony_version }}, deps=${{ matrix.dependencies }} diff --git a/composer.json b/composer.json index e17ab6570..c1abd1b87 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "symfony/yaml": "^5.4|^6.0", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "^2.3.2", - "doctrine/mongodb-odm-bundle": "^3.5|^4.3", + "doctrine/mongodb-odm-bundle": "^3.5|^4.3|^5.0", "alcaeus/mongo-php-adapter": "^1.0", "kwn/php-rdkafka-stubs": "^2.0.3", "friendsofphp/php-cs-fixer": "^3.4", @@ -137,3 +137,4 @@ } } } + diff --git a/pkg/enqueue-bundle/composer.json b/pkg/enqueue-bundle/composer.json index 1a070ee50..99d237bf6 100644 --- a/pkg/enqueue-bundle/composer.json +++ b/pkg/enqueue-bundle/composer.json @@ -37,7 +37,7 @@ "enqueue/async-command": "0.10.x-dev", "php-amqplib/php-amqplib": "^3.0", "doctrine/doctrine-bundle": "^2.3.2", - "doctrine/mongodb-odm-bundle": "^3.5|^4.3", + "doctrine/mongodb-odm-bundle": "^3.5|^4.3|^5.0", "alcaeus/mongo-php-adapter": "^1.0", "symfony/browser-kit": "^6.2|^7.0", "symfony/expression-language": "^6.2|^7.0", From 5d3d1973042f0c9df15e4b4bef057a99c89c7727 Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Fri, 15 Nov 2024 10:44:13 +0300 Subject: [PATCH 1127/1142] fix tests --- .../Tests/Functional/App/CustomAppKernel.php | 2 +- .../Tests/Functional/LazyProducerTest.php | 12 ------------ pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php | 6 ------ 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php b/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php index 11fa323d7..88618d5c3 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php @@ -27,7 +27,7 @@ class CustomAppKernel extends Kernel ], ]; - public function setEnqueueConfig(array $config) + public function setEnqueueConfig(array $config): void { $this->enqueueConfig = array_replace_recursive($this->enqueueConfig, $config); $this->enqueueConfig['default']['client']['app_name'] = str_replace('.', '', uniqid('app_name', true)); diff --git a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php index 858b80a1c..18375aef3 100644 --- a/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/LazyProducerTest.php @@ -4,7 +4,6 @@ use Enqueue\Bundle\Tests\Functional\App\CustomAppKernel; use Enqueue\Symfony\Client\LazyProducer; -use Symfony\Component\Filesystem\Filesystem; /** * @group functional @@ -17,17 +16,6 @@ protected function setUp(): void // parent::setUp(); } - protected function tearDown(): void - { - if (static::$kernel) { - $fs = new Filesystem(); - $fs->remove(static::$kernel->getLogDir()); - $fs->remove(static::$kernel->getCacheDir()); - } - - parent::tearDown(); - } - public function testShouldAllowGetLazyProducerWithoutError() { $this->customSetUp([ diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index ad278d599..56bec7cb2 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -32,12 +32,6 @@ protected function tearDown(): void $this->getContext()->close(); } - if (static::$kernel) { - $fs = new Filesystem(); - $fs->remove(static::$kernel->getLogDir()); - $fs->remove(static::$kernel->getCacheDir()); - } - parent::tearDown(); } From d209c4a563074fbf44ad42cc94a3dae44b4b718a Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Fri, 15 Nov 2024 11:35:41 +0300 Subject: [PATCH 1128/1142] fix phpstan --- .github/workflows/ci.yml | 4 ++-- .../Symfony/Consumption/ConfigurableConsumeCommandTest.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1f3b500e8..7de6af7d6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M - - run: php ./bin/fix-symfony-version.php "5.4.*" + - run: php ./bin/fix-symfony-version.php "6.2.*" - uses: "ramsey/composer-install@v1" @@ -63,7 +63,7 @@ jobs: extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M - - run: php ./bin/fix-symfony-version.php "5.4.*" + - run: php ./bin/fix-symfony-version.php "6.2.*" - run: composer update --no-progress diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index 84d6dff84..e697b4a31 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -204,7 +204,7 @@ public function testShouldExecuteConsumptionWithSeveralCustomQueues() public function testShouldExecuteConsumptionWhenProcessorImplementsQueueSubscriberInterface() { - $processor = new class implements Processor, QueueSubscriberInterface { + $processor = new class() implements Processor, QueueSubscriberInterface { public function process(InteropMessage $message, Context $context) { } From a8d2c4b8645d6125111e33c194adad4e6bfe8b56 Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Fri, 15 Nov 2024 15:23:39 +0300 Subject: [PATCH 1129/1142] fix code style and php8.2 sf7 dependencies --- .github/workflows/ci.yml | 4 ++-- composer.json | 1 - .../Tests/Functional/App/CustomAppKernel.php | 10 ++-------- .../Tests/Functional/UseCasesTest.php | 13 ++++++------- .../Consumption/ConfigurableConsumeCommandTest.php | 4 ++-- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7de6af7d6..1f3b500e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M - - run: php ./bin/fix-symfony-version.php "6.2.*" + - run: php ./bin/fix-symfony-version.php "5.4.*" - uses: "ramsey/composer-install@v1" @@ -63,7 +63,7 @@ jobs: extensions: mongodb, redis, :xdebug ini-values: memory_limit=2048M - - run: php ./bin/fix-symfony-version.php "6.2.*" + - run: php ./bin/fix-symfony-version.php "5.4.*" - run: composer update --no-progress diff --git a/composer.json b/composer.json index c1abd1b87..29266f343 100644 --- a/composer.json +++ b/composer.json @@ -125,7 +125,6 @@ "ext-amqp": "1.9.3", "ext-gearman": "2.0.3", "ext-rdkafka": "4.0", - "ext-mongodb": "1.5", "ext-bcmath": "1", "ext-mbstring": "1", "ext-mongo": "1.6.14", diff --git a/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php b/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php index 88618d5c3..81d73796e 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/CustomAppKernel.php @@ -7,7 +7,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\HttpKernel\Kernel; -use Symfony\Component\Routing\RouteCollectionBuilder; +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; class CustomAppKernel extends Kernel { @@ -64,9 +64,6 @@ protected function getContainerClass(): string return parent::getContainerClass().'Custom'.$this->enqueueConfigId; } - /** - * {@inheritdoc} - */ protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader) { if (self::VERSION_ID < 60000) { @@ -78,10 +75,7 @@ protected function configureContainer(ContainerBuilder $c, LoaderInterface $load $c->loadFromExtension('enqueue', $this->enqueueConfig); } - /** - * {@inheritdoc} - */ - protected function configureRoutes(RouteCollectionBuilder $routes) + protected function configureRoutes(RoutingConfigurator $routes) { } } diff --git a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php index 56bec7cb2..7417412bd 100644 --- a/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php @@ -11,7 +11,6 @@ use Interop\Queue\Message; use Interop\Queue\Queue; use Symfony\Component\Console\Tester\CommandTester; -use Symfony\Component\Filesystem\Filesystem; /** * @group functional @@ -147,12 +146,12 @@ public function provideEnqueueConfigs() ], ]]; -// -// yield 'gps' => [[ -// 'transport' => [ -// 'dsn' => getenv('GPS_DSN'), -// ], -// ]]; + // + // yield 'gps' => [[ + // 'transport' => [ + // 'dsn' => getenv('GPS_DSN'), + // ], + // ]]; } /** diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index e697b4a31..c448c1cf5 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -204,8 +204,8 @@ public function testShouldExecuteConsumptionWithSeveralCustomQueues() public function testShouldExecuteConsumptionWhenProcessorImplementsQueueSubscriberInterface() { - $processor = new class() implements Processor, QueueSubscriberInterface { - public function process(InteropMessage $message, Context $context) + $processor = new class implements Processor, QueueSubscriberInterface { + public function process(InteropMessage $message, Context $context): void { } From 9570303195549a9201c34ddd6ce503b61092aa0b Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Fri, 15 Nov 2024 20:59:32 +0300 Subject: [PATCH 1130/1142] another tests fixed --- composer.json | 26 +++--- .../ContainerAwareRegistry.php | 29 +++---- .../DependencyInjection/Configuration.php | 5 +- .../Resources/config/services.yml | 4 +- .../Tests/ContainerAwareRegistryTest.php | 38 ++++----- pkg/job-queue/Tests/Functional/Entity/Job.php | 84 ++++--------------- .../Tests/Functional/Entity/JobUnique.php | 12 +-- .../Tests/Functional/app/AppKernel.php | 6 +- .../Tests/Functional/app/config/config.yml | 2 +- 9 files changed, 64 insertions(+), 142 deletions(-) diff --git a/composer.json b/composer.json index 29266f343..5308d33dd 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "phpstan": "bin/phpstan analyse --memory-limit=512M -c phpstan.neon" }, "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "ext-amqp": "^1.9.3|^2.0.0", "ext-gearman": "^2.0", @@ -53,18 +53,18 @@ "phpunit/phpunit": "^9.5", "phpstan/phpstan": "^0.12", "queue-interop/queue-spec": "^0.6.2", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0", + "symfony/browser-kit": "^6.2|^7.0", + "symfony/config": "^6.2|^7.0", + "symfony/process": "^6.2|^7.0", + "symfony/console": "^6.2|^7.0", + "symfony/dependency-injection": "^6.2|^7.0", + "symfony/event-dispatcher": "^6.2|^7.0", + "symfony/expression-language": "^6.2|^7.0", + "symfony/http-kernel": "^^6.2|^7.0", + "symfony/filesystem": "^6.2|^7.0", + "symfony/framework-bundle": "^^6.2|^7.0", + "symfony/validator": "^6.2|^7.0", + "symfony/yaml": "^6.2|^7.0", "empi89/php-amqp-stubs": "*@dev", "doctrine/doctrine-bundle": "^2.3.2", "doctrine/mongodb-odm-bundle": "^3.5|^4.3|^5.0", diff --git a/pkg/async-event-dispatcher/ContainerAwareRegistry.php b/pkg/async-event-dispatcher/ContainerAwareRegistry.php index 2763ed72b..b0e23f222 100644 --- a/pkg/async-event-dispatcher/ContainerAwareRegistry.php +++ b/pkg/async-event-dispatcher/ContainerAwareRegistry.php @@ -2,12 +2,14 @@ namespace Enqueue\AsyncEventDispatcher; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; -use Symfony\Component\DependencyInjection\ContainerAwareTrait; +use Psr\Container\ContainerInterface; -class ContainerAwareRegistry implements Registry, ContainerAwareInterface +class ContainerAwareRegistry implements Registry { - use ContainerAwareTrait; + /** + * @var ContainerInterface + */ + private $container; /** * @var string[] @@ -23,15 +25,13 @@ class ContainerAwareRegistry implements Registry, ContainerAwareInterface * @param string[] $eventsMap [eventName => transformerName] * @param string[] $transformersMap [transformerName => transformerServiceId] */ - public function __construct(array $eventsMap, array $transformersMap) + public function __construct(array $eventsMap, array $transformersMap, ContainerInterface $container) { $this->eventsMap = $eventsMap; $this->transformersMap = $transformersMap; + $this->container = $container; } - /** - * {@inheritdoc} - */ public function getTransformerNameForEvent($eventName) { $transformerName = null; @@ -39,7 +39,7 @@ public function getTransformerNameForEvent($eventName) $transformerName = $this->eventsMap[$eventName]; } else { foreach ($this->eventsMap as $eventNamePattern => $name) { - if ('/' != $eventNamePattern[0]) { + if ('/' !== $eventNamePattern[0]) { continue; } @@ -58,9 +58,6 @@ public function getTransformerNameForEvent($eventName) return $transformerName; } - /** - * {@inheritdoc} - */ public function getTransformer($name) { if (false == array_key_exists($name, $this->transformersMap)) { @@ -69,12 +66,8 @@ public function getTransformer($name) $transformer = $this->container->get($this->transformersMap[$name]); - if (false == $transformer instanceof EventTransformer) { - throw new \LogicException(sprintf( - 'The container must return instance of %s but got %s', - EventTransformer::class, - is_object($transformer) ? get_class($transformer) : gettype($transformer) - )); + if (false == $transformer instanceof EventTransformer) { + throw new \LogicException(sprintf('The container must return instance of %s but got %s', EventTransformer::class, is_object($transformer) ? $transformer::class : gettype($transformer))); } return $transformer; diff --git a/pkg/async-event-dispatcher/DependencyInjection/Configuration.php b/pkg/async-event-dispatcher/DependencyInjection/Configuration.php index 56151e956..7b85a469d 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/Configuration.php +++ b/pkg/async-event-dispatcher/DependencyInjection/Configuration.php @@ -7,10 +7,7 @@ class Configuration implements ConfigurationInterface { - /** - * {@inheritdoc} - */ - public function getConfigTreeBuilder() + public function getConfigTreeBuilder(): TreeBuilder { if (method_exists(TreeBuilder::class, 'getRootNode')) { $tb = new TreeBuilder('enqueue_async_event_dispatcher'); diff --git a/pkg/async-event-dispatcher/Resources/config/services.yml b/pkg/async-event-dispatcher/Resources/config/services.yml index 2b3fbc0b0..67365dcb5 100644 --- a/pkg/async-event-dispatcher/Resources/config/services.yml +++ b/pkg/async-event-dispatcher/Resources/config/services.yml @@ -8,9 +8,7 @@ services: enqueue.events.registry: class: 'Enqueue\AsyncEventDispatcher\ContainerAwareRegistry' public: false - arguments: [[], []] - calls: - - ['setContainer', ['@service_container']] + arguments: [[], [], '@service_container'] enqueue.events.async_listener: class: 'Enqueue\AsyncEventDispatcher\AsyncListener' diff --git a/pkg/async-event-dispatcher/Tests/ContainerAwareRegistryTest.php b/pkg/async-event-dispatcher/Tests/ContainerAwareRegistryTest.php index 3be3b5f3c..79762ac17 100644 --- a/pkg/async-event-dispatcher/Tests/ContainerAwareRegistryTest.php +++ b/pkg/async-event-dispatcher/Tests/ContainerAwareRegistryTest.php @@ -20,37 +20,25 @@ public function testShouldImplementRegistryInterface() $this->assertClassImplements(Registry::class, ContainerAwareRegistry::class); } - public function testCouldBeConstructedWithEventsMapAndTransformersMapAsArguments() - { - new ContainerAwareRegistry([], []); - } - - public function testShouldSetContainerToContainerProperty() + public function testShouldAllowGetTransportNameByEventName() { $container = new Container(); - $registry = new ContainerAwareRegistry([], []); - - $registry->setContainer($container); - - $this->assertAttributeSame($container, 'container', $registry); - } - - public function testShouldAllowGetTransportNameByEventName() - { $registry = new ContainerAwareRegistry([ - 'fooEvent' => 'fooTrans', - ], []); + 'fooEvent' => 'fooTrans', + ], [], $container); $this->assertEquals('fooTrans', $registry->getTransformerNameForEvent('fooEvent')); } public function testShouldAllowDefineTransportNameAsRegExpPattern() { + $container = new Container(); + $registry = new ContainerAwareRegistry([ '/.*/' => 'fooRegExpTrans', 'fooEvent' => 'fooTrans', - ], []); + ], [], $container); // guard $this->assertEquals('fooTrans', $registry->getTransformerNameForEvent('fooEvent')); @@ -60,9 +48,11 @@ public function testShouldAllowDefineTransportNameAsRegExpPattern() public function testThrowIfNotSupportedEventGiven() { + $container = new Container(); + $registry = new ContainerAwareRegistry([ 'fooEvent' => 'fooTrans', - ], []); + ], [], $container); $this->expectException(\LogicException::class); $this->expectExceptionMessage('There is no transformer registered for the given event fooNotSupportedEvent'); @@ -71,9 +61,11 @@ public function testThrowIfNotSupportedEventGiven() public function testThrowIfThereIsNoRegisteredTransformerWithSuchName() { + $container = new Container(); + $registry = new ContainerAwareRegistry([], [ 'fooTrans' => 'foo_trans_id', - ]); + ], $container); $this->expectException(\LogicException::class); $this->expectExceptionMessage('There is no transformer named fooNotRegisteredName'); @@ -87,8 +79,7 @@ public function testThrowIfContainerReturnsServiceNotInstanceOfEventTransformer( $registry = new ContainerAwareRegistry([], [ 'fooTrans' => 'foo_trans_id', - ]); - $registry->setContainer($container); + ], $container); $this->expectException(\LogicException::class); $this->expectExceptionMessage('The container must return instance of Enqueue\AsyncEventDispatcher\EventTransformer but got stdClass'); @@ -104,8 +95,7 @@ public function testShouldReturnEventTransformer() $registry = new ContainerAwareRegistry([], [ 'fooTrans' => 'foo_trans_id', - ]); - $registry->setContainer($container); + ], $container); $this->assertSame($eventTransformerMock, $registry->getTransformer('fooTrans')); } diff --git a/pkg/job-queue/Tests/Functional/Entity/Job.php b/pkg/job-queue/Tests/Functional/Entity/Job.php index ccbf4fda9..ad90e58a0 100644 --- a/pkg/job-queue/Tests/Functional/Entity/Job.php +++ b/pkg/job-queue/Tests/Functional/Entity/Job.php @@ -6,97 +6,47 @@ use Doctrine\ORM\Mapping as ORM; use Enqueue\JobQueue\Job as BaseJob; -/** - * @ORM\Entity - * @ORM\Table(name="enqueue_job_queue") - */ +#[ORM\Entity] +#[ORM\Table(name: 'enqueue_job_queue')] class Job extends BaseJob { - /** - * @var int - * - * @ORM\Column(name="id", type="integer") - * @ORM\Id - * @ORM\GeneratedValue(strategy="AUTO") - */ + #[ORM\Column(name: 'id', type: 'integer')] + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'AUTO')] protected $id; - /** - * @var string - * - * @ORM\Column(name="owner_id", type="string", nullable=true) - */ + #[ORM\Column(name: 'owner_id', type: 'string', nullable: true)] protected $ownerId; - /** - * @var string - * - * @ORM\Column(name="name", type="string", nullable=false) - */ + #[ORM\Column(name: 'name', type: 'string', nullable: false)] protected $name; - /** - * @var string - * - * @ORM\Column(name="status", type="string", nullable=false) - */ + #[ORM\Column(name: 'status', type: 'string', nullable: false)] protected $status; - /** - * @var bool - * - * @ORM\Column(name="interrupted", type="boolean") - */ + #[ORM\Column(name: 'interrupted', type: 'boolean')] protected $interrupted; - /** - * @var bool; - * - * @ORM\Column(name="`unique`", type="boolean") - */ + #[ORM\Column(name: '`unique`', type: 'boolean')] protected $unique; - /** - * @var Job - * - * @ORM\ManyToOne(targetEntity="Job", inversedBy="childJobs") - * @ORM\JoinColumn(name="root_job_id", referencedColumnName="id", onDelete="CASCADE") - */ + #[ORM\ManyToOne(targetEntity: 'Job', inversedBy: 'childJobs')] + #[ORM\JoinColumn(name: 'root_job_id', referencedColumnName: 'id', onDelete: 'CASCADE')] protected $rootJob; - /** - * @var Job[] - * - * @ORM\OneToMany(targetEntity="Job", mappedBy="rootJob") - */ + #[ORM\OneToMany(mappedBy: 'rootJob', targetEntity: 'Job')] protected $childJobs; - /** - * @var \DateTime - * - * @ORM\Column(name="created_at", type="datetime", nullable=false) - */ + #[ORM\Column(name: 'created_at', type: 'datetime', nullable: false)] protected $createdAt; - /** - * @var \DateTime - * - * @ORM\Column(name="started_at", type="datetime", nullable=true) - */ + #[ORM\Column(name: 'started_at', type: 'datetime', nullable: true)] protected $startedAt; - /** - * @var \DateTime - * - * @ORM\Column(name="stopped_at", type="datetime", nullable=true) - */ + #[ORM\Column(name: 'stopped_at', type: 'datetime', nullable: true)] protected $stoppedAt; - /** - * @var array - * - * @ORM\Column(name="data", type="json", nullable=true) - */ + #[ORM\Column(name: 'data', type: 'json', nullable: true)] protected $data; public function __construct() diff --git a/pkg/job-queue/Tests/Functional/Entity/JobUnique.php b/pkg/job-queue/Tests/Functional/Entity/JobUnique.php index 4d8a33745..6d10ea2a5 100644 --- a/pkg/job-queue/Tests/Functional/Entity/JobUnique.php +++ b/pkg/job-queue/Tests/Functional/Entity/JobUnique.php @@ -4,15 +4,11 @@ use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity - * @ORM\Table(name="enqueue_job_queue_unique") - */ +#[ORM\Entity] +#[ORM\Table(name: 'enqueue_job_queue_unique')] class JobUnique { - /** - * @ORM\Id - * @ORM\Column(name="name", type="string", nullable=false) - */ + #[ORM\Id] + #[ORM\Column(name: 'name', type: 'string', nullable: false)] protected $name; } diff --git a/pkg/job-queue/Tests/Functional/app/AppKernel.php b/pkg/job-queue/Tests/Functional/app/AppKernel.php index 3cef602c2..b51969f68 100644 --- a/pkg/job-queue/Tests/Functional/app/AppKernel.php +++ b/pkg/job-queue/Tests/Functional/app/AppKernel.php @@ -1,7 +1,5 @@ Date: Mon, 18 Nov 2024 11:15:26 +0300 Subject: [PATCH 1131/1142] fix deprecations --- composer.json | 6 +++--- phpstan.neon | 2 +- .../DependencyInjection/EnqueueExtension.php | 2 +- .../Profiler/AbstractMessageQueueCollector.php | 10 +--------- pkg/enqueue-bundle/Profiler/MessageQueueCollector.php | 3 +-- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/composer.json b/composer.json index 5308d33dd..e1f64ca02 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "require-dev": { "ext-pcntl": "*", "phpunit/phpunit": "^9.5", - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "^1.0", "queue-interop/queue-spec": "^0.6.2", "symfony/browser-kit": "^6.2|^7.0", "symfony/config": "^6.2|^7.0", @@ -60,9 +60,9 @@ "symfony/dependency-injection": "^6.2|^7.0", "symfony/event-dispatcher": "^6.2|^7.0", "symfony/expression-language": "^6.2|^7.0", - "symfony/http-kernel": "^^6.2|^7.0", + "symfony/http-kernel": "^6.2|^7.0", "symfony/filesystem": "^6.2|^7.0", - "symfony/framework-bundle": "^^6.2|^7.0", + "symfony/framework-bundle": "^6.2|^7.0", "symfony/validator": "^6.2|^7.0", "symfony/yaml": "^6.2|^7.0", "empi89/php-amqp-stubs": "*@dev", diff --git a/phpstan.neon b/phpstan.neon index 3bd6187d9..88be8a7e1 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,5 +1,5 @@ parameters: - excludes_analyse: + excludePaths: - docs - bin - docker diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index c5dbbbc96..96fca6fde 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -22,10 +22,10 @@ use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\HttpKernel\DependencyInjection\Extension; final class EnqueueExtension extends Extension implements PrependExtensionInterface { diff --git a/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php b/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php index 323d146d1..e2e5eee5a 100644 --- a/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php +++ b/pkg/enqueue-bundle/Profiler/AbstractMessageQueueCollector.php @@ -59,8 +59,6 @@ public function prettyPrintPriority($priority) } /** - * @param mixed $body - * * @return string */ public function ensureString($body) @@ -68,18 +66,12 @@ public function ensureString($body) return is_string($body) ? $body : JSON::encode($body); } - /** - * {@inheritdoc} - */ public function getName(): string { return 'enqueue.message_queue'; } - /** - * {@inheritdoc} - */ - public function reset() + public function reset(): void { $this->data = []; } diff --git a/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php b/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php index 7fc6699c5..3c484a7d1 100644 --- a/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php +++ b/pkg/enqueue-bundle/Profiler/MessageQueueCollector.php @@ -4,11 +4,10 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Throwable; class MessageQueueCollector extends AbstractMessageQueueCollector { - public function collect(Request $request, Response $response, Throwable $exception = null) + public function collect(Request $request, Response $response, ?\Throwable $exception = null): void { $this->collectInternal($request, $response); } From 60ff029966772326902d851689653511e547be0d Mon Sep 17 00:00:00 2001 From: Viktor Zavitkov Date: Mon, 18 Nov 2024 11:28:10 +0300 Subject: [PATCH 1132/1142] fix test --- .../Tests/Unit/DependencyInjection/EnqueueExtensionTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index 51bbaa26d..3b8d0426d 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -13,8 +13,8 @@ use Enqueue\Test\ClassExtensionTrait; use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\HttpKernel\DependencyInjection\Extension; class EnqueueExtensionTest extends TestCase { @@ -22,12 +22,12 @@ class EnqueueExtensionTest extends TestCase public function testShouldImplementConfigurationInterface() { - self::assertClassExtends(Extension::class, EnqueueExtension::class); + $this->assertClassExtends(Extension::class, EnqueueExtension::class); } public function testShouldBeFinal() { - self::assertClassFinal(EnqueueExtension::class); + $this->assertClassFinal(EnqueueExtension::class); } public function testCouldBeConstructedWithoutAnyArguments() From 48d330371e837f1d45d1e748d66130968b124ca8 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 30 Nov 2024 14:31:48 +0200 Subject: [PATCH 1133/1142] upd changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d592f71cb..4643cc9c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## [0.10.24](https://github.com/php-enqueue/enqueue-dev/tree/0.10.24) (2024-11-30) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.23...0.10.24) + +**Merged pull requests:** + +- SF7 deprecations fix [\#1364](https://github.com/php-enqueue/enqueue-dev/pull/1364) ([zavitkov](https://github.com/zavitkov)) +- add symfony 7 support for enqueue-bundle [\#1362](https://github.com/php-enqueue/enqueue-dev/pull/1362) ([zavitkov](https://github.com/zavitkov)) + ## [0.10.23](https://github.com/php-enqueue/enqueue-dev/tree/0.10.23) (2024-10-01) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.22...0.10.23) From a2177a568596fe17fe464aa370c7cb75f969b08d Mon Sep 17 00:00:00 2001 From: James Read Date: Sat, 11 Jan 2025 20:47:49 +0000 Subject: [PATCH 1134/1142] Fixing risky tests Makring tests that have no assertions with the annotation to suppress phpunits warning around risky tests closes 1370 --- pkg/amqp-bunny/Tests/AmqpConsumerTest.php | 3 +++ pkg/amqp-bunny/Tests/AmqpProducerTest.php | 4 ++++ pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php | 3 +++ pkg/amqp-ext/Tests/AmqpConsumerTest.php | 3 +++ pkg/amqp-ext/Tests/AmqpContextTest.php | 6 ++++++ pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php | 3 +++ pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php | 3 +++ .../Tests/PhpSerializerEventTransformerTest.php | 3 +++ pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php | 3 +++ pkg/dbal/Tests/DbalConsumerTest.php | 3 +++ pkg/dbal/Tests/DbalContextTest.php | 3 +++ pkg/dbal/Tests/DbalProducerTest.php | 3 +++ pkg/dbal/Tests/DbalSubscriptionConsumerTest.php | 6 ++++++ pkg/dsn/Tests/DsnTest.php | 3 +++ .../Extension/DoctrineClearIdentityMapExtensionTest.php | 3 +++ .../Extension/DoctrinePingConnectionExtensionTest.php | 3 +++ .../Consumption/Extension/ResetServicesExtensionTest.php | 3 +++ .../Tests/Unit/DependencyInjection/ConfigurationTest.php | 3 +++ .../Unit/DependencyInjection/EnqueueExtensionTest.php | 3 +++ pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php | 3 +++ .../Tests/Unit/Profiler/MessageQueueCollectorTest.php | 3 +++ pkg/enqueue/Tests/ArrayProcessorRegistryTest.php | 3 +++ pkg/enqueue/Tests/Client/ChainExtensionTest.php | 3 +++ .../DelayRedeliveredMessageExtensionTest.php | 3 +++ .../ExclusiveCommandExtensionTest.php | 3 +++ .../FlushSpoolProducerExtensionTest.php | 3 +++ .../Client/ConsumptionExtension/LogExtensionTest.php | 3 +++ .../SetRouterPropertiesExtensionTest.php | 3 +++ .../ConsumptionExtension/SetupBrokerExtensionTest.php | 3 +++ pkg/enqueue/Tests/Client/DelegateProcessorTest.php | 3 +++ pkg/enqueue/Tests/Client/DriverFactoryTest.php | 3 +++ pkg/enqueue/Tests/Client/DriverPreSendTest.php | 3 +++ .../Tests/Client/Extension/PrepareBodyExtensionTest.php | 3 +++ pkg/enqueue/Tests/Client/PostSendTest.php | 3 +++ pkg/enqueue/Tests/Client/PreSendTest.php | 3 +++ pkg/enqueue/Tests/Client/ProducerTest.php | 6 ++++++ pkg/enqueue/Tests/Client/SpoolProducerTest.php | 3 +++ pkg/enqueue/Tests/Client/TraceableProducerTest.php | 3 +++ pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php | 9 +++++++++ pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php | 3 +++ pkg/enqueue/Tests/Consumption/ChainExtensionTest.php | 3 +++ .../IllegalContextModificationExceptionTest.php | 3 +++ .../Exception/InvalidArgumentExceptionTest.php | 6 ++++++ .../Tests/Consumption/Exception/LogicExceptionTest.php | 3 +++ .../Extension/LimitConsumedMessagesExtensionTest.php | 3 +++ .../Extension/LimitConsumerMemoryExtensionTest.php | 3 +++ .../Extension/LimitConsumptionTimeExtensionTest.php | 3 +++ .../Tests/Consumption/Extension/LogExtensionTest.php | 3 +++ .../Tests/Consumption/Extension/LoggerExtensionTest.php | 3 +++ .../Consumption/Extension/NicenessExtensionTest.php | 3 +++ .../Tests/Consumption/Extension/ReplyExtensionTest.php | 3 +++ .../Consumption/FallbackSubscriptionConsumerTest.php | 6 ++++++ pkg/enqueue/Tests/Consumption/QueueConsumerTest.php | 9 +++++++++ .../Tests/Router/RouteRecipientListProcessorTest.php | 3 +++ pkg/enqueue/Tests/Rpc/RpcClientTest.php | 3 +++ pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php | 3 +++ .../AnalyzeRouteCollectionPassTest.php | 3 +++ .../BuildClientExtensionsPassTest.php | 3 +++ .../BuildCommandSubscriberRoutesPassTest.php | 3 +++ .../BuildConsumptionExtensionsPassTest.php | 3 +++ .../BuildProcessorRegistryPassTest.php | 3 +++ .../DependencyInjection/BuildProcessorRoutesPassTest.php | 3 +++ .../BuildTopicSubscriberRoutesPassTest.php | 3 +++ .../Symfony/Client/FlushSpoolProducerListenerTest.php | 3 +++ pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php | 3 +++ pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php | 3 +++ .../Tests/Symfony/Client/SetupBrokerCommandTest.php | 3 +++ .../Tests/Symfony/Client/SimpleConsumeCommandTest.php | 3 +++ .../Tests/Symfony/Client/SimpleProduceCommandTest.php | 3 +++ .../Tests/Symfony/Client/SimpleRoutesCommandTest.php | 3 +++ .../Symfony/Client/SimpleSetupBrokerCommandTest.php | 3 +++ .../Consumption/ConfigurableConsumeCommandTest.php | 3 +++ .../Tests/Symfony/Consumption/ConsumeCommandTest.php | 3 +++ .../Symfony/Consumption/SimpleConsumeCommandTest.php | 3 +++ .../Tests/Symfony/ContainerProcessorRegistryTest.php | 3 +++ .../BuildConsumptionExtensionsPassTest.php | 3 +++ .../BuildProcessorRegistryPassTest.php | 3 +++ pkg/enqueue/Tests/Symfony/LazyProducerTest.php | 3 +++ pkg/enqueue/Tests/Util/VarExportTest.php | 3 +++ pkg/fs/Tests/FsConsumerTest.php | 9 +++++++++ pkg/fs/Tests/FsContextTest.php | 6 ++++++ pkg/fs/Tests/FsProducerTest.php | 3 +++ pkg/gearman/Tests/GearmanContextTest.php | 3 +++ pkg/gearman/Tests/GearmanProducerTest.php | 3 +++ .../Tests/CalculateRootJobStatusProcessorTest.php | 3 +++ .../Tests/CalculateRootJobStatusServiceTest.php | 3 +++ pkg/job-queue/Tests/DependentJobContextTest.php | 3 +++ pkg/job-queue/Tests/DependentJobServiceTest.php | 3 +++ pkg/job-queue/Tests/Doctrine/JobStorageTest.php | 3 +++ pkg/job-queue/Tests/JobProcessorTest.php | 3 +++ pkg/mongodb/Tests/MongodbConsumerTest.php | 6 ++++++ pkg/mongodb/Tests/MongodbContextTest.php | 3 +++ pkg/mongodb/Tests/MongodbProducerTest.php | 3 +++ pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php | 6 ++++++ pkg/null/Tests/NullConnectionFactoryTest.php | 3 +++ pkg/null/Tests/NullConsumerTest.php | 9 +++++++++ pkg/null/Tests/NullContextTest.php | 3 +++ pkg/null/Tests/NullProducerTest.php | 6 ++++++ pkg/null/Tests/NullQueueTest.php | 3 +++ pkg/null/Tests/NullTopicTest.php | 3 +++ pkg/pheanstalk/Tests/PheanstalkConsumerTest.php | 3 +++ pkg/pheanstalk/Tests/PheanstalkContextTest.php | 3 +++ pkg/pheanstalk/Tests/PheanstalkProducerTest.php | 3 +++ pkg/rdkafka/Tests/JsonSerializerTest.php | 3 +++ pkg/rdkafka/Tests/RdKafkaConsumerTest.php | 3 +++ pkg/rdkafka/Tests/RdKafkaProducerTest.php | 3 +++ pkg/redis/Tests/RedisConsumerTest.php | 3 +++ pkg/redis/Tests/RedisContextTest.php | 6 ++++++ pkg/redis/Tests/RedisProducerTest.php | 3 +++ pkg/redis/Tests/RedisSubscriptionConsumerTest.php | 6 ++++++ pkg/redis/Tests/Spec/JsonSerializerTest.php | 3 +++ pkg/sns/Tests/SnsProducerTest.php | 3 +++ pkg/snsqs/Tests/SnsQsProducerTest.php | 3 +++ pkg/sqs/Tests/SqsConsumerTest.php | 3 +++ pkg/sqs/Tests/SqsContextTest.php | 3 +++ pkg/sqs/Tests/SqsProducerTest.php | 3 +++ pkg/stomp/Tests/BufferedStompClientTest.php | 3 +++ pkg/stomp/Tests/StompConsumerTest.php | 3 +++ pkg/stomp/Tests/StompContextTest.php | 6 ++++++ pkg/wamp/Tests/Spec/JsonSerializerTest.php | 3 +++ 120 files changed, 421 insertions(+) diff --git a/pkg/amqp-bunny/Tests/AmqpConsumerTest.php b/pkg/amqp-bunny/Tests/AmqpConsumerTest.php index a588c2e56..da6c40652 100644 --- a/pkg/amqp-bunny/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpConsumerTest.php @@ -27,6 +27,9 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, AmqpConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContextAndQueueAsArguments() { new AmqpConsumer($this->createContextMock(), new AmqpQueue('aName')); diff --git a/pkg/amqp-bunny/Tests/AmqpProducerTest.php b/pkg/amqp-bunny/Tests/AmqpProducerTest.php index e9244297c..a7ca055fd 100644 --- a/pkg/amqp-bunny/Tests/AmqpProducerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpProducerTest.php @@ -24,6 +24,10 @@ class AmqpProducerTest extends TestCase { use ClassExtensionTrait; + /** + * @doesNotPerformAssertions + */ + public function testCouldBeConstructedWithRequiredArguments() { new AmqpProducer($this->createBunnyChannelMock(), $this->createContextMock()); diff --git a/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php index c1d056268..cc2ac9a54 100644 --- a/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php @@ -17,6 +17,9 @@ public function testShouldImplementQueueInteropSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithAmqpContextAsFirstArgument() { new AmqpSubscriptionConsumer($this->createAmqpContextMock()); diff --git a/pkg/amqp-ext/Tests/AmqpConsumerTest.php b/pkg/amqp-ext/Tests/AmqpConsumerTest.php index 75c49cf01..470c49c86 100644 --- a/pkg/amqp-ext/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-ext/Tests/AmqpConsumerTest.php @@ -19,6 +19,9 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, AmqpConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContextAndQueueAsArguments() { new AmqpConsumer($this->createContext(), new AmqpQueue('aName')); diff --git a/pkg/amqp-ext/Tests/AmqpContextTest.php b/pkg/amqp-ext/Tests/AmqpContextTest.php index 4c4ab4298..4b42827ba 100644 --- a/pkg/amqp-ext/Tests/AmqpContextTest.php +++ b/pkg/amqp-ext/Tests/AmqpContextTest.php @@ -28,11 +28,17 @@ public function testShouldImplementQueueInteropContextInterface() $this->assertClassImplements(Context::class, AmqpContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExtChannelAsFirstArgument() { new AmqpContext($this->createExtChannelMock()); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExtChannelCallbackFactoryAsFirstArgument() { new AmqpContext(function () { diff --git a/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php index 153fe275e..8ba08161b 100644 --- a/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php @@ -17,6 +17,9 @@ public function testShouldImplementQueueInteropSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithAmqpContextAsFirstArgument() { new AmqpSubscriptionConsumer($this->createAmqpContextMock()); diff --git a/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php b/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php index 7237c9ae2..9bf294194 100644 --- a/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php +++ b/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php @@ -24,6 +24,9 @@ public function testShouldImplementProcessorInterface() $this->assertClassImplements(Processor::class, AsyncProcessor::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRegistryAndProxyEventDispatcher() { new AsyncProcessor($this->createRegistryMock(), $this->createProxyEventDispatcherMock()); diff --git a/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php b/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php index 49f3a9371..04d9f2dc6 100644 --- a/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php +++ b/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php @@ -21,6 +21,9 @@ public function testShouldImplementEventTransformerInterface() $this->assertClassImplements(EventTransformer::class, PhpSerializerEventTransformer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new PhpSerializerEventTransformer($this->createContextStub()); diff --git a/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php b/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php index 328ed1780..52d6f1694 100644 --- a/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php +++ b/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php @@ -18,6 +18,9 @@ public function testShouldImplementRegistryInterface() $this->assertClassImplements(Registry::class, SimpleRegistry::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithEventsMapAndTransformersMapAsArguments() { new SimpleRegistry([], []); diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index d36333c83..7c2bbbc03 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -28,6 +28,9 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, DbalConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new DbalConsumer($this->createContextMock(), new DbalDestination('queue')); diff --git a/pkg/dbal/Tests/DbalContextTest.php b/pkg/dbal/Tests/DbalContextTest.php index 12a13b21a..6c0cc2878 100644 --- a/pkg/dbal/Tests/DbalContextTest.php +++ b/pkg/dbal/Tests/DbalContextTest.php @@ -27,6 +27,9 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, DbalContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new DbalContext($this->createConnectionMock()); diff --git a/pkg/dbal/Tests/DbalProducerTest.php b/pkg/dbal/Tests/DbalProducerTest.php index 4dcb015e3..f7800bc56 100644 --- a/pkg/dbal/Tests/DbalProducerTest.php +++ b/pkg/dbal/Tests/DbalProducerTest.php @@ -21,6 +21,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, DbalProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new DbalProducer($this->createContextMock()); diff --git a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php index a3fad6e66..9c372de82 100644 --- a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php +++ b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php @@ -25,6 +25,9 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithDbalContextAsFirstArgument() { new DbalSubscriptionConsumer($this->createDbalContextMock()); @@ -66,6 +69,9 @@ public function testThrowsIfTrySubscribeAnotherConsumerToAlreadySubscribedQueue( $subscriptionConsumer->subscribe($barConsumer, $barCallback); } + /** + * @doesNotPerformAssertions + */ public function testShouldAllowSubscribeSameConsumerAndCallbackSecondTime() { $subscriptionConsumer = new DbalSubscriptionConsumer($this->createDbalContextMock()); diff --git a/pkg/dsn/Tests/DsnTest.php b/pkg/dsn/Tests/DsnTest.php index 0bcd7d43a..f693fce04 100644 --- a/pkg/dsn/Tests/DsnTest.php +++ b/pkg/dsn/Tests/DsnTest.php @@ -8,6 +8,9 @@ class DsnTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithDsnAsFirstArgument() { Dsn::parseFirst('foo://localhost:1234'); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php index 604012e78..bf8c9a8b3 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php @@ -16,6 +16,9 @@ class DoctrineClearIdentityMapExtensionTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new DoctrineClearIdentityMapExtension($this->createRegistryMock()); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index c530eeaa9..b842b766d 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -17,6 +17,9 @@ class DoctrinePingConnectionExtensionTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredAttributes() { new DoctrinePingConnectionExtension($this->createRegistryMock()); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php index 18e94f251..1feba7a9f 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php @@ -16,6 +16,9 @@ class ResetServicesExtensionTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new ResetServicesExtension($this->createResetterMock()); diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index c9356f1ec..746874017 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -25,6 +25,9 @@ public function testShouldBeFinal() $this->assertClassFinal(Configuration::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithDebugAsArgument() { new Configuration(true); diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index 3b8d0426d..9a20f9966 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -30,6 +30,9 @@ public function testShouldBeFinal() $this->assertClassFinal(EnqueueExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new EnqueueExtension(); diff --git a/pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php b/pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php index d93a1f1f9..13776ede4 100644 --- a/pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php @@ -16,6 +16,9 @@ public function testShouldExtendBundleClass() $this->assertClassExtends(Bundle::class, EnqueueBundle::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new EnqueueBundle(); diff --git a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php index 55f415d03..12700be60 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php @@ -23,6 +23,9 @@ public function testShouldExtendDataCollectorClass() $this->assertClassExtends(DataCollector::class, MessageQueueCollector::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithEmptyConstructor() { new MessageQueueCollector(); diff --git a/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php b/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php index 897276d62..c0937547d 100644 --- a/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php @@ -18,6 +18,9 @@ public function testShouldImplementProcessorRegistryInterface() $this->assertClassImplements(ProcessorRegistryInterface::class, ArrayProcessorRegistry::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArgument() { new ArrayProcessorRegistry(); diff --git a/pkg/enqueue/Tests/Client/ChainExtensionTest.php b/pkg/enqueue/Tests/Client/ChainExtensionTest.php index a59005bc1..c5dc60451 100644 --- a/pkg/enqueue/Tests/Client/ChainExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ChainExtensionTest.php @@ -29,6 +29,9 @@ public function testShouldBeFinal() $this->assertClassFinal(ChainExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExtensionsArray() { new ChainExtension([$this->createExtension(), $this->createExtension()]); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php index 0481d27d8..6d502461f 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php @@ -23,6 +23,9 @@ class DelayRedeliveredMessageExtensionTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new DelayRedeliveredMessageExtension($this->createDriverMock(), 12345); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php index dc2c00c96..9a2270d4a 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php @@ -34,6 +34,9 @@ public function testShouldBeFinal() $this->assertClassFinal(ExclusiveCommandExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithDriverAsFirstArgument() { new ExclusiveCommandExtension($this->createDriverStub()); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php index 63fb50c5a..d69969b78 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php @@ -30,6 +30,9 @@ public function testShouldImplementEndExtensionInterface() $this->assertClassImplements(EndExtensionInterface::class, FlushSpoolProducerExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithSpoolProducerAsFirstArgument() { new FlushSpoolProducerExtension($this->createSpoolProducerMock()); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php index 063ea23af..fe9e6ab0c 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php @@ -55,6 +55,9 @@ public function testShouldSubClassOfLogExtension() $this->assertClassExtends(\Enqueue\Consumption\Extension\LogExtension::class, LogExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new LogExtension(); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php index e5015ff45..5337d0495 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php @@ -27,6 +27,9 @@ public function testShouldImplementMessageReceivedExtensionInterface() $this->assertClassImplements(MessageReceivedExtensionInterface::class, SetRouterPropertiesExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new SetRouterPropertiesExtension($this->createDriverMock()); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php index 4b241aa0e..a72ae389a 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php @@ -21,6 +21,9 @@ public function testShouldImplementStartExtensionInterface() $this->assertClassImplements(StartExtensionInterface::class, SetupBrokerExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new SetupBrokerExtension($this->createDriverMock()); diff --git a/pkg/enqueue/Tests/Client/DelegateProcessorTest.php b/pkg/enqueue/Tests/Client/DelegateProcessorTest.php index 40ef17989..f9bd83ebf 100644 --- a/pkg/enqueue/Tests/Client/DelegateProcessorTest.php +++ b/pkg/enqueue/Tests/Client/DelegateProcessorTest.php @@ -13,6 +13,9 @@ class DelegateProcessorTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new DelegateProcessor($this->createProcessorRegistryMock()); diff --git a/pkg/enqueue/Tests/Client/DriverFactoryTest.php b/pkg/enqueue/Tests/Client/DriverFactoryTest.php index cce6311e5..605358aa3 100644 --- a/pkg/enqueue/Tests/Client/DriverFactoryTest.php +++ b/pkg/enqueue/Tests/Client/DriverFactoryTest.php @@ -61,6 +61,9 @@ public function testShouldBeFinal() $this->assertTrue($rc->isFinal()); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new DriverFactory(); diff --git a/pkg/enqueue/Tests/Client/DriverPreSendTest.php b/pkg/enqueue/Tests/Client/DriverPreSendTest.php index 85686b4c1..f3c1ee375 100644 --- a/pkg/enqueue/Tests/Client/DriverPreSendTest.php +++ b/pkg/enqueue/Tests/Client/DriverPreSendTest.php @@ -19,6 +19,9 @@ public function testShouldBeFinal() self::assertClassFinal(DriverPreSend::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExpectedArguments() { new DriverPreSend( diff --git a/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php b/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php index 454034abb..81b29e801 100644 --- a/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php +++ b/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php @@ -22,6 +22,9 @@ public function testShouldImplementExtensionInterface() $this->assertTrue($rc->implementsInterface(PreSendCommandExtensionInterface::class)); } + /** + * @doesNotPerformAssertions + */ public function testCouldConstructedWithoutAnyArguments() { new PrepareBodyExtension(); diff --git a/pkg/enqueue/Tests/Client/PostSendTest.php b/pkg/enqueue/Tests/Client/PostSendTest.php index 04927700c..9eb845e49 100644 --- a/pkg/enqueue/Tests/Client/PostSendTest.php +++ b/pkg/enqueue/Tests/Client/PostSendTest.php @@ -21,6 +21,9 @@ public function testShouldBeFinal() self::assertClassFinal(PostSend::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExpectedArguments() { new PostSend( diff --git a/pkg/enqueue/Tests/Client/PreSendTest.php b/pkg/enqueue/Tests/Client/PreSendTest.php index 408be1c69..40dffafa2 100644 --- a/pkg/enqueue/Tests/Client/PreSendTest.php +++ b/pkg/enqueue/Tests/Client/PreSendTest.php @@ -18,6 +18,9 @@ public function testShouldBeFinal() self::assertClassFinal(PreSend::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExpectedArguments() { new PreSend( diff --git a/pkg/enqueue/Tests/Client/ProducerTest.php b/pkg/enqueue/Tests/Client/ProducerTest.php index 558e70ee6..38dd1f075 100644 --- a/pkg/enqueue/Tests/Client/ProducerTest.php +++ b/pkg/enqueue/Tests/Client/ProducerTest.php @@ -24,11 +24,17 @@ public function testShouldBeFinal() self::assertClassFinal(Producer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new Producer($this->createDriverMock(), $this->createRpcFactoryMock()); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithOptionalArguments() { new Producer( diff --git a/pkg/enqueue/Tests/Client/SpoolProducerTest.php b/pkg/enqueue/Tests/Client/SpoolProducerTest.php index 024fd6da2..511b91edb 100644 --- a/pkg/enqueue/Tests/Client/SpoolProducerTest.php +++ b/pkg/enqueue/Tests/Client/SpoolProducerTest.php @@ -18,6 +18,9 @@ public function testShouldImplementProducerInterface() self::assertClassImplements(ProducerInterface::class, SpoolProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRealProducer() { new SpoolProducer($this->createProducerMock()); diff --git a/pkg/enqueue/Tests/Client/TraceableProducerTest.php b/pkg/enqueue/Tests/Client/TraceableProducerTest.php index ac0a52961..3ce23f89a 100644 --- a/pkg/enqueue/Tests/Client/TraceableProducerTest.php +++ b/pkg/enqueue/Tests/Client/TraceableProducerTest.php @@ -18,6 +18,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(ProducerInterface::class, TraceableProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithInternalMessageProducer() { new TraceableProducer($this->createProducerMock()); diff --git a/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php b/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php index 3fb4fb57b..c522c6334 100644 --- a/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php +++ b/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php @@ -37,11 +37,17 @@ public function testShouldBeFinal() $this->assertTrue($rc->isFinal()); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new ConnectionFactoryFactory(); } + /** + * @doesNotPerformAssertions + */ public function testShouldAcceptStringDSN() { $factory = new ConnectionFactoryFactory(); @@ -49,6 +55,9 @@ public function testShouldAcceptStringDSN() $factory->create('null:'); } + /** + * @doesNotPerformAssertions + */ public function testShouldAcceptArrayWithDsnKey() { $factory = new ConnectionFactoryFactory(); diff --git a/pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php b/pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php index f134cfe9f..9cafdb885 100644 --- a/pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php +++ b/pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php @@ -18,6 +18,9 @@ public function testShouldImplementProcessorInterface() $this->assertClassImplements(Processor::class, CallbackProcessor::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithCallableAsArgument() { new CallbackProcessor(function () { diff --git a/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php b/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php index 23bd4f979..c19cc2f20 100644 --- a/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php @@ -33,6 +33,9 @@ public function testShouldImplementExtensionInterface() $this->assertClassImplements(ExtensionInterface::class, ChainExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExtensionsArray() { new ChainExtension([$this->createExtension(), $this->createExtension()]); diff --git a/pkg/enqueue/Tests/Consumption/Exception/IllegalContextModificationExceptionTest.php b/pkg/enqueue/Tests/Consumption/Exception/IllegalContextModificationExceptionTest.php index 0885b500e..5de5c2f05 100644 --- a/pkg/enqueue/Tests/Consumption/Exception/IllegalContextModificationExceptionTest.php +++ b/pkg/enqueue/Tests/Consumption/Exception/IllegalContextModificationExceptionTest.php @@ -21,6 +21,9 @@ public function testShouldExtendLogicException() $this->assertClassExtends(\LogicException::class, IllegalContextModificationException::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new IllegalContextModificationException(); diff --git a/pkg/enqueue/Tests/Consumption/Exception/InvalidArgumentExceptionTest.php b/pkg/enqueue/Tests/Consumption/Exception/InvalidArgumentExceptionTest.php index 296c76225..cc2ca3122 100644 --- a/pkg/enqueue/Tests/Consumption/Exception/InvalidArgumentExceptionTest.php +++ b/pkg/enqueue/Tests/Consumption/Exception/InvalidArgumentExceptionTest.php @@ -21,6 +21,9 @@ public function testShouldExtendLogicException() $this->assertClassExtends(\LogicException::class, InvalidArgumentException::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new InvalidArgumentException(); @@ -36,6 +39,9 @@ public function testThrowIfAssertInstanceOfNotSameAsExpected() InvalidArgumentException::assertInstanceOf(new \SplStack(), \SplQueue::class); } + /** + * @doesNotPerformAssertions + */ public function testShouldDoNothingIfAssertDestinationInstanceOfSameAsExpected() { InvalidArgumentException::assertInstanceOf(new \SplQueue(), \SplQueue::class); diff --git a/pkg/enqueue/Tests/Consumption/Exception/LogicExceptionTest.php b/pkg/enqueue/Tests/Consumption/Exception/LogicExceptionTest.php index ddd258098..f7a68c9a9 100644 --- a/pkg/enqueue/Tests/Consumption/Exception/LogicExceptionTest.php +++ b/pkg/enqueue/Tests/Consumption/Exception/LogicExceptionTest.php @@ -21,6 +21,9 @@ public function testShouldExtendLogicException() $this->assertClassExtends(\LogicException::class, LogicException::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new LogicException(); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php index e1d4c50cd..15d221409 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php @@ -16,6 +16,9 @@ class LimitConsumedMessagesExtensionTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new LimitConsumedMessagesExtension(12345); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php index 5a95486ec..22d33826e 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php @@ -17,6 +17,9 @@ class LimitConsumerMemoryExtensionTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new LimitConsumerMemoryExtension(12345); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php index fa730e384..fbd61d48f 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php @@ -17,6 +17,9 @@ class LimitConsumptionTimeExtensionTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new LimitConsumptionTimeExtension(new \DateTime('+1 day')); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php index 4bc4ae95f..f529dcd4c 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php @@ -49,6 +49,9 @@ public function testShouldImplementPostMessageReceivedExtensionInterface() $this->assertClassImplements(PostMessageReceivedExtensionInterface::class, LogExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new LogExtension(); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php index f3641adf4..227c0830f 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php @@ -20,6 +20,9 @@ public function testShouldImplementInitLoggerExtensionInterface() $this->assertClassImplements(InitLoggerExtensionInterface::class, LoggerExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithLoggerAsFirstArgument() { new LoggerExtension($this->createLogger()); diff --git a/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php index a2937d0ca..15c004db4 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php @@ -11,6 +11,9 @@ class NicenessExtensionTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new NicenessExtension(0); diff --git a/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php index 408895638..3963e94e6 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php @@ -25,6 +25,9 @@ public function testShouldImplementPostMessageReceivedExtensionInterface() $this->assertClassImplements(PostMessageReceivedExtensionInterface::class, ReplyExtension::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new ReplyExtension(); diff --git a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php index 4f8ac7a55..aecf71628 100644 --- a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php @@ -21,6 +21,9 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new FallbackSubscriptionConsumer(); @@ -69,6 +72,9 @@ public function testThrowsIfTrySubscribeAnotherConsumerToAlreadySubscribedQueue( $subscriptionConsumer->subscribe($barConsumer, $barCallback); } + /** + * @doesNotPerformAssertions + */ public function testShouldAllowSubscribeSameConsumerAndCallbackSecondTime() { $subscriptionConsumer = new FallbackSubscriptionConsumer(); diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index ecf7f9afa..ce72cb9d9 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -39,16 +39,25 @@ class QueueConsumerTest extends TestCase { use ReadAttributeTrait; + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithAllArguments() { new QueueConsumer($this->createContextStub(), null, [], null, 0); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContextOnly() { new QueueConsumer($this->createContextStub()); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContextAndSingleExtension() { new QueueConsumer($this->createContextStub(), $this->createExtension()); diff --git a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php index 8a2e089f7..7e38f9616 100644 --- a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php +++ b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php @@ -23,6 +23,9 @@ public function testShouldImplementProcessorInterface() $this->assertClassImplements(Processor::class, RouteRecipientListProcessor::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRouterAsFirstArgument() { new RouteRecipientListProcessor($this->createRecipientListRouterMock()); diff --git a/pkg/enqueue/Tests/Rpc/RpcClientTest.php b/pkg/enqueue/Tests/Rpc/RpcClientTest.php index e2035c4d5..e8a3720b1 100644 --- a/pkg/enqueue/Tests/Rpc/RpcClientTest.php +++ b/pkg/enqueue/Tests/Rpc/RpcClientTest.php @@ -15,6 +15,9 @@ class RpcClientTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContextAsFirstArgument() { new RpcClient($this->createContextMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 8076aaf76..17be30aed 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -40,6 +40,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(ConsumeCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredAttributes() { new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPassTest.php index 8dcffe45a..fc3051b97 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPassTest.php @@ -23,6 +23,9 @@ public function testShouldBeFinal() $this->assertClassFinal(AnalyzeRouteCollectionPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new AnalyzeRouteCollectionPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php index 90c7493c1..baae3c768 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php @@ -25,6 +25,9 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildClientExtensionsPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new BuildClientExtensionsPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php index a2e964dcc..7317a8ef8 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php @@ -29,6 +29,9 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildCommandSubscriberRoutesPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new BuildCommandSubscriberRoutesPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php index a94636261..64966d602 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php @@ -25,6 +25,9 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildConsumptionExtensionsPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new BuildConsumptionExtensionsPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php index 8541f39bf..98679abbd 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -26,6 +26,9 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildProcessorRegistryPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new BuildProcessorRegistryPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php index b2839c466..d4ac29803 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php @@ -25,6 +25,9 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildProcessorRoutesPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new BuildProcessorRoutesPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php index af1c6a37a..0ada6064a 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php @@ -29,6 +29,9 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildTopicSubscriberRoutesPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new BuildTopicSubscriberRoutesPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php b/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php index 3476c101e..feae3b52f 100644 --- a/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php @@ -39,6 +39,9 @@ public function testShouldSubscribeOnConsoleTerminateEvent() $this->assertEquals('flushMessages', $events[ConsoleEvents::TERMINATE]); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithSpoolProducerAsFirstArgument() { new FlushSpoolProducerListener($this->createSpoolProducerMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php index 2efc4769f..b6a1d18a4 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php @@ -27,6 +27,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(ProduceCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContainerAsFirstArgument() { new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); diff --git a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php index c2168c4f8..8adf71064 100644 --- a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php @@ -29,6 +29,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(RoutesCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() { new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); diff --git a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php index 89ca379b5..53a8d4494 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php @@ -26,6 +26,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SetupBrokerCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContainerAsFirstArgument() { new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php index 60d409325..97f1c6c58 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php @@ -29,6 +29,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleConsumeCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredAttributes() { new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php index 2775870b6..50d46c96d 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php @@ -23,6 +23,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleProduceCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContainerAsFirstArgument() { new SimpleProduceCommand($this->createProducerMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php index 356f3f9f4..71bb5cf6b 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php @@ -25,6 +25,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleRoutesCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() { new SimpleRoutesCommand($this->createDriverMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php index 91802ff11..d3e8f2170 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php @@ -23,6 +23,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleSetupBrokerCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContainerAsFirstArgument() { new SimpleSetupBrokerCommand($this->createClientDriverMock()); diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index c448c1cf5..82342e4d6 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -33,6 +33,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(ConfigurableConsumeCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredAttributes() { new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class), 'default'); diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index 3c16cde3d..b56ef68cc 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -35,6 +35,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(ConsumeCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredAttributes() { new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); diff --git a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php index d54a70e58..7648587d6 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php @@ -24,6 +24,9 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleConsumeCommand::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredAttributes() { new SimpleConsumeCommand($this->createQueueConsumerMock()); diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index e0dcf2e09..1370b4df6 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -23,6 +23,9 @@ public function testShouldBeFinal() $this->assertClassFinal(ContainerProcessorRegistry::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContainerAsFirstArgument() { new ContainerProcessorRegistry($this->createContainerMock()); diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php index f16daf08a..c558aaddb 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php @@ -25,6 +25,9 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildConsumptionExtensionsPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new BuildConsumptionExtensionsPass(); diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php index 8d8edc537..e3a333055 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -26,6 +26,9 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildProcessorRegistryPass::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutArguments() { new BuildProcessorRegistryPass(); diff --git a/pkg/enqueue/Tests/Symfony/LazyProducerTest.php b/pkg/enqueue/Tests/Symfony/LazyProducerTest.php index 1b15ce2ce..7fbe714ac 100644 --- a/pkg/enqueue/Tests/Symfony/LazyProducerTest.php +++ b/pkg/enqueue/Tests/Symfony/LazyProducerTest.php @@ -20,6 +20,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(ProducerInterface::class, LazyProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContainerAndServiceId() { new LazyProducer($this->createContainerMock(), 'realProducerId'); diff --git a/pkg/enqueue/Tests/Util/VarExportTest.php b/pkg/enqueue/Tests/Util/VarExportTest.php index 1d2384ac9..a8fa92f20 100644 --- a/pkg/enqueue/Tests/Util/VarExportTest.php +++ b/pkg/enqueue/Tests/Util/VarExportTest.php @@ -7,6 +7,9 @@ class VarExportTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithValueAsArgument() { new VarExport('aVal'); diff --git a/pkg/fs/Tests/FsConsumerTest.php b/pkg/fs/Tests/FsConsumerTest.php index 086bb55fe..044d05ae2 100644 --- a/pkg/fs/Tests/FsConsumerTest.php +++ b/pkg/fs/Tests/FsConsumerTest.php @@ -20,6 +20,9 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, FsConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContextAndDestinationAndPreFetchCountAsArguments() { new FsConsumer($this->createContextMock(), new FsDestination(TempFile::generate()), 1); @@ -50,6 +53,9 @@ public function testShouldAllowGetPreviouslySetPreFetchCount() $this->assertSame(456, $consumer->getPreFetchCount()); } + /** + * @doesNotPerformAssertions + */ public function testShouldDoNothingOnAcknowledge() { $consumer = new FsConsumer($this->createContextMock(), new FsDestination(TempFile::generate()), 123); @@ -57,6 +63,9 @@ public function testShouldDoNothingOnAcknowledge() $consumer->acknowledge(new FsMessage()); } + /** + * @doesNotPerformAssertions + */ public function testShouldDoNothingOnReject() { $consumer = new FsConsumer($this->createContextMock(), new FsDestination(TempFile::generate()), 123); diff --git a/pkg/fs/Tests/FsContextTest.php b/pkg/fs/Tests/FsContextTest.php index 4bc05e9de..ed1aec87b 100644 --- a/pkg/fs/Tests/FsContextTest.php +++ b/pkg/fs/Tests/FsContextTest.php @@ -24,6 +24,9 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, FsContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExpectedArguments() { new FsContext(sys_get_temp_dir(), 1, 0666, 100); @@ -122,6 +125,9 @@ public function testShouldThrowIfNotFsDestinationGivenOnCreateConsumer() $this->assertInstanceOf(FsConsumer::class, $consumer); } + /** + * @doesNotPerformAssertions + */ public function testShouldCreateConsumer() { $tmpFile = new TempFile(sys_get_temp_dir().'/foo'); diff --git a/pkg/fs/Tests/FsProducerTest.php b/pkg/fs/Tests/FsProducerTest.php index 28700d52f..1aa25fa3e 100644 --- a/pkg/fs/Tests/FsProducerTest.php +++ b/pkg/fs/Tests/FsProducerTest.php @@ -23,6 +23,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, FsProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContextAsFirstArgument() { new FsProducer($this->createContextMock()); diff --git a/pkg/gearman/Tests/GearmanContextTest.php b/pkg/gearman/Tests/GearmanContextTest.php index f2b70d11b..deafe303b 100644 --- a/pkg/gearman/Tests/GearmanContextTest.php +++ b/pkg/gearman/Tests/GearmanContextTest.php @@ -24,6 +24,9 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, GearmanContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithConnectionConfigAsFirstArgument() { new GearmanContext(['host' => 'aHost', 'port' => 'aPort']); diff --git a/pkg/gearman/Tests/GearmanProducerTest.php b/pkg/gearman/Tests/GearmanProducerTest.php index afb6181a3..537a0550b 100644 --- a/pkg/gearman/Tests/GearmanProducerTest.php +++ b/pkg/gearman/Tests/GearmanProducerTest.php @@ -18,6 +18,9 @@ class GearmanProducerTest extends TestCase use ClassExtensionTrait; use SkipIfGearmanExtensionIsNotInstalledTrait; + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithGearmanClientAsFirstArgument() { new GearmanProducer($this->createGearmanClientMock()); diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php index 2e5a6ac4c..edb489474 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php @@ -17,6 +17,9 @@ class CalculateRootJobStatusProcessorTest extends \PHPUnit\Framework\TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new CalculateRootJobStatusProcessor( diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php index f289c314c..05badc3e7 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php @@ -9,6 +9,9 @@ class CalculateRootJobStatusServiceTest extends \PHPUnit\Framework\TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new CalculateRootJobStatusService($this->createJobStorageMock()); diff --git a/pkg/job-queue/Tests/DependentJobContextTest.php b/pkg/job-queue/Tests/DependentJobContextTest.php index 32340d687..7e517e705 100644 --- a/pkg/job-queue/Tests/DependentJobContextTest.php +++ b/pkg/job-queue/Tests/DependentJobContextTest.php @@ -7,6 +7,9 @@ class DependentJobContextTest extends \PHPUnit\Framework\TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new DependentJobContext(new Job()); diff --git a/pkg/job-queue/Tests/DependentJobServiceTest.php b/pkg/job-queue/Tests/DependentJobServiceTest.php index 149856308..a524ab255 100644 --- a/pkg/job-queue/Tests/DependentJobServiceTest.php +++ b/pkg/job-queue/Tests/DependentJobServiceTest.php @@ -10,6 +10,9 @@ class DependentJobServiceTest extends \PHPUnit\Framework\TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new DependentJobService($this->createJobStorageMock()); diff --git a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php index 38d72a81c..e37a2a599 100644 --- a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php +++ b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php @@ -15,6 +15,9 @@ class JobStorageTest extends \PHPUnit\Framework\TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new JobStorage($this->createDoctrineMock(), 'entity-class', 'unique_table'); diff --git a/pkg/job-queue/Tests/JobProcessorTest.php b/pkg/job-queue/Tests/JobProcessorTest.php index 3f06bf8de..882678bf2 100644 --- a/pkg/job-queue/Tests/JobProcessorTest.php +++ b/pkg/job-queue/Tests/JobProcessorTest.php @@ -13,6 +13,9 @@ class JobProcessorTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeCreatedWithRequiredArguments() { new JobProcessor($this->createJobStorage(), $this->createProducerMock()); diff --git a/pkg/mongodb/Tests/MongodbConsumerTest.php b/pkg/mongodb/Tests/MongodbConsumerTest.php index cd2ee06f8..35dfba377 100644 --- a/pkg/mongodb/Tests/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbConsumerTest.php @@ -25,6 +25,9 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, MongodbConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new MongodbConsumer($this->createContextMock(), new MongodbDestination('queue')); @@ -39,6 +42,9 @@ public function testShouldReturnInstanceOfDestination() $this->assertSame($destination, $consumer->getQueue()); } + /** + * @doesNotPerformAssertions + */ public function testCouldCallAcknowledgedMethod() { $consumer = new MongodbConsumer($this->createContextMock(), new MongodbDestination('queue')); diff --git a/pkg/mongodb/Tests/MongodbContextTest.php b/pkg/mongodb/Tests/MongodbContextTest.php index 94da3ae6a..830a6dd55 100644 --- a/pkg/mongodb/Tests/MongodbContextTest.php +++ b/pkg/mongodb/Tests/MongodbContextTest.php @@ -29,6 +29,9 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, MongodbContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new MongodbContext($this->createClientMock()); diff --git a/pkg/mongodb/Tests/MongodbProducerTest.php b/pkg/mongodb/Tests/MongodbProducerTest.php index 8e8900cfd..6b8b1b2e8 100644 --- a/pkg/mongodb/Tests/MongodbProducerTest.php +++ b/pkg/mongodb/Tests/MongodbProducerTest.php @@ -23,6 +23,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, MongodbProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new MongodbProducer($this->createContextMock()); diff --git a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php index 0fc5afae4..5ff1687d8 100644 --- a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php @@ -24,6 +24,9 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithMongodbContextAsFirstArgument() { new MongodbSubscriptionConsumer($this->createMongodbContextMock()); @@ -65,6 +68,9 @@ public function testThrowsIfTrySubscribeAnotherConsumerToAlreadySubscribedQueue( $subscriptionConsumer->subscribe($barConsumer, $barCallback); } + /** + * @doesNotPerformAssertions + */ public function testShouldAllowSubscribeSameConsumerAndCallbackSecondTime() { $subscriptionConsumer = new MongodbSubscriptionConsumer($this->createMongodbContextMock()); diff --git a/pkg/null/Tests/NullConnectionFactoryTest.php b/pkg/null/Tests/NullConnectionFactoryTest.php index 80cfcc904..8c2599591 100644 --- a/pkg/null/Tests/NullConnectionFactoryTest.php +++ b/pkg/null/Tests/NullConnectionFactoryTest.php @@ -17,6 +17,9 @@ public function testShouldImplementConnectionFactoryInterface() $this->assertClassImplements(ConnectionFactory::class, NullConnectionFactory::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new NullConnectionFactory(); diff --git a/pkg/null/Tests/NullConsumerTest.php b/pkg/null/Tests/NullConsumerTest.php index 6419e9c39..5db15ae95 100644 --- a/pkg/null/Tests/NullConsumerTest.php +++ b/pkg/null/Tests/NullConsumerTest.php @@ -18,6 +18,9 @@ public function testShouldImplementMessageConsumerInterface() $this->assertClassImplements(Consumer::class, NullConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithQueueAsArgument() { new NullConsumer(new NullQueue('aName')); @@ -41,6 +44,9 @@ public function testShouldAlwaysReturnNullOnReceiveNoWait() $this->assertNull($consumer->receiveNoWait()); } + /** + * @doesNotPerformAssertions + */ public function testShouldDoNothingOnAcknowledge() { $consumer = new NullConsumer(new NullQueue('theQueueName')); @@ -48,6 +54,9 @@ public function testShouldDoNothingOnAcknowledge() $consumer->acknowledge(new NullMessage()); } + /** + * @doesNotPerformAssertions + */ public function testShouldDoNothingOnReject() { $consumer = new NullConsumer(new NullQueue('theQueueName')); diff --git a/pkg/null/Tests/NullContextTest.php b/pkg/null/Tests/NullContextTest.php index 4e5150990..257eee84b 100644 --- a/pkg/null/Tests/NullContextTest.php +++ b/pkg/null/Tests/NullContextTest.php @@ -21,6 +21,9 @@ public function testShouldImplementSessionInterface() $this->assertClassImplements(Context::class, NullContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new NullContext(); diff --git a/pkg/null/Tests/NullProducerTest.php b/pkg/null/Tests/NullProducerTest.php index 289dab6c0..149310498 100644 --- a/pkg/null/Tests/NullProducerTest.php +++ b/pkg/null/Tests/NullProducerTest.php @@ -18,11 +18,17 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, NullProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new NullProducer(); } + /** + * @doesNotPerformAssertions + */ public function testShouldDoNothingOnSend() { $producer = new NullProducer(); diff --git a/pkg/null/Tests/NullQueueTest.php b/pkg/null/Tests/NullQueueTest.php index 0dfaf2f28..cace66439 100644 --- a/pkg/null/Tests/NullQueueTest.php +++ b/pkg/null/Tests/NullQueueTest.php @@ -16,6 +16,9 @@ public function testShouldImplementQueueInterface() $this->assertClassImplements(Queue::class, NullQueue::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithNameAsArgument() { new NullQueue('aName'); diff --git a/pkg/null/Tests/NullTopicTest.php b/pkg/null/Tests/NullTopicTest.php index a40545120..017df3236 100644 --- a/pkg/null/Tests/NullTopicTest.php +++ b/pkg/null/Tests/NullTopicTest.php @@ -16,6 +16,9 @@ public function testShouldImplementTopicInterface() $this->assertClassImplements(Topic::class, NullTopic::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithNameAsArgument() { new NullTopic('aName'); diff --git a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php index c0138c726..b78f3be23 100644 --- a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php @@ -14,6 +14,9 @@ class PheanstalkConsumerTest extends TestCase { use ClassExtensionTrait; + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithDestinationAndPheanstalkAsArguments() { new PheanstalkConsumer( diff --git a/pkg/pheanstalk/Tests/PheanstalkContextTest.php b/pkg/pheanstalk/Tests/PheanstalkContextTest.php index 9f5ac5812..e122872c3 100644 --- a/pkg/pheanstalk/Tests/PheanstalkContextTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkContextTest.php @@ -21,6 +21,9 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, PheanstalkContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithPheanstalkAsFirstArgument() { new PheanstalkContext($this->createPheanstalkMock()); diff --git a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php index 7a736c09e..b6d6dff03 100644 --- a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php @@ -18,6 +18,9 @@ class PheanstalkProducerTest extends TestCase { use ClassExtensionTrait; + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithPheanstalkAsFirstArgument() { new PheanstalkProducer($this->createPheanstalkMock()); diff --git a/pkg/rdkafka/Tests/JsonSerializerTest.php b/pkg/rdkafka/Tests/JsonSerializerTest.php index d10479def..32805ca16 100644 --- a/pkg/rdkafka/Tests/JsonSerializerTest.php +++ b/pkg/rdkafka/Tests/JsonSerializerTest.php @@ -17,6 +17,9 @@ public function testShouldImplementSerializerInterface() $this->assertClassImplements(Serializer::class, JsonSerializer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new JsonSerializer(); diff --git a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php index 4f2b806c6..471e31a91 100644 --- a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php @@ -13,6 +13,9 @@ class RdKafkaConsumerTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new RdKafkaConsumer( diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index ecfa4c6fc..25451f5b4 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -17,6 +17,9 @@ class RdKafkaProducerTest extends TestCase { + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithKafkaProducerAndSerializerAsArguments() { new RdKafkaProducer($this->createKafkaProducerMock(), $this->createSerializerMock()); diff --git a/pkg/redis/Tests/RedisConsumerTest.php b/pkg/redis/Tests/RedisConsumerTest.php index 2908134fa..659060fa8 100644 --- a/pkg/redis/Tests/RedisConsumerTest.php +++ b/pkg/redis/Tests/RedisConsumerTest.php @@ -22,6 +22,9 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, RedisConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithContextAndDestinationAndPreFetchCountAsArguments() { new RedisConsumer($this->createContextMock(), new RedisDestination('aQueue')); diff --git a/pkg/redis/Tests/RedisContextTest.php b/pkg/redis/Tests/RedisContextTest.php index 0115f27b8..597b71554 100644 --- a/pkg/redis/Tests/RedisContextTest.php +++ b/pkg/redis/Tests/RedisContextTest.php @@ -25,11 +25,17 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, RedisContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRedisAsFirstArgument() { new RedisContext($this->createRedisMock(), 300); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRedisFactoryAsFirstArgument() { new RedisContext(function () { diff --git a/pkg/redis/Tests/RedisProducerTest.php b/pkg/redis/Tests/RedisProducerTest.php index 53d5f19e3..345c632b5 100644 --- a/pkg/redis/Tests/RedisProducerTest.php +++ b/pkg/redis/Tests/RedisProducerTest.php @@ -25,6 +25,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, RedisProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRedisAsFirstArgument() { new RedisProducer($this->createContextMock()); diff --git a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php index b3ba4d26b..f27cb5155 100644 --- a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php +++ b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php @@ -22,6 +22,9 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRedisContextAsFirstArgument() { new RedisSubscriptionConsumer($this->createRedisContextMock()); @@ -63,6 +66,9 @@ public function testThrowsIfTrySubscribeAnotherConsumerToAlreadySubscribedQueue( $subscriptionConsumer->subscribe($barConsumer, $barCallback); } + /** + * @doesNotPerformAssertions + */ public function testShouldAllowSubscribeSameConsumerAndCallbackSecondTime() { $subscriptionConsumer = new RedisSubscriptionConsumer($this->createRedisContextMock()); diff --git a/pkg/redis/Tests/Spec/JsonSerializerTest.php b/pkg/redis/Tests/Spec/JsonSerializerTest.php index e374ea170..21bc8d836 100644 --- a/pkg/redis/Tests/Spec/JsonSerializerTest.php +++ b/pkg/redis/Tests/Spec/JsonSerializerTest.php @@ -20,6 +20,9 @@ public function testShouldImplementSerializerInterface() $this->assertClassImplements(Serializer::class, JsonSerializer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new JsonSerializer(); diff --git a/pkg/sns/Tests/SnsProducerTest.php b/pkg/sns/Tests/SnsProducerTest.php index 5f8784905..7001784dc 100644 --- a/pkg/sns/Tests/SnsProducerTest.php +++ b/pkg/sns/Tests/SnsProducerTest.php @@ -27,6 +27,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, SnsProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new SnsProducer($this->createSnsContextMock()); diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index aa3e28971..033bfdfd4 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -32,6 +32,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, SnsQsProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new SnsQsProducer($this->createSnsContextMock(), $this->createSqsContextMock()); diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index 05fbb9b69..b05ce246d 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -24,6 +24,9 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, SqsConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new SqsConsumer($this->createContextMock(), new SqsDestination('queue')); diff --git a/pkg/sqs/Tests/SqsContextTest.php b/pkg/sqs/Tests/SqsContextTest.php index 75970bbad..bfa2163bf 100644 --- a/pkg/sqs/Tests/SqsContextTest.php +++ b/pkg/sqs/Tests/SqsContextTest.php @@ -25,6 +25,9 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, SqsContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithSqsClientAsFirstArgument() { new SqsContext($this->createSqsClientMock(), []); diff --git a/pkg/sqs/Tests/SqsProducerTest.php b/pkg/sqs/Tests/SqsProducerTest.php index 1bda62c48..1db3632d0 100644 --- a/pkg/sqs/Tests/SqsProducerTest.php +++ b/pkg/sqs/Tests/SqsProducerTest.php @@ -24,6 +24,9 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, SqsProducer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new SqsProducer($this->createSqsContextMock()); diff --git a/pkg/stomp/Tests/BufferedStompClientTest.php b/pkg/stomp/Tests/BufferedStompClientTest.php index 684edf397..3a2183b48 100644 --- a/pkg/stomp/Tests/BufferedStompClientTest.php +++ b/pkg/stomp/Tests/BufferedStompClientTest.php @@ -21,6 +21,9 @@ public function testShouldExtendLibStompClient() $this->assertClassExtends(Client::class, BufferedStompClient::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredArguments() { new BufferedStompClient('tcp://localhost:12345'); diff --git a/pkg/stomp/Tests/StompConsumerTest.php b/pkg/stomp/Tests/StompConsumerTest.php index 916166657..2d3997677 100644 --- a/pkg/stomp/Tests/StompConsumerTest.php +++ b/pkg/stomp/Tests/StompConsumerTest.php @@ -25,6 +25,9 @@ public function testShouldImplementMessageConsumerInterface() $this->assertClassImplements(Consumer::class, StompConsumer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithRequiredAttributes() { new StompConsumer($this->createStompClientMock(), $this->createDummyDestination()); diff --git a/pkg/stomp/Tests/StompContextTest.php b/pkg/stomp/Tests/StompContextTest.php index b0a41b64d..8f8fea6bb 100644 --- a/pkg/stomp/Tests/StompContextTest.php +++ b/pkg/stomp/Tests/StompContextTest.php @@ -23,11 +23,17 @@ public function testShouldImplementSessionInterface() $this->assertClassImplements(Context::class, StompContext::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeCreatedWithRequiredArguments() { new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithExtChannelCallbackFactoryAsFirstArgument() { new StompContext(function () { diff --git a/pkg/wamp/Tests/Spec/JsonSerializerTest.php b/pkg/wamp/Tests/Spec/JsonSerializerTest.php index eaa3c6bc2..0b0dbae4f 100644 --- a/pkg/wamp/Tests/Spec/JsonSerializerTest.php +++ b/pkg/wamp/Tests/Spec/JsonSerializerTest.php @@ -20,6 +20,9 @@ public function testShouldImplementSerializerInterface() $this->assertClassImplements(Serializer::class, JsonSerializer::class); } + /** + * @doesNotPerformAssertions + */ public function testCouldBeConstructedWithoutAnyArguments() { new JsonSerializer(); From 4c232c2e47fb3d459ae5a1891df3fee4aaac60a2 Mon Sep 17 00:00:00 2001 From: James Read Date: Wed, 15 Jan 2025 21:17:06 +0000 Subject: [PATCH 1135/1142] Removing constructor tests Removing all tests that creates a new instance but doesn't call any methods nor preform any assertions. --- pkg/amqp-bunny/Tests/AmqpConsumerTest.php | 8 ------- pkg/amqp-bunny/Tests/AmqpProducerTest.php | 9 ------- .../Tests/AmqpSubscriptionConsumerTest.php | 8 ------- pkg/amqp-ext/Tests/AmqpConsumerTest.php | 8 ------- pkg/amqp-ext/Tests/AmqpContextTest.php | 18 -------------- .../Tests/AmqpSubscriptionConsumerTest.php | 8 ------- .../Tests/AsyncProcessorTest.php | 8 ------- .../PhpSerializerEventTransformerTest.php | 8 ------- .../Tests/SimpleRegistryTest.php | 8 ------- pkg/dbal/Tests/DbalConsumerTest.php | 8 ------- pkg/dbal/Tests/DbalContextTest.php | 8 ------- pkg/dbal/Tests/DbalProducerTest.php | 8 ------- .../Tests/DbalSubscriptionConsumerTest.php | 8 ------- pkg/dsn/Tests/DsnTest.php | 8 ------- .../DoctrineClearIdentityMapExtensionTest.php | 8 ------- .../DoctrinePingConnectionExtensionTest.php | 8 ------- .../Extension/ResetServicesExtensionTest.php | 7 ------ .../DependencyInjection/ConfigurationTest.php | 8 ------- .../EnqueueExtensionTest.php | 8 ------- .../Tests/Unit/EnqueueBundleTest.php | 8 ------- .../Profiler/MessageQueueCollectorTest.php | 8 ------- .../Tests/ArrayProcessorRegistryTest.php | 8 ------- .../Tests/Client/ChainExtensionTest.php | 8 ------- .../DelayRedeliveredMessageExtensionTest.php | 7 ------ .../ExclusiveCommandExtensionTest.php | 8 ------- .../FlushSpoolProducerExtensionTest.php | 8 ------- .../ConsumptionExtension/LogExtensionTest.php | 8 ------- .../SetRouterPropertiesExtensionTest.php | 8 ------- .../SetupBrokerExtensionTest.php | 8 ------- .../Tests/Client/DelegateProcessorTest.php | 8 ------- .../Tests/Client/DriverFactoryTest.php | 8 ------- .../Tests/Client/DriverPreSendTest.php | 12 ---------- .../Extension/PrepareBodyExtensionTest.php | 8 ------- pkg/enqueue/Tests/Client/PostSendTest.php | 14 ----------- pkg/enqueue/Tests/Client/PreSendTest.php | 13 ---------- pkg/enqueue/Tests/Client/ProducerTest.php | 20 ---------------- .../Tests/Client/SpoolProducerTest.php | 8 ------- .../Tests/Client/TraceableProducerTest.php | 8 ------- .../Tests/ConnectionFactoryFactoryTest.php | 8 ------- .../Consumption/CallbackProcessorTest.php | 9 ------- .../Tests/Consumption/ChainExtensionTest.php | 8 ------- ...llegalContextModificationExceptionTest.php | 8 ------- .../InvalidArgumentExceptionTest.php | 8 ------- .../Exception/LogicExceptionTest.php | 8 ------- .../LimitConsumedMessagesExtensionTest.php | 8 ------- .../LimitConsumerMemoryExtensionTest.php | 8 ------- .../LimitConsumptionTimeExtensionTest.php | 8 ------- .../Extension/LogExtensionTest.php | 8 ------- .../Extension/LoggerExtensionTest.php | 8 ------- .../Extension/NicenessExtensionTest.php | 8 ------- .../Extension/ReplyExtensionTest.php | 8 ------- .../FallbackSubscriptionConsumerTest.php | 8 ------- .../Tests/Consumption/QueueConsumerTest.php | 24 ------------------- .../RouteRecipientListProcessorTest.php | 8 ------- pkg/enqueue/Tests/Rpc/RpcClientTest.php | 8 ------- .../Symfony/Client/ConsumeCommandTest.php | 8 ------- .../AnalyzeRouteCollectionPassTest.php | 8 ------- .../BuildClientExtensionsPassTest.php | 8 ------- .../BuildCommandSubscriberRoutesPassTest.php | 8 ------- .../BuildConsumptionExtensionsPassTest.php | 8 ------- .../BuildProcessorRegistryPassTest.php | 8 ------- .../BuildProcessorRoutesPassTest.php | 8 ------- .../BuildTopicSubscriberRoutesPassTest.php | 8 ------- .../Client/FlushSpoolProducerListenerTest.php | 8 ------- .../Symfony/Client/ProduceCommandTest.php | 8 ------- .../Symfony/Client/RoutesCommandTest.php | 8 ------- .../Symfony/Client/SetupBrokerCommandTest.php | 8 ------- .../Client/SimpleConsumeCommandTest.php | 8 ------- .../Client/SimpleProduceCommandTest.php | 8 ------- .../Client/SimpleRoutesCommandTest.php | 8 ------- .../Client/SimpleSetupBrokerCommandTest.php | 8 ------- .../ConfigurableConsumeCommandTest.php | 8 ------- .../Consumption/ConsumeCommandTest.php | 8 ------- .../Consumption/SimpleConsumeCommandTest.php | 8 ------- .../ContainerProcessorRegistryTest.php | 8 ------- .../BuildConsumptionExtensionsPassTest.php | 8 ------- .../BuildProcessorRegistryPassTest.php | 8 ------- .../Tests/Symfony/LazyProducerTest.php | 8 ------- pkg/enqueue/Tests/Util/VarExportTest.php | 8 ------- pkg/fs/Tests/FsConsumerTest.php | 8 ------- pkg/fs/Tests/FsContextTest.php | 8 ------- pkg/fs/Tests/FsProducerTest.php | 8 ------- pkg/gearman/Tests/GearmanContextTest.php | 8 ------- pkg/gearman/Tests/GearmanProducerTest.php | 8 ------- .../CalculateRootJobStatusProcessorTest.php | 13 ---------- .../CalculateRootJobStatusServiceTest.php | 8 ------- .../Tests/DependentJobContextTest.php | 8 ------- .../Tests/DependentJobServiceTest.php | 8 ------- .../Tests/Doctrine/JobStorageTest.php | 8 ------- pkg/job-queue/Tests/JobProcessorTest.php | 8 ------- pkg/mongodb/Tests/MongodbConsumerTest.php | 8 ------- pkg/mongodb/Tests/MongodbContextTest.php | 8 ------- pkg/mongodb/Tests/MongodbProducerTest.php | 8 ------- .../Tests/MongodbSubscriptionConsumerTest.php | 8 ------- pkg/null/Tests/NullConnectionFactoryTest.php | 8 ------- pkg/null/Tests/NullConsumerTest.php | 8 ------- pkg/null/Tests/NullContextTest.php | 8 ------- pkg/null/Tests/NullProducerTest.php | 8 ------- pkg/null/Tests/NullQueueTest.php | 8 ------- pkg/null/Tests/NullTopicTest.php | 8 ------- .../Tests/PheanstalkConsumerTest.php | 11 --------- .../Tests/PheanstalkContextTest.php | 8 ------- .../Tests/PheanstalkProducerTest.php | 8 ------- pkg/rdkafka/Tests/JsonSerializerTest.php | 8 ------- pkg/rdkafka/Tests/RdKafkaConsumerTest.php | 13 ---------- pkg/rdkafka/Tests/RdKafkaProducerTest.php | 8 ------- pkg/redis/Tests/RedisConsumerTest.php | 8 ------- pkg/redis/Tests/RedisContextTest.php | 18 -------------- pkg/redis/Tests/RedisProducerTest.php | 8 ------- .../Tests/RedisSubscriptionConsumerTest.php | 8 ------- pkg/redis/Tests/Spec/JsonSerializerTest.php | 8 ------- pkg/sns/Tests/SnsProducerTest.php | 8 ------- pkg/snsqs/Tests/SnsQsProducerTest.php | 8 ------- pkg/sqs/Tests/SqsConsumerTest.php | 8 ------- pkg/sqs/Tests/SqsContextTest.php | 8 ------- pkg/sqs/Tests/SqsProducerTest.php | 8 ------- pkg/stomp/Tests/BufferedStompClientTest.php | 8 ------- pkg/stomp/Tests/StompConsumerTest.php | 8 ------- pkg/stomp/Tests/StompContextTest.php | 18 -------------- pkg/wamp/Tests/Spec/JsonSerializerTest.php | 8 ------- 120 files changed, 1046 deletions(-) diff --git a/pkg/amqp-bunny/Tests/AmqpConsumerTest.php b/pkg/amqp-bunny/Tests/AmqpConsumerTest.php index da6c40652..c2c694566 100644 --- a/pkg/amqp-bunny/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpConsumerTest.php @@ -27,14 +27,6 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, AmqpConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContextAndQueueAsArguments() - { - new AmqpConsumer($this->createContextMock(), new AmqpQueue('aName')); - } - public function testShouldReturnQueue() { $queue = new AmqpQueue('aName'); diff --git a/pkg/amqp-bunny/Tests/AmqpProducerTest.php b/pkg/amqp-bunny/Tests/AmqpProducerTest.php index a7ca055fd..17b390341 100644 --- a/pkg/amqp-bunny/Tests/AmqpProducerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpProducerTest.php @@ -24,15 +24,6 @@ class AmqpProducerTest extends TestCase { use ClassExtensionTrait; - /** - * @doesNotPerformAssertions - */ - - public function testCouldBeConstructedWithRequiredArguments() - { - new AmqpProducer($this->createBunnyChannelMock(), $this->createContextMock()); - } - public function testShouldImplementQueueInteropProducerInterface() { $this->assertClassImplements(Producer::class, AmqpProducer::class); diff --git a/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php index cc2ac9a54..4bf08ded5 100644 --- a/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-bunny/Tests/AmqpSubscriptionConsumerTest.php @@ -17,14 +17,6 @@ public function testShouldImplementQueueInteropSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithAmqpContextAsFirstArgument() - { - new AmqpSubscriptionConsumer($this->createAmqpContextMock()); - } - /** * @return AmqpContext|MockObject */ diff --git a/pkg/amqp-ext/Tests/AmqpConsumerTest.php b/pkg/amqp-ext/Tests/AmqpConsumerTest.php index 470c49c86..ae803e047 100644 --- a/pkg/amqp-ext/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-ext/Tests/AmqpConsumerTest.php @@ -19,14 +19,6 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, AmqpConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContextAndQueueAsArguments() - { - new AmqpConsumer($this->createContext(), new AmqpQueue('aName')); - } - /** * @return MockObject|AmqpContext */ diff --git a/pkg/amqp-ext/Tests/AmqpContextTest.php b/pkg/amqp-ext/Tests/AmqpContextTest.php index 4b42827ba..2b03bb3d2 100644 --- a/pkg/amqp-ext/Tests/AmqpContextTest.php +++ b/pkg/amqp-ext/Tests/AmqpContextTest.php @@ -28,24 +28,6 @@ public function testShouldImplementQueueInteropContextInterface() $this->assertClassImplements(Context::class, AmqpContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExtChannelAsFirstArgument() - { - new AmqpContext($this->createExtChannelMock()); - } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExtChannelCallbackFactoryAsFirstArgument() - { - new AmqpContext(function () { - return $this->createExtChannelMock(); - }); - } - public function testThrowIfNeitherCallbackNorExtChannelAsFirstArgument() { $this->expectException(\InvalidArgumentException::class); diff --git a/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php b/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php index 8ba08161b..d71ddd776 100644 --- a/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php +++ b/pkg/amqp-ext/Tests/AmqpSubscriptionConsumerTest.php @@ -17,14 +17,6 @@ public function testShouldImplementQueueInteropSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithAmqpContextAsFirstArgument() - { - new AmqpSubscriptionConsumer($this->createAmqpContextMock()); - } - /** * @return AmqpContext|MockObject */ diff --git a/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php b/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php index 9bf294194..019f9bcbe 100644 --- a/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php +++ b/pkg/async-event-dispatcher/Tests/AsyncProcessorTest.php @@ -24,14 +24,6 @@ public function testShouldImplementProcessorInterface() $this->assertClassImplements(Processor::class, AsyncProcessor::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRegistryAndProxyEventDispatcher() - { - new AsyncProcessor($this->createRegistryMock(), $this->createProxyEventDispatcherMock()); - } - public function testRejectIfMessageMissingEventNameProperty() { $processor = new AsyncProcessor($this->createRegistryMock(), $this->createProxyEventDispatcherMock()); diff --git a/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php b/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php index 04d9f2dc6..498ca3ae9 100644 --- a/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php +++ b/pkg/async-event-dispatcher/Tests/PhpSerializerEventTransformerTest.php @@ -21,14 +21,6 @@ public function testShouldImplementEventTransformerInterface() $this->assertClassImplements(EventTransformer::class, PhpSerializerEventTransformer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new PhpSerializerEventTransformer($this->createContextStub()); - } - public function testShouldReturnMessageWithPhpSerializedEventAsBodyOnToMessage() { $transformer = new PhpSerializerEventTransformer($this->createContextStub()); diff --git a/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php b/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php index 52d6f1694..82e1e3fc7 100644 --- a/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php +++ b/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php @@ -18,14 +18,6 @@ public function testShouldImplementRegistryInterface() $this->assertClassImplements(Registry::class, SimpleRegistry::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithEventsMapAndTransformersMapAsArguments() - { - new SimpleRegistry([], []); - } - public function testShouldAllowGetTransportNameByEventName() { $registry = new SimpleRegistry([ diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index 7c2bbbc03..6538af11d 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -28,14 +28,6 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, DbalConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new DbalConsumer($this->createContextMock(), new DbalDestination('queue')); - } - public function testShouldReturnInstanceOfDestination() { $destination = new DbalDestination('queue'); diff --git a/pkg/dbal/Tests/DbalContextTest.php b/pkg/dbal/Tests/DbalContextTest.php index 6c0cc2878..a1900b788 100644 --- a/pkg/dbal/Tests/DbalContextTest.php +++ b/pkg/dbal/Tests/DbalContextTest.php @@ -27,14 +27,6 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, DbalContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new DbalContext($this->createConnectionMock()); - } - public function testCouldBeConstructedWithEmptyConfiguration() { $factory = new DbalContext($this->createConnectionMock(), []); diff --git a/pkg/dbal/Tests/DbalProducerTest.php b/pkg/dbal/Tests/DbalProducerTest.php index f7800bc56..ec4d2043c 100644 --- a/pkg/dbal/Tests/DbalProducerTest.php +++ b/pkg/dbal/Tests/DbalProducerTest.php @@ -21,14 +21,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, DbalProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new DbalProducer($this->createContextMock()); - } - public function testShouldThrowIfDestinationOfInvalidType() { $this->expectException(InvalidDestinationException::class); diff --git a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php index 9c372de82..bacbec127 100644 --- a/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php +++ b/pkg/dbal/Tests/DbalSubscriptionConsumerTest.php @@ -25,14 +25,6 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithDbalContextAsFirstArgument() - { - new DbalSubscriptionConsumer($this->createDbalContextMock()); - } - public function testShouldAddConsumerAndCallbackToSubscribersPropertyOnSubscribe() { $subscriptionConsumer = new DbalSubscriptionConsumer($this->createDbalContextMock()); diff --git a/pkg/dsn/Tests/DsnTest.php b/pkg/dsn/Tests/DsnTest.php index f693fce04..8bf4137ed 100644 --- a/pkg/dsn/Tests/DsnTest.php +++ b/pkg/dsn/Tests/DsnTest.php @@ -8,14 +8,6 @@ class DsnTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithDsnAsFirstArgument() - { - Dsn::parseFirst('foo://localhost:1234'); - } - public function testThrowsIfSchemePartIsMissing() { $this->expectException(\LogicException::class); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php index bf8c9a8b3..7c5c2dd5d 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrineClearIdentityMapExtensionTest.php @@ -16,14 +16,6 @@ class DoctrineClearIdentityMapExtensionTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new DoctrineClearIdentityMapExtension($this->createRegistryMock()); - } - public function testShouldClearIdentityMap() { $manager = $this->createManagerMock(); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php index b842b766d..36df82e52 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/DoctrinePingConnectionExtensionTest.php @@ -17,14 +17,6 @@ class DoctrinePingConnectionExtensionTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredAttributes() - { - new DoctrinePingConnectionExtension($this->createRegistryMock()); - } - public function testShouldNotReconnectIfConnectionIsOK() { $connection = $this->createConnectionMock(); diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php index 1feba7a9f..76fe29b94 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php @@ -16,13 +16,6 @@ class ResetServicesExtensionTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new ResetServicesExtension($this->createResetterMock()); - } public function testItShouldResetServices() { diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php index 746874017..5330cde82 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -25,14 +25,6 @@ public function testShouldBeFinal() $this->assertClassFinal(Configuration::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithDebugAsArgument() - { - new Configuration(true); - } - public function testShouldProcessSeveralTransports() { $configuration = new Configuration(true); diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index 9a20f9966..6358bd24d 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -30,14 +30,6 @@ public function testShouldBeFinal() $this->assertClassFinal(EnqueueExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new EnqueueExtension(); - } - public function testShouldRegisterConnectionFactory() { $container = $this->getContainerBuilder(true); diff --git a/pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php b/pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php index 13776ede4..7d5b0232b 100644 --- a/pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php @@ -15,12 +15,4 @@ public function testShouldExtendBundleClass() { $this->assertClassExtends(Bundle::class, EnqueueBundle::class); } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new EnqueueBundle(); - } } diff --git a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php index 12700be60..d6d638d75 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Profiler/MessageQueueCollectorTest.php @@ -23,14 +23,6 @@ public function testShouldExtendDataCollectorClass() $this->assertClassExtends(DataCollector::class, MessageQueueCollector::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithEmptyConstructor() - { - new MessageQueueCollector(); - } - public function testShouldReturnExpectedName() { $collector = new MessageQueueCollector(); diff --git a/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php b/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php index c0937547d..93ad3ece1 100644 --- a/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/ArrayProcessorRegistryTest.php @@ -18,14 +18,6 @@ public function testShouldImplementProcessorRegistryInterface() $this->assertClassImplements(ProcessorRegistryInterface::class, ArrayProcessorRegistry::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArgument() - { - new ArrayProcessorRegistry(); - } - public function testShouldThrowExceptionIfProcessorIsNotSet() { $registry = new ArrayProcessorRegistry(); diff --git a/pkg/enqueue/Tests/Client/ChainExtensionTest.php b/pkg/enqueue/Tests/Client/ChainExtensionTest.php index c5dc60451..0f42bcf18 100644 --- a/pkg/enqueue/Tests/Client/ChainExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ChainExtensionTest.php @@ -29,14 +29,6 @@ public function testShouldBeFinal() $this->assertClassFinal(ChainExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExtensionsArray() - { - new ChainExtension([$this->createExtension(), $this->createExtension()]); - } - public function testThrowIfArrayContainsNotExtension() { $this->expectException(\LogicException::class); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php index 6d502461f..56b855f0c 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php @@ -23,13 +23,6 @@ class DelayRedeliveredMessageExtensionTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new DelayRedeliveredMessageExtension($this->createDriverMock(), 12345); - } public function testShouldSendDelayedMessageAndRejectOriginalMessage() { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php index 9a2270d4a..b1e47c898 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/ExclusiveCommandExtensionTest.php @@ -34,14 +34,6 @@ public function testShouldBeFinal() $this->assertClassFinal(ExclusiveCommandExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithDriverAsFirstArgument() - { - new ExclusiveCommandExtension($this->createDriverStub()); - } - public function testShouldDoNothingIfMessageHasTopicPropertySetOnPreReceive() { $message = new NullMessage(); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php index d69969b78..6a782c524 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/FlushSpoolProducerExtensionTest.php @@ -30,14 +30,6 @@ public function testShouldImplementEndExtensionInterface() $this->assertClassImplements(EndExtensionInterface::class, FlushSpoolProducerExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithSpoolProducerAsFirstArgument() - { - new FlushSpoolProducerExtension($this->createSpoolProducerMock()); - } - public function testShouldFlushSpoolProducerOnEnd() { $producer = $this->createSpoolProducerMock(); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php index fe9e6ab0c..db757676b 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/LogExtensionTest.php @@ -55,14 +55,6 @@ public function testShouldSubClassOfLogExtension() $this->assertClassExtends(\Enqueue\Consumption\Extension\LogExtension::class, LogExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new LogExtension(); - } - public function testShouldLogStartOnStart() { $logger = $this->createLogger(); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php index 5337d0495..d521aefca 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php @@ -27,14 +27,6 @@ public function testShouldImplementMessageReceivedExtensionInterface() $this->assertClassImplements(MessageReceivedExtensionInterface::class, SetRouterPropertiesExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new SetRouterPropertiesExtension($this->createDriverMock()); - } - public function testShouldSetRouterProcessorPropertyIfNotSetAndOnRouterQueue() { $config = Config::create('test', '.', '', '', 'router-queue', '', 'router-processor-name'); diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php index a72ae389a..fbd367975 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/SetupBrokerExtensionTest.php @@ -21,14 +21,6 @@ public function testShouldImplementStartExtensionInterface() $this->assertClassImplements(StartExtensionInterface::class, SetupBrokerExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new SetupBrokerExtension($this->createDriverMock()); - } - public function testShouldSetupBroker() { $logger = new NullLogger(); diff --git a/pkg/enqueue/Tests/Client/DelegateProcessorTest.php b/pkg/enqueue/Tests/Client/DelegateProcessorTest.php index f9bd83ebf..9743cf4f3 100644 --- a/pkg/enqueue/Tests/Client/DelegateProcessorTest.php +++ b/pkg/enqueue/Tests/Client/DelegateProcessorTest.php @@ -13,14 +13,6 @@ class DelegateProcessorTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new DelegateProcessor($this->createProcessorRegistryMock()); - } - public function testShouldThrowExceptionIfProcessorNameIsNotSet() { $this->expectException(\LogicException::class); diff --git a/pkg/enqueue/Tests/Client/DriverFactoryTest.php b/pkg/enqueue/Tests/Client/DriverFactoryTest.php index 605358aa3..ef504e0e0 100644 --- a/pkg/enqueue/Tests/Client/DriverFactoryTest.php +++ b/pkg/enqueue/Tests/Client/DriverFactoryTest.php @@ -61,14 +61,6 @@ public function testShouldBeFinal() $this->assertTrue($rc->isFinal()); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new DriverFactory(); - } - public function testThrowIfPackageThatSupportSchemeNotInstalled() { $scheme = 'scheme5b7aa7d7cd213'; diff --git a/pkg/enqueue/Tests/Client/DriverPreSendTest.php b/pkg/enqueue/Tests/Client/DriverPreSendTest.php index f3c1ee375..32af2a81f 100644 --- a/pkg/enqueue/Tests/Client/DriverPreSendTest.php +++ b/pkg/enqueue/Tests/Client/DriverPreSendTest.php @@ -19,18 +19,6 @@ public function testShouldBeFinal() self::assertClassFinal(DriverPreSend::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExpectedArguments() - { - new DriverPreSend( - new Message(), - $this->createProducerMock(), - $this->createDriverMock() - ); - } - public function testShouldAllowGetArgumentSetInConstructor() { $expectedMessage = new Message(); diff --git a/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php b/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php index 81b29e801..d1c260388 100644 --- a/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php +++ b/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php @@ -22,14 +22,6 @@ public function testShouldImplementExtensionInterface() $this->assertTrue($rc->implementsInterface(PreSendCommandExtensionInterface::class)); } - /** - * @doesNotPerformAssertions - */ - public function testCouldConstructedWithoutAnyArguments() - { - new PrepareBodyExtension(); - } - /** * @dataProvider provideMessages * diff --git a/pkg/enqueue/Tests/Client/PostSendTest.php b/pkg/enqueue/Tests/Client/PostSendTest.php index 9eb845e49..ba51710e7 100644 --- a/pkg/enqueue/Tests/Client/PostSendTest.php +++ b/pkg/enqueue/Tests/Client/PostSendTest.php @@ -21,20 +21,6 @@ public function testShouldBeFinal() self::assertClassFinal(PostSend::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExpectedArguments() - { - new PostSend( - new Message(), - $this->createProducerMock(), - $this->createDriverMock(), - $this->createDestinationMock(), - $this->createTransportMessageMock() - ); - } - public function testShouldAllowGetArgumentSetInConstructor() { $expectedMessage = new Message(); diff --git a/pkg/enqueue/Tests/Client/PreSendTest.php b/pkg/enqueue/Tests/Client/PreSendTest.php index 40dffafa2..ae9400338 100644 --- a/pkg/enqueue/Tests/Client/PreSendTest.php +++ b/pkg/enqueue/Tests/Client/PreSendTest.php @@ -18,19 +18,6 @@ public function testShouldBeFinal() self::assertClassFinal(PreSend::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExpectedArguments() - { - new PreSend( - 'aCommandOrTopic', - new Message(), - $this->createProducerMock(), - $this->createDriverMock() - ); - } - public function testShouldAllowGetArgumentSetInConstructor() { $expectedCommandOrTopic = 'theCommandOrTopic'; diff --git a/pkg/enqueue/Tests/Client/ProducerTest.php b/pkg/enqueue/Tests/Client/ProducerTest.php index 38dd1f075..9d4e2a304 100644 --- a/pkg/enqueue/Tests/Client/ProducerTest.php +++ b/pkg/enqueue/Tests/Client/ProducerTest.php @@ -24,26 +24,6 @@ public function testShouldBeFinal() self::assertClassFinal(Producer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new Producer($this->createDriverMock(), $this->createRpcFactoryMock()); - } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithOptionalArguments() - { - new Producer( - $this->createDriverMock(), - $this->createRpcFactoryMock(), - $this->createMock(ExtensionInterface::class) - ); - } - /** * @return \PHPUnit\Framework\MockObject\MockObject */ diff --git a/pkg/enqueue/Tests/Client/SpoolProducerTest.php b/pkg/enqueue/Tests/Client/SpoolProducerTest.php index 511b91edb..014fe4962 100644 --- a/pkg/enqueue/Tests/Client/SpoolProducerTest.php +++ b/pkg/enqueue/Tests/Client/SpoolProducerTest.php @@ -18,14 +18,6 @@ public function testShouldImplementProducerInterface() self::assertClassImplements(ProducerInterface::class, SpoolProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRealProducer() - { - new SpoolProducer($this->createProducerMock()); - } - public function testShouldQueueEventMessageOnSend() { $message = new Message(); diff --git a/pkg/enqueue/Tests/Client/TraceableProducerTest.php b/pkg/enqueue/Tests/Client/TraceableProducerTest.php index 3ce23f89a..ff042857c 100644 --- a/pkg/enqueue/Tests/Client/TraceableProducerTest.php +++ b/pkg/enqueue/Tests/Client/TraceableProducerTest.php @@ -18,14 +18,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(ProducerInterface::class, TraceableProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithInternalMessageProducer() - { - new TraceableProducer($this->createProducerMock()); - } - public function testShouldPassAllArgumentsToInternalEventMessageProducerSendMethod() { $topic = 'theTopic'; diff --git a/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php b/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php index c522c6334..fe2de69a0 100644 --- a/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php +++ b/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php @@ -37,14 +37,6 @@ public function testShouldBeFinal() $this->assertTrue($rc->isFinal()); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new ConnectionFactoryFactory(); - } - /** * @doesNotPerformAssertions */ diff --git a/pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php b/pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php index 9cafdb885..86adbd3a9 100644 --- a/pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php +++ b/pkg/enqueue/Tests/Consumption/CallbackProcessorTest.php @@ -18,15 +18,6 @@ public function testShouldImplementProcessorInterface() $this->assertClassImplements(Processor::class, CallbackProcessor::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithCallableAsArgument() - { - new CallbackProcessor(function () { - }); - } - public function testShouldCallCallbackAndProxyItsReturnedValue() { $expectedMessage = new NullMessage(); diff --git a/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php b/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php index c19cc2f20..198d00012 100644 --- a/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/ChainExtensionTest.php @@ -33,14 +33,6 @@ public function testShouldImplementExtensionInterface() $this->assertClassImplements(ExtensionInterface::class, ChainExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExtensionsArray() - { - new ChainExtension([$this->createExtension(), $this->createExtension()]); - } - public function testShouldProxyOnInitLoggerToAllInternalExtensions() { $context = new InitLogger(new NullLogger()); diff --git a/pkg/enqueue/Tests/Consumption/Exception/IllegalContextModificationExceptionTest.php b/pkg/enqueue/Tests/Consumption/Exception/IllegalContextModificationExceptionTest.php index 5de5c2f05..241f4adf9 100644 --- a/pkg/enqueue/Tests/Consumption/Exception/IllegalContextModificationExceptionTest.php +++ b/pkg/enqueue/Tests/Consumption/Exception/IllegalContextModificationExceptionTest.php @@ -20,12 +20,4 @@ public function testShouldExtendLogicException() { $this->assertClassExtends(\LogicException::class, IllegalContextModificationException::class); } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new IllegalContextModificationException(); - } } diff --git a/pkg/enqueue/Tests/Consumption/Exception/InvalidArgumentExceptionTest.php b/pkg/enqueue/Tests/Consumption/Exception/InvalidArgumentExceptionTest.php index cc2ca3122..c1c5db362 100644 --- a/pkg/enqueue/Tests/Consumption/Exception/InvalidArgumentExceptionTest.php +++ b/pkg/enqueue/Tests/Consumption/Exception/InvalidArgumentExceptionTest.php @@ -21,14 +21,6 @@ public function testShouldExtendLogicException() $this->assertClassExtends(\LogicException::class, InvalidArgumentException::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new InvalidArgumentException(); - } - public function testThrowIfAssertInstanceOfNotSameAsExpected() { $this->expectException(InvalidArgumentException::class); diff --git a/pkg/enqueue/Tests/Consumption/Exception/LogicExceptionTest.php b/pkg/enqueue/Tests/Consumption/Exception/LogicExceptionTest.php index f7a68c9a9..2655609ae 100644 --- a/pkg/enqueue/Tests/Consumption/Exception/LogicExceptionTest.php +++ b/pkg/enqueue/Tests/Consumption/Exception/LogicExceptionTest.php @@ -20,12 +20,4 @@ public function testShouldExtendLogicException() { $this->assertClassExtends(\LogicException::class, LogicException::class); } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new LogicException(); - } } diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php index 15d221409..137e30ba4 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumedMessagesExtensionTest.php @@ -16,14 +16,6 @@ class LimitConsumedMessagesExtensionTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new LimitConsumedMessagesExtension(12345); - } - public function testOnPreConsumeShouldInterruptWhenLimitIsReached() { $logger = $this->createLoggerMock(); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php index 22d33826e..15482997d 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php @@ -17,14 +17,6 @@ class LimitConsumerMemoryExtensionTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new LimitConsumerMemoryExtension(12345); - } - public function testShouldThrowExceptionIfMemoryLimitIsNotInt() { $this->expectException(\InvalidArgumentException::class); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php index fbd61d48f..fa6cb76a1 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumptionTimeExtensionTest.php @@ -17,14 +17,6 @@ class LimitConsumptionTimeExtensionTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new LimitConsumptionTimeExtension(new \DateTime('+1 day')); - } - public function testOnPreConsumeShouldInterruptExecutionIfConsumptionTimeExceeded() { $context = new PreConsume( diff --git a/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php index f529dcd4c..006a2c549 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LogExtensionTest.php @@ -49,14 +49,6 @@ public function testShouldImplementPostMessageReceivedExtensionInterface() $this->assertClassImplements(PostMessageReceivedExtensionInterface::class, LogExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new LogExtension(); - } - public function testShouldLogStartOnStart() { $logger = $this->createLogger(); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php index 227c0830f..455468ed2 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php @@ -20,14 +20,6 @@ public function testShouldImplementInitLoggerExtensionInterface() $this->assertClassImplements(InitLoggerExtensionInterface::class, LoggerExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithLoggerAsFirstArgument() - { - new LoggerExtension($this->createLogger()); - } - public function testShouldSetLoggerToContextOnInitLogger() { $logger = $this->createLogger(); diff --git a/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php index 15c004db4..734bc8417 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/NicenessExtensionTest.php @@ -11,14 +11,6 @@ class NicenessExtensionTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new NicenessExtension(0); - } - public function testShouldThrowExceptionOnInvalidArgument() { $this->expectException(\InvalidArgumentException::class); diff --git a/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php index 3963e94e6..cb65816ce 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/ReplyExtensionTest.php @@ -25,14 +25,6 @@ public function testShouldImplementPostMessageReceivedExtensionInterface() $this->assertClassImplements(PostMessageReceivedExtensionInterface::class, ReplyExtension::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new ReplyExtension(); - } - public function testShouldDoNothingIfReceivedMessageNotHaveReplyToSet() { $extension = new ReplyExtension(); diff --git a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php index aecf71628..5391f0c68 100644 --- a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php @@ -21,14 +21,6 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new FallbackSubscriptionConsumer(); - } - public function testShouldInitSubscribersPropertyWithEmptyArray() { $subscriptionConsumer = new FallbackSubscriptionConsumer(); diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index ce72cb9d9..06edab31b 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -39,30 +39,6 @@ class QueueConsumerTest extends TestCase { use ReadAttributeTrait; - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithAllArguments() - { - new QueueConsumer($this->createContextStub(), null, [], null, 0); - } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContextOnly() - { - new QueueConsumer($this->createContextStub()); - } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContextAndSingleExtension() - { - new QueueConsumer($this->createContextStub(), $this->createExtension()); - } - public function testShouldSetEmptyArrayToBoundProcessorsPropertyInConstructor() { $consumer = new QueueConsumer($this->createContextStub(), null, [], null, 0); diff --git a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php index 7e38f9616..ae878fc53 100644 --- a/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php +++ b/pkg/enqueue/Tests/Router/RouteRecipientListProcessorTest.php @@ -23,14 +23,6 @@ public function testShouldImplementProcessorInterface() $this->assertClassImplements(Processor::class, RouteRecipientListProcessor::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRouterAsFirstArgument() - { - new RouteRecipientListProcessor($this->createRecipientListRouterMock()); - } - public function testShouldProduceRecipientsMessagesAndAckOriginalMessage() { $fooRecipient = new Recipient(new NullQueue('aName'), new NullMessage()); diff --git a/pkg/enqueue/Tests/Rpc/RpcClientTest.php b/pkg/enqueue/Tests/Rpc/RpcClientTest.php index e8a3720b1..db4813c88 100644 --- a/pkg/enqueue/Tests/Rpc/RpcClientTest.php +++ b/pkg/enqueue/Tests/Rpc/RpcClientTest.php @@ -15,14 +15,6 @@ class RpcClientTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContextAsFirstArgument() - { - new RpcClient($this->createContextMock()); - } - public function testShouldSetReplyToIfNotSet() { $context = new NullContext(); diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 17be30aed..3758ca96a 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -40,14 +40,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(ConsumeCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredAttributes() - { - new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); - } - public function testShouldHaveAsCommandAttributeWithCommandName() { $commandClass = ConsumeCommand::class; diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPassTest.php index fc3051b97..568de6488 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPassTest.php @@ -23,14 +23,6 @@ public function testShouldBeFinal() $this->assertClassFinal(AnalyzeRouteCollectionPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new AnalyzeRouteCollectionPass(); - } - public function testThrowIfEnqueueClientsParameterNotSet() { $pass = new AnalyzeRouteCollectionPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php index baae3c768..753790369 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildClientExtensionsPassTest.php @@ -25,14 +25,6 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildClientExtensionsPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new BuildClientExtensionsPass(); - } - public function testThrowIfEnqueueClientsParameterNotSet() { $pass = new BuildClientExtensionsPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php index 7317a8ef8..1a5f65a4f 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php @@ -29,14 +29,6 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildCommandSubscriberRoutesPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new BuildCommandSubscriberRoutesPass(); - } - public function testThrowIfEnqueueClientsParameterNotSet() { $pass = new BuildCommandSubscriberRoutesPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php index 64966d602..c2975051b 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPassTest.php @@ -25,14 +25,6 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildConsumptionExtensionsPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new BuildConsumptionExtensionsPass(); - } - public function testThrowIfEnqueueClientsParameterNotSet() { $pass = new BuildConsumptionExtensionsPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php index 98679abbd..5c9ac4840 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -26,14 +26,6 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildProcessorRegistryPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new BuildProcessorRegistryPass(); - } - public function testThrowIfEnqueueClientsParameterNotSet() { $pass = new BuildProcessorRegistryPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php index d4ac29803..0351c45f5 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildProcessorRoutesPassTest.php @@ -25,14 +25,6 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildProcessorRoutesPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new BuildProcessorRoutesPass(); - } - public function testThrowIfEnqueueClientsParameterNotSet() { $pass = new BuildProcessorRoutesPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php index 0ada6064a..b642b9001 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php @@ -29,14 +29,6 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildTopicSubscriberRoutesPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new BuildTopicSubscriberRoutesPass(); - } - public function testThrowIfEnqueueClientsParameterNotSet() { $pass = new BuildTopicSubscriberRoutesPass(); diff --git a/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php b/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php index feae3b52f..539d332ee 100644 --- a/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/FlushSpoolProducerListenerTest.php @@ -39,14 +39,6 @@ public function testShouldSubscribeOnConsoleTerminateEvent() $this->assertEquals('flushMessages', $events[ConsoleEvents::TERMINATE]); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithSpoolProducerAsFirstArgument() - { - new FlushSpoolProducerListener($this->createSpoolProducerMock()); - } - public function testShouldFlushSpoolProducerOnFlushMessagesCall() { $producerMock = $this->createSpoolProducerMock(); diff --git a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php index b6a1d18a4..daa909175 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ProduceCommandTest.php @@ -27,14 +27,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(ProduceCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContainerAsFirstArgument() - { - new ProduceCommand($this->createMock(ContainerInterface::class), 'default'); - } - public function testShouldHaveAsCommandAttributeWithCommandName() { $commandClass = ProduceCommand::class; diff --git a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php index 8adf71064..89bd7f745 100644 --- a/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/RoutesCommandTest.php @@ -29,14 +29,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(RoutesCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() - { - new RoutesCommand($this->createMock(ContainerInterface::class), 'default'); - } - public function testShouldHaveAsCommandAttributeWithCommandName() { $commandClass = RoutesCommand::class; diff --git a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php index 53a8d4494..c81c4e1b6 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SetupBrokerCommandTest.php @@ -26,14 +26,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SetupBrokerCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContainerAsFirstArgument() - { - new SetupBrokerCommand($this->createMock(ContainerInterface::class), 'default'); - } - public function testShouldHaveAsCommandAttributeWithCommandName() { $commandClass = SetupBrokerCommand::class; diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php index 97f1c6c58..21c491eb5 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleConsumeCommandTest.php @@ -29,14 +29,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleConsumeCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredAttributes() - { - new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); - } - public function testShouldHaveExpectedOptions() { $command = new SimpleConsumeCommand($this->createQueueConsumerMock(), $this->createDriverStub(), $this->createDelegateProcessorMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php index 50d46c96d..3ff81bfd5 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleProduceCommandTest.php @@ -23,14 +23,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleProduceCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContainerAsFirstArgument() - { - new SimpleProduceCommand($this->createProducerMock()); - } - public function testShouldHaveExpectedOptions() { $command = new SimpleProduceCommand($this->createProducerMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php index 71bb5cf6b..20ee454cc 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleRoutesCommandTest.php @@ -25,14 +25,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleRoutesCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithConfigAndRouteCollectionAsArguments() - { - new SimpleRoutesCommand($this->createDriverMock()); - } - public function testShouldHaveCommandAliases() { $command = new SimpleRoutesCommand($this->createDriverMock()); diff --git a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php index d3e8f2170..3702dbf18 100644 --- a/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/SimpleSetupBrokerCommandTest.php @@ -23,14 +23,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleSetupBrokerCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContainerAsFirstArgument() - { - new SimpleSetupBrokerCommand($this->createClientDriverMock()); - } - public function testShouldHaveCommandAliases() { $command = new SimpleSetupBrokerCommand($this->createClientDriverMock()); diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php index 82342e4d6..251e264e2 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConfigurableConsumeCommandTest.php @@ -33,14 +33,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(ConfigurableConsumeCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredAttributes() - { - new ConfigurableConsumeCommand($this->createMock(ContainerInterface::class), 'default'); - } - public function testShouldHaveAsCommandAttributeWithCommandName() { $commandClass = ConfigurableConsumeCommand::class; diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index b56ef68cc..f07bef03b 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -35,14 +35,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(ConsumeCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredAttributes() - { - new ConsumeCommand($this->createMock(ContainerInterface::class), 'default'); - } - public function testShouldHaveAsCommandAttributeWithCommandName() { $commandClass = ConsumeCommand::class; diff --git a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php index 7648587d6..eeb38bf19 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/SimpleConsumeCommandTest.php @@ -24,14 +24,6 @@ public function testShouldNotBeFinal() $this->assertClassNotFinal(SimpleConsumeCommand::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredAttributes() - { - new SimpleConsumeCommand($this->createQueueConsumerMock()); - } - public function testShouldHaveExpectedOptions() { $command = new SimpleConsumeCommand($this->createQueueConsumerMock()); diff --git a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php index 1370b4df6..5504e8ef6 100644 --- a/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php +++ b/pkg/enqueue/Tests/Symfony/ContainerProcessorRegistryTest.php @@ -23,14 +23,6 @@ public function testShouldBeFinal() $this->assertClassFinal(ContainerProcessorRegistry::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContainerAsFirstArgument() - { - new ContainerProcessorRegistry($this->createContainerMock()); - } - public function testShouldAllowGetProcessor() { $processorMock = $this->createProcessorMock(); diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php index c558aaddb..bdccd338c 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildConsumptionExtensionsPassTest.php @@ -25,14 +25,6 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildConsumptionExtensionsPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new BuildConsumptionExtensionsPass(); - } - public function testThrowIfEnqueueTransportsParameterNotSet() { $pass = new BuildConsumptionExtensionsPass(); diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php index e3a333055..134c216dc 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/BuildProcessorRegistryPassTest.php @@ -26,14 +26,6 @@ public function testShouldBeFinal() $this->assertClassFinal(BuildProcessorRegistryPass::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutArguments() - { - new BuildProcessorRegistryPass(); - } - public function testThrowIfEnqueueTransportsParameterNotSet() { $pass = new BuildProcessorRegistryPass(); diff --git a/pkg/enqueue/Tests/Symfony/LazyProducerTest.php b/pkg/enqueue/Tests/Symfony/LazyProducerTest.php index 7fbe714ac..c8ba596a8 100644 --- a/pkg/enqueue/Tests/Symfony/LazyProducerTest.php +++ b/pkg/enqueue/Tests/Symfony/LazyProducerTest.php @@ -20,14 +20,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(ProducerInterface::class, LazyProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContainerAndServiceId() - { - new LazyProducer($this->createContainerMock(), 'realProducerId'); - } - public function testShouldNotCallRealProducerInConstructor() { $containerMock = $this->createContainerMock(); diff --git a/pkg/enqueue/Tests/Util/VarExportTest.php b/pkg/enqueue/Tests/Util/VarExportTest.php index a8fa92f20..e8034a1c7 100644 --- a/pkg/enqueue/Tests/Util/VarExportTest.php +++ b/pkg/enqueue/Tests/Util/VarExportTest.php @@ -7,14 +7,6 @@ class VarExportTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithValueAsArgument() - { - new VarExport('aVal'); - } - /** * @dataProvider provideValues * diff --git a/pkg/fs/Tests/FsConsumerTest.php b/pkg/fs/Tests/FsConsumerTest.php index 044d05ae2..67f03ae98 100644 --- a/pkg/fs/Tests/FsConsumerTest.php +++ b/pkg/fs/Tests/FsConsumerTest.php @@ -20,14 +20,6 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, FsConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContextAndDestinationAndPreFetchCountAsArguments() - { - new FsConsumer($this->createContextMock(), new FsDestination(TempFile::generate()), 1); - } - public function testShouldReturnDestinationSetInConstructorOnGetQueue() { $destination = new FsDestination(TempFile::generate()); diff --git a/pkg/fs/Tests/FsContextTest.php b/pkg/fs/Tests/FsContextTest.php index ed1aec87b..9d5a5f1fc 100644 --- a/pkg/fs/Tests/FsContextTest.php +++ b/pkg/fs/Tests/FsContextTest.php @@ -24,14 +24,6 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, FsContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExpectedArguments() - { - new FsContext(sys_get_temp_dir(), 1, 0666, 100); - } - public function testShouldAllowCreateEmptyMessage() { $context = new FsContext(sys_get_temp_dir(), 1, 0666, 100); diff --git a/pkg/fs/Tests/FsProducerTest.php b/pkg/fs/Tests/FsProducerTest.php index 1aa25fa3e..266854c7b 100644 --- a/pkg/fs/Tests/FsProducerTest.php +++ b/pkg/fs/Tests/FsProducerTest.php @@ -23,14 +23,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, FsProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContextAsFirstArgument() - { - new FsProducer($this->createContextMock()); - } - public function testThrowIfDestinationNotFsOnSend() { $producer = new FsProducer($this->createContextMock()); diff --git a/pkg/gearman/Tests/GearmanContextTest.php b/pkg/gearman/Tests/GearmanContextTest.php index deafe303b..8a36ad80b 100644 --- a/pkg/gearman/Tests/GearmanContextTest.php +++ b/pkg/gearman/Tests/GearmanContextTest.php @@ -24,14 +24,6 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, GearmanContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithConnectionConfigAsFirstArgument() - { - new GearmanContext(['host' => 'aHost', 'port' => 'aPort']); - } - public function testThrowNotImplementedOnCreateTemporaryQueue() { $context = new GearmanContext(['host' => 'aHost', 'port' => 'aPort']); diff --git a/pkg/gearman/Tests/GearmanProducerTest.php b/pkg/gearman/Tests/GearmanProducerTest.php index 537a0550b..2a7baa4de 100644 --- a/pkg/gearman/Tests/GearmanProducerTest.php +++ b/pkg/gearman/Tests/GearmanProducerTest.php @@ -18,14 +18,6 @@ class GearmanProducerTest extends TestCase use ClassExtensionTrait; use SkipIfGearmanExtensionIsNotInstalledTrait; - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithGearmanClientAsFirstArgument() - { - new GearmanProducer($this->createGearmanClientMock()); - } - public function testThrowIfDestinationInvalid() { $producer = new GearmanProducer($this->createGearmanClientMock()); diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php index edb489474..8509f0544 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusProcessorTest.php @@ -17,19 +17,6 @@ class CalculateRootJobStatusProcessorTest extends \PHPUnit\Framework\TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new CalculateRootJobStatusProcessor( - $this->createJobStorageMock(), - $this->createCalculateRootJobStatusCaseMock(), - $this->createProducerMock(), - $this->createLoggerMock() - ); - } - public function testShouldReturnSubscribedTopicNames() { $this->assertEquals( diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php index 05badc3e7..695c08e6e 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php @@ -9,14 +9,6 @@ class CalculateRootJobStatusServiceTest extends \PHPUnit\Framework\TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new CalculateRootJobStatusService($this->createJobStorageMock()); - } - public function stopStatusProvider() { return [ diff --git a/pkg/job-queue/Tests/DependentJobContextTest.php b/pkg/job-queue/Tests/DependentJobContextTest.php index 7e517e705..35942a974 100644 --- a/pkg/job-queue/Tests/DependentJobContextTest.php +++ b/pkg/job-queue/Tests/DependentJobContextTest.php @@ -7,14 +7,6 @@ class DependentJobContextTest extends \PHPUnit\Framework\TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new DependentJobContext(new Job()); - } - public function testShouldReturnJob() { $job = new Job(); diff --git a/pkg/job-queue/Tests/DependentJobServiceTest.php b/pkg/job-queue/Tests/DependentJobServiceTest.php index a524ab255..e8809b4b0 100644 --- a/pkg/job-queue/Tests/DependentJobServiceTest.php +++ b/pkg/job-queue/Tests/DependentJobServiceTest.php @@ -10,14 +10,6 @@ class DependentJobServiceTest extends \PHPUnit\Framework\TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new DependentJobService($this->createJobStorageMock()); - } - public function testShouldThrowIfJobIsNotRootJob() { $job = new Job(); diff --git a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php index e37a2a599..73f130d52 100644 --- a/pkg/job-queue/Tests/Doctrine/JobStorageTest.php +++ b/pkg/job-queue/Tests/Doctrine/JobStorageTest.php @@ -15,14 +15,6 @@ class JobStorageTest extends \PHPUnit\Framework\TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new JobStorage($this->createDoctrineMock(), 'entity-class', 'unique_table'); - } - public function testShouldCreateJobObject() { $repository = $this->createRepositoryMock(); diff --git a/pkg/job-queue/Tests/JobProcessorTest.php b/pkg/job-queue/Tests/JobProcessorTest.php index 882678bf2..9f1c7b2fd 100644 --- a/pkg/job-queue/Tests/JobProcessorTest.php +++ b/pkg/job-queue/Tests/JobProcessorTest.php @@ -13,14 +13,6 @@ class JobProcessorTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeCreatedWithRequiredArguments() - { - new JobProcessor($this->createJobStorage(), $this->createProducerMock()); - } - public function testCreateRootJobShouldThrowIfOwnerIdIsEmpty() { $processor = new JobProcessor($this->createJobStorage(), $this->createProducerMock()); diff --git a/pkg/mongodb/Tests/MongodbConsumerTest.php b/pkg/mongodb/Tests/MongodbConsumerTest.php index 35dfba377..c6a642500 100644 --- a/pkg/mongodb/Tests/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbConsumerTest.php @@ -25,14 +25,6 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, MongodbConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new MongodbConsumer($this->createContextMock(), new MongodbDestination('queue')); - } - public function testShouldReturnInstanceOfDestination() { $destination = new MongodbDestination('queue'); diff --git a/pkg/mongodb/Tests/MongodbContextTest.php b/pkg/mongodb/Tests/MongodbContextTest.php index 830a6dd55..8cdef79ff 100644 --- a/pkg/mongodb/Tests/MongodbContextTest.php +++ b/pkg/mongodb/Tests/MongodbContextTest.php @@ -29,14 +29,6 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, MongodbContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new MongodbContext($this->createClientMock()); - } - public function testCouldBeConstructedWithEmptyConfiguration() { $context = new MongodbContext($this->createClientMock(), []); diff --git a/pkg/mongodb/Tests/MongodbProducerTest.php b/pkg/mongodb/Tests/MongodbProducerTest.php index 6b8b1b2e8..6987b1a76 100644 --- a/pkg/mongodb/Tests/MongodbProducerTest.php +++ b/pkg/mongodb/Tests/MongodbProducerTest.php @@ -23,14 +23,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, MongodbProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new MongodbProducer($this->createContextMock()); - } - public function testShouldThrowIfDestinationOfInvalidType() { $this->expectException(InvalidDestinationException::class); diff --git a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php index 5ff1687d8..d982e0418 100644 --- a/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbSubscriptionConsumerTest.php @@ -24,14 +24,6 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithMongodbContextAsFirstArgument() - { - new MongodbSubscriptionConsumer($this->createMongodbContextMock()); - } - public function testShouldAddConsumerAndCallbackToSubscribersPropertyOnSubscribe() { $subscriptionConsumer = new MongodbSubscriptionConsumer($this->createMongodbContextMock()); diff --git a/pkg/null/Tests/NullConnectionFactoryTest.php b/pkg/null/Tests/NullConnectionFactoryTest.php index 8c2599591..bbf377e85 100644 --- a/pkg/null/Tests/NullConnectionFactoryTest.php +++ b/pkg/null/Tests/NullConnectionFactoryTest.php @@ -17,14 +17,6 @@ public function testShouldImplementConnectionFactoryInterface() $this->assertClassImplements(ConnectionFactory::class, NullConnectionFactory::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new NullConnectionFactory(); - } - public function testShouldReturnNullContextOnCreateContextCall() { $factory = new NullConnectionFactory(); diff --git a/pkg/null/Tests/NullConsumerTest.php b/pkg/null/Tests/NullConsumerTest.php index 5db15ae95..f4de53311 100644 --- a/pkg/null/Tests/NullConsumerTest.php +++ b/pkg/null/Tests/NullConsumerTest.php @@ -18,14 +18,6 @@ public function testShouldImplementMessageConsumerInterface() $this->assertClassImplements(Consumer::class, NullConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithQueueAsArgument() - { - new NullConsumer(new NullQueue('aName')); - } - public function testShouldAlwaysReturnNullOnReceive() { $consumer = new NullConsumer(new NullQueue('theQueueName')); diff --git a/pkg/null/Tests/NullContextTest.php b/pkg/null/Tests/NullContextTest.php index 257eee84b..f0da566d2 100644 --- a/pkg/null/Tests/NullContextTest.php +++ b/pkg/null/Tests/NullContextTest.php @@ -21,14 +21,6 @@ public function testShouldImplementSessionInterface() $this->assertClassImplements(Context::class, NullContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new NullContext(); - } - public function testShouldAllowCreateMessageWithoutAnyArguments() { $context = new NullContext(); diff --git a/pkg/null/Tests/NullProducerTest.php b/pkg/null/Tests/NullProducerTest.php index 149310498..140d683ba 100644 --- a/pkg/null/Tests/NullProducerTest.php +++ b/pkg/null/Tests/NullProducerTest.php @@ -18,14 +18,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, NullProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new NullProducer(); - } - /** * @doesNotPerformAssertions */ diff --git a/pkg/null/Tests/NullQueueTest.php b/pkg/null/Tests/NullQueueTest.php index cace66439..cb29ca180 100644 --- a/pkg/null/Tests/NullQueueTest.php +++ b/pkg/null/Tests/NullQueueTest.php @@ -16,14 +16,6 @@ public function testShouldImplementQueueInterface() $this->assertClassImplements(Queue::class, NullQueue::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithNameAsArgument() - { - new NullQueue('aName'); - } - public function testShouldAllowGetNameSetInConstructor() { $queue = new NullQueue('theName'); diff --git a/pkg/null/Tests/NullTopicTest.php b/pkg/null/Tests/NullTopicTest.php index 017df3236..27c4b58de 100644 --- a/pkg/null/Tests/NullTopicTest.php +++ b/pkg/null/Tests/NullTopicTest.php @@ -16,14 +16,6 @@ public function testShouldImplementTopicInterface() $this->assertClassImplements(Topic::class, NullTopic::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithNameAsArgument() - { - new NullTopic('aName'); - } - public function testShouldAllowGetNameSetInConstructor() { $topic = new NullTopic('theName'); diff --git a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php index b78f3be23..944ac9b81 100644 --- a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php @@ -14,17 +14,6 @@ class PheanstalkConsumerTest extends TestCase { use ClassExtensionTrait; - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithDestinationAndPheanstalkAsArguments() - { - new PheanstalkConsumer( - new PheanstalkDestination('aQueueName'), - $this->createPheanstalkMock() - ); - } - public function testShouldReturnQueueSetInConstructor() { $destination = new PheanstalkDestination('aQueueName'); diff --git a/pkg/pheanstalk/Tests/PheanstalkContextTest.php b/pkg/pheanstalk/Tests/PheanstalkContextTest.php index e122872c3..3b7bfbeb7 100644 --- a/pkg/pheanstalk/Tests/PheanstalkContextTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkContextTest.php @@ -21,14 +21,6 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, PheanstalkContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithPheanstalkAsFirstArgument() - { - new PheanstalkContext($this->createPheanstalkMock()); - } - public function testThrowNotImplementedOnCreateTemporaryQueue() { $context = new PheanstalkContext($this->createPheanstalkMock()); diff --git a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php index b6d6dff03..b9a69176c 100644 --- a/pkg/pheanstalk/Tests/PheanstalkProducerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkProducerTest.php @@ -18,14 +18,6 @@ class PheanstalkProducerTest extends TestCase { use ClassExtensionTrait; - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithPheanstalkAsFirstArgument() - { - new PheanstalkProducer($this->createPheanstalkMock()); - } - public function testThrowIfDestinationInvalid() { $producer = new PheanstalkProducer($this->createPheanstalkMock()); diff --git a/pkg/rdkafka/Tests/JsonSerializerTest.php b/pkg/rdkafka/Tests/JsonSerializerTest.php index 32805ca16..6c9bbef84 100644 --- a/pkg/rdkafka/Tests/JsonSerializerTest.php +++ b/pkg/rdkafka/Tests/JsonSerializerTest.php @@ -17,14 +17,6 @@ public function testShouldImplementSerializerInterface() $this->assertClassImplements(Serializer::class, JsonSerializer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new JsonSerializer(); - } - public function testShouldConvertMessageToJsonString() { $serializer = new JsonSerializer(); diff --git a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php index 471e31a91..74e92954b 100644 --- a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php @@ -13,19 +13,6 @@ class RdKafkaConsumerTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new RdKafkaConsumer( - $this->createKafkaConsumerMock(), - $this->createContextMock(), - new RdKafkaTopic(''), - $this->createSerializerMock() - ); - } - public function testShouldReturnQueueSetInConstructor() { $destination = new RdKafkaTopic(''); diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index 25451f5b4..6082968ad 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -17,14 +17,6 @@ class RdKafkaProducerTest extends TestCase { - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithKafkaProducerAndSerializerAsArguments() - { - new RdKafkaProducer($this->createKafkaProducerMock(), $this->createSerializerMock()); - } - public function testThrowIfDestinationInvalid() { $producer = new RdKafkaProducer($this->createKafkaProducerMock(), $this->createSerializerMock()); diff --git a/pkg/redis/Tests/RedisConsumerTest.php b/pkg/redis/Tests/RedisConsumerTest.php index 659060fa8..56373c18a 100644 --- a/pkg/redis/Tests/RedisConsumerTest.php +++ b/pkg/redis/Tests/RedisConsumerTest.php @@ -22,14 +22,6 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, RedisConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithContextAndDestinationAndPreFetchCountAsArguments() - { - new RedisConsumer($this->createContextMock(), new RedisDestination('aQueue')); - } - public function testShouldReturnDestinationSetInConstructorOnGetQueue() { $destination = new RedisDestination('aQueue'); diff --git a/pkg/redis/Tests/RedisContextTest.php b/pkg/redis/Tests/RedisContextTest.php index 597b71554..6395e954e 100644 --- a/pkg/redis/Tests/RedisContextTest.php +++ b/pkg/redis/Tests/RedisContextTest.php @@ -25,24 +25,6 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, RedisContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRedisAsFirstArgument() - { - new RedisContext($this->createRedisMock(), 300); - } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRedisFactoryAsFirstArgument() - { - new RedisContext(function () { - return $this->createRedisMock(); - }, 300); - } - public function testThrowIfNeitherRedisNorFactoryGiven() { $this->expectException(\InvalidArgumentException::class); diff --git a/pkg/redis/Tests/RedisProducerTest.php b/pkg/redis/Tests/RedisProducerTest.php index 345c632b5..40e03bae2 100644 --- a/pkg/redis/Tests/RedisProducerTest.php +++ b/pkg/redis/Tests/RedisProducerTest.php @@ -25,14 +25,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, RedisProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRedisAsFirstArgument() - { - new RedisProducer($this->createContextMock()); - } - public function testThrowIfDestinationNotRedisDestinationOnSend() { $producer = new RedisProducer($this->createContextMock()); diff --git a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php index f27cb5155..8d00fcc14 100644 --- a/pkg/redis/Tests/RedisSubscriptionConsumerTest.php +++ b/pkg/redis/Tests/RedisSubscriptionConsumerTest.php @@ -22,14 +22,6 @@ public function testShouldImplementSubscriptionConsumerInterface() $this->assertTrue($rc->implementsInterface(SubscriptionConsumer::class)); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRedisContextAsFirstArgument() - { - new RedisSubscriptionConsumer($this->createRedisContextMock()); - } - public function testShouldAddConsumerAndCallbackToSubscribersPropertyOnSubscribe() { $subscriptionConsumer = new RedisSubscriptionConsumer($this->createRedisContextMock()); diff --git a/pkg/redis/Tests/Spec/JsonSerializerTest.php b/pkg/redis/Tests/Spec/JsonSerializerTest.php index 21bc8d836..78a0aed86 100644 --- a/pkg/redis/Tests/Spec/JsonSerializerTest.php +++ b/pkg/redis/Tests/Spec/JsonSerializerTest.php @@ -20,14 +20,6 @@ public function testShouldImplementSerializerInterface() $this->assertClassImplements(Serializer::class, JsonSerializer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new JsonSerializer(); - } - public function testShouldConvertMessageToJsonString() { $serializer = new JsonSerializer(); diff --git a/pkg/sns/Tests/SnsProducerTest.php b/pkg/sns/Tests/SnsProducerTest.php index 7001784dc..1c6be7f85 100644 --- a/pkg/sns/Tests/SnsProducerTest.php +++ b/pkg/sns/Tests/SnsProducerTest.php @@ -27,14 +27,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, SnsProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new SnsProducer($this->createSnsContextMock()); - } - public function testShouldThrowIfBodyOfInvalidType() { $this->expectException(InvalidMessageException::class); diff --git a/pkg/snsqs/Tests/SnsQsProducerTest.php b/pkg/snsqs/Tests/SnsQsProducerTest.php index 033bfdfd4..59798dc11 100644 --- a/pkg/snsqs/Tests/SnsQsProducerTest.php +++ b/pkg/snsqs/Tests/SnsQsProducerTest.php @@ -32,14 +32,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, SnsQsProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new SnsQsProducer($this->createSnsContextMock(), $this->createSqsContextMock()); - } - public function testShouldThrowIfMessageIsInvalidType() { $this->expectException(InvalidMessageException::class); diff --git a/pkg/sqs/Tests/SqsConsumerTest.php b/pkg/sqs/Tests/SqsConsumerTest.php index b05ce246d..ef06c6157 100644 --- a/pkg/sqs/Tests/SqsConsumerTest.php +++ b/pkg/sqs/Tests/SqsConsumerTest.php @@ -24,14 +24,6 @@ public function testShouldImplementConsumerInterface() $this->assertClassImplements(Consumer::class, SqsConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new SqsConsumer($this->createContextMock(), new SqsDestination('queue')); - } - public function testShouldReturnInstanceOfDestination() { $destination = new SqsDestination('queue'); diff --git a/pkg/sqs/Tests/SqsContextTest.php b/pkg/sqs/Tests/SqsContextTest.php index bfa2163bf..5081add41 100644 --- a/pkg/sqs/Tests/SqsContextTest.php +++ b/pkg/sqs/Tests/SqsContextTest.php @@ -25,14 +25,6 @@ public function testShouldImplementContextInterface() $this->assertClassImplements(Context::class, SqsContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithSqsClientAsFirstArgument() - { - new SqsContext($this->createSqsClientMock(), []); - } - public function testShouldAllowCreateEmptyMessage() { $context = new SqsContext($this->createSqsClientMock(), []); diff --git a/pkg/sqs/Tests/SqsProducerTest.php b/pkg/sqs/Tests/SqsProducerTest.php index 1db3632d0..35cb9850b 100644 --- a/pkg/sqs/Tests/SqsProducerTest.php +++ b/pkg/sqs/Tests/SqsProducerTest.php @@ -24,14 +24,6 @@ public function testShouldImplementProducerInterface() $this->assertClassImplements(Producer::class, SqsProducer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new SqsProducer($this->createSqsContextMock()); - } - public function testShouldThrowIfBodyOfInvalidType() { $this->expectException(InvalidMessageException::class); diff --git a/pkg/stomp/Tests/BufferedStompClientTest.php b/pkg/stomp/Tests/BufferedStompClientTest.php index 3a2183b48..e4b6226e1 100644 --- a/pkg/stomp/Tests/BufferedStompClientTest.php +++ b/pkg/stomp/Tests/BufferedStompClientTest.php @@ -21,14 +21,6 @@ public function testShouldExtendLibStompClient() $this->assertClassExtends(Client::class, BufferedStompClient::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredArguments() - { - new BufferedStompClient('tcp://localhost:12345'); - } - public function testCouldGetBufferSizeValue() { $client = new BufferedStompClient('tcp://localhost:12345', 12345); diff --git a/pkg/stomp/Tests/StompConsumerTest.php b/pkg/stomp/Tests/StompConsumerTest.php index 2d3997677..d461284c9 100644 --- a/pkg/stomp/Tests/StompConsumerTest.php +++ b/pkg/stomp/Tests/StompConsumerTest.php @@ -25,14 +25,6 @@ public function testShouldImplementMessageConsumerInterface() $this->assertClassImplements(Consumer::class, StompConsumer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithRequiredAttributes() - { - new StompConsumer($this->createStompClientMock(), $this->createDummyDestination()); - } - public function testCouldGetQueue() { $consumer = new StompConsumer($this->createStompClientMock(), $dest = $this->createDummyDestination()); diff --git a/pkg/stomp/Tests/StompContextTest.php b/pkg/stomp/Tests/StompContextTest.php index 8f8fea6bb..cfb9245dc 100644 --- a/pkg/stomp/Tests/StompContextTest.php +++ b/pkg/stomp/Tests/StompContextTest.php @@ -23,24 +23,6 @@ public function testShouldImplementSessionInterface() $this->assertClassImplements(Context::class, StompContext::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeCreatedWithRequiredArguments() - { - new StompContext($this->createStompClientMock(), ExtensionType::RABBITMQ); - } - - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithExtChannelCallbackFactoryAsFirstArgument() - { - new StompContext(function () { - return $this->createStompClientMock(); - }, ExtensionType::RABBITMQ); - } - public function testThrowIfNeitherCallbackNorExtChannelAsFirstArgument() { $this->expectException(\InvalidArgumentException::class); diff --git a/pkg/wamp/Tests/Spec/JsonSerializerTest.php b/pkg/wamp/Tests/Spec/JsonSerializerTest.php index 0b0dbae4f..f1c3e24d3 100644 --- a/pkg/wamp/Tests/Spec/JsonSerializerTest.php +++ b/pkg/wamp/Tests/Spec/JsonSerializerTest.php @@ -20,14 +20,6 @@ public function testShouldImplementSerializerInterface() $this->assertClassImplements(Serializer::class, JsonSerializer::class); } - /** - * @doesNotPerformAssertions - */ - public function testCouldBeConstructedWithoutAnyArguments() - { - new JsonSerializer(); - } - public function testShouldConvertMessageToJsonString() { $serializer = new JsonSerializer(); From 40e8af9af3e99d245bdc06e8ca5c91b121be5b2d Mon Sep 17 00:00:00 2001 From: James Read Date: Wed, 15 Jan 2025 22:48:51 +0000 Subject: [PATCH 1136/1142] Fixing cs fixer config Changing php-cs-fixer config filename to the default so it's detected without having to specify the config flag --- .github/workflows/ci.yml | 2 +- .gitignore | 21 +++++++++++---------- .php_cs.php => .php-cs-fixer.dist.php | 1 + bin/fix-symfony-version.php | 6 +++--- composer.json | 5 ++--- docker-compose.yml | 2 +- docker/bin/refresh-mysql-database.php | 4 ++-- docker/bin/refresh-postgres-database.php | 2 +- 8 files changed, 22 insertions(+), 21 deletions(-) rename .php_cs.php => .php-cs-fixer.dist.php (94%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1f3b500e8..e284867ec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,7 @@ jobs: - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: ./bin/php-cs-fixer fix --config=.php_cs.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} + - run: ./bin/php-cs-fixer fix --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} if: env.GIT_DIFF_FILTERED unit_tests: diff --git a/.gitignore b/.gitignore index e92454ae9..7a2e2ec9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,21 @@ *~ /.idea/ bin/doctrine* -bin/php-cs-fixer -bin/phpunit -bin/sql-formatter -bin/phpstan -bin/jp.php -bin/php-parse -bin/google-cloud-batch +bin/php-cs-fixer* +bin/phpunit* +bin/sql-formatter* +bin/phpstan* +bin/jp.php* +bin/php-parse* +bin/google-cloud-batch* +bin/patch-type-declarations* bin/thruway -bin/phpstan.phar -bin/var-dump-server -bin/yaml-lint +bin/var-dump-server* +bin/yaml-lint* vendor var .php_cs .php_cs.cache composer.lock .phpunit.result.cache +.php-cs-fixer.cache diff --git a/.php_cs.php b/.php-cs-fixer.dist.php similarity index 94% rename from .php_cs.php rename to .php-cs-fixer.dist.php index e1755cb13..b9316b59b 100644 --- a/.php_cs.php +++ b/.php-cs-fixer.dist.php @@ -1,6 +1,7 @@ setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect()) ->setRiskyAllowed(true) ->setRules(array( '@Symfony' => true, diff --git a/bin/fix-symfony-version.php b/bin/fix-symfony-version.php index efd0eb50e..aac84f081 100644 --- a/bin/fix-symfony-version.php +++ b/bin/fix-symfony-version.php @@ -1,14 +1,14 @@ createContext(); @@ -13,4 +13,4 @@ $dbalContext->getDbalConnection()->exec('USE '.$database); $dbalContext->createDataBaseTable(); -echo 'MySQL Database is updated'.PHP_EOL; +echo 'MySQL Database is updated'.\PHP_EOL; diff --git a/docker/bin/refresh-postgres-database.php b/docker/bin/refresh-postgres-database.php index 7efaf4806..1d96c3c07 100644 --- a/docker/bin/refresh-postgres-database.php +++ b/docker/bin/refresh-postgres-database.php @@ -11,4 +11,4 @@ $dbalContext->getDbalConnection()->getSchemaManager()->dropAndCreateDatabase('postgres'); $dbalContext->createDataBaseTable(); -echo 'Postgresql Database is updated'.PHP_EOL; +echo 'Postgresql Database is updated'.\PHP_EOL; From a8b3dd909e260937492093498abfc28903106fff Mon Sep 17 00:00:00 2001 From: James Read Date: Wed, 15 Jan 2025 22:51:32 +0000 Subject: [PATCH 1137/1142] Running php-cs-fixer Running php-cs-fixer to fix CS drift --- docker/bin/test.sh | 2 +- pkg/amqp-bunny/AmqpConnectionFactory.php | 10 +++--- pkg/amqp-bunny/AmqpConsumer.php | 4 +-- pkg/amqp-bunny/AmqpContext.php | 6 +--- pkg/amqp-bunny/AmqpProducer.php | 6 ++-- pkg/amqp-bunny/AmqpSubscriptionConsumer.php | 6 ++-- ...ayedMessageWithDelayPluginStrategyTest.php | 5 --- ...ceiveDelayedMessageWithDlxStrategyTest.php | 5 --- ...ndReceivePriorityMessagesFromQueueTest.php | 5 --- ...ReceiveTimeToLiveMessagesFromQueueTest.php | 5 --- ...qpSendAndReceiveTimestampAsIntegerTest.php | 3 -- .../AmqpSendToAndReceiveFromQueueTest.php | 5 --- .../AmqpSendToAndReceiveFromTopicTest.php | 5 --- ...mqpSendToAndReceiveNoWaitFromQueueTest.php | 5 --- ...mqpSendToAndReceiveNoWaitFromTopicTest.php | 5 --- ...AmqpSendToTopicAndReceiveFromQueueTest.php | 7 ---- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 7 ---- .../AmqpSslSendToAndReceiveFromQueueTest.php | 5 --- ...umerConsumeFromAllSubscribedQueuesTest.php | 4 --- ...onConsumerConsumeUntilUnsubscribedTest.php | 4 --- ...mqpSubscriptionConsumerStopOnFalseTest.php | 4 --- pkg/amqp-ext/AmqpConnectionFactory.php | 2 +- pkg/amqp-ext/AmqpConsumer.php | 4 +-- pkg/amqp-ext/AmqpContext.php | 5 +-- pkg/amqp-ext/AmqpProducer.php | 6 ++-- pkg/amqp-ext/AmqpSubscriptionConsumer.php | 4 +-- pkg/amqp-ext/Tests/AmqpConsumerTest.php | 1 - pkg/amqp-ext/Tests/Spec/AmqpMessageTest.php | 3 -- pkg/amqp-ext/Tests/Spec/AmqpProducerTest.php | 3 -- ...ayedMessageWithDelayPluginStrategyTest.php | 5 --- ...ceiveDelayedMessageWithDlxStrategyTest.php | 5 --- ...ndReceivePriorityMessagesFromQueueTest.php | 5 --- ...ReceiveTimeToLiveMessagesFromQueueTest.php | 5 --- ...pSendAndReceiveTimestampAsIntengerTest.php | 3 -- .../AmqpSendToAndReceiveFromQueueTest.php | 5 --- .../AmqpSendToAndReceiveFromTopicTest.php | 5 --- ...mqpSendToAndReceiveNoWaitFromQueueTest.php | 5 --- ...mqpSendToAndReceiveNoWaitFromTopicTest.php | 5 --- ...AmqpSendToTopicAndReceiveFromQueueTest.php | 7 ---- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 7 ---- .../AmqpSslSendToAndReceiveFromQueueTest.php | 5 --- ...umerConsumeFromAllSubscribedQueuesTest.php | 4 --- ...onConsumerConsumeUntilUnsubscribedTest.php | 4 --- ...mqpSubscriptionConsumerStopOnFalseTest.php | 4 --- pkg/amqp-ext/Tests/fix_composer_json.php | 2 +- pkg/amqp-ext/examples/consume.php | 4 +-- pkg/amqp-ext/examples/produce.php | 2 +- pkg/amqp-lib/AmqpConnectionFactory.php | 2 +- pkg/amqp-lib/AmqpConsumer.php | 5 ++- pkg/amqp-lib/AmqpProducer.php | 6 ++-- pkg/amqp-lib/AmqpSubscriptionConsumer.php | 4 +-- pkg/amqp-lib/Tests/Spec/AmqpProducerTest.php | 3 -- ...ayedMessageWithDelayPluginStrategyTest.php | 5 --- ...ceiveDelayedMessageWithDlxStrategyTest.php | 5 --- ...ndReceivePriorityMessagesFromQueueTest.php | 5 --- ...ReceiveTimeToLiveMessagesFromQueueTest.php | 5 --- ...pSendAndReceiveTimestampAsIntengerTest.php | 3 -- .../AmqpSendToAndReceiveFromQueueTest.php | 5 --- .../AmqpSendToAndReceiveFromTopicTest.php | 5 --- ...mqpSendToAndReceiveNoWaitFromQueueTest.php | 5 --- ...mqpSendToAndReceiveNoWaitFromTopicTest.php | 5 --- ...AmqpSendToTopicAndReceiveFromQueueTest.php | 7 ---- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 7 ---- .../AmqpSslSendToAndReceiveFromQueueTest.php | 5 --- ...umerConsumeFromAllSubscribedQueuesTest.php | 4 --- ...onConsumerConsumeUntilUnsubscribedTest.php | 4 --- ...mqpSubscriptionConsumerStopOnFalseTest.php | 4 --- pkg/amqp-lib/examples/consume.php | 4 +-- pkg/amqp-lib/examples/produce.php | 4 +-- pkg/amqp-lib/tutorial/rpc_client.php | 8 ++--- pkg/amqp-lib/tutorial/rpc_server.php | 2 +- pkg/amqp-tools/ConnectionConfig.php | 32 ++++++----------- pkg/amqp-tools/DelayStrategyAware.php | 2 +- pkg/amqp-tools/DelayStrategyAwareTrait.php | 2 +- .../RabbitMqDelayPluginDelayStrategy.php | 5 +-- pkg/amqp-tools/RabbitMqDlxDelayStrategy.php | 8 +---- pkg/amqp-tools/SignalSocketHelper.php | 9 ++--- pkg/amqp-tools/Tests/ConnectionConfigTest.php | 3 -- .../RabbitMqDelayPluginDelayStrategyTest.php | 6 ++-- pkg/async-command/CommandResult.php | 13 ++----- pkg/async-command/Commands.php | 2 +- pkg/async-command/RunCommand.php | 9 ++--- .../AsyncEventDispatcher.php | 2 +- pkg/async-event-dispatcher/AsyncProcessor.php | 6 +--- pkg/async-event-dispatcher/Commands.php | 2 +- .../AsyncTransformersPass.php | 3 -- .../EventTransformer.php | 5 +-- .../PhpSerializerEventTransformer.php | 2 +- pkg/async-event-dispatcher/SimpleRegistry.php | 14 ++------ .../Tests/SimpleRegistryTest.php | 2 +- pkg/dbal/DbalConnectionFactory.php | 2 +- pkg/dbal/DbalContext.php | 5 +-- pkg/dbal/DbalMessage.php | 26 +++++--------- pkg/dbal/DbalProducer.php | 10 +++--- pkg/dbal/DbalSubscriptionConsumer.php | 6 ++-- pkg/dbal/JSON.php | 27 ++++---------- .../Tests/DbalConnectionFactoryConfigTest.php | 3 -- pkg/dbal/Tests/DbalConsumerTest.php | 8 ++--- .../Tests/Functional/DbalConsumerTest.php | 18 +++++----- .../Tests/Spec/DbalConnectionFactoryTest.php | 3 -- pkg/dbal/Tests/Spec/DbalMessageTest.php | 3 -- pkg/dbal/Tests/Spec/DbalQueueTest.php | 3 -- pkg/dbal/Tests/Spec/DbalTopicTest.php | 3 -- pkg/dbal/Tests/Spec/Mysql/DbalContextTest.php | 3 -- .../Tests/Spec/Mysql/DbalProducerTest.php | 3 -- .../Spec/Mysql/DbalRequeueMessageTest.php | 3 -- ...dAndReceiveDelayedMessageFromQueueTest.php | 3 -- ...ndReceivePriorityMessagesFromQueueTest.php | 2 -- ...ReceiveTimeToLiveMessagesFromQueueTest.php | 3 -- .../DbalSendToAndReceiveFromQueueTest.php | 3 -- .../DbalSendToAndReceiveFromTopicTest.php | 3 -- ...balSendToAndReceiveNoWaitFromQueueTest.php | 3 -- ...balSendToAndReceiveNoWaitFromTopicTest.php | 3 -- ...umerConsumeFromAllSubscribedQueuesTest.php | 4 --- ...onConsumerConsumeUntilUnsubscribedTest.php | 4 --- ...balSubscriptionConsumerStopOnFalseTest.php | 4 --- .../Tests/Spec/Postgresql/DbalContextTest.php | 3 -- .../Spec/Postgresql/DbalProducerTest.php | 3 -- .../Postgresql/DbalRequeueMessageTest.php | 3 -- ...dAndReceiveDelayedMessageFromQueueTest.php | 3 -- ...ndReceivePriorityMessagesFromQueueTest.php | 2 -- ...ReceiveTimeToLiveMessagesFromQueueTest.php | 3 -- .../DbalSendToAndReceiveFromQueueTest.php | 3 -- .../DbalSendToAndReceiveFromTopicTest.php | 3 -- ...balSendToAndReceiveNoWaitFromQueueTest.php | 3 -- ...balSendToAndReceiveNoWaitFromTopicTest.php | 3 -- ...umerConsumeFromAllSubscribedQueuesTest.php | 4 --- ...onConsumerConsumeUntilUnsubscribedTest.php | 4 --- ...balSubscriptionConsumerStopOnFalseTest.php | 4 --- pkg/dbal/examples/consume.php | 4 +-- pkg/dbal/examples/produce.php | 4 +-- pkg/dsn/Dsn.php | 36 +++++++++---------- pkg/dsn/QueryBag.php | 10 +++--- .../DoctrinePingConnectionExtension.php | 6 ++-- pkg/enqueue-bundle/EnqueueBundle.php | 4 +-- .../App/TestAsyncEventTransformer.php | 4 +-- .../Tests/Functional/Client/ProducerTest.php | 1 - .../Tests/Functional/TestCommandProcessor.php | 2 +- .../Tests/Functional/TestProcessor.php | 2 +- .../Extension/ResetServicesExtensionTest.php | 1 - .../Tests/fix_composer_json.php | 2 +- pkg/enqueue/Client/ChainExtension.php | 2 +- pkg/enqueue/Client/Config.php | 32 ++++++++--------- .../DelayRedeliveredMessageExtension.php | 5 ++- .../SetRouterPropertiesExtension.php | 3 -- .../SetupBrokerExtension.php | 3 -- pkg/enqueue/Client/DelegateProcessor.php | 2 -- pkg/enqueue/Client/Driver/AmqpDriver.php | 10 ++---- pkg/enqueue/Client/Driver/DbalDriver.php | 2 +- pkg/enqueue/Client/Driver/FsDriver.php | 4 +-- pkg/enqueue/Client/Driver/GenericDriver.php | 4 +-- pkg/enqueue/Client/Driver/GpsDriver.php | 2 +- pkg/enqueue/Client/Driver/MongodbDriver.php | 2 +- pkg/enqueue/Client/Driver/RabbitMqDriver.php | 2 +- .../Client/Driver/RabbitMqStompDriver.php | 2 +- pkg/enqueue/Client/Driver/RdKafkaDriver.php | 2 +- pkg/enqueue/Client/Driver/SnsQsDriver.php | 2 +- pkg/enqueue/Client/Driver/SqsDriver.php | 2 +- pkg/enqueue/Client/Driver/StompDriver.php | 2 +- .../Client/Driver/StompManagementClient.php | 2 +- pkg/enqueue/Client/DriverFactory.php | 12 ++----- pkg/enqueue/Client/DriverInterface.php | 2 +- .../Client/Extension/PrepareBodyExtension.php | 10 ++---- pkg/enqueue/Client/Message.php | 24 ++++--------- pkg/enqueue/Client/MessagePriority.php | 10 +++--- pkg/enqueue/Client/PostSend.php | 2 +- pkg/enqueue/Client/PreSend.php | 4 +-- pkg/enqueue/Client/Producer.php | 7 ++-- pkg/enqueue/Client/Resources.php | 2 +- pkg/enqueue/Client/Route.php | 6 ++-- pkg/enqueue/Client/TraceableProducer.php | 2 +- pkg/enqueue/ConnectionFactoryFactory.php | 12 ++----- .../ConnectionFactoryFactoryInterface.php | 1 - pkg/enqueue/Consumption/CallbackProcessor.php | 6 ---- pkg/enqueue/Consumption/ChainExtension.php | 2 +- pkg/enqueue/Consumption/Context/End.php | 2 +- .../Consumption/Context/MessageReceived.php | 2 +- .../Context/PostMessageReceived.php | 2 +- .../Exception/InvalidArgumentException.php | 7 +--- .../LimitConsumedMessagesExtension.php | 3 -- .../LimitConsumerMemoryExtension.php | 5 +-- .../LimitConsumptionTimeExtension.php | 7 ++-- .../Consumption/Extension/LoggerExtension.php | 5 +-- .../Extension/NicenessExtension.php | 10 ++---- .../Consumption/Extension/SignalExtension.php | 12 +++---- pkg/enqueue/Consumption/QueueConsumer.php | 14 ++++---- .../Consumption/QueueConsumerInterface.php | 4 +-- pkg/enqueue/Consumption/Result.php | 22 ++++-------- pkg/enqueue/Resources.php | 2 +- pkg/enqueue/Router/Recipient.php | 4 --- .../Router/RecipientListRouterInterface.php | 2 -- .../Router/RouteRecipientListProcessor.php | 6 ---- pkg/enqueue/Rpc/Promise.php | 11 ++---- pkg/enqueue/Rpc/RpcClient.php | 14 ++------ pkg/enqueue/Rpc/RpcFactory.php | 3 -- .../AnalyzeRouteCollectionPass.php | 24 +++---------- .../BuildClientExtensionsPass.php | 2 +- .../BuildCommandSubscriberRoutesPass.php | 8 ++--- .../BuildConsumptionExtensionsPass.php | 2 +- .../BuildTopicSubscriberRoutesPass.php | 8 ++--- .../Client/FlushSpoolProducerListener.php | 3 -- .../SetupBrokerExtensionCommandTrait.php | 6 ---- .../LimitsExtensionsCommandTrait.php | 3 -- .../QueueConsumerOptionsCommandTrait.php | 7 ---- .../BuildConsumptionExtensionsPass.php | 2 +- .../DelayRedeliveredMessageExtensionTest.php | 1 - .../Tests/Client/DriverFactoryTest.php | 4 +-- .../Extension/PrepareBodyExtensionTest.php | 3 +- pkg/enqueue/Tests/Client/PreSendTest.php | 6 ++-- pkg/enqueue/Tests/Client/ProducerTest.php | 1 - .../Tests/Client/RouterProcessorTest.php | 2 +- .../Tests/Client/TraceableProducerTest.php | 6 ++-- .../Tests/ConnectionFactoryFactoryTest.php | 2 +- .../LimitConsumerMemoryExtensionTest.php | 6 ++-- .../Extension/LoggerExtensionTest.php | 2 +- .../Tests/Consumption/QueueConsumerTest.php | 2 +- .../BuildCommandSubscriberRoutesPassTest.php | 18 +++++----- .../BuildTopicSubscriberRoutesPassTest.php | 16 ++++----- .../LimitsExtensionsCommandTraitTest.php | 2 -- .../TransportFactoryTest.php | 12 +++---- pkg/enqueue/Tests/Util/JSONTest.php | 2 -- pkg/enqueue/Tests/Util/VarExportTest.php | 3 -- pkg/enqueue/Tests/fix_composer_json.php | 2 +- pkg/enqueue/Util/JSON.php | 27 ++++---------- pkg/enqueue/Util/Stringify.php | 8 +---- pkg/enqueue/Util/VarExport.php | 6 ---- pkg/fs/FsConnectionFactory.php | 6 +--- pkg/fs/FsConsumer.php | 6 ++-- pkg/fs/FsContext.php | 4 +-- pkg/fs/FsMessage.php | 16 ++++----- pkg/fs/FsProducer.php | 14 +++----- pkg/fs/LegacyFilesystemLock.php | 12 ++----- pkg/fs/Lock.php | 5 --- .../Tests/FsConnectionFactoryConfigTest.php | 3 -- pkg/fs/Tests/FsMessageTest.php | 2 +- .../Tests/Functional/FsCommonUseCasesTest.php | 2 +- pkg/fs/Tests/Functional/FsConsumerTest.php | 2 +- pkg/fs/Tests/Functional/FsContextTest.php | 2 +- pkg/fs/Tests/Spec/FsMessageTest.php | 3 -- ...ReceiveTimeToLiveMessagesFromQueueTest.php | 2 -- pkg/gearman/GearmanConsumer.php | 2 -- pkg/gearman/GearmanMessage.php | 18 ++++------ pkg/gearman/GearmanProducer.php | 6 ++-- .../GearmanConnectionFactoryConfigTest.php | 3 -- .../Spec/GearmanConnectionFactoryTest.php | 3 -- pkg/gearman/Tests/Spec/GearmanContextTest.php | 3 -- pkg/gearman/Tests/Spec/GearmanMessageTest.php | 3 -- pkg/gearman/Tests/Spec/GearmanQueueTest.php | 3 -- .../GearmanSendToAndReceiveFromQueueTest.php | 3 -- ...manSendToAndReceiveNoWaitFromQueueTest.php | 6 ---- ...rmanSendToTopicAndReceiveFromQueueTest.php | 9 ----- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 9 ----- pkg/gearman/Tests/Spec/GearmanTopicTest.php | 3 -- pkg/gps/GpsConnectionFactory.php | 5 +-- pkg/gps/GpsContext.php | 12 ++----- .../Tests/GpsConnectionFactoryConfigTest.php | 3 -- .../GpsSendToTopicAndReceiveFromQueueTest.php | 1 - ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 1 - .../CalculateRootJobStatusProcessor.php | 2 +- pkg/job-queue/Commands.php | 2 +- pkg/job-queue/DependentJobProcessor.php | 3 -- pkg/job-queue/Doctrine/JobStorage.php | 4 +-- pkg/job-queue/Job.php | 12 +++---- pkg/job-queue/JobRunner.php | 11 +----- .../Test/DbalPersistedConnection.php | 12 ------- pkg/job-queue/Test/JobRunner.php | 13 ------- .../CalculateRootJobStatusServiceTest.php | 6 +--- .../Tests/DependentJobProcessorTest.php | 2 +- .../Tests/DependentJobServiceTest.php | 2 +- .../Tests/Functional/Job/JobStorageTest.php | 2 +- .../Tests/Functional/WebTestCase.php | 6 ++-- pkg/job-queue/Topics.php | 2 +- pkg/mongodb/JSON.php | 27 ++++---------- pkg/mongodb/MongodbConnectionFactory.php | 4 +-- pkg/mongodb/MongodbMessage.php | 18 +++++----- pkg/mongodb/MongodbProducer.php | 10 +++--- pkg/mongodb/MongodbSubscriptionConsumer.php | 7 ++-- pkg/mongodb/Tests/MongodbConsumerTest.php | 8 ++--- .../Spec/MongodbConnectionFactoryTest.php | 3 -- pkg/mongodb/Tests/Spec/MongodbContextTest.php | 3 -- pkg/mongodb/Tests/Spec/MongodbMessageTest.php | 3 -- .../Tests/Spec/MongodbProducerTest.php | 3 -- pkg/mongodb/Tests/Spec/MongodbQueueTest.php | 3 -- .../Tests/Spec/MongodbRequeueMessageTest.php | 3 -- ...dAndReceiveDelayedMessageFromQueueTest.php | 3 -- ...ndReceivePriorityMessagesFromQueueTest.php | 2 -- ...ReceiveTimeToLiveMessagesFromQueueTest.php | 3 -- .../MongodbSendToAndReceiveFromQueueTest.php | 3 -- .../MongodbSendToAndReceiveFromTopicTest.php | 3 -- ...odbSendToAndReceiveNoWaitFromQueueTest.php | 3 -- ...odbSendToAndReceiveNoWaitFromTopicTest.php | 3 -- ...umerConsumeFromAllSubscribedQueuesTest.php | 4 --- ...onConsumerConsumeUntilUnsubscribedTest.php | 4 --- ...odbSubscriptionConsumerStopOnFalseTest.php | 4 --- pkg/mongodb/Tests/Spec/MongodbTopicTest.php | 3 -- pkg/monitoring/ConsumedMessageStats.php | 20 +++++------ pkg/monitoring/ConsumerStats.php | 12 +++---- pkg/monitoring/DatadogStorage.php | 12 ++----- pkg/monitoring/InfluxDbStorage.php | 21 +++-------- pkg/monitoring/JsonSerializer.php | 8 ++--- pkg/monitoring/Resources.php | 2 +- pkg/monitoring/SentMessageStats.php | 2 +- pkg/monitoring/WampStorage.php | 5 +-- pkg/null/NullMessage.php | 8 ++--- pkg/null/NullProducer.php | 6 ++-- pkg/null/Tests/Spec/NullMessageTest.php | 3 -- pkg/pheanstalk/PheanstalkMessage.php | 18 ++++------ pkg/pheanstalk/PheanstalkProducer.php | 8 ++--- .../PheanstalkConnectionFactoryConfigTest.php | 3 -- .../Tests/PheanstalkConsumerTest.php | 2 +- .../Spec/PheanstalkConnectionFactoryTest.php | 3 -- .../Tests/Spec/PheanstalkContextTest.php | 3 -- .../Tests/Spec/PheanstalkMessageTest.php | 3 -- .../Tests/Spec/PheanstalkQueueTest.php | 3 -- ...heanstalkSendToAndReceiveFromQueueTest.php | 6 +--- ...alkSendToAndReceiveNoWaitFromQueueTest.php | 6 ---- ...talkSendToTopicAndReceiveFromQueueTest.php | 9 ----- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 9 ----- .../Tests/Spec/PheanstalkTopicTest.php | 3 -- pkg/rdkafka/JsonSerializer.php | 16 +++------ pkg/rdkafka/RdKafkaConsumer.php | 2 +- pkg/rdkafka/RdKafkaMessage.php | 14 ++++---- pkg/rdkafka/RdKafkaProducer.php | 6 ++-- pkg/rdkafka/RdKafkaTopic.php | 6 ++-- pkg/rdkafka/SerializerAwareTrait.php | 3 -- .../RdKafkaConnectionFactoryConfigTest.php | 3 -- .../Tests/RdKafkaConnectionFactoryTest.php | 3 -- pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php | 3 -- pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php | 3 -- pkg/rdkafka/Tests/bootstrap.php | 2 +- pkg/redis/JsonSerializer.php | 16 +++------ pkg/redis/PhpRedis.php | 8 ++--- pkg/redis/Redis.php | 28 --------------- pkg/redis/RedisConsumer.php | 3 -- pkg/redis/RedisConsumerHelperTrait.php | 4 --- pkg/redis/RedisContext.php | 13 ++----- pkg/redis/RedisMessage.php | 30 ++++------------ pkg/redis/RedisProducer.php | 9 ++--- pkg/redis/RedisSubscriptionConsumer.php | 13 ++----- pkg/redis/SerializerAwareTrait.php | 3 -- .../Tests/Functional/CommonUseCasesTrait.php | 2 +- .../Functional/PRedisCommonUseCasesTest.php | 3 -- .../PRedisConsumptionUseCasesTest.php | 3 -- .../Functional/PhpRedisCommonUseCasesTest.php | 3 -- .../PhpRedisConsumptionUseCasesTest.php | 3 -- .../RedisConnectionFactoryConfigTest.php | 3 -- pkg/redis/Tests/Spec/JsonSerializerTest.php | 2 +- .../Tests/Spec/RedisConnectionFactoryTest.php | 3 -- pkg/redis/Tests/Spec/RedisContextTest.php | 3 -- pkg/redis/Tests/Spec/RedisMessageTest.php | 3 -- pkg/redis/Tests/Spec/RedisProducerTest.php | 3 -- pkg/redis/Tests/Spec/RedisQueueTest.php | 3 -- .../Tests/Spec/RedisRequeueMessageTest.php | 3 -- .../RedisSendToAndReceiveFromQueueTest.php | 3 -- .../RedisSendToAndReceiveFromTopicTest.php | 3 -- ...disSendToAndReceiveNoWaitFromQueueTest.php | 3 -- ...disSendToAndReceiveNoWaitFromTopicTest.php | 3 -- ...umerConsumeFromAllSubscribedQueuesTest.php | 4 --- ...onConsumerConsumeUntilUnsubscribedTest.php | 4 --- ...disSubscriptionConsumerStopOnFalseTest.php | 4 --- pkg/redis/Tests/Spec/RedisTopicTest.php | 3 -- pkg/simple-client/SimpleClient.php | 13 ++++--- .../Tests/Functional/SimpleClientTest.php | 6 ---- pkg/simple-client/Tests/fix_composer_json.php | 2 +- pkg/sns/SnsClient.php | 2 +- pkg/sns/SnsDestination.php | 6 ++-- pkg/sns/SnsMessage.php | 14 ++++---- pkg/sns/SnsProducer.php | 6 ++-- pkg/sns/SnsSubscribe.php | 10 ++---- pkg/sns/SnsUnsubscribe.php | 2 +- .../Tests/SnsConnectionFactoryConfigTest.php | 3 -- pkg/sns/examples/consume.php | 4 +-- pkg/sns/examples/produce.php | 2 +- pkg/snsqs/SnsQsConnectionFactory.php | 5 +-- pkg/snsqs/SnsQsConsumer.php | 2 +- pkg/snsqs/SnsQsContext.php | 4 +-- pkg/snsqs/SnsQsMessage.php | 6 ++-- pkg/snsqs/SnsQsProducer.php | 8 ++--- pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php | 4 +-- .../SnsQsSendToAndReceiveFromQueueTest.php | 1 + ...sQsSendToAndReceiveNoWaitFromQueueTest.php | 1 + ...nsQsSendToTopicAndReceiveFromQueueSpec.php | 1 + pkg/snsqs/examples/consumer.php | 4 +-- pkg/snsqs/examples/produce.php | 4 +-- pkg/sqs/SqsClient.php | 7 +--- pkg/sqs/SqsConsumer.php | 2 +- pkg/sqs/SqsContext.php | 2 +- pkg/sqs/SqsDestination.php | 14 ++++---- pkg/sqs/SqsMessage.php | 14 ++++---- pkg/sqs/SqsProducer.php | 6 ++-- pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php | 2 +- pkg/sqs/Tests/Spec/SqsMessageTest.php | 3 -- pkg/sqs/Tests/Spec/SqsProducerTest.php | 3 -- ...dAndReceiveDelayedMessageFromQueueTest.php | 3 +- .../Spec/SqsSendToAndReceiveFromQueueTest.php | 3 +- .../Spec/SqsSendToAndReceiveFromTopicTest.php | 5 +-- ...SqsSendToAndReceiveNoWaitFromQueueTest.php | 3 +- ...SqsSendToAndReceiveNoWaitFromTopicTest.php | 3 +- .../SqsSendToTopicAndReceiveFromQueueTest.php | 3 +- ...ndToTopicAndReceiveNoWaitFromQueueTest.php | 3 +- .../Tests/SqsConnectionFactoryConfigTest.php | 3 -- pkg/sqs/examples/consume.php | 4 +-- pkg/sqs/examples/produce.php | 4 +-- pkg/stomp/BufferedStompClient.php | 3 -- pkg/stomp/ExtensionType.php | 6 ++-- pkg/stomp/StompConnectionFactory.php | 4 +-- pkg/stomp/StompConsumer.php | 6 ++-- pkg/stomp/StompContext.php | 8 ++--- pkg/stomp/StompDestination.php | 20 +++++------ pkg/stomp/StompHeadersEncoder.php | 18 +++++----- pkg/stomp/StompMessage.php | 10 +++--- pkg/stomp/StompProducer.php | 6 ++-- pkg/stomp/Tests/Spec/StompMessageTest.php | 3 -- .../StompConnectionFactoryConfigTest.php | 3 -- pkg/stomp/Tests/StompHeadersEncoderTest.php | 12 ------- pkg/stomp/Tests/StompMessageTest.php | 4 +-- pkg/test/RabbitManagementExtensionTrait.php | 28 +++++++-------- pkg/test/ReadAttributeTrait.php | 10 +++--- pkg/test/RedisExtension.php | 4 +-- pkg/test/TestLogger.php | 2 +- pkg/test/WriteAttributeTrait.php | 3 +- pkg/wamp/JsonSerializer.php | 16 +++------ pkg/wamp/SerializerAwareTrait.php | 3 -- .../Tests/Functional/WampConsumerTest.php | 1 + pkg/wamp/Tests/Spec/JsonSerializerTest.php | 2 +- .../Tests/Spec/WampConnectionFactoryTest.php | 3 -- pkg/wamp/Tests/Spec/WampContextTest.php | 3 -- pkg/wamp/Tests/Spec/WampMessageTest.php | 3 -- pkg/wamp/Tests/Spec/WampProducerTest.php | 3 -- pkg/wamp/Tests/Spec/WampQueueTest.php | 3 -- pkg/wamp/Tests/Spec/WampTopicTest.php | 3 -- pkg/wamp/WampConnectionFactory.php | 5 +-- pkg/wamp/WampConsumer.php | 6 +--- pkg/wamp/WampContext.php | 6 +--- pkg/wamp/WampProducer.php | 14 ++------ pkg/wamp/WampSubscriptionConsumer.php | 10 ++---- 436 files changed, 649 insertions(+), 1836 deletions(-) diff --git a/docker/bin/test.sh b/docker/bin/test.sh index cfc94aab5..b78e1c1a8 100755 --- a/docker/bin/test.sh +++ b/docker/bin/test.sh @@ -44,7 +44,7 @@ waitForService localstack 4566 50 php docker/bin/refresh-mysql-database.php || exit 1 php docker/bin/refresh-postgres-database.php || exit 1 php pkg/job-queue/Tests/Functional/app/console doctrine:database:create --if-not-exists || exit 1 -php pkg/job-queue/Tests/Functional/app/console doctrine:schema:update --force || exit 1 +php pkg/job-queue/Tests/Functional/app/console doctrine:schema:update --force --complete || exit 1 #php pkg/enqueue-bundle/Tests/Functional/app/console.php config:dump-reference enqueue bin/phpunit "$@" diff --git a/pkg/amqp-bunny/AmqpConnectionFactory.php b/pkg/amqp-bunny/AmqpConnectionFactory.php index 241929abe..749e63be0 100644 --- a/pkg/amqp-bunny/AmqpConnectionFactory.php +++ b/pkg/amqp-bunny/AmqpConnectionFactory.php @@ -26,7 +26,7 @@ class AmqpConnectionFactory implements InteropAmqpConnectionFactory, DelayStrate private $client; /** - * @see \Enqueue\AmqpTools\ConnectionConfig for possible config formats and values + * @see ConnectionConfig for possible config formats and values * * @param array|string|null $config */ @@ -89,10 +89,10 @@ private function establishConnection(): BunnyClient $bunnyConfig['timeout'] = $this->config->getConnectionTimeout(); // @see https://github.com/php-enqueue/enqueue-dev/issues/229 -// $bunnyConfig['persistent'] = $this->config->isPersisted(); -// if ($this->config->isPersisted()) { -// $bunnyConfig['path'] = 'enqueue';//$this->config->getOption('path', $this->config->getOption('vhost')); -// } + // $bunnyConfig['persistent'] = $this->config->isPersisted(); + // if ($this->config->isPersisted()) { + // $bunnyConfig['path'] = 'enqueue';//$this->config->getOption('path', $this->config->getOption('vhost')); + // } if ($this->config->getHeartbeat()) { $bunnyConfig['heartbeat'] = $this->config->getHeartbeat(); diff --git a/pkg/amqp-bunny/AmqpConsumer.php b/pkg/amqp-bunny/AmqpConsumer.php index f1b52a99d..89301c80c 100644 --- a/pkg/amqp-bunny/AmqpConsumer.php +++ b/pkg/amqp-bunny/AmqpConsumer.php @@ -48,7 +48,7 @@ public function __construct(AmqpContext $context, InteropAmqpQueue $queue) $this->flags = self::FLAG_NOPARAM; } - public function setConsumerTag(string $consumerTag = null): void + public function setConsumerTag(?string $consumerTag = null): void { $this->consumerTag = $consumerTag; } @@ -98,7 +98,7 @@ public function receive(int $timeout = 0): ?Message return $message; } - usleep(100000); //100ms + usleep(100000); // 100ms } return null; diff --git a/pkg/amqp-bunny/AmqpContext.php b/pkg/amqp-bunny/AmqpContext.php index f57554335..151cbd842 100644 --- a/pkg/amqp-bunny/AmqpContext.php +++ b/pkg/amqp-bunny/AmqpContext.php @@ -51,7 +51,6 @@ class AmqpContext implements InteropAmqpContext, DelayStrategyAware * Callable must return instance of \Bunny\Channel once called. * * @param Channel|callable $bunnyChannel - * @param array $config */ public function __construct($bunnyChannel, array $config) { @@ -294,10 +293,7 @@ public function getBunnyChannel(): Channel if (false == $this->bunnyChannel) { $bunnyChannel = call_user_func($this->bunnyChannelFactory); if (false == $bunnyChannel instanceof Channel) { - throw new \LogicException(sprintf( - 'The factory must return instance of \Bunny\Channel. It returned %s', - is_object($bunnyChannel) ? get_class($bunnyChannel) : gettype($bunnyChannel) - )); + throw new \LogicException(sprintf('The factory must return instance of \Bunny\Channel. It returned %s', is_object($bunnyChannel) ? $bunnyChannel::class : gettype($bunnyChannel))); } $this->bunnyChannel = $bunnyChannel; diff --git a/pkg/amqp-bunny/AmqpProducer.php b/pkg/amqp-bunny/AmqpProducer.php index 76892ebeb..178ff81a8 100644 --- a/pkg/amqp-bunny/AmqpProducer.php +++ b/pkg/amqp-bunny/AmqpProducer.php @@ -79,7 +79,7 @@ public function send(Destination $destination, Message $message): void /** * @return self */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $this->delayStrategy) { throw DeliveryDelayNotSupportedException::providerDoestNotSupportIt(); @@ -98,7 +98,7 @@ public function getDeliveryDelay(): ?int /** * @return self */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { $this->priority = $priority; @@ -113,7 +113,7 @@ public function getPriority(): ?int /** * @return self */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/amqp-bunny/AmqpSubscriptionConsumer.php b/pkg/amqp-bunny/AmqpSubscriptionConsumer.php index b36bcd949..2904c1c19 100644 --- a/pkg/amqp-bunny/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-bunny/AmqpSubscriptionConsumer.php @@ -47,7 +47,7 @@ public function consume(int $timeout = 0): void try { $this->context->getBunnyChannel()->getClient()->run(0 !== $timeout ? $timeout / 1000 : null); } catch (ClientException $e) { - if (0 === strpos($e->getMessage(), 'stream_select() failed') && $signalHandler->wasThereSignal()) { + if (str_starts_with($e->getMessage(), 'stream_select() failed') && $signalHandler->wasThereSignal()) { return; } @@ -63,7 +63,7 @@ public function consume(int $timeout = 0): void public function subscribe(Consumer $consumer, callable $callback): void { if (false == $consumer instanceof AmqpConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, $consumer::class)); } if ($consumer->getConsumerTag() && array_key_exists($consumer->getConsumerTag(), $this->subscribers)) { @@ -110,7 +110,7 @@ public function subscribe(Consumer $consumer, callable $callback): void public function unsubscribe(Consumer $consumer): void { if (false == $consumer instanceof AmqpConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, $consumer::class)); } if (false == $consumer->getConsumerTag()) { diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php index ae4b74c6a..e5c2d1302 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php @@ -18,9 +18,6 @@ public function test() $this->markTestIncomplete(); } - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -31,8 +28,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php index 00710aad7..b7c311cfb 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php @@ -13,9 +13,6 @@ */ class AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest extends SendAndReceiveDelayedMessageFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -26,8 +23,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php index bf2041c4b..89530e2e6 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceivePriorityMessagesFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php index a50bdf98e..793e3fa78 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest extends SendAndReceiveTimeToLiveMessagesFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveTimestampAsIntegerTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveTimestampAsIntegerTest.php index f253d73c9..37ef1d0bd 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveTimestampAsIntegerTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendAndReceiveTimestampAsIntegerTest.php @@ -10,9 +10,6 @@ */ class AmqpSendAndReceiveTimestampAsIntegerTest extends SendAndReceiveTimestampAsIntegerSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php index e715f5c80..e3286ae9c 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php index ac7efaf1d..ce9fc2794 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php @@ -13,9 +13,6 @@ */ class AmqpSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -24,8 +21,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php index 9d37cade4..f1210d03a 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php index 8947fe9f1..cc47cf44a 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php @@ -13,9 +13,6 @@ */ class AmqpSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFromTopicSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -24,8 +21,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php index 28deeac86..f13ead179 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php @@ -14,9 +14,6 @@ */ class AmqpSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -25,8 +22,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) @@ -41,8 +36,6 @@ protected function createQueue(Context $context, $queueName) } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php index 5facc03b2..683e0b1ca 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -14,9 +14,6 @@ */ class AmqpSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveNoWaitFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -25,8 +22,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) @@ -41,8 +36,6 @@ protected function createQueue(Context $context, $queueName) } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php index f22c6d6a7..4a549fcf8 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php @@ -19,9 +19,6 @@ public function test() parent::test(); } - /** - * {@inheritdoc} - */ protected function createContext() { $baseDir = realpath(__DIR__.'/../../../../'); @@ -44,8 +41,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php index c2403792b..5d4d8d40e 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php @@ -15,8 +15,6 @@ class AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest extends Subscri { /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php index a1f4ac57f..6cae48148 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -24,8 +24,6 @@ protected function tearDown(): void /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -39,8 +37,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php b/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php index 624d0a8f4..d9d8527d3 100644 --- a/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php +++ b/pkg/amqp-bunny/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php @@ -15,8 +15,6 @@ class AmqpSubscriptionConsumerStopOnFalseTest extends SubscriptionConsumerStopOn { /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-ext/AmqpConnectionFactory.php b/pkg/amqp-ext/AmqpConnectionFactory.php index 177a786d8..c3241d72a 100644 --- a/pkg/amqp-ext/AmqpConnectionFactory.php +++ b/pkg/amqp-ext/AmqpConnectionFactory.php @@ -24,7 +24,7 @@ class AmqpConnectionFactory implements InteropAmqpConnectionFactory, DelayStrate private $connection; /** - * @see \Enqueue\AmqpTools\ConnectionConfig for possible config formats and values + * @see ConnectionConfig for possible config formats and values * * @param array|string|null $config */ diff --git a/pkg/amqp-ext/AmqpConsumer.php b/pkg/amqp-ext/AmqpConsumer.php index 03c949714..5674f832b 100644 --- a/pkg/amqp-ext/AmqpConsumer.php +++ b/pkg/amqp-ext/AmqpConsumer.php @@ -43,7 +43,7 @@ public function __construct(AmqpContext $context, InteropAmqpQueue $queue) $this->flags = self::FLAG_NOPARAM; } - public function setConsumerTag(string $consumerTag = null): void + public function setConsumerTag(?string $consumerTag = null): void { $this->consumerTag = $consumerTag; } @@ -93,7 +93,7 @@ public function receive(int $timeout = 0): ?Message return $message; } - usleep(100000); //100ms + usleep(100000); // 100ms } return null; diff --git a/pkg/amqp-ext/AmqpContext.php b/pkg/amqp-ext/AmqpContext.php index 5ea099da2..15bde09b5 100644 --- a/pkg/amqp-ext/AmqpContext.php +++ b/pkg/amqp-ext/AmqpContext.php @@ -243,10 +243,7 @@ public function getExtChannel(): \AMQPChannel if (false == $this->extChannel) { $extChannel = call_user_func($this->extChannelFactory); if (false == $extChannel instanceof \AMQPChannel) { - throw new \LogicException(sprintf( - 'The factory must return instance of AMQPChannel. It returns %s', - is_object($extChannel) ? get_class($extChannel) : gettype($extChannel) - )); + throw new \LogicException(sprintf('The factory must return instance of AMQPChannel. It returns %s', is_object($extChannel) ? $extChannel::class : gettype($extChannel))); } $this->extChannel = $extChannel; diff --git a/pkg/amqp-ext/AmqpProducer.php b/pkg/amqp-ext/AmqpProducer.php index 0fe6b7a39..b9c15a4b4 100644 --- a/pkg/amqp-ext/AmqpProducer.php +++ b/pkg/amqp-ext/AmqpProducer.php @@ -72,7 +72,7 @@ public function send(Destination $destination, Message $message): void } } - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $this->delayStrategy) { throw DeliveryDelayNotSupportedException::providerDoestNotSupportIt(); @@ -88,7 +88,7 @@ public function getDeliveryDelay(): ?int return $this->deliveryDelay; } - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { $this->priority = $priority; @@ -100,7 +100,7 @@ public function getPriority(): ?int return $this->priority; } - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/amqp-ext/AmqpSubscriptionConsumer.php b/pkg/amqp-ext/AmqpSubscriptionConsumer.php index 08a3df1c6..3d0faccb7 100644 --- a/pkg/amqp-ext/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-ext/AmqpSubscriptionConsumer.php @@ -86,7 +86,7 @@ public function consume(int $timeout = 0): void public function subscribe(Consumer $consumer, callable $callback): void { if (false == $consumer instanceof AmqpConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, $consumer::class)); } if ($consumer->getConsumerTag() && array_key_exists($consumer->getConsumerTag(), $this->subscribers)) { @@ -109,7 +109,7 @@ public function subscribe(Consumer $consumer, callable $callback): void public function unsubscribe(Consumer $consumer): void { if (false == $consumer instanceof AmqpConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, $consumer::class)); } if (false == $consumer->getConsumerTag()) { diff --git a/pkg/amqp-ext/Tests/AmqpConsumerTest.php b/pkg/amqp-ext/Tests/AmqpConsumerTest.php index ae803e047..1dcc0f349 100644 --- a/pkg/amqp-ext/Tests/AmqpConsumerTest.php +++ b/pkg/amqp-ext/Tests/AmqpConsumerTest.php @@ -5,7 +5,6 @@ use Enqueue\AmqpExt\AmqpConsumer; use Enqueue\AmqpExt\AmqpContext; use Enqueue\Test\ClassExtensionTrait; -use Interop\Amqp\Impl\AmqpQueue; use Interop\Queue\Consumer; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; diff --git a/pkg/amqp-ext/Tests/Spec/AmqpMessageTest.php b/pkg/amqp-ext/Tests/Spec/AmqpMessageTest.php index e11afd964..73fc4ad14 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpMessageTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpMessageTest.php @@ -7,9 +7,6 @@ class AmqpMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new AmqpMessage(); diff --git a/pkg/amqp-ext/Tests/Spec/AmqpProducerTest.php b/pkg/amqp-ext/Tests/Spec/AmqpProducerTest.php index 3dead4d9f..1183e3a8e 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpProducerTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpProducerTest.php @@ -10,9 +10,6 @@ */ class AmqpProducerTest extends ProducerSpec { - /** - * {@inheritdoc} - */ protected function createProducer() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php index ac30c510f..f79f7e635 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php @@ -13,9 +13,6 @@ */ class AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest extends SendAndReceiveDelayedMessageFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -26,8 +23,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php index 311f82ab6..71da671f4 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php @@ -13,9 +13,6 @@ */ class AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest extends SendAndReceiveDelayedMessageFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -26,8 +23,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php index 0bfab937b..40edcd865 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceivePriorityMessagesFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php index 6f0d7b6cf..6654107c9 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest extends SendAndReceiveTimeToLiveMessagesFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveTimestampAsIntengerTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveTimestampAsIntengerTest.php index 00d7e3840..5ecc00046 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveTimestampAsIntengerTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendAndReceiveTimestampAsIntengerTest.php @@ -10,9 +10,6 @@ */ class AmqpSendAndReceiveTimestampAsIntengerTest extends SendAndReceiveTimestampAsIntegerSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php index 9d4713dee..cb45dc5a5 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php index 629703303..fb8e62750 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php @@ -13,9 +13,6 @@ */ class AmqpSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -24,8 +21,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php index c4e602f8d..a0d93c38b 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php index 6a599c9f7..f9867d1b1 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php @@ -13,9 +13,6 @@ */ class AmqpSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFromTopicSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -24,8 +21,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php index 2f2e30d6b..058606b51 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php @@ -14,9 +14,6 @@ */ class AmqpSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -25,8 +22,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) @@ -41,8 +36,6 @@ protected function createQueue(Context $context, $queueName) } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php index b9d4510d5..b8ac82403 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -14,9 +14,6 @@ */ class AmqpSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveNoWaitFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -25,8 +22,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) @@ -41,8 +36,6 @@ protected function createQueue(Context $context, $queueName) } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php index 31e4e175f..0aa03cbd0 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSslSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $baseDir = realpath(__DIR__.'/../../../../'); @@ -37,8 +34,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php index 1adda733d..c069acefd 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php @@ -15,8 +15,6 @@ class AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest extends Subscri { /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php index ccb13bb89..c3341c937 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -24,8 +24,6 @@ protected function tearDown(): void /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -39,8 +37,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php b/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php index 424013f4a..e017bb603 100644 --- a/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php +++ b/pkg/amqp-ext/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php @@ -15,8 +15,6 @@ class AmqpSubscriptionConsumerStopOnFalseTest extends SubscriptionConsumerStopOn { /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-ext/Tests/fix_composer_json.php b/pkg/amqp-ext/Tests/fix_composer_json.php index f025f6081..01f73c95e 100644 --- a/pkg/amqp-ext/Tests/fix_composer_json.php +++ b/pkg/amqp-ext/Tests/fix_composer_json.php @@ -6,4 +6,4 @@ $composerJson['config']['platform']['ext-amqp'] = '1.9.3'; -file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, JSON_PRETTY_PRINT)); +file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, \JSON_PRETTY_PRINT)); diff --git a/pkg/amqp-ext/examples/consume.php b/pkg/amqp-ext/examples/consume.php index 74ed8fab5..d510bf077 100644 --- a/pkg/amqp-ext/examples/consume.php +++ b/pkg/amqp-ext/examples/consume.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\AmqpExt\AmqpConnectionFactory; @@ -32,7 +32,7 @@ while (true) { if ($m = $consumer->receive(1)) { - echo $m->getBody(), PHP_EOL; + echo $m->getBody(), \PHP_EOL; $consumer->acknowledge($m); } diff --git a/pkg/amqp-ext/examples/produce.php b/pkg/amqp-ext/examples/produce.php index 72acb7e94..dfc4374da 100644 --- a/pkg/amqp-ext/examples/produce.php +++ b/pkg/amqp-ext/examples/produce.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\AmqpExt\AmqpConnectionFactory; diff --git a/pkg/amqp-lib/AmqpConnectionFactory.php b/pkg/amqp-lib/AmqpConnectionFactory.php index 3cb1c29b7..198e6874d 100644 --- a/pkg/amqp-lib/AmqpConnectionFactory.php +++ b/pkg/amqp-lib/AmqpConnectionFactory.php @@ -32,7 +32,7 @@ class AmqpConnectionFactory implements InteropAmqpConnectionFactory, DelayStrate private $connection; /** - * @see \Enqueue\AmqpTools\ConnectionConfig for possible config formats and values. + * @see ConnectionConfig for possible config formats and values. * * @param array|string|null $config */ diff --git a/pkg/amqp-lib/AmqpConsumer.php b/pkg/amqp-lib/AmqpConsumer.php index 0218db6b2..0534a9371 100644 --- a/pkg/amqp-lib/AmqpConsumer.php +++ b/pkg/amqp-lib/AmqpConsumer.php @@ -47,7 +47,7 @@ public function __construct(AmqpContext $context, InteropAmqpQueue $queue) $this->flags = self::FLAG_NOPARAM; } - public function setConsumerTag(string $consumerTag = null): void + public function setConsumerTag(?string $consumerTag = null): void { $this->consumerTag = $consumerTag; } @@ -97,7 +97,7 @@ public function receive(int $timeout = 0): ?Message return $message; } - usleep(100000); //100ms + usleep(100000); // 100ms } return null; @@ -127,7 +127,6 @@ public function acknowledge(Message $message): void /** * @param InteropAmqpMessage $message - * @param bool $requeue */ public function reject(Message $message, bool $requeue = false): void { diff --git a/pkg/amqp-lib/AmqpProducer.php b/pkg/amqp-lib/AmqpProducer.php index 70e876793..928597298 100644 --- a/pkg/amqp-lib/AmqpProducer.php +++ b/pkg/amqp-lib/AmqpProducer.php @@ -81,7 +81,7 @@ public function send(Destination $destination, Message $message): void /** * @return self */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $this->delayStrategy) { throw DeliveryDelayNotSupportedException::providerDoestNotSupportIt(); @@ -100,7 +100,7 @@ public function getDeliveryDelay(): ?int /** * @return self */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { $this->priority = $priority; @@ -115,7 +115,7 @@ public function getPriority(): ?int /** * @return self */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/amqp-lib/AmqpSubscriptionConsumer.php b/pkg/amqp-lib/AmqpSubscriptionConsumer.php index 5d59ddf82..f96c4e49a 100644 --- a/pkg/amqp-lib/AmqpSubscriptionConsumer.php +++ b/pkg/amqp-lib/AmqpSubscriptionConsumer.php @@ -93,7 +93,7 @@ public function consume(int $timeout = 0): void public function subscribe(Consumer $consumer, callable $callback): void { if (false == $consumer instanceof AmqpConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, $consumer::class)); } if ($consumer->getConsumerTag() && array_key_exists($consumer->getConsumerTag(), $this->subscribers)) { @@ -140,7 +140,7 @@ public function subscribe(Consumer $consumer, callable $callback): void public function unsubscribe(Consumer $consumer): void { if (false == $consumer instanceof AmqpConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', AmqpConsumer::class, $consumer::class)); } if (false == $consumer->getConsumerTag()) { diff --git a/pkg/amqp-lib/Tests/Spec/AmqpProducerTest.php b/pkg/amqp-lib/Tests/Spec/AmqpProducerTest.php index 510b72ab9..f72296a66 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpProducerTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpProducerTest.php @@ -10,9 +10,6 @@ */ class AmqpProducerTest extends ProducerSpec { - /** - * {@inheritdoc} - */ protected function createProducer() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php index 8b618e912..1a5fb70b3 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest.php @@ -13,9 +13,6 @@ */ class AmqpSendAndReceiveDelayedMessageWithDelayPluginStrategyTest extends SendAndReceiveDelayedMessageFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -26,8 +23,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php index f3eb0f7c7..0e00b10e9 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest.php @@ -13,9 +13,6 @@ */ class AmqpSendAndReceiveDelayedMessageWithDlxStrategyTest extends SendAndReceiveDelayedMessageFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -26,8 +23,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php index bd88088a9..83c4c948f 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceivePriorityMessagesFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendAndReceivePriorityMessagesFromQueueTest extends SendAndReceivePriorityMessagesFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php index 39fcb6fc1..d5f35ed65 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendAndReceiveTimeToLiveMessagesFromQueueTest extends SendAndReceiveTimeToLiveMessagesFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveTimestampAsIntengerTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveTimestampAsIntengerTest.php index 2574f5ab2..ade42b346 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveTimestampAsIntengerTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendAndReceiveTimestampAsIntengerTest.php @@ -10,9 +10,6 @@ */ class AmqpSendAndReceiveTimestampAsIntengerTest extends SendAndReceiveTimestampAsIntegerSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php index a80e91b8a..6d66532c6 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php index 72a4eb5c4..621608020 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveFromTopicTest.php @@ -13,9 +13,6 @@ */ class AmqpSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -24,8 +21,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php index 47da126e6..db536948a 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveNoWaitFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -23,8 +20,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php index 49a168ba7..c2b184209 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendToAndReceiveNoWaitFromTopicTest.php @@ -13,9 +13,6 @@ */ class AmqpSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFromTopicSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -24,8 +21,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php index d2b2aee06..ec404b59e 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendToTopicAndReceiveFromQueueTest.php @@ -14,9 +14,6 @@ */ class AmqpSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -25,8 +22,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) @@ -41,8 +36,6 @@ protected function createQueue(Context $context, $queueName) } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php index c42c4213b..665382fe4 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -14,9 +14,6 @@ */ class AmqpSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveNoWaitFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new AmqpConnectionFactory(getenv('AMQP_DSN')); @@ -25,8 +22,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) @@ -41,8 +36,6 @@ protected function createQueue(Context $context, $queueName) } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createTopic(Context $context, $topicName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php index 19d6a7030..7bf142e5d 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSslSendToAndReceiveFromQueueTest.php @@ -12,9 +12,6 @@ */ class AmqpSslSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $baseDir = realpath(__DIR__.'/../../../../'); @@ -37,8 +34,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param AmqpContext $context */ protected function createQueue(Context $context, $queueName) diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php index 284a03c11..b81b139e8 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php @@ -15,8 +15,6 @@ class AmqpSubscriptionConsumerConsumeFromAllSubscribedQueuesTest extends Subscri { /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php index a8bd48e01..288ab25f4 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -24,8 +24,6 @@ protected function tearDown(): void /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -39,8 +37,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php b/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php index b1987bbe7..345007135 100644 --- a/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php +++ b/pkg/amqp-lib/Tests/Spec/AmqpSubscriptionConsumerStopOnFalseTest.php @@ -15,8 +15,6 @@ class AmqpSubscriptionConsumerStopOnFalseTest extends SubscriptionConsumerStopOn { /** * @return AmqpContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param AmqpContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/amqp-lib/examples/consume.php b/pkg/amqp-lib/examples/consume.php index 633efca66..03f609c71 100644 --- a/pkg/amqp-lib/examples/consume.php +++ b/pkg/amqp-lib/examples/consume.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\AmqpLib\AmqpConnectionFactory; @@ -32,7 +32,7 @@ while (true) { if ($m = $consumer->receive(100)) { - echo $m->getBody(), PHP_EOL; + echo $m->getBody(), \PHP_EOL; $consumer->acknowledge($m); } diff --git a/pkg/amqp-lib/examples/produce.php b/pkg/amqp-lib/examples/produce.php index 2753f4ac7..7527b2620 100644 --- a/pkg/amqp-lib/examples/produce.php +++ b/pkg/amqp-lib/examples/produce.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\AmqpLib\AmqpConnectionFactory; @@ -26,7 +26,7 @@ $topic = $context->createTopic('test.amqp.ext'); $topic->addFlag(AmqpTopic::FLAG_DURABLE); $topic->setType(AmqpTopic::TYPE_FANOUT); -//$topic->setArguments(['alternate-exchange' => 'foo']); +// $topic->setArguments(['alternate-exchange' => 'foo']); $context->deleteTopic($topic); $context->declareTopic($topic); diff --git a/pkg/amqp-lib/tutorial/rpc_client.php b/pkg/amqp-lib/tutorial/rpc_client.php index 74368c20f..6ad091bc0 100644 --- a/pkg/amqp-lib/tutorial/rpc_client.php +++ b/pkg/amqp-lib/tutorial/rpc_client.php @@ -11,12 +11,12 @@ 'pass' => 'guest', ]; -class FibonacciRpcClient +class rpc_client { - /** @var \Interop\Amqp\AmqpContext */ + /** @var Interop\Amqp\AmqpContext */ private $context; - /** @var \Interop\Amqp\AmqpQueue */ + /** @var Interop\Amqp\AmqpQueue */ private $callback_queue; public function __construct(array $config) @@ -43,7 +43,7 @@ public function call($n) while (true) { if ($message = $consumer->receive()) { if ($message->getCorrelationId() == $corr_id) { - return (int) ($message->getBody()); + return (int) $message->getBody(); } } } diff --git a/pkg/amqp-lib/tutorial/rpc_server.php b/pkg/amqp-lib/tutorial/rpc_server.php index 954d21f25..241471684 100644 --- a/pkg/amqp-lib/tutorial/rpc_server.php +++ b/pkg/amqp-lib/tutorial/rpc_server.php @@ -37,7 +37,7 @@ function fib($n) while (true) { if ($req = $consumer->receive()) { - $n = (int) ($req->getBody()); + $n = (int) $req->getBody(); echo ' [.] fib(', $n, ")\n"; $msg = $context->createMessage((string) fib($n)); diff --git a/pkg/amqp-tools/ConnectionConfig.php b/pkg/amqp-tools/ConnectionConfig.php index 224d54b9d..e1356c7cb 100644 --- a/pkg/amqp-tools/ConnectionConfig.php +++ b/pkg/amqp-tools/ConnectionConfig.php @@ -104,9 +104,6 @@ public function __construct($config = null) $this->addSupportedScheme('amqps'); } - /** - * @param string[] $extensions - */ public function addSupportedScheme(string $schema): self { $this->supportedSchemes[] = $schema; @@ -117,7 +114,6 @@ public function addSupportedScheme(string $schema): self /** * @param string $name - * @param mixed $value * * @return self */ @@ -153,18 +149,18 @@ public function parse() $config = array_replace($this->defaultConfig, $config); $config['host'] = (string) $config['host']; - $config['port'] = (int) ($config['port']); + $config['port'] = (int) $config['port']; $config['user'] = (string) $config['user']; $config['pass'] = (string) $config['pass']; - $config['read_timeout'] = max((float) ($config['read_timeout']), 0); - $config['write_timeout'] = max((float) ($config['write_timeout']), 0); - $config['connection_timeout'] = max((float) ($config['connection_timeout']), 0); - $config['heartbeat'] = max((float) ($config['heartbeat']), 0); + $config['read_timeout'] = max((float) $config['read_timeout'], 0); + $config['write_timeout'] = max((float) $config['write_timeout'], 0); + $config['connection_timeout'] = max((float) $config['connection_timeout'], 0); + $config['heartbeat'] = max((float) $config['heartbeat'], 0); $config['persisted'] = !empty($config['persisted']); $config['lazy'] = !empty($config['lazy']); $config['qos_global'] = !empty($config['qos_global']); - $config['qos_prefetch_count'] = max((int) ($config['qos_prefetch_count']), 0); - $config['qos_prefetch_size'] = max((int) ($config['qos_prefetch_size']), 0); + $config['qos_prefetch_count'] = max((int) $config['qos_prefetch_count'], 0); + $config['qos_prefetch_size'] = max((int) $config['qos_prefetch_size'], 0); $config['ssl_on'] = !empty($config['ssl_on']); $config['ssl_verify'] = !empty($config['ssl_verify']); $config['ssl_cacert'] = (string) $config['ssl_cacert']; @@ -346,10 +342,8 @@ public function getSslPassPhrase() } /** - * @param string $name - * @param mixed $default - * - * @return mixed + * @param string $name + * @param mixed|null $default */ public function getOption($name, $default = null) { @@ -383,11 +377,7 @@ private function parseDsn($dsn) $supportedSchemes = $this->supportedSchemes; if (false == in_array($dsn->getSchemeProtocol(), $supportedSchemes, true)) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be one of "%s".', - $dsn->getSchemeProtocol(), - implode('", "', $supportedSchemes) - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be one of "%s".', $dsn->getSchemeProtocol(), implode('", "', $supportedSchemes))); } $sslOn = false; @@ -406,7 +396,7 @@ private function parseDsn($dsn) 'user' => $dsn->getUser(), 'pass' => $dsn->getPassword(), 'vhost' => null !== ($path = $dsn->getPath()) ? - (0 === strpos($path, '/') ? substr($path, 1) : $path) + (str_starts_with($path, '/') ? substr($path, 1) : $path) : null, 'read_timeout' => $dsn->getFloat('read_timeout'), 'write_timeout' => $dsn->getFloat('write_timeout'), diff --git a/pkg/amqp-tools/DelayStrategyAware.php b/pkg/amqp-tools/DelayStrategyAware.php index f41a856a1..af488ce07 100644 --- a/pkg/amqp-tools/DelayStrategyAware.php +++ b/pkg/amqp-tools/DelayStrategyAware.php @@ -6,5 +6,5 @@ interface DelayStrategyAware { - public function setDelayStrategy(DelayStrategy $delayStrategy = null): self; + public function setDelayStrategy(?DelayStrategy $delayStrategy = null): self; } diff --git a/pkg/amqp-tools/DelayStrategyAwareTrait.php b/pkg/amqp-tools/DelayStrategyAwareTrait.php index 785f12895..b29f05797 100644 --- a/pkg/amqp-tools/DelayStrategyAwareTrait.php +++ b/pkg/amqp-tools/DelayStrategyAwareTrait.php @@ -11,7 +11,7 @@ trait DelayStrategyAwareTrait */ protected $delayStrategy; - public function setDelayStrategy(DelayStrategy $delayStrategy = null): DelayStrategyAware + public function setDelayStrategy(?DelayStrategy $delayStrategy = null): DelayStrategyAware { $this->delayStrategy = $delayStrategy; diff --git a/pkg/amqp-tools/RabbitMqDelayPluginDelayStrategy.php b/pkg/amqp-tools/RabbitMqDelayPluginDelayStrategy.php index 192135965..180d43bd9 100644 --- a/pkg/amqp-tools/RabbitMqDelayPluginDelayStrategy.php +++ b/pkg/amqp-tools/RabbitMqDelayPluginDelayStrategy.php @@ -39,10 +39,7 @@ public function delayMessage(AmqpContext $context, AmqpDestination $dest, AmqpMe $context->declareTopic($delayTopic); $context->bind(new AmqpBind($dest, $delayTopic, $delayMessage->getRoutingKey())); } else { - throw new InvalidDestinationException(sprintf('The destination must be an instance of %s but got %s.', - AmqpTopic::class.'|'.AmqpQueue::class, - get_class($dest) - )); + throw new InvalidDestinationException(sprintf('The destination must be an instance of %s but got %s.', AmqpTopic::class.'|'.AmqpQueue::class, $dest::class)); } $producer = $context->createProducer(); diff --git a/pkg/amqp-tools/RabbitMqDlxDelayStrategy.php b/pkg/amqp-tools/RabbitMqDlxDelayStrategy.php index f0fdd8956..35d9b59fe 100644 --- a/pkg/amqp-tools/RabbitMqDlxDelayStrategy.php +++ b/pkg/amqp-tools/RabbitMqDlxDelayStrategy.php @@ -13,9 +13,6 @@ class RabbitMqDlxDelayStrategy implements DelayStrategy { - /** - * {@inheritdoc} - */ public function delayMessage(AmqpContext $context, AmqpDestination $dest, AmqpMessage $message, int $delay): void { $properties = $message->getProperties(); @@ -44,10 +41,7 @@ public function delayMessage(AmqpContext $context, AmqpDestination $dest, AmqpMe $delayQueue->setArgument('x-dead-letter-exchange', ''); $delayQueue->setArgument('x-dead-letter-routing-key', $dest->getQueueName()); } else { - throw new InvalidDestinationException(sprintf('The destination must be an instance of %s but got %s.', - AmqpTopic::class.'|'.AmqpQueue::class, - get_class($dest) - )); + throw new InvalidDestinationException(sprintf('The destination must be an instance of %s but got %s.', AmqpTopic::class.'|'.AmqpQueue::class, $dest::class)); } $context->declareQueue($delayQueue); diff --git a/pkg/amqp-tools/SignalSocketHelper.php b/pkg/amqp-tools/SignalSocketHelper.php index 0bee8f22e..623a5e3e2 100644 --- a/pkg/amqp-tools/SignalSocketHelper.php +++ b/pkg/amqp-tools/SignalSocketHelper.php @@ -28,7 +28,7 @@ public function beforeSocket(): void return; } - $signals = [SIGTERM, SIGQUIT, SIGINT]; + $signals = [\SIGTERM, \SIGQUIT, \SIGINT]; if ($this->handlers) { throw new \LogicException('The handlers property should be empty but it is not. The afterSocket method might not have been called.'); @@ -60,12 +60,12 @@ public function afterSocket(): void return; } - $signals = [SIGTERM, SIGQUIT, SIGINT]; + $signals = [\SIGTERM, \SIGQUIT, \SIGINT]; $this->wasThereSignal = null; foreach ($signals as $signal) { - $handler = isset($this->handlers[$signal]) ? $this->handlers[$signal] : SIG_DFL; + $handler = isset($this->handlers[$signal]) ? $this->handlers[$signal] : \SIG_DFL; pcntl_signal($signal, $handler); } @@ -73,9 +73,6 @@ public function afterSocket(): void $this->handlers = []; } - /** - * @return bool - */ public function wasThereSignal(): bool { return (bool) $this->wasThereSignal; diff --git a/pkg/amqp-tools/Tests/ConnectionConfigTest.php b/pkg/amqp-tools/Tests/ConnectionConfigTest.php index 67a3f624b..1a1dc477d 100644 --- a/pkg/amqp-tools/Tests/ConnectionConfigTest.php +++ b/pkg/amqp-tools/Tests/ConnectionConfigTest.php @@ -122,9 +122,6 @@ public function testShouldGetSchemeExtensions() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php b/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php index de2b77ec5..d20506919 100644 --- a/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php +++ b/pkg/amqp-tools/Tests/RabbitMqDelayPluginDelayStrategyTest.php @@ -192,7 +192,7 @@ public function send(Destination $destination, Message $message): void { } - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { throw new \BadMethodCallException('This should not be called directly'); } @@ -202,7 +202,7 @@ public function getDeliveryDelay(): ?int throw new \BadMethodCallException('This should not be called directly'); } - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { throw new \BadMethodCallException('This should not be called directly'); } @@ -212,7 +212,7 @@ public function getPriority(): ?int throw new \BadMethodCallException('This should not be called directly'); } - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { throw new \BadMethodCallException('This should not be called directly'); } diff --git a/pkg/async-command/CommandResult.php b/pkg/async-command/CommandResult.php index 1c746a9a2..10080d587 100644 --- a/pkg/async-command/CommandResult.php +++ b/pkg/async-command/CommandResult.php @@ -19,11 +19,6 @@ final class CommandResult implements \JsonSerializable */ private $errorOutput; - /** - * @param int $exitCode - * @param string $output - * @param string $errorOutput - */ public function __construct(int $exitCode, string $output, string $errorOutput) { $this->exitCode = $exitCode; @@ -58,12 +53,8 @@ public function jsonSerialize(): array public static function jsonUnserialize(string $json): self { $data = json_decode($json, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return new self($data['exitCode'], $data['output'], $data['errorOutput']); diff --git a/pkg/async-command/Commands.php b/pkg/async-command/Commands.php index 0d751accd..abc015cf8 100644 --- a/pkg/async-command/Commands.php +++ b/pkg/async-command/Commands.php @@ -4,5 +4,5 @@ final class Commands { - const RUN_COMMAND = 'run_command'; + public const RUN_COMMAND = 'run_command'; } diff --git a/pkg/async-command/RunCommand.php b/pkg/async-command/RunCommand.php index 437c3a6d9..573a6200b 100644 --- a/pkg/async-command/RunCommand.php +++ b/pkg/async-command/RunCommand.php @@ -20,7 +20,6 @@ final class RunCommand implements \JsonSerializable private $options; /** - * @param string $command * @param string[] $arguments * @param string[] $options */ @@ -64,12 +63,8 @@ public function jsonSerialize(): array public static function jsonUnserialize(string $json): self { $data = json_decode($json, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return new self($data['command'], $data['arguments'], $data['options']); diff --git a/pkg/async-event-dispatcher/AsyncEventDispatcher.php b/pkg/async-event-dispatcher/AsyncEventDispatcher.php index fa7393ea6..e39136eff 100644 --- a/pkg/async-event-dispatcher/AsyncEventDispatcher.php +++ b/pkg/async-event-dispatcher/AsyncEventDispatcher.php @@ -4,7 +4,7 @@ class AsyncEventDispatcher extends AbstractAsyncEventDispatcher { - public function dispatch(object $event, string $eventName = null): object + public function dispatch(object $event, ?string $eventName = null): object { $this->parentDispatch($event, $eventName); diff --git a/pkg/async-event-dispatcher/AsyncProcessor.php b/pkg/async-event-dispatcher/AsyncProcessor.php index c89f7e1de..dc61c5381 100644 --- a/pkg/async-event-dispatcher/AsyncProcessor.php +++ b/pkg/async-event-dispatcher/AsyncProcessor.php @@ -25,11 +25,7 @@ public function __construct(Registry $registry, EventDispatcherInterface $dispat $this->registry = $registry; if (false == $dispatcher instanceof AsyncEventDispatcher) { - throw new \InvalidArgumentException(sprintf( - 'The dispatcher argument must be instance of "%s" but got "%s"', - AsyncEventDispatcher::class, - get_class($dispatcher) - )); + throw new \InvalidArgumentException(sprintf('The dispatcher argument must be instance of "%s" but got "%s"', AsyncEventDispatcher::class, $dispatcher::class)); } $this->dispatcher = $dispatcher; diff --git a/pkg/async-event-dispatcher/Commands.php b/pkg/async-event-dispatcher/Commands.php index a00ed6fa9..c2263ee38 100644 --- a/pkg/async-event-dispatcher/Commands.php +++ b/pkg/async-event-dispatcher/Commands.php @@ -4,5 +4,5 @@ final class Commands { - const DISPATCH_ASYNC_EVENTS = 'symfony.dispatch_async_events'; + public const DISPATCH_ASYNC_EVENTS = 'symfony.dispatch_async_events'; } diff --git a/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php b/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php index afe10217d..89046dd58 100644 --- a/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php +++ b/pkg/async-event-dispatcher/DependencyInjection/AsyncTransformersPass.php @@ -7,9 +7,6 @@ class AsyncTransformersPass implements CompilerPassInterface { - /** - * {@inheritdoc} - */ public function process(ContainerBuilder $container) { if (false == $container->hasDefinition('enqueue.events.registry')) { diff --git a/pkg/async-event-dispatcher/EventTransformer.php b/pkg/async-event-dispatcher/EventTransformer.php index cee8635bd..271dffa08 100644 --- a/pkg/async-event-dispatcher/EventTransformer.php +++ b/pkg/async-event-dispatcher/EventTransformer.php @@ -12,15 +12,12 @@ interface EventTransformer * * @return Message */ - public function toMessage($eventName, Event $event = null); + public function toMessage($eventName, ?Event $event = null); /** * If you able to transform message back to event return it. * If you failed to transform for some reason you can return a string status. * - * @param mixed $eventNAme - * @param mixed $eventName - * * @return Event|string|object * * @see Process constants) or an object that implements __toString method. diff --git a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php index 1204e9591..9c23883aa 100644 --- a/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php +++ b/pkg/async-event-dispatcher/PhpSerializerEventTransformer.php @@ -6,7 +6,7 @@ class PhpSerializerEventTransformer extends AbstractPhpSerializerEventTransformer implements EventTransformer { - public function toMessage($eventName, Event $event = null) + public function toMessage($eventName, ?Event $event = null) { return $this->context->createMessage(serialize($event)); } diff --git a/pkg/async-event-dispatcher/SimpleRegistry.php b/pkg/async-event-dispatcher/SimpleRegistry.php index 2f39d0cac..e5ba16ef8 100644 --- a/pkg/async-event-dispatcher/SimpleRegistry.php +++ b/pkg/async-event-dispatcher/SimpleRegistry.php @@ -24,9 +24,6 @@ public function __construct(array $eventsMap, array $transformersMap) $this->transformersMap = $transformersMap; } - /** - * {@inheritdoc} - */ public function getTransformerNameForEvent($eventName) { $transformerName = null; @@ -53,9 +50,6 @@ public function getTransformerNameForEvent($eventName) return $transformerName; } - /** - * {@inheritdoc} - */ public function getTransformer($name) { if (false == array_key_exists($name, $this->transformersMap)) { @@ -64,12 +58,8 @@ public function getTransformer($name) $transformer = $this->transformersMap[$name]; - if (false == $transformer instanceof EventTransformer) { - throw new \LogicException(sprintf( - 'The container must return instance of %s but got %s', - EventTransformer::class, - is_object($transformer) ? get_class($transformer) : gettype($transformer) - )); + if (false == $transformer instanceof EventTransformer) { + throw new \LogicException(sprintf('The container must return instance of %s but got %s', EventTransformer::class, is_object($transformer) ? $transformer::class : gettype($transformer))); } return $transformer; diff --git a/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php b/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php index 82e1e3fc7..c144e7466 100644 --- a/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php +++ b/pkg/async-event-dispatcher/Tests/SimpleRegistryTest.php @@ -21,7 +21,7 @@ public function testShouldImplementRegistryInterface() public function testShouldAllowGetTransportNameByEventName() { $registry = new SimpleRegistry([ - 'fooEvent' => 'fooTrans', + 'fooEvent' => 'fooTrans', ], []); $this->assertEquals('fooTrans', $registry->getTransformerNameForEvent('fooEvent')); diff --git a/pkg/dbal/DbalConnectionFactory.php b/pkg/dbal/DbalConnectionFactory.php index 2e0fe702e..305375a89 100644 --- a/pkg/dbal/DbalConnectionFactory.php +++ b/pkg/dbal/DbalConnectionFactory.php @@ -92,7 +92,7 @@ private function establishConnection(): Connection return $this->connection; } - private function parseDsn(string $dsn, array $config = null): array + private function parseDsn(string $dsn, ?array $config = null): array { $parsedDsn = Dsn::parseFirst($dsn); diff --git a/pkg/dbal/DbalContext.php b/pkg/dbal/DbalContext.php index fc1f4a27a..869dd67b8 100644 --- a/pkg/dbal/DbalContext.php +++ b/pkg/dbal/DbalContext.php @@ -56,9 +56,6 @@ public function __construct($connection, array $config = []) } } - /** - * {@inheritdoc} - */ public function createMessage(string $body = '', array $properties = [], array $headers = []): Message { $message = new DbalMessage(); @@ -201,7 +198,7 @@ public function getDbalConnection(): Connection if (false == $this->connection) { $connection = call_user_func($this->connectionFactory); if (false == $connection instanceof Connection) { - throw new \LogicException(sprintf('The factory must return instance of Doctrine\DBAL\Connection. It returns %s', is_object($connection) ? get_class($connection) : gettype($connection))); + throw new \LogicException(sprintf('The factory must return instance of Doctrine\DBAL\Connection. It returns %s', is_object($connection) ? $connection::class : gettype($connection))); } $this->connection = $connection; diff --git a/pkg/dbal/DbalMessage.php b/pkg/dbal/DbalMessage.php index dc5435b17..2485f0691 100644 --- a/pkg/dbal/DbalMessage.php +++ b/pkg/dbal/DbalMessage.php @@ -67,11 +67,6 @@ class DbalMessage implements Message */ private $publishedAt; - /** - * @param string $body - * @param array $properties - * @param array $headers - */ public function __construct(string $body = '', array $properties = [], array $headers = []) { $this->body = $body; @@ -144,7 +139,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -159,7 +154,7 @@ public function getPriority(): ?int return $this->priority; } - public function setPriority(int $priority = null): void + public function setPriority(?int $priority = null): void { $this->priority = $priority; } @@ -172,14 +167,11 @@ public function getDeliveryDelay(): ?int /** * Set delay in milliseconds. */ - public function setDeliveryDelay(int $deliveryDelay = null): void + public function setDeliveryDelay(?int $deliveryDelay = null): void { $this->deliveryDelay = $deliveryDelay; } - /** - * @return int - */ public function getTimeToLive(): ?int { return $this->timeToLive; @@ -188,12 +180,12 @@ public function getTimeToLive(): ?int /** * Set time to live in milliseconds. */ - public function setTimeToLive(int $timeToLive = null): void + public function setTimeToLive(?int $timeToLive = null): void { $this->timeToLive = $timeToLive; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', $correlationId); } @@ -203,7 +195,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id', null); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', $messageId); } @@ -220,7 +212,7 @@ public function getTimestamp(): ?int return null === $value ? null : $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } @@ -240,7 +232,7 @@ public function getRedeliverAfter(): int return $this->redeliverAfter; } - public function setRedeliverAfter(int $redeliverAfter = null): void + public function setRedeliverAfter(?int $redeliverAfter = null): void { $this->redeliverAfter = $redeliverAfter; } @@ -250,7 +242,7 @@ public function getPublishedAt(): ?int return $this->publishedAt; } - public function setPublishedAt(int $publishedAt = null): void + public function setPublishedAt(?int $publishedAt = null): void { $this->publishedAt = $publishedAt; } diff --git a/pkg/dbal/DbalProducer.php b/pkg/dbal/DbalProducer.php index f0cdea849..9e3c203dd 100644 --- a/pkg/dbal/DbalProducer.php +++ b/pkg/dbal/DbalProducer.php @@ -81,7 +81,7 @@ public function send(Destination $destination, Message $message): void $delay = $message->getDeliveryDelay(); if ($delay) { if (!is_int($delay)) { - throw new \LogicException(sprintf('Delay must be integer but got: "%s"', is_object($delay) ? get_class($delay) : gettype($delay))); + throw new \LogicException(sprintf('Delay must be integer but got: "%s"', is_object($delay) ? $delay::class : gettype($delay))); } if ($delay <= 0) { @@ -94,7 +94,7 @@ public function send(Destination $destination, Message $message): void $timeToLive = $message->getTimeToLive(); if ($timeToLive) { if (!is_int($timeToLive)) { - throw new \LogicException(sprintf('TimeToLive must be integer but got: "%s"', is_object($timeToLive) ? get_class($timeToLive) : gettype($timeToLive))); + throw new \LogicException(sprintf('TimeToLive must be integer but got: "%s"', is_object($timeToLive) ? $timeToLive::class : gettype($timeToLive))); } if ($timeToLive <= 0) { @@ -128,7 +128,7 @@ public function send(Destination $destination, Message $message): void } } - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { $this->deliveryDelay = $deliveryDelay; @@ -140,7 +140,7 @@ public function getDeliveryDelay(): ?int return $this->deliveryDelay; } - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { $this->priority = $priority; @@ -152,7 +152,7 @@ public function getPriority(): ?int return $this->priority; } - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/dbal/DbalSubscriptionConsumer.php b/pkg/dbal/DbalSubscriptionConsumer.php index 145496917..472fdfcb4 100644 --- a/pkg/dbal/DbalSubscriptionConsumer.php +++ b/pkg/dbal/DbalSubscriptionConsumer.php @@ -25,7 +25,7 @@ class DbalSubscriptionConsumer implements SubscriptionConsumer private $subscribers; /** - * @var \Doctrine\DBAL\Connection + * @var Connection */ private $dbal; @@ -139,7 +139,7 @@ public function consume(int $timeout = 0): void public function subscribe(Consumer $consumer, callable $callback): void { if (false == $consumer instanceof DbalConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', DbalConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', DbalConsumer::class, $consumer::class)); } $queueName = $consumer->getQueue()->getQueueName(); @@ -160,7 +160,7 @@ public function subscribe(Consumer $consumer, callable $callback): void public function unsubscribe(Consumer $consumer): void { if (false == $consumer instanceof DbalConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', DbalConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', DbalConsumer::class, $consumer::class)); } $queueName = $consumer->getQueue()->getQueueName(); diff --git a/pkg/dbal/JSON.php b/pkg/dbal/JSON.php index 9f3f4728f..aa4c5f55c 100644 --- a/pkg/dbal/JSON.php +++ b/pkg/dbal/JSON.php @@ -14,10 +14,7 @@ class JSON public static function decode($string) { if (!is_string($string)) { - throw new \InvalidArgumentException(sprintf( - 'Accept only string argument but got: "%s"', - is_object($string) ? get_class($string) : gettype($string) - )); + throw new \InvalidArgumentException(sprintf('Accept only string argument but got: "%s"', is_object($string) ? $string::class : gettype($string))); } // PHP7 fix - empty string and null cause syntax error @@ -26,32 +23,22 @@ public static function decode($string) } $decoded = json_decode($string, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $decoded; } /** - * @param mixed $value - * * @return string */ public static function encode($value) { - $encoded = json_encode($value, JSON_UNESCAPED_UNICODE); - - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'Could not encode value into json. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + $encoded = json_encode($value, \JSON_UNESCAPED_UNICODE); + + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('Could not encode value into json. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $encoded; diff --git a/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php b/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php index dda690f9f..5929e1479 100644 --- a/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php +++ b/pkg/dbal/Tests/DbalConnectionFactoryConfigTest.php @@ -41,9 +41,6 @@ public function testThrowIfDsnCouldNotBeParsed() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/dbal/Tests/DbalConsumerTest.php b/pkg/dbal/Tests/DbalConsumerTest.php index 6538af11d..0b78eab00 100644 --- a/pkg/dbal/Tests/DbalConsumerTest.php +++ b/pkg/dbal/Tests/DbalConsumerTest.php @@ -265,7 +265,7 @@ public function isRedelivered(): bool throw new \BadMethodCallException('This should not be called directly'); } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { } @@ -274,7 +274,7 @@ public function getCorrelationId(): ?string throw new \BadMethodCallException('This should not be called directly'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { } @@ -288,11 +288,11 @@ public function getTimestamp(): ?int throw new \BadMethodCallException('This should not be called directly'); } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { } diff --git a/pkg/dbal/Tests/Functional/DbalConsumerTest.php b/pkg/dbal/Tests/Functional/DbalConsumerTest.php index f5b686cb9..8042598b9 100644 --- a/pkg/dbal/Tests/Functional/DbalConsumerTest.php +++ b/pkg/dbal/Tests/Functional/DbalConsumerTest.php @@ -117,15 +117,15 @@ public function testShouldDeleteExpiredMessage() $this->context->getDbalConnection()->insert( $this->context->getTableName(), [ - 'id' => 'id', - 'published_at' => '123', - 'body' => 'expiredMessage', - 'headers' => json_encode([]), - 'properties' => json_encode([]), - 'queue' => __METHOD__, - 'redelivered' => 0, - 'time_to_live' => time() - 10000, - ]); + 'id' => 'id', + 'published_at' => '123', + 'body' => 'expiredMessage', + 'headers' => json_encode([]), + 'properties' => json_encode([]), + 'queue' => __METHOD__, + 'redelivered' => 0, + 'time_to_live' => time() - 10000, + ]); $message = $context->createMessage('notExpiredMessage'); $message->setRedelivered(false); diff --git a/pkg/dbal/Tests/Spec/DbalConnectionFactoryTest.php b/pkg/dbal/Tests/Spec/DbalConnectionFactoryTest.php index d7fbfcde5..dc39cffe3 100644 --- a/pkg/dbal/Tests/Spec/DbalConnectionFactoryTest.php +++ b/pkg/dbal/Tests/Spec/DbalConnectionFactoryTest.php @@ -7,9 +7,6 @@ class DbalConnectionFactoryTest extends ConnectionFactorySpec { - /** - * {@inheritdoc} - */ protected function createConnectionFactory() { return new DbalConnectionFactory(); diff --git a/pkg/dbal/Tests/Spec/DbalMessageTest.php b/pkg/dbal/Tests/Spec/DbalMessageTest.php index c9ce855df..ee5bdcf6c 100644 --- a/pkg/dbal/Tests/Spec/DbalMessageTest.php +++ b/pkg/dbal/Tests/Spec/DbalMessageTest.php @@ -7,9 +7,6 @@ class DbalMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new DbalMessage(); diff --git a/pkg/dbal/Tests/Spec/DbalQueueTest.php b/pkg/dbal/Tests/Spec/DbalQueueTest.php index a9eebbb88..690f7e1d6 100644 --- a/pkg/dbal/Tests/Spec/DbalQueueTest.php +++ b/pkg/dbal/Tests/Spec/DbalQueueTest.php @@ -7,9 +7,6 @@ class DbalQueueTest extends QueueSpec { - /** - * {@inheritdoc} - */ protected function createQueue() { return new DbalDestination(self::EXPECTED_QUEUE_NAME); diff --git a/pkg/dbal/Tests/Spec/DbalTopicTest.php b/pkg/dbal/Tests/Spec/DbalTopicTest.php index bb9885ea8..4bd554681 100644 --- a/pkg/dbal/Tests/Spec/DbalTopicTest.php +++ b/pkg/dbal/Tests/Spec/DbalTopicTest.php @@ -7,9 +7,6 @@ class DbalTopicTest extends TopicSpec { - /** - * {@inheritdoc} - */ protected function createTopic() { return new DbalDestination(self::EXPECTED_TOPIC_NAME); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalContextTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalContextTest.php index f147f63b4..f235dd50a 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalContextTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalContextTest.php @@ -11,9 +11,6 @@ class DbalContextTest extends ContextSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalProducerTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalProducerTest.php index 86abe4f63..99cfa2aa6 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalProducerTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalProducerTest.php @@ -11,9 +11,6 @@ class DbalProducerTest extends ProducerSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createProducer() { return $this->createDbalContext()->createProducer(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalRequeueMessageTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalRequeueMessageTest.php index 7dcec7a75..a642d7288 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalRequeueMessageTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalRequeueMessageTest.php @@ -11,9 +11,6 @@ class DbalRequeueMessageTest extends RequeueMessageSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceiveDelayedMessageFromQueueTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceiveDelayedMessageFromQueueTest.php index 227ac9705..2455217d6 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceiveDelayedMessageFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceiveDelayedMessageFromQueueTest.php @@ -11,9 +11,6 @@ class DbalSendAndReceiveDelayedMessageFromQueueTest extends SendAndReceiveDelaye { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php index 23a5855b5..6926a3d57 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceivePriorityMessagesFromQueueTest.php @@ -32,8 +32,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param DbalContext $context * * @return DbalMessage diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php index fe863e4cc..7ec1dd64f 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php @@ -11,9 +11,6 @@ class DbalSendAndReceiveTimeToLiveMessagesFromQueueTest extends SendAndReceiveTi { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveFromQueueTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveFromQueueTest.php index 2d8c7979f..798e4b844 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveFromQueueTest.php @@ -11,9 +11,6 @@ class DbalSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveFromTopicTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveFromTopicTest.php index 5a715a414..1d6f99456 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveFromTopicTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveFromTopicTest.php @@ -11,9 +11,6 @@ class DbalSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveNoWaitFromQueueTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveNoWaitFromQueueTest.php index 7f64871c4..d96cb85a4 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveNoWaitFromQueueTest.php @@ -11,9 +11,6 @@ class DbalSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFrom { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveNoWaitFromTopicTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveNoWaitFromTopicTest.php index 8ca133dd8..b211fc0ab 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSendToAndReceiveNoWaitFromTopicTest.php @@ -11,9 +11,6 @@ class DbalSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFrom { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php index a1ebe3a9b..015f1b716 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php @@ -18,8 +18,6 @@ class DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest extends Subscri /** * @return DbalContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param DbalContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php index df4b75ee7..37c406804 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -18,8 +18,6 @@ class DbalSubscriptionConsumerConsumeUntilUnsubscribedTest extends SubscriptionC /** * @return DbalContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param DbalContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerStopOnFalseTest.php b/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerStopOnFalseTest.php index 427195486..ad59c9e6f 100644 --- a/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerStopOnFalseTest.php +++ b/pkg/dbal/Tests/Spec/Mysql/DbalSubscriptionConsumerStopOnFalseTest.php @@ -18,8 +18,6 @@ class DbalSubscriptionConsumerStopOnFalseTest extends SubscriptionConsumerStopOn /** * @return DbalContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param DbalContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalContextTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalContextTest.php index 89aa1d45d..b07978cbd 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalContextTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalContextTest.php @@ -11,9 +11,6 @@ class DbalContextTest extends ContextSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalProducerTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalProducerTest.php index 533d032e9..aa8894de3 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalProducerTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalProducerTest.php @@ -11,9 +11,6 @@ class DbalProducerTest extends ProducerSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createProducer() { return $this->createDbalContext()->createProducer(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalRequeueMessageTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalRequeueMessageTest.php index e61f5a352..300a572eb 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalRequeueMessageTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalRequeueMessageTest.php @@ -11,9 +11,6 @@ class DbalRequeueMessageTest extends RequeueMessageSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveDelayedMessageFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveDelayedMessageFromQueueTest.php index f33c5688b..4d915c3b5 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveDelayedMessageFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveDelayedMessageFromQueueTest.php @@ -11,9 +11,6 @@ class DbalSendAndReceiveDelayedMessageFromQueueTest extends SendAndReceiveDelaye { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php index f6d048549..556f53b00 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceivePriorityMessagesFromQueueTest.php @@ -32,8 +32,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param DbalContext $context * * @return DbalMessage diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php index 99b007770..db92febe3 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendAndReceiveTimeToLiveMessagesFromQueueTest.php @@ -11,9 +11,6 @@ class DbalSendAndReceiveTimeToLiveMessagesFromQueueTest extends SendAndReceiveTi { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromQueueTest.php index c486f0f37..63e4456f0 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromQueueTest.php @@ -11,9 +11,6 @@ class DbalSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromTopicTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromTopicTest.php index 0802c0935..a2989fd54 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromTopicTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveFromTopicTest.php @@ -11,9 +11,6 @@ class DbalSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromQueueTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromQueueTest.php index 74e13d89f..9a08f3676 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromQueueTest.php @@ -11,9 +11,6 @@ class DbalSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFrom { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromTopicTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromTopicTest.php index 0b6b30c17..4383acd36 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSendToAndReceiveNoWaitFromTopicTest.php @@ -11,9 +11,6 @@ class DbalSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFrom { use CreateDbalContextTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->createDbalContext(); diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php index d50da8acf..d2c8ee22e 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php @@ -18,8 +18,6 @@ class DbalSubscriptionConsumerConsumeFromAllSubscribedQueuesTest extends Subscri /** * @return DbalContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param DbalContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php index 64473a30f..892adf372 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -18,8 +18,6 @@ class DbalSubscriptionConsumerConsumeUntilUnsubscribedTest extends SubscriptionC /** * @return DbalContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param DbalContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerStopOnFalseTest.php b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerStopOnFalseTest.php index 2b493ba84..9eeb918b8 100644 --- a/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerStopOnFalseTest.php +++ b/pkg/dbal/Tests/Spec/Postgresql/DbalSubscriptionConsumerStopOnFalseTest.php @@ -18,8 +18,6 @@ class DbalSubscriptionConsumerStopOnFalseTest extends SubscriptionConsumerStopOn /** * @return DbalContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param DbalContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/dbal/examples/consume.php b/pkg/dbal/examples/consume.php index 6b404c93a..f63cf8a77 100644 --- a/pkg/dbal/examples/consume.php +++ b/pkg/dbal/examples/consume.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\Dbal\DbalConnectionFactory; @@ -35,7 +35,7 @@ while (true) { if ($m = $consumer->receive(1000)) { $consumer->acknowledge($m); - echo 'Received message: '.$m->getBody().PHP_EOL; + echo 'Received message: '.$m->getBody().\PHP_EOL; } } diff --git a/pkg/dbal/examples/produce.php b/pkg/dbal/examples/produce.php index c13b4f3b0..9f282bd0b 100644 --- a/pkg/dbal/examples/produce.php +++ b/pkg/dbal/examples/produce.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\Dbal\DbalConnectionFactory; @@ -34,7 +34,7 @@ while (true) { $context->createProducer()->send($destination, $message); - echo 'Sent message: '.$message->getBody().PHP_EOL; + echo 'Sent message: '.$message->getBody().\PHP_EOL; sleep(1); } diff --git a/pkg/dsn/Dsn.php b/pkg/dsn/Dsn.php index a5cc139b2..f46d7c056 100644 --- a/pkg/dsn/Dsn.php +++ b/pkg/dsn/Dsn.php @@ -66,7 +66,7 @@ public function __construct( ?int $port, ?string $path, ?string $queryString, - array $query + array $query, ) { $this->scheme = $scheme; $this->schemeProtocol = $schemeProtocol; @@ -140,27 +140,27 @@ public function getQuery(): array return $this->queryBag->toArray(); } - public function getString(string $name, string $default = null): ?string + public function getString(string $name, ?string $default = null): ?string { return $this->queryBag->getString($name, $default); } - public function getDecimal(string $name, int $default = null): ?int + public function getDecimal(string $name, ?int $default = null): ?int { return $this->queryBag->getDecimal($name, $default); } - public function getOctal(string $name, int $default = null): ?int + public function getOctal(string $name, ?int $default = null): ?int { return $this->queryBag->getOctal($name, $default); } - public function getFloat(string $name, float $default = null): ?float + public function getFloat(string $name, ?float $default = null): ?float { return $this->queryBag->getFloat($name, $default); } - public function getBool(string $name, bool $default = null): ?bool + public function getBool(string $name, ?bool $default = null): ?bool { return $this->queryBag->getBool($name, $default); } @@ -192,14 +192,12 @@ public static function parseFirst(string $dsn): ?self } /** - * @param string $dsn - * * @return Dsn[] */ public static function parse(string $dsn): array { - if (false === strpos($dsn, ':')) { - throw new \LogicException(sprintf('The DSN is invalid. It does not have scheme separator ":".')); + if (!str_contains($dsn, ':')) { + throw new \LogicException('The DSN is invalid. It does not have scheme separator ":".'); } list($scheme, $dsnWithoutScheme) = explode(':', $dsn, 2); @@ -215,28 +213,28 @@ public static function parse(string $dsn): array unset($schemeParts[0]); $schemeExtensions = array_values($schemeParts); - $user = parse_url(http://github.com/$dsn,%20PHP_URL_USER) ?: null; + $user = parse_url(http://github.com/$dsn,%20/PHP_URL_USER) ?: null; if (is_string($user)) { $user = rawurldecode($user); } - $password = parse_url(http://github.com/$dsn,%20PHP_URL_PASS) ?: null; + $password = parse_url(http://github.com/$dsn,%20/PHP_URL_PASS) ?: null; if (is_string($password)) { $password = rawurldecode($password); } - $path = parse_url(http://github.com/$dsn,%20PHP_URL_PATH) ?: null; + $path = parse_url(http://github.com/$dsn,%20/PHP_URL_PATH) ?: null; if ($path) { $path = rawurldecode($path); } $query = []; - $queryString = parse_url(http://github.com/$dsn,%20PHP_URL_QUERY) ?: null; + $queryString = parse_url(http://github.com/$dsn,%20/PHP_URL_QUERY) ?: null; if (is_string($queryString)) { - $query = self::httpParseQuery($queryString, '&', PHP_QUERY_RFC3986); + $query = self::httpParseQuery($queryString, '&', \PHP_QUERY_RFC3986); } $hostsPorts = ''; - if (0 === strpos($dsnWithoutScheme, '//')) { + if (str_starts_with($dsnWithoutScheme, '//')) { $dsnWithoutScheme = substr($dsnWithoutScheme, 2); $dsnWithoutUserPassword = explode('@', $dsnWithoutScheme, 2); $dsnWithoutUserPassword = 2 === count($dsnWithoutUserPassword) ? @@ -299,7 +297,7 @@ public static function parse(string $dsn): array /** * based on http://php.net/manual/en/function.parse-str.php#119484 with some slight modifications. */ - private static function httpParseQuery(string $queryString, string $argSeparator = '&', int $decType = PHP_QUERY_RFC1738): array + private static function httpParseQuery(string $queryString, string $argSeparator = '&', int $decType = \PHP_QUERY_RFC1738): array { $result = []; $parts = explode($argSeparator, $queryString); @@ -308,11 +306,11 @@ private static function httpParseQuery(string $queryString, string $argSeparator list($paramName, $paramValue) = explode('=', $part, 2); switch ($decType) { - case PHP_QUERY_RFC3986: + case \PHP_QUERY_RFC3986: $paramName = rawurldecode($paramName); $paramValue = rawurldecode($paramValue); break; - case PHP_QUERY_RFC1738: + case \PHP_QUERY_RFC1738: default: $paramName = urldecode($paramName); $paramValue = urldecode($paramValue); diff --git a/pkg/dsn/QueryBag.php b/pkg/dsn/QueryBag.php index 53d82b8ed..ea15aa854 100644 --- a/pkg/dsn/QueryBag.php +++ b/pkg/dsn/QueryBag.php @@ -21,12 +21,12 @@ public function toArray(): array return $this->query; } - public function getString(string $name, string $default = null): ?string + public function getString(string $name, ?string $default = null): ?string { return array_key_exists($name, $this->query) ? $this->query[$name] : $default; } - public function getDecimal(string $name, int $default = null): ?int + public function getDecimal(string $name, ?int $default = null): ?int { $value = $this->getString($name); if (null === $value) { @@ -40,7 +40,7 @@ public function getDecimal(string $name, int $default = null): ?int return (int) $value; } - public function getOctal(string $name, int $default = null): ?int + public function getOctal(string $name, ?int $default = null): ?int { $value = $this->getString($name); if (null === $value) { @@ -54,7 +54,7 @@ public function getOctal(string $name, int $default = null): ?int return intval($value, 8); } - public function getFloat(string $name, float $default = null): ?float + public function getFloat(string $name, ?float $default = null): ?float { $value = $this->getString($name); if (null === $value) { @@ -68,7 +68,7 @@ public function getFloat(string $name, float $default = null): ?float return (float) $value; } - public function getBool(string $name, bool $default = null): ?bool + public function getBool(string $name, ?bool $default = null): ?bool { $value = $this->getString($name); if (null === $value) { diff --git a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php index 7cc53688d..7fd9527db 100644 --- a/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php +++ b/pkg/enqueue-bundle/Consumption/Extension/DoctrinePingConnectionExtension.php @@ -6,8 +6,6 @@ use Doctrine\Persistence\ManagerRegistry; use Enqueue\Consumption\Context\MessageReceived; use Enqueue\Consumption\MessageReceivedExtensionInterface; -use ErrorException; -use Throwable; class DoctrinePingConnectionExtension implements MessageReceivedExtensionInterface { @@ -49,7 +47,7 @@ public function onMessageReceived(MessageReceived $context): void private function ping(Connection $connection): bool { set_error_handler(static function (int $severity, string $message, string $file, int $line): bool { - throw new ErrorException($message, $severity, $severity, $file, $line); + throw new \ErrorException($message, $severity, $severity, $file, $line); }); try { @@ -58,7 +56,7 @@ private function ping(Connection $connection): bool $connection->executeQuery($dummySelectSQL); return true; - } catch (Throwable $exception) { + } catch (\Throwable $exception) { return false; } finally { restore_error_handler(); diff --git a/pkg/enqueue-bundle/EnqueueBundle.php b/pkg/enqueue-bundle/EnqueueBundle.php index 195013578..5010ba0ed 100644 --- a/pkg/enqueue-bundle/EnqueueBundle.php +++ b/pkg/enqueue-bundle/EnqueueBundle.php @@ -23,11 +23,11 @@ class EnqueueBundle extends Bundle { public function build(ContainerBuilder $container): void { - //transport passes + // transport passes $container->addCompilerPass(new BuildConsumptionExtensionsPass()); $container->addCompilerPass(new BuildProcessorRegistryPass()); - //client passes + // client passes $container->addCompilerPass(new BuildClientConsumptionExtensionsPass()); $container->addCompilerPass(new BuildClientExtensionsPass()); $container->addCompilerPass(new BuildClientTopicSubscriberRoutesPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 100); diff --git a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php index 2a734682d..0a83a04b6 100644 --- a/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php +++ b/pkg/enqueue-bundle/Tests/Functional/App/TestAsyncEventTransformer.php @@ -21,9 +21,9 @@ public function __construct(Context $context) $this->context = $context; } - public function toMessage($eventName, Event $event = null) + public function toMessage($eventName, ?Event $event = null) { - if (Event::class === get_class($event)) { + if (Event::class === $event::class) { return $this->context->createMessage(json_encode('')); } diff --git a/pkg/enqueue-bundle/Tests/Functional/Client/ProducerTest.php b/pkg/enqueue-bundle/Tests/Functional/Client/ProducerTest.php index 51db9dc25..29a96aa7d 100644 --- a/pkg/enqueue-bundle/Tests/Functional/Client/ProducerTest.php +++ b/pkg/enqueue-bundle/Tests/Functional/Client/ProducerTest.php @@ -4,7 +4,6 @@ use Enqueue\Bundle\Tests\Functional\WebTestCase; use Enqueue\Client\Message; -use Enqueue\Client\Producer; use Enqueue\Client\ProducerInterface; use Enqueue\Client\TraceableProducer; use Enqueue\Rpc\Promise; diff --git a/pkg/enqueue-bundle/Tests/Functional/TestCommandProcessor.php b/pkg/enqueue-bundle/Tests/Functional/TestCommandProcessor.php index 5875a865b..dfc2bb864 100644 --- a/pkg/enqueue-bundle/Tests/Functional/TestCommandProcessor.php +++ b/pkg/enqueue-bundle/Tests/Functional/TestCommandProcessor.php @@ -9,7 +9,7 @@ class TestCommandProcessor implements Processor, CommandSubscriberInterface { - const COMMAND = 'test-command'; + public const COMMAND = 'test-command'; /** * @var Message diff --git a/pkg/enqueue-bundle/Tests/Functional/TestProcessor.php b/pkg/enqueue-bundle/Tests/Functional/TestProcessor.php index 8d21cb7ac..9b54bdf2d 100644 --- a/pkg/enqueue-bundle/Tests/Functional/TestProcessor.php +++ b/pkg/enqueue-bundle/Tests/Functional/TestProcessor.php @@ -9,7 +9,7 @@ class TestProcessor implements Processor, TopicSubscriberInterface { - const TOPIC = 'test-topic'; + public const TOPIC = 'test-topic'; /** * @var Message diff --git a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php index 76fe29b94..63282a255 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/Consumption/Extension/ResetServicesExtensionTest.php @@ -16,7 +16,6 @@ class ResetServicesExtensionTest extends TestCase { - public function testItShouldResetServices() { $resetter = $this->createResetterMock(); diff --git a/pkg/enqueue-bundle/Tests/fix_composer_json.php b/pkg/enqueue-bundle/Tests/fix_composer_json.php index 6cc24aa03..5c80237ea 100644 --- a/pkg/enqueue-bundle/Tests/fix_composer_json.php +++ b/pkg/enqueue-bundle/Tests/fix_composer_json.php @@ -7,4 +7,4 @@ $composerJson['config']['platform']['ext-amqp'] = '1.9.3'; $composerJson['config']['platform']['ext-mongo'] = '1.6.14'; -file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, JSON_PRETTY_PRINT)); +file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, \JSON_PRETTY_PRINT)); diff --git a/pkg/enqueue/Client/ChainExtension.php b/pkg/enqueue/Client/ChainExtension.php index d01da379f..655b75f6a 100644 --- a/pkg/enqueue/Client/ChainExtension.php +++ b/pkg/enqueue/Client/ChainExtension.php @@ -67,7 +67,7 @@ public function __construct(array $extensions) } if (false == $extensionValid) { - throw new \LogicException(sprintf('Invalid extension given %s', get_class($extension))); + throw new \LogicException(sprintf('Invalid extension given %s', $extension::class)); } }); } diff --git a/pkg/enqueue/Client/Config.php b/pkg/enqueue/Client/Config.php index 888384207..34057e1c1 100644 --- a/pkg/enqueue/Client/Config.php +++ b/pkg/enqueue/Client/Config.php @@ -4,13 +4,13 @@ class Config { - const TOPIC = 'enqueue.topic'; - const COMMAND = 'enqueue.command'; - const PROCESSOR = 'enqueue.processor'; - const EXPIRE = 'enqueue.expire'; - const PRIORITY = 'enqueue.priority'; - const DELAY = 'enqueue.delay'; - const CONTENT_TYPE = 'enqueue.content_type'; + public const TOPIC = 'enqueue.topic'; + public const COMMAND = 'enqueue.command'; + public const PROCESSOR = 'enqueue.processor'; + public const EXPIRE = 'enqueue.expire'; + public const PRIORITY = 'enqueue.priority'; + public const DELAY = 'enqueue.delay'; + public const CONTENT_TYPE = 'enqueue.content_type'; /** * @var string @@ -66,7 +66,7 @@ public function __construct( string $defaultQueue, string $routerProcessor, array $transportConfig, - array $driverConfig + array $driverConfig, ) { $this->prefix = trim($prefix); $this->app = trim($app); @@ -153,15 +153,15 @@ public function getDriverOptions(): array } public static function create( - string $prefix = null, - string $separator = null, - string $app = null, - string $routerTopic = null, - string $routerQueue = null, - string $defaultQueue = null, - string $routerProcessor = null, + ?string $prefix = null, + ?string $separator = null, + ?string $app = null, + ?string $routerTopic = null, + ?string $routerQueue = null, + ?string $defaultQueue = null, + ?string $routerProcessor = null, array $transportConfig = [], - array $driverConfig = [] + array $driverConfig = [], ): self { return new static( $prefix ?: '', diff --git a/pkg/enqueue/Client/ConsumptionExtension/DelayRedeliveredMessageExtension.php b/pkg/enqueue/Client/ConsumptionExtension/DelayRedeliveredMessageExtension.php index 77e3bc451..475e2cf5b 100644 --- a/pkg/enqueue/Client/ConsumptionExtension/DelayRedeliveredMessageExtension.php +++ b/pkg/enqueue/Client/ConsumptionExtension/DelayRedeliveredMessageExtension.php @@ -9,7 +9,7 @@ class DelayRedeliveredMessageExtension implements MessageReceivedExtensionInterface { - const PROPERTY_REDELIVER_COUNT = 'enqueue.redelivery_count'; + public const PROPERTY_REDELIVER_COUNT = 'enqueue.redelivery_count'; /** * @var DriverInterface @@ -24,8 +24,7 @@ class DelayRedeliveredMessageExtension implements MessageReceivedExtensionInterf private $delay; /** - * @param DriverInterface $driver - * @param int $delay The number of seconds the message should be delayed + * @param int $delay The number of seconds the message should be delayed */ public function __construct(DriverInterface $driver, $delay) { diff --git a/pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php b/pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php index c7682f60e..0d2278349 100644 --- a/pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php +++ b/pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php @@ -14,9 +14,6 @@ class SetRouterPropertiesExtension implements MessageReceivedExtensionInterface */ private $driver; - /** - * @param DriverInterface $driver - */ public function __construct(DriverInterface $driver) { $this->driver = $driver; diff --git a/pkg/enqueue/Client/ConsumptionExtension/SetupBrokerExtension.php b/pkg/enqueue/Client/ConsumptionExtension/SetupBrokerExtension.php index e35580794..44d610fb9 100644 --- a/pkg/enqueue/Client/ConsumptionExtension/SetupBrokerExtension.php +++ b/pkg/enqueue/Client/ConsumptionExtension/SetupBrokerExtension.php @@ -18,9 +18,6 @@ class SetupBrokerExtension implements StartExtensionInterface */ private $isDone; - /** - * @param DriverInterface $driver - */ public function __construct(DriverInterface $driver) { $this->driver = $driver; diff --git a/pkg/enqueue/Client/DelegateProcessor.php b/pkg/enqueue/Client/DelegateProcessor.php index 0fbe9c200..7582c52dc 100644 --- a/pkg/enqueue/Client/DelegateProcessor.php +++ b/pkg/enqueue/Client/DelegateProcessor.php @@ -20,8 +20,6 @@ public function __construct(ProcessorRegistryInterface $registry) } /** - * {@inheritdoc} - * * @return string|object */ public function process(InteropMessage $message, Context $context) diff --git a/pkg/enqueue/Client/Driver/AmqpDriver.php b/pkg/enqueue/Client/Driver/AmqpDriver.php index be62753bf..1def3fb23 100644 --- a/pkg/enqueue/Client/Driver/AmqpDriver.php +++ b/pkg/enqueue/Client/Driver/AmqpDriver.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Enqueue\Client\Driver; +namespace Enqueue\Client\Driver; use Enqueue\AmqpExt\AmqpProducer; use Enqueue\Client\Message; @@ -45,11 +45,7 @@ public function createTransportMessage(Message $clientMessage): InteropMessage $priorityMap = $this->getPriorityMap(); if ($priority = $clientMessage->getPriority()) { if (false == array_key_exists($priority, $priorityMap)) { - throw new \InvalidArgumentException(sprintf( - 'Cant convert client priority "%s" to transport one. Could be one of "%s"', - $priority, - implode('", "', array_keys($priorityMap)) - )); + throw new \InvalidArgumentException(sprintf('Cant convert client priority "%s" to transport one. Could be one of "%s"', $priority, implode('", "', array_keys($priorityMap)))); } $transportMessage->setPriority($priorityMap[$priority]); @@ -58,7 +54,7 @@ public function createTransportMessage(Message $clientMessage): InteropMessage return $transportMessage; } - public function setupBroker(LoggerInterface $logger = null): void + public function setupBroker(?LoggerInterface $logger = null): void { $logger = $logger ?: new NullLogger(); $log = function ($text, ...$args) use ($logger) { diff --git a/pkg/enqueue/Client/Driver/DbalDriver.php b/pkg/enqueue/Client/Driver/DbalDriver.php index 8b1f32655..34875eff7 100644 --- a/pkg/enqueue/Client/Driver/DbalDriver.php +++ b/pkg/enqueue/Client/Driver/DbalDriver.php @@ -16,7 +16,7 @@ public function __construct(DbalContext $context, ...$args) parent::__construct($context, ...$args); } - public function setupBroker(LoggerInterface $logger = null): void + public function setupBroker(?LoggerInterface $logger = null): void { $logger = $logger ?: new NullLogger(); $log = function ($text, ...$args) use ($logger) { diff --git a/pkg/enqueue/Client/Driver/FsDriver.php b/pkg/enqueue/Client/Driver/FsDriver.php index 9de59c23b..f578b172d 100644 --- a/pkg/enqueue/Client/Driver/FsDriver.php +++ b/pkg/enqueue/Client/Driver/FsDriver.php @@ -1,6 +1,6 @@ context = $context; $this->config = $config; @@ -120,7 +120,7 @@ public function sendToProcessor(Message $message): DriverSendResult return new DriverSendResult($queue, $transportMessage); } - public function setupBroker(LoggerInterface $logger = null): void + public function setupBroker(?LoggerInterface $logger = null): void { } diff --git a/pkg/enqueue/Client/Driver/GpsDriver.php b/pkg/enqueue/Client/Driver/GpsDriver.php index 37a7110c1..32d14f721 100644 --- a/pkg/enqueue/Client/Driver/GpsDriver.php +++ b/pkg/enqueue/Client/Driver/GpsDriver.php @@ -20,7 +20,7 @@ public function __construct(GpsContext $context, ...$args) parent::__construct($context, ...$args); } - public function setupBroker(LoggerInterface $logger = null): void + public function setupBroker(?LoggerInterface $logger = null): void { $logger = $logger ?: new NullLogger(); $log = function ($text, ...$args) use ($logger) { diff --git a/pkg/enqueue/Client/Driver/MongodbDriver.php b/pkg/enqueue/Client/Driver/MongodbDriver.php index 19f2c57d3..1c9cff4bc 100644 --- a/pkg/enqueue/Client/Driver/MongodbDriver.php +++ b/pkg/enqueue/Client/Driver/MongodbDriver.php @@ -16,7 +16,7 @@ public function __construct(MongodbContext $context, ...$args) parent::__construct($context, ...$args); } - public function setupBroker(LoggerInterface $logger = null): void + public function setupBroker(?LoggerInterface $logger = null): void { $logger = $logger ?: new NullLogger(); $log = function ($text, ...$args) use ($logger) { diff --git a/pkg/enqueue/Client/Driver/RabbitMqDriver.php b/pkg/enqueue/Client/Driver/RabbitMqDriver.php index 096de6d26..f215d555e 100644 --- a/pkg/enqueue/Client/Driver/RabbitMqDriver.php +++ b/pkg/enqueue/Client/Driver/RabbitMqDriver.php @@ -1,6 +1,6 @@ debug('[RdKafkaDriver] setup broker'); diff --git a/pkg/enqueue/Client/Driver/SnsQsDriver.php b/pkg/enqueue/Client/Driver/SnsQsDriver.php index 2b1d4f233..f4bde10c2 100644 --- a/pkg/enqueue/Client/Driver/SnsQsDriver.php +++ b/pkg/enqueue/Client/Driver/SnsQsDriver.php @@ -19,7 +19,7 @@ public function __construct(SnsQsContext $context, ...$args) parent::__construct($context, ...$args); } - public function setupBroker(LoggerInterface $logger = null): void + public function setupBroker(?LoggerInterface $logger = null): void { $logger = $logger ?: new NullLogger(); $log = function ($text, ...$args) use ($logger) { diff --git a/pkg/enqueue/Client/Driver/SqsDriver.php b/pkg/enqueue/Client/Driver/SqsDriver.php index bf66c050c..49b696aae 100644 --- a/pkg/enqueue/Client/Driver/SqsDriver.php +++ b/pkg/enqueue/Client/Driver/SqsDriver.php @@ -18,7 +18,7 @@ public function __construct(SqsContext $context, ...$args) parent::__construct($context, ...$args); } - public function setupBroker(LoggerInterface $logger = null): void + public function setupBroker(?LoggerInterface $logger = null): void { $logger = $logger ?: new NullLogger(); $log = function ($text, ...$args) use ($logger) { diff --git a/pkg/enqueue/Client/Driver/StompDriver.php b/pkg/enqueue/Client/Driver/StompDriver.php index 7040c71dd..811ad76e7 100644 --- a/pkg/enqueue/Client/Driver/StompDriver.php +++ b/pkg/enqueue/Client/Driver/StompDriver.php @@ -22,7 +22,7 @@ public function __construct(StompContext $context, ...$args) parent::__construct($context, ...$args); } - public function setupBroker(LoggerInterface $logger = null): void + public function setupBroker(?LoggerInterface $logger = null): void { $logger = $logger ?: new NullLogger(); $logger->debug('[StompDriver] Stomp protocol does not support broker configuration'); diff --git a/pkg/enqueue/Client/Driver/StompManagementClient.php b/pkg/enqueue/Client/Driver/StompManagementClient.php index c068a57df..5880672b5 100644 --- a/pkg/enqueue/Client/Driver/StompManagementClient.php +++ b/pkg/enqueue/Client/Driver/StompManagementClient.php @@ -37,7 +37,7 @@ public function declareExchange(string $name, array $options) return $this->client->exchanges()->create($this->vhost, $name, $options); } - public function bind(string $exchange, string $queue, string $routingKey = null, $arguments = null) + public function bind(string $exchange, string $queue, ?string $routingKey = null, $arguments = null) { return $this->client->bindings()->create($this->vhost, $exchange, $queue, $routingKey, $arguments); } diff --git a/pkg/enqueue/Client/DriverFactory.php b/pkg/enqueue/Client/DriverFactory.php index 0dd9412d8..1d383ac86 100644 --- a/pkg/enqueue/Client/DriverFactory.php +++ b/pkg/enqueue/Client/DriverFactory.php @@ -31,18 +31,10 @@ public function create(ConnectionFactory $factory, Config $config, RouteCollecti $knownDrivers = Resources::getKnownDrivers(); if ($driverInfo = $this->findDriverInfo($dsn, $knownDrivers)) { - throw new \LogicException(sprintf( - 'To use given scheme "%s" a package has to be installed. Run "composer req %s" to add it.', - $dsn->getScheme(), - implode(' ', $driverInfo['packages']) - )); + throw new \LogicException(sprintf('To use given scheme "%s" a package has to be installed. Run "composer req %s" to add it.', $dsn->getScheme(), implode(' ', $driverInfo['packages']))); } - throw new \LogicException(sprintf( - 'A given scheme "%s" is not supported. Maybe it is a custom driver, make sure you registered it with "%s::addDriver".', - $dsn->getScheme(), - Resources::class - )); + throw new \LogicException(sprintf('A given scheme "%s" is not supported. Maybe it is a custom driver, make sure you registered it with "%s::addDriver".', $dsn->getScheme(), Resources::class)); } private function findDriverInfo(Dsn $dsn, array $factories): ?array diff --git a/pkg/enqueue/Client/DriverInterface.php b/pkg/enqueue/Client/DriverInterface.php index 1832e0f9a..9d1dde679 100644 --- a/pkg/enqueue/Client/DriverInterface.php +++ b/pkg/enqueue/Client/DriverInterface.php @@ -27,7 +27,7 @@ public function createRouteQueue(Route $route): InteropQueue; * Prepare broker for work. * Creates all required queues, exchanges, topics, bindings etc. */ - public function setupBroker(LoggerInterface $logger = null): void; + public function setupBroker(?LoggerInterface $logger = null): void; public function getConfig(): Config; diff --git a/pkg/enqueue/Client/Extension/PrepareBodyExtension.php b/pkg/enqueue/Client/Extension/PrepareBodyExtension.php index eeb0ded03..e7924548c 100644 --- a/pkg/enqueue/Client/Extension/PrepareBodyExtension.php +++ b/pkg/enqueue/Client/Extension/PrepareBodyExtension.php @@ -32,10 +32,7 @@ private function prepareBody(Message $message): void // only array of scalars is allowed. array_walk_recursive($body, function ($value) { if (!is_scalar($value) && null !== $value) { - throw new \LogicException(sprintf( - 'The message\'s body must be an array of scalars. Found not scalar in the array: %s', - is_object($value) ? get_class($value) : gettype($value) - )); + throw new \LogicException(sprintf('The message\'s body must be an array of scalars. Found not scalar in the array: %s', is_object($value) ? $value::class : gettype($value))); } }); @@ -45,10 +42,7 @@ private function prepareBody(Message $message): void $contentType = $contentType ?: 'application/json'; $body = JSON::encode($body); } else { - throw new \InvalidArgumentException(sprintf( - 'The message\'s body must be either null, scalar, array or object (implements \JsonSerializable). Got: %s', - is_object($body) ? get_class($body) : gettype($body) - )); + throw new \InvalidArgumentException(sprintf('The message\'s body must be either null, scalar, array or object (implements \JsonSerializable). Got: %s', is_object($body) ? $body::class : gettype($body))); } $message->setContentType($contentType); diff --git a/pkg/enqueue/Client/Message.php b/pkg/enqueue/Client/Message.php index b1cc9c27a..7e51ea10d 100644 --- a/pkg/enqueue/Client/Message.php +++ b/pkg/enqueue/Client/Message.php @@ -7,12 +7,12 @@ class Message /** * @const string */ - const SCOPE_MESSAGE_BUS = 'enqueue.scope.message_bus'; + public const SCOPE_MESSAGE_BUS = 'enqueue.scope.message_bus'; /** * @const string */ - const SCOPE_APP = 'enqueue.scope.app'; + public const SCOPE_APP = 'enqueue.scope.app'; /** * @var string|null @@ -256,10 +256,8 @@ public function getHeaders() } /** - * @param string $name - * @param mixed $default - * - * @return mixed + * @param string $name + * @param mixed|null $default */ public function getHeader($name, $default = null) { @@ -268,16 +266,12 @@ public function getHeader($name, $default = null) /** * @param string $name - * @param mixed $value */ public function setHeader($name, $value) { $this->headers[$name] = $value; } - /** - * @param array $headers - */ public function setHeaders(array $headers) { $this->headers = $headers; @@ -291,19 +285,14 @@ public function getProperties() return $this->properties; } - /** - * @param array $properties - */ public function setProperties(array $properties) { $this->properties = $properties; } /** - * @param string $name - * @param mixed $default - * - * @return mixed + * @param string $name + * @param mixed|null $default */ public function getProperty($name, $default = null) { @@ -312,7 +301,6 @@ public function getProperty($name, $default = null) /** * @param string $name - * @param mixed $value */ public function setProperty($name, $value) { diff --git a/pkg/enqueue/Client/MessagePriority.php b/pkg/enqueue/Client/MessagePriority.php index efa658c14..e14be9a7d 100644 --- a/pkg/enqueue/Client/MessagePriority.php +++ b/pkg/enqueue/Client/MessagePriority.php @@ -4,9 +4,9 @@ class MessagePriority { - const VERY_LOW = 'enqueue.message_queue.client.very_low_message_priority'; - const LOW = 'enqueue.message_queue.client.low_message_priority'; - const NORMAL = 'enqueue.message_queue.client.normal_message_priority'; - const HIGH = 'enqueue.message_queue.client.high_message_priority'; - const VERY_HIGH = 'enqueue.message_queue.client.very_high_message_priority'; + public const VERY_LOW = 'enqueue.message_queue.client.very_low_message_priority'; + public const LOW = 'enqueue.message_queue.client.low_message_priority'; + public const NORMAL = 'enqueue.message_queue.client.normal_message_priority'; + public const HIGH = 'enqueue.message_queue.client.high_message_priority'; + public const VERY_HIGH = 'enqueue.message_queue.client.very_high_message_priority'; } diff --git a/pkg/enqueue/Client/PostSend.php b/pkg/enqueue/Client/PostSend.php index 7bce74155..5d9526ea4 100644 --- a/pkg/enqueue/Client/PostSend.php +++ b/pkg/enqueue/Client/PostSend.php @@ -22,7 +22,7 @@ public function __construct( ProducerInterface $producer, DriverInterface $driver, Destination $transportDestination, - TransportMessage $transportMessage + TransportMessage $transportMessage, ) { $this->message = $message; $this->producer = $producer; diff --git a/pkg/enqueue/Client/PreSend.php b/pkg/enqueue/Client/PreSend.php index afd64012f..b60f90b08 100644 --- a/pkg/enqueue/Client/PreSend.php +++ b/pkg/enqueue/Client/PreSend.php @@ -18,7 +18,7 @@ public function __construct( string $commandOrTopic, Message $message, ProducerInterface $producer, - DriverInterface $driver + DriverInterface $driver, ) { $this->message = $message; $this->commandOrTopic = $commandOrTopic; @@ -48,7 +48,7 @@ public function changeTopic(string $newTopic): void $this->commandOrTopic = $newTopic; } - public function changeBody($body, string $contentType = null): void + public function changeBody($body, ?string $contentType = null): void { $this->message->setBody($body); diff --git a/pkg/enqueue/Client/Producer.php b/pkg/enqueue/Client/Producer.php index 6ea612b8c..db50744a2 100644 --- a/pkg/enqueue/Client/Producer.php +++ b/pkg/enqueue/Client/Producer.php @@ -27,7 +27,7 @@ final class Producer implements ProducerInterface public function __construct( DriverInterface $driver, RpcFactory $rpcFactory, - ExtensionInterface $extension = null + ?ExtensionInterface $extension = null, ) { $this->driver = $driver; $this->rpcFactory = $rpcFactory; @@ -97,10 +97,7 @@ public function sendCommand(string $command, $message, bool $needReply = false): private function doSend(Message $message): void { if (false === is_string($message->getBody())) { - throw new \LogicException(sprintf( - 'The message body must be string at this stage, got "%s". Make sure you passed string as message or there is an extension that converts custom input to string.', - is_object($message->getBody()) ? get_class($message->getBody()) : gettype($message->getBody()) - )); + throw new \LogicException(sprintf('The message body must be string at this stage, got "%s". Make sure you passed string as message or there is an extension that converts custom input to string.', is_object($message->getBody()) ? get_class($message->getBody()) : gettype($message->getBody()))); } if ($message->getProperty(Config::PROCESSOR)) { diff --git a/pkg/enqueue/Client/Resources.php b/pkg/enqueue/Client/Resources.php index 6ea5988a1..a5cc6847c 100644 --- a/pkg/enqueue/Client/Resources.php +++ b/pkg/enqueue/Client/Resources.php @@ -26,7 +26,7 @@ final class Resources * * @var array */ - private static $knownDrivers = null; + private static $knownDrivers; private function __construct() { diff --git a/pkg/enqueue/Client/Route.php b/pkg/enqueue/Client/Route.php index 5c98fa6b8..8b9e31e36 100644 --- a/pkg/enqueue/Client/Route.php +++ b/pkg/enqueue/Client/Route.php @@ -4,9 +4,9 @@ final class Route { - const TOPIC = 'enqueue.client.topic_route'; + public const TOPIC = 'enqueue.client.topic_route'; - const COMMAND = 'enqueue.client.command_route'; + public const COMMAND = 'enqueue.client.command_route'; /** * @var string @@ -32,7 +32,7 @@ public function __construct( string $source, string $sourceType, string $processor, - array $options = [] + array $options = [], ) { $this->source = $source; $this->sourceType = $sourceType; diff --git a/pkg/enqueue/Client/TraceableProducer.php b/pkg/enqueue/Client/TraceableProducer.php index 59b0c7b01..b0bd613c3 100644 --- a/pkg/enqueue/Client/TraceableProducer.php +++ b/pkg/enqueue/Client/TraceableProducer.php @@ -71,7 +71,7 @@ public function clearTraces(): void $this->traces = []; } - private function collectTrace(string $topic = null, string $command = null, $message): void + private function collectTrace(?string $topic, ?string $command, $message): void { $trace = [ 'topic' => $topic, diff --git a/pkg/enqueue/ConnectionFactoryFactory.php b/pkg/enqueue/ConnectionFactoryFactory.php index d89c671e7..d23518c1b 100644 --- a/pkg/enqueue/ConnectionFactoryFactory.php +++ b/pkg/enqueue/ConnectionFactoryFactory.php @@ -29,18 +29,10 @@ public function create($config): ConnectionFactory $knownConnections = Resources::getKnownConnections(); if ($factoryClass = $this->findFactoryClass($dsn, $knownConnections)) { - throw new \LogicException(sprintf( - 'To use given scheme "%s" a package has to be installed. Run "composer req %s" to add it.', - $dsn->getScheme(), - $knownConnections[$factoryClass]['package'] - )); + throw new \LogicException(sprintf('To use given scheme "%s" a package has to be installed. Run "composer req %s" to add it.', $dsn->getScheme(), $knownConnections[$factoryClass]['package'])); } - throw new \LogicException(sprintf( - 'A given scheme "%s" is not supported. Maybe it is a custom connection, make sure you registered it with "%s::addConnection".', - $dsn->getScheme(), - Resources::class - )); + throw new \LogicException(sprintf('A given scheme "%s" is not supported. Maybe it is a custom connection, make sure you registered it with "%s::addConnection".', $dsn->getScheme(), Resources::class)); } private function findFactoryClass(Dsn $dsn, array $factories): ?string diff --git a/pkg/enqueue/ConnectionFactoryFactoryInterface.php b/pkg/enqueue/ConnectionFactoryFactoryInterface.php index d55808cdb..f4ca4a6d3 100644 --- a/pkg/enqueue/ConnectionFactoryFactoryInterface.php +++ b/pkg/enqueue/ConnectionFactoryFactoryInterface.php @@ -13,7 +13,6 @@ interface ConnectionFactoryFactoryInterface * The other array options are treated as default values. * Options from DSN overwrite them. * - * * @param string|array $config * * @throws \InvalidArgumentException if invalid config provided diff --git a/pkg/enqueue/Consumption/CallbackProcessor.php b/pkg/enqueue/Consumption/CallbackProcessor.php index 988b76529..d15978fcb 100644 --- a/pkg/enqueue/Consumption/CallbackProcessor.php +++ b/pkg/enqueue/Consumption/CallbackProcessor.php @@ -13,17 +13,11 @@ class CallbackProcessor implements Processor */ private $callback; - /** - * @param callable $callback - */ public function __construct(callable $callback) { $this->callback = $callback; } - /** - * {@inheritdoc} - */ public function process(InteropMessage $message, Context $context) { return call_user_func($this->callback, $message, $context); diff --git a/pkg/enqueue/Consumption/ChainExtension.php b/pkg/enqueue/Consumption/ChainExtension.php index e2c11a1f6..83b4eba3a 100644 --- a/pkg/enqueue/Consumption/ChainExtension.php +++ b/pkg/enqueue/Consumption/ChainExtension.php @@ -117,7 +117,7 @@ public function __construct(array $extensions) } if (false == $extensionValid) { - throw new \LogicException(sprintf('Invalid extension given %s', get_class($extension))); + throw new \LogicException(sprintf('Invalid extension given %s', $extension::class)); } }); } diff --git a/pkg/enqueue/Consumption/Context/End.php b/pkg/enqueue/Consumption/Context/End.php index ec8c1f7df..07853b3d3 100644 --- a/pkg/enqueue/Consumption/Context/End.php +++ b/pkg/enqueue/Consumption/Context/End.php @@ -37,7 +37,7 @@ public function __construct( int $startTime, int $endTime, LoggerInterface $logger, - ?int $exitStatus = null + ?int $exitStatus = null, ) { $this->context = $context; $this->logger = $logger; diff --git a/pkg/enqueue/Consumption/Context/MessageReceived.php b/pkg/enqueue/Consumption/Context/MessageReceived.php index ad6b6b969..35abf1ca8 100644 --- a/pkg/enqueue/Consumption/Context/MessageReceived.php +++ b/pkg/enqueue/Consumption/Context/MessageReceived.php @@ -52,7 +52,7 @@ public function __construct( Message $message, Processor $processor, int $receivedAt, - LoggerInterface $logger + LoggerInterface $logger, ) { $this->context = $context; $this->consumer = $consumer; diff --git a/pkg/enqueue/Consumption/Context/PostMessageReceived.php b/pkg/enqueue/Consumption/Context/PostMessageReceived.php index 91b532656..23df2c849 100644 --- a/pkg/enqueue/Consumption/Context/PostMessageReceived.php +++ b/pkg/enqueue/Consumption/Context/PostMessageReceived.php @@ -56,7 +56,7 @@ public function __construct( Message $message, $result, int $receivedAt, - LoggerInterface $logger + LoggerInterface $logger, ) { $this->context = $context; $this->consumer = $consumer; diff --git a/pkg/enqueue/Consumption/Exception/InvalidArgumentException.php b/pkg/enqueue/Consumption/Exception/InvalidArgumentException.php index da6015d27..76ea83ad7 100644 --- a/pkg/enqueue/Consumption/Exception/InvalidArgumentException.php +++ b/pkg/enqueue/Consumption/Exception/InvalidArgumentException.php @@ -5,7 +5,6 @@ class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface { /** - * @param mixed $argument * @param string $class * * @throws static @@ -13,11 +12,7 @@ class InvalidArgumentException extends \InvalidArgumentException implements Exce public static function assertInstanceOf($argument, $class) { if (false == $argument instanceof $class) { - throw new static(sprintf( - 'The argument must be an instance of %s but got %s.', - $class, - is_object($argument) ? get_class($argument) : gettype($argument) - )); + throw new static(sprintf('The argument must be an instance of %s but got %s.', $class, is_object($argument) ? $argument::class : gettype($argument))); } } } diff --git a/pkg/enqueue/Consumption/Extension/LimitConsumedMessagesExtension.php b/pkg/enqueue/Consumption/Extension/LimitConsumedMessagesExtension.php index e89957a72..0dc6feceb 100644 --- a/pkg/enqueue/Consumption/Extension/LimitConsumedMessagesExtension.php +++ b/pkg/enqueue/Consumption/Extension/LimitConsumedMessagesExtension.php @@ -20,9 +20,6 @@ class LimitConsumedMessagesExtension implements PreConsumeExtensionInterface, Po */ protected $messageConsumed; - /** - * @param int $messageLimit - */ public function __construct(int $messageLimit) { $this->messageLimit = $messageLimit; diff --git a/pkg/enqueue/Consumption/Extension/LimitConsumerMemoryExtension.php b/pkg/enqueue/Consumption/Extension/LimitConsumerMemoryExtension.php index 13d4a2898..7edbf232c 100644 --- a/pkg/enqueue/Consumption/Extension/LimitConsumerMemoryExtension.php +++ b/pkg/enqueue/Consumption/Extension/LimitConsumerMemoryExtension.php @@ -23,10 +23,7 @@ class LimitConsumerMemoryExtension implements PreConsumeExtensionInterface, Post public function __construct($memoryLimit) { if (false == is_int($memoryLimit)) { - throw new \InvalidArgumentException(sprintf( - 'Expected memory limit is int but got: "%s"', - is_object($memoryLimit) ? get_class($memoryLimit) : gettype($memoryLimit) - )); + throw new \InvalidArgumentException(sprintf('Expected memory limit is int but got: "%s"', is_object($memoryLimit) ? $memoryLimit::class : gettype($memoryLimit))); } $this->memoryLimit = $memoryLimit * 1024 * 1024; diff --git a/pkg/enqueue/Consumption/Extension/LimitConsumptionTimeExtension.php b/pkg/enqueue/Consumption/Extension/LimitConsumptionTimeExtension.php index f0a577930..1953aa2e6 100644 --- a/pkg/enqueue/Consumption/Extension/LimitConsumptionTimeExtension.php +++ b/pkg/enqueue/Consumption/Extension/LimitConsumptionTimeExtension.php @@ -17,9 +17,6 @@ class LimitConsumptionTimeExtension implements PreConsumeExtensionInterface, Pos */ protected $timeLimit; - /** - * @param \DateTime $timeLimit - */ public function __construct(\DateTime $timeLimit) { $this->timeLimit = $timeLimit; @@ -53,8 +50,8 @@ protected function shouldBeStopped(LoggerInterface $logger): bool $logger->debug(sprintf( '[LimitConsumptionTimeExtension] Execution interrupted as limit time has passed.'. ' now: "%s", time-limit: "%s"', - $now->format(DATE_ISO8601), - $this->timeLimit->format(DATE_ISO8601) + $now->format(\DATE_ISO8601), + $this->timeLimit->format(\DATE_ISO8601) )); return true; diff --git a/pkg/enqueue/Consumption/Extension/LoggerExtension.php b/pkg/enqueue/Consumption/Extension/LoggerExtension.php index 0de2739c1..90e92be8a 100644 --- a/pkg/enqueue/Consumption/Extension/LoggerExtension.php +++ b/pkg/enqueue/Consumption/Extension/LoggerExtension.php @@ -13,9 +13,6 @@ class LoggerExtension implements InitLoggerExtensionInterface */ private $logger; - /** - * @param LoggerInterface $logger - */ public function __construct(LoggerInterface $logger) { $this->logger = $logger; @@ -28,7 +25,7 @@ public function onInitLogger(InitLogger $context): void if ($previousLogger !== $this->logger) { $context->changeLogger($this->logger); - $this->logger->debug(sprintf('Change logger from "%s" to "%s"', get_class($previousLogger), get_class($this->logger))); + $this->logger->debug(sprintf('Change logger from "%s" to "%s"', $previousLogger::class, get_class($this->logger))); } } } diff --git a/pkg/enqueue/Consumption/Extension/NicenessExtension.php b/pkg/enqueue/Consumption/Extension/NicenessExtension.php index 983e04b0e..436a8ec0f 100644 --- a/pkg/enqueue/Consumption/Extension/NicenessExtension.php +++ b/pkg/enqueue/Consumption/Extension/NicenessExtension.php @@ -20,10 +20,7 @@ class NicenessExtension implements StartExtensionInterface public function __construct($niceness) { if (false === is_int($niceness)) { - throw new \InvalidArgumentException(sprintf( - 'Expected niceness value is int but got: "%s"', - is_object($niceness) ? get_class($niceness) : gettype($niceness) - )); + throw new \InvalidArgumentException(sprintf('Expected niceness value is int but got: "%s"', is_object($niceness) ? $niceness::class : gettype($niceness))); } $this->niceness = $niceness; @@ -34,10 +31,7 @@ public function onStart(Start $context): void if (0 !== $this->niceness) { $changed = @proc_nice($this->niceness); if (!$changed) { - throw new \InvalidArgumentException(sprintf( - 'Cannot change process niceness, got warning: "%s"', - error_get_last()['message'] - )); + throw new \InvalidArgumentException(sprintf('Cannot change process niceness, got warning: "%s"', error_get_last()['message'])); } } } diff --git a/pkg/enqueue/Consumption/Extension/SignalExtension.php b/pkg/enqueue/Consumption/Extension/SignalExtension.php index 67354b99d..8ea5307d5 100644 --- a/pkg/enqueue/Consumption/Extension/SignalExtension.php +++ b/pkg/enqueue/Consumption/Extension/SignalExtension.php @@ -33,9 +33,9 @@ public function onStart(Start $context): void pcntl_async_signals(true); - pcntl_signal(SIGTERM, [$this, 'handleSignal']); - pcntl_signal(SIGQUIT, [$this, 'handleSignal']); - pcntl_signal(SIGINT, [$this, 'handleSignal']); + pcntl_signal(\SIGTERM, [$this, 'handleSignal']); + pcntl_signal(\SIGQUIT, [$this, 'handleSignal']); + pcntl_signal(\SIGINT, [$this, 'handleSignal']); $this->logger = $context->getLogger(); $this->interruptConsumption = false; @@ -71,9 +71,9 @@ public function handleSignal(int $signal): void } switch ($signal) { - case SIGTERM: // 15 : supervisor default stop - case SIGQUIT: // 3 : kill -s QUIT - case SIGINT: // 2 : ctrl+c + case \SIGTERM: // 15 : supervisor default stop + case \SIGQUIT: // 3 : kill -s QUIT + case \SIGINT: // 2 : ctrl+c if ($this->logger) { $this->logger->debug('[SignalExtension] Interrupt consumption'); } diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 80936bf58..f43f5c41b 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -63,10 +63,10 @@ final class QueueConsumer implements QueueConsumerInterface */ public function __construct( InteropContext $interopContext, - ExtensionInterface $extension = null, + ?ExtensionInterface $extension = null, array $boundProcessors = [], - LoggerInterface $logger = null, - int $receiveTimeout = 10000 + ?LoggerInterface $logger = null, + int $receiveTimeout = 10000, ) { $this->interopContext = $interopContext; $this->receiveTimeout = $receiveTimeout; @@ -122,7 +122,7 @@ public function bindCallback($queue, callable $processor): QueueConsumerInterfac return $this->bind($queue, new CallbackProcessor($processor)); } - public function consume(ExtensionInterface $runtimeExtension = null): void + public function consume(?ExtensionInterface $runtimeExtension = null): void { $extension = $runtimeExtension ? new ChainExtension([$this->staticExtension, $runtimeExtension]) : @@ -195,7 +195,7 @@ public function consume(ExtensionInterface $runtimeExtension = null): void if (null === $result) { try { $result = $processor->process($message, $this->interopContext); - } catch (\Exception | \Throwable $e) { + } catch (\Exception|\Throwable $e) { $result = $this->onProcessorException($extension, $consumer, $message, $e, $receivedAt); } } @@ -278,15 +278,13 @@ public function consume(ExtensionInterface $runtimeExtension = null): void /** * @internal - * - * @param SubscriptionConsumer $fallbackSubscriptionConsumer */ public function setFallbackSubscriptionConsumer(SubscriptionConsumer $fallbackSubscriptionConsumer): void { $this->fallbackSubscriptionConsumer = $fallbackSubscriptionConsumer; } - private function onEnd(ExtensionInterface $extension, int $startTime, ?int $exitStatus = null, SubscriptionConsumer $subscriptionConsumer = null): void + private function onEnd(ExtensionInterface $extension, int $startTime, ?int $exitStatus = null, ?SubscriptionConsumer $subscriptionConsumer = null): void { $endTime = (int) (microtime(true) * 1000); diff --git a/pkg/enqueue/Consumption/QueueConsumerInterface.php b/pkg/enqueue/Consumption/QueueConsumerInterface.php index 430aa8786..ee2565252 100644 --- a/pkg/enqueue/Consumption/QueueConsumerInterface.php +++ b/pkg/enqueue/Consumption/QueueConsumerInterface.php @@ -34,9 +34,7 @@ public function bindCallback($queueName, callable $processor): self; * Runtime extension - is an extension or a collection of extensions which could be set on runtime. * Here's a good example: @see LimitsExtensionsCommandTrait. * - * @param ExtensionInterface|null $runtimeExtension - * * @throws \Exception */ - public function consume(ExtensionInterface $runtimeExtension = null): void; + public function consume(?ExtensionInterface $runtimeExtension = null): void; } diff --git a/pkg/enqueue/Consumption/Result.php b/pkg/enqueue/Consumption/Result.php index c5659bc92..efa929c7d 100644 --- a/pkg/enqueue/Consumption/Result.php +++ b/pkg/enqueue/Consumption/Result.php @@ -10,19 +10,19 @@ class Result /** * @see Processor::ACK for more details */ - const ACK = Processor::ACK; + public const ACK = Processor::ACK; /** * @see Processor::REJECT for more details */ - const REJECT = Processor::REJECT; + public const REJECT = Processor::REJECT; /** * @see Processor::REQUEUE for more details */ - const REQUEUE = Processor::REQUEUE; + public const REQUEUE = Processor::REQUEUE; - const ALREADY_ACKNOWLEDGED = 'enqueue.already_acknowledged'; + public const ALREADY_ACKNOWLEDGED = 'enqueue.already_acknowledged'; /** * @var string @@ -39,10 +39,6 @@ class Result */ private $reply; - /** - * @param mixed $status - * @param mixed $reason - */ public function __construct($status, $reason = '') { $this->status = (string) $status; @@ -81,10 +77,7 @@ public function getReply() return $this->reply; } - /** - * @param InteropMessage|null $reply - */ - public function setReply(InteropMessage $reply = null) + public function setReply(?InteropMessage $reply = null) { $this->reply = $reply; } @@ -120,9 +113,8 @@ public static function requeue($reason = '') } /** - * @param InteropMessage $replyMessage - * @param string $status - * @param string|null $reason + * @param string $status + * @param string|null $reason * * @return static */ diff --git a/pkg/enqueue/Resources.php b/pkg/enqueue/Resources.php index 713450fed..4c500006f 100644 --- a/pkg/enqueue/Resources.php +++ b/pkg/enqueue/Resources.php @@ -31,7 +31,7 @@ final class Resources * * @var array */ - private static $knownConnections = null; + private static $knownConnections; private function __construct() { diff --git a/pkg/enqueue/Router/Recipient.php b/pkg/enqueue/Router/Recipient.php index c7eac6af6..d2f668f42 100644 --- a/pkg/enqueue/Router/Recipient.php +++ b/pkg/enqueue/Router/Recipient.php @@ -17,10 +17,6 @@ class Recipient */ private $message; - /** - * @param Destination $destination - * @param InteropMessage $message - */ public function __construct(Destination $destination, InteropMessage $message) { $this->destination = $destination; diff --git a/pkg/enqueue/Router/RecipientListRouterInterface.php b/pkg/enqueue/Router/RecipientListRouterInterface.php index d00dd2abb..6bb950fdc 100644 --- a/pkg/enqueue/Router/RecipientListRouterInterface.php +++ b/pkg/enqueue/Router/RecipientListRouterInterface.php @@ -7,8 +7,6 @@ interface RecipientListRouterInterface { /** - * @param InteropMessage $message - * * @return \Traversable|Recipient[] */ public function route(InteropMessage $message); diff --git a/pkg/enqueue/Router/RouteRecipientListProcessor.php b/pkg/enqueue/Router/RouteRecipientListProcessor.php index 22e32e2ca..22488e33f 100644 --- a/pkg/enqueue/Router/RouteRecipientListProcessor.php +++ b/pkg/enqueue/Router/RouteRecipientListProcessor.php @@ -13,17 +13,11 @@ class RouteRecipientListProcessor implements Processor */ private $router; - /** - * @param RecipientListRouterInterface $router - */ public function __construct(RecipientListRouterInterface $router) { $this->router = $router; } - /** - * {@inheritdoc} - */ public function process(InteropMessage $message, Context $context) { $producer = $context->createProducer(); diff --git a/pkg/enqueue/Rpc/Promise.php b/pkg/enqueue/Rpc/Promise.php index 0a5d28f0c..01b47e1f6 100644 --- a/pkg/enqueue/Rpc/Promise.php +++ b/pkg/enqueue/Rpc/Promise.php @@ -31,11 +31,6 @@ class Promise */ private $message; - /** - * @param \Closure $receiveCallback - * @param \Closure $receiveNoWaitCallback - * @param \Closure $finallyCallback - */ public function __construct(\Closure $receiveCallback, \Closure $receiveNoWaitCallback, \Closure $finallyCallback) { $this->receiveCallback = $receiveCallback; @@ -106,8 +101,7 @@ public function isDeleteReplyQueue() } /** - * @param \Closure $cb - * @param array $args + * @param array $args * * @return InteropMessage */ @@ -116,8 +110,7 @@ private function doReceive(\Closure $cb, ...$args) $message = call_user_func_array($cb, $args); if (null !== $message && false == $message instanceof InteropMessage) { - throw new \RuntimeException(sprintf( - 'Expected "%s" but got: "%s"', InteropMessage::class, is_object($message) ? get_class($message) : gettype($message))); + throw new \RuntimeException(sprintf('Expected "%s" but got: "%s"', InteropMessage::class, is_object($message) ? $message::class : gettype($message))); } return $message; diff --git a/pkg/enqueue/Rpc/RpcClient.php b/pkg/enqueue/Rpc/RpcClient.php index 591a4cc19..bd3d7cedb 100644 --- a/pkg/enqueue/Rpc/RpcClient.php +++ b/pkg/enqueue/Rpc/RpcClient.php @@ -19,20 +19,14 @@ class RpcClient */ private $rpcFactory; - /** - * @param Context $context - * @param RpcFactory $promiseFactory - */ - public function __construct(Context $context, RpcFactory $promiseFactory = null) + public function __construct(Context $context, ?RpcFactory $promiseFactory = null) { $this->context = $context; $this->rpcFactory = $promiseFactory ?: new RpcFactory($context); } /** - * @param Destination $destination - * @param InteropMessage $message - * @param int $timeout + * @param int $timeout * * @throws TimeoutException if the wait timeout is reached * @@ -44,9 +38,7 @@ public function call(Destination $destination, InteropMessage $message, $timeout } /** - * @param Destination $destination - * @param InteropMessage $message - * @param int $timeout + * @param int $timeout * * @return Promise */ diff --git a/pkg/enqueue/Rpc/RpcFactory.php b/pkg/enqueue/Rpc/RpcFactory.php index bd054b186..9100babd3 100644 --- a/pkg/enqueue/Rpc/RpcFactory.php +++ b/pkg/enqueue/Rpc/RpcFactory.php @@ -11,9 +11,6 @@ class RpcFactory */ private $context; - /** - * @param Context $context - */ public function __construct(Context $context) { $this->context = $context; diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPass.php index c541f4179..577f15902 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/AnalyzeRouteCollectionPass.php @@ -38,11 +38,7 @@ private function exclusiveCommandsCouldNotBeRunOnDefaultQueue(RouteCollection $c { foreach ($collection->all() as $route) { if ($route->isCommand() && $route->isProcessorExclusive() && false == $route->getQueue()) { - throw new \LogicException(sprintf( - 'The command "%s" processor "%s" is exclusive but queue is not specified. Exclusive processors could not be run on a default queue.', - $route->getSource(), - $route->getProcessor() - )); + throw new \LogicException(sprintf('The command "%s" processor "%s" is exclusive but queue is not specified. Exclusive processors could not be run on a default queue.', $route->getSource(), $route->getProcessor())); } } } @@ -61,25 +57,13 @@ private function exclusiveCommandProcessorMustBeSingleOnGivenQueue(RouteCollecti if ($route->isPrefixQueue()) { if (array_key_exists($route->getQueue(), $prefixedQueues)) { - throw new \LogicException(sprintf( - 'The command "%s" processor "%s" is exclusive. The queue "%s" already has another exclusive command processor "%s" bound to it.', - $route->getSource(), - $route->getProcessor(), - $route->getQueue(), - $prefixedQueues[$route->getQueue()] - )); + throw new \LogicException(sprintf('The command "%s" processor "%s" is exclusive. The queue "%s" already has another exclusive command processor "%s" bound to it.', $route->getSource(), $route->getProcessor(), $route->getQueue(), $prefixedQueues[$route->getQueue()])); } $prefixedQueues[$route->getQueue()] = $route->getProcessor(); } else { if (array_key_exists($route->getQueue(), $queues)) { - throw new \LogicException(sprintf( - 'The command "%s" processor "%s" is exclusive. The queue "%s" already has another exclusive command processor "%s" bound to it.', - $route->getSource(), - $route->getProcessor(), - $route->getQueue(), - $queues[$route->getQueue()] - )); + throw new \LogicException(sprintf('The command "%s" processor "%s" is exclusive. The queue "%s" already has another exclusive command processor "%s" bound to it.', $route->getSource(), $route->getProcessor(), $route->getQueue(), $queues[$route->getQueue()])); } $queues[$route->getQueue()] = $route->getProcessor(); @@ -102,7 +86,7 @@ private function customQueueNamesUnique(RouteCollection $collection): void $notPrefixedQueues = []; foreach ($collection->all() as $route) { - //default queue + // default queue $queueName = $route->getQueue(); if (false == $queueName) { return; diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildClientExtensionsPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildClientExtensionsPass.php index 5ad45fd90..92124f243 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildClientExtensionsPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildClientExtensionsPass.php @@ -46,7 +46,7 @@ public function process(ContainerBuilder $container): void } } - krsort($groupByPriority, SORT_NUMERIC); + krsort($groupByPriority, \SORT_NUMERIC); $flatExtensions = []; foreach ($groupByPriority as $extension) { diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php index 5eee3efdb..4adc09e9d 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPass.php @@ -68,7 +68,7 @@ public function process(ContainerBuilder $container): void // 0.8 command subscriber if (isset($commands['processorName'])) { - @trigger_error('The command subscriber 0.8 syntax is deprecated since Enqueue 0.9.', E_USER_DEPRECATED); + @trigger_error('The command subscriber 0.8 syntax is deprecated since Enqueue 0.9.', \E_USER_DEPRECATED); $source = $commands['processorName']; $processor = $params['processorName'] ?? $serviceId; @@ -117,11 +117,7 @@ public function process(ContainerBuilder $container): void $routeCollection->add(new Route($source, Route::COMMAND, $processor, $options)); } else { - throw new \LogicException(sprintf( - 'Command subscriber configuration is invalid for "%s::getSubscribedCommand()". "%s"', - $processorClass, - json_encode($processorClass::getSubscribedCommand()) - )); + throw new \LogicException(sprintf('Command subscriber configuration is invalid for "%s::getSubscribedCommand()". "%s"', $processorClass, json_encode($processorClass::getSubscribedCommand()))); } } } diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPass.php index c1f1ce970..274847c90 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildConsumptionExtensionsPass.php @@ -46,7 +46,7 @@ public function process(ContainerBuilder $container): void } } - krsort($groupByPriority, SORT_NUMERIC); + krsort($groupByPriority, \SORT_NUMERIC); $flatExtensions = []; foreach ($groupByPriority as $extension) { diff --git a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php index 4999921cc..ef01e6fcf 100644 --- a/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php +++ b/pkg/enqueue/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPass.php @@ -72,7 +72,7 @@ public function process(ContainerBuilder $container): void // 0.8 topic subscriber } elseif (is_array($params) && is_string($key)) { - @trigger_error('The topic subscriber 0.8 syntax is deprecated since Enqueue 0.9.', E_USER_DEPRECATED); + @trigger_error('The topic subscriber 0.8 syntax is deprecated since Enqueue 0.9.', \E_USER_DEPRECATED); $source = $key; $processor = $params['processorName'] ?? $serviceId; @@ -109,11 +109,7 @@ public function process(ContainerBuilder $container): void $routeCollection->add(new Route($source, Route::TOPIC, $processor, $options)); } else { - throw new \LogicException(sprintf( - 'Topic subscriber configuration is invalid for "%s::getSubscribedTopics()". Got "%s"', - $processorClass, - json_encode($processorClass::getSubscribedTopics()) - )); + throw new \LogicException(sprintf('Topic subscriber configuration is invalid for "%s::getSubscribedTopics()". Got "%s"', $processorClass, json_encode($processorClass::getSubscribedTopics()))); } } } diff --git a/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php b/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php index 8fa6fb4f6..00543f6de 100644 --- a/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php +++ b/pkg/enqueue/Symfony/Client/FlushSpoolProducerListener.php @@ -24,9 +24,6 @@ public function flushMessages() $this->producer->flush(); } - /** - * {@inheritdoc} - */ public static function getSubscribedEvents(): array { $events = []; diff --git a/pkg/enqueue/Symfony/Client/SetupBrokerExtensionCommandTrait.php b/pkg/enqueue/Symfony/Client/SetupBrokerExtensionCommandTrait.php index 2888f5636..96e0d2d6b 100644 --- a/pkg/enqueue/Symfony/Client/SetupBrokerExtensionCommandTrait.php +++ b/pkg/enqueue/Symfony/Client/SetupBrokerExtensionCommandTrait.php @@ -10,9 +10,6 @@ trait SetupBrokerExtensionCommandTrait { - /** - * {@inheritdoc} - */ protected function configureSetupBrokerExtension() { $this @@ -21,9 +18,6 @@ protected function configureSetupBrokerExtension() } /** - * @param InputInterface $input - * @param DriverInterface $driver - * * @return ExtensionInterface */ protected function getSetupBrokerExtension(InputInterface $input, DriverInterface $driver) diff --git a/pkg/enqueue/Symfony/Consumption/LimitsExtensionsCommandTrait.php b/pkg/enqueue/Symfony/Consumption/LimitsExtensionsCommandTrait.php index d7363db09..d8351acc5 100644 --- a/pkg/enqueue/Symfony/Consumption/LimitsExtensionsCommandTrait.php +++ b/pkg/enqueue/Symfony/Consumption/LimitsExtensionsCommandTrait.php @@ -23,9 +23,6 @@ protected function configureLimitsExtensions() } /** - * @param InputInterface $input - * @param OutputInterface $output - * * @throws \Exception * * @return ExtensionInterface[] diff --git a/pkg/enqueue/Symfony/Consumption/QueueConsumerOptionsCommandTrait.php b/pkg/enqueue/Symfony/Consumption/QueueConsumerOptionsCommandTrait.php index 9df852df9..fd736f226 100644 --- a/pkg/enqueue/Symfony/Consumption/QueueConsumerOptionsCommandTrait.php +++ b/pkg/enqueue/Symfony/Consumption/QueueConsumerOptionsCommandTrait.php @@ -8,9 +8,6 @@ trait QueueConsumerOptionsCommandTrait { - /** - * {@inheritdoc} - */ protected function configureQueueConsumerOptions() { $this @@ -18,10 +15,6 @@ protected function configureQueueConsumerOptions() ; } - /** - * @param QueueConsumerInterface $consumer - * @param InputInterface $input - */ protected function setQueueConsumerOptions(QueueConsumerInterface $consumer, InputInterface $input) { if (null !== $receiveTimeout = $input->getOption('receive-timeout')) { diff --git a/pkg/enqueue/Symfony/DependencyInjection/BuildConsumptionExtensionsPass.php b/pkg/enqueue/Symfony/DependencyInjection/BuildConsumptionExtensionsPass.php index 352682b19..99f274ec5 100644 --- a/pkg/enqueue/Symfony/DependencyInjection/BuildConsumptionExtensionsPass.php +++ b/pkg/enqueue/Symfony/DependencyInjection/BuildConsumptionExtensionsPass.php @@ -43,7 +43,7 @@ public function process(ContainerBuilder $container): void } } - krsort($groupByPriority, SORT_NUMERIC); + krsort($groupByPriority, \SORT_NUMERIC); $flatExtensions = []; foreach ($groupByPriority as $extension) { diff --git a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php index 56b855f0c..a660126ad 100644 --- a/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php +++ b/pkg/enqueue/Tests/Client/ConsumptionExtension/DelayRedeliveredMessageExtensionTest.php @@ -23,7 +23,6 @@ class DelayRedeliveredMessageExtensionTest extends TestCase { - public function testShouldSendDelayedMessageAndRejectOriginalMessage() { $queue = new NullQueue('queue'); diff --git a/pkg/enqueue/Tests/Client/DriverFactoryTest.php b/pkg/enqueue/Tests/Client/DriverFactoryTest.php index ef504e0e0..3d9d7b9b5 100644 --- a/pkg/enqueue/Tests/Client/DriverFactoryTest.php +++ b/pkg/enqueue/Tests/Client/DriverFactoryTest.php @@ -105,7 +105,7 @@ public function testReturnsExpectedFactories( string $connectionFactoryClass, string $contextClass, array $conifg, - string $expectedDriverClass + string $expectedDriverClass, ) { $connectionFactoryMock = $this->createMock($connectionFactoryClass); $connectionFactoryMock @@ -134,7 +134,7 @@ public static function provideDSN() yield ['file:', FsConnectionFactory::class, FsContext::class, [], FsDriver::class]; // https://github.com/php-enqueue/enqueue-dev/issues/511 -// yield ['gearman:', GearmanConnectionFactory::class, NullContext::class, [], NullDriver::class]; + // yield ['gearman:', GearmanConnectionFactory::class, NullContext::class, [], NullDriver::class]; yield ['gps:', GpsConnectionFactory::class, GpsContext::class, [], GpsDriver::class]; diff --git a/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php b/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php index d1c260388..c3032ccc8 100644 --- a/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php +++ b/pkg/enqueue/Tests/Client/Extension/PrepareBodyExtensionTest.php @@ -25,14 +25,13 @@ public function testShouldImplementExtensionInterface() /** * @dataProvider provideMessages * - * @param mixed $body * @param mixed|null $contentType */ public function testShouldSendStringUnchangedAndAddPlainTextContentTypeIfEmpty( $body, $contentType, string $expectedBody, - string $expectedContentType + string $expectedContentType, ) { $message = new Message($body); $message->setContentType($contentType); diff --git a/pkg/enqueue/Tests/Client/PreSendTest.php b/pkg/enqueue/Tests/Client/PreSendTest.php index ae9400338..01a7e5055 100644 --- a/pkg/enqueue/Tests/Client/PreSendTest.php +++ b/pkg/enqueue/Tests/Client/PreSendTest.php @@ -51,7 +51,7 @@ public function testCouldChangeTopic() $this->createDriverMock() ); - //guard + // guard $this->assertSame('aCommandOrTopic', $context->getTopic()); $context->changeTopic('theChangedTopic'); @@ -68,7 +68,7 @@ public function testCouldChangeCommand() $this->createDriverMock() ); - //guard + // guard $this->assertSame('aCommandOrTopic', $context->getCommand()); $context->changeCommand('theChangedCommand'); @@ -85,7 +85,7 @@ public function testCouldChangeBody() $this->createDriverMock() ); - //guard + // guard $this->assertSame('aBody', $context->getMessage()->getBody()); $this->assertNull($context->getMessage()->getContentType()); diff --git a/pkg/enqueue/Tests/Client/ProducerTest.php b/pkg/enqueue/Tests/Client/ProducerTest.php index 9d4e2a304..23b004ac3 100644 --- a/pkg/enqueue/Tests/Client/ProducerTest.php +++ b/pkg/enqueue/Tests/Client/ProducerTest.php @@ -3,7 +3,6 @@ namespace Enqueue\Tests\Client; use Enqueue\Client\DriverInterface; -use Enqueue\Client\ExtensionInterface; use Enqueue\Client\Producer; use Enqueue\Client\ProducerInterface; use Enqueue\Rpc\RpcFactory; diff --git a/pkg/enqueue/Tests/Client/RouterProcessorTest.php b/pkg/enqueue/Tests/Client/RouterProcessorTest.php index e2611d09c..7d2971189 100644 --- a/pkg/enqueue/Tests/Client/RouterProcessorTest.php +++ b/pkg/enqueue/Tests/Client/RouterProcessorTest.php @@ -188,7 +188,7 @@ public function testShouldDoNotModifyOriginalMessage() $result = $processor->process($message, new NullContext()); - //guard + // guard $this->assertEquals(Result::ACK, $result->getStatus()); $this->assertSame('theBody', $message->getBody()); diff --git a/pkg/enqueue/Tests/Client/TraceableProducerTest.php b/pkg/enqueue/Tests/Client/TraceableProducerTest.php index ff042857c..b0df066ce 100644 --- a/pkg/enqueue/Tests/Client/TraceableProducerTest.php +++ b/pkg/enqueue/Tests/Client/TraceableProducerTest.php @@ -272,8 +272,8 @@ public function testShouldAllowGetInfoSentToSameTopic() $producer->sendEvent('aFooTopic', 'aFooBody'); Assert::assertArraySubset([ - ['topic' => 'aFooTopic', 'body' => 'aFooBody'], - ['topic' => 'aFooTopic', 'body' => 'aFooBody'], + ['topic' => 'aFooTopic', 'body' => 'aFooBody'], + ['topic' => 'aFooTopic', 'body' => 'aFooBody'], ], $producer->getTraces()); } @@ -354,7 +354,7 @@ public function testShouldAllowClearStoredTraces() $producer->sendEvent('aFooTopic', 'aFooBody'); - //guard + // guard $this->assertNotEmpty($producer->getTraces()); $producer->clearTraces(); diff --git a/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php b/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php index fe2de69a0..b6b5b4d67 100644 --- a/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php +++ b/pkg/enqueue/Tests/ConnectionFactoryFactoryTest.php @@ -158,7 +158,7 @@ public static function provideDSN() yield ['file:', FsConnectionFactory::class]; // https://github.com/php-enqueue/enqueue-dev/issues/511 -// yield ['gearman:', GearmanConnectionFactory::class]; + // yield ['gearman:', GearmanConnectionFactory::class]; yield ['gps:', GpsConnectionFactory::class]; diff --git a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php index 15482997d..25ac85895 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LimitConsumerMemoryExtensionTest.php @@ -124,7 +124,7 @@ public function testOnPreConsumeShouldNotInterruptExecutionIfMemoryLimitIsNotRea $this->assertFalse($context->isExecutionInterrupted()); // test - $extension = new LimitConsumerMemoryExtension(PHP_INT_MAX); + $extension = new LimitConsumerMemoryExtension(\PHP_INT_MAX); $extension->onPreConsume($context); $this->assertFalse($context->isExecutionInterrupted()); @@ -145,7 +145,7 @@ public function testOnPostConsumeShouldNotInterruptExecutionIfMemoryLimitIsNotRe $this->assertFalse($postConsume->isExecutionInterrupted()); // test - $extension = new LimitConsumerMemoryExtension(PHP_INT_MAX); + $extension = new LimitConsumerMemoryExtension(\PHP_INT_MAX); $extension->onPostConsume($postConsume); $this->assertFalse($postConsume->isExecutionInterrupted()); @@ -166,7 +166,7 @@ public function testOnPostMessageReceivedShouldNotInterruptExecutionIfMemoryLimi $this->assertFalse($postReceivedMessage->isExecutionInterrupted()); // test - $extension = new LimitConsumerMemoryExtension(PHP_INT_MAX); + $extension = new LimitConsumerMemoryExtension(\PHP_INT_MAX); $extension->onPostMessageReceived($postReceivedMessage); $this->assertFalse($postReceivedMessage->isExecutionInterrupted()); diff --git a/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php b/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php index 455468ed2..666892e0e 100644 --- a/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php +++ b/pkg/enqueue/Tests/Consumption/Extension/LoggerExtensionTest.php @@ -42,7 +42,7 @@ public function testShouldAddInfoMessageOnStart() $logger ->expects($this->once()) ->method('debug') - ->with(sprintf('Change logger from "%s" to "%s"', get_class($logger), get_class($previousLogger))) + ->with(sprintf('Change logger from "%s" to "%s"', $logger::class, $previousLogger::class)) ; $extension = new LoggerExtension($logger); diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 06edab31b..2bcc253e7 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -1455,7 +1455,7 @@ private function createContextWithoutSubscriptionConsumerMock(): InteropContext /** * @return \PHPUnit\Framework\MockObject\MockObject|InteropContext */ - private function createContextStub(Consumer $consumer = null): InteropContext + private function createContextStub(?Consumer $consumer = null): InteropContext { $context = $this->createContextWithoutSubscriptionConsumerMock(); $context diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php index 1a5f65a4f..14a48be93 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php @@ -154,7 +154,7 @@ public function testShouldRegisterProcessorIfCommandsIsString() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.command_subscriber') ; @@ -188,7 +188,7 @@ public function testThrowIfCommandSubscriberReturnsNothing() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.command_subscriber') ; @@ -210,7 +210,7 @@ public function testShouldRegisterProcessorIfCommandsAreStrings() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.command_subscriber') ; @@ -254,7 +254,7 @@ public function testShouldRegisterProcessorIfParamSingleCommandArray() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.command_subscriber') ; @@ -293,7 +293,7 @@ public function testShouldRegisterProcessorIfCommandsAreParamArrays() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.command_subscriber') ; @@ -335,7 +335,7 @@ public function testThrowIfCommandSubscriberParamsInvalid() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.command_subscriber') ; @@ -360,7 +360,7 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.command_subscriber') ; @@ -410,7 +410,7 @@ public function testShouldRegister08CommandProcessor() $container->setParameter('enqueue.clients', ['default']); $container->setParameter('enqueue.default_client', 'default'); $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.command_subscriber') ; @@ -438,7 +438,7 @@ public function testShouldRegister08CommandProcessor() private function createCommandSubscriberProcessor($commandSubscriberReturns = ['aCommand']) { - $processor = new class() implements Processor, CommandSubscriberInterface { + $processor = new class implements Processor, CommandSubscriberInterface { public static $return; public function process(InteropMessage $message, Context $context) diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php index b642b9001..b9d798c11 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php @@ -154,7 +154,7 @@ public function testShouldRegisterProcessorIfTopicsIsString() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.topic_subscriber') ; @@ -188,7 +188,7 @@ public function testThrowIfTopicSubscriberReturnsNothing() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.topic_subscriber') ; @@ -210,7 +210,7 @@ public function testShouldRegisterProcessorIfTopicsAreStrings() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.topic_subscriber') ; @@ -253,7 +253,7 @@ public function testShouldRegisterProcessorIfTopicsAreParamArrays() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.topic_subscriber') ; @@ -295,7 +295,7 @@ public function testThrowIfTopicSubscriberParamsInvalid() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.topic_subscriber') ; @@ -320,7 +320,7 @@ public function testShouldMergeExtractedRoutesWithAlreadySetInCollection() $container->setParameter('enqueue.clients', ['foo']); $container->setParameter('enqueue.default_client', 'foo'); $container->setDefinition('enqueue.client.foo.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.topic_subscriber') ; @@ -367,7 +367,7 @@ public function testShouldRegister08TopicSubscriber() $container->setParameter('enqueue.clients', ['default']); $container->setParameter('enqueue.default_client', 'default'); $container->setDefinition('enqueue.client.default.route_collection', $routeCollection); - $container->register('aFooProcessor', get_class($processor)) + $container->register('aFooProcessor', $processor::class) ->addTag('enqueue.topic_subscriber') ; @@ -402,7 +402,7 @@ public function testShouldRegister08TopicSubscriber() private function createTopicSubscriberProcessor($topicSubscriberReturns = ['aTopic']) { - $processor = new class() implements Processor, TopicSubscriberInterface { + $processor = new class implements Processor, TopicSubscriberInterface { public static $return; public function process(InteropMessage $message, Context $context) diff --git a/pkg/enqueue/Tests/Symfony/Consumption/LimitsExtensionsCommandTraitTest.php b/pkg/enqueue/Tests/Symfony/Consumption/LimitsExtensionsCommandTraitTest.php index e92912355..f47a32161 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/LimitsExtensionsCommandTraitTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/LimitsExtensionsCommandTraitTest.php @@ -109,8 +109,6 @@ public function testShouldAddThreeLimitExtensions() } /** - * @param mixed $inputValue - * @param bool $enabled * @dataProvider provideNicenessValues */ public function testShouldAddNicenessExtension($inputValue, bool $enabled) diff --git a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php index c5ff1c818..909407452 100644 --- a/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php @@ -148,7 +148,7 @@ public function testThrowIfFactoryClassAndFactoryServiceSetAtTheSameTime() 'dsn' => 'foo:', 'factory_class' => 'aFactoryClass', 'factory_service' => 'aFactoryService', - ], ]]); + ], ]]); } public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTime() @@ -166,7 +166,7 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryClassAtTheSameTi 'dsn' => 'foo:', 'connection_factory_class' => 'aFactoryClass', 'factory_service' => 'aFactoryService', - ], ]]); + ], ]]); } public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSameTime() @@ -183,7 +183,7 @@ public function testThrowIfConnectionFactoryClassUsedWithFactoryServiceAtTheSame 'dsn' => 'foo:', 'connection_factory_class' => 'aFactoryClass', 'factory_service' => 'aFactoryService', - ], ]]); + ], ]]); } public function testShouldAllowSetFactoryClass() @@ -197,7 +197,7 @@ public function testShouldAllowSetFactoryClass() 'transport' => [ 'dsn' => 'foo:', 'factory_class' => 'theFactoryClass', - ], ]]); + ], ]]); $this->assertArrayHasKey('factory_class', $config['transport']); $this->assertSame('theFactoryClass', $config['transport']['factory_class']); @@ -214,7 +214,7 @@ public function testShouldAllowSetFactoryService() 'transport' => [ 'dsn' => 'foo:', 'factory_service' => 'theFactoryService', - ], ]]); + ], ]]); $this->assertArrayHasKey('factory_service', $config['transport']); $this->assertSame('theFactoryService', $config['transport']['factory_service']); @@ -231,7 +231,7 @@ public function testShouldAllowSetConnectionFactoryClass() 'transport' => [ 'dsn' => 'foo:', 'connection_factory_class' => 'theFactoryClass', - ], ]]); + ], ]]); $this->assertArrayHasKey('connection_factory_class', $config['transport']); $this->assertSame('theFactoryClass', $config['transport']['connection_factory_class']); diff --git a/pkg/enqueue/Tests/Util/JSONTest.php b/pkg/enqueue/Tests/Util/JSONTest.php index a6f583387..1a3df4211 100644 --- a/pkg/enqueue/Tests/Util/JSONTest.php +++ b/pkg/enqueue/Tests/Util/JSONTest.php @@ -39,8 +39,6 @@ public function nonStringDataProvider() /** * @dataProvider nonStringDataProvider - * - * @param mixed $value */ public function testShouldThrowExceptionIfInputIsNotString($value) { diff --git a/pkg/enqueue/Tests/Util/VarExportTest.php b/pkg/enqueue/Tests/Util/VarExportTest.php index e8034a1c7..b71e78a65 100644 --- a/pkg/enqueue/Tests/Util/VarExportTest.php +++ b/pkg/enqueue/Tests/Util/VarExportTest.php @@ -9,9 +9,6 @@ class VarExportTest extends TestCase { /** * @dataProvider provideValues - * - * @param mixed $value - * @param mixed $expected */ public function testShouldConvertValueToStringUsingVarExportFunction($value, $expected) { diff --git a/pkg/enqueue/Tests/fix_composer_json.php b/pkg/enqueue/Tests/fix_composer_json.php index dfbec62fb..324f1840b 100644 --- a/pkg/enqueue/Tests/fix_composer_json.php +++ b/pkg/enqueue/Tests/fix_composer_json.php @@ -8,4 +8,4 @@ $composerJson['config']['platform']['ext-rdkafka'] = '3.3'; $composerJson['config']['platform']['ext-gearman'] = '2'; -file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, JSON_PRETTY_PRINT)); +file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, \JSON_PRETTY_PRINT)); diff --git a/pkg/enqueue/Util/JSON.php b/pkg/enqueue/Util/JSON.php index f85738e1d..67411af16 100644 --- a/pkg/enqueue/Util/JSON.php +++ b/pkg/enqueue/Util/JSON.php @@ -14,10 +14,7 @@ class JSON public static function decode($string) { if (!is_string($string)) { - throw new \InvalidArgumentException(sprintf( - 'Accept only string argument but got: "%s"', - is_object($string) ? get_class($string) : gettype($string) - )); + throw new \InvalidArgumentException(sprintf('Accept only string argument but got: "%s"', is_object($string) ? $string::class : gettype($string))); } // PHP7 fix - empty string and null cause syntax error @@ -26,32 +23,22 @@ public static function decode($string) } $decoded = json_decode($string, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $decoded; } /** - * @param mixed $value - * * @return string */ public static function encode($value) { - $encoded = json_encode($value, JSON_UNESCAPED_UNICODE); - - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'Could not encode value into json. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + $encoded = json_encode($value, \JSON_UNESCAPED_UNICODE); + + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('Could not encode value into json. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $encoded; diff --git a/pkg/enqueue/Util/Stringify.php b/pkg/enqueue/Util/Stringify.php index 39b1f1305..12358d785 100644 --- a/pkg/enqueue/Util/Stringify.php +++ b/pkg/enqueue/Util/Stringify.php @@ -7,14 +7,8 @@ */ class Stringify { - /** - * @var mixed - */ private $value; - /** - * @param mixed $value - */ public function __construct($value) { $this->value = $value; @@ -26,7 +20,7 @@ public function __toString(): string return $this->value; } - return json_encode($this->value, JSON_UNESCAPED_SLASHES); + return json_encode($this->value, \JSON_UNESCAPED_SLASHES); } public static function that($value): self diff --git a/pkg/enqueue/Util/VarExport.php b/pkg/enqueue/Util/VarExport.php index 4a48afadd..9a914706d 100644 --- a/pkg/enqueue/Util/VarExport.php +++ b/pkg/enqueue/Util/VarExport.php @@ -7,14 +7,8 @@ */ class VarExport { - /** - * @var mixed - */ private $value; - /** - * @param mixed $value - */ public function __construct($value) { $this->value = $value; diff --git a/pkg/fs/FsConnectionFactory.php b/pkg/fs/FsConnectionFactory.php index ad13e9eb6..9c4ba17e5 100644 --- a/pkg/fs/FsConnectionFactory.php +++ b/pkg/fs/FsConnectionFactory.php @@ -74,11 +74,7 @@ private function parseDsn(string $dsn): array $supportedSchemes = ['file']; if (false == in_array($dsn->getSchemeProtocol(), $supportedSchemes, true)) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be one of "%s"', - $dsn->getSchemeProtocol(), - implode('", "', $supportedSchemes) - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be one of "%s"', $dsn->getSchemeProtocol(), implode('", "', $supportedSchemes))); } return array_filter(array_replace($dsn->getQuery(), [ diff --git a/pkg/fs/FsConsumer.php b/pkg/fs/FsConsumer.php index 46e7b96ba..614461eb2 100644 --- a/pkg/fs/FsConsumer.php +++ b/pkg/fs/FsConsumer.php @@ -112,7 +112,7 @@ public function receiveNoWait(): ?Message while ($count) { $frame = $this->readFrame($file, 1); - //guards + // guards if ($frame && false == ('|' == $frame[0] || ' ' == $frame[0])) { throw new \LogicException(sprintf('The frame could start from either " " or "|". The malformed frame starts with "%s".', $frame[0])); } @@ -188,13 +188,13 @@ private function readFrame($file, int $frameNumber): string $frameSize = 64; $offset = $frameNumber * $frameSize; - fseek($file, -$offset, SEEK_END); + fseek($file, -$offset, \SEEK_END); $frame = fread($file, $frameSize); if ('' == $frame) { return ''; } - if (false !== strpos($frame, '|{')) { + if (str_contains($frame, '|{')) { return $frame; } diff --git a/pkg/fs/FsContext.php b/pkg/fs/FsContext.php index 480074e03..c735e13aa 100644 --- a/pkg/fs/FsContext.php +++ b/pkg/fs/FsContext.php @@ -83,7 +83,7 @@ public function createQueue(string $queueName): Queue public function declareDestination(FsDestination $destination): void { - //InvalidDestinationException::assertDestinationInstanceOf($destination, FsDestination::class); + // InvalidDestinationException::assertDestinationInstanceOf($destination, FsDestination::class); set_error_handler(function ($severity, $message, $file, $line) { throw new \ErrorException($message, 0, $severity, $file, $line); @@ -105,7 +105,7 @@ public function workWithFile(FsDestination $destination, string $mode, callable set_error_handler(function ($severity, $message, $file, $line) { throw new \ErrorException($message, 0, $severity, $file, $line); - }, E_ALL & ~E_USER_DEPRECATED); + }, \E_ALL & ~\E_USER_DEPRECATED); try { $file = fopen((string) $destination->getFileInfo(), $mode); diff --git a/pkg/fs/FsMessage.php b/pkg/fs/FsMessage.php index d66ee52cd..45312e52c 100644 --- a/pkg/fs/FsMessage.php +++ b/pkg/fs/FsMessage.php @@ -96,7 +96,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', (string) $correlationId); } @@ -106,7 +106,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', (string) $messageId); } @@ -123,12 +123,12 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -150,12 +150,8 @@ public function jsonSerialize(): array public static function jsonUnserialize(string $json): self { $data = json_decode($json, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return new self($data['body'], $data['properties'], $data['headers']); diff --git a/pkg/fs/FsProducer.php b/pkg/fs/FsProducer.php index 55ff88cc3..067e54b36 100644 --- a/pkg/fs/FsProducer.php +++ b/pkg/fs/FsProducer.php @@ -53,12 +53,8 @@ public function send(Destination $destination, Message $message): void $rawMessage = str_replace('|{', '\|\{', $rawMessage); $rawMessage = '|'.$rawMessage; - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'Could not encode value into json. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('Could not encode value into json. Error %s and message %s', json_last_error(), json_last_error_msg())); } $rawMessage = str_repeat(' ', 64 - (strlen($rawMessage) % 64)).$rawMessage; @@ -67,7 +63,7 @@ public function send(Destination $destination, Message $message): void }); } - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $deliveryDelay) { return $this; @@ -81,7 +77,7 @@ public function getDeliveryDelay(): ?int return null; } - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (null === $priority) { return $this; @@ -95,7 +91,7 @@ public function getPriority(): ?int return null; } - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/fs/LegacyFilesystemLock.php b/pkg/fs/LegacyFilesystemLock.php index a765d2ced..328fb7098 100644 --- a/pkg/fs/LegacyFilesystemLock.php +++ b/pkg/fs/LegacyFilesystemLock.php @@ -19,9 +19,6 @@ public function __construct() $this->lockHandlers = []; } - /** - * {@inheritdoc} - */ public function lock(FsDestination $destination) { $lockHandler = $this->getLockHandler($destination); @@ -31,9 +28,6 @@ public function lock(FsDestination $destination) } } - /** - * {@inheritdoc} - */ public function release(FsDestination $destination) { $lockHandler = $this->getLockHandler($destination); @@ -51,8 +45,6 @@ public function releaseAll() } /** - * @param FsDestination $destination - * * @return LockHandler */ private function getLockHandler(FsDestination $destination) @@ -161,7 +153,7 @@ public function lock($blocking = false) // On Windows, even if PHP doc says the contrary, LOCK_NB works, see // https://bugs.php.net/54129 - if (!flock($this->handle, LOCK_EX | ($blocking ? 0 : LOCK_NB))) { + if (!flock($this->handle, \LOCK_EX | ($blocking ? 0 : \LOCK_NB))) { fclose($this->handle); $this->handle = null; @@ -177,7 +169,7 @@ public function lock($blocking = false) public function release() { if ($this->handle) { - flock($this->handle, LOCK_UN | LOCK_NB); + flock($this->handle, \LOCK_UN | \LOCK_NB); fclose($this->handle); $this->handle = null; } diff --git a/pkg/fs/Lock.php b/pkg/fs/Lock.php index 91125faa8..16349f22c 100644 --- a/pkg/fs/Lock.php +++ b/pkg/fs/Lock.php @@ -10,15 +10,10 @@ interface Lock * Returns the control If the look has been obtained * If not, should throw CannotObtainLockException exception. * - * @param FsDestination $destination - * * @throws CannotObtainLockException if look could not be obtained */ public function lock(FsDestination $destination); - /** - * @param FsDestination $destination - */ public function release(FsDestination $destination); public function releaseAll(); diff --git a/pkg/fs/Tests/FsConnectionFactoryConfigTest.php b/pkg/fs/Tests/FsConnectionFactoryConfigTest.php index 970fef395..0b3411f2c 100644 --- a/pkg/fs/Tests/FsConnectionFactoryConfigTest.php +++ b/pkg/fs/Tests/FsConnectionFactoryConfigTest.php @@ -51,9 +51,6 @@ public function testThrowIfArrayConfigGivenWithEmptyPath() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/fs/Tests/FsMessageTest.php b/pkg/fs/Tests/FsMessageTest.php index c2f788d04..90655b620 100644 --- a/pkg/fs/Tests/FsMessageTest.php +++ b/pkg/fs/Tests/FsMessageTest.php @@ -89,7 +89,7 @@ public function testCouldBeUnserializedFromJson() $json = json_encode($message); - //guard + // guard $this->assertNotEmpty($json); $unserializedMessage = FsMessage::jsonUnserialize($json); diff --git a/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php b/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php index 7abb9d91c..b96091e7f 100644 --- a/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php +++ b/pkg/fs/Tests/Functional/FsCommonUseCasesTest.php @@ -111,7 +111,7 @@ public function testConsumerReceiveMessageWithZeroTimeout() $topic = $this->fsContext->createTopic('fs_test_queue_exchange'); $consumer = $this->fsContext->createConsumer($topic); - //guard + // guard $this->assertNull($consumer->receive(1000)); $message = $this->fsContext->createMessage(__METHOD__); diff --git a/pkg/fs/Tests/Functional/FsConsumerTest.php b/pkg/fs/Tests/Functional/FsConsumerTest.php index 984ea160a..3be009b02 100644 --- a/pkg/fs/Tests/Functional/FsConsumerTest.php +++ b/pkg/fs/Tests/Functional/FsConsumerTest.php @@ -159,7 +159,7 @@ public function testShouldThrowExceptionWhenFrameSizeNotDivideExactly() $context->workWithFile($queue, 'a+', function (FsDestination $destination, $file) { $msg = '|{"body":""}'; - //guard + // guard $this->assertNotSame(0, strlen($msg) % 64); fwrite($file, $msg); diff --git a/pkg/fs/Tests/Functional/FsContextTest.php b/pkg/fs/Tests/Functional/FsContextTest.php index 287fd6c04..806b9f56a 100644 --- a/pkg/fs/Tests/Functional/FsContextTest.php +++ b/pkg/fs/Tests/Functional/FsContextTest.php @@ -14,7 +14,7 @@ class FsContextTest extends TestCase */ private $fsContext; - public function tearDown(): void + protected function tearDown(): void { $fs = new Filesystem(); $fs->remove(sys_get_temp_dir().'/enqueue'); diff --git a/pkg/fs/Tests/Spec/FsMessageTest.php b/pkg/fs/Tests/Spec/FsMessageTest.php index 20dd4beca..f1ece8ecb 100644 --- a/pkg/fs/Tests/Spec/FsMessageTest.php +++ b/pkg/fs/Tests/Spec/FsMessageTest.php @@ -7,9 +7,6 @@ class FsMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new FsMessage(); diff --git a/pkg/fs/Tests/Spec/FsSendAndReceiveTimeToLiveMessagesFromQueueTest.php b/pkg/fs/Tests/Spec/FsSendAndReceiveTimeToLiveMessagesFromQueueTest.php index 3dd1697c7..d6a76ca94 100644 --- a/pkg/fs/Tests/Spec/FsSendAndReceiveTimeToLiveMessagesFromQueueTest.php +++ b/pkg/fs/Tests/Spec/FsSendAndReceiveTimeToLiveMessagesFromQueueTest.php @@ -9,8 +9,6 @@ class FsSendAndReceiveTimeToLiveMessagesFromQueueTest extends SendAndReceiveTimeToLiveMessagesFromQueueSpec { /** - * {@inheritdoc} - * * @return FsContext */ protected function createContext() diff --git a/pkg/gearman/GearmanConsumer.php b/pkg/gearman/GearmanConsumer.php index 7c1dea0a1..e834fe469 100644 --- a/pkg/gearman/GearmanConsumer.php +++ b/pkg/gearman/GearmanConsumer.php @@ -27,8 +27,6 @@ class GearmanConsumer implements Consumer /** * Message content. - * - * @var mixed */ private $message; diff --git a/pkg/gearman/GearmanMessage.php b/pkg/gearman/GearmanMessage.php index 625566d62..ee93a78dd 100644 --- a/pkg/gearman/GearmanMessage.php +++ b/pkg/gearman/GearmanMessage.php @@ -101,7 +101,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', (string) $correlationId); } @@ -111,7 +111,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', (string) $messageId); } @@ -128,12 +128,12 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -155,12 +155,8 @@ public function jsonSerialize(): array public static function jsonUnserialize(string $json): self { $data = json_decode($json, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return new self($data['body'], $data['properties'], $data['headers']); @@ -171,7 +167,7 @@ public function getJob(): ?\GearmanJob return $this->job; } - public function setJob(\GearmanJob $job = null): void + public function setJob(?\GearmanJob $job = null): void { $this->job = $job; } diff --git a/pkg/gearman/GearmanProducer.php b/pkg/gearman/GearmanProducer.php index c297e71b2..870bdcb03 100644 --- a/pkg/gearman/GearmanProducer.php +++ b/pkg/gearman/GearmanProducer.php @@ -40,7 +40,7 @@ public function send(Destination $destination, Message $message): void } } - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $deliveryDelay) { return $this; @@ -54,7 +54,7 @@ public function getDeliveryDelay(): ?int return null; } - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (null === $priority) { return $this; @@ -68,7 +68,7 @@ public function getPriority(): ?int return null; } - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { if (null === $timeToLive) { return $this; diff --git a/pkg/gearman/Tests/GearmanConnectionFactoryConfigTest.php b/pkg/gearman/Tests/GearmanConnectionFactoryConfigTest.php index 84826d5f9..8fc7a6b1e 100644 --- a/pkg/gearman/Tests/GearmanConnectionFactoryConfigTest.php +++ b/pkg/gearman/Tests/GearmanConnectionFactoryConfigTest.php @@ -42,9 +42,6 @@ public function testThrowIfDsnCouldNotBeParsed() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/gearman/Tests/Spec/GearmanConnectionFactoryTest.php b/pkg/gearman/Tests/Spec/GearmanConnectionFactoryTest.php index 148bf66d2..05418febc 100644 --- a/pkg/gearman/Tests/Spec/GearmanConnectionFactoryTest.php +++ b/pkg/gearman/Tests/Spec/GearmanConnectionFactoryTest.php @@ -10,9 +10,6 @@ class GearmanConnectionFactoryTest extends ConnectionFactorySpec { use SkipIfGearmanExtensionIsNotInstalledTrait; - /** - * {@inheritdoc} - */ protected function createConnectionFactory() { return new GearmanConnectionFactory(); diff --git a/pkg/gearman/Tests/Spec/GearmanContextTest.php b/pkg/gearman/Tests/Spec/GearmanContextTest.php index 7bfeee374..d5f879f12 100644 --- a/pkg/gearman/Tests/Spec/GearmanContextTest.php +++ b/pkg/gearman/Tests/Spec/GearmanContextTest.php @@ -11,9 +11,6 @@ */ class GearmanContextTest extends ContextSpec { - /** - * {@inheritdoc} - */ protected function createContext() { return (new GearmanConnectionFactory(getenv('GEARMAN_DSN')))->createContext(); diff --git a/pkg/gearman/Tests/Spec/GearmanMessageTest.php b/pkg/gearman/Tests/Spec/GearmanMessageTest.php index 7ad01d6db..37aa71e62 100644 --- a/pkg/gearman/Tests/Spec/GearmanMessageTest.php +++ b/pkg/gearman/Tests/Spec/GearmanMessageTest.php @@ -10,9 +10,6 @@ class GearmanMessageTest extends MessageSpec { use SkipIfGearmanExtensionIsNotInstalledTrait; - /** - * {@inheritdoc} - */ protected function createMessage() { return new GearmanMessage(); diff --git a/pkg/gearman/Tests/Spec/GearmanQueueTest.php b/pkg/gearman/Tests/Spec/GearmanQueueTest.php index 3d486849e..abf6be603 100644 --- a/pkg/gearman/Tests/Spec/GearmanQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanQueueTest.php @@ -10,9 +10,6 @@ class GearmanQueueTest extends QueueSpec { use SkipIfGearmanExtensionIsNotInstalledTrait; - /** - * {@inheritdoc} - */ protected function createQueue() { return new GearmanDestination(self::EXPECTED_QUEUE_NAME); diff --git a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php index 47bf182c2..10a284987 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveFromQueueTest.php @@ -13,9 +13,6 @@ */ class GearmanSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new GearmanConnectionFactory(getenv('GEARMAN_DSN')); diff --git a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php index 86ce5b189..e2164ea7a 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToAndReceiveNoWaitFromQueueTest.php @@ -12,9 +12,6 @@ */ class GearmanSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new GearmanConnectionFactory(getenv('GEARMAN_DSN')); @@ -22,9 +19,6 @@ protected function createContext() return $factory->createContext(); } - /** - * {@inheritdoc} - */ protected function createQueue(Context $context, $queueName) { return $context->createQueue($queueName.time()); diff --git a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php index c3f470528..32463cce1 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveFromQueueTest.php @@ -19,9 +19,6 @@ protected function setUp(): void $this->time = time(); } - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new GearmanConnectionFactory(getenv('GEARMAN_DSN')); @@ -29,17 +26,11 @@ protected function createContext() return $factory->createContext(); } - /** - * {@inheritdoc} - */ protected function createQueue(Context $context, $queueName) { return $context->createQueue($queueName.$this->time); } - /** - * {@inheritdoc} - */ protected function createTopic(Context $context, $topicName) { return $context->createTopic($topicName.$this->time); diff --git a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php index 25c3596a1..993dc3f25 100644 --- a/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/gearman/Tests/Spec/GearmanSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -19,9 +19,6 @@ protected function setUp(): void $this->time = time(); } - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new GearmanConnectionFactory(getenv('GEARMAN_DSN')); @@ -29,17 +26,11 @@ protected function createContext() return $factory->createContext(); } - /** - * {@inheritdoc} - */ protected function createQueue(Context $context, $queueName) { return $context->createQueue($queueName.$this->time); } - /** - * {@inheritdoc} - */ protected function createTopic(Context $context, $topicName) { return $context->createTopic($topicName.$this->time); diff --git a/pkg/gearman/Tests/Spec/GearmanTopicTest.php b/pkg/gearman/Tests/Spec/GearmanTopicTest.php index 336c37f7d..826344e8b 100644 --- a/pkg/gearman/Tests/Spec/GearmanTopicTest.php +++ b/pkg/gearman/Tests/Spec/GearmanTopicTest.php @@ -10,9 +10,6 @@ class GearmanTopicTest extends TopicSpec { use SkipIfGearmanExtensionIsNotInstalledTrait; - /** - * {@inheritdoc} - */ protected function createTopic() { return new GearmanDestination(self::EXPECTED_TOPIC_NAME); diff --git a/pkg/gps/GpsConnectionFactory.php b/pkg/gps/GpsConnectionFactory.php index c15854763..e45f8cbe3 100644 --- a/pkg/gps/GpsConnectionFactory.php +++ b/pkg/gps/GpsConnectionFactory.php @@ -88,10 +88,7 @@ private function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if ('gps' !== $dsn->getSchemeProtocol()) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be "gps"', - $dsn->getSchemeProtocol() - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be "gps"', $dsn->getSchemeProtocol())); } $emulatorHost = $dsn->getString('emulatorHost'); diff --git a/pkg/gps/GpsContext.php b/pkg/gps/GpsContext.php index 77e6200cf..27625992a 100644 --- a/pkg/gps/GpsContext.php +++ b/pkg/gps/GpsContext.php @@ -52,11 +52,7 @@ public function __construct($client, array $options = []) } elseif (is_callable($client)) { $this->clientFactory = $client; } else { - throw new \InvalidArgumentException(sprintf( - 'The $client argument must be either %s or callable that returns %s once called.', - PubSubClient::class, - PubSubClient::class - )); + throw new \InvalidArgumentException(sprintf('The $client argument must be either %s or callable that returns %s once called.', PubSubClient::class, PubSubClient::class)); } } @@ -148,11 +144,7 @@ public function getClient(): PubSubClient if (false == $this->client) { $client = call_user_func($this->clientFactory); if (false == $client instanceof PubSubClient) { - throw new \LogicException(sprintf( - 'The factory must return instance of %s. It returned %s', - PubSubClient::class, - is_object($client) ? get_class($client) : gettype($client) - )); + throw new \LogicException(sprintf('The factory must return instance of %s. It returned %s', PubSubClient::class, is_object($client) ? $client::class : gettype($client))); } $this->client = $client; diff --git a/pkg/gps/Tests/GpsConnectionFactoryConfigTest.php b/pkg/gps/Tests/GpsConnectionFactoryConfigTest.php index 039e86cd4..474149497 100644 --- a/pkg/gps/Tests/GpsConnectionFactoryConfigTest.php +++ b/pkg/gps/Tests/GpsConnectionFactoryConfigTest.php @@ -41,9 +41,6 @@ public function testThrowIfDsnCouldNotBeParsed() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/gps/Tests/Spec/GpsSendToTopicAndReceiveFromQueueTest.php b/pkg/gps/Tests/Spec/GpsSendToTopicAndReceiveFromQueueTest.php index 30485b072..4bcaf357b 100644 --- a/pkg/gps/Tests/Spec/GpsSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/gps/Tests/Spec/GpsSendToTopicAndReceiveFromQueueTest.php @@ -23,7 +23,6 @@ protected function createContext() /** * @param GpsContext $context - * @param mixed $queueName */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/gps/Tests/Spec/GpsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/gps/Tests/Spec/GpsSendToTopicAndReceiveNoWaitFromQueueTest.php index 240c71a3b..3a96bb533 100644 --- a/pkg/gps/Tests/Spec/GpsSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/gps/Tests/Spec/GpsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -23,7 +23,6 @@ protected function createContext() /** * @param GpsContext $context - * @param mixed $queueName */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/job-queue/CalculateRootJobStatusProcessor.php b/pkg/job-queue/CalculateRootJobStatusProcessor.php index b9b0c4dfb..96e7db2e8 100644 --- a/pkg/job-queue/CalculateRootJobStatusProcessor.php +++ b/pkg/job-queue/CalculateRootJobStatusProcessor.php @@ -38,7 +38,7 @@ public function __construct( JobStorage $jobStorage, CalculateRootJobStatusService $calculateRootJobStatusCase, ProducerInterface $producer, - LoggerInterface $logger + LoggerInterface $logger, ) { $this->jobStorage = $jobStorage; $this->calculateRootJobStatusService = $calculateRootJobStatusCase; diff --git a/pkg/job-queue/Commands.php b/pkg/job-queue/Commands.php index 57966c30c..ae744c991 100644 --- a/pkg/job-queue/Commands.php +++ b/pkg/job-queue/Commands.php @@ -4,5 +4,5 @@ class Commands { - const CALCULATE_ROOT_JOB_STATUS = 'enqueue.message_queue.job.calculate_root_job_status'; + public const CALCULATE_ROOT_JOB_STATUS = 'enqueue.message_queue.job.calculate_root_job_status'; } diff --git a/pkg/job-queue/DependentJobProcessor.php b/pkg/job-queue/DependentJobProcessor.php index 4916c7031..ac3055b5f 100644 --- a/pkg/job-queue/DependentJobProcessor.php +++ b/pkg/job-queue/DependentJobProcessor.php @@ -37,9 +37,6 @@ public function __construct(JobStorage $jobStorage, ProducerInterface $producer, $this->logger = $logger; } - /** - * {@inheritdoc} - */ public function process(Message $message, Context $context) { $data = JSON::decode($message->getBody()); diff --git a/pkg/job-queue/Doctrine/JobStorage.php b/pkg/job-queue/Doctrine/JobStorage.php index 0ee459e50..4db585696 100644 --- a/pkg/job-queue/Doctrine/JobStorage.php +++ b/pkg/job-queue/Doctrine/JobStorage.php @@ -124,11 +124,11 @@ public function createJob() /** * @throws DuplicateJobException */ - public function saveJob(Job $job, \Closure $lockCallback = null) + public function saveJob(Job $job, ?\Closure $lockCallback = null) { $class = $this->getEntityRepository()->getClassName(); if (!$job instanceof $class) { - throw new \LogicException(sprintf('Got unexpected job instance: expected: "%s", actual" "%s"', $class, get_class($job))); + throw new \LogicException(sprintf('Got unexpected job instance: expected: "%s", actual" "%s"', $class, $job::class)); } if ($lockCallback) { diff --git a/pkg/job-queue/Job.php b/pkg/job-queue/Job.php index ef0c42c4e..ddf53c2e3 100644 --- a/pkg/job-queue/Job.php +++ b/pkg/job-queue/Job.php @@ -4,11 +4,11 @@ class Job { - const STATUS_NEW = 'enqueue.job_queue.status.new'; - const STATUS_RUNNING = 'enqueue.job_queue.status.running'; - const STATUS_SUCCESS = 'enqueue.job_queue.status.success'; - const STATUS_FAILED = 'enqueue.job_queue.status.failed'; - const STATUS_CANCELLED = 'enqueue.job_queue.status.cancelled'; + public const STATUS_NEW = 'enqueue.job_queue.status.new'; + public const STATUS_RUNNING = 'enqueue.job_queue.status.running'; + public const STATUS_SUCCESS = 'enqueue.job_queue.status.success'; + public const STATUS_FAILED = 'enqueue.job_queue.status.failed'; + public const STATUS_CANCELLED = 'enqueue.job_queue.status.cancelled'; /** * @var int @@ -216,8 +216,6 @@ public function getRootJob() * Do not call from the outside. * * @internal - * - * @param Job $rootJob */ public function setRootJob(self $rootJob) { diff --git a/pkg/job-queue/JobRunner.php b/pkg/job-queue/JobRunner.php index e8d7eaa27..e21e524d6 100644 --- a/pkg/job-queue/JobRunner.php +++ b/pkg/job-queue/JobRunner.php @@ -14,10 +14,7 @@ class JobRunner */ private $rootJob; - /** - * @param Job $rootJob - */ - public function __construct(JobProcessor $jobProcessor, Job $rootJob = null) + public function __construct(JobProcessor $jobProcessor, ?Job $rootJob = null) { $this->jobProcessor = $jobProcessor; $this->rootJob = $rootJob; @@ -28,8 +25,6 @@ public function __construct(JobProcessor $jobProcessor, Job $rootJob = null) * @param string $name * * @throws \Throwable|\Exception if $runCallback triggers an exception - * - * @return mixed */ public function runUnique($ownerId, $name, callable $runCallback) { @@ -69,8 +64,6 @@ public function runUnique($ownerId, $name, callable $runCallback) /** * @param string $name - * - * @return mixed */ public function createDelayed($name, callable $startCallback) { @@ -83,8 +76,6 @@ public function createDelayed($name, callable $startCallback) /** * @param string $jobId - * - * @return mixed */ public function runDelayed($jobId, callable $runCallback) { diff --git a/pkg/job-queue/Test/DbalPersistedConnection.php b/pkg/job-queue/Test/DbalPersistedConnection.php index add0f3ddc..6e1dc4ca6 100644 --- a/pkg/job-queue/Test/DbalPersistedConnection.php +++ b/pkg/job-queue/Test/DbalPersistedConnection.php @@ -22,9 +22,6 @@ class DbalPersistedConnection extends Connection */ protected static $persistedTransactionNestingLevels; - /** - * {@inheritdoc} - */ public function connect() { if ($this->isConnected()) { @@ -41,25 +38,16 @@ public function connect() return true; } - /** - * {@inheritdoc} - */ public function beginTransaction() { $this->wrapTransactionNestingLevel('beginTransaction'); } - /** - * {@inheritdoc} - */ public function commit() { $this->wrapTransactionNestingLevel('commit'); } - /** - * {@inheritdoc} - */ public function rollBack() { $this->wrapTransactionNestingLevel('rollBack'); diff --git a/pkg/job-queue/Test/JobRunner.php b/pkg/job-queue/Test/JobRunner.php index 62d9f9a52..6194fbcee 100644 --- a/pkg/job-queue/Test/JobRunner.php +++ b/pkg/job-queue/Test/JobRunner.php @@ -26,9 +26,6 @@ public function __construct() { } - /** - * {@inheritdoc} - */ public function runUnique($ownerId, $jobName, \Closure $runCallback) { $this->runUniqueJobs[] = ['ownerId' => $ownerId, 'jobName' => $jobName, 'runCallback' => $runCallback]; @@ -36,11 +33,6 @@ public function runUnique($ownerId, $jobName, \Closure $runCallback) return call_user_func($runCallback, $this, new Job()); } - /** - * {@inheritdoc} - * - * @return mixed - */ public function createDelayed($jobName, \Closure $startCallback) { $this->createDelayedJobs[] = ['jobName' => $jobName, 'runCallback' => $startCallback]; @@ -48,11 +40,6 @@ public function createDelayed($jobName, \Closure $startCallback) return call_user_func($startCallback, $this, new Job()); } - /** - * {@inheritdoc} - * - * @return mixed - */ public function runDelayed($jobId, \Closure $runCallback) { $this->runDelayedJobs[] = ['jobId' => $jobId, 'runCallback' => $runCallback]; diff --git a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php index 695c08e6e..a0f1b4c86 100644 --- a/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php +++ b/pkg/job-queue/Tests/CalculateRootJobStatusServiceTest.php @@ -20,8 +20,6 @@ public function stopStatusProvider() /** * @dataProvider stopStatusProvider - * - * @param mixed $status */ public function testShouldDoNothingIfRootJobHasStopState($status) { @@ -70,8 +68,6 @@ public function testShouldCalculateRootJobStatus() /** * @dataProvider stopStatusProvider - * - * @param mixed $stopStatus */ public function testShouldCalculateRootJobStatusAndSetStoppedAtTimeIfGotStopStatus($stopStatus) { @@ -356,7 +352,7 @@ public function testShouldSetStatusSuccessIfAllAreSuccess() } /** - * @return MockObject|\Enqueue\JobQueue\Doctrine\JobStorage + * @return MockObject|JobStorage */ private function createJobStorageMock() { diff --git a/pkg/job-queue/Tests/DependentJobProcessorTest.php b/pkg/job-queue/Tests/DependentJobProcessorTest.php index fff9517a4..dcebf0d49 100644 --- a/pkg/job-queue/Tests/DependentJobProcessorTest.php +++ b/pkg/job-queue/Tests/DependentJobProcessorTest.php @@ -326,7 +326,7 @@ private function createContextMock() } /** - * @return MockObject|\Enqueue\JobQueue\Doctrine\JobStorage + * @return MockObject|JobStorage */ private function createJobStorageMock() { diff --git a/pkg/job-queue/Tests/DependentJobServiceTest.php b/pkg/job-queue/Tests/DependentJobServiceTest.php index e8809b4b0..c2a1c7b1a 100644 --- a/pkg/job-queue/Tests/DependentJobServiceTest.php +++ b/pkg/job-queue/Tests/DependentJobServiceTest.php @@ -63,7 +63,7 @@ public function testShouldSaveDependentJobs() } /** - * @return MockObject|\Enqueue\JobQueue\Doctrine\JobStorage + * @return MockObject|JobStorage */ private function createJobStorageMock() { diff --git a/pkg/job-queue/Tests/Functional/Job/JobStorageTest.php b/pkg/job-queue/Tests/Functional/Job/JobStorageTest.php index c2c8fb94d..e884c31e8 100644 --- a/pkg/job-queue/Tests/Functional/Job/JobStorageTest.php +++ b/pkg/job-queue/Tests/Functional/Job/JobStorageTest.php @@ -142,7 +142,7 @@ private function getEntityManager() } /** - * @return \Enqueue\JobQueue\Doctrine\JobStorage + * @return JobStorage */ private function getJobStorage() { diff --git a/pkg/job-queue/Tests/Functional/WebTestCase.php b/pkg/job-queue/Tests/Functional/WebTestCase.php index cd990384a..781bb5da4 100644 --- a/pkg/job-queue/Tests/Functional/WebTestCase.php +++ b/pkg/job-queue/Tests/Functional/WebTestCase.php @@ -58,9 +58,9 @@ protected function startTransaction() protected function rollbackTransaction() { - //the error can be thrown during setUp - //It would be caught by phpunit and tearDown called. - //In this case we could not rollback since container may not exist. + // the error can be thrown during setUp + // It would be caught by phpunit and tearDown called. + // In this case we could not rollback since container may not exist. if (false == static::$container) { return; } diff --git a/pkg/job-queue/Topics.php b/pkg/job-queue/Topics.php index 61b424b25..891ea26f7 100644 --- a/pkg/job-queue/Topics.php +++ b/pkg/job-queue/Topics.php @@ -4,5 +4,5 @@ class Topics { - const ROOT_JOB_STOPPED = 'enqueue.message_queue.job.root_job_stopped'; + public const ROOT_JOB_STOPPED = 'enqueue.message_queue.job.root_job_stopped'; } diff --git a/pkg/mongodb/JSON.php b/pkg/mongodb/JSON.php index 84cac50da..481b7f9ff 100644 --- a/pkg/mongodb/JSON.php +++ b/pkg/mongodb/JSON.php @@ -14,10 +14,7 @@ class JSON public static function decode($string) { if (!is_string($string)) { - throw new \InvalidArgumentException(sprintf( - 'Accept only string argument but got: "%s"', - is_object($string) ? get_class($string) : gettype($string) - )); + throw new \InvalidArgumentException(sprintf('Accept only string argument but got: "%s"', is_object($string) ? $string::class : gettype($string))); } // PHP7 fix - empty string and null cause syntax error @@ -26,32 +23,22 @@ public static function decode($string) } $decoded = json_decode($string, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $decoded; } /** - * @param mixed $value - * * @return string */ public static function encode($value) { - $encoded = json_encode($value, JSON_UNESCAPED_UNICODE); - - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'Could not encode value into json. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + $encoded = json_encode($value, \JSON_UNESCAPED_UNICODE); + + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('Could not encode value into json. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $encoded; diff --git a/pkg/mongodb/MongodbConnectionFactory.php b/pkg/mongodb/MongodbConnectionFactory.php index 3d7624904..3d34f7369 100644 --- a/pkg/mongodb/MongodbConnectionFactory.php +++ b/pkg/mongodb/MongodbConnectionFactory.php @@ -89,7 +89,7 @@ public static function parseDsn(string $dsn): array // see: https://github.com/php-enqueue/enqueue-dev/issues/1027 if (isset($parsedUrl['path']) && '/' !== $parsedUrl['path']) { $pathParts = explode('/', $parsedUrl['path']); - //DB name + // DB name if ($pathParts[1]) { $config['dbname'] = $pathParts[1]; } @@ -97,7 +97,7 @@ public static function parseDsn(string $dsn): array if (isset($parsedUrl['query'])) { $queryParts = null; parse_str($parsedUrl['query'], $queryParts); - //get enqueue attributes values + // get enqueue attributes values if (!empty($queryParts['polling_interval'])) { $config['polling_interval'] = (int) $queryParts['polling_interval']; } diff --git a/pkg/mongodb/MongodbMessage.php b/pkg/mongodb/MongodbMessage.php index fbfbd75d6..fadc5dd4e 100644 --- a/pkg/mongodb/MongodbMessage.php +++ b/pkg/mongodb/MongodbMessage.php @@ -65,7 +65,7 @@ public function __construct(string $body = '', array $properties = [], array $he $this->redelivered = false; } - public function setId(string $id = null): void + public function setId(?string $id = null): void { $this->id = $id; } @@ -135,7 +135,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -150,7 +150,7 @@ public function getPriority(): ?int return $this->priority; } - public function setPriority(int $priority = null): void + public function setPriority(?int $priority = null): void { $this->priority = $priority; } @@ -163,7 +163,7 @@ public function getDeliveryDelay(): ?int /** * In milliseconds. */ - public function setDeliveryDelay(int $deliveryDelay = null): void + public function setDeliveryDelay(?int $deliveryDelay = null): void { $this->deliveryDelay = $deliveryDelay; } @@ -176,12 +176,12 @@ public function getTimeToLive(): ?int /** * In milliseconds. */ - public function setTimeToLive(int $timeToLive = null): void + public function setTimeToLive(?int $timeToLive = null): void { $this->timeToLive = $timeToLive; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', $correlationId); } @@ -191,7 +191,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id', null); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', $messageId); } @@ -208,7 +208,7 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } @@ -221,7 +221,7 @@ public function getPublishedAt(): ?int /** * In milliseconds. */ - public function setPublishedAt(int $publishedAt = null): void + public function setPublishedAt(?int $publishedAt = null): void { $this->publishedAt = $publishedAt; } diff --git a/pkg/mongodb/MongodbProducer.php b/pkg/mongodb/MongodbProducer.php index d26696cf8..ed28a6681 100644 --- a/pkg/mongodb/MongodbProducer.php +++ b/pkg/mongodb/MongodbProducer.php @@ -77,7 +77,7 @@ public function send(Destination $destination, Message $message): void $delay = $message->getDeliveryDelay(); if ($delay) { if (!is_int($delay)) { - throw new \LogicException(sprintf('Delay must be integer but got: "%s"', is_object($delay) ? get_class($delay) : gettype($delay))); + throw new \LogicException(sprintf('Delay must be integer but got: "%s"', is_object($delay) ? $delay::class : gettype($delay))); } if ($delay <= 0) { @@ -90,7 +90,7 @@ public function send(Destination $destination, Message $message): void $timeToLive = $message->getTimeToLive(); if ($timeToLive) { if (!is_int($timeToLive)) { - throw new \LogicException(sprintf('TimeToLive must be integer but got: "%s"', is_object($timeToLive) ? get_class($timeToLive) : gettype($timeToLive))); + throw new \LogicException(sprintf('TimeToLive must be integer but got: "%s"', is_object($timeToLive) ? $timeToLive::class : gettype($timeToLive))); } if ($timeToLive <= 0) { @@ -111,7 +111,7 @@ public function send(Destination $destination, Message $message): void /** * @return self */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { $this->deliveryDelay = $deliveryDelay; @@ -126,7 +126,7 @@ public function getDeliveryDelay(): ?int /** * @return self */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { $this->priority = $priority; @@ -141,7 +141,7 @@ public function getPriority(): ?int /** * @return self */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/mongodb/MongodbSubscriptionConsumer.php b/pkg/mongodb/MongodbSubscriptionConsumer.php index 59063dd82..9fa6245f4 100644 --- a/pkg/mongodb/MongodbSubscriptionConsumer.php +++ b/pkg/mongodb/MongodbSubscriptionConsumer.php @@ -21,9 +21,6 @@ class MongodbSubscriptionConsumer implements SubscriptionConsumer */ private $subscribers; - /** - * @param MongodbContext $context - */ public function __construct(MongodbContext $context) { $this->context = $context; @@ -92,7 +89,7 @@ public function consume(int $timeout = 0): void public function subscribe(Consumer $consumer, callable $callback): void { if (false == $consumer instanceof MongodbConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', MongodbConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', MongodbConsumer::class, $consumer::class)); } $queueName = $consumer->getQueue()->getQueueName(); @@ -113,7 +110,7 @@ public function subscribe(Consumer $consumer, callable $callback): void public function unsubscribe(Consumer $consumer): void { if (false == $consumer instanceof MongodbConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', MongodbConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', MongodbConsumer::class, $consumer::class)); } $queueName = $consumer->getQueue()->getQueueName(); diff --git a/pkg/mongodb/Tests/MongodbConsumerTest.php b/pkg/mongodb/Tests/MongodbConsumerTest.php index c6a642500..6cd597514 100644 --- a/pkg/mongodb/Tests/MongodbConsumerTest.php +++ b/pkg/mongodb/Tests/MongodbConsumerTest.php @@ -181,7 +181,7 @@ public function isRedelivered(): bool throw new \BadMethodCallException('This should not be called directly'); } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { } @@ -190,7 +190,7 @@ public function getCorrelationId(): ?string throw new \BadMethodCallException('This should not be called directly'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { } @@ -204,11 +204,11 @@ public function getTimestamp(): ?int throw new \BadMethodCallException('This should not be called directly'); } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { } diff --git a/pkg/mongodb/Tests/Spec/MongodbConnectionFactoryTest.php b/pkg/mongodb/Tests/Spec/MongodbConnectionFactoryTest.php index 359b23eff..9f0d195ba 100644 --- a/pkg/mongodb/Tests/Spec/MongodbConnectionFactoryTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbConnectionFactoryTest.php @@ -10,9 +10,6 @@ */ class MongodbConnectionFactoryTest extends ConnectionFactorySpec { - /** - * {@inheritdoc} - */ protected function createConnectionFactory() { return new MongodbConnectionFactory(); diff --git a/pkg/mongodb/Tests/Spec/MongodbContextTest.php b/pkg/mongodb/Tests/Spec/MongodbContextTest.php index 22f2f3210..dfd5de3cb 100644 --- a/pkg/mongodb/Tests/Spec/MongodbContextTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbContextTest.php @@ -13,9 +13,6 @@ class MongodbContextTest extends ContextSpec { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildMongodbContext(); diff --git a/pkg/mongodb/Tests/Spec/MongodbMessageTest.php b/pkg/mongodb/Tests/Spec/MongodbMessageTest.php index 5efccfa01..92983d430 100644 --- a/pkg/mongodb/Tests/Spec/MongodbMessageTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbMessageTest.php @@ -10,9 +10,6 @@ */ class MongodbMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new MongodbMessage(); diff --git a/pkg/mongodb/Tests/Spec/MongodbProducerTest.php b/pkg/mongodb/Tests/Spec/MongodbProducerTest.php index 9b4e18793..68b6007ec 100644 --- a/pkg/mongodb/Tests/Spec/MongodbProducerTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbProducerTest.php @@ -13,9 +13,6 @@ class MongodbProducerTest extends ProducerSpec { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createProducer() { return $this->buildMongodbContext()->createProducer(); diff --git a/pkg/mongodb/Tests/Spec/MongodbQueueTest.php b/pkg/mongodb/Tests/Spec/MongodbQueueTest.php index f737d765f..25e437ba6 100644 --- a/pkg/mongodb/Tests/Spec/MongodbQueueTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbQueueTest.php @@ -10,9 +10,6 @@ */ class MongodbQueueTest extends QueueSpec { - /** - * {@inheritdoc} - */ protected function createQueue() { return new MongodbDestination(self::EXPECTED_QUEUE_NAME); diff --git a/pkg/mongodb/Tests/Spec/MongodbRequeueMessageTest.php b/pkg/mongodb/Tests/Spec/MongodbRequeueMessageTest.php index 454d357ad..8a9072470 100644 --- a/pkg/mongodb/Tests/Spec/MongodbRequeueMessageTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbRequeueMessageTest.php @@ -13,9 +13,6 @@ class MongodbRequeueMessageTest extends RequeueMessageSpec { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildMongodbContext(); diff --git a/pkg/mongodb/Tests/Spec/MongodbSendAndReceiveDelayedMessageFromQueueTest.php b/pkg/mongodb/Tests/Spec/MongodbSendAndReceiveDelayedMessageFromQueueTest.php index a5eb3511d..f54513fae 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendAndReceiveDelayedMessageFromQueueTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendAndReceiveDelayedMessageFromQueueTest.php @@ -13,9 +13,6 @@ class MongodbSendAndReceiveDelayedMessageFromQueueTest extends SendAndReceiveDel { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildMongodbContext(); diff --git a/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php b/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php index ab9b13aaa..6aadef7ba 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendAndReceivePriorityMessagesFromQueueTest.php @@ -34,8 +34,6 @@ protected function createContext() } /** - * {@inheritdoc} - * * @param MongodbContext $context * * @return MongodbMessage diff --git a/pkg/mongodb/Tests/Spec/MongodbSendAndReceiveTimeToLiveMessagesFromQueueTest.php b/pkg/mongodb/Tests/Spec/MongodbSendAndReceiveTimeToLiveMessagesFromQueueTest.php index d87ac10e9..f16e80b60 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendAndReceiveTimeToLiveMessagesFromQueueTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendAndReceiveTimeToLiveMessagesFromQueueTest.php @@ -13,9 +13,6 @@ class MongodbSendAndReceiveTimeToLiveMessagesFromQueueTest extends SendAndReceiv { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildMongodbContext(); diff --git a/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveFromQueueTest.php b/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveFromQueueTest.php index 992c0626e..c9b9cb2d1 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveFromQueueTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveFromQueueTest.php @@ -13,9 +13,6 @@ class MongodbSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildMongodbContext(); diff --git a/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveFromTopicTest.php b/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveFromTopicTest.php index c539386f7..a416d3c11 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveFromTopicTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveFromTopicTest.php @@ -13,9 +13,6 @@ class MongodbSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildMongodbContext(); diff --git a/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveNoWaitFromQueueTest.php b/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveNoWaitFromQueueTest.php index ea4febcc2..43ae34c6b 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveNoWaitFromQueueTest.php @@ -13,9 +13,6 @@ class MongodbSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitF { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildMongodbContext(); diff --git a/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveNoWaitFromTopicTest.php b/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveNoWaitFromTopicTest.php index 1e1be32c1..0fe9f0e56 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSendToAndReceiveNoWaitFromTopicTest.php @@ -13,9 +13,6 @@ class MongodbSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitF { use MongodbExtensionTrait; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildMongodbContext(); diff --git a/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php b/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php index 664990a68..2fe16e860 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php @@ -20,8 +20,6 @@ class MongodbSubscriptionConsumerConsumeFromAllSubscribedQueuesTest extends Subs /** * @return MongodbContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param MongodbContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerConsumeUntilUnsubscribedTest.php index 1071c1267..b18e0bf0d 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -20,8 +20,6 @@ class MongodbSubscriptionConsumerConsumeUntilUnsubscribedTest extends Subscripti /** * @return MongodbContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param MongodbContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerStopOnFalseTest.php b/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerStopOnFalseTest.php index 321e16bba..3acfa94ed 100644 --- a/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerStopOnFalseTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbSubscriptionConsumerStopOnFalseTest.php @@ -20,8 +20,6 @@ class MongodbSubscriptionConsumerStopOnFalseTest extends SubscriptionConsumerSto /** * @return MongodbContext - * - * {@inheritdoc} */ protected function createContext() { @@ -30,8 +28,6 @@ protected function createContext() /** * @param MongodbContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/mongodb/Tests/Spec/MongodbTopicTest.php b/pkg/mongodb/Tests/Spec/MongodbTopicTest.php index ec524e519..ab5c025a2 100644 --- a/pkg/mongodb/Tests/Spec/MongodbTopicTest.php +++ b/pkg/mongodb/Tests/Spec/MongodbTopicTest.php @@ -10,9 +10,6 @@ */ class MongodbTopicTest extends TopicSpec { - /** - * {@inheritdoc} - */ protected function createTopic() { return new MongodbDestination(self::EXPECTED_TOPIC_NAME); diff --git a/pkg/monitoring/ConsumedMessageStats.php b/pkg/monitoring/ConsumedMessageStats.php index 928bce0de..077ceebdf 100644 --- a/pkg/monitoring/ConsumedMessageStats.php +++ b/pkg/monitoring/ConsumedMessageStats.php @@ -6,10 +6,10 @@ class ConsumedMessageStats implements Stats { - const STATUS_ACK = 'acknowledged'; - const STATUS_REJECTED = 'rejected'; - const STATUS_REQUEUED = 'requeued'; - const STATUS_FAILED = 'failed'; + public const STATUS_ACK = 'acknowledged'; + public const STATUS_REJECTED = 'rejected'; + public const STATUS_REQUEUED = 'requeued'; + public const STATUS_FAILED = 'failed'; /** * @var string @@ -102,12 +102,12 @@ public function __construct( array $properties, bool $redelivered, string $status, - string $errorClass = null, - string $errorMessage = null, - int $errorCode = null, - string $errorFile = null, - int $errorLine = null, - string $trace = null + ?string $errorClass = null, + ?string $errorMessage = null, + ?int $errorCode = null, + ?string $errorFile = null, + ?int $errorLine = null, + ?string $trace = null, ) { $this->consumerId = $consumerId; $this->timestampMs = $timestampMs; diff --git a/pkg/monitoring/ConsumerStats.php b/pkg/monitoring/ConsumerStats.php index d1a745d14..d281b532d 100644 --- a/pkg/monitoring/ConsumerStats.php +++ b/pkg/monitoring/ConsumerStats.php @@ -121,12 +121,12 @@ public function __construct( int $requeued, int $memoryUsage, float $systemLoad, - string $errorClass = null, - string $errorMessage = null, - int $errorCode = null, - string $errorFile = null, - int $errorLine = null, - string $trace = null + ?string $errorClass = null, + ?string $errorMessage = null, + ?int $errorCode = null, + ?string $errorFile = null, + ?int $errorLine = null, + ?string $trace = null, ) { $this->consumerId = $consumerId; $this->timestampMs = $timestampMs; diff --git a/pkg/monitoring/DatadogStorage.php b/pkg/monitoring/DatadogStorage.php index 82e841a3f..c10cbc671 100644 --- a/pkg/monitoring/DatadogStorage.php +++ b/pkg/monitoring/DatadogStorage.php @@ -30,7 +30,7 @@ public function __construct($config = 'datadog:') $this->config = $this->prepareConfig($config); if (null === $this->datadog) { - if (true === filter_var($this->config['batched'], FILTER_VALIDATE_BOOLEAN)) { + if (true === filter_var($this->config['batched'], \FILTER_VALIDATE_BOOLEAN)) { $this->datadog = new BatchedDogStatsd($this->config); } else { $this->datadog = new DogStatsd($this->config); @@ -104,10 +104,7 @@ private function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if ('datadog' !== $dsn->getSchemeProtocol()) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be "datadog"', - $dsn->getSchemeProtocol() - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be "datadog"', $dsn->getSchemeProtocol())); } return array_filter(array_replace($dsn->getQuery(), [ @@ -132,11 +129,6 @@ private function parseDsn(string $dsn): array }); } - /** - * @param $config - * - * @return array - */ private function prepareConfig($config): array { if (empty($config)) { diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index ff5f6c3b0..3084864f8 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -67,9 +67,9 @@ public function __construct($config = 'influxdb:') // and causes library to use defaults. @trigger_error( sprintf('Passing %s as %s argument is deprecated. Pass it as "client" array property or use createWithClient instead', - Client::class, - __METHOD__ - ), E_USER_DEPRECATED); + Client::class, + __METHOD__ + ), \E_USER_DEPRECATED); $this->client = $config; $config = []; } else { @@ -91,12 +91,7 @@ public function __construct($config = 'influxdb:') if (null !== $config['client']) { if (!$config['client'] instanceof Client) { - throw new \InvalidArgumentException(sprintf( - '%s configuration property is expected to be an instance of %s class. %s was passed instead.', - 'client', - Client::class, - gettype($config['client']) - )); + throw new \InvalidArgumentException(sprintf('%s configuration property is expected to be an instance of %s class. %s was passed instead.', 'client', Client::class, gettype($config['client']))); } $this->client = $config['client']; } @@ -105,10 +100,7 @@ public function __construct($config = 'influxdb:') } /** - * @param Client $client * @param string $config - * - * @return InfluxDbStorage */ public static function createWithClient(Client $client, $config = 'influxdb:'): self { @@ -254,10 +246,7 @@ private static function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if (false === in_array($dsn->getSchemeProtocol(), ['influxdb'], true)) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be "influxdb"', - $dsn->getSchemeProtocol() - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be "influxdb"', $dsn->getSchemeProtocol())); } return array_filter(array_replace($dsn->getQuery(), [ diff --git a/pkg/monitoring/JsonSerializer.php b/pkg/monitoring/JsonSerializer.php index 1edb60e61..8d046092a 100644 --- a/pkg/monitoring/JsonSerializer.php +++ b/pkg/monitoring/JsonSerializer.php @@ -22,12 +22,8 @@ public function toString(Stats $stats): string $json = json_encode($data); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $json; diff --git a/pkg/monitoring/Resources.php b/pkg/monitoring/Resources.php index 2a5995fa3..409d9861f 100644 --- a/pkg/monitoring/Resources.php +++ b/pkg/monitoring/Resources.php @@ -7,7 +7,7 @@ final class Resources /** * @var array */ - private static $knownStorages = null; + private static $knownStorages; private function __construct() { diff --git a/pkg/monitoring/SentMessageStats.php b/pkg/monitoring/SentMessageStats.php index 6106d3df8..f8ddc73be 100644 --- a/pkg/monitoring/SentMessageStats.php +++ b/pkg/monitoring/SentMessageStats.php @@ -48,7 +48,7 @@ public function __construct( ?string $messageId, ?string $correlationId, array $headers, - array $properties + array $properties, ) { $this->timestampMs = $timestampMs; $this->destination = $destination; diff --git a/pkg/monitoring/WampStorage.php b/pkg/monitoring/WampStorage.php index 44623d4e5..0d5ba1801 100644 --- a/pkg/monitoring/WampStorage.php +++ b/pkg/monitoring/WampStorage.php @@ -195,10 +195,7 @@ private function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if (false === in_array($dsn->getSchemeProtocol(), ['wamp', 'ws'], true)) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be "wamp"', - $dsn->getSchemeProtocol() - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be "wamp"', $dsn->getSchemeProtocol())); } return array_filter(array_replace($dsn->getQuery(), [ diff --git a/pkg/null/NullMessage.php b/pkg/null/NullMessage.php index bd48a387e..93fc57c3d 100644 --- a/pkg/null/NullMessage.php +++ b/pkg/null/NullMessage.php @@ -97,7 +97,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $headers = $this->getHeaders(); $headers['correlation_id'] = (string) $correlationId; @@ -110,7 +110,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $headers = $this->getHeaders(); $headers['message_id'] = (string) $messageId; @@ -130,7 +130,7 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $headers = $this->getHeaders(); $headers['timestamp'] = (int) $timestamp; @@ -138,7 +138,7 @@ public function setTimestamp(int $timestamp = null): void $this->setHeaders($headers); } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } diff --git a/pkg/null/NullProducer.php b/pkg/null/NullProducer.php index 47235e7f6..1349de9ba 100644 --- a/pkg/null/NullProducer.php +++ b/pkg/null/NullProducer.php @@ -23,7 +23,7 @@ public function send(Destination $destination, Message $message): void /** * @return NullProducer */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { $this->deliveryDelay = $deliveryDelay; @@ -38,7 +38,7 @@ public function getDeliveryDelay(): ?int /** * @return NullProducer */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { $this->priority = $priority; @@ -53,7 +53,7 @@ public function getPriority(): ?int /** * @return NullProducer */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/null/Tests/Spec/NullMessageTest.php b/pkg/null/Tests/Spec/NullMessageTest.php index 34c6863ed..6bacc9294 100644 --- a/pkg/null/Tests/Spec/NullMessageTest.php +++ b/pkg/null/Tests/Spec/NullMessageTest.php @@ -7,9 +7,6 @@ class NullMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new NullMessage(); diff --git a/pkg/pheanstalk/PheanstalkMessage.php b/pkg/pheanstalk/PheanstalkMessage.php index cf4ea1905..5bff1a7a6 100644 --- a/pkg/pheanstalk/PheanstalkMessage.php +++ b/pkg/pheanstalk/PheanstalkMessage.php @@ -103,7 +103,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', (string) $correlationId); } @@ -113,7 +113,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', (string) $messageId); } @@ -130,12 +130,12 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -187,12 +187,8 @@ public function jsonSerialize(): array public static function jsonUnserialize(string $json): self { $data = json_decode($json, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return new self($data['body'], $data['properties'], $data['headers']); @@ -203,7 +199,7 @@ public function getJob(): ?Job return $this->job; } - public function setJob(Job $job = null): void + public function setJob(?Job $job = null): void { $this->job = $job; } diff --git a/pkg/pheanstalk/PheanstalkProducer.php b/pkg/pheanstalk/PheanstalkProducer.php index 030beedf8..0c8ffd8ff 100644 --- a/pkg/pheanstalk/PheanstalkProducer.php +++ b/pkg/pheanstalk/PheanstalkProducer.php @@ -48,7 +48,7 @@ public function send(Destination $destination, Message $message): void InvalidMessageException::assertMessageInstanceOf($message, PheanstalkMessage::class); $rawMessage = json_encode($message); - if (JSON_ERROR_NONE !== json_last_error()) { + if (\JSON_ERROR_NONE !== json_last_error()) { throw new \InvalidArgumentException(sprintf('Could not encode value into json. Error %s and message %s', json_last_error(), json_last_error_msg())); } @@ -73,7 +73,7 @@ public function send(Destination $destination, Message $message): void /** * @return PheanstalkProducer */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { $this->deliveryDelay = $deliveryDelay; @@ -88,7 +88,7 @@ public function getDeliveryDelay(): ?int /** * @return PheanstalkProducer */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { $this->priority = $priority; @@ -103,7 +103,7 @@ public function getPriority(): ?int /** * @return PheanstalkProducer */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/pheanstalk/Tests/PheanstalkConnectionFactoryConfigTest.php b/pkg/pheanstalk/Tests/PheanstalkConnectionFactoryConfigTest.php index ef0030d42..a7bc7fc34 100644 --- a/pkg/pheanstalk/Tests/PheanstalkConnectionFactoryConfigTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkConnectionFactoryConfigTest.php @@ -41,9 +41,6 @@ public function testThrowIfDsnCouldNotBeParsed() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php index 944ac9b81..c79b20bbd 100644 --- a/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php +++ b/pkg/pheanstalk/Tests/PheanstalkConsumerTest.php @@ -46,7 +46,7 @@ public function testShouldReceiveFromQueueAndReturnNullIfNoMessageInQueue() public function testShouldReceiveFromQueueAndReturnMessageIfMessageInQueue() { $destination = new PheanstalkDestination('theQueueName'); - $message = new PheanstalkMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); + $message = new PheanstalkMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); $job = new Job('theJobId', json_encode($message)); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkConnectionFactoryTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkConnectionFactoryTest.php index e05152599..4d9148447 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkConnectionFactoryTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkConnectionFactoryTest.php @@ -7,9 +7,6 @@ class PheanstalkConnectionFactoryTest extends ConnectionFactorySpec { - /** - * {@inheritdoc} - */ protected function createConnectionFactory() { return new PheanstalkConnectionFactory(); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkContextTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkContextTest.php index d69a41ef6..d6ea514f4 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkContextTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkContextTest.php @@ -8,9 +8,6 @@ class PheanstalkContextTest extends ContextSpec { - /** - * {@inheritdoc} - */ protected function createContext() { return new PheanstalkContext($this->createMock(Pheanstalk::class)); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkMessageTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkMessageTest.php index 30fb1cf1b..692e0db54 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkMessageTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkMessageTest.php @@ -7,9 +7,6 @@ class PheanstalkMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new PheanstalkMessage(); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkQueueTest.php index a71dc4687..0a770b2e2 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkQueueTest.php @@ -7,9 +7,6 @@ class PheanstalkQueueTest extends QueueSpec { - /** - * {@inheritdoc} - */ protected function createQueue() { return new PheanstalkDestination(self::EXPECTED_QUEUE_NAME); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToAndReceiveFromQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToAndReceiveFromQueueTest.php index 45d0040b4..282ac364c 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToAndReceiveFromQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToAndReceiveFromQueueTest.php @@ -12,9 +12,6 @@ */ class PheanstalkSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new PheanstalkConnectionFactory(getenv('BEANSTALKD_DSN')); @@ -23,8 +20,7 @@ protected function createContext() } /** - * @param Context $context - * @param string $queueName + * @param string $queueName * * @return Queue */ diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToAndReceiveNoWaitFromQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToAndReceiveNoWaitFromQueueTest.php index 8226b512e..de464e5bf 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToAndReceiveNoWaitFromQueueTest.php @@ -11,9 +11,6 @@ */ class PheanstalkSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new PheanstalkConnectionFactory(getenv('BEANSTALKD_DSN')); @@ -21,9 +18,6 @@ protected function createContext() return $factory->createContext(); } - /** - * {@inheritdoc} - */ protected function createQueue(Context $context, $queueName) { return $context->createQueue($queueName.time()); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php index a961cdf3f..4c30d7796 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveFromQueueTest.php @@ -18,9 +18,6 @@ protected function setUp(): void $this->time = time(); } - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new PheanstalkConnectionFactory(getenv('BEANSTALKD_DSN')); @@ -28,17 +25,11 @@ protected function createContext() return $factory->createContext(); } - /** - * {@inheritdoc} - */ protected function createQueue(Context $context, $queueName) { return $context->createQueue($queueName.$this->time); } - /** - * {@inheritdoc} - */ protected function createTopic(Context $context, $topicName) { return $context->createTopic($topicName.$this->time); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php index cedc0dd48..58e8b71f4 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -18,9 +18,6 @@ protected function setUp(): void $this->time = time(); } - /** - * {@inheritdoc} - */ protected function createContext() { $factory = new PheanstalkConnectionFactory(getenv('BEANSTALKD_DSN')); @@ -28,17 +25,11 @@ protected function createContext() return $factory->createContext(); } - /** - * {@inheritdoc} - */ protected function createQueue(Context $context, $queueName) { return $context->createQueue($queueName.$this->time); } - /** - * {@inheritdoc} - */ protected function createTopic(Context $context, $topicName) { return $context->createTopic($topicName.$this->time); diff --git a/pkg/pheanstalk/Tests/Spec/PheanstalkTopicTest.php b/pkg/pheanstalk/Tests/Spec/PheanstalkTopicTest.php index d15d51083..4b0028261 100644 --- a/pkg/pheanstalk/Tests/Spec/PheanstalkTopicTest.php +++ b/pkg/pheanstalk/Tests/Spec/PheanstalkTopicTest.php @@ -7,9 +7,6 @@ class PheanstalkTopicTest extends TopicSpec { - /** - * {@inheritdoc} - */ protected function createTopic() { return new PheanstalkDestination(self::EXPECTED_TOPIC_NAME); diff --git a/pkg/rdkafka/JsonSerializer.php b/pkg/rdkafka/JsonSerializer.php index ae161ca08..1d25ea55e 100644 --- a/pkg/rdkafka/JsonSerializer.php +++ b/pkg/rdkafka/JsonSerializer.php @@ -14,12 +14,8 @@ public function toString(RdKafkaMessage $message): string 'headers' => $message->getHeaders(), ]); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $json; @@ -28,12 +24,8 @@ public function toString(RdKafkaMessage $message): string public function toMessage(string $string): RdKafkaMessage { $data = json_decode($string, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return new RdKafkaMessage($data['body'], $data['properties'], $data['headers']); diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index 7fbaef755..b1e9ad555 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -71,7 +71,7 @@ public function getOffset(): ?int return $this->offset; } - public function setOffset(int $offset = null): void + public function setOffset(?int $offset = null): void { if ($this->subscribed) { throw new \LogicException('The consumer has already subscribed.'); diff --git a/pkg/rdkafka/RdKafkaMessage.php b/pkg/rdkafka/RdKafkaMessage.php index 0785a5644..7c6d0d005 100644 --- a/pkg/rdkafka/RdKafkaMessage.php +++ b/pkg/rdkafka/RdKafkaMessage.php @@ -112,7 +112,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', (string) $correlationId); } @@ -122,7 +122,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', (string) $messageId); } @@ -139,12 +139,12 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -159,7 +159,7 @@ public function getPartition(): ?int return $this->partition; } - public function setPartition(int $partition = null): void + public function setPartition(?int $partition = null): void { $this->partition = $partition; } @@ -169,7 +169,7 @@ public function getKey(): ?string return $this->key; } - public function setKey(string $key = null): void + public function setKey(?string $key = null): void { $this->key = $key; } @@ -179,7 +179,7 @@ public function getKafkaMessage(): ?VendorMessage return $this->kafkaMessage; } - public function setKafkaMessage(VendorMessage $message = null): void + public function setKafkaMessage(?VendorMessage $message = null): void { $this->kafkaMessage = $message; } diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index 64b9ea3a7..8d0056d77 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -70,7 +70,7 @@ public function send(Destination $destination, Message $message): void /** * @return RdKafkaProducer */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $deliveryDelay) { return $this; @@ -87,7 +87,7 @@ public function getDeliveryDelay(): ?int /** * @return RdKafkaProducer */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (null === $priority) { return $this; @@ -101,7 +101,7 @@ public function getPriority(): ?int return null; } - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { if (null === $timeToLive) { return $this; diff --git a/pkg/rdkafka/RdKafkaTopic.php b/pkg/rdkafka/RdKafkaTopic.php index a7bde1021..572f4d024 100644 --- a/pkg/rdkafka/RdKafkaTopic.php +++ b/pkg/rdkafka/RdKafkaTopic.php @@ -50,7 +50,7 @@ public function getConf(): ?TopicConf return $this->conf; } - public function setConf(TopicConf $conf = null): void + public function setConf(?TopicConf $conf = null): void { $this->conf = $conf; } @@ -60,7 +60,7 @@ public function getPartition(): ?int return $this->partition; } - public function setPartition(int $partition = null): void + public function setPartition(?int $partition = null): void { $this->partition = $partition; } @@ -70,7 +70,7 @@ public function getKey(): ?string return $this->key; } - public function setKey(string $key = null): void + public function setKey(?string $key = null): void { $this->key = $key; } diff --git a/pkg/rdkafka/SerializerAwareTrait.php b/pkg/rdkafka/SerializerAwareTrait.php index d640f93cb..1cd1fac20 100644 --- a/pkg/rdkafka/SerializerAwareTrait.php +++ b/pkg/rdkafka/SerializerAwareTrait.php @@ -11,9 +11,6 @@ trait SerializerAwareTrait */ private $serializer; - /** - * @param Serializer $serializer - */ public function setSerializer(Serializer $serializer) { $this->serializer = $serializer; diff --git a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php index 0a50218bb..7ecb1bd7f 100644 --- a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryConfigTest.php @@ -33,9 +33,6 @@ public function testThrowIfSchemeIsNotSupported() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php index 62ccc7612..d7121da65 100644 --- a/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConnectionFactoryTest.php @@ -70,9 +70,6 @@ public function testShouldBeExpectedDefaultDsnConfig() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php index df54fa58b..9e230d1b6 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaMessageTest.php @@ -7,9 +7,6 @@ class RdKafkaMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new RdKafkaMessage(); diff --git a/pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php b/pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php index c5d43ee61..08d427883 100644 --- a/pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php +++ b/pkg/rdkafka/Tests/Spec/RdKafkaTopicTest.php @@ -7,9 +7,6 @@ class RdKafkaTopicTest extends TopicSpec { - /** - * {@inheritdoc} - */ protected function createTopic() { return new RdKafkaTopic(self::EXPECTED_TOPIC_NAME); diff --git a/pkg/rdkafka/Tests/bootstrap.php b/pkg/rdkafka/Tests/bootstrap.php index bf112623e..60f8101ef 100644 --- a/pkg/rdkafka/Tests/bootstrap.php +++ b/pkg/rdkafka/Tests/bootstrap.php @@ -8,7 +8,7 @@ if (false == file_exists($kafkaStubsDir)) { $kafkaStubsDir = __DIR__.'/../../../vendor/kwn/php-rdkafka-stubs'; if (false == file_exists($kafkaStubsDir)) { - throw new \LogicException('The kafka extension is not loaded and stubs could not be found as well'); + throw new LogicException('The kafka extension is not loaded and stubs could not be found as well'); } } diff --git a/pkg/redis/JsonSerializer.php b/pkg/redis/JsonSerializer.php index 7e064a221..ff67ed880 100644 --- a/pkg/redis/JsonSerializer.php +++ b/pkg/redis/JsonSerializer.php @@ -14,12 +14,8 @@ public function toString(RedisMessage $message): string 'headers' => $message->getHeaders(), ]); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $json; @@ -28,12 +24,8 @@ public function toString(RedisMessage $message): string public function toMessage(string $string): RedisMessage { $data = json_decode($string, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return new RedisMessage($data['body'], $data['properties'], $data['headers']); diff --git a/pkg/redis/PhpRedis.php b/pkg/redis/PhpRedis.php index d6f5baffa..1a229e3c9 100644 --- a/pkg/redis/PhpRedis.php +++ b/pkg/redis/PhpRedis.php @@ -96,18 +96,14 @@ public function connect(): void $supportedSchemes = ['redis', 'rediss', 'tcp', 'unix']; if (false == in_array($this->config['scheme'], $supportedSchemes, true)) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported by php extension. It must be one of "%s"', - $this->config['scheme'], - implode('", "', $supportedSchemes) - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported by php extension. It must be one of "%s"', $this->config['scheme'], implode('", "', $supportedSchemes))); } $this->redis = new \Redis(); $connectionMethod = $this->config['persistent'] ? 'pconnect' : 'connect'; - $host = $this->config['scheme'] === 'rediss' ? 'tls://' . $this->config['host'] : $this->config['host']; + $host = 'rediss' === $this->config['scheme'] ? 'tls://'.$this->config['host'] : $this->config['host']; $result = call_user_func( [$this->redis, $connectionMethod], diff --git a/pkg/redis/Redis.php b/pkg/redis/Redis.php index 362f5e8d0..04165af9d 100644 --- a/pkg/redis/Redis.php +++ b/pkg/redis/Redis.php @@ -7,41 +7,21 @@ interface Redis { /** - * @param string $script - * @param array $keys - * @param array $args - * * @throws ServerException - * - * @return mixed */ public function eval(string $script, array $keys = [], array $args = []); /** - * @param string $key - * @param string $value - * @param float $score - * * @throws ServerException - * - * @return int */ public function zadd(string $key, string $value, float $score): int; /** - * @param string $key - * @param string $value - * * @throws ServerException - * - * @return int */ public function zrem(string $key, string $value): int; /** - * @param string $key - * @param string $value - * * @throws ServerException * * @return int length of the list @@ -53,17 +33,11 @@ public function lpush(string $key, string $value): int; * @param int $timeout in seconds * * @throws ServerException - * - * @return RedisResult|null */ public function brpop(array $keys, int $timeout): ?RedisResult; /** - * @param string $key - * * @throws ServerException - * - * @return RedisResult|null */ public function rpop(string $key): ?RedisResult; @@ -75,8 +49,6 @@ public function connect(): void; public function disconnect(): void; /** - * @param string $key - * * @throws ServerException */ public function del(string $key): void; diff --git a/pkg/redis/RedisConsumer.php b/pkg/redis/RedisConsumer.php index 9c93b642a..ca3733d4b 100644 --- a/pkg/redis/RedisConsumer.php +++ b/pkg/redis/RedisConsumer.php @@ -34,9 +34,6 @@ public function __construct(RedisContext $context, RedisDestination $queue) $this->queue = $queue; } - /** - * @return int - */ public function getRedeliveryDelay(): ?int { return $this->redeliveryDelay; diff --git a/pkg/redis/RedisConsumerHelperTrait.php b/pkg/redis/RedisConsumerHelperTrait.php index 9939986ed..063ff1fbd 100644 --- a/pkg/redis/RedisConsumerHelperTrait.php +++ b/pkg/redis/RedisConsumerHelperTrait.php @@ -15,10 +15,6 @@ abstract protected function getContext(): RedisContext; /** * @param RedisDestination[] $queues - * @param int $timeout - * @param int $redeliveryDelay - * - * @return RedisMessage|null */ protected function receiveMessage(array $queues, int $timeout, int $redeliveryDelay): ?RedisMessage { diff --git a/pkg/redis/RedisContext.php b/pkg/redis/RedisContext.php index 344bb20c5..346375f8d 100644 --- a/pkg/redis/RedisContext.php +++ b/pkg/redis/RedisContext.php @@ -38,7 +38,6 @@ class RedisContext implements Context * Callable must return instance of Redis once called. * * @param Redis|callable $redis - * @param int $redeliveryDelay */ public function __construct($redis, int $redeliveryDelay) { @@ -47,11 +46,7 @@ public function __construct($redis, int $redeliveryDelay) } elseif (is_callable($redis)) { $this->redisFactory = $redis; } else { - throw new \InvalidArgumentException(sprintf( - 'The $redis argument must be either %s or callable that returns %s once called.', - Redis::class, - Redis::class - )); + throw new \InvalidArgumentException(sprintf('The $redis argument must be either %s or callable that returns %s once called.', Redis::class, Redis::class)); } $this->redeliveryDelay = $redeliveryDelay; @@ -159,11 +154,7 @@ public function getRedis(): Redis if (false == $this->redis) { $redis = call_user_func($this->redisFactory); if (false == $redis instanceof Redis) { - throw new \LogicException(sprintf( - 'The factory must return instance of %s. It returned %s', - Redis::class, - is_object($redis) ? get_class($redis) : gettype($redis) - )); + throw new \LogicException(sprintf('The factory must return instance of %s. It returned %s', Redis::class, is_object($redis) ? $redis::class : gettype($redis))); } $this->redis = $redis; diff --git a/pkg/redis/RedisMessage.php b/pkg/redis/RedisMessage.php index 74c65475a..708bdbc97 100644 --- a/pkg/redis/RedisMessage.php +++ b/pkg/redis/RedisMessage.php @@ -107,7 +107,7 @@ public function isRedelivered(): bool return $this->redelivered; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', $correlationId); } @@ -117,7 +117,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', $messageId); } @@ -134,12 +134,12 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -149,17 +149,11 @@ public function getReplyTo(): ?string return $this->getHeader('reply_to'); } - /** - * @return int - */ public function getAttempts(): int { return (int) $this->getHeader('attempts', 0); } - /** - * @return int - */ public function getTimeToLive(): ?int { return $this->getHeader('time_to_live'); @@ -168,7 +162,7 @@ public function getTimeToLive(): ?int /** * Set time to live in milliseconds. */ - public function setTimeToLive(int $timeToLive = null): void + public function setTimeToLive(?int $timeToLive = null): void { $this->setHeader('time_to_live', $timeToLive); } @@ -181,38 +175,26 @@ public function getDeliveryDelay(): ?int /** * Set delay in milliseconds. */ - public function setDeliveryDelay(int $deliveryDelay = null): void + public function setDeliveryDelay(?int $deliveryDelay = null): void { $this->setHeader('delivery_delay', $deliveryDelay); } - /** - * @return string - */ public function getReservedKey(): ?string { return $this->reservedKey; } - /** - * @param string $reservedKey - */ public function setReservedKey(string $reservedKey) { $this->reservedKey = $reservedKey; } - /** - * @return string - */ public function getKey(): ?string { return $this->key; } - /** - * @param string $key - */ public function setKey(string $key): void { $this->key = $key; diff --git a/pkg/redis/RedisProducer.php b/pkg/redis/RedisProducer.php index cc7d63230..3ad3e5bb2 100644 --- a/pkg/redis/RedisProducer.php +++ b/pkg/redis/RedisProducer.php @@ -29,9 +29,6 @@ class RedisProducer implements Producer */ private $deliveryDelay; - /** - * @param RedisContext $context - */ public function __construct(RedisContext $context) { $this->context = $context; @@ -74,7 +71,7 @@ public function send(Destination $destination, Message $message): void /** * @return self */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { $this->deliveryDelay = $deliveryDelay; @@ -89,7 +86,7 @@ public function getDeliveryDelay(): ?int /** * @return RedisProducer */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (null === $priority) { return $this; @@ -106,7 +103,7 @@ public function getPriority(): ?int /** * @return self */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->timeToLive = $timeToLive; diff --git a/pkg/redis/RedisSubscriptionConsumer.php b/pkg/redis/RedisSubscriptionConsumer.php index c59cab4da..d0b34634d 100644 --- a/pkg/redis/RedisSubscriptionConsumer.php +++ b/pkg/redis/RedisSubscriptionConsumer.php @@ -28,26 +28,17 @@ class RedisSubscriptionConsumer implements SubscriptionConsumer */ private $redeliveryDelay = 300; - /** - * @param RedisContext $context - */ public function __construct(RedisContext $context) { $this->context = $context; $this->subscribers = []; } - /** - * @return int - */ public function getRedeliveryDelay(): ?int { return $this->redeliveryDelay; } - /** - * @param int $delay - */ public function setRedeliveryDelay(int $delay): void { $this->redeliveryDelay = $delay; @@ -89,7 +80,7 @@ public function consume(int $timeout = 0): void public function subscribe(Consumer $consumer, callable $callback): void { if (false == $consumer instanceof RedisConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', RedisConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', RedisConsumer::class, $consumer::class)); } $queueName = $consumer->getQueue()->getQueueName(); @@ -111,7 +102,7 @@ public function subscribe(Consumer $consumer, callable $callback): void public function unsubscribe(Consumer $consumer): void { if (false == $consumer instanceof RedisConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', RedisConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', RedisConsumer::class, $consumer::class)); } $queueName = $consumer->getQueue()->getQueueName(); diff --git a/pkg/redis/SerializerAwareTrait.php b/pkg/redis/SerializerAwareTrait.php index 8d0fbe548..bcd94eed5 100644 --- a/pkg/redis/SerializerAwareTrait.php +++ b/pkg/redis/SerializerAwareTrait.php @@ -11,9 +11,6 @@ trait SerializerAwareTrait */ private $serializer; - /** - * @param Serializer $serializer - */ public function setSerializer(Serializer $serializer) { $this->serializer = $serializer; diff --git a/pkg/redis/Tests/Functional/CommonUseCasesTrait.php b/pkg/redis/Tests/Functional/CommonUseCasesTrait.php index b80ea9763..bdab87b31 100644 --- a/pkg/redis/Tests/Functional/CommonUseCasesTrait.php +++ b/pkg/redis/Tests/Functional/CommonUseCasesTrait.php @@ -91,7 +91,7 @@ public function testConsumerReceiveMessageWithZeroTimeout() $consumer = $this->getContext()->createConsumer($topic); - //guard + // guard $this->assertNull($consumer->receive(1000)); $message = $this->getContext()->createMessage(__METHOD__); diff --git a/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php b/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php index 87d97c289..9ac2a037b 100644 --- a/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PRedisCommonUseCasesTest.php @@ -32,9 +32,6 @@ protected function tearDown(): void $this->context->close(); } - /** - * {@inheritdoc} - */ protected function getContext() { return $this->context; diff --git a/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php b/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php index f68cf6129..e61cd1f0f 100644 --- a/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PRedisConsumptionUseCasesTest.php @@ -32,9 +32,6 @@ protected function tearDown(): void $this->context->close(); } - /** - * {@inheritdoc} - */ protected function getContext() { return $this->context; diff --git a/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php b/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php index af9140704..f36843ec9 100644 --- a/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PhpRedisCommonUseCasesTest.php @@ -32,9 +32,6 @@ protected function tearDown(): void $this->context->close(); } - /** - * {@inheritdoc} - */ protected function getContext() { return $this->context; diff --git a/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php b/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php index cd5023178..073c1aff9 100644 --- a/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php +++ b/pkg/redis/Tests/Functional/PhpRedisConsumptionUseCasesTest.php @@ -32,9 +32,6 @@ protected function tearDown(): void $this->context->close(); } - /** - * {@inheritdoc} - */ protected function getContext() { return $this->context; diff --git a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php index 88c8a94b9..37e831823 100644 --- a/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php +++ b/pkg/redis/Tests/RedisConnectionFactoryConfigTest.php @@ -53,9 +53,6 @@ public function testCouldBeCreatedWithRedisInstance() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/redis/Tests/Spec/JsonSerializerTest.php b/pkg/redis/Tests/Spec/JsonSerializerTest.php index 78a0aed86..a15859d35 100644 --- a/pkg/redis/Tests/Spec/JsonSerializerTest.php +++ b/pkg/redis/Tests/Spec/JsonSerializerTest.php @@ -37,7 +37,7 @@ public function testThrowIfFailedToEncodeMessageToJson() $resource = fopen(__FILE__, 'r'); - //guard + // guard $this->assertIsResource($resource); $message = new RedisMessage('theBody', ['aProp' => $resource]); diff --git a/pkg/redis/Tests/Spec/RedisConnectionFactoryTest.php b/pkg/redis/Tests/Spec/RedisConnectionFactoryTest.php index e086bccab..f15282f11 100644 --- a/pkg/redis/Tests/Spec/RedisConnectionFactoryTest.php +++ b/pkg/redis/Tests/Spec/RedisConnectionFactoryTest.php @@ -10,9 +10,6 @@ */ class RedisConnectionFactoryTest extends ConnectionFactorySpec { - /** - * {@inheritdoc} - */ protected function createConnectionFactory() { return new RedisConnectionFactory(); diff --git a/pkg/redis/Tests/Spec/RedisContextTest.php b/pkg/redis/Tests/Spec/RedisContextTest.php index 3377fb89b..4f48e24ae 100644 --- a/pkg/redis/Tests/Spec/RedisContextTest.php +++ b/pkg/redis/Tests/Spec/RedisContextTest.php @@ -13,9 +13,6 @@ class RedisContextTest extends ContextSpec { use RedisExtension; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildPhpRedisContext(); diff --git a/pkg/redis/Tests/Spec/RedisMessageTest.php b/pkg/redis/Tests/Spec/RedisMessageTest.php index bb8af845d..b0cc828e9 100644 --- a/pkg/redis/Tests/Spec/RedisMessageTest.php +++ b/pkg/redis/Tests/Spec/RedisMessageTest.php @@ -10,9 +10,6 @@ */ class RedisMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new RedisMessage(); diff --git a/pkg/redis/Tests/Spec/RedisProducerTest.php b/pkg/redis/Tests/Spec/RedisProducerTest.php index fa9fbfefb..3434820e9 100644 --- a/pkg/redis/Tests/Spec/RedisProducerTest.php +++ b/pkg/redis/Tests/Spec/RedisProducerTest.php @@ -13,9 +13,6 @@ class RedisProducerTest extends ProducerSpec { use RedisExtension; - /** - * {@inheritdoc} - */ protected function createProducer() { return $this->buildPhpRedisContext()->createProducer(); diff --git a/pkg/redis/Tests/Spec/RedisQueueTest.php b/pkg/redis/Tests/Spec/RedisQueueTest.php index ab7b9937b..a8cd3b442 100644 --- a/pkg/redis/Tests/Spec/RedisQueueTest.php +++ b/pkg/redis/Tests/Spec/RedisQueueTest.php @@ -10,9 +10,6 @@ */ class RedisQueueTest extends QueueSpec { - /** - * {@inheritdoc} - */ protected function createQueue() { return new RedisDestination(self::EXPECTED_QUEUE_NAME); diff --git a/pkg/redis/Tests/Spec/RedisRequeueMessageTest.php b/pkg/redis/Tests/Spec/RedisRequeueMessageTest.php index c84bc84b5..69bd2c6ef 100644 --- a/pkg/redis/Tests/Spec/RedisRequeueMessageTest.php +++ b/pkg/redis/Tests/Spec/RedisRequeueMessageTest.php @@ -13,9 +13,6 @@ class RedisRequeueMessageTest extends RequeueMessageSpec { use RedisExtension; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildPhpRedisContext(); diff --git a/pkg/redis/Tests/Spec/RedisSendToAndReceiveFromQueueTest.php b/pkg/redis/Tests/Spec/RedisSendToAndReceiveFromQueueTest.php index 5535d949a..7bb61ab5d 100644 --- a/pkg/redis/Tests/Spec/RedisSendToAndReceiveFromQueueTest.php +++ b/pkg/redis/Tests/Spec/RedisSendToAndReceiveFromQueueTest.php @@ -13,9 +13,6 @@ class RedisSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { use RedisExtension; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildPhpRedisContext(); diff --git a/pkg/redis/Tests/Spec/RedisSendToAndReceiveFromTopicTest.php b/pkg/redis/Tests/Spec/RedisSendToAndReceiveFromTopicTest.php index 2967ba977..37545f032 100644 --- a/pkg/redis/Tests/Spec/RedisSendToAndReceiveFromTopicTest.php +++ b/pkg/redis/Tests/Spec/RedisSendToAndReceiveFromTopicTest.php @@ -13,9 +13,6 @@ class RedisSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { use RedisExtension; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildPhpRedisContext(); diff --git a/pkg/redis/Tests/Spec/RedisSendToAndReceiveNoWaitFromQueueTest.php b/pkg/redis/Tests/Spec/RedisSendToAndReceiveNoWaitFromQueueTest.php index e03139f7e..01aea7ff1 100644 --- a/pkg/redis/Tests/Spec/RedisSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/redis/Tests/Spec/RedisSendToAndReceiveNoWaitFromQueueTest.php @@ -13,9 +13,6 @@ class RedisSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFro { use RedisExtension; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildPhpRedisContext(); diff --git a/pkg/redis/Tests/Spec/RedisSendToAndReceiveNoWaitFromTopicTest.php b/pkg/redis/Tests/Spec/RedisSendToAndReceiveNoWaitFromTopicTest.php index fe103234b..2c8fbac7a 100644 --- a/pkg/redis/Tests/Spec/RedisSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/redis/Tests/Spec/RedisSendToAndReceiveNoWaitFromTopicTest.php @@ -13,9 +13,6 @@ class RedisSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFro { use RedisExtension; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildPhpRedisContext(); diff --git a/pkg/redis/Tests/Spec/RedisSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php b/pkg/redis/Tests/Spec/RedisSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php index 16dbd8f98..78d33045f 100644 --- a/pkg/redis/Tests/Spec/RedisSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php +++ b/pkg/redis/Tests/Spec/RedisSubscriptionConsumerConsumeFromAllSubscribedQueuesTest.php @@ -18,8 +18,6 @@ class RedisSubscriptionConsumerConsumeFromAllSubscribedQueuesTest extends Subscr /** * @return RedisContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param RedisContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/redis/Tests/Spec/RedisSubscriptionConsumerConsumeUntilUnsubscribedTest.php b/pkg/redis/Tests/Spec/RedisSubscriptionConsumerConsumeUntilUnsubscribedTest.php index b227e3405..84872093b 100644 --- a/pkg/redis/Tests/Spec/RedisSubscriptionConsumerConsumeUntilUnsubscribedTest.php +++ b/pkg/redis/Tests/Spec/RedisSubscriptionConsumerConsumeUntilUnsubscribedTest.php @@ -18,8 +18,6 @@ class RedisSubscriptionConsumerConsumeUntilUnsubscribedTest extends Subscription /** * @return RedisContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param RedisContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/redis/Tests/Spec/RedisSubscriptionConsumerStopOnFalseTest.php b/pkg/redis/Tests/Spec/RedisSubscriptionConsumerStopOnFalseTest.php index 5a033a872..490d58eab 100644 --- a/pkg/redis/Tests/Spec/RedisSubscriptionConsumerStopOnFalseTest.php +++ b/pkg/redis/Tests/Spec/RedisSubscriptionConsumerStopOnFalseTest.php @@ -18,8 +18,6 @@ class RedisSubscriptionConsumerStopOnFalseTest extends SubscriptionConsumerStopO /** * @return RedisContext - * - * {@inheritdoc} */ protected function createContext() { @@ -28,8 +26,6 @@ protected function createContext() /** * @param RedisContext $context - * - * {@inheritdoc} */ protected function createQueue(Context $context, $queueName) { diff --git a/pkg/redis/Tests/Spec/RedisTopicTest.php b/pkg/redis/Tests/Spec/RedisTopicTest.php index 52001aa66..da94ffa1b 100644 --- a/pkg/redis/Tests/Spec/RedisTopicTest.php +++ b/pkg/redis/Tests/Spec/RedisTopicTest.php @@ -10,9 +10,6 @@ */ class RedisTopicTest extends TopicSpec { - /** - * {@inheritdoc} - */ protected function createTopic() { return new RedisDestination(self::EXPECTED_TOPIC_NAME); diff --git a/pkg/simple-client/SimpleClient.php b/pkg/simple-client/SimpleClient.php index 9158364b9..bbfd8b91b 100644 --- a/pkg/simple-client/SimpleClient.php +++ b/pkg/simple-client/SimpleClient.php @@ -114,10 +114,9 @@ final class SimpleClient * ] * ] * - * * @param string|array $config */ - public function __construct($config, LoggerInterface $logger = null) + public function __construct($config, ?LoggerInterface $logger = null) { if (is_string($config)) { $config = [ @@ -134,7 +133,7 @@ public function __construct($config, LoggerInterface $logger = null) /** * @param callable|Processor $processor */ - public function bindTopic(string $topic, $processor, string $processorName = null): void + public function bindTopic(string $topic, $processor, ?string $processorName = null): void { if (is_callable($processor)) { $processor = new CallbackProcessor($processor); @@ -144,7 +143,7 @@ public function bindTopic(string $topic, $processor, string $processorName = nul throw new \LogicException('The processor must be either callable or instance of Processor'); } - $processorName = $processorName ?: uniqid(get_class($processor)); + $processorName = $processorName ?: uniqid($processor::class); $this->driver->getRouteCollection()->add(new Route($topic, Route::TOPIC, $processorName)); $this->processorRegistry->add($processorName, $processor); @@ -153,7 +152,7 @@ public function bindTopic(string $topic, $processor, string $processorName = nul /** * @param callable|Processor $processor */ - public function bindCommand(string $command, $processor, string $processorName = null): void + public function bindCommand(string $command, $processor, ?string $processorName = null): void { if (is_callable($processor)) { $processor = new CallbackProcessor($processor); @@ -163,7 +162,7 @@ public function bindCommand(string $command, $processor, string $processorName = throw new \LogicException('The processor must be either callable or instance of Processor'); } - $processorName = $processorName ?: uniqid(get_class($processor)); + $processorName = $processorName ?: uniqid($processor::class); $this->driver->getRouteCollection()->add(new Route($command, Route::COMMAND, $processorName)); $this->processorRegistry->add($processorName, $processor); @@ -185,7 +184,7 @@ public function sendEvent(string $topic, $message): void $this->producer->sendEvent($topic, $message); } - public function consume(ExtensionInterface $runtimeExtension = null): void + public function consume(?ExtensionInterface $runtimeExtension = null): void { $this->setupBroker(); diff --git a/pkg/simple-client/Tests/Functional/SimpleClientTest.php b/pkg/simple-client/Tests/Functional/SimpleClientTest.php index 13320fb67..ce75457af 100644 --- a/pkg/simple-client/Tests/Functional/SimpleClientTest.php +++ b/pkg/simple-client/Tests/Functional/SimpleClientTest.php @@ -85,8 +85,6 @@ public function testShouldWorkWithStringDsnConstructorArgument() /** * @dataProvider transportConfigDataProvider - * - * @param mixed $config */ public function testSendEventWithOneSubscriber($config, string $timeLimit) { @@ -125,8 +123,6 @@ public function testSendEventWithOneSubscriber($config, string $timeLimit) /** * @dataProvider transportConfigDataProvider - * - * @param mixed $config */ public function testSendEventWithTwoSubscriber($config, string $timeLimit) { @@ -168,8 +164,6 @@ public function testSendEventWithTwoSubscriber($config, string $timeLimit) /** * @dataProvider transportConfigDataProvider - * - * @param mixed $config */ public function testSendCommand($config, string $timeLimit) { diff --git a/pkg/simple-client/Tests/fix_composer_json.php b/pkg/simple-client/Tests/fix_composer_json.php index f025f6081..01f73c95e 100644 --- a/pkg/simple-client/Tests/fix_composer_json.php +++ b/pkg/simple-client/Tests/fix_composer_json.php @@ -6,4 +6,4 @@ $composerJson['config']['platform']['ext-amqp'] = '1.9.3'; -file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, JSON_PRETTY_PRINT)); +file_put_contents(__DIR__.'/../composer.json', json_encode($composerJson, \JSON_PRETTY_PRINT)); diff --git a/pkg/sns/SnsClient.php b/pkg/sns/SnsClient.php index 91bce56eb..7c4a81693 100644 --- a/pkg/sns/SnsClient.php +++ b/pkg/sns/SnsClient.php @@ -140,6 +140,6 @@ private function resolveClient(): void } } - throw new \LogicException(sprintf('The input client must be an instance of "%s" or "%s" or a callable that returns one of those. Got "%s"', AwsSnsClient::class, MultiRegionClient::class, is_object($client) ? get_class($client) : gettype($client))); + throw new \LogicException(sprintf('The input client must be an instance of "%s" or "%s" or a callable that returns one of those. Got "%s"', AwsSnsClient::class, MultiRegionClient::class, is_object($client) ? $client::class : gettype($client))); } } diff --git a/pkg/sns/SnsDestination.php b/pkg/sns/SnsDestination.php index 5823fd91e..adcb08f43 100644 --- a/pkg/sns/SnsDestination.php +++ b/pkg/sns/SnsDestination.php @@ -34,7 +34,7 @@ public function getTopicName(): string /** * The policy that defines who can access your topic. By default, only the topic owner can publish or subscribe to the topic. */ - public function setPolicy(string $policy = null): void + public function setPolicy(?string $policy = null): void { $this->setAttribute('Policy', $policy); } @@ -47,7 +47,7 @@ public function getPolicy(): ?string /** * The display name to use for a topic with SMS subscriptions. */ - public function setDisplayName(string $displayName = null): void + public function setDisplayName(?string $displayName = null): void { $this->setAttribute('DisplayName', $displayName); } @@ -60,7 +60,7 @@ public function getDisplayName(): ?string /** * The display name to use for a topic with SMS subscriptions. */ - public function setDeliveryPolicy(int $deliveryPolicy = null): void + public function setDeliveryPolicy(?int $deliveryPolicy = null): void { $this->setAttribute('DeliveryPolicy', $deliveryPolicy); } diff --git a/pkg/sns/SnsMessage.php b/pkg/sns/SnsMessage.php index 43c85e553..4122209e8 100644 --- a/pkg/sns/SnsMessage.php +++ b/pkg/sns/SnsMessage.php @@ -63,11 +63,11 @@ public function __construct( string $body = '', array $properties = [], array $headers = [], - array $messageAttributes = null, - string $messageStructure = null, - string $phoneNumber = null, - string $subject = null, - string $targetArn = null + ?array $messageAttributes = null, + ?string $messageStructure = null, + ?string $phoneNumber = null, + ?string $subject = null, + ?string $targetArn = null, ) { $this->body = $body; $this->properties = $properties; @@ -192,7 +192,7 @@ public function setTargetArn(?string $targetArn): void * of each user is processed in a FIFO fashion. * For more information, see: https://docs.aws.amazon.com/sns/latest/dg/fifo-message-grouping.html */ - public function setMessageGroupId(string $id = null): void + public function setMessageGroupId(?string $id = null): void { $this->messageGroupId = $id; } @@ -210,7 +210,7 @@ public function getMessageGroupId(): ?string * aren't delivered during the 5-minute deduplication interval. * For more information, see https://docs.aws.amazon.com/sns/latest/dg/fifo-message-dedup.html */ - public function setMessageDeduplicationId(string $id = null): void + public function setMessageDeduplicationId(?string $id = null): void { $this->messageDeduplicationId = $id; } diff --git a/pkg/sns/SnsProducer.php b/pkg/sns/SnsProducer.php index bbd46a96f..ac7e38b5b 100644 --- a/pkg/sns/SnsProducer.php +++ b/pkg/sns/SnsProducer.php @@ -99,7 +99,7 @@ public function send(Destination $destination, Message $message): void * * @return SnsProducer */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $deliveryDelay) { return $this; @@ -118,7 +118,7 @@ public function getDeliveryDelay(): ?int * * @return SnsProducer */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (null === $priority) { return $this; @@ -137,7 +137,7 @@ public function getPriority(): ?int * * @return SnsProducer */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { if (null === $timeToLive) { return $this; diff --git a/pkg/sns/SnsSubscribe.php b/pkg/sns/SnsSubscribe.php index 70addb7e0..52991d81f 100644 --- a/pkg/sns/SnsSubscribe.php +++ b/pkg/sns/SnsSubscribe.php @@ -6,7 +6,7 @@ class SnsSubscribe { - const PROTOCOL_SQS = 'sqs'; + public const PROTOCOL_SQS = 'sqs'; /** * @var SnsDestination @@ -23,14 +23,8 @@ class SnsSubscribe */ private $protocol; - /** - * @var - */ private $returnSubscriptionArn; - /** - * @var - */ private $attributes; public function __construct( @@ -38,7 +32,7 @@ public function __construct( string $endpoint, string $protocol, bool $returnSubscriptionArn = false, - array $attributes = [] + array $attributes = [], ) { $this->topic = $topic; $this->endpoint = $endpoint; diff --git a/pkg/sns/SnsUnsubscribe.php b/pkg/sns/SnsUnsubscribe.php index cd5733651..ad6b93d45 100644 --- a/pkg/sns/SnsUnsubscribe.php +++ b/pkg/sns/SnsUnsubscribe.php @@ -24,7 +24,7 @@ class SnsUnsubscribe public function __construct( SnsDestination $topic, string $endpoint, - string $protocol + string $protocol, ) { $this->topic = $topic; $this->endpoint = $endpoint; diff --git a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php index de32d4265..305a6518d 100644 --- a/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php +++ b/pkg/sns/Tests/SnsConnectionFactoryConfigTest.php @@ -41,9 +41,6 @@ public function testThrowIfDsnCouldNotBeParsed() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/sns/examples/consume.php b/pkg/sns/examples/consume.php index 7976e7501..6698cd21e 100644 --- a/pkg/sns/examples/consume.php +++ b/pkg/sns/examples/consume.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\Sns\SnsConnectionFactory; @@ -26,7 +26,7 @@ while (true) { if ($m = $consumer->receive(20000)) { $consumer->acknowledge($m); - echo 'Received message: '.$m->getBody().PHP_EOL; + echo 'Received message: '.$m->getBody().\PHP_EOL; } } diff --git a/pkg/sns/examples/produce.php b/pkg/sns/examples/produce.php index d37fce79f..3e59c5232 100644 --- a/pkg/sns/examples/produce.php +++ b/pkg/sns/examples/produce.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\Sns\SnsConnectionFactory; diff --git a/pkg/snsqs/SnsQsConnectionFactory.php b/pkg/snsqs/SnsQsConnectionFactory.php index abb154a9b..65812beb3 100644 --- a/pkg/snsqs/SnsQsConnectionFactory.php +++ b/pkg/snsqs/SnsQsConnectionFactory.php @@ -83,10 +83,7 @@ private function parseDsn(string $dsn): void $dsn = Dsn::parseFirst($dsn); if ('snsqs' !== $dsn->getSchemeProtocol()) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be "snsqs"', - $dsn->getSchemeProtocol() - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be "snsqs"', $dsn->getSchemeProtocol())); } $this->parseOptions($dsn->getQuery()); diff --git a/pkg/snsqs/SnsQsConsumer.php b/pkg/snsqs/SnsQsConsumer.php index 17ec39ae0..45237d145 100644 --- a/pkg/snsqs/SnsQsConsumer.php +++ b/pkg/snsqs/SnsQsConsumer.php @@ -44,7 +44,7 @@ public function getVisibilityTimeout(): ?int * The duration (in seconds) that the received messages are hidden from subsequent retrieve * requests after being retrieved by a ReceiveMessage request. */ - public function setVisibilityTimeout(int $visibilityTimeout = null): void + public function setVisibilityTimeout(?int $visibilityTimeout = null): void { $this->consumer->setVisibilityTimeout($visibilityTimeout); } diff --git a/pkg/snsqs/SnsQsContext.php b/pkg/snsqs/SnsQsContext.php index 4a7121681..d26a0fc6d 100644 --- a/pkg/snsqs/SnsQsContext.php +++ b/pkg/snsqs/SnsQsContext.php @@ -189,7 +189,7 @@ private function getSnsContext(): SnsContext if (null === $this->snsContext) { $context = call_user_func($this->snsContextFactory); if (false == $context instanceof SnsContext) { - throw new \LogicException(sprintf('The factory must return instance of %s. It returned %s', SnsContext::class, is_object($context) ? get_class($context) : gettype($context))); + throw new \LogicException(sprintf('The factory must return instance of %s. It returned %s', SnsContext::class, is_object($context) ? $context::class : gettype($context))); } $this->snsContext = $context; @@ -203,7 +203,7 @@ private function getSqsContext(): SqsContext if (null === $this->sqsContext) { $context = call_user_func($this->sqsContextFactory); if (false == $context instanceof SqsContext) { - throw new \LogicException(sprintf('The factory must return instance of %s. It returned %s', SqsContext::class, is_object($context) ? get_class($context) : gettype($context))); + throw new \LogicException(sprintf('The factory must return instance of %s. It returned %s', SqsContext::class, is_object($context) ? $context::class : gettype($context))); } $this->sqsContext = $context; diff --git a/pkg/snsqs/SnsQsMessage.php b/pkg/snsqs/SnsQsMessage.php index c804b1860..900ad9125 100644 --- a/pkg/snsqs/SnsQsMessage.php +++ b/pkg/snsqs/SnsQsMessage.php @@ -41,7 +41,7 @@ public function __construct( string $body = '', array $properties = [], array $headers = [], - array $messageAttributes = null + ?array $messageAttributes = null, ) { $this->body = $body; $this->properties = $properties; @@ -77,7 +77,7 @@ public function setMessageAttributes(?array $messageAttributes): void * any messages sent with the same MessageDeduplicationId are accepted successfully but aren't delivered during the 5-minute * deduplication interval. For more information, see http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing. */ - public function setMessageDeduplicationId(string $id = null): void + public function setMessageDeduplicationId(?string $id = null): void { $this->messageDeduplicationId = $id; } @@ -96,7 +96,7 @@ public function getMessageDeduplicationId(): ?string * for multiple users). In this scenario, multiple readers can process the queue, but the session data * of each user is processed in a FIFO fashion. */ - public function setMessageGroupId(string $id = null): void + public function setMessageGroupId(?string $id = null): void { $this->messageGroupId = $id; } diff --git a/pkg/snsqs/SnsQsProducer.php b/pkg/snsqs/SnsQsProducer.php index 6bc66e8f8..a80e1eb2b 100644 --- a/pkg/snsqs/SnsQsProducer.php +++ b/pkg/snsqs/SnsQsProducer.php @@ -51,7 +51,7 @@ public function send(Destination $destination, Message $message): void InvalidMessageException::assertMessageInstanceOf($message, SnsQsMessage::class); if (false == $destination instanceof SnsQsTopic && false == $destination instanceof SnsQsQueue) { - throw new InvalidDestinationException(sprintf('The destination must be an instance of [%s|%s] but got %s.', SnsQsTopic::class, SnsQsQueue::class, is_object($destination) ? get_class($destination) : gettype($destination))); + throw new InvalidDestinationException(sprintf('The destination must be an instance of [%s|%s] but got %s.', SnsQsTopic::class, SnsQsQueue::class, is_object($destination) ? $destination::class : gettype($destination))); } if ($destination instanceof SnsQsTopic) { @@ -82,7 +82,7 @@ public function send(Destination $destination, Message $message): void /** * Delivery delay is supported by SQSProducer. */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { $this->getSqsProducer()->setDeliveryDelay($deliveryDelay); @@ -97,7 +97,7 @@ public function getDeliveryDelay(): ?int return $this->getSqsProducer()->getDeliveryDelay(); } - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { $this->getSnsProducer()->setPriority($priority); $this->getSqsProducer()->setPriority($priority); @@ -110,7 +110,7 @@ public function getPriority(): ?int return $this->getSnsProducer()->getPriority(); } - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { $this->getSnsProducer()->setTimeToLive($timeToLive); $this->getSqsProducer()->setTimeToLive($timeToLive); diff --git a/pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php b/pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php index efc4a7046..e314c2667 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php +++ b/pkg/snsqs/Tests/Spec/SnsQsFactoryTrait.php @@ -33,7 +33,7 @@ protected function createSnsQsContext(): SnsQsContext protected function createSnsQsQueue(string $queueName): SnsQsQueue { - $queueName = $queueName.time(); + $queueName .= time(); $this->snsQsQueue = $this->snsQsContext->createQueue($queueName); $this->snsQsContext->declareQueue($this->snsQsQueue); @@ -47,7 +47,7 @@ protected function createSnsQsQueue(string $queueName): SnsQsQueue protected function createSnsQsTopic(string $topicName): SnsQsTopic { - $topicName = $topicName.time(); + $topicName .= time(); $this->snsQsTopic = $this->snsQsContext->createTopic($topicName); $this->snsQsContext->declareTopic($this->snsQsTopic); diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php index ed199180d..707cab529 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveFromQueueTest.php @@ -8,6 +8,7 @@ /** * @group functional + * * @retry 5 */ class SnsQsSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php index 53ae719b2..652766de4 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToAndReceiveNoWaitFromQueueTest.php @@ -8,6 +8,7 @@ /** * @group functional + * * @retry 5 */ class SnsQsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec diff --git a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php index 24206c9d8..4a5869d63 100644 --- a/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php +++ b/pkg/snsqs/Tests/Spec/SnsQsSendToTopicAndReceiveFromQueueSpec.php @@ -8,6 +8,7 @@ /** * @group functional + * * @retry 5 */ class SnsQsSendToTopicAndReceiveFromQueueSpec extends SendToTopicAndReceiveFromQueueSpec diff --git a/pkg/snsqs/examples/consumer.php b/pkg/snsqs/examples/consumer.php index a5303b9ea..37f193925 100644 --- a/pkg/snsqs/examples/consumer.php +++ b/pkg/snsqs/examples/consumer.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\SnsQs\SnsQsConnectionFactory; @@ -34,7 +34,7 @@ while (true) { if ($m = $consumer->receive(20000)) { $consumer->acknowledge($m); - echo 'Received message: '.$m->getBody().' '.json_encode($m->getHeaders()).' '.json_encode($m->getProperties()).PHP_EOL; + echo 'Received message: '.$m->getBody().' '.json_encode($m->getHeaders()).' '.json_encode($m->getProperties()).\PHP_EOL; } } echo 'Done'."\n"; diff --git a/pkg/snsqs/examples/produce.php b/pkg/snsqs/examples/produce.php index 0396d9cd0..53018d769 100644 --- a/pkg/snsqs/examples/produce.php +++ b/pkg/snsqs/examples/produce.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\SnsQs\SnsQsConnectionFactory; @@ -33,7 +33,7 @@ while (true) { $context->createProducer()->send($topic, $message); - echo 'Sent message: '.$message->getBody().PHP_EOL; + echo 'Sent message: '.$message->getBody().\PHP_EOL; sleep(1); } diff --git a/pkg/sqs/SqsClient.php b/pkg/sqs/SqsClient.php index 0d61584bf..bba2a5760 100644 --- a/pkg/sqs/SqsClient.php +++ b/pkg/sqs/SqsClient.php @@ -148,11 +148,6 @@ private function resolveClient(): void } } - throw new \LogicException(sprintf( - 'The input client must be an instance of "%s" or "%s" or a callable that returns one of those. Got "%s"', - AwsSqsClient::class, - MultiRegionClient::class, - is_object($client) ? get_class($client) : gettype($client) - )); + throw new \LogicException(sprintf('The input client must be an instance of "%s" or "%s" or a callable that returns one of those. Got "%s"', AwsSqsClient::class, MultiRegionClient::class, is_object($client) ? $client::class : gettype($client))); } } diff --git a/pkg/sqs/SqsConsumer.php b/pkg/sqs/SqsConsumer.php index 04d5bbd81..860bc648b 100644 --- a/pkg/sqs/SqsConsumer.php +++ b/pkg/sqs/SqsConsumer.php @@ -53,7 +53,7 @@ public function getVisibilityTimeout(): ?int * The duration (in seconds) that the received messages are hidden from subsequent retrieve * requests after being retrieved by a ReceiveMessage request. */ - public function setVisibilityTimeout(int $visibilityTimeout = null): void + public function setVisibilityTimeout(?int $visibilityTimeout = null): void { $this->visibilityTimeout = $visibilityTimeout; } diff --git a/pkg/sqs/SqsContext.php b/pkg/sqs/SqsContext.php index 60906f72f..65f12ae89 100644 --- a/pkg/sqs/SqsContext.php +++ b/pkg/sqs/SqsContext.php @@ -134,7 +134,7 @@ public function getSqsClient(): SqsClient */ public function getClient(): AwsSqsClient { - @trigger_error('The method is deprecated since 0.9.2. SqsContext::getAwsSqsClient() method should be used.', E_USER_DEPRECATED); + @trigger_error('The method is deprecated since 0.9.2. SqsContext::getAwsSqsClient() method should be used.', \E_USER_DEPRECATED); return $this->getAwsSqsClient(); } diff --git a/pkg/sqs/SqsDestination.php b/pkg/sqs/SqsDestination.php index 5649d30a3..d77966f15 100644 --- a/pkg/sqs/SqsDestination.php +++ b/pkg/sqs/SqsDestination.php @@ -62,7 +62,7 @@ public function getAttributes(): array * The number of seconds for which the delivery of all messages in the queue is delayed. * Valid values: An integer from 0 to 900 seconds (15 minutes). The default is 0 (zero). */ - public function setDelaySeconds(int $seconds = null): void + public function setDelaySeconds(?int $seconds = null): void { if (null == $seconds) { unset($this->attributes['DelaySeconds']); @@ -76,7 +76,7 @@ public function setDelaySeconds(int $seconds = null): void * Valid values: An integer from 1,024 bytes (1 KiB) to 262,144 bytes (256 KiB). * The default is 262,144 (256 KiB). */ - public function setMaximumMessageSize(int $bytes = null): void + public function setMaximumMessageSize(?int $bytes = null): void { if (null == $bytes) { unset($this->attributes['MaximumMessageSize']); @@ -90,7 +90,7 @@ public function setMaximumMessageSize(int $bytes = null): void * Valid values: An integer from 60 seconds (1 minute) to 1,209,600 seconds (14 days). * The default is 345,600 (4 days). */ - public function setMessageRetentionPeriod(int $seconds = null): void + public function setMessageRetentionPeriod(?int $seconds = null): void { if (null == $seconds) { unset($this->attributes['MessageRetentionPeriod']); @@ -103,7 +103,7 @@ public function setMessageRetentionPeriod(int $seconds = null): void * The queue's policy. A valid AWS policy. For more information about policy structure, * see http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html. */ - public function setPolicy(string $policy = null): void + public function setPolicy(?string $policy = null): void { if (null == $policy) { unset($this->attributes['Policy']); @@ -116,7 +116,7 @@ public function setPolicy(string $policy = null): void * The number of seconds for which a ReceiveMessage action waits for a message to arrive. * Valid values: An integer from 0 to 20 (seconds). The default is 0 (zero). */ - public function setReceiveMessageWaitTimeSeconds(int $seconds = null): void + public function setReceiveMessageWaitTimeSeconds(?int $seconds = null): void { if (null == $seconds) { unset($this->attributes['ReceiveMessageWaitTimeSeconds']); @@ -145,7 +145,7 @@ public function setRedrivePolicy(int $maxReceiveCount, string $deadLetterTargetA * The default is 30. For more information about the visibility timeout, * see http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html. */ - public function setVisibilityTimeout(int $seconds = null): void + public function setVisibilityTimeout(?int $seconds = null): void { if (null == $seconds) { unset($this->attributes['VisibilityTimeout']); @@ -208,7 +208,7 @@ public function setQueueOwnerAWSAccountId(?string $queueOwnerAWSAccountId): void $this->queueOwnerAWSAccountId = $queueOwnerAWSAccountId; } - public function setRegion(string $region = null): void + public function setRegion(?string $region = null): void { $this->region = $region; } diff --git a/pkg/sqs/SqsMessage.php b/pkg/sqs/SqsMessage.php index cd2b1bdfe..772c3e217 100644 --- a/pkg/sqs/SqsMessage.php +++ b/pkg/sqs/SqsMessage.php @@ -144,7 +144,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply_to', $replyTo); } @@ -154,7 +154,7 @@ public function getReplyTo(): ?string return $this->getHeader('reply_to'); } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', $correlationId); } @@ -164,7 +164,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', $messageId); } @@ -181,7 +181,7 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } @@ -211,7 +211,7 @@ public function getDelaySeconds(): int * any messages sent with the same MessageDeduplicationId are accepted successfully but aren't delivered during the 5-minute * deduplication interval. For more information, see http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing. */ - public function setMessageDeduplicationId(string $id = null): void + public function setMessageDeduplicationId(?string $id = null): void { $this->messageDeduplicationId = $id; } @@ -230,7 +230,7 @@ public function getMessageDeduplicationId(): ?string * for multiple users). In this scenario, multiple readers can process the queue, but the session data * of each user is processed in a FIFO fashion. */ - public function setMessageGroupId(string $id = null): void + public function setMessageGroupId(?string $id = null): void { $this->messageGroupId = $id; } @@ -247,7 +247,7 @@ public function getMessageGroupId(): ?string * If you receive a message more than once, each time you receive it, you get a different receipt handle. * You must provide the most recently received receipt handle when you request to delete the message (otherwise, the message might not be deleted). */ - public function setReceiptHandle(string $receipt = null): void + public function setReceiptHandle(?string $receipt = null): void { $this->receiptHandle = $receipt; } diff --git a/pkg/sqs/SqsProducer.php b/pkg/sqs/SqsProducer.php index 98c133acc..2e43d8370 100644 --- a/pkg/sqs/SqsProducer.php +++ b/pkg/sqs/SqsProducer.php @@ -81,7 +81,7 @@ public function send(Destination $destination, Message $message): void /** * @return SqsProducer */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { $this->deliveryDelay = $deliveryDelay; @@ -96,7 +96,7 @@ public function getDeliveryDelay(): ?int /** * @return SqsProducer */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (null === $priority) { return $this; @@ -113,7 +113,7 @@ public function getPriority(): ?int /** * @return SqsProducer */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { if (null === $timeToLive) { return $this; diff --git a/pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php b/pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php index 79af8208e..3af2a5129 100644 --- a/pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php +++ b/pkg/sqs/Tests/Spec/CreateSqsQueueTrait.php @@ -11,7 +11,7 @@ trait CreateSqsQueueTrait protected function createSqsQueue(SqsContext $context, string $queueName): SqsDestination { - $queueName = $queueName.time(); + $queueName .= time(); $this->queue = $context->createQueue($queueName); $context->declareQueue($this->queue); diff --git a/pkg/sqs/Tests/Spec/SqsMessageTest.php b/pkg/sqs/Tests/Spec/SqsMessageTest.php index 9007df099..994fe5be5 100644 --- a/pkg/sqs/Tests/Spec/SqsMessageTest.php +++ b/pkg/sqs/Tests/Spec/SqsMessageTest.php @@ -7,9 +7,6 @@ class SqsMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new SqsMessage(); diff --git a/pkg/sqs/Tests/Spec/SqsProducerTest.php b/pkg/sqs/Tests/Spec/SqsProducerTest.php index c241a2165..f0e5c8b06 100644 --- a/pkg/sqs/Tests/Spec/SqsProducerTest.php +++ b/pkg/sqs/Tests/Spec/SqsProducerTest.php @@ -12,9 +12,6 @@ class SqsProducerTest extends ProducerSpec { use SqsExtension; - /** - * {@inheritdoc} - */ protected function createProducer() { return $this->buildSqsContext()->createProducer(); diff --git a/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php index 357ed93eb..40f20d68f 100644 --- a/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendAndReceiveDelayedMessageFromQueueTest.php @@ -11,13 +11,14 @@ /** * @group functional + * * @retry 5 */ class SqsSendAndReceiveDelayedMessageFromQueueTest extends SendAndReceiveDelayedMessageFromQueueSpec { + use CreateSqsQueueTrait; use RetryTrait; use SqsExtension; - use CreateSqsQueueTrait; /** * @var SqsContext diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php index 802d887ac..db698017d 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromQueueTest.php @@ -11,13 +11,14 @@ /** * @group functional + * * @retry 5 */ class SqsSendToAndReceiveFromQueueTest extends SendToAndReceiveFromQueueSpec { + use CreateSqsQueueTrait; use RetryTrait; use SqsExtension; - use CreateSqsQueueTrait; /** * @var SqsContext diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php index ac57818aa..5cd14468a 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveFromTopicTest.php @@ -11,13 +11,14 @@ /** * @group functional + * * @retry 5 */ class SqsSendToAndReceiveFromTopicTest extends SendToAndReceiveFromTopicSpec { - use SqsExtension; - use RetryTrait; use CreateSqsQueueTrait; + use RetryTrait; + use SqsExtension; /** * @var SqsContext diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php index 3f03006d9..7e31a25a4 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromQueueTest.php @@ -11,13 +11,14 @@ /** * @group functional + * * @retry 5 */ class SqsSendToAndReceiveNoWaitFromQueueTest extends SendToAndReceiveNoWaitFromQueueSpec { + use CreateSqsQueueTrait; use RetryTrait; use SqsExtension; - use CreateSqsQueueTrait; /** * @var SqsContext diff --git a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php index 12a3c0c6e..34f2e75dd 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToAndReceiveNoWaitFromTopicTest.php @@ -11,13 +11,14 @@ /** * @group functional + * * @retry 5 */ class SqsSendToAndReceiveNoWaitFromTopicTest extends SendToAndReceiveNoWaitFromTopicSpec { + use CreateSqsQueueTrait; use RetryTrait; use SqsExtension; - use CreateSqsQueueTrait; /** * @var SqsContext diff --git a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php index 519db1be5..b8e60aee9 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveFromQueueTest.php @@ -11,13 +11,14 @@ /** * @group functional + * * @retry 5 */ class SqsSendToTopicAndReceiveFromQueueTest extends SendToTopicAndReceiveFromQueueSpec { + use CreateSqsQueueTrait; use RetryTrait; use SqsExtension; - use CreateSqsQueueTrait; /** * @var SqsContext diff --git a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php index 317d7297c..e5520e01f 100644 --- a/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php +++ b/pkg/sqs/Tests/Spec/SqsSendToTopicAndReceiveNoWaitFromQueueTest.php @@ -11,13 +11,14 @@ /** * @group functional + * * @retry 5 */ class SqsSendToTopicAndReceiveNoWaitFromQueueTest extends SendToTopicAndReceiveNoWaitFromQueueSpec { + use CreateSqsQueueTrait; use RetryTrait; use SqsExtension; - use CreateSqsQueueTrait; /** * @var SqsContext diff --git a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php index 6fa9298be..c7a954b0f 100644 --- a/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php +++ b/pkg/sqs/Tests/SqsConnectionFactoryConfigTest.php @@ -41,9 +41,6 @@ public function testThrowIfDsnCouldNotBeParsed() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/sqs/examples/consume.php b/pkg/sqs/examples/consume.php index 9c5eaa12f..d82274d80 100644 --- a/pkg/sqs/examples/consume.php +++ b/pkg/sqs/examples/consume.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\Sqs\SqsConnectionFactory; @@ -26,7 +26,7 @@ while (true) { if ($m = $consumer->receive(20000)) { $consumer->acknowledge($m); - echo 'Received message: '.$m->getBody().PHP_EOL; + echo 'Received message: '.$m->getBody().\PHP_EOL; } } diff --git a/pkg/sqs/examples/produce.php b/pkg/sqs/examples/produce.php index ba35c84c1..a9ba3e3b7 100644 --- a/pkg/sqs/examples/produce.php +++ b/pkg/sqs/examples/produce.php @@ -12,7 +12,7 @@ if ($autoload) { require_once $autoload; } else { - throw new \LogicException('Composer autoload was not found'); + throw new LogicException('Composer autoload was not found'); } use Enqueue\Sqs\SqsConnectionFactory; @@ -27,7 +27,7 @@ while (true) { $context->createProducer()->send($queue, $message); - echo 'Sent message: '.$message->getBody().PHP_EOL; + echo 'Sent message: '.$message->getBody().\PHP_EOL; sleep(1); } diff --git a/pkg/stomp/BufferedStompClient.php b/pkg/stomp/BufferedStompClient.php index 5feb88fae..e2c54d731 100644 --- a/pkg/stomp/BufferedStompClient.php +++ b/pkg/stomp/BufferedStompClient.php @@ -103,9 +103,6 @@ public function readMessageFrame(string $subscriptionId, int $timeout): ?Frame } } - /** - * {@inheritdoc} - */ public function disconnect($sync = false) { parent::disconnect($sync); diff --git a/pkg/stomp/ExtensionType.php b/pkg/stomp/ExtensionType.php index 37c248feb..c1c265f68 100644 --- a/pkg/stomp/ExtensionType.php +++ b/pkg/stomp/ExtensionType.php @@ -6,7 +6,7 @@ class ExtensionType { - const ACTIVEMQ = 'activemq'; - const RABBITMQ = 'rabbitmq'; - const ARTEMIS = 'artemis'; + public const ACTIVEMQ = 'activemq'; + public const RABBITMQ = 'rabbitmq'; + public const ARTEMIS = 'artemis'; } diff --git a/pkg/stomp/StompConnectionFactory.php b/pkg/stomp/StompConnectionFactory.php index 9110911bc..da9c6f9bd 100644 --- a/pkg/stomp/StompConnectionFactory.php +++ b/pkg/stomp/StompConnectionFactory.php @@ -13,7 +13,7 @@ class StompConnectionFactory implements ConnectionFactory { - const SUPPORTED_SCHEMES = [ + public const SUPPORTED_SCHEMES = [ ExtensionType::ACTIVEMQ, ExtensionType::RABBITMQ, ExtensionType::ARTEMIS, @@ -120,7 +120,7 @@ private function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if ('stomp' !== $dsn->getSchemeProtocol()) { - throw new \LogicException(sprintf('The given DSN is not supported. Must start with "stomp:".')); + throw new \LogicException('The given DSN is not supported. Must start with "stomp:".'); } $schemeExtension = current($dsn->getSchemeExtensions()); diff --git a/pkg/stomp/StompConsumer.php b/pkg/stomp/StompConsumer.php index e1fe80f7d..5a80be890 100644 --- a/pkg/stomp/StompConsumer.php +++ b/pkg/stomp/StompConsumer.php @@ -15,9 +15,9 @@ class StompConsumer implements Consumer { - const ACK_AUTO = 'auto'; - const ACK_CLIENT = 'client'; - const ACK_CLIENT_INDIVIDUAL = 'client-individual'; + public const ACK_AUTO = 'auto'; + public const ACK_CLIENT = 'client'; + public const ACK_CLIENT_INDIVIDUAL = 'client-individual'; /** * @var StompDestination diff --git a/pkg/stomp/StompContext.php b/pkg/stomp/StompContext.php index c71277e65..1e77f88ee 100644 --- a/pkg/stomp/StompContext.php +++ b/pkg/stomp/StompContext.php @@ -74,7 +74,7 @@ public function createMessage(string $body = '', array $properties = [], array $ */ public function createQueue(string $name): Queue { - if (0 !== strpos($name, '/')) { + if (!str_starts_with($name, '/')) { $destination = new StompDestination($this->extensionType); $destination->setType(StompDestination::TYPE_QUEUE); $destination->setStompName($name); @@ -101,7 +101,7 @@ public function createTemporaryQueue(): Queue */ public function createTopic(string $name): Topic { - if (0 !== strpos($name, '/')) { + if (!str_starts_with($name, '/')) { $destination = new StompDestination($this->extensionType); $destination->setType($this->useExchangePrefix ? StompDestination::TYPE_EXCHANGE : StompDestination::TYPE_TOPIC); $destination->setStompName($name); @@ -130,7 +130,7 @@ public function createDestination(string $destination): StompDestination foreach ($types as $_type) { $typePrefix = '/'.$_type.'/'; - if (0 === strpos($dest, $typePrefix)) { + if (str_starts_with($dest, $typePrefix)) { $type = $_type; $dest = substr($dest, strlen($typePrefix)); @@ -225,7 +225,7 @@ private function createStomp(): BufferedStompClient $stomp = call_user_func($this->stompFactory); if (false == $stomp instanceof BufferedStompClient) { - throw new \LogicException(sprintf('The factory must return instance of BufferedStompClient. It returns %s', is_object($stomp) ? get_class($stomp) : gettype($stomp))); + throw new \LogicException(sprintf('The factory must return instance of BufferedStompClient. It returns %s', is_object($stomp) ? $stomp::class : gettype($stomp))); } return $stomp; diff --git a/pkg/stomp/StompDestination.php b/pkg/stomp/StompDestination.php index 30e858e1d..3364968c4 100644 --- a/pkg/stomp/StompDestination.php +++ b/pkg/stomp/StompDestination.php @@ -9,16 +9,16 @@ class StompDestination implements Topic, Queue { - const TYPE_TOPIC = 'topic'; - const TYPE_EXCHANGE = 'exchange'; - const TYPE_QUEUE = 'queue'; - const TYPE_AMQ_QUEUE = 'amq/queue'; - const TYPE_TEMP_QUEUE = 'temp-queue'; - const TYPE_REPLY_QUEUE = 'reply-queue'; + public const TYPE_TOPIC = 'topic'; + public const TYPE_EXCHANGE = 'exchange'; + public const TYPE_QUEUE = 'queue'; + public const TYPE_AMQ_QUEUE = 'amq/queue'; + public const TYPE_TEMP_QUEUE = 'temp-queue'; + public const TYPE_REPLY_QUEUE = 'reply-queue'; - const HEADER_DURABLE = 'durable'; - const HEADER_AUTO_DELETE = 'auto-delete'; - const HEADER_EXCLUSIVE = 'exclusive'; + public const HEADER_DURABLE = 'durable'; + public const HEADER_AUTO_DELETE = 'auto-delete'; + public const HEADER_EXCLUSIVE = 'exclusive'; /** * @var string @@ -122,7 +122,7 @@ public function getRoutingKey(): ?string return $this->routingKey; } - public function setRoutingKey(string $routingKey = null): void + public function setRoutingKey(?string $routingKey = null): void { $this->routingKey = $routingKey; } diff --git a/pkg/stomp/StompHeadersEncoder.php b/pkg/stomp/StompHeadersEncoder.php index 27e637cc3..e3484abf6 100644 --- a/pkg/stomp/StompHeadersEncoder.php +++ b/pkg/stomp/StompHeadersEncoder.php @@ -6,13 +6,13 @@ class StompHeadersEncoder { - const PROPERTY_PREFIX = '_property_'; - const TYPE_PREFIX = '_type_'; - const TYPE_STRING = 's'; - const TYPE_INT = 'i'; - const TYPE_FLOAT = 'f'; - const TYPE_BOOL = 'b'; - const TYPE_NULL = 'n'; + public const PROPERTY_PREFIX = '_property_'; + public const TYPE_PREFIX = '_type_'; + public const TYPE_STRING = 's'; + public const TYPE_INT = 'i'; + public const TYPE_FLOAT = 'f'; + public const TYPE_BOOL = 'b'; + public const TYPE_NULL = 'n'; public static function encode(array $headers = [], array $properties = []): array { @@ -36,7 +36,7 @@ public static function decode(array $headers = []): array // separate headers/properties foreach ($headers as $key => $value) { - if (0 === strpos($key, self::PROPERTY_PREFIX)) { + if (str_starts_with($key, self::PROPERTY_PREFIX)) { $encodedProperties[substr($key, $prefixLength)] = $value; } else { $encodedHeaders[$key] = $value; @@ -94,7 +94,7 @@ private static function doDecode(array $headers = []): array foreach ($headers as $key => $value) { // skip type header - if (0 === strpos($key, self::TYPE_PREFIX)) { + if (str_starts_with($key, self::TYPE_PREFIX)) { continue; } diff --git a/pkg/stomp/StompMessage.php b/pkg/stomp/StompMessage.php index bb563c8cd..7098679b7 100644 --- a/pkg/stomp/StompMessage.php +++ b/pkg/stomp/StompMessage.php @@ -120,7 +120,7 @@ public function setRedelivered(bool $redelivered): void $this->redelivered = $redelivered; } - public function setCorrelationId(string $correlationId = null): void + public function setCorrelationId(?string $correlationId = null): void { $this->setHeader('correlation_id', (string) $correlationId); } @@ -130,7 +130,7 @@ public function getCorrelationId(): ?string return $this->getHeader('correlation_id'); } - public function setMessageId(string $messageId = null): void + public function setMessageId(?string $messageId = null): void { $this->setHeader('message_id', (string) $messageId); } @@ -147,7 +147,7 @@ public function getTimestamp(): ?int return null === $value ? null : (int) $value; } - public function setTimestamp(int $timestamp = null): void + public function setTimestamp(?int $timestamp = null): void { $this->setHeader('timestamp', $timestamp); } @@ -157,12 +157,12 @@ public function getFrame(): ?Frame return $this->frame; } - public function setFrame(Frame $frame = null): void + public function setFrame(?Frame $frame = null): void { $this->frame = $frame; } - public function setReplyTo(string $replyTo = null): void + public function setReplyTo(?string $replyTo = null): void { $this->setHeader('reply-to', $replyTo); } diff --git a/pkg/stomp/StompProducer.php b/pkg/stomp/StompProducer.php index 8c1933ee4..909720973 100644 --- a/pkg/stomp/StompProducer.php +++ b/pkg/stomp/StompProducer.php @@ -45,7 +45,7 @@ public function send(Destination $destination, Message $message): void /** * @return $this|Producer */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (empty($deliveryDelay)) { return $this; @@ -64,7 +64,7 @@ public function getDeliveryDelay(): ?int * * @return $this|Producer */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (empty($priority)) { return $this; @@ -81,7 +81,7 @@ public function getPriority(): ?int /** * @return $this|Producer */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { if (empty($timeToLive)) { return $this; diff --git a/pkg/stomp/Tests/Spec/StompMessageTest.php b/pkg/stomp/Tests/Spec/StompMessageTest.php index dd9e733ea..8f6748b63 100644 --- a/pkg/stomp/Tests/Spec/StompMessageTest.php +++ b/pkg/stomp/Tests/Spec/StompMessageTest.php @@ -7,9 +7,6 @@ class StompMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new StompMessage(); diff --git a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php index 3899f3c76..d784d4104 100644 --- a/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php +++ b/pkg/stomp/Tests/StompConnectionFactoryConfigTest.php @@ -41,9 +41,6 @@ public function testThrowIfDsnCouldNotBeParsed() /** * @dataProvider provideConfigs - * - * @param mixed $config - * @param mixed $expectedConfig */ public function testShouldParseConfigurationAsExpected($config, $expectedConfig) { diff --git a/pkg/stomp/Tests/StompHeadersEncoderTest.php b/pkg/stomp/Tests/StompHeadersEncoderTest.php index 7997e05a4..cd3d112dd 100644 --- a/pkg/stomp/Tests/StompHeadersEncoderTest.php +++ b/pkg/stomp/Tests/StompHeadersEncoderTest.php @@ -32,9 +32,6 @@ public function propertyValuesDataProvider() /** * @dataProvider headerValuesDataProvider - * - * @param mixed $originalValue - * @param mixed $encodedValue */ public function testShouldEncodeHeaders($originalValue, $encodedValue) { @@ -43,9 +40,6 @@ public function testShouldEncodeHeaders($originalValue, $encodedValue) /** * @dataProvider propertyValuesDataProvider - * - * @param mixed $originalValue - * @param mixed $encodedValue */ public function testShouldEncodeProperties($originalValue, $encodedValue) { @@ -54,9 +48,6 @@ public function testShouldEncodeProperties($originalValue, $encodedValue) /** * @dataProvider headerValuesDataProvider - * - * @param mixed $originalValue - * @param mixed $encodedValue */ public function testShouldDecodeHeaders($originalValue, $encodedValue) { @@ -65,9 +56,6 @@ public function testShouldDecodeHeaders($originalValue, $encodedValue) /** * @dataProvider propertyValuesDataProvider - * - * @param mixed $originalValue - * @param mixed $encodedValue */ public function testShouldDecodeProperties($originalValue, $encodedValue) { diff --git a/pkg/stomp/Tests/StompMessageTest.php b/pkg/stomp/Tests/StompMessageTest.php index 736df79a2..49be1a8c5 100644 --- a/pkg/stomp/Tests/StompMessageTest.php +++ b/pkg/stomp/Tests/StompMessageTest.php @@ -93,7 +93,7 @@ public function testShouldUnsetHeaderIfNullPassed() $message->setHeader('aHeader', 'aVal'); - //guard + // guard $this->assertSame('aVal', $message->getHeader('aHeader')); $message->setHeader('aHeader', null); @@ -108,7 +108,7 @@ public function testShouldUnsetPropertyIfNullPassed() $message->setProperty('aProperty', 'aVal'); - //guard + // guard $this->assertSame('aVal', $message->getProperty('aProperty')); $message->setProperty('aProperty', null); diff --git a/pkg/test/RabbitManagementExtensionTrait.php b/pkg/test/RabbitManagementExtensionTrait.php index 82bdd072c..184b1758e 100644 --- a/pkg/test/RabbitManagementExtensionTrait.php +++ b/pkg/test/RabbitManagementExtensionTrait.php @@ -21,17 +21,17 @@ private function removeQueue($queueName) ); $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($ch, CURLOPT_USERPWD, $dsn->getUser().':'.$dsn->getPassword()); - curl_setopt($ch, CURLOPT_HTTPHEADER, [ + curl_setopt($ch, \CURLOPT_URL, $url); + curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE'); + curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, \CURLOPT_HTTPAUTH, \CURLAUTH_BASIC); + curl_setopt($ch, \CURLOPT_USERPWD, $dsn->getUser().':'.$dsn->getPassword()); + curl_setopt($ch, \CURLOPT_HTTPHEADER, [ 'Content-Type' => 'application/json', ]); curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $httpCode = curl_getinfo($ch, \CURLINFO_HTTP_CODE); curl_close($ch); @@ -55,17 +55,17 @@ private function removeExchange($exchangeName) ); $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($ch, CURLOPT_USERPWD, $dsn->getUser().':'.$dsn->getPassword()); - curl_setopt($ch, CURLOPT_HTTPHEADER, [ + curl_setopt($ch, \CURLOPT_URL, $url); + curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE'); + curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, \CURLOPT_HTTPAUTH, \CURLAUTH_BASIC); + curl_setopt($ch, \CURLOPT_USERPWD, $dsn->getUser().':'.$dsn->getPassword()); + curl_setopt($ch, \CURLOPT_HTTPHEADER, [ 'Content-Type' => 'application/json', ]); curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $httpCode = curl_getinfo($ch, \CURLINFO_HTTP_CODE); curl_close($ch); diff --git a/pkg/test/ReadAttributeTrait.php b/pkg/test/ReadAttributeTrait.php index 6938f257c..5b9758a64 100644 --- a/pkg/test/ReadAttributeTrait.php +++ b/pkg/test/ReadAttributeTrait.php @@ -2,8 +2,6 @@ namespace Enqueue\Test; -use ReflectionProperty; - trait ReadAttributeTrait { public function readAttribute(object $object, string $attribute) @@ -19,14 +17,14 @@ public function readAttribute(object $object, string $attribute) private function getClassAttribute( object $object, string $attribute, - ?string $class = null - ): ReflectionProperty { + ?string $class = null, + ): \ReflectionProperty { if (null === $class) { - $class = get_class($object); + $class = $object::class; } try { - return new ReflectionProperty($class, $attribute); + return new \ReflectionProperty($class, $attribute); } catch (\ReflectionException $exception) { $parentClass = get_parent_class($object); if (false === $parentClass) { diff --git a/pkg/test/RedisExtension.php b/pkg/test/RedisExtension.php index 86586d16b..3227785c2 100644 --- a/pkg/test/RedisExtension.php +++ b/pkg/test/RedisExtension.php @@ -20,7 +20,7 @@ private function buildPhpRedisContext(): RedisContext $context = (new RedisConnectionFactory($config))->createContext(); - //guard + // guard $this->assertInstanceOf(PhpRedis::class, $context->getRedis()); return $context; @@ -36,7 +36,7 @@ private function buildPRedisContext(): RedisContext $context = (new RedisConnectionFactory($config))->createContext(); - //guard + // guard $this->assertInstanceOf(PRedis::class, $context->getRedis()); return $context; diff --git a/pkg/test/TestLogger.php b/pkg/test/TestLogger.php index d61c67932..9db2c2a5e 100644 --- a/pkg/test/TestLogger.php +++ b/pkg/test/TestLogger.php @@ -111,7 +111,7 @@ public function hasRecord($record, $level) public function hasRecordThatContains($message, $level) { return $this->hasRecordThatPasses(function ($rec) use ($message) { - return false !== strpos($rec['message'], $message); + return str_contains($rec['message'], $message); }, $level); } diff --git a/pkg/test/WriteAttributeTrait.php b/pkg/test/WriteAttributeTrait.php index e2e84bd2a..6f8c1aab5 100644 --- a/pkg/test/WriteAttributeTrait.php +++ b/pkg/test/WriteAttributeTrait.php @@ -7,11 +7,10 @@ trait WriteAttributeTrait /** * @param object $object * @param string $attribute - * @param mixed $value */ public function writeAttribute($object, $attribute, $value) { - $refProperty = new \ReflectionProperty(get_class($object), $attribute); + $refProperty = new \ReflectionProperty($object::class, $attribute); $refProperty->setAccessible(true); $refProperty->setValue($object, $value); $refProperty->setAccessible(false); diff --git a/pkg/wamp/JsonSerializer.php b/pkg/wamp/JsonSerializer.php index b6027ba81..9a224fbb8 100644 --- a/pkg/wamp/JsonSerializer.php +++ b/pkg/wamp/JsonSerializer.php @@ -14,12 +14,8 @@ public function toString(WampMessage $message): string 'headers' => $message->getHeaders(), ]); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return $json; @@ -28,12 +24,8 @@ public function toString(WampMessage $message): string public function toMessage(string $string): WampMessage { $data = json_decode($string, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( - 'The malformed json given. Error %s and message %s', - json_last_error(), - json_last_error_msg() - )); + if (\JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(sprintf('The malformed json given. Error %s and message %s', json_last_error(), json_last_error_msg())); } return new WampMessage($data['body'], $data['properties'], $data['headers']); diff --git a/pkg/wamp/SerializerAwareTrait.php b/pkg/wamp/SerializerAwareTrait.php index c2ce9b603..adfe66e7e 100644 --- a/pkg/wamp/SerializerAwareTrait.php +++ b/pkg/wamp/SerializerAwareTrait.php @@ -11,9 +11,6 @@ trait SerializerAwareTrait */ private $serializer; - /** - * @param Serializer $serializer - */ public function setSerializer(Serializer $serializer) { $this->serializer = $serializer; diff --git a/pkg/wamp/Tests/Functional/WampConsumerTest.php b/pkg/wamp/Tests/Functional/WampConsumerTest.php index 2494721d1..bb2dd89a4 100644 --- a/pkg/wamp/Tests/Functional/WampConsumerTest.php +++ b/pkg/wamp/Tests/Functional/WampConsumerTest.php @@ -12,6 +12,7 @@ /** * @group functional * @group Wamp + * * @retry 5 */ class WampConsumerTest extends TestCase diff --git a/pkg/wamp/Tests/Spec/JsonSerializerTest.php b/pkg/wamp/Tests/Spec/JsonSerializerTest.php index f1c3e24d3..f062a7058 100644 --- a/pkg/wamp/Tests/Spec/JsonSerializerTest.php +++ b/pkg/wamp/Tests/Spec/JsonSerializerTest.php @@ -37,7 +37,7 @@ public function testThrowIfFailedToEncodeMessageToJson() $resource = fopen(__FILE__, 'r'); - //guard + // guard $this->assertIsResource($resource); $message = new WampMessage('theBody', ['aProp' => $resource]); diff --git a/pkg/wamp/Tests/Spec/WampConnectionFactoryTest.php b/pkg/wamp/Tests/Spec/WampConnectionFactoryTest.php index 3c3ccf841..5b6e418c9 100644 --- a/pkg/wamp/Tests/Spec/WampConnectionFactoryTest.php +++ b/pkg/wamp/Tests/Spec/WampConnectionFactoryTest.php @@ -10,9 +10,6 @@ */ class WampConnectionFactoryTest extends ConnectionFactorySpec { - /** - * {@inheritdoc} - */ protected function createConnectionFactory() { return new WampConnectionFactory(); diff --git a/pkg/wamp/Tests/Spec/WampContextTest.php b/pkg/wamp/Tests/Spec/WampContextTest.php index 0bd70c772..4b2fb6c59 100644 --- a/pkg/wamp/Tests/Spec/WampContextTest.php +++ b/pkg/wamp/Tests/Spec/WampContextTest.php @@ -13,9 +13,6 @@ class WampContextTest extends ContextSpec { use WampExtension; - /** - * {@inheritdoc} - */ protected function createContext() { return $this->buildWampContext(); diff --git a/pkg/wamp/Tests/Spec/WampMessageTest.php b/pkg/wamp/Tests/Spec/WampMessageTest.php index 5482fadde..3e030d8c1 100644 --- a/pkg/wamp/Tests/Spec/WampMessageTest.php +++ b/pkg/wamp/Tests/Spec/WampMessageTest.php @@ -10,9 +10,6 @@ */ class WampMessageTest extends MessageSpec { - /** - * {@inheritdoc} - */ protected function createMessage() { return new WampMessage(); diff --git a/pkg/wamp/Tests/Spec/WampProducerTest.php b/pkg/wamp/Tests/Spec/WampProducerTest.php index d28194688..55aa68403 100644 --- a/pkg/wamp/Tests/Spec/WampProducerTest.php +++ b/pkg/wamp/Tests/Spec/WampProducerTest.php @@ -13,9 +13,6 @@ class WampProducerTest extends ProducerSpec { use WampExtension; - /** - * {@inheritdoc} - */ protected function createProducer() { return $this->buildWampContext()->createProducer(); diff --git a/pkg/wamp/Tests/Spec/WampQueueTest.php b/pkg/wamp/Tests/Spec/WampQueueTest.php index e8cb87267..015536fd1 100644 --- a/pkg/wamp/Tests/Spec/WampQueueTest.php +++ b/pkg/wamp/Tests/Spec/WampQueueTest.php @@ -10,9 +10,6 @@ */ class WampQueueTest extends QueueSpec { - /** - * {@inheritdoc} - */ protected function createQueue() { return new WampDestination(self::EXPECTED_QUEUE_NAME); diff --git a/pkg/wamp/Tests/Spec/WampTopicTest.php b/pkg/wamp/Tests/Spec/WampTopicTest.php index 4c48e7911..854da2c87 100644 --- a/pkg/wamp/Tests/Spec/WampTopicTest.php +++ b/pkg/wamp/Tests/Spec/WampTopicTest.php @@ -10,9 +10,6 @@ */ class WampTopicTest extends TopicSpec { - /** - * {@inheritdoc} - */ protected function createTopic() { return new WampDestination(self::EXPECTED_TOPIC_NAME); diff --git a/pkg/wamp/WampConnectionFactory.php b/pkg/wamp/WampConnectionFactory.php index 3ba29f60a..d4ea9d73b 100644 --- a/pkg/wamp/WampConnectionFactory.php +++ b/pkg/wamp/WampConnectionFactory.php @@ -88,10 +88,7 @@ private function parseDsn(string $dsn): array $dsn = Dsn::parseFirst($dsn); if (false === in_array($dsn->getSchemeProtocol(), ['wamp', 'ws'], true)) { - throw new \LogicException(sprintf( - 'The given scheme protocol "%s" is not supported. It must be "wamp"', - $dsn->getSchemeProtocol() - )); + throw new \LogicException(sprintf('The given scheme protocol "%s" is not supported. It must be "wamp"', $dsn->getSchemeProtocol())); } return array_filter(array_replace($dsn->getQuery(), [ diff --git a/pkg/wamp/WampConsumer.php b/pkg/wamp/WampConsumer.php index 8dc859739..8a6733e36 100644 --- a/pkg/wamp/WampConsumer.php +++ b/pkg/wamp/WampConsumer.php @@ -84,7 +84,7 @@ public function receive(int $timeout = 0): ?Message } if ($timeout > 0) { - $timeout = $timeout / 1000; + $timeout /= 1000; $timeout = $timeout >= 0.1 ? $timeout : 0.1; $this->timer = $this->client->getLoop()->addTimer($timeout, function () { @@ -112,8 +112,6 @@ public function receiveNoWait(): ?Message } /** - * {@inheritdoc} - * * @param WampMessage $message */ public function acknowledge(Message $message): void @@ -122,8 +120,6 @@ public function acknowledge(Message $message): void } /** - * {@inheritdoc} - * * @param WampMessage $message */ public function reject(Message $message, bool $requeue = false): void diff --git a/pkg/wamp/WampContext.php b/pkg/wamp/WampContext.php index 9bbed5087..623aa33f9 100644 --- a/pkg/wamp/WampContext.php +++ b/pkg/wamp/WampContext.php @@ -97,11 +97,7 @@ public function getNewClient(): Client $client = call_user_func($this->clientFactory); if (false == $client instanceof Client) { - throw new \LogicException(sprintf( - 'The factory must return instance of "%s". But it returns %s', - Client::class, - is_object($client) ? get_class($client) : gettype($client) - )); + throw new \LogicException(sprintf('The factory must return instance of "%s". But it returns %s', Client::class, is_object($client) ? $client::class : gettype($client))); } $this->clients[] = $client; diff --git a/pkg/wamp/WampProducer.php b/pkg/wamp/WampProducer.php index 3bffe21f0..71ea625ae 100644 --- a/pkg/wamp/WampProducer.php +++ b/pkg/wamp/WampProducer.php @@ -48,8 +48,6 @@ public function __construct(WampContext $context) } /** - * {@inheritdoc} - * * @param WampDestination $destination * @param WampMessage $message */ @@ -113,11 +111,9 @@ public function send(Destination $destination, Message $message): void } /** - * {@inheritdoc} - * * @return WampProducer */ - public function setDeliveryDelay(int $deliveryDelay = null): Producer + public function setDeliveryDelay(?int $deliveryDelay = null): Producer { if (null === $deliveryDelay) { return $this; @@ -132,11 +128,9 @@ public function getDeliveryDelay(): ?int } /** - * {@inheritdoc} - * * @return WampProducer */ - public function setPriority(int $priority = null): Producer + public function setPriority(?int $priority = null): Producer { if (null === $priority) { return $this; @@ -151,11 +145,9 @@ public function getPriority(): ?int } /** - * {@inheritdoc} - * * @return WampProducer */ - public function setTimeToLive(int $timeToLive = null): Producer + public function setTimeToLive(?int $timeToLive = null): Producer { if (null === $timeToLive) { return $this; diff --git a/pkg/wamp/WampSubscriptionConsumer.php b/pkg/wamp/WampSubscriptionConsumer.php index 6b96926e1..2d25a673b 100644 --- a/pkg/wamp/WampSubscriptionConsumer.php +++ b/pkg/wamp/WampSubscriptionConsumer.php @@ -84,7 +84,7 @@ public function consume(int $timeout = 0): void } if ($timeout > 0) { - $timeout = $timeout / 1000; + $timeout /= 1000; $timeout = $timeout >= 0.1 ? $timeout : 0.1; $this->timer = $this->client->getLoop()->addTimer($timeout, function () { @@ -100,14 +100,12 @@ public function consume(int $timeout = 0): void } /** - * {@inheritdoc} - * * @param WampConsumer $consumer */ public function subscribe(Consumer $consumer, callable $callback): void { if (false == $consumer instanceof WampConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', WampConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', WampConsumer::class, $consumer::class)); } if ($this->client) { @@ -127,14 +125,12 @@ public function subscribe(Consumer $consumer, callable $callback): void } /** - * {@inheritdoc} - * * @param WampConsumer $consumer */ public function unsubscribe(Consumer $consumer): void { if (false == $consumer instanceof WampConsumer) { - throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', WampConsumer::class, get_class($consumer))); + throw new \InvalidArgumentException(sprintf('The consumer must be instance of "%s" got "%s"', WampConsumer::class, $consumer::class)); } if ($this->client) { From 8e72d15858bb42fd760006dc3d98ae0f41865c20 Mon Sep 17 00:00:00 2001 From: James Read Date: Fri, 17 Jan 2025 21:41:52 +0000 Subject: [PATCH 1138/1142] Adding --config back when specifying multiple files php-cs-fixer needs to be provider rules or the config file. see https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/4279 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e284867ec..36c3d5d90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,7 @@ jobs: - run: sed -i 's/525568/16777471/' vendor/kwn/php-rdkafka-stubs/stubs/constants.php - - run: ./bin/php-cs-fixer fix --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} + - run: ./bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php --no-interaction --dry-run --diff -v --path-mode=intersection -- ${{ env.GIT_DIFF_FILTERED }} if: env.GIT_DIFF_FILTERED unit_tests: From 44437dd95c13482b208df8c5dc587f760a8017f5 Mon Sep 17 00:00:00 2001 From: James Read Date: Fri, 17 Jan 2025 21:52:03 +0000 Subject: [PATCH 1139/1142] More CS Fixes --- pkg/amqp-ext/AmqpConsumer.php | 2 +- pkg/amqp-ext/AmqpContext.php | 2 +- pkg/amqp-ext/AmqpProducer.php | 2 +- pkg/amqp-ext/Flags.php | 34 +++++++++++------------ pkg/rdkafka/RdKafkaConsumer.php | 8 +++--- pkg/rdkafka/RdKafkaContext.php | 6 ++-- pkg/rdkafka/RdKafkaProducer.php | 2 +- pkg/rdkafka/Tests/RdKafkaConsumerTest.php | 12 ++++---- pkg/rdkafka/Tests/RdKafkaProducerTest.php | 8 +++--- 9 files changed, 38 insertions(+), 38 deletions(-) diff --git a/pkg/amqp-ext/AmqpConsumer.php b/pkg/amqp-ext/AmqpConsumer.php index 5674f832b..700e8d77f 100644 --- a/pkg/amqp-ext/AmqpConsumer.php +++ b/pkg/amqp-ext/AmqpConsumer.php @@ -130,7 +130,7 @@ public function reject(Message $message, bool $requeue = false): void $this->getExtQueue()->reject( $message->getDeliveryTag(), - $requeue ? AMQP_REQUEUE : AMQP_NOPARAM + $requeue ? \AMQP_REQUEUE : \AMQP_NOPARAM ); } diff --git a/pkg/amqp-ext/AmqpContext.php b/pkg/amqp-ext/AmqpContext.php index 15bde09b5..c339dc0a1 100644 --- a/pkg/amqp-ext/AmqpContext.php +++ b/pkg/amqp-ext/AmqpContext.php @@ -177,7 +177,7 @@ public function unbind(InteropAmqpBind $bind): void public function createTemporaryQueue(): Queue { $extQueue = new \AMQPQueue($this->getExtChannel()); - $extQueue->setFlags(AMQP_EXCLUSIVE); + $extQueue->setFlags(\AMQP_EXCLUSIVE); $extQueue->declareQueue(); diff --git a/pkg/amqp-ext/AmqpProducer.php b/pkg/amqp-ext/AmqpProducer.php index b9c15a4b4..fc55ca29e 100644 --- a/pkg/amqp-ext/AmqpProducer.php +++ b/pkg/amqp-ext/AmqpProducer.php @@ -146,7 +146,7 @@ private function doSend(AmqpDestination $destination, AmqpMessage $message): voi } else { /** @var AmqpQueue $destination */ $amqpExchange = new \AMQPExchange($this->amqpChannel); - $amqpExchange->setType(AMQP_EX_TYPE_DIRECT); + $amqpExchange->setType(\AMQP_EX_TYPE_DIRECT); $amqpExchange->setName(''); $amqpExchange->publish( diff --git a/pkg/amqp-ext/Flags.php b/pkg/amqp-ext/Flags.php index ca31a4b74..2054f5526 100644 --- a/pkg/amqp-ext/Flags.php +++ b/pkg/amqp-ext/Flags.php @@ -12,14 +12,14 @@ class Flags { public static function convertMessageFlags(int $interop): int { - $flags = AMQP_NOPARAM; + $flags = \AMQP_NOPARAM; if ($interop & InteropAmqpMessage::FLAG_MANDATORY) { - $flags |= AMQP_MANDATORY; + $flags |= \AMQP_MANDATORY; } if ($interop & InteropAmqpMessage::FLAG_IMMEDIATE) { - $flags |= AMQP_IMMEDIATE; + $flags |= \AMQP_IMMEDIATE; } return $flags; @@ -27,12 +27,12 @@ public static function convertMessageFlags(int $interop): int public static function convertTopicFlags(int $interop): int { - $flags = AMQP_NOPARAM; + $flags = \AMQP_NOPARAM; $flags |= static::convertDestinationFlags($interop); if ($interop & InteropAmqpTopic::FLAG_INTERNAL) { - $flags |= AMQP_INTERNAL; + $flags |= \AMQP_INTERNAL; } return $flags; @@ -40,12 +40,12 @@ public static function convertTopicFlags(int $interop): int public static function convertQueueFlags(int $interop): int { - $flags = AMQP_NOPARAM; + $flags = \AMQP_NOPARAM; $flags |= static::convertDestinationFlags($interop); if ($interop & InteropAmqpQueue::FLAG_EXCLUSIVE) { - $flags |= AMQP_EXCLUSIVE; + $flags |= \AMQP_EXCLUSIVE; } return $flags; @@ -53,22 +53,22 @@ public static function convertQueueFlags(int $interop): int public static function convertDestinationFlags(int $interop): int { - $flags = AMQP_NOPARAM; + $flags = \AMQP_NOPARAM; if ($interop & InteropAmqpDestination::FLAG_PASSIVE) { - $flags |= AMQP_PASSIVE; + $flags |= \AMQP_PASSIVE; } if ($interop & InteropAmqpDestination::FLAG_DURABLE) { - $flags |= AMQP_DURABLE; + $flags |= \AMQP_DURABLE; } if ($interop & InteropAmqpDestination::FLAG_AUTODELETE) { - $flags |= AMQP_AUTODELETE; + $flags |= \AMQP_AUTODELETE; } if ($interop & InteropAmqpDestination::FLAG_NOWAIT) { - $flags |= AMQP_NOWAIT; + $flags |= \AMQP_NOWAIT; } return $flags; @@ -76,22 +76,22 @@ public static function convertDestinationFlags(int $interop): int public static function convertConsumerFlags(int $interop): int { - $flags = AMQP_NOPARAM; + $flags = \AMQP_NOPARAM; if ($interop & InteropAmqpConsumer::FLAG_NOLOCAL) { - $flags |= AMQP_NOLOCAL; + $flags |= \AMQP_NOLOCAL; } if ($interop & InteropAmqpConsumer::FLAG_NOACK) { - $flags |= AMQP_AUTOACK; + $flags |= \AMQP_AUTOACK; } if ($interop & InteropAmqpConsumer::FLAG_EXCLUSIVE) { - $flags |= AMQP_EXCLUSIVE; + $flags |= \AMQP_EXCLUSIVE; } if ($interop & InteropAmqpConsumer::FLAG_NOWAIT) { - $flags |= AMQP_NOWAIT; + $flags |= \AMQP_NOWAIT; } return $flags; diff --git a/pkg/rdkafka/RdKafkaConsumer.php b/pkg/rdkafka/RdKafkaConsumer.php index b1e9ad555..8b6cf12c6 100644 --- a/pkg/rdkafka/RdKafkaConsumer.php +++ b/pkg/rdkafka/RdKafkaConsumer.php @@ -167,11 +167,11 @@ private function doReceive(int $timeout): ?RdKafkaMessage } switch ($kafkaMessage->err) { - case RD_KAFKA_RESP_ERR__PARTITION_EOF: - case RD_KAFKA_RESP_ERR__TIMED_OUT: - case RD_KAFKA_RESP_ERR__TRANSPORT: + case \RD_KAFKA_RESP_ERR__PARTITION_EOF: + case \RD_KAFKA_RESP_ERR__TIMED_OUT: + case \RD_KAFKA_RESP_ERR__TRANSPORT: return null; - case RD_KAFKA_RESP_ERR_NO_ERROR: + case \RD_KAFKA_RESP_ERR_NO_ERROR: $message = $this->serializer->toMessage($kafkaMessage->payload); $message->setKey($kafkaMessage->key); $message->setPartition($kafkaMessage->partition); diff --git a/pkg/rdkafka/RdKafkaContext.php b/pkg/rdkafka/RdKafkaContext.php index 9930b56ee..a252fcfd5 100644 --- a/pkg/rdkafka/RdKafkaContext.php +++ b/pkg/rdkafka/RdKafkaContext.php @@ -173,9 +173,9 @@ public static function getLibrdKafkaVersion(): string if (!defined('RD_KAFKA_VERSION')) { throw new \RuntimeException('RD_KAFKA_VERSION constant is not defined. Phprdkafka is probably not installed'); } - $major = (RD_KAFKA_VERSION & 0xFF000000) >> 24; - $minor = (RD_KAFKA_VERSION & 0x00FF0000) >> 16; - $patch = (RD_KAFKA_VERSION & 0x0000FF00) >> 8; + $major = (\RD_KAFKA_VERSION & 0xFF000000) >> 24; + $minor = (\RD_KAFKA_VERSION & 0x00FF0000) >> 16; + $patch = (\RD_KAFKA_VERSION & 0x0000FF00) >> 8; return "$major.$minor.$patch"; } diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index 8d0056d77..c70f1fbe6 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -37,7 +37,7 @@ public function send(Destination $destination, Message $message): void InvalidDestinationException::assertDestinationInstanceOf($destination, RdKafkaTopic::class); InvalidMessageException::assertMessageInstanceOf($message, RdKafkaMessage::class); - $partition = $message->getPartition() ?? $destination->getPartition() ?? RD_KAFKA_PARTITION_UA; + $partition = $message->getPartition() ?? $destination->getPartition() ?? \RD_KAFKA_PARTITION_UA; $payload = $this->serializer->toString($message); $key = $message->getKey() ?? $destination->getKey() ?? null; diff --git a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php index 74e92954b..a0544da6c 100644 --- a/pkg/rdkafka/Tests/RdKafkaConsumerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaConsumerTest.php @@ -32,7 +32,7 @@ public function testShouldReceiveFromQueueAndReturnNullIfNoMessageInQueue() $destination = new RdKafkaTopic('dest'); $kafkaMessage = new Message(); - $kafkaMessage->err = RD_KAFKA_RESP_ERR__TIMED_OUT; + $kafkaMessage->err = \RD_KAFKA_RESP_ERR__TIMED_OUT; $kafkaConsumer = $this->createKafkaConsumerMock(); $kafkaConsumer @@ -61,7 +61,7 @@ public function testShouldPassProperlyConfiguredTopicPartitionOnAssign() $destination = new RdKafkaTopic('dest'); $kafkaMessage = new Message(); - $kafkaMessage->err = RD_KAFKA_RESP_ERR__TIMED_OUT; + $kafkaMessage->err = \RD_KAFKA_RESP_ERR__TIMED_OUT; $kafkaConsumer = $this->createKafkaConsumerMock(); $kafkaConsumer @@ -91,7 +91,7 @@ public function testShouldSubscribeOnFirstReceiveOnly() $destination = new RdKafkaTopic('dest'); $kafkaMessage = new Message(); - $kafkaMessage->err = RD_KAFKA_RESP_ERR__TIMED_OUT; + $kafkaMessage->err = \RD_KAFKA_RESP_ERR__TIMED_OUT; $kafkaConsumer = $this->createKafkaConsumerMock(); $kafkaConsumer @@ -122,7 +122,7 @@ public function testShouldAssignWhenOffsetIsSet() $destination->setPartition(1); $kafkaMessage = new Message(); - $kafkaMessage->err = RD_KAFKA_RESP_ERR__TIMED_OUT; + $kafkaMessage->err = \RD_KAFKA_RESP_ERR__TIMED_OUT; $kafkaConsumer = $this->createKafkaConsumerMock(); $kafkaConsumer @@ -154,7 +154,7 @@ public function testThrowOnOffsetChangeAfterSubscribing() $destination = new RdKafkaTopic('dest'); $kafkaMessage = new Message(); - $kafkaMessage->err = RD_KAFKA_RESP_ERR__TIMED_OUT; + $kafkaMessage->err = \RD_KAFKA_RESP_ERR__TIMED_OUT; $kafkaConsumer = $this->createKafkaConsumerMock(); $kafkaConsumer @@ -188,7 +188,7 @@ public function testShouldReceiveFromQueueAndReturnMessageIfMessageInQueue() $expectedMessage = new RdKafkaMessage('theBody', ['foo' => 'fooVal'], ['bar' => 'barVal']); $kafkaMessage = new Message(); - $kafkaMessage->err = RD_KAFKA_RESP_ERR_NO_ERROR; + $kafkaMessage->err = \RD_KAFKA_RESP_ERR_NO_ERROR; $kafkaMessage->payload = 'theSerializedMessage'; $kafkaConsumer = $this->createKafkaConsumerMock(); diff --git a/pkg/rdkafka/Tests/RdKafkaProducerTest.php b/pkg/rdkafka/Tests/RdKafkaProducerTest.php index 6082968ad..6295fbc1b 100644 --- a/pkg/rdkafka/Tests/RdKafkaProducerTest.php +++ b/pkg/rdkafka/Tests/RdKafkaProducerTest.php @@ -46,7 +46,7 @@ public function testShouldUseSerializerToEncodeMessageAndPutToExpectedTube() ->expects($this->once()) ->method('producev') ->with( - RD_KAFKA_PARTITION_UA, + \RD_KAFKA_PARTITION_UA, 0, 'theSerializedMessage', 'key', @@ -183,7 +183,7 @@ public function testShouldAllowSerializersToSerializeKeys() ->expects($this->once()) ->method('producev') ->with( - RD_KAFKA_PARTITION_UA, + \RD_KAFKA_PARTITION_UA, 0, 'theSerializedMessage', 'theSerializedKey' @@ -324,7 +324,7 @@ public function testShouldAllowFalsyKeyFromMessage(): void ->expects($this->once()) ->method('producev') ->with( - RD_KAFKA_PARTITION_UA, + \RD_KAFKA_PARTITION_UA, 0, '', $key @@ -354,7 +354,7 @@ public function testShouldAllowFalsyKeyFromDestination(): void ->expects($this->once()) ->method('producev') ->with( - RD_KAFKA_PARTITION_UA, + \RD_KAFKA_PARTITION_UA, 0, '', $key From f21cf0bf575302bdee28182b70fb5c5832693002 Mon Sep 17 00:00:00 2001 From: James Read Date: Thu, 16 Jan 2025 22:20:11 +0000 Subject: [PATCH 1140/1142] Fixing static analysis issues Fixing issue raised by phpstan --- phpstan.neon | 7 ------- pkg/enqueue/Client/Config.php | 2 +- .../Client/Driver/StompManagementClient.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- pkg/enqueue/Consumption/Result.php | 8 ++++---- pkg/enqueue/Rpc/TimeoutException.php | 2 +- .../SetupBrokerExtensionCommandTrait.php | 2 +- pkg/enqueue/Symfony/DiUtils.php | 2 +- .../FallbackSubscriptionConsumerTest.php | 20 ++----------------- .../Tests/Mocks/JsonSerializableObject.php | 3 ++- .../BuildCommandSubscriberRoutesPassTest.php | 1 + .../BuildTopicSubscriberRoutesPassTest.php | 1 + .../Mock/QueueSubscriberProcessor.php | 1 + .../Util/Fixtures/JsonSerializableClass.php | 3 ++- pkg/enqueue/Util/Stringify.php | 2 +- .../Test/DbalPersistedConnection.php | 6 ++++++ pkg/monitoring/InfluxDbStorage.php | 2 +- pkg/rdkafka/RdKafkaProducer.php | 2 ++ 18 files changed, 29 insertions(+), 39 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 88be8a7e1..b689b6b8a 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -14,10 +14,3 @@ parameters: - pkg/enqueue-bundle/DependencyInjection/Configuration.php - pkg/enqueue/Tests/Symfony/DependencyInjection/TransportFactoryTest.php - pkg/simple-client/SimpleClient.php - ignoreErrors: - - - message: '#Class Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy not found#' - path: %currentWorkingDirectory%/* - - - message: '#.*Symfony\\Contracts\\EventDispatcher\\Event.*#' - path: %currentWorkingDirectory%/* diff --git a/pkg/enqueue/Client/Config.php b/pkg/enqueue/Client/Config.php index 34057e1c1..8210dff68 100644 --- a/pkg/enqueue/Client/Config.php +++ b/pkg/enqueue/Client/Config.php @@ -163,7 +163,7 @@ public static function create( array $transportConfig = [], array $driverConfig = [], ): self { - return new static( + return new self( $prefix ?: '', $separator ?: '.', $app ?: '', diff --git a/pkg/enqueue/Client/Driver/StompManagementClient.php b/pkg/enqueue/Client/Driver/StompManagementClient.php index 5880672b5..0d64450dd 100644 --- a/pkg/enqueue/Client/Driver/StompManagementClient.php +++ b/pkg/enqueue/Client/Driver/StompManagementClient.php @@ -24,7 +24,7 @@ public function __construct(Client $client, string $vhost = '/') public static function create(string $vhost = '/', string $host = 'localhost', int $port = 15672, string $login = 'guest', string $password = 'guest'): self { - return new static(new Client(null, 'http://'.$host.':'.$port, $login, $password), $vhost); + return new self(new Client(null, 'http://'.$host.':'.$port, $login, $password), $vhost); } public function declareQueue(string $name, array $options) diff --git a/pkg/enqueue/Consumption/Exception/InvalidArgumentException.php b/pkg/enqueue/Consumption/Exception/InvalidArgumentException.php index 76ea83ad7..89a2f4ca7 100644 --- a/pkg/enqueue/Consumption/Exception/InvalidArgumentException.php +++ b/pkg/enqueue/Consumption/Exception/InvalidArgumentException.php @@ -12,7 +12,7 @@ class InvalidArgumentException extends \InvalidArgumentException implements Exce public static function assertInstanceOf($argument, $class) { if (false == $argument instanceof $class) { - throw new static(sprintf('The argument must be an instance of %s but got %s.', $class, is_object($argument) ? $argument::class : gettype($argument))); + throw new self(sprintf('The argument must be an instance of %s but got %s.', $class, is_object($argument) ? $argument::class : gettype($argument))); } } } diff --git a/pkg/enqueue/Consumption/Result.php b/pkg/enqueue/Consumption/Result.php index efa929c7d..69dd7907b 100644 --- a/pkg/enqueue/Consumption/Result.php +++ b/pkg/enqueue/Consumption/Result.php @@ -89,7 +89,7 @@ public function setReply(?InteropMessage $reply = null) */ public static function ack($reason = '') { - return new static(self::ACK, $reason); + return new self(self::ACK, $reason); } /** @@ -99,7 +99,7 @@ public static function ack($reason = '') */ public static function reject($reason) { - return new static(self::REJECT, $reason); + return new self(self::REJECT, $reason); } /** @@ -109,7 +109,7 @@ public static function reject($reason) */ public static function requeue($reason = '') { - return new static(self::REQUEUE, $reason); + return new self(self::REQUEUE, $reason); } /** @@ -122,7 +122,7 @@ public static function reply(InteropMessage $replyMessage, $status = self::ACK, { $status = null === $status ? self::ACK : $status; - $result = new static($status, $reason); + $result = new self($status, $reason); $result->setReply($replyMessage); return $result; diff --git a/pkg/enqueue/Rpc/TimeoutException.php b/pkg/enqueue/Rpc/TimeoutException.php index a0b065511..a7f68b967 100644 --- a/pkg/enqueue/Rpc/TimeoutException.php +++ b/pkg/enqueue/Rpc/TimeoutException.php @@ -12,6 +12,6 @@ class TimeoutException extends \LogicException */ public static function create($timeout, $correlationId) { - return new static(sprintf('Rpc call timeout is reached without receiving a reply message. Timeout: %s, CorrelationId: %s', $timeout, $correlationId)); + return new self(sprintf('Rpc call timeout is reached without receiving a reply message. Timeout: %s, CorrelationId: %s', $timeout, $correlationId)); } } diff --git a/pkg/enqueue/Symfony/Client/SetupBrokerExtensionCommandTrait.php b/pkg/enqueue/Symfony/Client/SetupBrokerExtensionCommandTrait.php index 96e0d2d6b..bcc4f7bb2 100644 --- a/pkg/enqueue/Symfony/Client/SetupBrokerExtensionCommandTrait.php +++ b/pkg/enqueue/Symfony/Client/SetupBrokerExtensionCommandTrait.php @@ -18,7 +18,7 @@ protected function configureSetupBrokerExtension() } /** - * @return ExtensionInterface + * @return ExtensionInterface|null */ protected function getSetupBrokerExtension(InputInterface $input, DriverInterface $driver) { diff --git a/pkg/enqueue/Symfony/DiUtils.php b/pkg/enqueue/Symfony/DiUtils.php index 335ff04b9..be45287be 100644 --- a/pkg/enqueue/Symfony/DiUtils.php +++ b/pkg/enqueue/Symfony/DiUtils.php @@ -27,7 +27,7 @@ public function __construct(string $moduleName, string $configName) public static function create(string $moduleName, string $configName): self { - return new static($moduleName, $configName); + return new self($moduleName, $configName); } public function getModuleName(): string diff --git a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php index 5391f0c68..73fba7bfd 100644 --- a/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/FallbackSubscriptionConsumerTest.php @@ -147,34 +147,18 @@ public function testShouldConsumeMessagesFromTwoQueuesInExpectedOrder() $fourthMessage = $this->createMessageStub('fourth'); $fifthMessage = $this->createMessageStub('fifth'); - $fooMessages = [null, $firstMessage, null, $secondMessage, $thirdMessage]; - $fooConsumer = $this->createConsumerStub('foo_queue'); $fooConsumer ->expects($this->any()) ->method('receiveNoWait') - ->willReturnCallback(function () use (&$fooMessages) { - if (empty($fooMessages)) { - return null; - } - - return array_shift($fooMessages); - }) + ->willReturnOnConsecutiveCalls(null, $firstMessage, null, $secondMessage, $thirdMessage) ; - $barMessages = [$fourthMessage, null, null, $fifthMessage]; - $barConsumer = $this->createConsumerStub('bar_queue'); $barConsumer ->expects($this->any()) ->method('receiveNoWait') - ->willReturnCallback(function () use (&$barMessages) { - if (empty($barMessages)) { - return null; - } - - return array_shift($barMessages); - }) + ->willReturnOnConsecutiveCalls($fourthMessage, null, null, $fifthMessage) ; $actualOrder = []; diff --git a/pkg/enqueue/Tests/Mocks/JsonSerializableObject.php b/pkg/enqueue/Tests/Mocks/JsonSerializableObject.php index 5b74106dc..84885c316 100644 --- a/pkg/enqueue/Tests/Mocks/JsonSerializableObject.php +++ b/pkg/enqueue/Tests/Mocks/JsonSerializableObject.php @@ -4,7 +4,8 @@ class JsonSerializableObject implements \JsonSerializable { - public function jsonSerialize() + #[\ReturnTypeWillChange] + public function jsonSerialize(): array { return ['foo' => 'fooVal']; } diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php index 14a48be93..e1ed297c6 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildCommandSubscriberRoutesPassTest.php @@ -443,6 +443,7 @@ private function createCommandSubscriberProcessor($commandSubscriberReturns = [' public function process(InteropMessage $message, Context $context) { + return self::ACK; } public static function getSubscribedCommand() diff --git a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php index b9d798c11..a954d9a41 100644 --- a/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/DependencyInjection/BuildTopicSubscriberRoutesPassTest.php @@ -407,6 +407,7 @@ private function createTopicSubscriberProcessor($topicSubscriberReturns = ['aTop public function process(InteropMessage $message, Context $context) { + return self::ACK; } public static function getSubscribedTopics() diff --git a/pkg/enqueue/Tests/Symfony/Consumption/Mock/QueueSubscriberProcessor.php b/pkg/enqueue/Tests/Symfony/Consumption/Mock/QueueSubscriberProcessor.php index 56b3c9319..a210b0e6b 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/Mock/QueueSubscriberProcessor.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/Mock/QueueSubscriberProcessor.php @@ -11,6 +11,7 @@ class QueueSubscriberProcessor implements Processor, QueueSubscriberInterface { public function process(InteropMessage $message, Context $context) { + return self::ACK; } public static function getSubscribedQueues() diff --git a/pkg/enqueue/Tests/Util/Fixtures/JsonSerializableClass.php b/pkg/enqueue/Tests/Util/Fixtures/JsonSerializableClass.php index b612978e7..1a77ce0cf 100644 --- a/pkg/enqueue/Tests/Util/Fixtures/JsonSerializableClass.php +++ b/pkg/enqueue/Tests/Util/Fixtures/JsonSerializableClass.php @@ -6,7 +6,8 @@ class JsonSerializableClass implements \JsonSerializable { public $keyPublic = 'public'; - public function jsonSerialize() + #[\ReturnTypeWillChange] + public function jsonSerialize(): array { return [ 'key' => 'value', diff --git a/pkg/enqueue/Util/Stringify.php b/pkg/enqueue/Util/Stringify.php index 12358d785..d8a48a8d6 100644 --- a/pkg/enqueue/Util/Stringify.php +++ b/pkg/enqueue/Util/Stringify.php @@ -25,6 +25,6 @@ public function __toString(): string public static function that($value): self { - return new static($value); + return new self($value); } } diff --git a/pkg/job-queue/Test/DbalPersistedConnection.php b/pkg/job-queue/Test/DbalPersistedConnection.php index 6e1dc4ca6..470a65176 100644 --- a/pkg/job-queue/Test/DbalPersistedConnection.php +++ b/pkg/job-queue/Test/DbalPersistedConnection.php @@ -41,16 +41,22 @@ public function connect() public function beginTransaction() { $this->wrapTransactionNestingLevel('beginTransaction'); + + return true; } public function commit() { $this->wrapTransactionNestingLevel('commit'); + + return true; } public function rollBack() { $this->wrapTransactionNestingLevel('rollBack'); + + return true; } /** diff --git a/pkg/monitoring/InfluxDbStorage.php b/pkg/monitoring/InfluxDbStorage.php index 3084864f8..e39cccfd2 100644 --- a/pkg/monitoring/InfluxDbStorage.php +++ b/pkg/monitoring/InfluxDbStorage.php @@ -109,7 +109,7 @@ public static function createWithClient(Client $client, $config = 'influxdb:'): } $config['client'] = $client; - return new static($config); + return new self($config); } public function pushConsumerStats(ConsumerStats $stats): void diff --git a/pkg/rdkafka/RdKafkaProducer.php b/pkg/rdkafka/RdKafkaProducer.php index c70f1fbe6..24589b3e7 100644 --- a/pkg/rdkafka/RdKafkaProducer.php +++ b/pkg/rdkafka/RdKafkaProducer.php @@ -121,5 +121,7 @@ public function flush(int $timeout): ?int if (method_exists($this->producer, 'flush')) { return $this->producer->flush($timeout); } + + return null; } } From e996ed979462d18c690b741ec7a3ed42762fe250 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 18 Apr 2025 10:39:29 +0300 Subject: [PATCH 1141/1142] Release 0.10.25 Signed-off-by: Maksim Kotlyar --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4643cc9c9..ebba0c73f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## [0.10.25](https://github.com/php-enqueue/enqueue-dev/tree/0.10.25) (2025-04-18) +[Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.24...0.10.25) + +**Merged pull requests:** + +- Bugfix/static drift [\#1373](https://github.com/php-enqueue/enqueue-dev/pull/1373) ([JimTools](https://github.com/JimTools)) +- CS Fixes [\#1372](https://github.com/php-enqueue/enqueue-dev/pull/1372) ([JimTools](https://github.com/JimTools)) +- Fixing risky tests [\#1371](https://github.com/php-enqueue/enqueue-dev/pull/1371) ([JimTools](https://github.com/JimTools)) + ## [0.10.24](https://github.com/php-enqueue/enqueue-dev/tree/0.10.24) (2024-11-30) [Full Changelog](https://github.com/php-enqueue/enqueue-dev/compare/0.10.23...0.10.24) From c5a021fa8ad78d92a1ec95dd8b72a79fd3705204 Mon Sep 17 00:00:00 2001 From: James Read Date: Sun, 27 Apr 2025 14:30:31 +0100 Subject: [PATCH 1142/1142] Updating composer Updating composer.json in pkg directory to correctly reflect the supported versions of PHP --- composer.json | 4 ++-- pkg/amqp-bunny/composer.json | 2 +- pkg/amqp-ext/composer.json | 2 +- pkg/amqp-lib/composer.json | 2 +- pkg/amqp-tools/composer.json | 2 +- pkg/async-command/composer.json | 2 +- pkg/async-event-dispatcher/composer.json | 2 +- pkg/dbal/composer.json | 2 +- pkg/dsn/composer.json | 2 +- pkg/enqueue/composer.json | 2 +- pkg/fs/composer.json | 2 +- pkg/gearman/composer.json | 2 +- pkg/gps/composer.json | 2 +- pkg/job-queue/composer.json | 2 +- pkg/mongodb/composer.json | 2 +- pkg/monitoring/composer.json | 2 +- pkg/null/composer.json | 2 +- pkg/pheanstalk/composer.json | 2 +- pkg/rdkafka/composer.json | 2 +- pkg/redis/composer.json | 2 +- pkg/simple-client/composer.json | 2 +- pkg/sns/composer.json | 2 +- pkg/snsqs/composer.json | 2 +- pkg/sqs/composer.json | 2 +- pkg/stomp/composer.json | 2 +- pkg/wamp/composer.json | 2 +- 26 files changed, 27 insertions(+), 27 deletions(-) diff --git a/composer.json b/composer.json index d2258474d..f06367b09 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "ext-amqp": "^1.9.3|^2.0.0", "ext-gearman": "^2.0", - "ext-mongodb": "^1.5", + "ext-mongodb": "^1.17", "ext-rdkafka": "^4.0|^5.0|^6.0", "queue-interop/amqp-interop": "^0.8.2", @@ -127,7 +127,7 @@ "ext-rdkafka": "4.0", "ext-bcmath": "1", "ext-mbstring": "1", - "ext-mongo": "1.6.14", + "ext-mongodb": "1.17.3", "ext-sockets": "1" }, "prefer-stable": true, diff --git a/pkg/amqp-bunny/composer.json b/pkg/amqp-bunny/composer.json index 5bffcebd8..84d0f4309 100644 --- a/pkg/amqp-bunny/composer.json +++ b/pkg/amqp-bunny/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "bunny/bunny": "^0.4|^0.5", diff --git a/pkg/amqp-ext/composer.json b/pkg/amqp-ext/composer.json index b81363bb9..99f88c507 100644 --- a/pkg/amqp-ext/composer.json +++ b/pkg/amqp-ext/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "ext-amqp": "^1.9.3|^2.0.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/amqp-lib/composer.json b/pkg/amqp-lib/composer.json index dfb73a311..62f906c66 100644 --- a/pkg/amqp-lib/composer.json +++ b/pkg/amqp-lib/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "php-amqplib/php-amqplib": "^3.2", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/amqp-tools/composer.json b/pkg/amqp-tools/composer.json index 55f82f5d7..966e065e8 100644 --- a/pkg/amqp-tools/composer.json +++ b/pkg/amqp-tools/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10" diff --git a/pkg/async-command/composer.json b/pkg/async-command/composer.json index 48fd6f089..95d57ce3a 100644 --- a/pkg/async-command/composer.json +++ b/pkg/async-command/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", "symfony/console": "^5.4|^6.0", diff --git a/pkg/async-event-dispatcher/composer.json b/pkg/async-event-dispatcher/composer.json index a2cef0d79..f78597af4 100644 --- a/pkg/async-event-dispatcher/composer.json +++ b/pkg/async-event-dispatcher/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "enqueue/enqueue": "^0.10", "queue-interop/queue-interop": "^0.8", "symfony/event-dispatcher": "^5.4|^6.0" diff --git a/pkg/dbal/composer.json b/pkg/dbal/composer.json index a4d4af7f4..9499d394d 100644 --- a/pkg/dbal/composer.json +++ b/pkg/dbal/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8", "doctrine/dbal": "^2.12|^3.1", "doctrine/persistence": "^2.0|^3.0", diff --git a/pkg/dsn/composer.json b/pkg/dsn/composer.json index 94fb18a9f..dbd39aed7 100644 --- a/pkg/dsn/composer.json +++ b/pkg/dsn/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0" + "php": "^8.0" }, "require-dev": { "phpunit/phpunit": "^9.5" diff --git a/pkg/enqueue/composer.json b/pkg/enqueue/composer.json index 0da00ee4b..c336c4bad 100644 --- a/pkg/enqueue/composer.json +++ b/pkg/enqueue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", "enqueue/null": "^0.10", diff --git a/pkg/fs/composer.json b/pkg/fs/composer.json index b44900541..4dd2ff806 100644 --- a/pkg/fs/composer.json +++ b/pkg/fs/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "symfony/filesystem": "^5.4|^6.0", diff --git a/pkg/gearman/composer.json b/pkg/gearman/composer.json index eb06f62e3..e8805849f 100644 --- a/pkg/gearman/composer.json +++ b/pkg/gearman/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "ext-gearman": "^2.0", "queue-interop/queue-interop": "^0.8" }, diff --git a/pkg/gps/composer.json b/pkg/gps/composer.json index 2da6b7468..e7654be8d 100644 --- a/pkg/gps/composer.json +++ b/pkg/gps/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8", "google/cloud-pubsub": "^1.4.3", "enqueue/dsn": "^0.10" diff --git a/pkg/job-queue/composer.json b/pkg/job-queue/composer.json index 55d37d5da..6616069b3 100644 --- a/pkg/job-queue/composer.json +++ b/pkg/job-queue/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/mongodb/composer.json b/pkg/mongodb/composer.json index 775452949..f64d53ef3 100644 --- a/pkg/mongodb/composer.json +++ b/pkg/mongodb/composer.json @@ -10,7 +10,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8", "mongodb/mongodb": "^1.2", "ext-mongodb": "^1.5" diff --git a/pkg/monitoring/composer.json b/pkg/monitoring/composer.json index e19da2fa9..13b57a5f2 100644 --- a/pkg/monitoring/composer.json +++ b/pkg/monitoring/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "enqueue/enqueue": "^0.10", "enqueue/dsn": "^0.10" }, diff --git a/pkg/null/composer.json b/pkg/null/composer.json index 0f4ac4eeb..a09910a47 100644 --- a/pkg/null/composer.json +++ b/pkg/null/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8" }, "require-dev": { diff --git a/pkg/pheanstalk/composer.json b/pkg/pheanstalk/composer.json index 8d920a4ff..c810971c8 100644 --- a/pkg/pheanstalk/composer.json +++ b/pkg/pheanstalk/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "pda/pheanstalk": "^3.1", "queue-interop/queue-interop": "^0.8" }, diff --git a/pkg/rdkafka/composer.json b/pkg/rdkafka/composer.json index 068b9d204..64afe05ec 100644 --- a/pkg/rdkafka/composer.json +++ b/pkg/rdkafka/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "ext-rdkafka": "^4.0|^5.0|^6.0", "queue-interop/queue-interop": "^0.8.1" }, diff --git a/pkg/redis/composer.json b/pkg/redis/composer.json index 4742b3385..c48323201 100644 --- a/pkg/redis/composer.json +++ b/pkg/redis/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "ramsey/uuid": "^3.5|^4" diff --git a/pkg/simple-client/composer.json b/pkg/simple-client/composer.json index 7cb07b6b3..2d2bd3710 100644 --- a/pkg/simple-client/composer.json +++ b/pkg/simple-client/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "enqueue/enqueue": "^0.10", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/sns/composer.json b/pkg/sns/composer.json index 3bf50bdaf..6873037e3 100644 --- a/pkg/sns/composer.json +++ b/pkg/sns/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "^3.290" diff --git a/pkg/snsqs/composer.json b/pkg/snsqs/composer.json index 27a4e038e..e0596b25b 100644 --- a/pkg/snsqs/composer.json +++ b/pkg/snsqs/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "enqueue/sns": "^0.10", diff --git a/pkg/sqs/composer.json b/pkg/sqs/composer.json index cd50faf29..2ddc1b267 100644 --- a/pkg/sqs/composer.json +++ b/pkg/sqs/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8", "enqueue/dsn": "^0.10", "aws/aws-sdk-php": "^3.290" diff --git a/pkg/stomp/composer.json b/pkg/stomp/composer.json index 461205852..2cceb9fea 100644 --- a/pkg/stomp/composer.json +++ b/pkg/stomp/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "enqueue/dsn": "^0.10", "stomp-php/stomp-php": "^4.5|^5.0", "queue-interop/queue-interop": "^0.8", diff --git a/pkg/wamp/composer.json b/pkg/wamp/composer.json index be0321c6f..b510627bd 100644 --- a/pkg/wamp/composer.json +++ b/pkg/wamp/composer.json @@ -6,7 +6,7 @@ "homepage": "https://enqueue.forma-pro.com/", "license": "MIT", "require": { - "php": "^7.4|^8.0", + "php": "^8.1", "queue-interop/queue-interop": "^0.8.1", "enqueue/dsn": "^0.10.8", "thruway/client": "^0.5.5",