diff --git a/.editorconfig b/.editorconfig index 3b0bc951..6cbeb8bc 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,3 +16,11 @@ insert_final_newline = true [*.md] trim_trailing_whitespace = false + +[*.yml] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml new file mode 100644 index 00000000..59efe8d6 --- /dev/null +++ b/.github/workflows/continuous-integration.yml @@ -0,0 +1,86 @@ +name: Continuous Integration + +on: + - push + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + testing: + name: Testing and Code Quality for PHP + runs-on: ubuntu-latest + strategy: + matrix: + php: + - '7.4' + - '8.0' + - '8.1' + env: + KAFKA_BROKER_CONNECTIONS: 'localhost:9092' + services: + zookeeper: + image: bitnami/zookeeper + env: + ALLOW_ANONYMOUS_LOGIN: yes + kafka: + image: bitnami/kafka + ports: + - '9092:9092' + env: + KAFKA_LISTENERS: 'PLAINTEXT://:9092' + KAFKA_CFG_ADVERTISED_LISTENERS: 'PLAINTEXT://localhost:9092' + KAFKA_CFG_ZOOKEEPER_CONNECT: 'zookeeper:2181' + ALLOW_PLAINTEXT_LISTENER: yes + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup PHP cache environment + id: php-ext-cache + uses: shivammathur/cache-extensions@v1 + with: + php-version: ${{ matrix.php }} + extensions: rdkafka-arnaud-lb/php-rdkafka@6.0.3 + key: metamorphosis-php-extensions-${{ matrix.php }} + + - name: Cache PHP extensions + uses: actions/cache@v3 + with: + path: ${{ steps.php-ext-cache.outputs.dir }} + key: ${{ steps.php-ext-cache.outputs.key }} + restore-keys: ${{ steps.php-ext-cache.outputs.key }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + env: + RDKAFKA_LIBS: librdkafka-dev + with: + php-version: ${{ matrix.php }} + extensions: rdkafka-arnaud-lb/php-rdkafka@6.0.3 + tools: cs2pr + + - name: Cache composer dependencies + uses: actions/cache@v3 + with: + path: vendor + key: metamorphosis-vendor-${{ hashFiles('composer.lock') }} + + - name: Composer + uses: ramsey/composer-install@v2 + + - name: Run code standards + run: vendor/bin/phpcs -q --report=checkstyle | cs2pr + + - name: Run psalm + run: vendor/bin/psalm --php-version=${{ matrix.php }} --output-format=github + + - name: Run tests + run: vendor/bin/phpunit + + - name: Report Coverage + continue-on-error: true + run: CODACY_PROJECT_TOKEN=${{ secrets.CODACY_PROJECT_TOKEN }} bash <(curl -Ls https://coverage.codacy.com/get.sh) report diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml deleted file mode 100644 index 1e1df0f3..00000000 --- a/.github/workflows/push.yml +++ /dev/null @@ -1,22 +0,0 @@ -on: [push] -name: Tests -jobs: - setup-and-tests: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Build containers - run: docker-compose build --build-arg UID=$(id -u) --build-arg GID=$(id -g) - - - name: Composer install - run: docker-compose run --rm -T php composer install --no-interaction --no-progress - - - name: Run Code Standards - run: docker-compose run --rm -T php vendor/bin/phpcs - - - name: Run Tests - run: docker-compose run --rm -T php vendor/bin/phpunit - - - name: Report Coverage - run: CODACY_PROJECT_TOKEN=${{ secrets.CODACY_PROJECT_TOKEN }} bash <(curl -Ls https://coverage.codacy.com/get.sh) report diff --git a/composer.json b/composer.json index 28df9049..6e68715f 100644 --- a/composer.json +++ b/composer.json @@ -7,25 +7,26 @@ ], "description": "Kafka package for laravel applications", "require": { - "ext-rdkafka": "*", + "ext-rdkafka": ">=4.0", "ext-json": "*", "guzzlehttp/guzzle": "^6.5.0 || ^7.0", "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0", "illuminate/console": "^5.5 || ^6.0 || ^7.0 || ^8.0", "illuminate/config": "^5.5 || ^6.0 || ^7.0 || ^8.0", - "php": ">=7.1", - "wikimedia/avro": "^1.7" + "php": ">=7.4", + "wikimedia/avro": "^1.9.0" }, "require-dev": { - "leroy-merlin-br/coding-standard": "^1.0.1", - "phpunit/phpunit": "^9.4.3", - "mockery/mockery": "^1.3.0", - "kwn/php-rdkafka-stubs": "~1.1.0", - "orchestra/testbench": "^6.0", + "leroy-merlin-br/coding-standard": "^v3.1.0", + "phpunit/phpunit": "^9.5.27", + "mockery/mockery": "^1.5.1", + "kwn/php-rdkafka-stubs": "^2.2.1", + "orchestra/testbench": "^6.25.1", "dms/phpunit-arraysubset-asserts": "^0.2.1", - "phpro/grumphp": "^1.5", - "vimeo/psalm": "^4.18", - "psalm/plugin-mockery": "^0.9.1" + "phpro/grumphp": "^1.13.0", + "vimeo/psalm": "^4.30.0", + "psalm/plugin-mockery": "^0.9.1", + "rector/rector": "^0.13.10" }, "autoload": { "psr-4": { @@ -58,5 +59,11 @@ "@composer install", "vendor/bin/grumphp git:init" ] + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true, + "phpro/grumphp": true + } } } diff --git a/composer.lock b/composer.lock index a5b88475..2d508fb6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6f57d9ed1bb3086e3155d3ac4204fdfe", + "content-hash": "af22a3400640796726b61a692ed5b532", "packages": [ { "name": "brick/math", @@ -66,30 +66,105 @@ ], "time": "2021-08-15T20:50:18+00:00" }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, { "name": "doctrine/inflector", - "version": "2.0.4", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "url": "https://github.com/gitapi/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "vimeo/psalm": "^4.10" + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25" }, "type": "library", "autoload": { @@ -139,7 +214,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.4" + "source": "https://github.com/doctrine/inflector/tree/2.0.6" }, "funding": [ { @@ -155,7 +230,7 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:16:43+00:00" + "time": "2022-10-20T09:10:12+00:00" }, { "name": "doctrine/lexer", @@ -235,16 +310,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.1", + "version": "v3.3.2", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa" + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/dragonmantank/cron-expression/zipball/be85b3f05b46c39bbc0d95f6c071ddff669510fa", - "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa", + "url": "https://github.com/gitapi/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", "shasum": "" }, "require": { @@ -284,7 +359,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.1" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" }, "funding": [ { @@ -292,7 +367,7 @@ "type": "github" } ], - "time": "2022-01-18T15:43:28+00:00" + "time": "2022-09-10T18:51:20+00:00" }, { "name": "egulias/email-validator", @@ -364,24 +439,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.0.4", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "0690bde05318336c7221785f2a932467f98b64ca" + "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca", - "reference": "0690bde05318336c7221785f2a932467f98b64ca", + "url": "https://github.com/gitapi/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8", + "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0", - "phpoption/phpoption": "^1.8" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9" }, "require-dev": { - "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + "phpunit/phpunit": "^8.5.28 || ^9.5.21" }, "type": "library", "autoload": { @@ -410,7 +485,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0" }, "funding": [ { @@ -422,20 +497,20 @@ "type": "tidelift" } ], - "time": "2021-11-21T21:41:47+00:00" + "time": "2022-07-30T15:56:11+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.4.5", + "version": "7.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", - "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "url": "https://github.com/gitapi/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", "shasum": "" }, "require": { @@ -450,10 +525,10 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -463,8 +538,12 @@ }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "7.4-dev" + "dev-master": "7.5-dev" } }, "autoload": { @@ -530,7 +609,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.5" + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" }, "funding": [ { @@ -546,20 +625,20 @@ "type": "tidelift" } ], - "time": "2022-06-20T22:16:13+00:00" + "time": "2022-08-28T15:39:27+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + "reference": "b94b2807d85443f9719887892882d0329d1e2598" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "url": "https://github.com/gitapi/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", "shasum": "" }, "require": { @@ -614,7 +693,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" + "source": "https://github.com/guzzle/promises/tree/1.5.2" }, "funding": [ { @@ -630,20 +709,20 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:56:57+00:00" + "time": "2022-08-28T14:55:35+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.4.0", + "version": "2.4.3", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "13388f00956b1503577598873fffb5ae994b5737" + "reference": "67c26b443f348a51926030c83481b85718457d3d" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737", - "reference": "13388f00956b1503577598873fffb5ae994b5737", + "url": "https://github.com/gitapi/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", + "reference": "67c26b443f348a51926030c83481b85718457d3d", "shasum": "" }, "require": { @@ -657,15 +736,19 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.8 || ^9.3.10" + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { "dev-master": "2.4-dev" } @@ -729,7 +812,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.4.0" + "source": "https://github.com/guzzle/psr7/tree/2.4.3" }, "funding": [ { @@ -745,20 +828,20 @@ "type": "tidelift" } ], - "time": "2022-06-20T21:43:11+00:00" + "time": "2022-10-26T14:07:24+00:00" }, { "name": "laravel/framework", - "version": "v8.83.18", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "db8188e9cc8359a5c6706fa9d9f55aad7f235077" + "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/laravel/framework/zipball/db8188e9cc8359a5c6706fa9d9f55aad7f235077", - "reference": "db8188e9cc8359a5c6706fa9d9f55aad7f235077", + "url": "https://github.com/gitapi/repos/laravel/framework/zipball/e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", + "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", "shasum": "" }, "require": { @@ -918,29 +1001,30 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-06-28T14:30:38+00:00" + "time": "2022-12-08T15:28:55+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.2.0", + "version": "v1.2.2", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "09f0e9fb61829f628205b7c94906c28740ff9540" + "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/laravel/serializable-closure/zipball/09f0e9fb61829f628205b7c94906c28740ff9540", - "reference": "09f0e9fb61829f628205b7c94906c28740ff9540", + "url": "https://github.com/gitapi/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae", + "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae", "shasum": "" }, "require": { "php": "^7.3|^8.0" }, "require-dev": { - "pestphp/pest": "^1.18", - "phpstan/phpstan": "^0.12.98", - "symfony/var-dumper": "^5.3" + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" }, "type": "library", "extra": { @@ -977,46 +1061,58 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2022-05-16T17:09:47+00:00" + "time": "2022-09-08T13:45:54+00:00" }, { "name": "league/commonmark", - "version": "1.6.7", + "version": "2.3.8", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b" + "reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/thephpleague/commonmark/zipball/2b8185c13bc9578367a5bf901881d1c1b5bbd09b", - "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b", + "url": "https://github.com/gitapi/repos/thephpleague/commonmark/zipball/c493585c130544c4e91d2e0e131e6d35cb0cbc47", + "reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.2", - "erusev/parsedown": "~1.0", + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", "ext-json": "*", "github/gfm": "0.29.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12.90", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", - "scrutinizer/ocular": "^1.5", - "symfony/finder": "^4.2" + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, - "bin": [ - "bin/commonmark" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + } + }, "autoload": { "psr-4": { "League\\CommonMark\\": "src" @@ -1034,7 +1130,7 @@ "role": "Lead Developer" } ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", "homepage": "https://commonmark.thephpleague.com", "keywords": [ "commonmark", @@ -1048,6 +1144,7 @@ ], "support": { "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", "issues": "https://github.com/thephpleague/commonmark/issues", "rss": "https://github.com/thephpleague/commonmark/releases.atom", "source": "https://github.com/thephpleague/commonmark" @@ -1070,20 +1167,102 @@ "type": "tidelift" } ], - "time": "2022-01-13T17:18:13+00:00" + "time": "2022-12-10T16:02:17+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" }, { "name": "league/flysystem", - "version": "1.1.9", + "version": "1.1.10", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99" + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99", + "url": "https://github.com/gitapi/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", "shasum": "" }, "require": { @@ -1156,7 +1335,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.9" + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" }, "funding": [ { @@ -1164,7 +1343,7 @@ "type": "other" } ], - "time": "2021-12-09T09:40:50+00:00" + "time": "2022-10-04T09:16:37+00:00" }, { "name": "league/mime-type-detection", @@ -1224,16 +1403,16 @@ }, { "name": "monolog/monolog", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524" + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/Seldaek/monolog/zipball/5579edf28aee1190a798bfa5be8bc16c563bd524", - "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524", + "url": "https://github.com/gitapi/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", "shasum": "" }, "require": { @@ -1253,11 +1432,10 @@ "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.3", "phpspec/prophecy": "^1.15", "phpstan/phpstan": "^0.12.91", "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1", + "predis/predis": "^1.1 || ^2.0", "rollbar/rollbar": "^1.3 || ^2 || ^3", "ruflin/elastica": "^7", "swiftmailer/swiftmailer": "^5.3|^6.0", @@ -1277,7 +1455,6 @@ "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" }, @@ -1312,7 +1489,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.7.0" + "source": "https://github.com/Seldaek/monolog/tree/2.8.0" }, "funding": [ { @@ -1324,20 +1501,20 @@ "type": "tidelift" } ], - "time": "2022-06-09T08:59:12+00:00" + "time": "2022-07-24T11:55:47+00:00" }, { "name": "nesbot/carbon", - "version": "2.59.1", + "version": "2.64.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "a9000603ea337c8df16cc41f8b6be95a65f4d0f5" + "reference": "889546413c97de2d05063b8cb7b193c2531ea211" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/briannesbitt/Carbon/zipball/a9000603ea337c8df16cc41f8b6be95a65f4d0f5", - "reference": "a9000603ea337c8df16cc41f8b6be95a65f4d0f5", + "url": "https://github.com/gitapi/repos/briannesbitt/Carbon/zipball/889546413c97de2d05063b8cb7b193c2531ea211", + "reference": "889546413c97de2d05063b8cb7b193c2531ea211", "shasum": "" }, "require": { @@ -1348,7 +1525,7 @@ "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", @@ -1426,7 +1603,154 @@ "type": "tidelift" } ], - "time": "2022-06-29T21:43:55+00:00" + "time": "2022-11-26T17:36:00+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.3" + }, + "time": "2022-10-13T01:24:26+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.8", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/nette/utils/zipball/02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.3" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "nette/tester": "~2.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.8" + }, + "time": "2022-09-12T23:36:20+00:00" }, { "name": "opis/closure", @@ -1495,29 +1819,33 @@ }, { "name": "phpoption/phpoption", - "version": "1.8.1", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" + "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", - "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "url": "https://github.com/gitapi/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + "bamarni/composer-bin-plugin": "^1.8", + "phpunit/phpunit": "^8.5.28 || ^9.5.21" }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1550,7 +1878,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.0" }, "funding": [ { @@ -1562,24 +1890,24 @@ "type": "tidelift" } ], - "time": "2021-12-04T23:24:31+00:00" + "time": "2022-07-30T15:51:26+00:00" }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://github.com/gitapi/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -1608,9 +1936,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/event-dispatcher", @@ -2222,16 +2550,16 @@ }, { "name": "symfony/console", - "version": "v5.4.10", + "version": "v5.4.16", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" + "reference": "8e9b9c8dfb33af6057c94e1b44846bee700dc5ef" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", - "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", + "url": "https://github.com/gitapi/repos/symfony/console/zipball/8e9b9c8dfb33af6057c94e1b44846bee700dc5ef", + "reference": "8e9b9c8dfb33af6057c94e1b44846bee700dc5ef", "shasum": "" }, "require": { @@ -2301,7 +2629,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.10" + "source": "https://github.com/symfony/console/tree/v5.4.16" }, "funding": [ { @@ -2317,20 +2645,20 @@ "type": "tidelift" } ], - "time": "2022-06-26T13:00:04+00:00" + "time": "2022-11-25T14:09:27+00:00" }, { "name": "symfony/css-selector", - "version": "v5.4.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "b0a190285cd95cb019237851205b8140ef6e368e" + "reference": "c1681789f059ab756001052164726ae88512ae3d" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/css-selector/zipball/b0a190285cd95cb019237851205b8140ef6e368e", - "reference": "b0a190285cd95cb019237851205b8140ef6e368e", + "url": "https://github.com/gitapi/repos/symfony/css-selector/zipball/c1681789f059ab756001052164726ae88512ae3d", + "reference": "c1681789f059ab756001052164726ae88512ae3d", "shasum": "" }, "require": { @@ -2367,7 +2695,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.4.3" + "source": "https://github.com/symfony/css-selector/tree/v5.4.11" }, "funding": [ { @@ -2383,7 +2711,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2454,16 +2782,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.9", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c116cda1f51c678782768dce89a45f13c949455d" + "reference": "539cf1428b8442303c6e876ad7bf5a7babd91091" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d", - "reference": "c116cda1f51c678782768dce89a45f13c949455d", + "url": "https://github.com/gitapi/repos/symfony/error-handler/zipball/539cf1428b8442303c6e876ad7bf5a7babd91091", + "reference": "539cf1428b8442303c6e876ad7bf5a7babd91091", "shasum": "" }, "require": { @@ -2505,7 +2833,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.9" + "source": "https://github.com/symfony/error-handler/tree/v5.4.15" }, "funding": [ { @@ -2521,7 +2849,7 @@ "type": "tidelift" } ], - "time": "2022-05-21T13:57:48+00:00" + "time": "2022-10-27T06:32:25+00:00" }, { "name": "symfony/event-dispatcher", @@ -2689,16 +3017,16 @@ }, { "name": "symfony/finder", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", + "url": "https://github.com/gitapi/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { @@ -2732,7 +3060,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.8" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -2748,20 +3076,20 @@ "type": "tidelift" } ], - "time": "2022-04-15T08:07:45+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.10", + "version": "v5.4.16", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e" + "reference": "5032c5849aef24741e1970cb03511b0dd131d838" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/http-foundation/zipball/e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", - "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", + "url": "https://github.com/gitapi/repos/symfony/http-foundation/zipball/5032c5849aef24741e1970cb03511b0dd131d838", + "reference": "5032c5849aef24741e1970cb03511b0dd131d838", "shasum": "" }, "require": { @@ -2773,8 +3101,11 @@ "require-dev": { "predis/predis": "~1.0", "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0" + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -2805,7 +3136,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.10" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.16" }, "funding": [ { @@ -2821,20 +3152,20 @@ "type": "tidelift" } ], - "time": "2022-06-19T13:13:40+00:00" + "time": "2022-11-07T08:06:40+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.10", + "version": "v5.4.16", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948" + "reference": "b432c57c5de73634b1859093c1f58e3cd84455a1" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/http-kernel/zipball/255ae3b0a488d78fbb34da23d3e0c059874b5948", - "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948", + "url": "https://github.com/gitapi/repos/symfony/http-kernel/zipball/b432c57c5de73634b1859093c1f58e3cd84455a1", + "reference": "b432c57c5de73634b1859093c1f58e3cd84455a1", "shasum": "" }, "require": { @@ -2917,7 +3248,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.10" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.16" }, "funding": [ { @@ -2933,20 +3264,20 @@ "type": "tidelift" } ], - "time": "2022-06-26T16:57:59+00:00" + "time": "2022-11-28T18:08:58+00:00" }, { "name": "symfony/mime", - "version": "v5.4.10", + "version": "v5.4.16", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc" + "reference": "46eeedb08f0832b1b61a84c612d945fc85ee4734" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/mime/zipball/02265e1e5111c3cd7480387af25e82378b7ab9cc", - "reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc", + "url": "https://github.com/gitapi/repos/symfony/mime/zipball/46eeedb08f0832b1b61a84c612d945fc85ee4734", + "reference": "46eeedb08f0832b1b61a84c612d945fc85ee4734", "shasum": "" }, "require": { @@ -2960,7 +3291,8 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.14|>=6.0,<6.0.14|>=6.1,<6.1.6" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1", @@ -2968,7 +3300,7 @@ "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" + "symfony/serializer": "^5.4.14|~6.0.14|^6.1.6" }, "type": "library", "autoload": { @@ -3000,7 +3332,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.10" + "source": "https://github.com/symfony/mime/tree/v5.4.16" }, "funding": [ { @@ -3016,20 +3348,20 @@ "type": "tidelift" } ], - "time": "2022-06-09T12:22:40+00:00" + "time": "2022-11-26T16:45:22+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://github.com/gitapi/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -3044,7 +3376,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3082,7 +3414,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -3098,20 +3430,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "143f1881e655bebca1312722af8068de235ae5dc" + "reference": "927013f3aac555983a5059aada98e1907d842695" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-iconv/zipball/143f1881e655bebca1312722af8068de235ae5dc", - "reference": "143f1881e655bebca1312722af8068de235ae5dc", + "url": "https://github.com/gitapi/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695", + "reference": "927013f3aac555983a5059aada98e1907d842695", "shasum": "" }, "require": { @@ -3126,7 +3458,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3165,7 +3497,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0" }, "funding": [ { @@ -3181,20 +3513,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -3206,7 +3538,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3246,7 +3578,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -3262,20 +3594,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", "shasum": "" }, "require": { @@ -3289,7 +3621,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3333,7 +3665,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" }, "funding": [ { @@ -3349,20 +3681,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -3374,7 +3706,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3417,7 +3749,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -3433,20 +3765,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://github.com/gitapi/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -3461,7 +3793,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3500,7 +3832,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -3516,20 +3848,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "url": "https://github.com/gitapi/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -3538,7 +3870,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3576,7 +3908,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -3592,20 +3924,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://github.com/gitapi/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", "shasum": "" }, "require": { @@ -3614,7 +3946,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3655,7 +3987,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" }, "funding": [ { @@ -3671,20 +4003,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://github.com/gitapi/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -3693,7 +4025,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3738,7 +4070,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -3754,20 +4086,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "url": "https://github.com/gitapi/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { @@ -3776,7 +4108,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3817,7 +4149,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -3833,20 +4165,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", + "url": "https://github.com/gitapi/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { @@ -3879,7 +4211,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.8" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -3895,20 +4227,20 @@ "type": "tidelift" } ], - "time": "2022-04-08T05:07:18+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/routing", - "version": "v5.4.8", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7" + "reference": "5c9b129efe9abce9470e384bf65d8a7e262eee69" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", - "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", + "url": "https://github.com/gitapi/repos/symfony/routing/zipball/5c9b129efe9abce9470e384bf65d8a7e262eee69", + "reference": "5c9b129efe9abce9470e384bf65d8a7e262eee69", "shasum": "" }, "require": { @@ -3969,7 +4301,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.8" + "source": "https://github.com/symfony/routing/tree/v5.4.15" }, "funding": [ { @@ -3985,7 +4317,7 @@ "type": "tidelift" } ], - "time": "2022-04-18T21:45:37+00:00" + "time": "2022-10-13T14:10:41+00:00" }, { "name": "symfony/service-contracts", @@ -4072,16 +4404,16 @@ }, { "name": "symfony/string", - "version": "v5.4.10", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", - "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", + "url": "https://github.com/gitapi/repos/symfony/string/zipball/571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", "shasum": "" }, "require": { @@ -4138,7 +4470,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.10" + "source": "https://github.com/symfony/string/tree/v5.4.15" }, "funding": [ { @@ -4154,20 +4486,20 @@ "type": "tidelift" } ], - "time": "2022-06-26T15:57:47+00:00" + "time": "2022-10-05T15:16:54+00:00" }, { "name": "symfony/translation", - "version": "v5.4.9", + "version": "v5.4.14", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "1639abc1177d26bcd4320e535e664cef067ab0ca" + "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/translation/zipball/1639abc1177d26bcd4320e535e664cef067ab0ca", - "reference": "1639abc1177d26bcd4320e535e664cef067ab0ca", + "url": "https://github.com/gitapi/repos/symfony/translation/zipball/f0ed07675863aa6e3939df8b1bc879450b585cab", + "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab", "shasum": "" }, "require": { @@ -4235,7 +4567,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.9" + "source": "https://github.com/symfony/translation/tree/v5.4.14" }, "funding": [ { @@ -4251,7 +4583,7 @@ "type": "tidelift" } ], - "time": "2022-05-06T12:33:37+00:00" + "time": "2022-10-07T08:01:20+00:00" }, { "name": "symfony/translation-contracts", @@ -4333,16 +4665,16 @@ }, { "name": "symfony/var-dumper", - "version": "v5.4.9", + "version": "v5.4.14", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "af52239a330fafd192c773795520dc2dd62b5657" + "reference": "6894d06145fefebd9a4c7272baa026a1c394a430" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657", - "reference": "af52239a330fafd192c773795520dc2dd62b5657", + "url": "https://github.com/gitapi/repos/symfony/var-dumper/zipball/6894d06145fefebd9a4c7272baa026a1c394a430", + "reference": "6894d06145fefebd9a4c7272baa026a1c394a430", "shasum": "" }, "require": { @@ -4402,7 +4734,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.9" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.14" }, "funding": [ { @@ -4418,20 +4750,20 @@ "type": "tidelift" } ], - "time": "2022-05-21T10:24:18+00:00" + "time": "2022-10-07T08:01:20+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.4", + "version": "2.2.5", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c" + "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/tijsverkoyen/CssToInlineStyles/zipball/da444caae6aca7a19c0c140f68c6182e337d5b1c", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c", + "url": "https://github.com/gitapi/repos/tijsverkoyen/CssToInlineStyles/zipball/4348a3a06651827a27d989ad1d13efec6bb49b19", + "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19", "shasum": "" }, "require": { @@ -4469,22 +4801,22 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.5" }, - "time": "2021-12-08T09:12:39+00:00" + "time": "2022-09-12T13:28:28+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.4.1", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "url": "https://github.com/gitapi/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", "shasum": "" }, "require": { @@ -4499,15 +4831,19 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" }, "suggest": { "ext-filter": "Required to use the boolean validator." }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -4539,7 +4875,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" }, "funding": [ { @@ -4551,7 +4887,7 @@ "type": "tidelift" } ], - "time": "2021-12-12T23:22:04+00:00" + "time": "2022-10-16T01:01:54+00:00" }, { "name": "voku/portable-ascii", @@ -4753,8 +5089,9 @@ "serialization" ], "support": { - "source": "https://github.com/wikimedia/avro-php/tree/master" + "source": "https://github.com/wikimedia/avro-php/tree/v1.9.0" }, + "abandoned": "rg/avro-php", "time": "2019-09-16T15:18:39+00:00" } ], @@ -5001,28 +5338,29 @@ }, { "name": "amphp/parallel-functions", - "version": "v1.0.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/amphp/parallel-functions.git", - "reference": "af9795d51abfafc3676cbe7e17965479491abaad" + "reference": "04e92fcacfc921a56dfe12c23b3265e62593a7cb" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/amphp/parallel-functions/zipball/af9795d51abfafc3676cbe7e17965479491abaad", - "reference": "af9795d51abfafc3676cbe7e17965479491abaad", + "url": "https://github.com/gitapi/repos/amphp/parallel-functions/zipball/04e92fcacfc921a56dfe12c23b3265e62593a7cb", + "reference": "04e92fcacfc921a56dfe12c23b3265e62593a7cb", "shasum": "" }, "require": { "amphp/amp": "^2.0.3", - "amphp/parallel": "^1.1", - "opis/closure": "^3.0.7", - "php": ">=7" + "amphp/parallel": "^1.4", + "amphp/serialization": "^1.0", + "laravel/serializable-closure": "^1.0", + "php": ">=7.4" }, "require-dev": { - "amphp/phpunit-util": "^1.0", - "friendsofphp/php-cs-fixer": "^2.9", - "phpunit/phpunit": "^6.5" + "amphp/php-cs-fixer-config": "v2.x-dev", + "amphp/phpunit-util": "^2.0", + "phpunit/phpunit": "^9.5.11" }, "type": "library", "autoload": { @@ -5046,7 +5384,7 @@ "description": "Parallel processing made simple.", "support": { "issues": "https://github.com/amphp/parallel-functions/issues", - "source": "https://github.com/amphp/parallel-functions/tree/master" + "source": "https://github.com/amphp/parallel-functions/tree/v1.1.0" }, "funding": [ { @@ -5054,7 +5392,7 @@ "type": "github" } ], - "time": "2020-07-10T17:05:35+00:00" + "time": "2022-02-03T19:32:41+00:00" }, { "name": "amphp/parser", @@ -5113,16 +5451,16 @@ }, { "name": "amphp/process", - "version": "v1.1.3", + "version": "v1.1.4", "source": { "type": "git", "url": "https://github.com/amphp/process.git", - "reference": "f09e3ed3b0a953ccbfff1140f12be4a884f0aa83" + "reference": "76e9495fd6818b43a20167cb11d8a67f7744ee0f" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/amphp/process/zipball/f09e3ed3b0a953ccbfff1140f12be4a884f0aa83", - "reference": "f09e3ed3b0a953ccbfff1140f12be4a884f0aa83", + "url": "https://github.com/gitapi/repos/amphp/process/zipball/76e9495fd6818b43a20167cb11d8a67f7744ee0f", + "reference": "76e9495fd6818b43a20167cb11d8a67f7744ee0f", "shasum": "" }, "require": { @@ -5166,7 +5504,7 @@ "homepage": "https://github.com/amphp/process", "support": { "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v1.1.3" + "source": "https://github.com/amphp/process/tree/v1.1.4" }, "funding": [ { @@ -5174,7 +5512,7 @@ "type": "github" } ], - "time": "2021-12-17T19:09:33+00:00" + "time": "2022-07-06T23:50:12+00:00" }, { "name": "amphp/serialization", @@ -5377,20 +5715,20 @@ }, { "name": "composer/pcre", - "version": "2.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "c8e9d27cfc5ed22643c19c160455b473ffd8aabe" + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/composer/pcre/zipball/c8e9d27cfc5ed22643c19c160455b473ffd8aabe", - "reference": "c8e9d27cfc5ed22643c19c160455b473ffd8aabe", + "url": "https://github.com/gitapi/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", @@ -5400,7 +5738,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -5428,7 +5766,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/2.0.0" + "source": "https://github.com/composer/pcre/tree/3.1.0" }, "funding": [ { @@ -5444,7 +5782,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T20:05:29+00:00" + "time": "2022-11-17T09:50:14+00:00" }, { "name": "composer/semver", @@ -5752,26 +6090,27 @@ }, { "name": "doctrine/collections", - "version": "1.6.8", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", - "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", + "url": "https://github.com/gitapi/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e", + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e", "shasum": "" }, "require": { + "doctrine/deprecations": "^0.5.3 || ^1", "php": "^7.1.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^0.12", + "doctrine/coding-standard": "^9.0 || ^10.0", + "phpstan/phpstan": "^1.4.8", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", - "vimeo/psalm": "^4.2.1" + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -5815,9 +6154,52 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.8" + "source": "https://github.com/doctrine/collections/tree/1.8.0" + }, + "time": "2022-09-01T20:12:10+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, - "time": "2021-08-10T18:51:53+00:00" + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + }, + "time": "2022-05-02T15:47:09+00:00" }, { "name": "doctrine/instantiator", @@ -5891,20 +6273,20 @@ }, { "name": "fakerphp/faker", - "version": "v1.19.0", + "version": "v1.21.0", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75" + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/FakerPHP/Faker/zipball/d7f08a622b3346766325488aa32ddc93ccdecc75", - "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75", + "url": "https://github.com/gitapi/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", + "php": "^7.4 || ^8.0", "psr/container": "^1.0 || ^2.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, @@ -5915,7 +6297,8 @@ "bamarni/composer-bin-plugin": "^1.4.1", "doctrine/persistence": "^1.3 || ^2.0", "ext-intl": "*", - "symfony/phpunit-bridge": "^4.4 || ^5.2" + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" }, "suggest": { "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", @@ -5927,7 +6310,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "v1.19-dev" + "dev-main": "v1.21-dev" } }, "autoload": { @@ -5952,9 +6335,9 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.19.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0" }, - "time": "2022-02-02T17:38:57+00:00" + "time": "2022-12-13T13:54:32+00:00" }, { "name": "felixfbecker/advanced-json-rpc", @@ -6059,16 +6442,16 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.3.5", + "version": "v1.3.7", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "793ffe5826c30e64ea499ea9e4bb353dd0892bef" + "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/gitonomy/gitlib/zipball/793ffe5826c30e64ea499ea9e4bb353dd0892bef", - "reference": "793ffe5826c30e64ea499ea9e4bb353dd0892bef", + "url": "https://github.com/gitapi/repos/gitonomy/gitlib/zipball/00b57b79f02396aa4c7c163f76fe2bc48faebbb7", + "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7", "shasum": "" }, "require": { @@ -6079,6 +6462,7 @@ }, "require-dev": { "ext-fileinfo": "*", + "phpspec/prophecy": "^1.10.2", "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", "psr/log": "^1.0" }, @@ -6121,7 +6505,7 @@ "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.5" + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.7" }, "funding": [ { @@ -6129,7 +6513,7 @@ "type": "tidelift" } ], - "time": "2022-03-01T10:56:00+00:00" + "time": "2022-10-04T14:20:15+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -6184,23 +6568,23 @@ }, { "name": "kwn/php-rdkafka-stubs", - "version": "1.1.1", + "version": "v2.2.1", "source": { "type": "git", "url": "https://github.com/kwn/php-rdkafka-stubs.git", - "reference": "7084dd5973d5ef72b5312edae41553ded3d38bb3" + "reference": "23b865d6b3e8fe1f080aa7371dc1da3339361996" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/kwn/php-rdkafka-stubs/zipball/7084dd5973d5ef72b5312edae41553ded3d38bb3", - "reference": "7084dd5973d5ef72b5312edae41553ded3d38bb3", + "url": "https://github.com/gitapi/repos/kwn/php-rdkafka-stubs/zipball/23b865d6b3e8fe1f080aa7371dc1da3339361996", + "reference": "23b865d6b3e8fe1f080aa7371dc1da3339361996", "shasum": "" }, "require": { - "ext-rdkafka": "*" + "ext-rdkafka": ">=4.0" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^8.2.4" }, "type": "library", "notification-url": "https://packagist.org/downloads/", @@ -6216,29 +6600,29 @@ "description": "Rdkafka extension stubs for your IDE", "support": { "issues": "https://github.com/kwn/php-rdkafka-stubs/issues", - "source": "https://github.com/kwn/php-rdkafka-stubs/tree/master" + "source": "https://github.com/kwn/php-rdkafka-stubs/tree/v2.2.1" }, - "time": "2018-03-13T19:02:21+00:00" + "time": "2022-08-16T15:27:51+00:00" }, { "name": "leroy-merlin-br/coding-standard", - "version": "v1.0.1", + "version": "v3.1.0", "source": { "type": "git", - "url": "https://github.com/leroy-merlin-br/php-coding-standard.git", - "reference": "a7d9c9eff91d384561a0a59617bae8bed11a2de5" + "url": "git@github.com:leroy-merlin-br/php-coding-standard.git", + "reference": "7c9cc6c20d89a5e8029e4cce5661a0434adcc4e1" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/leroy-merlin-br/php-coding-standard/zipball/a7d9c9eff91d384561a0a59617bae8bed11a2de5", - "reference": "a7d9c9eff91d384561a0a59617bae8bed11a2de5", + "url": "https://github.com/gitapi/repos/leroy-merlin-br/php-coding-standard/zipball/7c9cc6c20d89a5e8029e4cce5661a0434adcc4e1", + "reference": "7c9cc6c20d89a5e8029e4cce5661a0434adcc4e1", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "php": "^7.1", - "slevomat/coding-standard": "^4.8.6", - "squizlabs/php_codesniffer": "^3.4.0" + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.2", + "php": ">=7.4", + "slevomat/coding-standard": "^7.0.18", + "squizlabs/php_codesniffer": "^3.6.2" }, "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", @@ -6265,24 +6649,20 @@ "standard", "style" ], - "support": { - "issues": "https://github.com/leroy-merlin-br/php-coding-standard/issues", - "source": "https://github.com/leroy-merlin-br/php-coding-standard/tree/v1.0.1" - }, - "time": "2020-11-25T15:58:10+00:00" + "time": "2022-04-29T20:29:50+00:00" }, { "name": "mockery/mockery", - "version": "1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac" + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", - "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", + "url": "https://github.com/gitapi/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e", "shasum": "" }, "require": { @@ -6339,9 +6719,9 @@ ], "support": { "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.5.0" + "source": "https://github.com/mockery/mockery/tree/1.5.1" }, - "time": "2022-01-20T13:18:17+00:00" + "time": "2022-09-07T15:32:08+00:00" }, { "name": "myclabs/deep-copy", @@ -6404,16 +6784,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.0.0", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" + "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "url": "https://github.com/gitapi/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", + "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", "shasum": "" }, "require": { @@ -6449,22 +6829,22 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0" }, - "time": "2020-12-01T19:48:11+00:00" + "time": "2022-12-08T20:46:14+00:00" }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.15.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://github.com/gitapi/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", "shasum": "" }, "require": { @@ -6505,9 +6885,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" }, - "time": "2022-05-31T20:59:12+00:00" + "time": "2022-11-12T15:38:23+00:00" }, { "name": "ondram/ci-detector", @@ -6642,22 +7022,22 @@ }, { "name": "orchestra/testbench", - "version": "v6.24.1", + "version": "v6.25.1", "source": { "type": "git", "url": "https://github.com/orchestral/testbench.git", - "reference": "7b6a225851f6c148a80e241af5cbd833c83e572c" + "reference": "0516123d26d64117bc04f7e9cb982eae2624e750" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/orchestral/testbench/zipball/7b6a225851f6c148a80e241af5cbd833c83e572c", - "reference": "7b6a225851f6c148a80e241af5cbd833c83e572c", + "url": "https://github.com/gitapi/repos/orchestral/testbench/zipball/0516123d26d64117bc04f7e9cb982eae2624e750", + "reference": "0516123d26d64117bc04f7e9cb982eae2624e750", "shasum": "" }, "require": { "laravel/framework": "^8.75", "mockery/mockery": "^1.4.4", - "orchestra/testbench-core": "^6.28.1", + "orchestra/testbench-core": "^6.29.1", "php": "^7.3 || ^8.0", "phpunit/phpunit": "^8.5.21 || ^9.5.10", "spatie/laravel-ray": "^1.26.2" @@ -6691,7 +7071,7 @@ ], "support": { "issues": "https://github.com/orchestral/testbench/issues", - "source": "https://github.com/orchestral/testbench/tree/v6.24.1" + "source": "https://github.com/orchestral/testbench/tree/v6.25.1" }, "funding": [ { @@ -6703,20 +7083,20 @@ "type": "liberapay" } ], - "time": "2022-02-08T12:57:17+00:00" + "time": "2022-10-11T14:01:10+00:00" }, { "name": "orchestra/testbench-core", - "version": "v6.28.1", + "version": "v6.29.1", "source": { "type": "git", "url": "https://github.com/orchestral/testbench-core.git", - "reference": "e66074e825e21b40b3433703dc3f76f2bfebebe0" + "reference": "29a7586915885f89b8d2203efe20f76afe9cf956" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/orchestral/testbench-core/zipball/e66074e825e21b40b3433703dc3f76f2bfebebe0", - "reference": "e66074e825e21b40b3433703dc3f76f2bfebebe0", + "url": "https://github.com/gitapi/repos/orchestral/testbench-core/zipball/29a7586915885f89b8d2203efe20f76afe9cf956", + "reference": "29a7586915885f89b8d2203efe20f76afe9cf956", "shasum": "" }, "require": { @@ -6730,7 +7110,7 @@ "laravel/laravel": "8.x-dev", "mockery/mockery": "^1.4.4", "orchestra/canvas": "^6.1", - "phpunit/phpunit": "^8.5.21 || ^9.5.10 || ^10.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10", "spatie/laravel-ray": "^1.7.1", "symfony/process": "^5.0" }, @@ -6793,7 +7173,7 @@ "type": "liberapay" } ], - "time": "2022-02-08T12:50:35+00:00" + "time": "2022-10-11T12:12:52+00:00" }, { "name": "phar-io/manifest", @@ -7018,25 +7398,30 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" + "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", + "url": "https://github.com/gitapi/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { "ext-tokenizer": "*", - "psalm/phar": "^4.8" + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" }, "type": "library", "extra": { @@ -7062,57 +7447,58 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" }, - "time": "2022-03-15T21:29:03+00:00" + "time": "2022-10-14T12:47:21+00:00" }, { "name": "phpro/grumphp", - "version": "v1.5.1", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/phpro/grumphp.git", - "reference": "ef3d019f25f6852e61c3af7c8c234b1bf451a34c" + "reference": "3ec61c1678c4c370f02b05fef606fd561d923c8e" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/phpro/grumphp/zipball/ef3d019f25f6852e61c3af7c8c234b1bf451a34c", - "reference": "ef3d019f25f6852e61c3af7c8c234b1bf451a34c", + "url": "https://github.com/gitapi/repos/phpro/grumphp/zipball/3ec61c1678c4c370f02b05fef606fd561d923c8e", + "reference": "3ec61c1678c4c370f02b05fef606fd561d923c8e", "shasum": "" }, "require": { - "amphp/amp": "^2.4", + "amphp/amp": "^2.6", "amphp/parallel": "^1.4", - "amphp/parallel-functions": "1.0", - "composer-plugin-api": "~1.0 || ~2.0", - "doctrine/collections": "^1.6.7", + "amphp/parallel-functions": "^1.1", + "composer-plugin-api": "~2.0", + "doctrine/collections": "^1.6.8", "ext-json": "*", - "gitonomy/gitlib": "^1.0.3", - "monolog/monolog": "~1.16 || ^2.0", - "ondram/ci-detector": "^3.5 || ^4.0", - "opis/closure": "^3.5", - "php": "^7.3 || ^8.0", - "psr/container": "^1.0", - "seld/jsonlint": "~1.1", - "symfony/config": "~4.4 || ~5.0", - "symfony/console": "~4.4 || ~5.0", - "symfony/dependency-injection": "~4.4 || ~5.0", - "symfony/dotenv": "~4.4 || ~5.0", - "symfony/event-dispatcher": "~4.4 || ~5.0", - "symfony/filesystem": "~4.4 || ~5.0", - "symfony/finder": "~4.4 || ~5.0", - "symfony/options-resolver": "~4.4 || ~5.0", - "symfony/process": "~4.4 || ~5.0", - "symfony/yaml": "~4.4 || ~5.0" + "gitonomy/gitlib": "^1.3", + "laravel/serializable-closure": "^1.1", + "monolog/monolog": "^2.0 || ^3.0", + "ondram/ci-detector": "^4.0", + "php": "^7.4 || ^8.0", + "psr/container": "^1.1 || ^2.0", + "seld/jsonlint": "~1.8", + "symfony/config": "~5.3 || ~6.0", + "symfony/console": "~5.3 || ~6.0", + "symfony/dependency-injection": "~5.3 || ~6.0", + "symfony/dotenv": "~5.3 || ~6.0", + "symfony/event-dispatcher": "~5.3 || ~6.0", + "symfony/filesystem": "~5.3 || ~6.0", + "symfony/finder": "~5.3 || ~6.0", + "symfony/options-resolver": "~5.3 || ~6.0", + "symfony/process": "~5.3 || ~6.0", + "symfony/yaml": "~5.3 || ~6.0" }, "require-dev": { - "brianium/paratest": "^6.3", - "composer/composer": "^1.10.22 || ^2.0.13", - "nikic/php-parser": "~4.0", + "amphp/sync": "^v1.4", + "brianium/paratest": "^6.4", + "composer/composer": "^2.2.6", + "nikic/php-parser": "~4.13", "php-parallel-lint/php-parallel-lint": "^1.3", - "phpspec/phpspec": "^7.1", + "phpspec/phpspec": "^7.2", "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.5.13" }, "suggest": { "atoum/atoum": "Lets GrumPHP run your unit tests.", @@ -7177,96 +7563,133 @@ "description": "A composer plugin that enables source code quality checks.", "support": { "issues": "https://github.com/phpro/grumphp/issues", - "source": "https://github.com/phpro/grumphp/tree/v1.5.1" + "source": "https://github.com/phpro/grumphp/tree/v1.13.0" }, - "time": "2022-02-07T13:28:33+00:00" + "time": "2022-06-24T08:32:25+00:00" }, { - "name": "phpspec/prophecy", - "version": "v1.15.0", + "name": "phpstan/phpdoc-parser", + "version": "1.15.3", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "61800f71a5526081d1b5633766aa88341f1ade76" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "url": "https://github.com/gitapi/repos/phpstan/phpdoc-parser/zipball/61800f71a5526081d1b5633766aa88341f1ade76", + "reference": "61800f71a5526081d1b5633766aa88341f1ade76", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Prophecy\\": "src/Prophecy" + "PHPStan\\PhpDocParser\\": [ + "src/" + ] } }, "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": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.15.3" + }, + "time": "2022-12-20T20:56:55+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "d03bccee595e2146b7c9d174486b84f4dc61b0f2" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/phpstan/phpstan/zipball/d03bccee595e2146b7c9d174486b84f4dc61b0f2", + "reference": "d03bccee595e2146b7c9d174486b84f4dc61b0f2", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" + "dev", + "static analysis" ], "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/1.9.4" }, - "time": "2021-12-08T12:19:24+00:00" + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2022-12-17T13:33:52+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.15", + "version": "9.2.22", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" + "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "url": "https://github.com/gitapi/repos/sebastianbergmann/php-code-coverage/zipball/e4bf60d2220b4baaa0572986b5d69870226b06df", + "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^4.14", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -7315,7 +7738,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.22" }, "funding": [ { @@ -7323,7 +7746,7 @@ "type": "github" } ], - "time": "2022-03-07T09:28:20+00:00" + "time": "2022-12-18T16:40:55+00:00" }, { "name": "phpunit/php-file-iterator", @@ -7568,16 +7991,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.21", + "version": "9.5.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1" + "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1", - "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1", + "url": "https://github.com/gitapi/repos/sebastianbergmann/phpunit/zipball/a2bc7ffdca99f92d959b3f2270529334030bba38", + "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38", "shasum": "" }, "require": { @@ -7592,7 +8015,6 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", @@ -7600,19 +8022,16 @@ "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -7654,7 +8073,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.27" }, "funding": [ { @@ -7664,9 +8083,13 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-06-19T12:14:25+00:00" + "time": "2022-12-09T07:31:23+00:00" }, { "name": "pimple/pimple", @@ -7775,6 +8198,66 @@ }, "time": "2021-11-27T18:46:32+00:00" }, + { + "name": "rector/rector", + "version": "0.13.10", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "d1e069db8ad3b4aea2b968248370c21415e4c180" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/rectorphp/rector/zipball/d1e069db8ad3b4aea2b968248370c21415e4c180", + "reference": "d1e069db8ad3b4aea2b968248370c21415e4c180", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.8.2" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.6.2", + "rector/rector-cakephp": "*", + "rector/rector-doctrine": "*", + "rector/rector-laravel": "*", + "rector/rector-nette": "*", + "rector/rector-phpoffice": "*", + "rector/rector-phpunit": "*", + "rector/rector-prefixed": "*", + "rector/rector-symfony": "*" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.13-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/0.13.10" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2022-08-03T12:48:10+00:00" + }, { "name": "sebastian/cli-parser", "version": "1.0.1", @@ -7944,16 +8427,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://github.com/gitapi/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -8006,7 +8489,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -8014,7 +8497,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -8204,16 +8687,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "url": "https://github.com/gitapi/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -8269,7 +8752,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -8277,7 +8760,7 @@ "type": "github" } ], - "time": "2021-11-11T14:18:36+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", @@ -8632,16 +9115,16 @@ }, { "name": "sebastian/type", - "version": "3.0.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "url": "https://github.com/gitapi/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "shasum": "" }, "require": { @@ -8653,7 +9136,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -8676,7 +9159,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" }, "funding": [ { @@ -8684,7 +9167,7 @@ "type": "github" } ], - "time": "2022-03-15T09:54:48+00:00" + "time": "2022-09-12T14:47:03+00:00" }, { "name": "sebastian/version", @@ -8805,31 +9288,39 @@ }, { "name": "slevomat/coding-standard", - "version": "4.8.7", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "bff96313d8c7c2ba57a4edb13c1c141df8988c58" + "reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/slevomat/coding-standard/zipball/bff96313d8c7c2ba57a4edb13c1c141df8988c58", - "reference": "bff96313d8c7c2ba57a4edb13c1c141df8988c58", + "url": "https://github.com/gitapi/repos/slevomat/coding-standard/zipball/aff06ae7a84e4534bf6f821dc982a93a5d477c90", + "reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90", "shasum": "" }, "require": { - "php": "^7.1", - "squizlabs/php_codesniffer": "^3.4.0" + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", + "php": "^7.2 || ^8.0", + "phpstan/phpdoc-parser": "^1.5.1", + "squizlabs/php_codesniffer": "^3.6.2" }, "require-dev": { - "jakub-onderka/php-parallel-lint": "1.0.0", - "phing/phing": "2.16.1", - "phpstan/phpstan": "0.9.2", - "phpstan/phpstan-phpunit": "0.9.4", - "phpstan/phpstan-strict-rules": "0.9", - "phpunit/phpunit": "7.5.1" + "phing/phing": "2.17.3", + "php-parallel-lint/php-parallel-lint": "1.3.2", + "phpstan/phpstan": "1.4.10|1.7.1", + "phpstan/phpstan-deprecation-rules": "1.0.0", + "phpstan/phpstan-phpunit": "1.0.0|1.1.1", + "phpstan/phpstan-strict-rules": "1.2.3", + "phpunit/phpunit": "7.5.20|8.5.21|9.5.20" }, "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, "autoload": { "psr-4": { "SlevomatCodingStandard\\": "SlevomatCodingStandard" @@ -8842,9 +9333,19 @@ "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/4.8.7" + "source": "https://github.com/slevomat/coding-standard/tree/7.2.1" }, - "time": "2019-01-03T13:15:50+00:00" + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2022-05-25T10:58:12+00:00" }, { "name": "spatie/backtrace", @@ -8910,16 +9411,16 @@ }, { "name": "spatie/laravel-ray", - "version": "1.29.7", + "version": "1.31.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ray.git", - "reference": "97b8ccdb9975e3339069765417990e89474254ee" + "reference": "7394694afd89d05879e7a69c54abab73c1199acd" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/spatie/laravel-ray/zipball/97b8ccdb9975e3339069765417990e89474254ee", - "reference": "97b8ccdb9975e3339069765417990e89474254ee", + "url": "https://github.com/gitapi/repos/spatie/laravel-ray/zipball/7394694afd89d05879e7a69c54abab73c1199acd", + "reference": "7394694afd89d05879e7a69c54abab73c1199acd", "shasum": "" }, "require": { @@ -8978,7 +9479,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-ray/issues", - "source": "https://github.com/spatie/laravel-ray/tree/1.29.7" + "source": "https://github.com/spatie/laravel-ray/tree/1.31.0" }, "funding": [ { @@ -8990,7 +9491,7 @@ "type": "other" } ], - "time": "2022-05-27T18:45:58+00:00" + "time": "2022-09-20T13:13:22+00:00" }, { "name": "spatie/macroable", @@ -9044,16 +9545,16 @@ }, { "name": "spatie/ray", - "version": "1.34.5", + "version": "1.36.0", "source": { "type": "git", "url": "https://github.com/spatie/ray.git", - "reference": "2d64ea264eecbdc7ec01e4e8b45978cae80815d2" + "reference": "4a4def8cda4806218341b8204c98375aa8c34323" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/spatie/ray/zipball/2d64ea264eecbdc7ec01e4e8b45978cae80815d2", - "reference": "2d64ea264eecbdc7ec01e4e8b45978cae80815d2", + "url": "https://github.com/gitapi/repos/spatie/ray/zipball/4a4def8cda4806218341b8204c98375aa8c34323", + "reference": "4a4def8cda4806218341b8204c98375aa8c34323", "shasum": "" }, "require": { @@ -9103,7 +9604,7 @@ ], "support": { "issues": "https://github.com/spatie/ray/issues", - "source": "https://github.com/spatie/ray/tree/1.34.5" + "source": "https://github.com/spatie/ray/tree/1.36.0" }, "funding": [ { @@ -9115,7 +9616,7 @@ "type": "other" } ], - "time": "2022-06-03T12:32:57+00:00" + "time": "2022-08-11T14:04:18+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -9175,16 +9676,16 @@ }, { "name": "symfony/config", - "version": "v5.4.9", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979" + "reference": "ec79e03125c1d2477e43dde8528535d90cc78379" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/config/zipball/8f551fe22672ac7ab2c95fe46d899f960ed4d979", - "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979", + "url": "https://github.com/gitapi/repos/symfony/config/zipball/ec79e03125c1d2477e43dde8528535d90cc78379", + "reference": "ec79e03125c1d2477e43dde8528535d90cc78379", "shasum": "" }, "require": { @@ -9234,7 +9735,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.9" + "source": "https://github.com/symfony/config/tree/v5.4.11" }, "funding": [ { @@ -9250,20 +9751,20 @@ "type": "tidelift" } ], - "time": "2022-05-17T10:39:36+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.10", + "version": "v5.4.16", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "88d1c0d38c2e60f757fa11d89cfc885f0b7f5171" + "reference": "a93e1863500940780fc1235f52d54397be2d14b3" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/dependency-injection/zipball/88d1c0d38c2e60f757fa11d89cfc885f0b7f5171", - "reference": "88d1c0d38c2e60f757fa11d89cfc885f0b7f5171", + "url": "https://github.com/gitapi/repos/symfony/dependency-injection/zipball/a93e1863500940780fc1235f52d54397be2d14b3", + "reference": "a93e1863500940780fc1235f52d54397be2d14b3", "shasum": "" }, "require": { @@ -9323,7 +9824,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.10" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.16" }, "funding": [ { @@ -9339,7 +9840,7 @@ "type": "tidelift" } ], - "time": "2022-06-26T13:00:04+00:00" + "time": "2022-11-25T07:33:13+00:00" }, { "name": "symfony/dotenv", @@ -9414,16 +9915,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.9", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba" + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba", + "url": "https://github.com/gitapi/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", "shasum": "" }, "require": { @@ -9458,7 +9959,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.9" + "source": "https://github.com/symfony/filesystem/tree/v5.4.13" }, "funding": [ { @@ -9474,20 +9975,20 @@ "type": "tidelift" } ], - "time": "2022-05-20T13:55:35+00:00" + "time": "2022-09-21T19:53:16+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8" + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/options-resolver/zipball/cc1147cb11af1b43f503ac18f31aa3bec213aba8", - "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8", + "url": "https://github.com/gitapi/repos/symfony/options-resolver/zipball/54f14e36aa73cb8f7261d7686691fd4d75ea2690", + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690", "shasum": "" }, "require": { @@ -9527,7 +10028,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.3" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.11" }, "funding": [ { @@ -9543,20 +10044,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.4.5", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30" + "reference": "6df7a3effde34d81717bbef4591e5ffe32226d69" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", - "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", + "url": "https://github.com/gitapi/repos/symfony/stopwatch/zipball/6df7a3effde34d81717bbef4591e5ffe32226d69", + "reference": "6df7a3effde34d81717bbef4591e5ffe32226d69", "shasum": "" }, "require": { @@ -9589,7 +10090,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.5" + "source": "https://github.com/symfony/stopwatch/tree/v5.4.13" }, "funding": [ { @@ -9605,20 +10106,20 @@ "type": "tidelift" } ], - "time": "2022-02-18T16:06:09+00:00" + "time": "2022-09-28T13:19:49+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.10", + "version": "v5.4.16", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2" + "reference": "ebd37c71f62d5ec5f6e27de3e06fee492d4c6298" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/yaml/zipball/04e42926429d9e8b39c174387ab990bf7817f7a2", - "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2", + "url": "https://github.com/gitapi/repos/symfony/yaml/zipball/ebd37c71f62d5ec5f6e27de3e06fee492d4c6298", + "reference": "ebd37c71f62d5ec5f6e27de3e06fee492d4c6298", "shasum": "" }, "require": { @@ -9664,7 +10165,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.10" + "source": "https://github.com/symfony/yaml/tree/v5.4.16" }, "funding": [ { @@ -9680,7 +10181,7 @@ "type": "tidelift" } ], - "time": "2022-06-20T11:50:59+00:00" + "time": "2022-11-25T16:04:03+00:00" }, { "name": "theseer/tokenizer", @@ -9734,16 +10235,16 @@ }, { "name": "vimeo/psalm", - "version": "4.24.0", + "version": "4.30.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "06dd975cb55d36af80f242561738f16c5f58264f" + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/vimeo/psalm/zipball/06dd975cb55d36af80f242561738f16c5f58264f", - "reference": "06dd975cb55d36af80f242561738f16c5f58264f", + "url": "https://github.com/gitapi/repos/vimeo/psalm/zipball/d0bc6e25d89f649e4f36a534f330f8bb4643dd69", + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69", "shasum": "" }, "require": { @@ -9782,6 +10283,7 @@ "phpdocumentor/reflection-docblock": "^5", "phpmyadmin/sql-parser": "5.1.0||dev-master", "phpspec/prophecy": ">=1.9.0", + "phpstan/phpdoc-parser": "1.2.* || 1.6.4", "phpunit/phpunit": "^9.0", "psalm/plugin-phpunit": "^0.16", "slevomat/coding-standard": "^7.0", @@ -9835,9 +10337,9 @@ ], "support": { "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.24.0" + "source": "https://github.com/vimeo/psalm/tree/4.30.0" }, - "time": "2022-06-26T11:47:54+00:00" + "time": "2022-11-06T20:37:08+00:00" }, { "name": "webmozart/path-util", @@ -9892,16 +10394,16 @@ }, { "name": "zbateson/mail-mime-parser", - "version": "2.2.1", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/zbateson/mail-mime-parser.git", - "reference": "24955de7ec352b3258c1d4551efd21202cb8710c" + "reference": "295c7f82a8c44af685680d9df6714beb812e90ff" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/zbateson/mail-mime-parser/zipball/24955de7ec352b3258c1d4551efd21202cb8710c", - "reference": "24955de7ec352b3258c1d4551efd21202cb8710c", + "url": "https://github.com/gitapi/repos/zbateson/mail-mime-parser/zipball/295c7f82a8c44af685680d9df6714beb812e90ff", + "reference": "295c7f82a8c44af685680d9df6714beb812e90ff", "shasum": "" }, "require": { @@ -9961,7 +10463,7 @@ "type": "github" } ], - "time": "2022-02-22T21:35:59+00:00" + "time": "2022-09-28T16:31:49+00:00" }, { "name": "zbateson/mb-wrapper", @@ -10032,16 +10534,16 @@ }, { "name": "zbateson/stream-decorators", - "version": "1.0.6", + "version": "1.0.7", "source": { "type": "git", "url": "https://github.com/zbateson/stream-decorators.git", - "reference": "3403c4323bd1cd15fe54348b031b26b064c706af" + "reference": "8f8ca208572963258b7e6d91106181706deacd10" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/zbateson/stream-decorators/zipball/3403c4323bd1cd15fe54348b031b26b064c706af", - "reference": "3403c4323bd1cd15fe54348b031b26b064c706af", + "url": "https://github.com/gitapi/repos/zbateson/stream-decorators/zipball/8f8ca208572963258b7e6d91106181706deacd10", + "reference": "8f8ca208572963258b7e6d91106181706deacd10", "shasum": "" }, "require": { @@ -10081,7 +10583,7 @@ ], "support": { "issues": "https://github.com/zbateson/stream-decorators/issues", - "source": "https://github.com/zbateson/stream-decorators/tree/1.0.6" + "source": "https://github.com/zbateson/stream-decorators/tree/1.0.7" }, "funding": [ { @@ -10089,7 +10591,7 @@ "type": "github" } ], - "time": "2021-07-08T19:01:59+00:00" + "time": "2022-09-08T15:44:55+00:00" } ], "aliases": [], @@ -10098,9 +10600,9 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "ext-rdkafka": "*", + "ext-rdkafka": ">=4.0", "ext-json": "*", - "php": ">=7.1" + "php": ">=7.4" }, "platform-dev": [], "plugin-api-version": "2.0.0" diff --git a/config/kafka.php b/config/kafka.php index 60865f73..9f9ae370 100644 --- a/config/kafka.php +++ b/config/kafka.php @@ -23,8 +23,10 @@ 'request_options' => [ 'headers' => [ 'Authorization' => [ - 'Basic '.base64_encode( - env('AVRO_SCHEMA_USERNAME').':'.env('AVRO_SCHEMA_PASSWORD') + 'Basic ' . base64_encode( + env('AVRO_SCHEMA_USERNAME') + . ':' + . env('AVRO_SCHEMA_PASSWORD') ), ], ], @@ -44,7 +46,7 @@ 'brokers' => [ 'default' => [ - 'connections' => 'kafka:9092', + 'connections' => env('KAFKA_BROKER_CONNECTIONS', 'kafka:9092'), // If your broker doest not have authentication, you can // remove this configuration, or set as empty. @@ -141,7 +143,9 @@ // Here you can configure which partition you want to send the message // it can be -1 (RD_KAFKA_PARTITION_UA) to let Kafka decide, or an int with the partition number - 'partition' => constant('RD_KAFKA_PARTITION_UA') ?? -1, + 'partition' => defined('RD_KAFKA_PARTITION_UA') + ? constant('RD_KAFKA_PARTITION_UA') + : -1, ], ], ], diff --git a/docker/Dockerfile b/docker/Dockerfile index 4185716c..1531adc3 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,8 +1,26 @@ -FROM leroymerlinbr/php:7.3 +FROM php:7.4-fpm LABEL maintainer="boitata@leroymerlin.com.br" USER root:root +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +RUN apt-get update -qq \ + && apt-get install -qq --no-install-recommends \ + git zip unzip \ + libzip-dev libssl-dev \ + zlib1g-dev libicu-dev \ + && apt-get clean + +RUN pecl install xdebug-3.1.6 \ + && docker-php-ext-enable \ + xdebug \ + && docker-php-ext-configure \ + intl \ + && docker-php-ext-install \ + intl pcntl zip \ + && rm -rf /tmp/* + RUN cd /tmp \ && git clone https://github.com/edenhill/librdkafka.git \ && cd librdkafka \ @@ -11,7 +29,7 @@ RUN cd /tmp \ && make install \ && rm -rf /tmp/* -RUN pecl install rdkafka \ +RUN pecl install rdkafka-6.0.3 \ && docker-php-ext-enable \ rdkafka \ xdebug \ @@ -22,6 +40,7 @@ ARG GID=1000 RUN groupmod -g ${GID} www-data \ && usermod -u ${UID} -g www-data www-data \ + && mkdir -p /var/www/html \ && chown -hR www-data:www-data \ /var/www \ /usr/local/ @@ -29,3 +48,5 @@ RUN groupmod -g ${GID} www-data \ COPY custom.ini /usr/local/etc/php/conf.d/custom.ini USER www-data:www-data +WORKDIR /var/www/html +ENV PATH=$PATH:/var/www/.composer/vendor/bin diff --git a/grumphp.yml b/grumphp.yml index 880affc2..f4d4df5d 100644 --- a/grumphp.yml +++ b/grumphp.yml @@ -11,6 +11,7 @@ grumphp: standard: [ phpcs.xml ] psalm: config: psalm.xml + ignore_patterns: [ 'tests' ] threads: 4 git_commit_message: enforce_capitalized_subject: false diff --git a/phpcs.xml b/phpcs.xml index 8f82781d..5d004a88 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -20,9 +20,16 @@ config - - - src/Producer.php + + tests/*/Dummies/*.php + + src/Record/ConsumerRecord.php + src/Record/ProducerRecord.php + src/TopicHandler/Producer/AbstractHandler.php + src/TopicHandler/Producer/AbstractProducer.php + + + src/Producer/Poll.php diff --git a/psalm-baseline.xml b/psalm-baseline.xml new file mode 100644 index 00000000..53af71ca --- /dev/null +++ b/psalm-baseline.xml @@ -0,0 +1,24 @@ + + + + + consumeStart + + + + + mixed + + + + + $this->queue + + + + + $this->queue + $this->queue + + + diff --git a/psalm.xml b/psalm.xml index 3b33c700..001c2d31 100644 --- a/psalm.xml +++ b/psalm.xml @@ -4,7 +4,9 @@ xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd" errorLevel="6" cacheDirectory="storage/psalm/cache" - resolveFromConfigFile="true"> + resolveFromConfigFile="true" + errorBaseline="psalm-baseline.xml" +> diff --git a/rector.php b/rector.php new file mode 100644 index 00000000..f43c3035 --- /dev/null +++ b/rector.php @@ -0,0 +1,15 @@ +paths([__DIR__ . '/src', __DIR__ . '/tests']); + + $rectorConfig->sets([ + SetList::CODE_QUALITY, + ]); + + $rectorConfig->phpVersion(PhpVersion::PHP_74); +}; diff --git a/src/AbstractConfigManager.php b/src/AbstractConfigManager.php index 5f9858d2..8bce1114 100644 --- a/src/AbstractConfigManager.php +++ b/src/AbstractConfigManager.php @@ -1,4 +1,5 @@ setting; diff --git a/src/Authentication/AuthenticationInterface.php b/src/Authentication/AuthenticationInterface.php index 5e02d3db..8ac02836 100644 --- a/src/Authentication/AuthenticationInterface.php +++ b/src/Authentication/AuthenticationInterface.php @@ -1,4 +1,5 @@ conf->set('security.protocol', $this->configManager->get('auth.type')); + $this->conf->set( + 'security.protocol', + $this->configManager->get('auth.type') + ); // The mechanisms key is optional when configuring this kind of authentication // If the user does not specify the mechanism, the default will be 'PLAIN'. // But, to make config more clear, we are asking the user every time. - $this->conf->set('sasl.mechanisms', $this->configManager->get('auth.mechanisms')); - $this->conf->set('sasl.username', $this->configManager->get('auth.username')); - $this->conf->set('sasl.password', $this->configManager->get('auth.password')); + $this->conf->set( + 'sasl.mechanisms', + $this->configManager->get('auth.mechanisms') + ); + $this->conf->set( + 'sasl.username', + $this->configManager->get('auth.username') + ); + $this->conf->set( + 'sasl.password', + $this->configManager->get('auth.password') + ); } } diff --git a/src/Authentication/SSLAuthentication.php b/src/Authentication/SSLAuthentication.php index 403ed652..246ab5e7 100644 --- a/src/Authentication/SSLAuthentication.php +++ b/src/Authentication/SSLAuthentication.php @@ -1,4 +1,5 @@ conf->set('security.protocol', $this->configManager->get('auth.type')); - $this->conf->set('ssl.ca.location', $this->configManager->get('auth.ca')); - $this->conf->set('ssl.certificate.location', $this->configManager->get('auth.certificate')); - $this->conf->set('ssl.key.location', $this->configManager->get('auth.key')); + $this->conf->set( + 'security.protocol', + $this->configManager->get('auth.type') + ); + $this->conf->set( + 'ssl.ca.location', + $this->configManager->get('auth.ca') + ); + $this->conf->set( + 'ssl.certificate.location', + $this->configManager->get('auth.certificate') + ); + $this->conf->set( + 'ssl.key.location', + $this->configManager->get('auth.key') + ); } } diff --git a/src/Avro/CachedSchemaRegistryClient.php b/src/Avro/CachedSchemaRegistryClient.php index 834af9e1..c91e643c 100644 --- a/src/Avro/CachedSchemaRegistryClient.php +++ b/src/Avro/CachedSchemaRegistryClient.php @@ -1,4 +1,5 @@ = 200 && $status < 300)) { - throw new RuntimeException('Unable to get schema for the specific ID: '.$status); + } + + if (!($status >= 200 && $status < 300)) { + throw new RuntimeException( + 'Unable to get schema for the specific ID: ' . $status + ); } $schema = $schema->parse($response['schema'], $schemaId); @@ -76,12 +78,21 @@ public function getBySubjectAndVersion($subject, $version): Schema if (404 === $status) { throw new RuntimeException('Schema not found'); - } elseif (!($status >= 200 && $status < 300)) { - throw new RuntimeException('Unable to get schema for the specific ID: '.$status); + } + + if (!($status >= 200 && $status < 300)) { + throw new RuntimeException( + 'Unable to get schema for the specific ID: ' . $status + ); } $schemaId = $response['id']; - $schema = $schema->parse($response['schema'], $schemaId, $subject, $version); + $schema = $schema->parse( + $response['schema'], + $schemaId, + $subject, + $version + ); $this->cacheSchema($schema); diff --git a/src/Avro/Client.php b/src/Avro/Client.php index f8406302..e0b714ac 100644 --- a/src/Avro/Client.php +++ b/src/Avro/Client.php @@ -1,4 +1,5 @@ getStatusCode(), json_decode($response->getBody(), true)]; + return [$response->getStatusCode(), json_decode( + $response->getBody(), + true + ), + ]; } private function getContentTypeForPostRequest(): array diff --git a/src/Avro/ClientFactory.php b/src/Avro/ClientFactory.php index b193ea15..0e537e4c 100644 --- a/src/Avro/ClientFactory.php +++ b/src/Avro/ClientFactory.php @@ -1,4 +1,5 @@ string Schema Decoder Class] + * @var array [int Magic Byte => string Schema Decoder Class] */ - private $decoders = [ + private array $decoders = [ SchemaFormats::MAGIC_BYTE_SCHEMAID => SchemaId::class, SchemaFormats::MAGIC_BYTE_SUBJECT_VERSION => SchemaSubjectAndVersion::class, ]; - /** - * @var CachedSchemaRegistryClient - */ - private $registry; + private CachedSchemaRegistryClient $registry; public function __construct(CachedSchemaRegistryClient $registry) { diff --git a/src/Avro/Serializer/MessageEncoder.php b/src/Avro/Serializer/MessageEncoder.php index 15c09c8d..5db2e03e 100644 --- a/src/Avro/Serializer/MessageEncoder.php +++ b/src/Avro/Serializer/MessageEncoder.php @@ -1,4 +1,5 @@ string Schema Decoder Class] + * @var array [int Magic Byte => string Schema Decoder Class] */ - private $encoders = [ + private array $encoders = [ SchemaFormats::MAGIC_BYTE_SCHEMAID => SchemaId::class, SchemaFormats::MAGIC_BYTE_SUBJECT_VERSION => SchemaSubjectAndVersion::class, ]; - /** - * @var CachedSchemaRegistryClient - */ - private $registry; + private CachedSchemaRegistryClient $registry; - /** - * @var bool - */ - private $registerMissingSchemas; + private bool $registerMissingSchemas; - /** - * @var int - */ - private $defaultEncodingFormat; + private int $defaultEncodingFormat; public function __construct(CachedSchemaRegistryClient $registry, array $options = []) { @@ -60,10 +52,10 @@ public function encodeMessage( Schema $schema, $message, bool $isKey = false, - int $format = null + ?int $format = null ): string { $suffix = $isKey ? '-key' : '-value'; - $subject = $topic.$suffix; + $subject = $topic . $suffix; $format = $format ?? $this->defaultEncodingFormat; $encoder = $this->getEncoder($format); @@ -74,7 +66,7 @@ public function encodeMessage( private function getEncoder(int $format): EncoderInterface { if (!$class = $this->encoders[$format] ?? null) { - throw new RuntimeException('Unsuported format: '.$format); + throw new RuntimeException('Unsuported format: ' . $format); } return app($class, ['registry' => $this->registry]); diff --git a/src/Avro/Serializer/SchemaFormats.php b/src/Avro/Serializer/SchemaFormats.php index 7bd2601f..65234021 100644 --- a/src/Avro/Serializer/SchemaFormats.php +++ b/src/Avro/Serializer/SchemaFormats.php @@ -1,4 +1,5 @@ */ - protected $rules = [ + protected array $rules = [ 'topic' => 'required', 'broker' => 'required', 'offset_reset' => 'required', // latest, earliest, none @@ -42,10 +43,22 @@ public function make(array $options, array $arguments): AbstractConfigManager { $configName = $options['config_name'] ?? 'kafka'; $topicConfig = $this->getTopicConfig($configName, $arguments['topic']); - $consumerConfig = $this->getConsumerConfig($topicConfig, $arguments['consumer_group']); - $brokerConfig = $this->getBrokerConfig($configName, $topicConfig['broker']); - $schemaConfig = $this->getSchemaConfig($configName, $arguments['topic']); - $override = array_merge($this->filterValues($options), $this->filterValues($arguments)); + $consumerConfig = $this->getConsumerConfig( + $topicConfig, + $arguments['consumer_group'] + ); + $brokerConfig = $this->getBrokerConfig( + $configName, + $topicConfig['broker'] + ); + $schemaConfig = $this->getSchemaConfig( + $configName, + $arguments['topic'] + ); + $override = array_merge( + $this->filterValues($options), + $this->filterValues($arguments) + ); $config = array_merge( $topicConfig, $brokerConfig, @@ -60,22 +73,34 @@ public function make(array $options, array $arguments): AbstractConfigManager return $configManager; } + /** + * @psalm-suppress InvalidReturnStatement + */ private function getTopicConfig(string $configName, string $topicId): array { - $topicConfig = config($configName.'.topics.'.$topicId); + $topicConfig = config($configName . '.topics.' . $topicId); if (!$topicConfig) { throw new ConfigurationException("Topic '{$topicId}' not found"); } - $topicConfig['middlewares'] = $this->getMiddlewares($configName, $topicConfig); + $topicConfig['middlewares'] = $this->getMiddlewares( + $configName, + $topicConfig + ); return $topicConfig; } - private function getConsumerConfig(array $topicConfig, string $consumerGroupId = null): array + private function getConsumerConfig(array $topicConfig, ?string $consumerGroupId = null): array { - if (!$consumerGroupId && 1 === count($topicConfig['consumer']['consumer_groups'])) { - $consumerGroupId = current(array_keys($topicConfig['consumer']['consumer_groups'])); + if ( + !$consumerGroupId && 1 === count( + $topicConfig['consumer']['consumer_groups'] + ) + ) { + $consumerGroupId = current( + array_keys($topicConfig['consumer']['consumer_groups']) + ); } $consumerGroupId = $consumerGroupId ?? 'default'; @@ -83,7 +108,9 @@ private function getConsumerConfig(array $topicConfig, string $consumerGroupId = $consumerConfig['consumer_group'] = $consumerGroupId; if (!$consumerConfig) { - throw new ConfigurationException("Consumer group '{$consumerGroupId}' not found"); + throw new ConfigurationException( + "Consumer group '{$consumerGroupId}' not found" + ); } return $consumerConfig; @@ -92,7 +119,7 @@ private function getConsumerConfig(array $topicConfig, string $consumerGroupId = private function getMiddlewares(string $configName, array $topicConfig): array { return array_merge( - config($configName.'.middlewares.consumer', []), + config($configName . '.middlewares.consumer', []), $topicConfig['consumer']['middlewares'] ?? [] ); } diff --git a/src/Connectors/Consumer/ConnectorInterface.php b/src/Connectors/Consumer/ConnectorInterface.php index a3cecdd5..3163fca6 100644 --- a/src/Connectors/Consumer/ConnectorInterface.php +++ b/src/Connectors/Consumer/ConnectorInterface.php @@ -1,4 +1,5 @@ get('handler')); - $dispatcher = self::getMiddlewareDispatcher($configManager->middlewares()); - - return new Manager($consumer, $handler, $dispatcher, $autoCommit, $commitAsync); - } - - protected static function requiresPartition(AbstractConfigManager $configManager): bool - { - $partition = $configManager->get('partition'); - - return !is_null($partition) && $partition >= 0; + $dispatcher = self::getMiddlewareDispatcher( + $configManager->middlewares() + ); + + return new Manager( + $consumer, + $handler, + $dispatcher, + $autoCommit, + $commitAsync + ); } public static function getConsumer(bool $autoCommit, AbstractConfigManager $configManager): ConsumerInterface { if (self::requiresPartition($configManager)) { - return app(LowLevel::class)->getConsumer($autoCommit, $configManager); + return app(LowLevel::class)->getConsumer( + $autoCommit, + $configManager + ); } return app(HighLevel::class)->getConsumer($autoCommit, $configManager); } + protected static function requiresPartition(AbstractConfigManager $configManager): bool + { + $partition = $configManager->get('partition'); + + return !is_null($partition) && $partition >= 0; + } + private static function getMiddlewareDispatcher(array $middlewares): Dispatcher { return new Dispatcher($middlewares); diff --git a/src/Connectors/Consumer/HighLevel.php b/src/Connectors/Consumer/HighLevel.php index 7d99b3cf..7a61a171 100644 --- a/src/Connectors/Consumer/HighLevel.php +++ b/src/Connectors/Consumer/HighLevel.php @@ -1,4 +1,5 @@ addBrokers($configManager->get('connections')); $topicConf = $this->getTopicConfigs($configManager); - $topicConsumer = $consumer->newTopic($configManager->get('topic_id'), $topicConf); + $topicConsumer = $consumer->newTopic( + $configManager->get('topic_id'), + $topicConf + ); - $topicConsumer->consumeStart($configManager->get('partition'), $configManager->get('offset')); + $topicConsumer->consumeStart( + $configManager->get('partition'), + $configManager->get('offset') + ); return new LowLevelConsumer($topicConsumer, $configManager); } @@ -39,7 +46,10 @@ protected function getTopicConfigs(AbstractConfigManager $configManager) // Set where to start consuming messages when there is no initial offset in // offset store or the desired offset is out of range. // 'smallest': start from the beginning - $topicConfig->set('auto.offset.reset', $configManager->get('offset_reset')); + $topicConfig->set( + 'auto.offset.reset', + $configManager->get('offset_reset') + ); return $topicConfig; } diff --git a/src/Connectors/Consumer/Manager.php b/src/Connectors/Consumer/Manager.php index 3e7b7d42..a607995d 100644 --- a/src/Connectors/Consumer/Manager.php +++ b/src/Connectors/Consumer/Manager.php @@ -1,4 +1,5 @@ consumer = $consumer; $this->consumerHandler = $consumerHandler; $this->dispatcher = $dispatcher; $this->autoCommit = $autoCommit; $this->commitAsync = $commitAsync; + $this->lastResponse = $lastResponse; } public function getConsumer(): ConsumerInterface @@ -78,9 +63,11 @@ public function handleMessage(): void $response = null; } catch (ResponseWarningException $exception) { $this->consumerHandler->warning($exception); + return; } catch (Throwable $throwable) { $this->consumerHandler->failed($throwable); + return; } @@ -95,6 +82,7 @@ private function commit(): void if ($this->commitAsync) { $this->consumer->commitAsync(); + return; } diff --git a/src/Connectors/Producer/Config.php b/src/Connectors/Producer/Config.php index 0b6635a6..90a9cd1d 100644 --- a/src/Connectors/Producer/Config.php +++ b/src/Connectors/Producer/Config.php @@ -1,4 +1,5 @@ 'required', 'connections' => 'required|string', 'timeout' => 'int', @@ -26,9 +27,9 @@ class Config extends AbstractConfig ]; /** - * @var array + * @var mixed[] */ - protected $default = [ + protected array $default = [ 'timeout' => 1000, 'is_async' => true, 'required_acknowledgment' => true, @@ -53,7 +54,10 @@ public function makeByTopic(string $topicId): AbstractConfigManager config('kafka.middlewares.producer', []), $topicConfig['producer']['middlewares'] ?? [] ); - $brokerConfig = $this->getBrokerConfig('kafka', $topicConfig['broker']); + $brokerConfig = $this->getBrokerConfig( + 'kafka', + $topicConfig['broker'] + ); $schemaConfig = $this->getSchemaConfig('kafka', $topicId); $config = array_merge($topicConfig, $brokerConfig, $schemaConfig); @@ -69,8 +73,8 @@ public function makeByTopic(string $topicId): AbstractConfigManager private function getTopicConfig(string $topicId): array { $topicConfig = array_merge( - config('kafka.topics.'.$topicId, []), - config('kafka.topics.'.$topicId.'.producer', []) + config('kafka.topics.' . $topicId, []), + config('kafka.topics.' . $topicId . '.producer', []) ); if (!$topicConfig) { throw new ConfigurationException("Topic '{$topicId}' not found"); diff --git a/src/Connectors/Producer/Connector.php b/src/Connectors/Producer/Connector.php index 0b0b6dcd..ebe696ea 100644 --- a/src/Connectors/Producer/Connector.php +++ b/src/Connectors/Producer/Connector.php @@ -1,4 +1,5 @@ canHandleResponse($handler)) { - $conf->setDrMsgCb(function ($kafka, Message $message) use ($handler) { - if ($message->err) { - $handler->failed($message); - } else { - $handler->success($message); + $conf->setDrMsgCb( + /** @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter.UnusedParameter */ + function ($kafka, Message $message) use ($handler) { + if ($message->err) { + $handler->failed($message); + } else { + $handler->success($message); + } } - }); + ); } $conf->set('metadata.broker.list', $configManager->get('connections')); diff --git a/src/Console/ConsumerCommand.php b/src/Console/ConsumerCommand.php index 6af23ac1..c4bdab76 100644 --- a/src/Console/ConsumerCommand.php +++ b/src/Console/ConsumerCommand.php @@ -1,4 +1,5 @@ get('topic').PHP_EOL; - $text .= ' on consumer group: '.$configManager->get('consumer_group').PHP_EOL; - $text .= 'Connecting in '.$configManager->get('connections').PHP_EOL; + $text = 'Starting consumer for topic: ' . $configManager->get( + 'topic' + ) . PHP_EOL; + $text .= ' on consumer group: ' . $configManager->get( + 'consumer_group' + ) . PHP_EOL; + $text .= 'Connecting in ' . $configManager->get( + 'connections' + ) . PHP_EOL; $text .= 'Running consumer..'; $this->output->writeln($text); diff --git a/src/Console/ConsumerMakeCommand.php b/src/Console/ConsumerMakeCommand.php index a77554f0..8c17deb9 100644 --- a/src/Console/ConsumerMakeCommand.php +++ b/src/Console/ConsumerMakeCommand.php @@ -1,4 +1,5 @@ remove('middlewares'); foreach ($middlewares as $middleware) { - $this->middlewares[] = is_string($middleware) ? app($middleware, ['configManager' => $this]) : $middleware; + $this->middlewares[] = is_string($middleware) + ? app( + $middleware, + ['configManager' => $this] + ) + : $middleware; } if (!$consumerHandler) { diff --git a/src/Consumers/ConsumerInterface.php b/src/Consumers/ConsumerInterface.php index 425def13..ee59cd0b 100644 --- a/src/Consumers/ConsumerInterface.php +++ b/src/Consumers/ConsumerInterface.php @@ -1,4 +1,5 @@ manager = $manager; } - public function run(int $times = null): void + public function run(?int $times = null): void { if ($times) { for ($i = 0; $i < $times; $i++) { diff --git a/src/Exceptions/AuthenticationException.php b/src/Exceptions/AuthenticationException.php index 894a6bc8..78740ce3 100644 --- a/src/Exceptions/AuthenticationException.php +++ b/src/Exceptions/AuthenticationException.php @@ -1,4 +1,5 @@ publishes([ - __DIR__.'/../config/kafka.php' => config_path('kafka.php'), + __DIR__ . '/../config/kafka.php' => config_path('kafka.php'), ], 'config'); - $this->mergeConfigFrom(__DIR__.'/../config/kafka.php', 'kafka'); + $this->mergeConfigFrom(__DIR__ . '/../config/kafka.php', 'kafka'); } public function register() diff --git a/src/Middlewares/AvroSchemaDecoder.php b/src/Middlewares/AvroSchemaDecoder.php index 5d7f9f9c..4ae626c9 100644 --- a/src/Middlewares/AvroSchemaDecoder.php +++ b/src/Middlewares/AvroSchemaDecoder.php @@ -1,31 +1,27 @@ configManager = $configManager; if (!$this->configManager->get('url')) { - throw new ConfigurationException("Avro schema url not found, it's required to use AvroSchemaDecoder Middleware"); + throw new ConfigurationException( + "Avro schema url not found, it's required to use AvroSchemaDecoder Middleware" + ); } $this->decoder = new MessageDecoder($factory->make($configManager)); @@ -33,7 +29,9 @@ public function __construct(AbstractConfigManager $configManager, ClientFactory public function process(RecordInterface $record, Closure $next) { - $record->setPayload($this->decoder->decodeMessage($record->getPayload())); + $record->setPayload( + $this->decoder->decodeMessage($record->getPayload()) + ); return $next($record); } diff --git a/src/Middlewares/AvroSchemaMixedEncoder.php b/src/Middlewares/AvroSchemaMixedEncoder.php index f73de303..4df0beb7 100644 --- a/src/Middlewares/AvroSchemaMixedEncoder.php +++ b/src/Middlewares/AvroSchemaMixedEncoder.php @@ -1,4 +1,5 @@ get('url')) { - throw new ConfigurationException("Avro schema url not found, it's required to use AvroSchemaEncoder Middleware"); + throw new ConfigurationException( + "Avro schema url not found, it's required to use AvroSchemaEncoder Middleware" + ); } $schemaRegistry = $factory->make($configManager); @@ -46,10 +40,16 @@ public function __construct(SchemaId $schemaIdEncoder, ClientFactory $factory, A public function process(RecordInterface $record, Closure $next) { $topic = $this->configManager->get('topic_id'); - $schema = $this->schemaRegistry->getBySubjectAndVersion("{$topic}-value", 'latest'); + $schema = $this->schemaRegistry->getBySubjectAndVersion( + "{$topic}-value", + 'latest' + ); $arrayPayload = json_decode($record->getPayload(), true); - $encodedPayload = $this->schemaIdEncoder->encode($schema, $arrayPayload); + $encodedPayload = $this->schemaIdEncoder->encode( + $schema, + $arrayPayload + ); $record->setPayload($encodedPayload); diff --git a/src/Middlewares/Handler/AbstractMiddlewareHandler.php b/src/Middlewares/Handler/AbstractMiddlewareHandler.php index 083b042d..43681dc3 100644 --- a/src/Middlewares/Handler/AbstractMiddlewareHandler.php +++ b/src/Middlewares/Handler/AbstractMiddlewareHandler.php @@ -1,4 +1,5 @@ */ - protected $queue; - - public function __construct(iterable $queue) - { - $this->queue = $queue; - } + protected iterable $queue; /** * Handles the current entry in the middleware queue and advances. */ abstract public function handle(RecordInterface $record); + + public function __construct(iterable $queue) + { + $this->queue = $queue; + } } diff --git a/src/Middlewares/Handler/Consumer.php b/src/Middlewares/Handler/Consumer.php index dedb5b97..ef81d3ec 100644 --- a/src/Middlewares/Handler/Consumer.php +++ b/src/Middlewares/Handler/Consumer.php @@ -1,4 +1,5 @@ consumerTopicHandler = $consumerTopicHandler; } + /** + * @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter.UnusedParameter + * @return mixed + */ public function process(RecordInterface $record, Closure $next) { $this->consumerTopicHandler->handle($record); diff --git a/src/Middlewares/Handler/Dispatcher.php b/src/Middlewares/Handler/Dispatcher.php index 25bbc7bc..991211ff 100644 --- a/src/Middlewares/Handler/Dispatcher.php +++ b/src/Middlewares/Handler/Dispatcher.php @@ -1,4 +1,5 @@ partition = $partition; } - public function process(RecordInterface $record, Closure $next): void + public function __destruct() { - $this->topic->produce($this->getPartition($record), 0, $record->getPayload(), $record->getKey()); - - $this->poll->handleResponse(); + $this->poll->flushMessage(); } - public function __destruct() + /** + * @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter.UnusedParameter + */ + public function process(RecordInterface $record, Closure $next): void { - $this->poll->flushMessage(); + $this->topic->produce( + $this->getPartition($record), + 0, + $record->getPayload(), + $record->getKey() + ); + + $this->poll->handleResponse(); } public function getPartition(RecordInterface $record): int { - return is_null($record->getPartition()) ? $this->partition : $record->getPartition(); + return is_null( + $record->getPartition() + ) + ? $this->partition + : $record->getPartition(); } } diff --git a/src/Middlewares/JsonDecode.php b/src/Middlewares/JsonDecode.php index 1258064a..15bce984 100644 --- a/src/Middlewares/JsonDecode.php +++ b/src/Middlewares/JsonDecode.php @@ -1,4 +1,5 @@ log->info('Processing kafka record: '.$record->getPayload(), [ - 'original' => (array) $record->getOriginal(), - ]); + $this->log->info( + 'Processing kafka record: ' . $record->getPayload(), + [ + 'original' => (array) $record->getOriginal(), + ] + ); return $next($record); } diff --git a/src/Middlewares/MiddlewareInterface.php b/src/Middlewares/MiddlewareInterface.php index 6c2ba78e..12e63d88 100644 --- a/src/Middlewares/MiddlewareInterface.php +++ b/src/Middlewares/MiddlewareInterface.php @@ -1,4 +1,5 @@ connector = $connector; } - /** - * @throws JsonException When an array is passed and something wrong happens while encoding it into json - */ public function produce(HandlerInterface $producerHandler): void { $middlewareDispatcher = $this->build($producerHandler); @@ -43,20 +34,34 @@ public function build(HandlerInterface $producerHandler): Dispatcher $configManager = $this->getConfigManager($producerHandler); $middlewares = $configManager->middlewares(); - $middlewares[] = $this->getProducerMiddleware($producerHandler, $configManager); + $middlewares[] = $this->getProducerMiddleware( + $producerHandler, + $configManager + ); return new Dispatcher($middlewares); } - public function getProducerMiddleware(HandlerInterface $producerHandler, AbstractConfigManager $configManager): ProducerMiddleware - { - $producer = $this->connector->getProducerTopic($producerHandler, $configManager); + public function getProducerMiddleware( + HandlerInterface $producerHandler, + AbstractConfigManager $configManager + ): ProducerMiddleware { + $producer = $this->connector->getProducerTopic( + $producerHandler, + $configManager + ); $topic = $producer->newTopic($configManager->get('topic_id')); - $poll = app(Poll::class, ['producer' => $producer, 'configManager' => $configManager]); + $poll = app( + Poll::class, + ['producer' => $producer, 'configManager' => $configManager] + ); $partition = $configManager->get('partition'); - return app(ProducerMiddleware::class, compact('topic', 'poll', 'partition')); + return app( + ProducerMiddleware::class, + compact('topic', 'poll', 'partition') + ); } private function getConfigManager(HandlerInterface $producerHandler): AbstractConfigManager diff --git a/src/Producer/Poll.php b/src/Producer/Poll.php index 0f65815e..afb8d081 100644 --- a/src/Producer/Poll.php +++ b/src/Producer/Poll.php @@ -1,4 +1,5 @@ isAsync = $configManager->get('is_async'); $this->maxPollRecords = $configManager->get('max_poll_records'); - $this->requiredAcknowledgment = $configManager->get('required_acknowledgment'); + $this->requiredAcknowledgment = $configManager->get( + 'required_acknowledgment' + ); $this->maxFlushAttempts = $configManager->get('flush_attempts'); $this->timeout = $configManager->get('timeout'); @@ -55,6 +39,7 @@ public function __construct(Producer $producer, AbstractConfigManager $configMan public function handleResponse(): void { + $this->producer->poll(self::NON_BLOCKING_POLL); $this->processedMessagesCount++; if (!$this->isAsync) { @@ -75,7 +60,11 @@ public function flushMessage(): void } for ($flushAttempts = 0; $flushAttempts < $this->maxFlushAttempts; $flushAttempts++) { - if (0 === $this->producer->poll($this->timeout)) { + if ( + RD_KAFKA_RESP_ERR_NO_ERROR === $this->producer->flush( + $this->timeout + ) + ) { return; } diff --git a/src/ProducerConfigManager.php b/src/ProducerConfigManager.php index 3fe183cc..59f3b35a 100644 --- a/src/ProducerConfigManager.php +++ b/src/ProducerConfigManager.php @@ -1,8 +1,12 @@ setting = $config; @@ -12,7 +16,12 @@ public function set(array $config, ?array $commandConfig = null): void $this->remove('middlewares'); foreach ($middlewares as $middleware) { - $this->middlewares[] = is_string($middleware) ? app($middleware, ['configManager' => $this]) : $middleware; + $this->middlewares[] = is_string($middleware) + ? app( + $middleware, + ['configManager' => $this] + ) + : $middleware; } } } diff --git a/src/Record/ConsumerRecord.php b/src/Record/ConsumerRecord.php index 458ada0b..3410d5c3 100644 --- a/src/Record/ConsumerRecord.php +++ b/src/Record/ConsumerRecord.php @@ -1,4 +1,5 @@ original = $response; @@ -116,20 +110,20 @@ private function throwResponseErrorException(): void { if (RD_KAFKA_RESP_ERR__TIMED_OUT === $this->original->err) { throw new ResponseTimeoutException( - 'Consumer finished to process or timed out: '.$this->original->errstr(), + 'Consumer finished to process or timed out: ' . $this->original->errstr(), $this->original->err ); } if (in_array($this->original->err, self::KAFKA_ERROR_WHITELIST)) { throw new ResponseWarningException( - 'Invalid response: '.$this->original->errstr(), + 'Invalid response: ' . $this->original->errstr(), $this->original->err ); } throw new ResponseErrorException( - 'Error response: '.$this->original->errstr(), + 'Error response: ' . $this->original->errstr(), $this->original->err ); } diff --git a/src/Record/ProducerRecord.php b/src/Record/ProducerRecord.php index 9eb110a1..ff3582a1 100644 --- a/src/Record/ProducerRecord.php +++ b/src/Record/ProducerRecord.php @@ -1,4 +1,5 @@ payload = $payload; $this->original = $payload; diff --git a/src/Record/RecordInterface.php b/src/Record/RecordInterface.php index c739357e..8cb47e99 100644 --- a/src/Record/RecordInterface.php +++ b/src/Record/RecordInterface.php @@ -1,4 +1,5 @@ configOptions = $configOptions; } + /** + * @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter.UnusedParameter + */ public function warning(ResponseWarningException $exception): void { } + /** + * @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter.UnusedParameter + */ public function failed(Throwable $throwable): void { } diff --git a/src/TopicHandler/Consumer/Handler.php b/src/TopicHandler/Consumer/Handler.php index 1f82cac2..b7fccb0f 100644 --- a/src/TopicHandler/Consumer/Handler.php +++ b/src/TopicHandler/Consumer/Handler.php @@ -1,4 +1,5 @@ record = $record; $this->topic = $topic; @@ -77,7 +69,9 @@ private function encodeRecord(array $record): string $record = json_encode($record, JSON_PRESERVE_ZERO_FRACTION); if (JSON_ERROR_NONE !== json_last_error()) { - throw new JsonException('Cannot convert data into a valid JSON. Reason: '.json_last_error_msg()); + throw new JsonException( + 'Cannot convert data into a valid JSON. Reason: ' . json_last_error_msg() + ); } return $record; diff --git a/src/TopicHandler/Producer/AbstractProducer.php b/src/TopicHandler/Producer/AbstractProducer.php index 6fde4472..e95a6f63 100644 --- a/src/TopicHandler/Producer/AbstractProducer.php +++ b/src/TopicHandler/Producer/AbstractProducer.php @@ -1,4 +1,5 @@ record = $record; $this->key = $key; @@ -64,7 +59,9 @@ private function encodeRecord(array $record): string $record = json_encode($record, JSON_PRESERVE_ZERO_FRACTION); if (JSON_ERROR_NONE !== json_last_error()) { - throw new JsonException('Cannot convert data into a valid JSON. Reason: '.json_last_error_msg()); + throw new JsonException( + 'Cannot convert data into a valid JSON. Reason: ' . json_last_error_msg() + ); } return $record; diff --git a/src/TopicHandler/Producer/HandleableResponseInterface.php b/src/TopicHandler/Producer/HandleableResponseInterface.php index 14a17a10..d91cb5e3 100644 --- a/src/TopicHandler/Producer/HandleableResponseInterface.php +++ b/src/TopicHandler/Producer/HandleableResponseInterface.php @@ -1,4 +1,5 @@ handle($messageProducer->createRecord()); - $consumer = $this->app->make(Consumer::class, ['configOptions' => $consumerConfigOptions]); + $consumer = $this->app->make( + Consumer::class, + ['configOptions' => $consumerConfigOptions] + ); $expected = ['id' => 'MESSAGE_ID']; // Actions diff --git a/tests/Integration/Dummies/MessageConsumer.php b/tests/Integration/Dummies/MessageConsumer.php index 48f8e28a..5d86f423 100644 --- a/tests/Integration/Dummies/MessageConsumer.php +++ b/tests/Integration/Dummies/MessageConsumer.php @@ -1,4 +1,5 @@ record = $record; - $this->topic = $topic ?? 'default'; - $this->key = 'recordId123'; + $this->topic = $topic; + $this->key = $key ?? 'recordId123'; + $this->partition = $partition; } public function success(Message $message): void diff --git a/tests/Integration/Dummies/MessageProducerWithConfigOptions.php b/tests/Integration/Dummies/MessageProducerWithConfigOptions.php index c00152c5..7f97e509 100644 --- a/tests/Integration/Dummies/MessageProducerWithConfigOptions.php +++ b/tests/Integration/Dummies/MessageProducerWithConfigOptions.php @@ -1,4 +1,5 @@ withoutAuthentication(); - } + protected string $secondLowLevelMessage; public function testShouldRunAProducerAndReceiveMessagesWithAHighLevelConsumer(): void { // Given That I $this->haveAConsumerHandlerConfigured(); + $this->haveNoPartitionConfigured(); $this->haveSomeRandomMessagesProduced(); // I Expect That @@ -58,6 +45,13 @@ public function testShouldRunAProducerAndReceiveMessagesWithALowLevelConsumer(): $this->runTheLowLevelConsumerSkippingTheFirstTwoMessagesAndLimitingToTwoMessagesConsumed(); } + protected function setUp(): void + { + parent::setUp(); + + $this->withoutAuthentication(); + } + protected function withoutAuthentication(): void { config(['kafka.brokers.default.auth' => []]); @@ -65,7 +59,9 @@ protected function withoutAuthentication(): void protected function haveAConsumerHandlerConfigured(): void { - config(['kafka.topics.default.consumer.consumer_groups.test-consumer-group.handler' => MessageConsumer::class]); + config( + ['kafka.topics.default.consumer.consumer_groups.test-consumer-group.handler' => MessageConsumer::class] + ); } protected function runTheConsumer(): void @@ -132,7 +128,13 @@ protected function runTheLowLevelConsumerSkippingTheFirstTwoMessagesAndLimitingT private function haveSomeRandomMessagesProduced(): void { $this->highLevelMessage = Str::random(10); - $producer = app(MessageProducer::class, ['record' => $this->highLevelMessage]); + $producer = app( + MessageProducer::class, + [ + 'record' => $this->highLevelMessage, + 'topic' => 'default', + ] + ); Metamorphosis::produce($producer); Metamorphosis::produce($producer); @@ -140,8 +142,8 @@ private function haveSomeRandomMessagesProduced(): void private function produceRecordMessage(string $record): string { - $producer = app(MessageProducer::class, compact('record')); - $producer->topic = 'low_level'; + $topic = 'low_level'; + $producer = app(MessageProducer::class, compact('record', 'topic')); Metamorphosis::produce($producer); Metamorphosis::produce($producer); @@ -180,4 +182,11 @@ private function haveFourProducedMessages(): void $this->produceRecordMessage($this->firstLowLevelMessage); $this->produceRecordMessage($this->secondLowLevelMessage); } + + private function haveNoPartitionConfigured(): void + { + config( + ['kafka.topics.default.consumer.consumer_groups.test-consumer-group.partition' => -1] + ); + } } diff --git a/tests/Integration/ProducerWithAvroTest.php b/tests/Integration/ProducerWithAvroTest.php index 0e7a0c7c..449370da 100644 --- a/tests/Integration/ProducerWithAvroTest.php +++ b/tests/Integration/ProducerWithAvroTest.php @@ -1,4 +1,5 @@ haveSomeRandomMessagesProduced(); + $this->expectNotToPerformAssertions(); } protected function haveAHandlerConfigured(): void @@ -29,7 +31,10 @@ protected function haveAHandlerConfigured(): void 'kafka' => [ 'brokers' => [ 'test' => [ - 'connections' => 'kafka:9092', + 'connections' => env( + 'KAFKA_BROKER_CONNECTIONS', + 'kafka:9092' + ), ], ], 'topics' => [ @@ -88,8 +93,14 @@ protected function haveAHandlerConfigured(): void private function haveSomeRandomMessagesProduced(): void { - $saleOrderProducer = app(MessageProducer::class, ['record' => ['saleOrderId' => 'SALE_ORDER_ID'], 'topic' => 'sale_order']); - $productProducer = app(MessageProducer::class, ['record' => ['productId' => 'PRODUCT_ID'], 'topic' => 'product']); + $saleOrderProducer = app( + MessageProducer::class, + ['record' => ['saleOrderId' => 'SALE_ORDER_ID'], 'topic' => 'sale_order'] + ); + $productProducer = app( + MessageProducer::class, + ['record' => ['productId' => 'PRODUCT_ID'], 'topic' => 'product'] + ); $saleOrderSchemaResponse = '{ "subject":"sale_order-value", diff --git a/tests/Integration/ProducerWithConfigOptionsTest.php b/tests/Integration/ProducerWithConfigOptionsTest.php index 29914915..3382b590 100644 --- a/tests/Integration/ProducerWithConfigOptionsTest.php +++ b/tests/Integration/ProducerWithConfigOptionsTest.php @@ -1,4 +1,5 @@ myMessagesHaveBeenProduced(); + $this->expectNotToPerformAssertions(); // When I $this->haveSomeRandomMessageProduced(); @@ -49,7 +45,10 @@ protected function runTheConsumer(): void 'kafka_new_config' => [ 'brokers' => [ 'override' => [ - 'connections' => 'kafka:9092', + 'connections' => env( + 'KAFKA_BROKER_CONNECTIONS', + 'kafka:9092' + ), ], ], 'topics' => [ @@ -81,7 +80,8 @@ protected function runTheConsumer(): void protected function haveAHandlerConfigured(): void { - $broker = new Broker('kafka:9092', new None()); + $connections = env('KAFKA_BROKER_CONNECTIONS', 'kafka:9092'); + $broker = new Broker($connections, new None()); $this->producerConfigOptions = new ProducerConfigOptions( 'sale_order_override', $broker, diff --git a/tests/LaravelTestCase.php b/tests/LaravelTestCase.php index 5ec8b44e..3409efd0 100644 --- a/tests/LaravelTestCase.php +++ b/tests/LaravelTestCase.php @@ -1,4 +1,5 @@ instance(AbstractHandler::class, m::mock(AbstractHandler::class)); + $handler = $this->instance( + AbstractHandler::class, + m::mock(AbstractHandler::class) + ); $config = [ 'middlewares' => [], 'handler' => AbstractHandler::class, diff --git a/tests/Unit/Authentication/FactoryTest.php b/tests/Unit/Authentication/FactoryTest.php index da153e39..53999f8a 100644 --- a/tests/Unit/Authentication/FactoryTest.php +++ b/tests/Unit/Authentication/FactoryTest.php @@ -1,4 +1,5 @@ setAvroSchema($parsedSchema); $schema->setSchemaId('123'); + $schema->setSubject(null); + $schema->setVersion(null); $response = [ 'schema' => $schemaString, @@ -112,7 +115,9 @@ public function testGetByIdMayReturnErrors(): void // Expectations $this->expectException(RuntimeException::class); - $this->expectExceptionMessage("Unable to get schema for the specific ID: {$status}"); + $this->expectExceptionMessage( + "Unable to get schema for the specific ID: {$status}" + ); $httpClient->expects() ->get('schemas/ids/123') ->andReturn([$status, $response]); @@ -197,7 +202,9 @@ public function testGetBySubjectAndVersionMayReturnErrors(): void // Expectations $this->expectException(RuntimeException::class); - $this->expectExceptionMessage("Unable to get schema for the specific ID: {$status}"); + $this->expectExceptionMessage( + "Unable to get schema for the specific ID: {$status}" + ); $httpClient->expects() ->get('subjects/some-kafka-topic/versions/1') ->andReturn([$status, $response]); @@ -236,6 +243,8 @@ public function testGetBySubjectAndVersionShouldHitCache(): void private function getSchemaTest(): string { - return file_get_contents(__DIR__.'/../fixtures/schemas/sales_price.avsc'); + return file_get_contents( + __DIR__ . '/../fixtures/schemas/sales_price.avsc' + ); } } diff --git a/tests/Unit/Avro/Serializer/MessageDecoderTest.php b/tests/Unit/Avro/Serializer/MessageDecoderTest.php index c5d13379..dfc41241 100644 --- a/tests/Unit/Avro/Serializer/MessageDecoderTest.php +++ b/tests/Unit/Avro/Serializer/MessageDecoderTest.php @@ -1,4 +1,5 @@ true, 'default_encoding_format' => SchemaFormats::MAGIC_BYTE_SCHEMAID]); + $serializer = new MessageEncoder( + $registry, + ['register_missing_schemas' => true, 'default_encoding_format' => SchemaFormats::MAGIC_BYTE_SCHEMAID] + ); $topic = 'my-topic'; $schema = m::mock(Schema::class); $avroSchema = new AvroSchema('array'); @@ -60,7 +64,13 @@ public function testShouldEncodeRecordWithSchemaIdRegisteringMissingSchemas(): v ->andReturn($avroSchema); // Actions - $result = $serializer->encodeMessage($topic, $schema, $record, true, SchemaFormats::MAGIC_BYTE_SCHEMAID); + $result = $serializer->encodeMessage( + $topic, + $schema, + $record, + true, + SchemaFormats::MAGIC_BYTE_SCHEMAID + ); // Assertions $this->assertSame("\x00\x00\x00\x00\x00\x00", $result); @@ -92,10 +102,19 @@ public function testShouldEncodeRecordWithSubjectAndVersion(): void ->andReturn($avroSchema); // Actions - $result = $serializer->encodeMessage($topic, $schema, $record, false, SchemaFormats::MAGIC_BYTE_SUBJECT_VERSION); + $result = $serializer->encodeMessage( + $topic, + $schema, + $record, + false, + SchemaFormats::MAGIC_BYTE_SUBJECT_VERSION + ); // Assertions - $this->assertSame("\x01\x00\x00\x00\x0Emy-topic-value\x00\x00\x00\x00\x00", $result); + $this->assertSame( + "\x01\x00\x00\x00\x0Emy-topic-value\x00\x00\x00\x00\x00", + $result + ); } public function testShouldNotEncodeRecordWithInvalidFormat(): void @@ -120,7 +139,10 @@ public function testShouldEncodeRecordWithSubjectAndVersionRegisteringMissingSch { // Set $registry = m::mock(CachedSchemaRegistryClient::class); - $serializer = new MessageEncoder($registry, ['register_missing_schemas' => true]); + $serializer = new MessageEncoder( + $registry, + ['register_missing_schemas' => true] + ); $topic = 'my-topic'; $subject = "{$topic}-value"; $schema = m::mock(Schema::class); @@ -142,9 +164,18 @@ public function testShouldEncodeRecordWithSubjectAndVersionRegisteringMissingSch ->andReturn($avroSchema); // Actions - $result = $serializer->encodeMessage($topic, $schema, $record, true, SchemaFormats::MAGIC_BYTE_SUBJECT_VERSION); + $result = $serializer->encodeMessage( + $topic, + $schema, + $record, + true, + SchemaFormats::MAGIC_BYTE_SUBJECT_VERSION + ); // Assertions - $this->assertSame("\x01\x00\x00\x00\x0Emy-topic-value\x00\x00\x00\x00\$my awesome message", $result); + $this->assertSame( + "\x01\x00\x00\x00\x0Emy-topic-value\x00\x00\x00\x00\$my awesome message", + $result + ); } } diff --git a/tests/Unit/Connectors/Consumer/ConfigTest.php b/tests/Unit/Connectors/Consumer/ConfigTest.php index 1fe82e83..9e1c26f9 100644 --- a/tests/Unit/Connectors/Consumer/ConfigTest.php +++ b/tests/Unit/Connectors/Consumer/ConfigTest.php @@ -1,4 +1,5 @@ ConsumerHandlerDummy::class]); - $consumerHandler = $this->instance(ConsumerHandlerDummy::class, m::mock(ConsumerHandlerDummy::class)); + config( + ['kafka.topics.default.consumer.consumer_groups.test-consumer-group.handler' => ConsumerHandlerDummy::class] + ); + $consumerHandler = $this->instance( + ConsumerHandlerDummy::class, + m::mock(ConsumerHandlerDummy::class) + ); $configOptions = m::mock(ConsumerConfigOptions::class); $config = new Config(); diff --git a/tests/Unit/Connectors/Consumer/FactoryTest.php b/tests/Unit/Connectors/Consumer/FactoryTest.php index 8080d39d..a90471d6 100644 --- a/tests/Unit/Connectors/Consumer/FactoryTest.php +++ b/tests/Unit/Connectors/Consumer/FactoryTest.php @@ -1,4 +1,5 @@ make( + ['timeout' => 61], + ['topic' => 'topic_key', 'consumer_group' => 'with-partition'] + ); + $manager = Factory::make($configManager); + + // Assertions + $this->assertInstanceOf(LowLevel::class, $manager->getConsumer()); + } + + public function testItMakesManagerWithLowLevelConsumerWhenPartitionIsNotValid(): void + { + // Set + $config = new Config(); + $configManager = $config->make( + ['timeout' => 61], + ['topic' => 'topic_key', 'consumer_group' => 'with-partition', 'partition' => -1] + ); + $manager = Factory::make($configManager); + + // Assertions + $this->assertInstanceOf(HighLevel::class, $manager->getConsumer()); + } + + public function testItMakesHighLevelClass(): void + { + // Set + $config = new Config(); + $configManager = $config->make( + ['timeout' => 61], + ['topic' => 'topic_key', 'consumer_group' => 'without-partition'] + ); + $manager = Factory::make($configManager); + + // Assertions + $this->assertInstanceOf(HighLevel::class, $manager->getConsumer()); + } + protected function setUp(): void { parent::setUp(); + $connections = env('KAFKA_BROKER_CONNECTIONS', 'kafka:9092'); config([ 'kafka' => [ 'brokers' => [ 'default' => [ - 'connections' => 'kafka:123', + 'connections' => $connections, ], ], 'topics' => [ @@ -44,37 +88,4 @@ protected function setUp(): void ], ]); } - - public function testItMakesManagerWithLowLevelConsumer(): void - { - // Set - $config = new Config(); - $configManager = $config->make(['timeout' => 61], ['topic' => 'topic_key', 'consumer_group' => 'with-partition']); - $manager = Factory::make($configManager); - - // Assertions - $this->assertInstanceOf(LowLevel::class, $manager->getConsumer()); - } - - public function testItMakesManagerWithLowLevelConsumerWhenPartitionIsNotValid(): void - { - // Set - $config = new Config(); - $configManager = $config->make(['timeout' => 61], ['topic' => 'topic_key', 'consumer_group' => 'with-partition', 'partition' => -1]); - $manager = Factory::make($configManager); - - // Assertions - $this->assertInstanceOf(HighLevel::class, $manager->getConsumer()); - } - - public function testItMakesHighLevelClass(): void - { - // Set - $config = new Config(); - $configManager = $config->make(['timeout' => 61], ['topic' => 'topic_key', 'consumer_group' => 'without-partition']); - $manager = Factory::make($configManager); - - // Assertions - $this->assertInstanceOf(HighLevel::class, $manager->getConsumer()); - } } diff --git a/tests/Unit/Connectors/Consumer/HighLevelTest.php b/tests/Unit/Connectors/Consumer/HighLevelTest.php index 1afca75f..52d58fc4 100644 --- a/tests/Unit/Connectors/Consumer/HighLevelTest.php +++ b/tests/Unit/Connectors/Consumer/HighLevelTest.php @@ -1,4 +1,5 @@ set([ - 'connections' => 'kafka:123', + 'connections' => $connections, 'consumer_group' => 'some-group', 'topic_id' => 'some_topic', 'offset_reset' => 'earliest', diff --git a/tests/Unit/Connectors/Consumer/LowLevelTest.php b/tests/Unit/Connectors/Consumer/LowLevelTest.php index 93394fce..039d096c 100644 --- a/tests/Unit/Connectors/Consumer/LowLevelTest.php +++ b/tests/Unit/Connectors/Consumer/LowLevelTest.php @@ -1,4 +1,5 @@ set([ - 'connections' => 'kafka:123', + 'connections' => $connections, 'consumer_group' => 'some-group', 'topic' => 'some_topic', 'offset_reset' => 'earliest', diff --git a/tests/Unit/Connectors/Consumer/ManagerTest.php b/tests/Unit/Connectors/Consumer/ManagerTest.php index e47d996c..3f6546c1 100644 --- a/tests/Unit/Connectors/Consumer/ManagerTest.php +++ b/tests/Unit/Connectors/Consumer/ManagerTest.php @@ -1,4 +1,5 @@ set([ - 'connections' => 'kafka:2019', - 'topic' => 'topic_key', - 'broker' => 'default', - 'offset_reset' => 'earliest', - 'offset' => 0, - 'timeout' => 30, - 'handler' => ConsumerHandlerDummy::class, - 'middlewares' => [], - 'consumer_group' => 'consumer-id', - ]); - } /** * @dataProvider getThrowableScenarios @@ -66,13 +50,22 @@ public function testShouldHandlerAnyThrowable(Throwable $throwable): void public function testShouldHandleMultiplesMessages(): void { // Set - $consumerRecord = $this->instance(ConsumerRecord::class, m::mock(ConsumerRecord::class)); + $consumerRecord = $this->instance( + ConsumerRecord::class, + m::mock(ConsumerRecord::class) + ); $consumer = m::mock(ConsumerInterface::class); $consumerHandler = m::mock(ConsumerHandler::class); $dispatcher = m::mock(Dispatcher::class); - $runner = new Manager($consumer, $consumerHandler, $dispatcher, true, false); + $runner = new Manager( + $consumer, + $consumerHandler, + $dispatcher, + true, + false + ); $kafkaMessage1 = new KafkaMessage(); $kafkaMessage1->payload = 'original message 1'; @@ -87,11 +80,23 @@ public function testShouldHandleMultiplesMessages(): void $kafkaMessage3->err = RD_KAFKA_RESP_ERR_NO_ERROR; // Expectations - $consumer->shouldReceive() - ->consume() - ->times(3) - ->andReturn($kafkaMessage1, $kafkaMessage2, $kafkaMessage3); + $consumer->shouldReceive('consume') + ->times(4) + ->andReturnUsing( + function () use ($messages, &$count, $exception) { + $message = $messages[$count] ?? null; + if (!$message) { + throw $exception; + } + $count++; + + return $message; + } + ); + $consumerHandler->expects() + ->failed($exception); + $dispatcher->expects() ->handle($consumerRecord) ->times(3); @@ -109,9 +114,17 @@ public function testShouldCallWarningWhenErrorOccurs(): void $consumerHandler = m::mock(ConsumerHandler::class); $dispatcher = m::mock(Dispatcher::class); - $runner = new Manager($consumer, $consumerHandler, $dispatcher, true, false); + $runner = new Manager( + $consumer, + $consumerHandler, + $dispatcher, + true, + false + ); - $exception = new ResponseWarningException('Error occurs when consuming.'); + $exception = new ResponseWarningException( + 'Error occurs when consuming.' + ); // Expectations $consumer->shouldReceive('consume') @@ -130,13 +143,22 @@ public function testShouldCallWarningWhenErrorOccurs(): void public function testShouldHandleAsyncCommit(): void { // Set - $consumerRecord = $this->instance(ConsumerRecord::class, m::mock(ConsumerRecord::class)); + $consumerRecord = $this->instance( + ConsumerRecord::class, + m::mock(ConsumerRecord::class) + ); $consumer = m::mock(ConsumerInterface::class); $consumerHandler = m::mock(ConsumerHandler::class); $dispatcher = m::mock(Dispatcher::class); - $runner = new Manager($consumer, $consumerHandler, $dispatcher, false, true); + $runner = new Manager( + $consumer, + $consumerHandler, + $dispatcher, + false, + true + ); $kafkaMessage1 = new KafkaMessage(); $kafkaMessage1->payload = 'original message 1'; @@ -148,20 +170,24 @@ public function testShouldHandleAsyncCommit(): void $messages = [$kafkaMessage1, $kafkaMessage2]; $count = 0; - $exception = new ResponseTimeoutException('Consume timeout or finished to processed.'); + $exception = new ResponseTimeoutException( + 'Consume timeout or finished to processed.' + ); // Expectations $consumer->shouldReceive('consume') ->times(3) - ->andReturnUsing(function () use ($messages, &$count, $exception) { - $message = $messages[$count] ?? null; - if (!$message) { - throw $exception; + ->andReturnUsing( + function () use ($messages, &$count, $exception) { + $message = $messages[$count] ?? null; + if (!$message) { + throw $exception; + } + $count++; + + return $message; } - $count++; - - return $message; - }); + ); $consumer->expects() ->commitAsync() @@ -201,5 +227,23 @@ public function getThrowableScenarios(): array 'throwable' => new TypeError(), ], ]; + + protected function setUp(): void + { + parent::setUp(); + + $configManager = new ConsumerConfigManager(); + $configManager->set([ + 'connections' => 'kafka:2019', + 'topic' => 'topic_key', + 'broker' => 'default', + 'offset_reset' => 'earliest', + 'offset' => 0, + 'timeout' => 30, + 'handler' => ConsumerHandlerDummy::class, + 'middlewares' => [], + 'consumer_group' => 'consumer-id', + ]); + } } diff --git a/tests/Unit/Connectors/Producer/ConfigTest.php b/tests/Unit/Connectors/Producer/ConfigTest.php index 5629ad65..82adae08 100644 --- a/tests/Unit/Connectors/Producer/ConfigTest.php +++ b/tests/Unit/Connectors/Producer/ConfigTest.php @@ -1,4 +1,5 @@ -1, 'broker' => 'default', 'topic' => 'default', - 'connections' => 'kafka:9092', + 'connections' => env('KAFKA_BROKER_CONNECTIONS', 'kafka:9092'), 'auth' => [ 'type' => 'ssl', - 'ca' => '/var/www/html/vendor/orchestra/testbench-core/laravel/storage/ca.pem', - 'certificate' => '/var/www/html/vendor/orchestra/testbench-core/laravel/storage/kafka.cert', - 'key' => '/var/www/html/vendor/orchestra/testbench-core/laravel/storage/kafka.key', + 'ca' => base_path('storage/ca.pem'), + 'certificate' => base_path('storage/kafka.cert'), + 'key' => base_path('storage/kafka.key'), ], ]; @@ -71,12 +72,12 @@ public function testShouldNotOverrideDefaultParametersWhenConfigIsSet(): void 'flush_attempts' => 10, 'broker' => 'default', 'topic' => 'default', - 'connections' => 'kafka:9092', + 'connections' => env('KAFKA_BROKER_CONNECTIONS', 'kafka:9092'), 'auth' => [ 'type' => 'ssl', - 'ca' => '/var/www/html/vendor/orchestra/testbench-core/laravel/storage/ca.pem', - 'certificate' => '/var/www/html/vendor/orchestra/testbench-core/laravel/storage/kafka.cert', - 'key' => '/var/www/html/vendor/orchestra/testbench-core/laravel/storage/kafka.key', + 'ca' => base_path('storage/ca.pem'), + 'certificate' => base_path('storage/kafka.cert'), + 'key' => base_path('storage/kafka.key'), ], ]; @@ -92,7 +93,10 @@ public function testShouldOverrideDefaultParametersWhenConfigOptionsExists(): vo // Set config(['kafka.topics.default.producer.max_poll_records' => 3000]); $config = new Config(); - $broker = new Broker('kafka:9092', new SaslSsl('PLAIN', 'USERNAME', 'PASSWORD')); + $broker = new Broker( + 'kafka:9092', + new SaslSsl('PLAIN', 'USERNAME', 'PASSWORD') + ); $configOptions = new ProducerConfigOptions('TOPIC-ID', $broker); $expected = [ diff --git a/tests/Unit/Connectors/Producer/ConnectorTest.php b/tests/Unit/Connectors/Producer/ConnectorTest.php index 2cafe6cc..e0cb6123 100644 --- a/tests/Unit/Connectors/Producer/ConnectorTest.php +++ b/tests/Unit/Connectors/Producer/ConnectorTest.php @@ -1,4 +1,5 @@ withAnyArgs(); $conf->expects() - ->set('metadata.broker.list', 0); + ->set('metadata.broker.list', 'kafka:9092'); $configManager->expects() ->get('connections') @@ -78,11 +81,13 @@ public function testItShouldMakeSetupWithoutHandleResponse(): void $configOptions = m::mock(ProducerConfigOptions::class); $connector = new Connector(); - $handler = new class('record', $configOptions) extends AbstractProducer implements HandlerInterface { + $handler = new class ('record', $configOptions) extends AbstractProducer implements HandlerInterface { + /** @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter.UnusedParameter */ public function success(Message $message): void { } + /** @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter.UnusedParameter */ public function failed(Message $message): void { } @@ -93,7 +98,7 @@ public function failed(Message $message): void ->never(); $conf->expects() - ->set('metadata.broker.list', 0); + ->set('metadata.broker.list', 'kafka:9092'); $configManager->expects() ->get('connections') diff --git a/tests/Unit/Console/ConsumerCommandTest.php b/tests/Unit/Console/ConsumerCommandTest.php index 566237fa..26132745 100644 --- a/tests/Unit/Console/ConsumerCommandTest.php +++ b/tests/Unit/Console/ConsumerCommandTest.php @@ -1,4 +1,5 @@ [ - 'brokers' => [ - 'default' => [ - 'connections' => 'test_kafka:6680', - 'auth' => [], - ], - ], - 'topics' => [ - 'topic_key' => [ - 'topic_id' => 'topic_name', - 'broker' => 'default', - 'consumer' => [ - 'consumer_groups' => [ - 'default' => [ - 'offset_reset' => 'earliest', - 'handler' => ConsumerHandlerDummy::class, - 'timeout' => 123, - ], - ], - ], - ], - ], - ], - ]); - } - public function testItCallsCommandWithInvalidTopic(): void { // Set @@ -161,4 +131,38 @@ public function testItOverridesBrokerConnectionWhenCallingCommand(): void $this->artisan($command, $parameters); } + + protected function setUp(): void + { + parent::setUp(); + + config([ + 'kafka' => [ + 'brokers' => [ + 'default' => [ + 'connections' => env( + 'KAFKA_BROKER_CONNECTIONS', + 'kafka:9092' + ), + 'auth' => [], + ], + ], + 'topics' => [ + 'topic_key' => [ + 'topic_id' => 'topic_name', + 'broker' => 'default', + 'consumer' => [ + 'consumer_groups' => [ + 'default' => [ + 'offset_reset' => 'earliest', + 'handler' => ConsumerHandlerDummy::class, + 'timeout' => 123, + ], + ], + ], + ], + ], + ], + ]); + } } diff --git a/tests/Unit/Console/ConsumerMakeCommandTest.php b/tests/Unit/Console/ConsumerMakeCommandTest.php index 25f7f379..e68259c9 100644 --- a/tests/Unit/Console/ConsumerMakeCommandTest.php +++ b/tests/Unit/Console/ConsumerMakeCommandTest.php @@ -1,4 +1,5 @@ instance(AbstractHandler::class, m::mock(AbstractHandler::class)); + $handler = $this->instance( + AbstractHandler::class, + m::mock(AbstractHandler::class) + ); $config = [ 'middlewares' => [], 'handler' => AbstractHandler::class, diff --git a/tests/Unit/Consumers/HighLevelTest.php b/tests/Unit/Consumers/HighLevelTest.php index 71967f80..3969ea27 100644 --- a/tests/Unit/Consumers/HighLevelTest.php +++ b/tests/Unit/Consumers/HighLevelTest.php @@ -1,4 +1,5 @@ andReturnUsing(function () use (&$count) { if (3 === $count) { $exception = new Exception('Error when consuming.'); + throw $exception; } $count++; + return; }); @@ -45,7 +48,7 @@ public function testItShouldRunADeterminedNumberOfTimes(): void // Expectations $manager->shouldReceive('handleMessage') ->times(3) - ->andReturnUsing(function () use (&$count) { + ->andReturnUsing(function () { return; }); @@ -62,7 +65,7 @@ public function testItShouldRunADeterminedNumberOfTimesButStopsOnException(): vo // Expectations $manager->shouldReceive('handleMessage') ->times(1) - ->andReturnUsing(function () use (&$count) { + ->andReturnUsing(function () { throw new Exception('Error when consuming.'); }); diff --git a/tests/Unit/Dummies/ConsumerHandlerDummy.php b/tests/Unit/Dummies/ConsumerHandlerDummy.php index 52ffc955..fc9f6fec 100644 --- a/tests/Unit/Dummies/ConsumerHandlerDummy.php +++ b/tests/Unit/Dummies/ConsumerHandlerDummy.php @@ -1,4 +1,5 @@ record = $record; $this->topic = $topic; diff --git a/tests/Unit/Dummies/SecondProducerHandlerDummy.php b/tests/Unit/Dummies/SecondProducerHandlerDummy.php index f5712e18..26f4b5d5 100644 --- a/tests/Unit/Dummies/SecondProducerHandlerDummy.php +++ b/tests/Unit/Dummies/SecondProducerHandlerDummy.php @@ -1,11 +1,12 @@ record = $record; $this->topic = $topic; diff --git a/tests/Unit/Facades/MetamorphosisTest.php b/tests/Unit/Facades/MetamorphosisTest.php index dbf6e420..ceee5b54 100644 --- a/tests/Unit/Facades/MetamorphosisTest.php +++ b/tests/Unit/Facades/MetamorphosisTest.php @@ -1,4 +1,5 @@ set([ - 'topic_id' => 'topic_name', - 'timeout' => 4000, - 'is_async' => true, - 'max_poll_records' => 500, - 'flush_attempts' => 10, - 'required_acknowledgment' => true, - 'partition' => 0, - ]); - } - public function testItShouldSendMessageToKafkaBroker(): void { // Set @@ -53,4 +38,20 @@ public function testItShouldSendMessageToKafkaBroker(): void $producerHandler = new Producer($producerTopic, $poll, 1); $producerHandler->process($record, $closure); } + + protected function setUp(): void + { + parent::setUp(); + + $configManager = new ProducerConfigManager(); + $configManager->set([ + 'topic_id' => 'topic_name', + 'timeout' => 4000, + 'is_async' => true, + 'max_poll_records' => 500, + 'flush_attempts' => 10, + 'required_acknowledgment' => true, + 'partition' => 0, + ]); + } } diff --git a/tests/Unit/Middlewares/JsonDecodeTest.php b/tests/Unit/Middlewares/JsonDecodeTest.php index cfbc0d5a..1f721e40 100644 --- a/tests/Unit/Middlewares/JsonDecodeTest.php +++ b/tests/Unit/Middlewares/JsonDecodeTest.php @@ -1,4 +1,5 @@ expects() - ->info('Processing kafka record: original record', [ - 'original' => [ - 'err' => RD_KAFKA_RESP_ERR_NO_ERROR, - 'topic_name' => null, - 'partition' => null, - 'payload' => 'original record', - 'len' => null, - 'key' => null, - 'offset' => null, - 'timestamp' => null, - 'headers' => null, - 'opaque' => null, - ], - ]); + ->info('Processing kafka record: original record', m::on( + static function (array $context): bool { + $original = $context['original']; + $expected = [ + 'err' => RD_KAFKA_RESP_ERR_NO_ERROR, + 'topic_name' => null, + 'timestamp' => null, + 'payload' => 'original record', + 'len' => null, + 'key' => null, + 'opaque' => null, + ]; + + foreach ($expected as $key => $expectedValue) { + if (!array_key_exists($key, $original)) { + return false; + } + + if ($original[$key] !== $expectedValue) { + return false; + } + } + + return true; + } + )); // Actions $middleware->process($record, $closure); diff --git a/tests/Unit/Producer/PollTest.php b/tests/Unit/Producer/PollTest.php index b2b72a90..8bda848d 100644 --- a/tests/Unit/Producer/PollTest.php +++ b/tests/Unit/Producer/PollTest.php @@ -1,4 +1,5 @@ shouldReceive('poll') + $kafkaProducer->expects() + ->poll(0); + + $kafkaProducer->shouldReceive('flush') ->never(); // Actions @@ -39,10 +43,10 @@ public function testShouldThrowExceptionWhenFlushFailed(): void $configManager = new ProducerConfigManager(); $configManager->set([ 'topic_id' => 'topic_name', - 'timeout' => 4000, + 'timeout' => 1000, 'is_async' => false, 'max_poll_records' => 500, - 'flush_attempts' => 10, + 'flush_attempts' => 3, 'required_acknowledgment' => true, 'partition' => 0, ]); @@ -52,8 +56,11 @@ public function testShouldThrowExceptionWhenFlushFailed(): void // Expectations $kafkaProducer->expects() - ->poll(4000) - ->times(10) + ->poll(0); + + $kafkaProducer->expects() + ->flush(1000) + ->times(3) ->andReturn(1); $this->expectException(RuntimeException::class); @@ -80,7 +87,11 @@ public function testItShouldHandleResponseEveryTimeWhenAsyncModeIsTrue(): void // Expectations $kafkaProducer->expects() - ->poll(4000) + ->poll(0) + ->times(3); + + $kafkaProducer->expects() + ->flush(4000) ->times(3) ->andReturn(0); diff --git a/tests/Unit/ProducerConfigManagerTest.php b/tests/Unit/ProducerConfigManagerTest.php index 6ddac8bc..26500f5d 100644 --- a/tests/Unit/ProducerConfigManagerTest.php +++ b/tests/Unit/ProducerConfigManagerTest.php @@ -1,4 +1,5 @@ assertSame($expected, $configManager->get()); - $this->assertInstanceOf(MiddlewareDummy::class, current($configManager->middlewares())); + $this->assertInstanceOf( + MiddlewareDummy::class, + current($configManager->middlewares()) + ); } } diff --git a/tests/Unit/ProducerTest.php b/tests/Unit/ProducerTest.php index bdf9806b..5a93dc8c 100644 --- a/tests/Unit/ProducerTest.php +++ b/tests/Unit/ProducerTest.php @@ -1,4 +1,5 @@ withAnyArgs(); // Actions - $result = $producer->produce($producerHandler); - - // Assertions - $this->assertNull($result); + $producer->produce($producerHandler); } public function testItShouldThrowJsonExceptionWhenPassingMalFormattedArray(): void @@ -149,7 +147,7 @@ public function testItShouldThrowJsonExceptionWhenPassingMalFormattedArray(): vo $kafkaProducer = m::mock(KafkaProducer::class); $producerTopic = m::mock(ProducerTopic::class); - $producerHandler = new class($record, $topic) extends AbstractHandler { + $producerHandler = new class ($record, $topic) extends AbstractHandler { }; // Expectations @@ -198,7 +196,7 @@ public function testItShouldThrowJsonExceptionWhenPassingMalFormattedArray(): vo ->andReturn($producerTopic); $kafkaProducer->expects() - ->poll(1000) + ->flush(1000) ->andReturn(0); $producerMiddleware->expects() @@ -225,7 +223,7 @@ public function testShouldBuildDispatcher(): void $producerTopic = m::mock(ProducerTopic::class); $configManager = m::mock(ProducerConfigManager::class); - $producerHandler = new class($record, $topic) extends AbstractHandler { + $producerHandler = new class ($record, $topic) extends AbstractHandler { }; // Expectations @@ -274,7 +272,7 @@ public function testShouldBuildDispatcher(): void ->andReturn($producerTopic); $kafkaProducer->expects() - ->poll(1000) + ->flush(1000) ->andReturn(0); // Actions @@ -297,9 +295,10 @@ public function testShouldBuildDispatcherWithConfigOptions(): void $kafkaProducer = m::mock(KafkaProducer::class); $producerTopic = m::mock(ProducerTopic::class); $configManager = m::mock(ProducerConfigManager::class); - $broker = new Broker('kafka:9092', new None()); + $connections = env('KAFKA_BROKER_CONNECTIONS', 'kafka:9092'); + $broker = new Broker($connections, new None()); $configOptions = new ProducerConfigOptions($topicId, $broker); - $producerHandler = new class($record, $configOptions) extends AbstractProducer { + $producerHandler = new class ($record, $configOptions) extends AbstractProducer { }; // Expectations @@ -348,7 +347,7 @@ public function testShouldBuildDispatcherWithConfigOptions(): void ->andReturn($producerTopic); $kafkaProducer->expects() - ->poll(1000) + ->flush(1000) ->andReturn(0); // Actions diff --git a/tests/Unit/Record/ConsumerRecordTest.php b/tests/Unit/Record/ConsumerRecordTest.php index b4b460c4..8ca70ba1 100644 --- a/tests/Unit/Record/ConsumerRecordTest.php +++ b/tests/Unit/Record/ConsumerRecordTest.php @@ -1,4 +1,5 @@ andReturn('Process timed out.'); $this->expectException(ResponseTimeoutException::class); - $this->expectExceptionMessage('Consumer finished to process or timed out: Process timed out.'); + $this->expectExceptionMessage( + 'Consumer finished to process or timed out: Process timed out.' + ); $this->expectExceptionCode(RD_KAFKA_RESP_ERR__TIMED_OUT); // Actions diff --git a/tests/Unit/Record/ProducerRecordTest.php b/tests/Unit/Record/ProducerRecordTest.php index 4f0ea300..d877e15f 100644 --- a/tests/Unit/Record/ProducerRecordTest.php +++ b/tests/Unit/Record/ProducerRecordTest.php @@ -1,4 +1,5 @@ 'earliest', ]; // Actions - $result = ConsumerFactory::make($brokerData, $topicData, $avroSchemaData); + $result = ConsumerFactory::make( + $brokerData, + $topicData, + $avroSchemaData + ); // Assertions $this->assertInstanceOf(Consumer::class, $result); diff --git a/tests/Unit/TopicHandler/ConfigOptions/Factories/ProducerFactoryTest.php b/tests/Unit/TopicHandler/ConfigOptions/Factories/ProducerFactoryTest.php index 2c7e1c82..b9dac202 100644 --- a/tests/Unit/TopicHandler/ConfigOptions/Factories/ProducerFactoryTest.php +++ b/tests/Unit/TopicHandler/ConfigOptions/Factories/ProducerFactoryTest.php @@ -1,4 +1,5 @@ assertInstanceOf(Producer::class, $result); diff --git a/tests/Unit/TopicHandler/ConfigOptions/ProducerTest.php b/tests/Unit/TopicHandler/ConfigOptions/ProducerTest.php index 900e8b27..5fff3e12 100644 --- a/tests/Unit/TopicHandler/ConfigOptions/ProducerTest.php +++ b/tests/Unit/TopicHandler/ConfigOptions/ProducerTest.php @@ -1,4 +1,5 @@