From a3d69ba38282b7a0a4cf53d7de44fceb909704cd Mon Sep 17 00:00:00 2001 From: KJunker Date: Tue, 13 Jul 2021 22:35:51 +0200 Subject: [PATCH 01/52] Create php.yml --- .github/workflows/php.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/php.yml diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml new file mode 100644 index 0000000..ee68550 --- /dev/null +++ b/.github/workflows/php.yml @@ -0,0 +1,36 @@ +name: PHP Composer + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Validate composer.json and composer.lock + run: composer validate --strict + + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v2 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + + - name: Install dependencies + run: composer install --prefer-dist --no-progress + + # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" + # Docs: https://getcomposer.org/doc/articles/scripts.md + + - name: Run test suite + run: composer -v exec phpunit -- tests --bootstrap tests/bootstrap.php --exclude-group example --stderr -v --debug From 812965c667275f43a05bcc9c79c239c754cd00ee Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Wed, 14 Jul 2021 02:01:48 +0300 Subject: [PATCH 02/52] Create php.yml --- .github/workflows/php.yml | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/php.yml diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml new file mode 100644 index 0000000..d361772 --- /dev/null +++ b/.github/workflows/php.yml @@ -0,0 +1,38 @@ +name: PHP Composer + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Validate composer.json and composer.lock + run: composer validate --strict + + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v2 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + + - name: Install dependencies + run: composer install --prefer-dist --no-progress + + + # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" + # Docs: https://getcomposer.org/doc/articles/scripts.md + + - name: Run test suite + run: composer -v exec phpunit -- tests --bootstrap tests/bootstrap.php --exclude-group example --stderr -v --debug + From 58ad08f5f4499336bf5a2815bdb343a853ff2d97 Mon Sep 17 00:00:00 2001 From: KJunker Date: Wed, 14 Jul 2021 01:03:42 +0200 Subject: [PATCH 03/52] Feature/refactor codeception robo (#56) * Follow links when splitting test files This seems appropriate to me since it matches the default codeception behaviour. This was motivated because I was surprised that tests were missing after splitting when codeception would have included them. * Split Task for newer Phpunit **Context** Phpunit has restructure its classes with namespace starting from version 6 and this breaks the `DataProvider` test splitting. This update will allow it to work for both old and new Phpunit. * Be aware of test dependency during split (#46) * Be aware of test dependency during split * Test fixes New tests Test fixtures * Travis fixes * add verbose to see why tests fail * Build fix * still fails :/ * Test if correct code is executed. * Test if correct code is executed. * Test if correct code is executed. * Test if correct code is executed. * Test if correct code is executed. * Test if correct code is executed. * dev option * dev option * test what file is used * test what file is used * debug * debug * debug * debug * debug * temp disable some tests * test * test * test * test * test * test * test * remove debug * restore minimal version of codeception dependency * restore minimal version of codeception dependency with php 7.0 * fix test cases * Split ReportMerger into single Classes * Split TestSplitter into single Classes * Updating composer * fixing bootstrap * Moved Files from src to src/Splitter * Created Test for TestFileSplitterTask * added TEST_PATH const * updated composer autoload-dev * updated composer autoload-dev fixed php version fixed .travis.yml php version * Fixed TestFileSplitterTaskTest.php because of deprecated methods * Tests for TestsSplitterTask and refactoring * CodeStyle and TypeError fix, Test for XmlReportMergerTask * deleted outdated files * refactoring fixtures * Correction of Tests Path * Fixing configs of composer and phpunit Tests * added 3 tests for Splitting * Updated TestsSplitter.php because of newer PHPUnit Version * fixed return type * Splitting Tests with newer PHPUnit Version * added TearDown to clear results * updated composer.json, remove explicit using of ExecutionOrderDependency (comes with PHPUnit 9.3.0) * updated README.md * updated php version on composer and before_script in .travis.yml * updated composer.lock with new php Version Co-authored-by: Michael Bodnarchuk Co-authored-by: hirowatari Co-authored-by: Taufek Johar Co-authored-by: Grzegorz Drozd <1885137+GrzegorzDrozd@users.noreply.github.com> --- .gitignore | 6 +- .travis.yml | 9 +- README.md | 4 +- composer.json | 23 +- composer.lock | 4587 ++++++++++++----- src/MergeReports.php | 326 -- src/Merger/HtmlReportMerger.php | 189 + src/Merger/ReportMerger.php | 17 + src/Merger/ReportMergerTaskInterface.php | 20 + src/Merger/XmlReportMergerTask.php | 167 + src/SplitTestsByGroups.php | 325 -- src/Splitter/TestFileSplitterTask.php | 81 + src/Splitter/TestsSplitter.php | 145 + src/Splitter/TestsSplitterTask.php | 179 + src/Splitter/TestsSplitterTrait.php | 27 + tests/MergeJUnitReportsTest.php | 48 - tests/Merger/XmlReportMergerTaskTest.php | 68 + tests/SplitTestsByGroupsTaskTest.php | 110 - tests/Splitter/TestFileSplitterTaskTest.php | 107 + tests/Splitter/TestsSplitterTaskTest.php | 98 + tests/bootstrap.php | 27 +- tests/fixtures/Cests/DirA/ExampleACest.php | 13 + tests/fixtures/Cests/DirB/ExampleACest.php | 13 + tests/fixtures/Cests/DirC/ExampleACest.php | 13 + .../DirA/Example1Test.php | 14 +- .../DirA/Example2Test.php | 11 +- .../DirB/Example3Test.php | 11 +- .../DirA/Example1Test.php | 11 +- tests/fixtures/result1.xml | 102 +- tests/fixtures/result2.xml | 48 +- 30 files changed, 4663 insertions(+), 2136 deletions(-) delete mode 100644 src/MergeReports.php create mode 100644 src/Merger/HtmlReportMerger.php create mode 100644 src/Merger/ReportMerger.php create mode 100644 src/Merger/ReportMergerTaskInterface.php create mode 100644 src/Merger/XmlReportMergerTask.php delete mode 100644 src/SplitTestsByGroups.php create mode 100644 src/Splitter/TestFileSplitterTask.php create mode 100644 src/Splitter/TestsSplitter.php create mode 100644 src/Splitter/TestsSplitterTask.php create mode 100644 src/Splitter/TestsSplitterTrait.php delete mode 100644 tests/MergeJUnitReportsTest.php create mode 100644 tests/Merger/XmlReportMergerTaskTest.php delete mode 100644 tests/SplitTestsByGroupsTaskTest.php create mode 100644 tests/Splitter/TestFileSplitterTaskTest.php create mode 100644 tests/Splitter/TestsSplitterTaskTest.php create mode 100644 tests/fixtures/Cests/DirA/ExampleACest.php create mode 100644 tests/fixtures/Cests/DirB/ExampleACest.php create mode 100644 tests/fixtures/Cests/DirC/ExampleACest.php diff --git a/.gitignore b/.gitignore index 4aa7207..5ed49e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ -tests/result/* +tests/result vendor -.idea \ No newline at end of file +.idea +/.php-cs-fixer.cache +/.phpunit.result.cache diff --git a/.travis.yml b/.travis.yml index 2c1b9d6..e2aee1b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,11 +6,12 @@ cache: - $HOME/.composer/cache php: - - 7 - - 7.1 + - 7.3 + - 7.4 + - 8.0 before_script: - - composer install --dev + - composer install -script: +script: - composer -v exec phpunit -- tests --bootstrap tests/bootstrap.php --exclude-group example --stderr -v --debug diff --git a/README.md b/README.md index e05cf8c..33e6eaa 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,8 @@ require_once 'vendor/codeception/codeception/autoload.php'; class RoboFile extends \Robo\Tasks { - use \Codeception\Task\MergeReports; - use \Codeception\Task\SplitTestsByGroups; + use Codeception\Task\Merger\ReportMerger; + use Codeception\Task\Splitter\TestsSplitterTrait; } ?> ``` diff --git a/composer.json b/composer.json index 574f799..16fb33f 100644 --- a/composer.json +++ b/composer.json @@ -10,14 +10,29 @@ ], "autoload":{ "psr-4":{ - "Codeception\\Task\\":"src" + "Codeception\\Task\\":"src/" } }, "require": { - "consolidation/robo": "^1.0.0" + "php": ">=7.3 <9.0", + "consolidation/robo": "3.0.*", + "symfony/finder": ">=2.7 <6.0", + "ext-dom": "*", + "ext-libxml": "*" + }, + "autoload-dev": { + "psr-4": { + "Tests\\Codeception\\Task\\": "tests/", + "Tests\\Classes\\": "tests/fixtures/Cests" + } }, "require-dev": { - "codeception/base": "^2.2", - "codeception/codeception": "^2.2" + "roave/security-advisories": "dev-latest", + "codeception/codeception": "4.1.*", + "squizlabs/php_codesniffer": "^3.6.0", + "overtrue/phplint": "^3.0.0", + "friendsofphp/php-cs-fixer": "^3.0.0", + "phpunit/phpunit": ">=9.0", + "codeception/phpunit-wrapper": "^9.0.6" } } diff --git a/composer.lock b/composer.lock index 21f8a0a..f686518 100644 --- a/composer.lock +++ b/composer.lock @@ -4,84 +4,39 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3f0afab3509d0ba26046938b79598411", + "content-hash": "76954ba038aa10e4972b05222d42938c", "packages": [ { "name": "consolidation/annotated-command", - "version": "2.11.0", + "version": "4.2.4", "source": { "type": "git", "url": "https://github.com/consolidation/annotated-command.git", - "reference": "edea407f57104ed518cc3c3b47d5b84403ee267a" + "reference": "ec297e05cb86557671c2d6cbb1bebba6c7ae2c60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/edea407f57104ed518cc3c3b47d5b84403ee267a", - "reference": "edea407f57104ed518cc3c3b47d5b84403ee267a", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/ec297e05cb86557671c2d6cbb1bebba6c7ae2c60", + "reference": "ec297e05cb86557671c2d6cbb1bebba6c7ae2c60", "shasum": "" }, "require": { - "consolidation/output-formatters": "^3.4", - "php": ">=5.4.0", - "psr/log": "^1", - "symfony/console": "^2.8|^3|^4", - "symfony/event-dispatcher": "^2.5|^3|^4", - "symfony/finder": "^2.5|^3|^4" + "consolidation/output-formatters": "^4.1.1", + "php": ">=7.1.3", + "psr/log": "^1|^2", + "symfony/console": "^4.4.8|~5.1.0", + "symfony/event-dispatcher": "^4.4.8|^5", + "symfony/finder": "^4.4.8|^5" }, "require-dev": { - "g1a/composer-test-scenarios": "^3", - "php-coveralls/php-coveralls": "^1", - "phpunit/phpunit": "^6", - "squizlabs/php_codesniffer": "^2.7" + "phpunit/phpunit": ">=7.5.20", + "squizlabs/php_codesniffer": "^3", + "yoast/phpunit-polyfills": "^0.2.0" }, "type": "library", "extra": { - "scenarios": { - "symfony4": { - "require": { - "symfony/console": "^4.0" - }, - "config": { - "platform": { - "php": "7.1.3" - } - } - }, - "symfony2": { - "require": { - "symfony/console": "^2.8" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36" - }, - "remove": [ - "php-coveralls/php-coveralls" - ], - "config": { - "platform": { - "php": "5.4.8" - } - }, - "scenario-options": { - "create-lockfile": "false" - } - }, - "phpunit4": { - "require-dev": { - "phpunit/phpunit": "^4.8.36" - }, - "remove": [ - "php-coveralls/php-coveralls" - ], - "config": { - "platform": { - "php": "5.4.8" - } - } - } - }, "branch-alias": { - "dev-master": "2.x-dev" + "dev-main": "4.x-dev" } }, "autoload": { @@ -100,42 +55,48 @@ } ], "description": "Initialize Symfony Console commands from annotated command class methods.", - "time": "2018-12-29T04:43:17+00:00" + "support": { + "issues": "https://github.com/consolidation/annotated-command/issues", + "source": "https://github.com/consolidation/annotated-command/tree/4.2.4" + }, + "time": "2020-12-10T16:56:39+00:00" }, { "name": "consolidation/config", - "version": "1.1.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/consolidation/config.git", - "reference": "925231dfff32f05b787e1fddb265e789b939cf4c" + "reference": "9a2c2a7b2aea1b3525984a4378743a8b74c14e1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/config/zipball/925231dfff32f05b787e1fddb265e789b939cf4c", - "reference": "925231dfff32f05b787e1fddb265e789b939cf4c", + "url": "https://api.github.com/repos/consolidation/config/zipball/9a2c2a7b2aea1b3525984a4378743a8b74c14e1c", + "reference": "9a2c2a7b2aea1b3525984a4378743a8b74c14e1c", "shasum": "" }, "require": { "dflydev/dot-access-data": "^1.1.0", "grasmash/expander": "^1", - "php": ">=5.4.0" + "php": ">=7.1.3", + "psr/log": "^1.1", + "symfony/event-dispatcher": "^4||^5" }, "require-dev": { - "g1a/composer-test-scenarios": "^1", - "phpunit/phpunit": "^5", - "satooshi/php-coveralls": "^1.0", - "squizlabs/php_codesniffer": "2.*", - "symfony/console": "^2.5|^3|^4", - "symfony/yaml": "^2.8.11|^3|^4" + "phpunit/phpunit": ">=7.5.20", + "squizlabs/php_codesniffer": "^3", + "symfony/console": "^4||^5", + "symfony/yaml": "^4||^5", + "yoast/phpunit-polyfills": "^0.2.0" }, "suggest": { + "symfony/event-dispatcher": "Required to inject configuration into Command options", "symfony/yaml": "Required to use Consolidation\\Config\\Loader\\YamlConfigLoader" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "2.x-dev" } }, "autoload": { @@ -154,78 +115,40 @@ } ], "description": "Provide configuration services for a commandline tool.", - "time": "2018-10-24T17:55:35+00:00" + "support": { + "issues": "https://github.com/consolidation/config/issues", + "source": "https://github.com/consolidation/config/tree/2.0.1" + }, + "time": "2020-12-06T00:03:30+00:00" }, { "name": "consolidation/log", - "version": "1.1.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/consolidation/log.git", - "reference": "b2e887325ee90abc96b0a8b7b474cd9e7c896e3a" + "reference": "82a2aaaa621a7b976e50a745a8d249d5085ee2b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/log/zipball/b2e887325ee90abc96b0a8b7b474cd9e7c896e3a", - "reference": "b2e887325ee90abc96b0a8b7b474cd9e7c896e3a", + "url": "https://api.github.com/repos/consolidation/log/zipball/82a2aaaa621a7b976e50a745a8d249d5085ee2b1", + "reference": "82a2aaaa621a7b976e50a745a8d249d5085ee2b1", "shasum": "" }, "require": { - "php": ">=5.4.5", + "php": ">=7.1.3", "psr/log": "^1.0", - "symfony/console": "^2.8|^3|^4" + "symfony/console": "^4|^5" }, "require-dev": { - "g1a/composer-test-scenarios": "^3", - "php-coveralls/php-coveralls": "^1", - "phpunit/phpunit": "^6", - "squizlabs/php_codesniffer": "^2" + "phpunit/phpunit": ">=7.5.20", + "squizlabs/php_codesniffer": "^3", + "yoast/phpunit-polyfills": "^0.2.0" }, "type": "library", "extra": { - "scenarios": { - "symfony4": { - "require": { - "symfony/console": "^4.0" - }, - "config": { - "platform": { - "php": "7.1.3" - } - } - }, - "symfony2": { - "require": { - "symfony/console": "^2.8" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36" - }, - "remove": [ - "php-coveralls/php-coveralls" - ], - "config": { - "platform": { - "php": "5.4.8" - } - } - }, - "phpunit4": { - "require-dev": { - "phpunit/phpunit": "^4.8.36" - }, - "remove": [ - "php-coveralls/php-coveralls" - ], - "config": { - "platform": { - "php": "5.4.8" - } - } - } - }, "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "2.x-dev" } }, "autoload": { @@ -244,36 +167,39 @@ } ], "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", - "time": "2019-01-01T17:30:51+00:00" + "support": { + "issues": "https://github.com/consolidation/log/issues", + "source": "https://github.com/consolidation/log/tree/2.0.2" + }, + "time": "2020-12-10T16:26:23+00:00" }, { "name": "consolidation/output-formatters", - "version": "3.4.0", + "version": "4.1.2", "source": { "type": "git", "url": "https://github.com/consolidation/output-formatters.git", - "reference": "a942680232094c4a5b21c0b7e54c20cce623ae19" + "reference": "5821e6ae076bf690058a4de6c94dce97398a69c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/a942680232094c4a5b21c0b7e54c20cce623ae19", - "reference": "a942680232094c4a5b21c0b7e54c20cce623ae19", + "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/5821e6ae076bf690058a4de6c94dce97398a69c9", + "reference": "5821e6ae076bf690058a4de6c94dce97398a69c9", "shasum": "" }, "require": { "dflydev/dot-access-data": "^1.1.0", - "php": ">=5.4.0", - "symfony/console": "^2.8|^3|^4", - "symfony/finder": "^2.5|^3|^4" + "php": ">=7.1.3", + "symfony/console": "^4|^5", + "symfony/finder": "^4|^5" }, "require-dev": { - "g1a/composer-test-scenarios": "^2", - "phpunit/phpunit": "^5.7.27", - "satooshi/php-coveralls": "^2", - "squizlabs/php_codesniffer": "^2.7", - "symfony/console": "3.2.3", - "symfony/var-dumper": "^2.8|^3|^4", - "victorjonsson/markdowndocs": "^1.3" + "php-coveralls/php-coveralls": "^2.4.2", + "phpunit/phpunit": ">=7", + "squizlabs/php_codesniffer": "^3", + "symfony/var-dumper": "^4", + "symfony/yaml": "^4", + "yoast/phpunit-polyfills": "^0.2.0" }, "suggest": { "symfony/var-dumper": "For using the var_dump formatter" @@ -281,7 +207,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-main": "4.x-dev" } }, "autoload": { @@ -300,60 +226,57 @@ } ], "description": "Format text by applying transformations provided by plug-in formatters.", - "time": "2018-10-19T22:35:38+00:00" + "support": { + "issues": "https://github.com/consolidation/output-formatters/issues", + "source": "https://github.com/consolidation/output-formatters/tree/4.1.2" + }, + "time": "2020-12-12T19:04:59+00:00" }, { "name": "consolidation/robo", - "version": "1.4.3", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/consolidation/Robo.git", - "reference": "d0b6f516ec940add7abed4f1432d30cca5f8ae0c" + "reference": "734620ad3f9bb457fda1a52338b42439115cf941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/Robo/zipball/d0b6f516ec940add7abed4f1432d30cca5f8ae0c", - "reference": "d0b6f516ec940add7abed4f1432d30cca5f8ae0c", + "url": "https://api.github.com/repos/consolidation/Robo/zipball/734620ad3f9bb457fda1a52338b42439115cf941", + "reference": "734620ad3f9bb457fda1a52338b42439115cf941", "shasum": "" }, "require": { - "consolidation/annotated-command": "^2.10.2", - "consolidation/config": "^1.0.10", - "consolidation/log": "~1", - "consolidation/output-formatters": "^3.1.13", - "consolidation/self-update": "^1", - "grasmash/yaml-expander": "^1.3", - "league/container": "^2.2", - "php": ">=5.5.0", - "symfony/console": "^2.8|^3|^4", - "symfony/event-dispatcher": "^2.5|^3|^4", - "symfony/filesystem": "^2.5|^3|^4", - "symfony/finder": "^2.5|^3|^4", - "symfony/process": "^2.5|^3|^4" + "consolidation/annotated-command": "^4.2.4", + "consolidation/config": "^1.2.1|^2.0.1", + "consolidation/log": "^1.1.1|^2.0.2", + "consolidation/output-formatters": "^4.1.2", + "consolidation/self-update": "^1.2", + "league/container": "^3.3.1", + "php": ">=7.1.3", + "symfony/console": "^4.4.19 || ^5", + "symfony/event-dispatcher": "^4.4.19 || ^5", + "symfony/filesystem": "^4.4.9 || ^5", + "symfony/finder": "^4.4.9 || ^5", + "symfony/process": "^4.4.9 || ^5", + "symfony/yaml": "^4.4 || ^5" }, - "replace": { - "codegyre/robo": "< 1.0" + "conflict": { + "codegyre/robo": "*" }, "require-dev": { - "codeception/aspect-mock": "^1|^2.1.1", - "codeception/base": "^2.3.7", - "codeception/verify": "^0.3.2", - "g1a/composer-test-scenarios": "^3", - "goaop/framework": "~2.1.2", - "goaop/parser-reflection": "^1.1.0", "natxet/cssmin": "3.0.4", - "nikic/php-parser": "^3.1.5", - "patchwork/jsqueeze": "~2", - "pear/archive_tar": "^1.4.2", - "php-coveralls/php-coveralls": "^1", - "phpunit/php-code-coverage": "~2|~4", - "squizlabs/php_codesniffer": "^2.8" + "patchwork/jsqueeze": "^2", + "pear/archive_tar": "^1.4.4", + "phpunit/phpunit": "^7.5.20 | ^8", + "squizlabs/php_codesniffer": "^3", + "yoast/phpunit-polyfills": "^0.2.0" }, "suggest": { - "henrikbjorn/lurker": "For monitoring filesystem changes in taskWatch", - "natxet/CssMin": "For minifying CSS files in taskMinify", + "natxet/cssmin": "For minifying CSS files in taskMinify", "patchwork/jsqueeze": "For minifying JS files in taskMinify", - "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively." + "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively.", + "totten/lurkerlite": "For monitoring filesystem changes in taskWatch" }, "bin": [ "robo" @@ -363,33 +286,27 @@ "scenarios": { "symfony4": { "require": { - "symfony/console": "^4" - }, - "config": { - "platform": { - "php": "7.1.3" - } - } - }, - "symfony2": { - "require": { - "symfony/console": "^2.8" + "symfony/console": "^4.4.11", + "symfony/event-dispatcher": "^4.4.11", + "symfony/filesystem": "^4.4.11", + "symfony/finder": "^4.4.11", + "symfony/process": "^4.4.11", + "phpunit/phpunit": "^6", + "nikic/php-parser": "^2" }, "remove": [ - "goaop/framework" + "codeception/phpunit-wrapper" ], "config": { "platform": { - "php": "5.5.9" + "php": "7.1.3" } - }, - "scenario-options": { - "create-lockfile": "false" } } }, "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "2.x-dev", + "dev-main": "2.x-dev" } }, "autoload": { @@ -408,26 +325,30 @@ } ], "description": "Modern task runner", - "time": "2019-01-02T21:33:28+00:00" + "support": { + "issues": "https://github.com/consolidation/Robo/issues", + "source": "https://github.com/consolidation/Robo/tree/3.0.3" + }, + "time": "2021-02-21T19:19:43+00:00" }, { "name": "consolidation/self-update", - "version": "1.1.5", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/consolidation/self-update.git", - "reference": "a1c273b14ce334789825a09d06d4c87c0a02ad54" + "reference": "dba6b2c0708f20fa3ba8008a2353b637578849b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/self-update/zipball/a1c273b14ce334789825a09d06d4c87c0a02ad54", - "reference": "a1c273b14ce334789825a09d06d4c87c0a02ad54", + "url": "https://api.github.com/repos/consolidation/self-update/zipball/dba6b2c0708f20fa3ba8008a2353b637578849b4", + "reference": "dba6b2c0708f20fa3ba8008a2353b637578849b4", "shasum": "" }, "require": { "php": ">=5.5.0", - "symfony/console": "^2.8|^3|^4", - "symfony/filesystem": "^2.5|^3|^4" + "symfony/console": "^2.8|^3|^4|^5", + "symfony/filesystem": "^2.5|^3|^4|^5" }, "bin": [ "scripts/release" @@ -448,48 +369,21 @@ "MIT" ], "authors": [ - { - "name": "Greg Anderson", - "email": "greg.1.anderson@greenknowe.org" - }, { "name": "Alexander Menk", "email": "menk@mestrona.net" + }, + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" } ], "description": "Provides a self:update command for Symfony Console applications.", - "time": "2018-10-28T01:52:03+00:00" - }, - { - "name": "container-interop/container-interop", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/container-interop/container-interop.git", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "shasum": "" - }, - "require": { - "psr/container": "^1.0" + "support": { + "issues": "https://github.com/consolidation/self-update/issues", + "source": "https://github.com/consolidation/self-update/tree/1.2.0" }, - "type": "library", - "autoload": { - "psr-4": { - "Interop\\Container\\": "src/Interop/Container/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "homepage": "https://github.com/container-interop/container-interop", - "time": "2017-02-14T19:40:03+00:00" + "time": "2020-04-13T02:49:20+00:00" }, { "name": "dflydev/dot-access-data", @@ -548,6 +442,10 @@ "dot", "notation" ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/master" + }, "time": "2017-01-20T21:14:22+00:00" }, { @@ -595,87 +493,47 @@ } ], "description": "Expands internal property references in PHP arrays file.", - "time": "2017-12-21T22:14:55+00:00" - }, - { - "name": "grasmash/yaml-expander", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/grasmash/yaml-expander.git", - "reference": "3f0f6001ae707a24f4d9733958d77d92bf9693b1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/grasmash/yaml-expander/zipball/3f0f6001ae707a24f4d9733958d77d92bf9693b1", - "reference": "3f0f6001ae707a24f4d9733958d77d92bf9693b1", - "shasum": "" - }, - "require": { - "dflydev/dot-access-data": "^1.1.0", - "php": ">=5.4", - "symfony/yaml": "^2.8.11|^3|^4" - }, - "require-dev": { - "greg-1-anderson/composer-test-scenarios": "^1", - "phpunit/phpunit": "^4.8|^5.5.4", - "satooshi/php-coveralls": "^1.0.2|dev-master", - "squizlabs/php_codesniffer": "^2.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Grasmash\\YamlExpander\\": "src/" - } + "support": { + "issues": "https://github.com/grasmash/expander/issues", + "source": "https://github.com/grasmash/expander/tree/master" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Grasmick" - } - ], - "description": "Expands internal property references in a yaml file.", - "time": "2017-12-16T16:06:03+00:00" + "time": "2017-12-21T22:14:55+00:00" }, { "name": "league/container", - "version": "2.4.1", + "version": "3.4.1", "source": { "type": "git", "url": "https://github.com/thephpleague/container.git", - "reference": "43f35abd03a12977a60ffd7095efd6a7808488c0" + "reference": "84ecbc2dbecc31bd23faf759a0e329ee49abddbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/container/zipball/43f35abd03a12977a60ffd7095efd6a7808488c0", - "reference": "43f35abd03a12977a60ffd7095efd6a7808488c0", + "url": "https://api.github.com/repos/thephpleague/container/zipball/84ecbc2dbecc31bd23faf759a0e329ee49abddbd", + "reference": "84ecbc2dbecc31bd23faf759a0e329ee49abddbd", "shasum": "" }, "require": { - "container-interop/container-interop": "^1.2", - "php": "^5.4.0 || ^7.0" + "php": "^7.0 || ^8.0", + "psr/container": "^1.0.0" }, "provide": { - "container-interop/container-interop-implementation": "^1.2", "psr/container-implementation": "^1.0" }, "replace": { "orno/di": "~2.0" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^6.0 || ^7.0", + "roave/security-advisories": "dev-latest", + "scrutinizer/ocular": "^1.8", + "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { + "dev-master": "3.x-dev", + "dev-3.x": "3.x-dev", "dev-2.x": "2.x-dev", "dev-1.x": "1.x-dev" } @@ -708,31 +566,36 @@ "provider", "service" ], - "time": "2017-05-10T09:20:27+00:00" + "support": { + "issues": "https://github.com/thephpleague/container/issues", + "source": "https://github.com/thephpleague/container/tree/3.4.1" + }, + "funding": [ + { + "url": "https://github.com/philipobenito", + "type": "github" + } + ], + "time": "2021-07-09T08:23:52+00:00" }, { "name": "psr/container", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -745,7 +608,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", @@ -757,20 +620,74 @@ "container-interop", "psr" ], - "time": "2017-02-14T16:28:37+00:00" + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/log", - "version": "1.1.0", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -779,7 +696,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -794,7 +711,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -804,51 +721,59 @@ "psr", "psr-3" ], - "time": "2018-11-20T15:27:04+00:00" + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" }, { "name": "symfony/console", - "version": "v3.4.21", + "version": "v5.1.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a" + "reference": "d9a267b621c5082e0a6c659d73633b6fd28a8a08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a", - "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a", + "url": "https://api.github.com/repos/symfony/console/zipball/d9a267b621c5082e0a6c659d73633b6fd28a8a08", + "reference": "d9a267b621c5082e0a6c659d73633b6fd28a8a08", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" }, "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/process": "<3.3" + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" }, "suggest": { - "psr/log-implementation": "For using the console logger", + "psr/log": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" @@ -871,46 +796,57 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "time": "2019-01-04T04:42:43+00:00" + "support": { + "source": "https://github.com/symfony/console/tree/v5.1.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:01:46+00:00" }, { - "name": "symfony/debug", - "version": "v3.4.21", + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", - "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -919,55 +855,77 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Debug Component", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.21", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2" + "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", - "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67a5f354afa8e2f231081b3fa11a5912f933c3ce", + "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" }, "conflict": { - "symfony/dependency-injection": "<3.3" + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" }, "suggest": { "symfony/dependency-injection": "", "symfony/http-kernel": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" @@ -990,34 +948,125 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony EventDispatcher Component", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "time": "2019-01-01T18:08:36+00:00" + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" }, { - "name": "symfony/filesystem", - "version": "v3.4.21", + "name": "symfony/event-dispatcher-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", - "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/19b71c8f313b411172dd5f470fd61f24466d79a9", + "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8" }, + "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" @@ -1040,33 +1089,45 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Filesystem Component", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-30T07:27:52+00:00" }, { "name": "symfony/finder", - "version": "v3.4.21", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e" + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", - "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", + "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.2.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" @@ -1089,26 +1150,43 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T12:52:38+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.10.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-ctype": "For best performance" @@ -1116,7 +1194,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -1133,12 +1215,12 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { - "name": "Gert de Pagter", - "email": "backendtea@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", @@ -1149,37 +1231,58 @@ "polyfill", "portable" ], - "time": "2018-08-06T14:22:27+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.10.0", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", + "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { - "ext-mbstring": "For best performance" + "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" }, "files": [ "bootstrap.php" @@ -1199,46 +1302,74 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", + "grapheme", + "intl", "polyfill", "portable", "shim" ], - "time": "2018-09-21T13:07:52+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" }, { - "name": "symfony/process", - "version": "v3.4.21", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", - "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Process\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1247,57 +1378,79 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Process Component", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", - "time": "2019-01-02T21:24:08+00:00" + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "symfony/yaml", - "version": "v3.4.21", + "name": "symfony/polyfill-mbstring", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/554a59a1ccbaac238a89b19c8e551a556fd0e2ea", - "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" + "php": ">=7.1" }, "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Yaml\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1306,55 +1459,79 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" - } - ], - "packages-dev": [ + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, { - "name": "behat/gherkin", - "version": "v4.6.0", + "name": "symfony/polyfill-php73", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/Behat/Gherkin.git", - "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/ab0a02ea14893860bca00f225f5621d351a3ad07", - "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { - "php": ">=5.3.1" - }, - "require-dev": { - "phpunit/phpunit": "~4.5|~5", - "symfony/phpunit-bridge": "~2.7|~3|~4", - "symfony/yaml": "~2.3|~3|~4" - }, - "suggest": { - "symfony/yaml": "If you want to parse features, represented in YAML files" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { - "psr-0": { - "Behat\\Gherkin": "src/" - } + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1362,92 +1539,78 @@ ], "authors": [ { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Gherkin DSL parser for PHP 5.3", - "homepage": "http://behat.org/", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "BDD", - "Behat", - "Cucumber", - "DSL", - "gherkin", - "parser" + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2019-01-16T14:22:17+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "codeception/base", - "version": "2.5.2", + "name": "symfony/polyfill-php80", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/Codeception/base.git", - "reference": "4f89de32929fef53ca6d83b159fe329b6d484c1c" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/base/zipball/4f89de32929fef53ca6d83b159fe329b6d484c1c", - "reference": "4f89de32929fef53ca6d83b159fe329b6d484c1c", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", "shasum": "" }, "require": { - "behat/gherkin": "^4.4.0", - "codeception/phpunit-wrapper": "^6.0.9|^7.0.6", - "codeception/stub": "^2.0", - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "facebook/webdriver": ">=1.1.3 <2.0", - "guzzlehttp/guzzle": ">=4.1.4 <7.0", - "guzzlehttp/psr7": "~1.0", - "php": ">=5.6.0 <8.0", - "symfony/browser-kit": ">=2.7 <5.0", - "symfony/console": ">=2.7 <5.0", - "symfony/css-selector": ">=2.7 <5.0", - "symfony/dom-crawler": ">=2.7 <5.0", - "symfony/event-dispatcher": ">=2.7 <5.0", - "symfony/finder": ">=2.7 <5.0", - "symfony/yaml": ">=2.7 <5.0" + "php": ">=7.1" }, - "require-dev": { - "codeception/specify": "~0.3", - "facebook/graph-sdk": "~5.3", - "flow/jsonpath": "~0.2", - "monolog/monolog": "~1.8", - "pda/pheanstalk": "~3.0", - "php-amqplib/php-amqplib": "~2.4", - "predis/predis": "^1.0", - "squizlabs/php_codesniffer": "~2.0", - "symfony/process": ">=2.7 <5.0", - "vlucas/phpdotenv": "^2.4.0" - }, - "suggest": { - "aws/aws-sdk-php": "For using AWS Auth in REST module and Queue module", - "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests", - "codeception/specify": "BDD-style code blocks", - "codeception/verify": "BDD-style assertions", - "flow/jsonpath": "For using JSONPath in REST module", - "league/factory-muffin": "For DataFactory module", - "league/factory-muffin-faker": "For Faker support in DataFactory module", - "phpseclib/phpseclib": "for SFTP option in FTP Module", - "stecman/symfony-console-completion": "For BASH autocompletion", - "symfony/phpunit-bridge": "For phpunit-bridge support" - }, - "bin": [ - "codecept" - ], "type": "library", "extra": { - "branch-alias": [] + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } }, "autoload": { "psr-4": { - "Codeception\\": "src/Codeception", - "Codeception\\Extension\\": "ext" - } + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1455,11 +1618,484 @@ ], "authors": [ { - "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "http://codegyre.com" - } - ], + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/process", + "version": "v5.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "714b47f9196de61a196d86c4bad5f09201b307df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/714b47f9196de61a196d86c4bad5f09201b307df", + "reference": "714b47f9196de61a196d86c4bad5f09201b307df", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-12T10:15:01+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" + }, + { + "name": "symfony/string", + "version": "v5.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-27T11:44:38+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", + "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-24T08:13:00+00:00" + } + ], + "packages-dev": [ + { + "name": "behat/gherkin", + "version": "v4.8.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/2391482cd003dfdc36b679b27e9f5326bd656acd", + "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd", + "shasum": "" + }, + "require": { + "php": "~7.2|~8.0" + }, + "require-dev": { + "cucumber/cucumber": "dev-gherkin-16.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/phpunit-bridge": "~3|~4|~5", + "symfony/yaml": "~3|~4|~5" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" + }, + "time": "2021-02-04T12:44:21+00:00" + }, + { + "name": "codeception/codeception", + "version": "4.1.21", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "c25f20d842a7e3fa0a8e6abf0828f102c914d419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/c25f20d842a7e3fa0a8e6abf0828f102c914d419", + "reference": "c25f20d842a7e3fa0a8e6abf0828f102c914d419", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.4.0", + "codeception/lib-asserts": "^1.0", + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1 | ^9.0", + "codeception/stub": "^2.0 | ^3.0", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/psr7": "~1.4", + "php": ">=5.6.0 <9.0", + "symfony/console": ">=2.7 <6.0", + "symfony/css-selector": ">=2.7 <6.0", + "symfony/event-dispatcher": ">=2.7 <6.0", + "symfony/finder": ">=2.7 <6.0", + "symfony/yaml": ">=2.7 <6.0" + }, + "require-dev": { + "codeception/module-asserts": "1.*@dev", + "codeception/module-cli": "1.*@dev", + "codeception/module-db": "1.*@dev", + "codeception/module-filesystem": "1.*@dev", + "codeception/module-phpbrowser": "1.*@dev", + "codeception/specify": "~0.3", + "codeception/util-universalframework": "*@dev", + "monolog/monolog": "~1.8", + "squizlabs/php_codesniffer": "~2.0", + "symfony/process": ">=2.7 <6.0", + "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0 | ^5.0" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "hoa/console": "For interactive console functionality", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/phpunit-bridge": "For phpunit-bridge support" + }, + "bin": [ + "codecept" + ], + "type": "library", + "extra": { + "branch-alias": [] + }, + "autoload": { + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + } + ], "description": "BDD-style testing framework", "homepage": "http://codeception.com/", "keywords": [ @@ -1469,76 +2105,185 @@ "functional testing", "unit testing" ], - "time": "2019-01-02T10:28:51+00:00" + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/4.1.21" + }, + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2021-05-28T17:43:39+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "1.13.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/184231d5eab66bc69afd6b9429344d80c67a33b6", + "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": ">=5.6.0 <9.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" + }, + "time": "2020-10-21T16:26:20+00:00" + }, + { + "name": "codeception/phpunit-wrapper", + "version": "9.0.6", + "source": { + "type": "git", + "url": "https://github.com/Codeception/phpunit-wrapper.git", + "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/b0c06abb3181eedca690170f7ed0fd26a70bfacc", + "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "phpunit/phpunit": "^9.0" + }, + "require-dev": { + "codeception/specify": "*", + "consolidation/robo": "^3.0.0-alpha3", + "vlucas/phpdotenv": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\PHPUnit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + }, + { + "name": "Naktibalda" + } + ], + "description": "PHPUnit classes used by Codeception", + "support": { + "issues": "https://github.com/Codeception/phpunit-wrapper/issues", + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.6" + }, + "time": "2020-12-28T13:59:47+00:00" + }, + { + "name": "codeception/stub", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "468dd5fe659f131fc997f5196aad87512f9b1304" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/468dd5fe659f131fc997f5196aad87512f9b1304", + "reference": "468dd5fe659f131fc997f5196aad87512f9b1304", + "shasum": "" + }, + "require": { + "phpunit/phpunit": "^8.4 | ^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/3.7.0" + }, + "time": "2020-07-03T15:54:43+00:00" }, { - "name": "codeception/codeception", - "version": "2.5.2", + "name": "composer/semver", + "version": "3.2.5", "source": { "type": "git", - "url": "https://github.com/Codeception/Codeception.git", - "reference": "4f89de32929fef53ca6d83b159fe329b6d484c1c" + "url": "https://github.com/composer/semver.git", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/4f89de32929fef53ca6d83b159fe329b6d484c1c", - "reference": "4f89de32929fef53ca6d83b159fe329b6d484c1c", + "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "shasum": "" }, "require": { - "behat/gherkin": "^4.4.0", - "codeception/phpunit-wrapper": "^6.0.9|^7.0.6", - "codeception/stub": "^2.0", - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "facebook/webdriver": ">=1.1.3 <2.0", - "guzzlehttp/guzzle": ">=4.1.4 <7.0", - "guzzlehttp/psr7": "~1.0", - "php": ">=5.6.0 <8.0", - "symfony/browser-kit": ">=2.7 <5.0", - "symfony/console": ">=2.7 <5.0", - "symfony/css-selector": ">=2.7 <5.0", - "symfony/dom-crawler": ">=2.7 <5.0", - "symfony/event-dispatcher": ">=2.7 <5.0", - "symfony/finder": ">=2.7 <5.0", - "symfony/yaml": ">=2.7 <5.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "codeception/specify": "~0.3", - "facebook/graph-sdk": "~5.3", - "flow/jsonpath": "~0.2", - "monolog/monolog": "~1.8", - "pda/pheanstalk": "~3.0", - "php-amqplib/php-amqplib": "~2.4", - "predis/predis": "^1.0", - "squizlabs/php_codesniffer": "~2.0", - "symfony/process": ">=2.7 <5.0", - "vlucas/phpdotenv": "^2.4.0" + "phpstan/phpstan": "^0.12.54", + "symfony/phpunit-bridge": "^4.2 || ^5" }, - "suggest": { - "aws/aws-sdk-php": "For using AWS Auth in REST module and Queue module", - "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests", - "codeception/specify": "BDD-style code blocks", - "codeception/verify": "BDD-style assertions", - "flow/jsonpath": "For using JSONPath in REST module", - "league/factory-muffin": "For DataFactory module", - "league/factory-muffin-faker": "For Faker support in DataFactory module", - "phpseclib/phpseclib": "for SFTP option in FTP Module", - "stecman/symfony-console-completion": "For BASH autocompletion", - "symfony/phpunit-bridge": "For phpunit-bridge support" - }, - "bin": [ - "codecept" - ], "type": "library", "extra": { - "branch-alias": [] + "branch-alias": { + "dev-main": "3.x-dev" + } }, "autoload": { "psr-4": { - "Codeception\\": "src/Codeception", - "Codeception\\Extension\\": "ext" + "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1547,53 +2292,75 @@ ], "authors": [ { - "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "http://codegyre.com" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" } ], - "description": "BDD-style testing framework", - "homepage": "http://codeception.com/", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "BDD", - "TDD", - "acceptance testing", - "functional testing", - "unit testing" + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.2.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2019-01-02T10:28:51+00:00" + "time": "2021-05-24T12:41:47+00:00" }, { - "name": "codeception/phpunit-wrapper", - "version": "6.5.1", + "name": "composer/xdebug-handler", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/Codeception/phpunit-wrapper.git", - "reference": "d78f9eb9c4300a5924cc27dee03e8c1a96fcf5f3" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/d78f9eb9c4300a5924cc27dee03e8c1a96fcf5f3", - "reference": "d78f9eb9c4300a5924cc27dee03e8c1a96fcf5f3", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/964adcdd3a28bf9ed5d9ac6450064e0d71ed7496", + "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496", "shasum": "" }, "require": { - "phpunit/php-code-coverage": ">=4.0.4 <6.0", - "phpunit/phpunit": ">=6.5.13 <7.0", - "sebastian/comparator": ">=1.2.4 <3.0", - "sebastian/diff": ">=1.4 <4.0" - }, - "replace": { - "codeception/phpunit-wrapper": "*" + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" }, "require-dev": { - "codeception/specify": "*", - "vlucas/phpdotenv": "^2.4" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "autoload": { "psr-4": { - "Codeception\\PHPUnit\\": "src\\" + "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1602,73 +2369,135 @@ ], "authors": [ { - "name": "Davert", - "email": "davert.php@resend.cc" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "PHPUnit classes used by Codeception", - "time": "2019-01-13T10:34:55+00:00" + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.0.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-05-05T19:37:51+00:00" }, { - "name": "codeception/stub", - "version": "2.0.4", + "name": "doctrine/annotations", + "version": "1.13.1", "source": { "type": "git", - "url": "https://github.com/Codeception/Stub.git", - "reference": "f50bc271f392a2836ff80690ce0c058efe1ae03e" + "url": "https://github.com/doctrine/annotations.git", + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/f50bc271f392a2836ff80690ce0c058efe1ae03e", - "reference": "f50bc271f392a2836ff80690ce0c058efe1ae03e", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", "shasum": "" }, "require": { - "phpunit/phpunit": ">=4.8 <8.0" + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" }, "type": "library", "autoload": { "psr-4": { - "Codeception\\": "src/" + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", - "time": "2018-07-26T11:55:37+00:00" + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.13.1" + }, + "time": "2021-05-16T18:07:53+00:00" }, { "name": "doctrine/instantiator", - "version": "1.0.5", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "php": "^7.1 || ^8.0" }, "require-dev": { - "athletic/athletic": "~0.1.8", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -1682,175 +2511,358 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "constructor", "instantiate" ], - "time": "2015-06-14T21:17:01+00:00" + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-11-10T18:47:58+00:00" }, { - "name": "facebook/webdriver", - "version": "1.6.0", + "name": "doctrine/lexer", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/facebook/php-webdriver.git", - "reference": "bd8c740097eb9f2fc3735250fc1912bc811a954e" + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/bd8c740097eb9f2fc3735250fc1912bc811a954e", - "reference": "bd8c740097eb9f2fc3735250fc1912bc811a954e", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-zip": "*", - "php": "^5.6 || ~7.0", - "symfony/process": "^2.8 || ^3.1 || ^4.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "jakub-onderka/php-parallel-lint": "^0.9.2", - "php-coveralls/php-coveralls": "^2.0", - "php-mock/php-mock-phpunit": "^1.1", - "phpunit/phpunit": "^5.7", - "sebastian/environment": "^1.3.4 || ^2.0 || ^3.0", - "squizlabs/php_codesniffer": "^2.6", - "symfony/var-dumper": "^3.3 || ^4.0" - }, - "suggest": { - "ext-SimpleXML": "For Firefox profile creation" + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-community": "1.5-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { "psr-4": { - "Facebook\\WebDriver\\": "lib/" + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } ], - "description": "A PHP client for Selenium WebDriver", - "homepage": "https://github.com/facebook/php-webdriver", + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", "keywords": [ - "facebook", - "php", - "selenium", - "webdriver" + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } ], - "time": "2018-05-16T17:37:13+00:00" + "time": "2020-05-25T17:44:05+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "6.3.3", + "name": "friendsofphp/php-cs-fixer", + "version": "v3.0.0", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "c15377bdfa8d1ecf186f1deadec39c89984e1167" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c15377bdfa8d1ecf186f1deadec39c89984e1167", + "reference": "c15377bdfa8d1ecf186f1deadec39c89984e1167", "shasum": "" }, "require": { - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", - "php": ">=5.5" + "composer/semver": "^3.2", + "composer/xdebug-handler": "^2.0", + "doctrine/annotations": "^1.12", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.1.3 || ^8.0", + "php-cs-fixer/diff": "^2.0", + "symfony/console": "^4.4.20 || ^5.1.3", + "symfony/event-dispatcher": "^4.4.20 || ^5.0", + "symfony/filesystem": "^4.4.20 || ^5.0", + "symfony/finder": "^4.4.20 || ^5.0", + "symfony/options-resolver": "^4.4.20 || ^5.0", + "symfony/polyfill-php72": "^1.22", + "symfony/process": "^4.4.20 || ^5.0", + "symfony/stopwatch": "^4.4.20 || ^5.0" }, "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.0" + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^1.4", + "mikey179/vfsstream": "^1.6.8", + "php-coveralls/php-coveralls": "^2.4.3", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy": "^1.10.3", + "phpspec/prophecy-phpunit": "^1.1 || ^2.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5", + "phpunitgoodpractices/polyfill": "^1.5", + "phpunitgoodpractices/traits": "^1.9.1", + "symfony/phpunit-bridge": "^5.2.4", + "symfony/yaml": "^4.4.20 || ^5.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters.", + "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2021-05-03T21:51:58+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" }, "suggest": { - "psr/log": "Required for using the Log middleware" + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.3-dev" + "dev-master": "1.7-dev" } }, "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, "files": [ "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.8.2" + }, + "time": "2021-04-26T09:17:50+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.10.2", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, + "funding": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" } ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2018-04-22T15:46:56+00:00" + "time": "2020-11-13T09:40:50+00:00" }, { - "name": "guzzlehttp/promises", - "version": "v1.3.1", + "name": "n98/junit-xml", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + "url": "https://github.com/cmuench/junit-xml.git", + "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/0017dd92ac8cb619f02e32f4cffd768cfe327c73", + "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73", "shasum": "" }, - "require": { - "php": ">=5.5.0" - }, "require-dev": { - "phpunit/phpunit": "^4.0" + "phpunit/phpunit": "^9.5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + "N98\\JUnitXml\\": "src/N98/JUnitXml" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1858,153 +2870,168 @@ ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Christian Münch", + "email": "c.muench@netz98.de" } ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" + "description": "JUnit XML Document generation library", + "support": { + "issues": "https://github.com/cmuench/junit-xml/issues", + "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" + }, + "time": "2020-12-25T09:08:58+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "1.5.2", + "name": "nikic/php-parser", + "version": "v4.11.0", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "9f83dded91781a01c63574e387eaa769be769115" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", - "reference": "9f83dded91781a01c63574e387eaa769be769115", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/fe14cf3672a149364fb66dfe11bf6549af899f94", + "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5" - }, - "provide": { - "psr/http-message-implementation": "1.0" + "ext-tokenizer": "*", + "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5-dev" + "dev-master": "4.9-dev" } }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + "PhpParser\\": "lib/PhpParser" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" + "name": "Nikita Popov" } ], - "description": "PSR-7 message implementation that also provides common utility methods", + "description": "A PHP parser written in PHP", "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" + "parser", + "php" ], - "time": "2018-12-04T20:46:45+00:00" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.11.0" + }, + "time": "2021-07-03T13:36:55+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.7.0", + "name": "overtrue/phplint", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + "url": "https://github.com/overtrue/phplint.git", + "reference": "2d68ee8ab9083041a297cb6897ccec6290814c88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "url": "https://api.github.com/repos/overtrue/phplint/zipball/2d68ee8ab9083041a297cb6897ccec6290814c88", + "reference": "2d68ee8ab9083041a297cb6897ccec6290814c88", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "ext-json": "*", + "n98/junit-xml": "1.1.0", + "php": ">=5.5.9", + "symfony/console": "^3.2|^4.0|^5.0", + "symfony/finder": "^3.0|^4.0|^5.0", + "symfony/process": "^3.3|^4.0|^5.0", + "symfony/yaml": "^3.0|^4.0|^5.0" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^4.1" + "brainmaestro/composer-git-hooks": "^2.7", + "friendsofphp/php-cs-fixer": "^2.16", + "jakub-onderka/php-console-highlighter": "^0.3.2 || ^0.4" }, + "bin": [ + "bin/phplint" + ], "type": "library", + "extra": { + "hooks": { + "pre-commit": [ + "composer fix-style" + ], + "pre-push": [ + "composer check-style" + ] + } + }, "autoload": { "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] + "Overtrue\\PHPLint\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.", "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "check", + "lint", + "phplint", + "syntax" ], - "time": "2017-10-19T19:58:43+00:00" + "support": { + "issues": "https://github.com/overtrue/phplint/issues", + "source": "https://github.com/overtrue/phplint/tree/3.0.0" + }, + "time": "2021-06-02T13:27:41+00:00" }, { "name": "phar-io/manifest", - "version": "1.0.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", - "phar-io/version": "^1.0.1", - "php": "^5.6 || ^7.0" + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2034,24 +3061,28 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2017-03-05T18:14:27+00:00" + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, + "time": "2020-06-27T14:33:11+00:00" }, { "name": "phar-io/version", - "version": "1.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + "reference": "bae7c545bef187884426f042434e561ab1ddb182" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -2081,39 +3112,90 @@ } ], "description": "Library for handling version information and constraints", - "time": "2017-03-05T17:38:23+00:00" + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" + }, + "time": "2021-02-23T14:00:09+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "1.0.1", + "name": "php-cs-fixer/diff", + "version": "v2.0.2", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3", + "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^5.6 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.6" + "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "sebastian/diff v3 backport support for PHP 5.6+", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/diff/issues", + "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" + }, + "time": "2020-10-14T08:32:19+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] + "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2135,44 +3217,45 @@ "reflection", "static analysis" ], - "time": "2017-09-11T18:02:19+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" }, "require-dev": { - "doctrine/instantiator": "~1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" + "mockery/mockery": "~1.3.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2183,44 +3266,49 @@ { "name": "Mike van Riel", "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, + "time": "2020-09-03T19:13:55+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.4.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "shasum": "" }, "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" + "ext-tokenizer": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2233,42 +3321,47 @@ "email": "me@mikevanriel.com" } ], - "time": "2017-07-14T14:27:02+00:00" + "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.4.0" + }, + "time": "2020-09-17T18:55:26+00:00" }, { "name": "phpspec/prophecy", - "version": "1.8.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0|^3.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.1", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8.x-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { - "psr-0": { - "Prophecy\\": "src/" + "psr-4": { + "Prophecy\\": "src/Prophecy" } }, "notification-url": "https://packagist.org/downloads/", @@ -2296,44 +3389,52 @@ "spy", "stub" ], - "time": "2018-08-05T17:53:17+00:00" + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + }, + "time": "2021-03-17T13:42:18+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "5.3.2", + "version": "9.2.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac" + "reference": "f6293e1b30a2354e8428e004689671b83871edde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", + "reference": "f6293e1b30a2354e8428e004689671b83871edde", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "php": "^7.0", - "phpunit/php-file-iterator": "^1.4.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^2.0.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.0", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" + "nikic/php-parser": "^4.10.2", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-xdebug": "^2.5.5" + "ext-pcov": "*", + "ext-xdebug": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.3.x-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -2359,29 +3460,42 @@ "testing", "xunit" ], - "time": "2018-04-06T15:36:58+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-03-28T07:26:59+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.5", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", + "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2396,7 +3510,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -2406,26 +3520,48 @@ "filesystem", "iterator" ], - "time": "2017-11-27T13:52:08+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:57:25+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -2442,37 +3578,47 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "template" + "process" ], - "time": "2015-06-21T13:50:34+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "phpunit/php-timer", - "version": "1.0.9", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2487,42 +3633,51 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "timer" + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2017-02-26T11:10:40+00:00" + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "2.0.2", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.2.4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2537,65 +3692,78 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "tokenizer" + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2017-11-27T05:48:46+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", - "version": "6.5.13", + "version": "9.5.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0973426fb012359b2f18d3bd1e90ef1172839693" + "reference": "fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0973426fb012359b2f18d3bd1e90ef1172839693", - "reference": "0973426fb012359b2f18d3bd1e90ef1172839693", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb", + "reference": "fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb", "shasum": "" }, "require": { + "doctrine/instantiator": "^1.3.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "^1.6.1", - "phar-io/manifest": "^1.0.1", - "phar-io/version": "^1.0", - "php": "^7.0", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.3", - "phpunit/php-file-iterator": "^1.4.3", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^5.0.9", - "sebastian/comparator": "^2.1", - "sebastian/diff": "^2.0", - "sebastian/environment": "^3.1", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^1.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2", - "phpunit/dbunit": "<3.0" + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.1", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.3", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^2.3.4", + "sebastian/version": "^3.0.2" }, "require-dev": { - "ext-pdo": "*" + "ext-pdo": "*", + "phpspec/prophecy-phpunit": "^2.0.1" }, "suggest": { - "ext-xdebug": "*", - "phpunit/php-invoker": "^1.1" + "ext-soap": "*", + "ext-xdebug": "*" }, "bin": [ "phpunit" @@ -2603,12 +3771,15 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5.x-dev" + "dev-master": "9.5-dev" } }, "autoload": { "classmap": [ "src/" + ], + "files": [ + "src/Framework/Assert/Functions.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2629,66 +3800,70 @@ "testing", "xunit" ], - "time": "2018-09-08T15:10:43+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.6" + }, + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-06-23T05:14:38+00:00" }, { - "name": "phpunit/phpunit-mock-objects", - "version": "5.0.10", + "name": "psr/cache", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f" + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f", - "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.5", - "php": "^7.0", - "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.1" - }, - "conflict": { - "phpunit/phpunit": "<6.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5.11" - }, - "suggest": { - "ext-soap": "*" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Cache\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "description": "Common interface for caching libraries", "keywords": [ - "mock", - "xunit" + "cache", + "psr", + "psr-6" ], - "time": "2018-08-09T05:50:03+00:00" + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" }, { "name": "psr/http-message", @@ -2738,28 +3913,31 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { "name": "ralouphie/getallheaders", - "version": "2.0.5", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", - "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "php": ">=5.3" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "~3.7.0", - "satooshi/php-coveralls": ">=1.0" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", "autoload": { @@ -2778,32 +3956,525 @@ } ], "description": "A polyfill for getallheaders.", - "time": "2016-02-11T07:05:27+00:00" + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", + "name": "roave/security-advisories", + "version": "dev-latest", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "fc5e5d772af47d035df8178172391259b6e30566" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/fc5e5d772af47d035df8178172391259b6e30566", + "reference": "fc5e5d772af47d035df8178172391259b6e30566", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "baserproject/basercms": "<4.4.5", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bolt/bolt": "<3.7.2", + "bolt/core": "<4.1.13", + "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<20.10.7", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.16|>=4.10,<4.11.5|= 4.10.0", + "contao/listing-bundle": ">=4,<4.4.8", + "craftcms/cms": "<3.6.7", + "croogo/croogo": "<3.0.7", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "directmailteam/direct-mail": "<5.2.4", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<11.0.4", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "dweeves/magmi": "<=0.7.24", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", + "feehi/cms": "<=2.1.1", + "firebase/php-jwt": "<2", + "flarum/core": ">=1,<=1.0.1", + "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", + "flarum/tags": "<=0.1-beta.13", + "fluidtypo3/vhs": "<5.1.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.8.3", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<6.5.1", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "fuel/core": "<1.8.1", + "getgrav/grav": "<=1.7.10", + "getkirby/cms": "<=3.5.6", + "getkirby/panel": "<2.5.14", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<8.40", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", + "impresscms/impresscms": "<=1.4.2", + "intelliants/subrion": "<=4.2.1", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/archive": "<1.1.10", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kitodo/presentation": "<3.1.2", + "klaviyo/magento2-extension": ">=1,<3", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-http": "<2.14.2", + "laravel/framework": "<6.20.26|>=7,<8.40", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<21.1", + "livewire/livewire": ">2.2.4,<2.2.6", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "marcwillmann/turn": "<0.3.3", + "mautic/core": "<3.3.2|= 2.13.1", + "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mittwald/typo3_forum": "<1.2.1", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", + "namshi/jose": "<2.2", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nukeviet/nukeviet": "<4.3.4", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", + "october/october": ">=1.0.319,<1.0.466", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "opencart/opencart": "<=3.0.3.2", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", + "orchid/platform": ">=9,<9.4.4", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.12", + "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<10.0.7", + "pocketmine/pocketmine-mp": "<3.15.4", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", + "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6-beta", + "rainlab/debugbar-plugin": "<3.1", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": "<3.0.4", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/core": "<=6.4.1", + "shopware/platform": "<=6.4.1", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.6.9", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.7.4", + "silverstripe/graphql": "<=3.5|>=4-alpha.1,<4-alpha.2", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.39", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.59", + "sulu/sulu": "<1.6.41|>=2,<2.0.10|>=2.1,<2.1.1", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3/dce": ">=2.2,<2.6.2", + "t3g/svg-sanitizer": "<1.0.3", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "tribalsystems/zenario": "<8.8.53370", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vrana/adminer": "<4.7.9", + "wallabag/tcpdf": "<6.2.22", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "wp-cli/wp-cli": "<2.5", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yoast-seo-for-typo3/yoast_seo": "<7.2.1", + "yourls/yourls": "<1.7.4", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" + }, + "default-branch": true, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2021-07-13T18:03:10+00:00" + }, + { + "name": "sebastian/cli-parser", "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2823,34 +4494,44 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "2.1.3", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/diff": "^2.0 || ^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2863,6 +4544,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -2874,10 +4559,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -2887,27 +4568,38 @@ "compare", "equality" ], - "time": "2018-02-01T13:46:46+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:49:45+00:00" }, { - "name": "sebastian/diff", - "version": "2.0.1", + "name": "sebastian/complexity", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", "shasum": "" }, "require": { - "php": "^7.0" + "nikic/php-parser": "^4.7", + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.2" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { @@ -2926,45 +4618,118 @@ ], "authors": [ { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "diff" + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2017-08-03T08:09:46+00:00" + "time": "2020-10-26T13:10:38+00:00" }, { "name": "sebastian/environment", - "version": "3.1.0", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + "reference": "388b6ced16caa751030f6a69e588299fa09200ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", + "reference": "388b6ced16caa751030f6a69e588299fa09200ac", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.1" + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2989,34 +4754,44 @@ "environment", "hhvm" ], - "time": "2017-07-01T08:51:00+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:52:38+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.0", + "version": "4.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3029,6 +4804,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -3038,53 +4817,121 @@ "email": "github@wallbash.com" }, { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" + "name": "Adam Harvey", + "email": "aharvey@php.net" }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:24:23+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ - "export", - "exporter" + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2017-04-03T13:19:02+00:00" + "time": "2021-06-11T13:31:12+00:00" }, { - "name": "sebastian/global-state", - "version": "2.0.0", + "name": "sebastian/lines-of-code", + "version": "1.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", "shasum": "" }, "require": { - "php": "^7.0" + "nikic/php-parser": "^4.6", + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -3099,42 +4946,50 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2017-04-27T15:39:26+00:00" + "time": "2020-11-28T06:42:11+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3154,32 +5009,42 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.1", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -3199,32 +5064,42 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.0", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3237,14 +5112,14 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" @@ -3252,29 +5127,42 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" }, { "name": "sebastian/resource-operations", - "version": "1.0.0", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { - "php": ">=5.6.0" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -3294,29 +5182,95 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "2.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-06-15T12:49:02+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -3337,42 +5291,95 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { - "name": "symfony/browser-kit", - "version": "v3.4.21", + "name": "squizlabs/php_codesniffer", + "version": "3.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "6d98fb221a263c66b1311203fe4eed154035f508" + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/6d98fb221a263c66b1311203fe4eed154035f508", - "reference": "6d98fb221a263c66b1311203fe4eed154035f508", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/dom-crawler": "~2.8|~3.0|~4.0" + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" }, "require-dev": { - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0" - }, - "suggest": { - "symfony/process": "" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2021-04-09T00:54:41+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", + "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" + "Symfony\\Component\\CssSelector\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3387,41 +5394,60 @@ "name": "Fabien Potencier", "email": "fabien@symfony.com" }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony BrowserKit Component", + "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:40:38+00:00" }, { - "name": "symfony/css-selector", - "version": "v3.4.21", + "name": "symfony/options-resolver", + "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "12f86295c46c36af9896cf21db6b6b8a1465315d" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/12f86295c46c36af9896cf21db6b6b8a1465315d", - "reference": "12f86295c46c36af9896cf21db6b6b8a1465315d", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, "autoload": { "psr-4": { - "Symfony\\Component\\CssSelector\\": "" + "Symfony\\Component\\OptionsResolver\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3432,10 +5458,6 @@ "MIT" ], "authors": [ - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" @@ -3445,44 +5467,130 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony CssSelector Component", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", - "time": "2019-01-02T09:30:52+00:00" + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" }, { - "name": "symfony/dom-crawler", - "version": "v3.4.21", + "name": "symfony/polyfill-php72", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "311f666d85d1075b0a294ba1f3de4ae9307d8180" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/311f666d85d1075b0a294ba1f3de4ae9307d8180", - "reference": "311f666d85d1075b0a294ba1f3de4ae9307d8180", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "symfony/css-selector": "~2.8|~3.0|~4.0" - }, - "suggest": { - "symfony/css-selector": "" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" + "Symfony\\Component\\Stopwatch\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3502,29 +5610,46 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DomCrawler Component", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" }, { "name": "theseer/tokenizer", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + "reference": "75a63c33a8577608444246075ea0af0d052e452a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -3544,34 +5669,47 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2017-04-07T12:08:54+00:00" + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/master" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2020-07-12T23:59:07+00:00" }, { "name": "webmozart/assert", - "version": "1.4.0", + "version": "1.10.0", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0", + "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" + "phpunit/phpunit": "^8.5.13" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.10-dev" } }, "autoload": { @@ -3595,14 +5733,25 @@ "check", "validate" ], - "time": "2018-12-25T11:19:39+00:00" + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [] + "platform": { + "php": ">=7.3 <9.0", + "ext-dom": "*", + "ext-libxml": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.1.0" } diff --git a/src/MergeReports.php b/src/MergeReports.php deleted file mode 100644 index 4c20e84..0000000 --- a/src/MergeReports.php +++ /dev/null @@ -1,326 +0,0 @@ -task(MergeXmlReportsTask::class, $src); - } - - protected function taskMergeHTMLReports($src = []) - { - return $this->task(MergeHTMLReportsTask::class, $src); - } -} - -interface MergeReportsTaskInterface -{ - public function from($fileName); - - public function into($fileName); -} - -class MergeXmlReportsTask extends BaseTask implements TaskInterface, MergeReportsTaskInterface -{ - protected $src = []; - protected $dst; - protected $summarizeTime = true; - - protected $mergeRewrite = false; - /** @var \DOMElement[][] */ - protected $suites = []; - - public function __construct($src = []) - { - $this->src = $src; - } - - public function sumTime() - { - $this->summarizeTime = true; - } - - public function maxTime() - { - $this->summarizeTime = false; - } - - public function mergeRewrite() - { - $this->mergeRewrite = true; - return $this; - } - - public function from($fileName) - { - if (is_array($fileName)) { - $this->src = array_merge($fileName, $this->src); - } else { - $this->src[] = $fileName; - } - return $this; - } - - public function into($fileName) - { - $this->dst = $fileName; - return $this; - } - - public function run() - { - if (!$this->dst) { - throw new TaskException($this, "No destination file is set. Use `->into()` method to set result xml"); - } - $this->printTaskInfo("Merging JUnit XML reports into {$this->dst}"); - $dstXml = new \DOMDocument(); - $dstXml->appendChild($dstXml->createElement('testsuites')); - - $this->suites = []; - foreach ($this->src as $src) { - $this->printTaskInfo("Processing $src"); - - $srcXml = new \DOMDocument(); - if (!file_exists($src)) { - throw new TaskException($this, "XML file $src does not exist"); - } - $loaded = $srcXml->load($src); - if (!$loaded) { - $this->printTaskInfo("File $src can't be loaded as XML"); - continue; - } - $suiteNodes = (new \DOMXPath($srcXml))->query('//testsuites/testsuite'); - foreach ($suiteNodes as $suiteNode) { - $suiteNode = $dstXml->importNode($suiteNode, true); - /** @var $suiteNode \DOMElement **/ - $this->loadSuites($suiteNode); - } - } - - $this->mergeSuites($dstXml); - - $dstXml->save($this->dst); - $this->printTaskInfo("File {$this->dst} saved. ".count($this->suites).' suites added'); - } - - protected function loadSuites(\DOMElement $current) - { - /** @var \DOMNode $node */ - foreach ($current->childNodes as $node) { - if ($node instanceof \DOMElement) { - if ($this->mergeRewrite) { - $this->suites[$current->getAttribute('name')][$node->getAttribute('class') . '::' . $node->getAttribute('name')] = $node->cloneNode(true); - } else { - $this->suites[$current->getAttribute('name')][] = $node->cloneNode(true); - } - } - } - } - - protected function mergeSuites(\DOMDocument $dstXml) - { - foreach ($this->suites as $suiteName => $tests) { - $resultNode = $dstXml->createElement("testsuite"); - $resultNode->setAttribute('name', $suiteName); - $data = [ - 'tests' => count($tests), - 'assertions' => 0, - 'failures' => 0, - 'errors' => 0, - 'time' => 0, - ]; - foreach ($tests as $test) { - $resultNode->appendChild($test); - - $data['assertions'] += (int)$test->getAttribute('assertions'); - $data['time'] = $this->summarizeTime - ? ((float) $test->getAttribute('time') + $data['time']) - : max($test->getAttribute('time'), $data['time']); - - $data['failures'] += $test->getElementsByTagName('failure')->length; - $data['errors'] += $test->getElementsByTagName('error')->length; - } - foreach ($data as $key => $value) { - $resultNode->setAttribute($key, $value); - } - $dstXml->firstChild->appendChild($resultNode); - } - } -} - -/** - * Generate common HTML report - * Class MergeHTMLReportsTask - * @author Kerimov Asif - */ -class MergeHTMLReportsTask extends BaseTask implements TaskInterface, MergeReportsTaskInterface -{ - protected $src = []; - protected $dst; - protected $countSuccess = 0; - protected $countFailed = 0; - protected $countSkipped = 0; - protected $countIncomplete = 0; - protected $previousLibXmlUseErrors; - - public function __construct($src = []) - { - $this->src = $src; - } - - public function from($fileName) - { - if (is_array($fileName)) { - $this->src = array_merge($fileName, $this->src); - } else { - $this->src[] = $fileName; - } - return $this; - } - - public function into($fileName) - { - $this->dst = $fileName; - return $this; - } - - public function run() - { - //save initial statament and switch on use_internal_errors mode - $this->previousLibXmlUseErrors = libxml_use_internal_errors(true); - - if (!$this->dst) { - libxml_use_internal_errors($this->previousLibXmlUseErrors); - throw new TaskException($this, "No destination file is set. Use `->into()` method to set result HTML"); - } - - $this->printTaskInfo("Merging HTML reports into {$this->dst}"); - - //read first source file as main - $dstHTML = new \DOMDocument(); - $dstHTML->loadHTMLFile($this->src[0],LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - - //main node for all table rows - $table = (new \DOMXPath($dstHTML))->query("//table")->item(0); - - //prepare reference nodes for envs - $refnodes = (new \DOMXPath($dstHTML))->query("//div[@class='layout']/table/tr[not(@class)]"); - - for($k=1;$ksrc);$k++){ - $srcHTML = new \DOMDocument(); - $src = $this->src[$k]; - $srcHTML->loadHTMLFile($src,LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - $suiteNodes = (new \DOMXPath($srcHTML))->query("//div[@class='layout']/table/tr"); - $j=0; - foreach($suiteNodes as $suiteNode){ - if($suiteNode->getAttribute('class') == ''){ - //move to next reference node - $j++; - if($j > $refnodes->length-1) break; - continue; - } - //insert nodes before current reference node - $suiteNode = $dstHTML->importNode($suiteNode, true); - $table->insertBefore($suiteNode, $refnodes->item($j)); - } - } - - /** - * The next 5 functions correct our almost finished final report - */ - $this->countSummary($dstHTML); - $this->moveSummaryTable($dstHTML,$table); - $this->updateSummaryTable($dstHTML); - $this->updateToolbarTable($dstHTML); - $this->updateButtons($dstHTML); - - //save final report - file_put_contents($this->dst,$dstHTML->saveHTML()); - - //return to initial statement - libxml_use_internal_errors($this->previousLibXmlUseErrors); - } - - /** - * This function counts all types of tests' scenarios and writes in class members - * @param $dstFile \DOMDocument - destination file - */ - private function countSummary($dstFile){ - $tests = (new \DOMXPath($dstFile))->query("//table/tr[contains(@class,'scenarioRow')]"); - foreach($tests as $test){ - $class = str_replace('scenarioRow ', '', $test->getAttribute('class')); - switch($class){ - case 'scenarioSuccess': - $this->countSuccess += 0.5; - break; - case 'scenarioFailed': - $this->countFailed += 0.5; - break; - case 'scenarioSkipped': - $this->countSkipped += 0.5; - break; - case 'scenarioIncomplete': - $this->countIncomplete += 0.5; - break; - } - } - } - - /** - * This function updates values in Summary block for each type of scenarios - * @param $dstFile \DOMDocument - destination file - */ - private function updateSummaryTable($dstFile){ - $dstFile = new \DOMXPath($dstFile); - $pathFor = function ($type) { return "//div[@id='stepContainerSummary']//td[@class='$type']";}; - $dstFile->query($pathFor('scenarioSuccessValue'))->item(0)->nodeValue = $this->countSuccess; - $dstFile->query($pathFor('scenarioFailedValue'))->item(0)->nodeValue = $this->countFailed; - $dstFile->query($pathFor('scenarioSkippedValue'))->item(0)->nodeValue = $this->countSkipped; - $dstFile->query($pathFor('scenarioIncompleteValue'))->item(0)->nodeValue = $this->countIncomplete; - } - - /** - * This function moves Summary block in the bottom of result report - * @param $dstFile \DOMDocument - destination file - * @param $node \DOMNode - parent node of Summary table - */ - private function moveSummaryTable($dstFile,$node){ - $summaryTable = (new \DOMXPath($dstFile))->query("//div[@id='stepContainerSummary']") - ->item(0)->parentNode->parentNode; - $node->appendChild($dstFile->importNode($summaryTable,true)); - } - - /** - * This function updates values in Toolbar block for each type of scenarios (blue block on the left side of the report) - * @param $dstFile \DOMDocument - destination file - */ - private function updateToolbarTable($dstFile){ - $dstFile = new \DOMXPath($dstFile); - $pathFor = function ($type) {return "//ul[@id='toolbar-filter']//a[@title='$type']";}; - $dstFile->query($pathFor('Successful'))->item(0)->nodeValue = '✔ '.$this->countSuccess; - $dstFile->query($pathFor('Failed'))->item(0)->nodeValue = '✗ '.$this->countFailed; - $dstFile->query($pathFor('Skipped'))->item(0)->nodeValue = 'S '.$this->countSkipped; - $dstFile->query($pathFor('Incomplete'))->item(0)->nodeValue= 'I '.$this->countIncomplete; - } - - /** - * This function updates "+" and "-" button for viewing test steps in final report - * @param $dstFile \DOMDocument - destination file - */ - private function updateButtons($dstFile){ - $nodes = (new \DOMXPath($dstFile))->query("//div[@class='layout']/table/tr[contains(@class, 'scenarioRow')]"); - for($i=2;$i<$nodes->length;$i+=2){ - $n = $i/2 + 1; - $p = $nodes->item($i)->childNodes->item(1)->childNodes->item(1); - $table = $nodes->item($i+1)->childNodes->item(1)->childNodes->item(1); - $p->setAttribute('onclick',"showHide('$n', this)"); - $table->setAttribute('id',"stepContainer".$n); - } - } - -} diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php new file mode 100644 index 0000000..ceac889 --- /dev/null +++ b/src/Merger/HtmlReportMerger.php @@ -0,0 +1,189 @@ +src = $src; + } + + public function from($fileName) + { + if (is_array($fileName)) { + $this->src = array_merge($fileName, $this->src); + } else { + $this->src[] = $fileName; + } + return $this; + } + + public function into($fileName) + { + $this->dst = $fileName; + return $this; + } + + public function run() + { + //save initial statament and switch on use_internal_errors mode + $this->previousLibXmlUseErrors = libxml_use_internal_errors(true); + + if (!$this->dst) { + libxml_use_internal_errors($this->previousLibXmlUseErrors); + throw new TaskException($this, "No destination file is set. Use `->into()` method to set result HTML"); + } + + $this->printTaskInfo("Merging HTML reports into {$this->dst}"); + + //read first source file as main + $dstHTML = new \DOMDocument(); + $dstHTML->loadHTMLFile($this->src[0], LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + + //main node for all table rows + $table = (new \DOMXPath($dstHTML))->query("//table")->item(0); + + //prepare reference nodes for envs + $refnodes = (new \DOMXPath($dstHTML))->query("//div[@class='layout']/table/tr[not(@class)]"); + + for ($k=1, $kMax = count($this->src);$k< $kMax;$k++) { + $srcHTML = new \DOMDocument(); + $src = $this->src[$k]; + $srcHTML->loadHTMLFile($src, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + $suiteNodes = (new \DOMXPath($srcHTML))->query("//div[@class='layout']/table/tr"); + $j=0; + foreach ($suiteNodes as $suiteNode) { + if ($suiteNode->getAttribute('class') == '') { + //move to next reference node + $j++; + if ($j > $refnodes->length-1) { + break; + } + continue; + } + //insert nodes before current reference node + $suiteNode = $dstHTML->importNode($suiteNode, true); + $table->insertBefore($suiteNode, $refnodes->item($j)); + } + } + + /** + * The next 5 functions correct our almost finished final report + */ + $this->countSummary($dstHTML); + $this->moveSummaryTable($dstHTML, $table); + $this->updateSummaryTable($dstHTML); + $this->updateToolbarTable($dstHTML); + $this->updateButtons($dstHTML); + + //save final report + file_put_contents($this->dst, $dstHTML->saveHTML()); + + //return to initial statement + libxml_use_internal_errors($this->previousLibXmlUseErrors); + } + + /** + * This function counts all types of tests' scenarios and writes in class members + * @param $dstFile \DOMDocument - destination file + */ + private function countSummary($dstFile) + { + $tests = (new \DOMXPath($dstFile))->query("//table/tr[contains(@class,'scenarioRow')]"); + foreach ($tests as $test) { + $class = str_replace('scenarioRow ', '', $test->getAttribute('class')); + switch ($class) { + case 'scenarioSuccess': + $this->countSuccess += 0.5; + break; + case 'scenarioFailed': + $this->countFailed += 0.5; + break; + case 'scenarioSkipped': + $this->countSkipped += 0.5; + break; + case 'scenarioIncomplete': + $this->countIncomplete += 0.5; + break; + } + } + } + + /** + * This function updates values in Summary block for each type of scenarios + * @param $dstFile \DOMDocument - destination file + */ + private function updateSummaryTable($dstFile) + { + $dstFile = new \DOMXPath($dstFile); + $pathFor = function ($type) { + return "//div[@id='stepContainerSummary']//td[@class='$type']"; + }; + $dstFile->query($pathFor('scenarioSuccessValue'))->item(0)->nodeValue = $this->countSuccess; + $dstFile->query($pathFor('scenarioFailedValue'))->item(0)->nodeValue = $this->countFailed; + $dstFile->query($pathFor('scenarioSkippedValue'))->item(0)->nodeValue = $this->countSkipped; + $dstFile->query($pathFor('scenarioIncompleteValue'))->item(0)->nodeValue = $this->countIncomplete; + } + + /** + * This function moves Summary block in the bottom of result report + * @param $dstFile \DOMDocument - destination file + * @param $node \DOMNode - parent node of Summary table + */ + private function moveSummaryTable($dstFile, $node) + { + $summaryTable = (new \DOMXPath($dstFile))->query("//div[@id='stepContainerSummary']") + ->item(0)->parentNode->parentNode; + $node->appendChild($dstFile->importNode($summaryTable, true)); + } + + /** + * This function updates values in Toolbar block for each type of scenarios (blue block on the left side of the report) + * @param $dstFile \DOMDocument - destination file + */ + private function updateToolbarTable($dstFile) + { + $dstFile = new \DOMXPath($dstFile); + $pathFor = function ($type) { + return "//ul[@id='toolbar-filter']//a[@title='$type']"; + }; + $dstFile->query($pathFor('Successful'))->item(0)->nodeValue = '✔ '.$this->countSuccess; + $dstFile->query($pathFor('Failed'))->item(0)->nodeValue = '✗ '.$this->countFailed; + $dstFile->query($pathFor('Skipped'))->item(0)->nodeValue = 'S '.$this->countSkipped; + $dstFile->query($pathFor('Incomplete'))->item(0)->nodeValue= 'I '.$this->countIncomplete; + } + + /** + * This function updates "+" and "-" button for viewing test steps in final report + * @param $dstFile \DOMDocument - destination file + */ + private function updateButtons($dstFile) + { + $nodes = (new \DOMXPath($dstFile))->query("//div[@class='layout']/table/tr[contains(@class, 'scenarioRow')]"); + for ($i=2;$i<$nodes->length;$i+=2) { + $n = $i/2 + 1; + $p = $nodes->item($i)->childNodes->item(1)->childNodes->item(1); + $table = $nodes->item($i+1)->childNodes->item(1)->childNodes->item(1); + $p->setAttribute('onclick', "showHide('$n', this)"); + $table->setAttribute('id', "stepContainer".$n); + } + } +} diff --git a/src/Merger/ReportMerger.php b/src/Merger/ReportMerger.php new file mode 100644 index 0000000..d8acad2 --- /dev/null +++ b/src/Merger/ReportMerger.php @@ -0,0 +1,17 @@ +task(XmlReportMergerTask::class, $src); + } + + protected function taskMergeHTMLReports($src = []) + { + return $this->task(HtmlReportMerger::class, $src); + } +} diff --git a/src/Merger/ReportMergerTaskInterface.php b/src/Merger/ReportMergerTaskInterface.php new file mode 100644 index 0000000..9e79ba4 --- /dev/null +++ b/src/Merger/ReportMergerTaskInterface.php @@ -0,0 +1,20 @@ +src = $src; + } + + public function sumTime(): void + { + $this->summarizeTime = true; + } + + public function maxTime():void + { + $this->summarizeTime = false; + } + + public function mergeRewrite(): self + { + $this->mergeRewrite = true; + + return $this; + } + + /** + * @param array|string $fileName + * @return $this + */ + public function from($fileName): self + { + if (is_array($fileName)) { + $this->src = array_merge($fileName, $this->src); + } else { + $this->src[] = $fileName; + } + + return $this; + } + + /** + * @param string $fileName + * @return $this + */ + public function into($fileName): self + { + $this->dst = $fileName; + + return $this; + } + + public function run(): void + { + if (!$this->dst) { + throw new TaskException( + $this, + "No destination file is set. Use `->into()` method to set result xml" + ); + } + $this->printTaskInfo("Merging JUnit XML reports into {$this->dst}"); + $dstXml = new DOMDocument(); + $dstXml->appendChild($dstXml->createElement('testsuites')); + + $this->suites = []; + foreach ($this->src as $src) { + $this->printTaskInfo("Processing $src"); + + $srcXml = new DOMDocument(); + if (!file_exists($src)) { + throw new TaskException($this, "XML file $src does not exist"); + } + $loaded = $srcXml->load($src); + if (!$loaded) { + $this->printTaskInfo("File $src can't be loaded as XML"); + continue; + } + $suiteNodes = (new DOMXPath($srcXml))->query('//testsuites/testsuite'); + foreach ($suiteNodes as $suiteNode) { + $suiteNode = $dstXml->importNode($suiteNode, true); + /** @var $suiteNode DOMElement * */ + $this->loadSuites($suiteNode); + } + } + + $this->mergeSuites($dstXml); + + $dstXml->save($this->dst); + $this->printTaskInfo( + "File {$this->dst} saved. " . count($this->suites) . ' suites added' + ); + } + + protected function loadSuites(DOMElement $current): void + { + /** @var DOMNode $node */ + foreach ($current->childNodes as $node) { + if ($node instanceof DOMElement) { + if ($this->mergeRewrite) { + $this->suites[$current->getAttribute('name')][$node->getAttribute('class') . + '::' . $node->getAttribute('name')] = $node->cloneNode(true); + } else { + $this->suites[$current->getAttribute('name')][] = $node->cloneNode(true); + } + } + } + } + + protected function mergeSuites(DOMDocument $dstXml): void + { + foreach ($this->suites as $suiteName => $tests) { + $resultNode = $dstXml->createElement("testsuite"); + $resultNode->setAttribute('name', $suiteName); + $data = [ + 'tests' => count($tests), + 'assertions' => 0, + 'failures' => 0, + 'errors' => 0, + 'time' => 0, + ]; + foreach ($tests as $test) { + $resultNode->appendChild($test); + + $data['assertions'] += (int)$test->getAttribute('assertions'); + $data['time'] = $this->summarizeTime + ? ((float)$test->getAttribute('time') + $data['time']) + : max($test->getAttribute('time'), $data['time']); + + $data['failures'] += $test->getElementsByTagName('failure')->length; + $data['errors'] += $test->getElementsByTagName('error')->length; + } + foreach ($data as $key => $value) { + $resultNode->setAttribute($key, (string)$value); + } + $dstXml->firstChild->appendChild($resultNode); + } + } +} diff --git a/src/SplitTestsByGroups.php b/src/SplitTestsByGroups.php deleted file mode 100644 index 76848a0..0000000 --- a/src/SplitTestsByGroups.php +++ /dev/null @@ -1,325 +0,0 @@ -task(SplitTestsByGroupsTask::class, $numGroups); - } - - /** - * @param $numGroups - * - * @return SplitTestFilesByGroupsTask - */ - protected function taskSplitTestFilesByGroups($numGroups) - { - return $this->task(SplitTestFilesByGroupsTask::class, $numGroups); - } -} - -abstract class TestsSplitter extends BaseTask -{ - protected $numGroups; - protected $projectRoot = '.'; - protected $testsFrom = 'tests'; - protected $saveTo = 'tests/_data/paracept_'; - protected $excludePath = 'vendor'; - - public function __construct($groups) - { - $this->numGroups = $groups; - } - - public function projectRoot($path) - { - $this->projectRoot = $path; - - return $this; - } - - public function testsFrom($path) - { - $this->testsFrom = $path; - - return $this; - } - - public function groupsTo($pattern) - { - $this->saveTo = $pattern; - - return $this; - } - - public function excludePath($path) - { - $this->excludePath = $path; - - return $this; - } - - /** - * @param $item - * @param array $items - * @param array $resolved - * @param array $unresolved - * - * @return array - */ - protected function resolveDependencies($item, array $items, array $resolved, array $unresolved) { - $unresolved[] = $item; - foreach ($items[$item] as $dep) { - if (!in_array($dep, $resolved)) { - if (!in_array($dep, $unresolved)) { - $unresolved[] = $dep; - list($resolved, $unresolved) = $this->resolveDependencies($dep, $items, $resolved, $unresolved); - } else { - throw new \RuntimeException("Circular dependency: $item -> $dep"); - } - } - } - // Add $item to $resolved if it's not already there - if (!in_array($item, $resolved)) { - $resolved[] = $item; - } - // Remove all occurrences of $item in $unresolved - while (($index = array_search($item, $unresolved)) !== false) { - unset($unresolved[$index]); - } - - return [$resolved, $unresolved]; - } - - /** - * Make sure that tests are in array are always with full path and name. - * - * @param array $testsListWithDependencies - * - * @return array - */ - protected function resolveDependenciesToFullNames(array $testsListWithDependencies){ - // make sure that dependencies are in array as full names - foreach ($testsListWithDependencies as $testName => $test) { - foreach ($test as $i => $dependency) { - - // sometimes it is written as class::method. - // for that reason we do trim in first case and replace from :: to one in second case - - - // just test name, that means that class name is the same, just different method name - if (strrpos($dependency, ':') === false) { - $testsListWithDependencies[$testName][$i] = trim(substr($testName,0,strrpos($testName, ':')), ':') . ':' . $dependency; - continue; - } - $dependency = str_replace('::', ':', $dependency); - // className:testName, that means we need to find proper test. - list($targetTestFileName, $targetTestMethodName) = explode(':', $dependency); - - // look for proper test in list of all tests. Test could be in different directory so we need to compare - // strings and if matched we just assign found test name - foreach (array_keys($testsListWithDependencies) as $arrayKey) { - if (strpos($arrayKey, $targetTestFileName . '.php:' . $targetTestMethodName) !== false) { - $testsListWithDependencies[$testName][$i] = $arrayKey; - continue 2; - } - } - throw new \RuntimeException('Dependency target test '.$dependency.' not found. Please make sure test exists and you are using full test name'); - } - } - return $testsListWithDependencies; - } -} - -/** - * Loads all tests into groups and saves them to groupfile according to pattern. - * - * ``` php - * taskSplitTestsByGroups(5) - * ->testsFrom('tests') - * ->groupsTo('tests/_log/paratest_') - * ->run(); - * ?> - * ``` - */ -class SplitTestsByGroupsTask extends TestsSplitter implements TaskInterface -{ - public function run() - { - if (!class_exists('\Codeception\Test\Loader')) { - throw new TaskException($this, 'This task requires Codeception to be loaded. Please require autoload.php of Codeception'); - } - $testLoader = new TestLoader(['path' => $this->testsFrom]); - $testLoader->loadTests($this->testsFrom); - $tests = $testLoader->getTests(); - - $this->printTaskInfo('Processing ' . count($tests) . ' tests'); - - $testsHaveAtLeastOneDependency = false; - - // test preloading (and fetching dependencies) requires dummy DI service. - $di = new \Codeception\Lib\Di(); - // gather test dependencies and deal with dataproviders - $testsListWithDependencies = []; - foreach ($tests as $test) { - if ($test instanceof DataProvider || $test instanceof DataProviderTestSuite) { - $test = current($test->tests()); - } - - // load dependencies for cest type. Unit tests dependencies are loaded automatically - if ($test instanceof \Codeception\Test\Cest) { - $test->getMetadata()->setServices(['di'=>$di]); - $test->preload(); - } - - if (method_exists($test, 'getMetadata')) { - $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = $test->getMetadata() - ->getDependencies(); - if ($testsHaveAtLeastOneDependency === false and count($test->getMetadata()->getDependencies()) != 0) { - $testsHaveAtLeastOneDependency = true; - } - - // little hack to get dependencies from phpunit test cases that are private. - } elseif ($test instanceof \PHPUnit\Framework\TestCase) { - $ref = new \ReflectionObject($test); - do { - try{ - $property = $ref->getProperty('dependencies'); - $property->setAccessible(true); - $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = $property->getValue($test); - - if ($testsHaveAtLeastOneDependency === false and count($property->getValue($test)) != 0) { - $testsHaveAtLeastOneDependency = true; - } - - } catch (\ReflectionException $e) { - // go up on level on inheritance chain. - } - } while($ref = $ref->getParentClass()); - - } else { - $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = []; - } - } - - if ($testsHaveAtLeastOneDependency) { - $this->printTaskInfo('Resolving test dependencies'); - - // make sure that dependencies are in array as full names - try { - $testsListWithDependencies = $this->resolveDependenciesToFullNames($testsListWithDependencies); - } catch (\Exception $e) { - $this->printTaskError($e->getMessage()); - return false; - } - - // resolved and ordered list of dependencies - $orderedListOfTests = []; - // helper array - $unresolved = []; - - // Resolve dependencies for each test - foreach (array_keys($testsListWithDependencies) as $test) { - try { - list ($orderedListOfTests, $unresolved) = $this->resolveDependencies($test, $testsListWithDependencies, $orderedListOfTests, $unresolved); - } catch (\Exception $e) { - $this->printTaskError($e->getMessage()); - return false; - } - } - - // if we don't have any dependencies just use keys from original list. - } else { - $orderedListOfTests = array_keys($testsListWithDependencies); - } - - // for even split, calculate number of tests in each group - $numberOfElementsInGroup = floor(count($orderedListOfTests) / $this->numGroups); - - $i = 1; - $groups = []; - - // split tests into files. - foreach ($orderedListOfTests as $test) { - // move to the next group ONLY if number of tests is equal or greater desired number of tests in group - // AND current test has no dependencies AKA: we are in different branch than previous test - if (!empty($groups[$i]) AND count($groups[$i]) >= $numberOfElementsInGroup AND $i <= ($this->numGroups-1) AND empty($testsListWithDependencies[$test])) { - $i++; - } - - $groups[$i][] = $test; - } - - // saving group files - foreach ($groups as $i => $tests) { - $filename = $this->saveTo . $i; - $this->printTaskInfo("Writing $filename"); - file_put_contents($filename, implode("\n", $tests)); - } - } -} - -/** - * Finds all test files and splits them by group. - * Unlike `SplitTestsByGroupsTask` does not load them into memory and not requires Codeception to be loaded. - * - * ``` php - * taskSplitTestFilesByGroups(5) - * ->testsFrom('tests/unit/Acme') - * ->codeceptionRoot('projects/tested') - * ->groupsTo('tests/_log/paratest_') - * ->run(); - * ?> - * ``` - */ -class SplitTestFilesByGroupsTask extends TestsSplitter implements TaskInterface -{ - public function run() - { - $files = Finder::create() - ->followLinks() - ->name('*Cept.php') - ->name('*Cest.php') - ->name('*Test.php') - ->name('*.feature') - ->path($this->testsFrom) - ->in($this->projectRoot ? $this->projectRoot : getcwd()) - ->exclude($this->excludePath); - - $i = 0; - $groups = []; - - $this->printTaskInfo('Processing ' . count($files) . ' files'); - // splitting tests by groups - /** @var SplFileInfo $file */ - foreach ($files as $file) { - $groups[($i % $this->numGroups) + 1][] = $file->getRelativePathname(); - $i++; - } - - // saving group files - foreach ($groups as $i => $tests) { - $filename = $this->saveTo . $i; - $this->printTaskInfo("Writing $filename"); - file_put_contents($filename, implode("\n", $tests)); - } - } -} diff --git a/src/Splitter/TestFileSplitterTask.php b/src/Splitter/TestFileSplitterTask.php new file mode 100644 index 0000000..b10ef34 --- /dev/null +++ b/src/Splitter/TestFileSplitterTask.php @@ -0,0 +1,81 @@ +taskSplitTestFilesByGroups(5) + * ->testsFrom('tests/unit/Acme') + * ->codeceptionRoot('projects/tested') + * ->groupsTo('tests/_log/paratest_') + * ->run(); + * ?> + * ``` + */ +class TestFileSplitterTask extends TestsSplitter +{ + private $pattern = ['*Cept.php', '*Cest.php', '*Test.php', '*.feature']; + + public function run() + { + $files = Finder::create() + ->followLinks() + ->name($this->getPattern()) + ->path($this->testsFrom) + ->in($this->projectRoot ?: getcwd()) + ->exclude($this->excludePath); + + $i = 0; + $groups = []; + + $this->printTaskInfo('Processing ' . count($files) . ' files'); + // splitting tests by groups + /** @var SplFileInfo $file */ + foreach ($files as $file) { + $groups[($i % $this->numGroups) + 1][] = $file->getRelativePathname(); + $i++; + } + + // saving group files + foreach ($groups as $i => $tests) { + $filename = $this->saveTo . $i; + $this->printTaskInfo("Writing $filename"); + file_put_contents($filename, implode("\n", $tests)); + } + } + + /** + * @param string[] $pattern + * @return TestFileSplitterTask + */ + public function setPattern(array $pattern): TestFileSplitterTask + { + $this->pattern = $pattern; + + return $this; + } + + /** + * @param string $pattern + * @return TestFileSplitterTask + */ + public function addPattern(string $pattern): TestFileSplitterTask + { + $this->pattern[] = $pattern; + + return $this; + } + + public function getPattern(): array + { + return $this->pattern; + } +} diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php new file mode 100644 index 0000000..f735b91 --- /dev/null +++ b/src/Splitter/TestsSplitter.php @@ -0,0 +1,145 @@ +numGroups = $groups; + } + + public function projectRoot(string $path): TestsSplitter + { + $this->projectRoot = $path; + + return $this; + } + + public function testsFrom(string $path): TestsSplitter + { + $this->testsFrom = $path; + + return $this; + } + + public function groupsTo(string $pattern): TestsSplitter + { + $this->saveTo = $pattern; + + return $this; + } + + public function excludePath(string $path): TestsSplitter + { + $this->excludePath = $path; + + return $this; + } + + /** + * @param $item + * @param array $items + * @param array $resolved + * @param array $unresolved + * + * @return array + */ + protected function resolveDependencies( + $item, + array $items, + array $resolved, + array $unresolved + ): array { + $unresolved[] = $item; + foreach ($items[$item] as $dep) { + if (!in_array($dep, $resolved, true)) { + if (!in_array($dep, $unresolved, true)) { + $unresolved[] = $dep; + [$resolved, $unresolved] = + $this->resolveDependencies($dep, $items, $resolved, $unresolved); + } else { + throw new \RuntimeException("Circular dependency: $item -> $dep"); + } + } + } + // Add $item to $resolved if it's not already there + if (!in_array($item, $resolved, true)) { + $resolved[] = $item; + } + // Remove all occurrences of $item in $unresolved + while (($index = array_search($item, $unresolved, true)) !== false) { + unset($unresolved[$index]); + } + + return [$resolved, $unresolved]; + } + + /** + * Make sure that tests are in array are always with full path and name. + * + * @param array $testsListWithDependencies + * + * @return array + */ + protected function resolveDependenciesToFullNames(array $testsListWithDependencies): array + { + // make sure that dependencies are in array as full names + foreach ($testsListWithDependencies as $testName => $test) { + foreach ($test as $i => $dependency) { + if (is_a($dependency, '\PHPUnit\Framework\ExecutionOrderDependency')) { + $dependency = $dependency->getTarget(); + } + // sometimes it is written as class::method. + // for that reason we do trim in first case and replace from :: to one in second case + // just test name, that means that class name is the same, just different method name + if (strrpos($dependency, ':') === false) { + $testsListWithDependencies[$testName][$i] = trim( + substr($testName, 0, strrpos($testName, ':')), + ':' + ) . ':' . $dependency; + continue; + } + $dependency = str_replace('::', ':', $dependency); + // className:testName, that means we need to find proper test. + [$targetTestFileName, $targetTestMethodName] = explode(':', $dependency); + + // look for proper test in list of all tests. Test could be in different directory + // so we need to compare strings and if matched we just assign found test name + foreach (array_keys($testsListWithDependencies) as $arrayKey) { + if (str_contains( + $arrayKey, + $targetTestFileName . '.php:' . $targetTestMethodName + )) { + $testsListWithDependencies[$testName][$i] = $arrayKey; + continue 2; + } + } + throw new \RuntimeException( + 'Dependency target test ' . $dependency . ' not found.' + . 'Please make sure test exists and you are using full test name' + ); + } + } + + return $testsListWithDependencies; + } +} diff --git a/src/Splitter/TestsSplitterTask.php b/src/Splitter/TestsSplitterTask.php new file mode 100644 index 0000000..de03d7a --- /dev/null +++ b/src/Splitter/TestsSplitterTask.php @@ -0,0 +1,179 @@ +taskSplitTestsByGroups(5) + * ->testsFrom('tests') + * ->groupsTo('tests/_log/paratest_') + * ->run(); + * ?> + * ``` + */ +class TestsSplitterTask extends TestsSplitter +{ + public function run() + { + if (!$this->doCodeceptLoaderExists()) { + throw new TaskException( + $this, + 'This task requires Codeception to be loaded. Please require autoload.php of Codeception' + ); + } + $tests = $this->loadTests(); + + $this->printTaskInfo('Processing ' . count($tests) . ' tests'); + + $testsHaveAtLeastOneDependency = false; + + // test preloading (and fetching dependencies) requires dummy DI service. + $di = new Di(); + // gather test dependencies and deal with dataproviders + $testsListWithDependencies = []; + foreach ($tests as $test) { + if ($test instanceof DataProviderTestSuite) { + $test = current($test->tests()); + } + + // load dependencies for cest type. Unit tests dependencies are loaded automatically + if ($test instanceof Cest) { + $test->getMetadata()->setServices(['di' => $di]); + $test->preload(); + } + + if (method_exists($test, 'getMetadata')) { + $dependencies = $test->getMetadata()->getDependencies(); + if ($testsHaveAtLeastOneDependency === false && count($dependencies) !== 0) { + $testsHaveAtLeastOneDependency = true; + $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = $dependencies; + } + + // little hack to get dependencies from phpunit test cases that are private. + } elseif ($test instanceof TestCase) { + $ref = new ReflectionObject($test); + do { + try { + $property = $ref->getProperty('dependencies'); + $property->setAccessible(true); + $dependencies = $property->getValue($test); + if ($testsHaveAtLeastOneDependency === false && count($dependencies) !== 0) { + $testsHaveAtLeastOneDependency = true; + $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = $dependencies; + } else { + $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = []; + } + } catch (\ReflectionException $e) { + // go up on level on inheritance chain. + } + } while ($ref = $ref->getParentClass()); + } else { + $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = []; + } + } + + if ($testsHaveAtLeastOneDependency) { + $this->printTaskInfo('Resolving test dependencies'); + // make sure that dependencies are in array as full names + try { + $testsListWithDependencies = $this->resolveDependenciesToFullNames( + $testsListWithDependencies + ); + } catch (Exception $e) { + $this->printTaskError($e->getMessage()); + return false; + } + // resolved and ordered list of dependencies + $orderedListOfTests = []; + // helper array + $unresolved = []; + + // Resolve dependencies for each test + foreach (array_keys($testsListWithDependencies) as $test) { + try { + [$orderedListOfTests, $unresolved] = $this->resolveDependencies( + $test, + $testsListWithDependencies, + $orderedListOfTests, + $unresolved + ); + } catch (Exception $e) { + $this->printTaskError($e->getMessage()); + return false; + } + } + // if we don't have any dependencies just use keys from original list. + } else { + $orderedListOfTests = array_keys($testsListWithDependencies); + } + + // for even split, calculate number of tests in each group + $numberOfElementsInGroup = floor(count($orderedListOfTests) / $this->numGroups); + $i = 1; + $groups = []; + + // split tests into files. + foreach ($orderedListOfTests as $test) { + // move to the next group ONLY if number of tests is equal or greater desired number of tests in group + // AND current test has no dependencies AKA: we are in different branch than previous test + if ( + !empty($groups[$i]) + && empty($testsListWithDependencies[$test]) + && $i <= ($this->numGroups - 1) + && count($groups[$i]) >= $numberOfElementsInGroup + ) { + $i++; + } + + $groups[$i][] = $test; + } + + // saving group files + foreach ($groups as $i => $tests) { + $filename = $this->saveTo . $i; + $this->printTaskInfo("Writing $filename"); + file_put_contents($filename, implode("\n", $tests)); + } + + return true; + } + + /** + * @return bool + */ + protected function doCodeceptLoaderExists(): bool + { + return class_exists(TestLoader::class); + } + + /** + * @return TestLoader + */ + protected function getTestLoader(): TestLoader + { + return new TestLoader(['path' => $this->testsFrom]); + } + + /** + * @return array + */ + protected function loadTests(): array + { + $testLoader = $this->getTestLoader(); + $testLoader->loadTests($this->testsFrom); + + return $testLoader->getTests(); + } +} diff --git a/src/Splitter/TestsSplitterTrait.php b/src/Splitter/TestsSplitterTrait.php new file mode 100644 index 0000000..354954d --- /dev/null +++ b/src/Splitter/TestsSplitterTrait.php @@ -0,0 +1,27 @@ +task(TestsSplitterTask::class, $numGroups); + } + + /** + * @param $numGroups + * + * @return TestFileSplitterTask + */ + protected function taskSplitTestFilesByGroups($numGroups): TestFileSplitterTask + { + return $this->task(TestFileSplitterTask::class, $numGroups); + } +} diff --git a/tests/MergeJUnitReportsTest.php b/tests/MergeJUnitReportsTest.php deleted file mode 100644 index 8094f69..0000000 --- a/tests/MergeJUnitReportsTest.php +++ /dev/null @@ -1,48 +0,0 @@ -setLogger(new \Consolidation\Log\Logger(new \Symfony\Component\Console\Output\NullOutput())); - $task->from('tests/fixtures/result1.xml') - ->from('tests/fixtures/result2.xml') - ->into('tests/result/merged.xml') - ->run(); - - $this->assertFileExists('tests/result/merged.xml'); - $xml = file_get_contents('tests/result/merged.xml'); - $this->assertContains('assertContains('assertContains('assertContains('setLogger(new \Consolidation\Log\Logger(new \Symfony\Component\Console\Output\NullOutput())); - $task->from('tests/fixtures/result1.xml') - ->from('tests/fixtures/result2.xml') - ->into('tests/result/merged.xml') - ->mergeRewrite() - ->run(); - - $task->mergeRewrite()->run(); - $this->assertFileExists('tests/result/merged.xml'); - $xml = file_get_contents('tests/result/merged.xml'); - $this->assertContains('assertContains('assertContains('assertContains('setLogger(new Logger(new NullOutput())); + $task->from(TEST_PATH . '/fixtures/result1.xml') + ->from(TEST_PATH . '/fixtures/result2.xml') + ->into(TEST_PATH . '/result/merged.xml') + ->run(); + + $this->assertFileExists(TEST_PATH . '/result/merged.xml'); + $xml = file_get_contents(TEST_PATH . '/result/merged.xml'); + $this->assertStringContainsString( + 'assertStringContainsString( + 'assertStringContainsString( + 'assertStringContainsString( + 'setLogger(new Logger(new NullOutput())); + $task->from(TEST_PATH . '/fixtures/result1.xml') + ->from(TEST_PATH . '/fixtures/result2.xml') + ->into(TEST_PATH . '/result/merged.xml') + ->run(); + $this->assertFileExists(TEST_PATH . '/result/merged.xml'); + + $task->mergeRewrite()->run(); + $this->assertFileExists(TEST_PATH . '/result/merged.xml'); + $xml = file_get_contents(TEST_PATH . '/result/merged.xml'); + $this->assertStringContainsString('assertStringContainsString('assertStringContainsString('assertStringContainsString('setLogger(new \Consolidation\Log\Logger(new \Symfony\Component\Console\Output\NullOutput())); - $task->testsFrom('vendor/codeception/base/tests/unit/Codeception/Command') - ->groupsTo('tests/result/group_') - ->run(); - - for ($i = 1; $i <= 10; $i++) { - $this->assertFileExists("tests/result/group_$i"); - } - $this->assertFileNotExists("tests/result/group_11"); - } - - public function testSplitFilesByGroups() - { - $task = new Codeception\Task\SplitTestsByGroupsTask(5); - $task->setLogger(new \Consolidation\Log\Logger(new \Symfony\Component\Console\Output\NullOutput())); - $task->testsFrom('vendor/codeception/base/tests/unit/Codeception/Command') - ->projectRoot('vendor/codeception/base/') - ->groupsTo('tests/result/group_') - ->run(); - - for ($i = 1; $i <= 5; $i++) { - $this->assertFileExists("tests/result/group_$i"); - } - } - - /** - * Test Circular dependency protection - * - * @throws \Robo\Exception\TaskException - */ - public function testCircularDependencyDetectionAndHandling(){ - $task = new Codeception\Task\SplitTestsByGroupsTask(5); - $output = new \Symfony\Component\Console\Output\BufferedOutput(); - $task->setLogger(new \Consolidation\Log\Logger($output)); - $task->testsFrom('tests/fixtures/DependencyResolutionExampleTests2') - ->projectRoot('vendor/codeception/base/') - ->groupsTo('tests/result/group_') - ->run(); - - $d = $output->fetch(); - - self::assertContains('Circular dependency:', $d); - - // make sure that no files were generated. - $this->assertEmpty(glob("tests/result/group_*")); - } - - /** - * Test dependency resolving - * - * @throws \Robo\Exception\TaskException - */ - public function testDependencyResolving(){ - - $task = new Codeception\Task\SplitTestsByGroupsTask(2); - $output = new \Symfony\Component\Console\Output\BufferedOutput(); - $task->setLogger(new \Consolidation\Log\Logger($output)); - - $task->testsFrom('tests/fixtures/DependencyResolutionExampleTests') - ->projectRoot('vendor/codeception/base/') - ->groupsTo('tests/result/group_') - ->run(); - for ($i = 1; $i <= 2; $i++) { - $this->assertFileExists("tests/result/group_$i"); - } - - // because path might be different on every system we need only last part of the path. - $firstFile = file_get_contents("tests/result/group_1"); - $lines = []; - foreach(explode("\n", $firstFile) as $line) { - $lines[] = substr($line, -22); - } - // correct order of test execution is preserved - self::assertSame(['Example1Test.php:testB', 'Example1Test.php:testA', 'Example1Test.php:testC'], $lines); - - // check second file. - $secondFile = file_get_contents("tests/result/group_2"); - $lines = []; - foreach(explode("\n", $secondFile) as $line) { - $lines[] = substr($line, -22); - } - // correct order of test execution is preserved - self::assertSame(['Example2Test.php:testE', 'Example2Test.php:testD', 'Example3Test.php:testF', 'Example3Test.php:testG'], $lines); - } - - public function setUp() - { - @mkdir('tests/result'); - - // remove all files even from bad runs. - foreach(glob('tests/result/group_*') as $file) { - $file = new SplFileInfo($file); - if (is_file($file)) { - @unlink($file); - } - } - } - - - -} diff --git a/tests/Splitter/TestFileSplitterTaskTest.php b/tests/Splitter/TestFileSplitterTaskTest.php new file mode 100644 index 0000000..4003509 --- /dev/null +++ b/tests/Splitter/TestFileSplitterTaskTest.php @@ -0,0 +1,107 @@ + 1, + 'from' => 'tests/fixtures/DependencyResolutionExampleTests/', + 'to' => TEST_PATH . '/result/group_', + 'expected' => 1, + ], + [ + 'groups' => 2, + 'from' => 'tests/fixtures/DependencyResolutionExampleTests/', + 'to' => TEST_PATH . '/result/group_', + 'expected' => 2, + ], + [ + 'groups' => 3, + 'from' => 'tests/fixtures/DependencyResolutionExampleTests/', + 'to' => TEST_PATH . '/result/group_', + 'expected' => 3, + ], + [ + 'groups' => 4, + 'from' => 'tests/fixtures/DependencyResolutionExampleTests/', + 'to' => TEST_PATH . '/result/group_', + 'expected' => 3, + ], + [ + 'groups' => 4, + 'from' => 'tests/fixtures/DependencyResolutionExampleTests', + 'to' => TEST_PATH . '/result/group_', + 'expected' => 4, + ], + ]; + } + + /** + * @covers ::run + * @dataProvider providerTestFilesCanBeSplit + */ + public function testFilesCanBeSplitted( + int $groups, + string $from, + string $groupTo, + int $expected + ): void { + $task = new TestFileSplitterTask($groups); + $task->setLogger(new Logger(new NullOutput())); + $task->testsFrom($from) + ->groupsTo($groupTo) + ->run(); + + for ($i = 1; $i <= $expected; $i++) { + $this->assertFileExists($groupTo . $i); + } + $this->assertFileDoesNotExist($groupTo . ($expected + 1)); + } + + /** + * @covers ::run + */ + public function testPatternNotFound(): void + { + $task = new TestFileSplitterTask(2); + $task->setLogger(new Logger(new NullOutput())); + $task + ->setPattern(['*Cest.php']) + ->testsFrom('tests/fixtures/DependencyResolutionExampleTests/') + ->groupsTo(TEST_PATH . '/result/group_') + ->run(); + + $this->assertFileDoesNotExist(TEST_PATH . '/result/group_1'); + $this->assertFileDoesNotExist(TEST_PATH . '/result/group_2'); + } + + protected function tearDown(): void + { + parent::tearDown(); // TODO: Change the autogenerated stub + $finder = Finder::create() + ->files() + ->name('group_*'); + + foreach ($finder->in(TEST_PATH . '/result') as $file) { + unlink($file->getPathname()); + } + } +} diff --git a/tests/Splitter/TestsSplitterTaskTest.php b/tests/Splitter/TestsSplitterTaskTest.php new file mode 100644 index 0000000..1c9a570 --- /dev/null +++ b/tests/Splitter/TestsSplitterTaskTest.php @@ -0,0 +1,98 @@ +getMockBuilder(TestsSplitterTask::class) + ->disableOriginalConstructor() + ->onlyMethods(['doCodeceptLoaderExists']) + ->getMock(); + + $service + ->method('doCodeceptLoaderExists') + ->willReturn(false); + + $this->expectException(TaskException::class); + $this->expectErrorMessage( + 'This task requires Codeception to be loaded.' + . ' Please require autoload.php of Codeception' + ); + $service->run(); + } + + public function providerTestLoadTestsWithDifferentPatterns(): array + { + return [ + [ + 'groups' => 1, + 'expectedFiles' => 7, + ], + [ + 'groups' => 2, + 'expectedFiles' => 7, + ], + [ + 'groups' => 7, + 'expectedFiles' => 7, + ], + ]; + } + + /** + * @covers ::run + * @dataProvider providerTestLoadTestsWithDifferentPatterns + * @param int $groups + * @param int $expectedFiles + */ + public function testLoadTests( + int $groups, + int $expectedFiles + ): void { + $task = new TestsSplitterTask($groups); + $task->setLogger(new Logger(new NullOutput())); + $task->testsFrom(TEST_PATH . '/fixtures/'); + $groupTo = TEST_PATH . '/result/group_'; + $task->groupsTo($groupTo); + $task->run(); + + $files = Finder::create() + ->files() + ->in(TEST_PATH . '/result/') + ->name('group_*'); + + $this->assertCount($groups, $files->getIterator()); + + for ($i = 1; $i <= $groups; $i++) { + $this->assertFileExists($groupTo . $i); + } + } + + protected function tearDown(): void + { + parent::tearDown(); // TODO: Change the autogenerated stub + $finder = Finder::create() + ->files() + ->name('group_*'); + + foreach ($finder->in(TEST_PATH . '/result') as $file) { + unlink($file->getPathname()); + } + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 018e3ad..195a328 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,9 +1,20 @@ add('logger', new \Consolidation\Log\Logger(new \Symfony\Component\Console\Output\NullOutput)); + +require_once dirname(__DIR__) . '/vendor/autoload.php'; +require_once dirname(__DIR__) . '/vendor/codeception/codeception/autoload.php'; + +use Robo\Robo; + +const TEST_PATH = __DIR__; + +if ( + !is_dir($concurrentDirectory = TEST_PATH . '/result/') + && !mkdir($concurrentDirectory) + && !is_dir($concurrentDirectory) +) { + throw new \RuntimeException( + sprintf('Directory "%s" was not created', $concurrentDirectory) + ); +} + +Robo::createContainer(); diff --git a/tests/fixtures/Cests/DirA/ExampleACest.php b/tests/fixtures/Cests/DirA/ExampleACest.php new file mode 100644 index 0000000..4b87bb0 --- /dev/null +++ b/tests/fixtures/Cests/DirA/ExampleACest.php @@ -0,0 +1,13 @@ +assertTrue(false); + } +} diff --git a/tests/fixtures/Cests/DirB/ExampleACest.php b/tests/fixtures/Cests/DirB/ExampleACest.php new file mode 100644 index 0000000..801e222 --- /dev/null +++ b/tests/fixtures/Cests/DirB/ExampleACest.php @@ -0,0 +1,13 @@ +assertTrue(false); + } +} diff --git a/tests/fixtures/Cests/DirC/ExampleACest.php b/tests/fixtures/Cests/DirC/ExampleACest.php new file mode 100644 index 0000000..6400ef1 --- /dev/null +++ b/tests/fixtures/Cests/DirC/ExampleACest.php @@ -0,0 +1,13 @@ +assertTrue(false); + } +} diff --git a/tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php b/tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php index f8d2c1c..b67c416 100644 --- a/tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php +++ b/tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php @@ -1,12 +1,16 @@ markTestSkipped('Just a test ... test'); } @@ -14,7 +18,8 @@ public function testA() { * @depends testA * @group example */ - public function testB(){ + public function testB() + { $this->markTestSkipped('Just a test ... test'); } } diff --git a/tests/fixtures/result1.xml b/tests/fixtures/result1.xml index 57fa115..688446c 100644 --- a/tests/fixtures/result1.xml +++ b/tests/fixtures/result1.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + diff --git a/tests/fixtures/result2.xml b/tests/fixtures/result2.xml index 374a865..349229f 100644 --- a/tests/fixtures/result2.xml +++ b/tests/fixtures/result2.xml @@ -1,31 +1,31 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + From d5087641739a8d672efd4442c1e95b3deed77adc Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Wed, 14 Jul 2021 02:06:17 +0300 Subject: [PATCH 04/52] Update php.yml --- .github/workflows/php.yml | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index d361772..0491537 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -7,12 +7,25 @@ on: branches: [ master ] jobs: - build: - - runs-on: ubuntu-latest - + test: + runs-on: ${{ matrix.operating-system }} + strategy: + matrix: + operating-system: ['ubuntu-latest', 'windows-latest', 'macos-latest'] + php-versions: ['7.3', '7.4'] + phpunit-versions: ['latest'] + include: + - operating-system: 'ubuntu-latest' + php-versions: '7.2' + phpunit-versions: '8.5.13' steps: - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} - name: Validate composer.json and composer.lock run: composer validate --strict From a463568f4f2e74e71797fbfd753d9595d7e77a08 Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Wed, 14 Jul 2021 02:09:10 +0300 Subject: [PATCH 05/52] Update php.yml --- .github/workflows/php.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 0491537..328882d 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -11,13 +11,9 @@ jobs: runs-on: ${{ matrix.operating-system }} strategy: matrix: - operating-system: ['ubuntu-latest', 'windows-latest', 'macos-latest'] - php-versions: ['7.3', '7.4'] + operating-system: ['ubuntu-latest'] + php-versions: ['7.3', '7.4', '8.0'] phpunit-versions: ['latest'] - include: - - operating-system: 'ubuntu-latest' - php-versions: '7.2' - phpunit-versions: '8.5.13' steps: - name: Checkout uses: actions/checkout@v2 From 0cb88104d4ac13833be0d6849e79bd2b94dd7ce9 Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Wed, 14 Jul 2021 02:14:43 +0300 Subject: [PATCH 06/52] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 33e6eaa..fcbdec0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ robo-paracept ============= -[![Build Status](https://travis-ci.org/Codeception/robo-paracept.svg?branch=master)](https://travis-ci.org/Codeception/robo-paracept) +[![PHP Composer](https://github.com/Codeception/robo-paracept/actions/workflows/php.yml/badge.svg)](https://github.com/Codeception/robo-paracept/actions/workflows/php.yml) [![Latest Stable Version](https://poser.pugx.org/codeception/robo-paracept/version)](https://packagist.org/packages/codeception/robo-paracept) [![Total Downloads](https://poser.pugx.org/codeception/robo-paracept/downloads)](https://packagist.org/packages/codeception/robo-paracept) [![License](https://poser.pugx.org/codeception/robo-paracept/license)](https://packagist.org/packages/codeception/robo-paracept) From 6f4d4aaeedc85e6dd9ec767ae8f5b12cead3ebb2 Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Wed, 14 Jul 2021 02:15:05 +0300 Subject: [PATCH 07/52] Update php.yml --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 328882d..816558a 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -1,4 +1,4 @@ -name: PHP Composer +name: Unit Tests on: push: From a7b3e9c1c5be2b3c65e9adf1ba1a658b7560902a Mon Sep 17 00:00:00 2001 From: KJunker Date: Sun, 18 Jul 2021 23:15:36 +0200 Subject: [PATCH 08/52] Feature/filter split tests by groups (#60) * Follow links when splitting test files This seems appropriate to me since it matches the default codeception behaviour. This was motivated because I was surprised that tests were missing after splitting when codeception would have included them. * Split Task for newer Phpunit **Context** Phpunit has restructure its classes with namespace starting from version 6 and this breaks the `DataProvider` test splitting. This update will allow it to work for both old and new Phpunit. * Be aware of test dependency during split (#46) * Be aware of test dependency during split * Test fixes New tests Test fixtures * Travis fixes * add verbose to see why tests fail * Build fix * still fails :/ * Test if correct code is executed. * Test if correct code is executed. * Test if correct code is executed. * Test if correct code is executed. * Test if correct code is executed. * Test if correct code is executed. * dev option * dev option * test what file is used * test what file is used * debug * debug * debug * debug * debug * temp disable some tests * test * test * test * test * test * test * test * remove debug * restore minimal version of codeception dependency * restore minimal version of codeception dependency with php 7.0 * fix test cases * Split ReportMerger into single Classes * Split TestSplitter into single Classes * Updating composer * fixing bootstrap * Moved Files from src to src/Splitter * Created Test for TestFileSplitterTask * added TEST_PATH const * updated composer autoload-dev * updated composer autoload-dev fixed php version fixed .travis.yml php version * Fixed TestFileSplitterTaskTest.php because of deprecated methods * Tests for TestsSplitterTask and refactoring * CodeStyle and TypeError fix, Test for XmlReportMergerTask * deleted outdated files * refactoring fixtures * Correction of Tests Path * Fixing configs of composer and phpunit Tests * added 3 tests for Splitting * Updated TestsSplitter.php because of newer PHPUnit Version * fixed return type * Splitting Tests with newer PHPUnit Version * added TearDown to clear results * updated composer.json, remove explicit using of ExecutionOrderDependency (comes with PHPUnit 9.3.0) * Create php.yml * updated README.md * updated php version on composer and before_script in .travis.yml * updated composer.lock with new php Version * Save the state * fixing namespace tests * added correct namespace * First Test of run with the filter of @group annotation * extract methods to abstract class * Remove extra Task * Created Filter Interface with the neccessary methods, DefaultFilter.php for every use case * Created GroupFilter and Tests to Filter tests by group annotations * Change the signature of the Interface so it can be used also with other array values like string etc * Check if the Test is an instance of expected SelfDescribing class * Updated the FilterMethods in the trait so it can also be used in the TestFileSplitterTask * Filter the Tests after they had be loading * Added Filtering possibility to the TestFileSplitterTask.php, Updated Comment at DefaultFilter.php * Fixing filter * removing travis * added scripts to composer.json and use it in php.yml, CS default PSR12 * Fixing CodeStyle Co-authored-by: Michael Bodnarchuk Co-authored-by: hirowatari Co-authored-by: Taufek Johar Co-authored-by: Grzegorz Drozd <1885137+GrzegorzDrozd@users.noreply.github.com> --- .github/workflows/php.yml | 12 +- .gitignore | 1 + .travis.yml | 17 --- composer.json | 8 +- src/Filter/DefaultFilter.php | 32 ++++ src/Filter/Filter.php | 24 +++ src/Filter/GroupFilter.php | 152 +++++++++++++++++++ src/Merger/HtmlReportMerger.php | 63 ++++---- src/Merger/ReportMerger.php | 3 +- src/Merger/ReportMergerTaskInterface.php | 7 +- src/Merger/XmlReportMergerTask.php | 5 +- src/Splitter/TestFileSplitterTask.php | 9 +- src/Splitter/TestsSplitter.php | 42 +++++- src/Splitter/TestsSplitterTask.php | 30 +++- src/Splitter/TestsSplitterTrait.php | 11 +- tests/Filter/GroupFilterTest.php | 167 +++++++++++++++++++++ tests/fixtures/Cests/DirA/ExampleACest.php | 14 +- tests/fixtures/Cests/DirB/ExampleACest.php | 13 +- tests/fixtures/Cests/DirC/ExampleACest.php | 13 +- tests/fixtures/Unit/ExampleATest.php | 31 ++++ tests/fixtures/Unit/ExampleBTest.php | 31 ++++ 21 files changed, 593 insertions(+), 92 deletions(-) delete mode 100644 .travis.yml create mode 100644 src/Filter/DefaultFilter.php create mode 100644 src/Filter/Filter.php create mode 100644 src/Filter/GroupFilter.php create mode 100644 tests/Filter/GroupFilterTest.php create mode 100644 tests/fixtures/Unit/ExampleATest.php create mode 100644 tests/fixtures/Unit/ExampleBTest.php diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 816558a..8687cd6 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -37,11 +37,13 @@ jobs: - name: Install dependencies run: composer install --prefer-dist --no-progress - - - # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" - # Docs: https://getcomposer.org/doc/articles/scripts.md - name: Run test suite - run: composer -v exec phpunit -- tests --bootstrap tests/bootstrap.php --exclude-group example --stderr -v --debug + run: composer unit + + - name: Run lint Tests + run: composer lint + + - name: Run CodeStyle Check + run: composer codestyle diff --git a/.gitignore b/.gitignore index 5ed49e7..e4ef782 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ vendor .idea /.php-cs-fixer.cache /.phpunit.result.cache +/.phplint-cache diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e2aee1b..0000000 --- a/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: php - -cache: - directories: - - vendor - - $HOME/.composer/cache - -php: - - 7.3 - - 7.4 - - 8.0 - -before_script: - - composer install - -script: - - composer -v exec phpunit -- tests --bootstrap tests/bootstrap.php --exclude-group example --stderr -v --debug diff --git a/composer.json b/composer.json index 16fb33f..9d329db 100644 --- a/composer.json +++ b/composer.json @@ -22,8 +22,7 @@ }, "autoload-dev": { "psr-4": { - "Tests\\Codeception\\Task\\": "tests/", - "Tests\\Classes\\": "tests/fixtures/Cests" + "Tests\\Codeception\\Task\\": "tests/" } }, "require-dev": { @@ -34,5 +33,10 @@ "friendsofphp/php-cs-fixer": "^3.0.0", "phpunit/phpunit": ">=9.0", "codeception/phpunit-wrapper": "^9.0.6" + }, + "scripts": { + "unit": "vendor/bin/phpunit --bootstrap tests/bootstrap.php tests/ --exclude-group example --stderr -v --debug", + "lint": "vendor/bin/phplint -v ./ --exclude=vendor", + "codestyle": "vendor/bin/phpcs --standard=PSR12 ./src" } } diff --git a/src/Filter/DefaultFilter.php b/src/Filter/DefaultFilter.php new file mode 100644 index 0000000..d3a3b31 --- /dev/null +++ b/src/Filter/DefaultFilter.php @@ -0,0 +1,32 @@ +tests = $tests; + } + + /** + * @inheritDoc + */ + public function filter(): array + { + return $this->tests; + } +} diff --git a/src/Filter/Filter.php b/src/Filter/Filter.php new file mode 100644 index 0000000..573f455 --- /dev/null +++ b/src/Filter/Filter.php @@ -0,0 +1,24 @@ +resetIncludedGroups(); + $this->resetExcludedGroups(); + } + + public function resetIncludedGroups(): void + { + $this->includedGroups = []; + } + + public function resetExcludedGroups(): void + { + $this->excludedGroups = []; + } + + /** + * @return SelfDescribing[] + */ + public function getTests(): array + { + return $this->tests; + } + + /** + * Adds a group name to the excluded array + * @param string $group + * @return $this + */ + public function groupExcluded(string $group): self + { + if (in_array($group, $this->getIncludedGroups(), true)) { + throw new InvalidArgumentException( + sprintf( + 'You can mark group "%s" only as included OR excluded.', + $group + ) + ); + } + + if (!in_array($group, $this->getExcludedGroups(), true)) { + $this->excludedGroups[] = $group; + } + + return $this; + } + + /** + * Adds a group name to the included array + * @param string $group + * @return $this + */ + public function groupIncluded(string $group): self + { + if (in_array($group, $this->getExcludedGroups(), true)) { + throw new InvalidArgumentException( + sprintf( + 'You can mark group "%s" only as included OR excluded.', + $group + ) + ); + } + + if (!in_array($group, $this->getIncludedGroups(), true)) { + $this->includedGroups[] = $group; + } + + return $this; + } + + /** + * @return array[] + */ + public function getExcludedGroups(): array + { + return $this->excludedGroups; + } + + /** + * @return string[] + */ + public function getIncludedGroups(): array + { + return $this->includedGroups; + } + + /** + * @param SelfDescribing[] $tests + */ + public function setTests(array $tests): void + { + $this->tests = $tests; + } + + /** + * Filter the tests by the given included and excluded @group annotations + */ + public function filter(): array + { + $testsByGroups = []; + foreach ($this->getTests() as $test) { + if (!($test instanceof SelfDescribing)) { + throw new InvalidArgumentException( + 'Tests must be an instance of ' . SelfDescribing::class + ); + } + [$class, $method] = explode(':', TestDescriptor::getTestSignature($test)); + $annotations = Annotation::forMethod($class, $method)->fetchAll('group'); + if ( + !empty($this->getExcludedGroups()) + && [] === array_diff($this->getExcludedGroups(), $annotations) + ) { + continue; + } + if ( + !empty($this->getIncludedGroups()) + && [] !== array_diff($this->getIncludedGroups(), $annotations) + ) { + continue; + } + $testsByGroups[] = $test; + } + + return $testsByGroups; + } +} diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php index ceac889..a5254bc 100644 --- a/src/Merger/HtmlReportMerger.php +++ b/src/Merger/HtmlReportMerger.php @@ -1,8 +1,12 @@ printTaskInfo("Merging HTML reports into {$this->dst}"); //read first source file as main - $dstHTML = new \DOMDocument(); + $dstHTML = new DOMDocument(); $dstHTML->loadHTMLFile($this->src[0], LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); //main node for all table rows $table = (new \DOMXPath($dstHTML))->query("//table")->item(0); //prepare reference nodes for envs - $refnodes = (new \DOMXPath($dstHTML))->query("//div[@class='layout']/table/tr[not(@class)]"); + $refnodes = (new DOMXPath($dstHTML))->query("//div[@class='layout']/table/tr[not(@class)]"); - for ($k=1, $kMax = count($this->src);$k< $kMax;$k++) { - $srcHTML = new \DOMDocument(); + for ($k = 1, $kMax = count($this->src); $k < $kMax; $k++) { + $srcHTML = new DOMDocument(); $src = $this->src[$k]; $srcHTML->loadHTMLFile($src, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - $suiteNodes = (new \DOMXPath($srcHTML))->query("//div[@class='layout']/table/tr"); - $j=0; + $suiteNodes = (new DOMXPath($srcHTML))->query("//div[@class='layout']/table/tr"); + $j = 0; foreach ($suiteNodes as $suiteNode) { if ($suiteNode->getAttribute('class') == '') { //move to next reference node $j++; - if ($j > $refnodes->length-1) { + if ($j > $refnodes->length - 1) { break; } continue; @@ -103,7 +107,7 @@ public function run() /** * This function counts all types of tests' scenarios and writes in class members - * @param $dstFile \DOMDocument - destination file + * @param $dstFile DOMDocument - destination file */ private function countSummary($dstFile) { @@ -129,11 +133,11 @@ private function countSummary($dstFile) /** * This function updates values in Summary block for each type of scenarios - * @param $dstFile \DOMDocument - destination file + * @param DOMDocument $dstFile - destination file */ - private function updateSummaryTable($dstFile) + private function updateSummaryTable(DOMDocument $dstFile) { - $dstFile = new \DOMXPath($dstFile); + $dstFile = new DOMXPath($dstFile); $pathFor = function ($type) { return "//div[@id='stepContainerSummary']//td[@class='$type']"; }; @@ -145,10 +149,10 @@ private function updateSummaryTable($dstFile) /** * This function moves Summary block in the bottom of result report - * @param $dstFile \DOMDocument - destination file - * @param $node \DOMNode - parent node of Summary table + * @param $dstFile DOMDocument - destination file + * @param $node DOMNode - parent node of Summary table */ - private function moveSummaryTable($dstFile, $node) + private function moveSummaryTable(DOMDocument $dstFile, DOMNode $node) { $summaryTable = (new \DOMXPath($dstFile))->query("//div[@id='stepContainerSummary']") ->item(0)->parentNode->parentNode; @@ -156,34 +160,35 @@ private function moveSummaryTable($dstFile, $node) } /** - * This function updates values in Toolbar block for each type of scenarios (blue block on the left side of the report) - * @param $dstFile \DOMDocument - destination file + * This function updates values in Toolbar block for each type of scenarios + * (blue block on the left side of the report) + * @param DOMDocument $dstFile - destination file */ - private function updateToolbarTable($dstFile) + private function updateToolbarTable(DOMDocument $dstFile) { $dstFile = new \DOMXPath($dstFile); - $pathFor = function ($type) { + $pathFor = static function (string $type): string { return "//ul[@id='toolbar-filter']//a[@title='$type']"; }; - $dstFile->query($pathFor('Successful'))->item(0)->nodeValue = '✔ '.$this->countSuccess; - $dstFile->query($pathFor('Failed'))->item(0)->nodeValue = '✗ '.$this->countFailed; - $dstFile->query($pathFor('Skipped'))->item(0)->nodeValue = 'S '.$this->countSkipped; - $dstFile->query($pathFor('Incomplete'))->item(0)->nodeValue= 'I '.$this->countIncomplete; + $dstFile->query($pathFor('Successful'))->item(0)->nodeValue = '✔ ' . $this->countSuccess; + $dstFile->query($pathFor('Failed'))->item(0)->nodeValue = '✗ ' . $this->countFailed; + $dstFile->query($pathFor('Skipped'))->item(0)->nodeValue = 'S ' . $this->countSkipped; + $dstFile->query($pathFor('Incomplete'))->item(0)->nodeValue = 'I ' . $this->countIncomplete; } /** * This function updates "+" and "-" button for viewing test steps in final report - * @param $dstFile \DOMDocument - destination file + * @param $dstFile DOMDocument - destination file */ - private function updateButtons($dstFile) + private function updateButtons(DOMDocument $dstFile) { $nodes = (new \DOMXPath($dstFile))->query("//div[@class='layout']/table/tr[contains(@class, 'scenarioRow')]"); - for ($i=2;$i<$nodes->length;$i+=2) { - $n = $i/2 + 1; + for ($i = 2; $i < $nodes->length; $i += 2) { + $n = $i / 2 + 1; $p = $nodes->item($i)->childNodes->item(1)->childNodes->item(1); - $table = $nodes->item($i+1)->childNodes->item(1)->childNodes->item(1); + $table = $nodes->item($i + 1)->childNodes->item(1)->childNodes->item(1); $p->setAttribute('onclick', "showHide('$n', this)"); - $table->setAttribute('id', "stepContainer".$n); + $table->setAttribute('id', "stepContainer" . $n); } } } diff --git a/src/Merger/ReportMerger.php b/src/Merger/ReportMerger.php index d8acad2..44c9fd5 100644 --- a/src/Merger/ReportMerger.php +++ b/src/Merger/ReportMerger.php @@ -1,5 +1,6 @@ summarizeTime = true; } - public function maxTime():void + public function maxTime(): void { $this->summarizeTime = false; } diff --git a/src/Splitter/TestFileSplitterTask.php b/src/Splitter/TestFileSplitterTask.php index b10ef34..9160c9e 100644 --- a/src/Splitter/TestFileSplitterTask.php +++ b/src/Splitter/TestFileSplitterTask.php @@ -1,5 +1,6 @@ testsFrom('tests/unit/Acme') * ->codeceptionRoot('projects/tested') * ->groupsTo('tests/_log/paratest_') + * ->addFilter(new Filter1()) + * ->addFilter(new Filter2()) * ->run(); * ?> * ``` @@ -37,6 +42,8 @@ public function run() $groups = []; $this->printTaskInfo('Processing ' . count($files) . ' files'); + $files = $this->filter(iterator_to_array($files->getIterator())); + // splitting tests by groups /** @var SplFileInfo $file */ foreach ($files as $file) { diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index f735b91..1ea80ed 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -1,8 +1,11 @@ numGroups = $groups; + $this->filter[] = new DefaultFilter(); + } + + public function addFilter(Filter $filter): TestsSplitter + { + if (!in_array($filter, $this->filter, true)) { + $this->filter[] = $filter; + } + + return $this; } public function projectRoot(string $path): TestsSplitter @@ -125,10 +140,12 @@ protected function resolveDependenciesToFullNames(array $testsListWithDependenci // look for proper test in list of all tests. Test could be in different directory // so we need to compare strings and if matched we just assign found test name foreach (array_keys($testsListWithDependencies) as $arrayKey) { - if (str_contains( - $arrayKey, - $targetTestFileName . '.php:' . $targetTestMethodName - )) { + if ( + str_contains( + $arrayKey, + $targetTestFileName . '.php:' . $targetTestMethodName + ) + ) { $testsListWithDependencies[$testName][$i] = $arrayKey; continue 2; } @@ -142,4 +159,19 @@ protected function resolveDependenciesToFullNames(array $testsListWithDependenci return $testsListWithDependencies; } + + /** + * Filter tests by the given filters, FIFO principal + * @param array $tests + * @return array + */ + protected function filter(array $tests): array + { + foreach ($this->filter as $filter) { + $filter->setTests($tests); + $tests = $filter->filter(); + } + + return $tests; + } } diff --git a/src/Splitter/TestsSplitterTask.php b/src/Splitter/TestsSplitterTask.php index de03d7a..3eeca50 100644 --- a/src/Splitter/TestsSplitterTask.php +++ b/src/Splitter/TestsSplitterTask.php @@ -1,4 +1,7 @@ taskSplitTestsByGroups(5) * ->testsFrom('tests') * ->groupsTo('tests/_log/paratest_') + * ->addFilter(new Filter1()) + * ->addFilter(new Filter2()) * ->run(); * ?> * ``` */ class TestsSplitterTask extends TestsSplitter { + public function run() { - if (!$this->doCodeceptLoaderExists()) { - throw new TaskException( - $this, - 'This task requires Codeception to be loaded. Please require autoload.php of Codeception' - ); - } - $tests = $this->loadTests(); + $this->claimCodeceptionLoaded(); + $tests = $this->filter($this->loadTests()); $this->printTaskInfo('Processing ' . count($tests) . ' tests'); @@ -150,6 +152,20 @@ public function run() return true; } + /** + * Claims that the Codeception is loaded for Tasks which need it + * @throws TaskException + */ + protected function claimCodeceptionLoaded(): void + { + if (!$this->doCodeceptLoaderExists()) { + throw new TaskException( + $this, + 'This task requires Codeception to be loaded. Please require autoload.php of Codeception' + ); + } + } + /** * @return bool */ diff --git a/src/Splitter/TestsSplitterTrait.php b/src/Splitter/TestsSplitterTrait.php index 354954d..ca86db7 100644 --- a/src/Splitter/TestsSplitterTrait.php +++ b/src/Splitter/TestsSplitterTrait.php @@ -1,26 +1,27 @@ task(TestsSplitterTask::class, $numGroups); } /** - * @param $numGroups + * @param int $numGroups * * @return TestFileSplitterTask */ - protected function taskSplitTestFilesByGroups($numGroups): TestFileSplitterTask + protected function taskSplitTestFilesByGroups(int $numGroups): TestFileSplitterTask { return $this->task(TestFileSplitterTask::class, $numGroups); } diff --git a/tests/Filter/GroupFilterTest.php b/tests/Filter/GroupFilterTest.php new file mode 100644 index 0000000..2f2fab6 --- /dev/null +++ b/tests/Filter/GroupFilterTest.php @@ -0,0 +1,167 @@ +groupExcluded($group); + } + + $this->assertSame($expected, $task->getExcludedGroups()); + } + + /** + * @covers ::getIncludedGroups + * @covers ::groupIncluded + */ + public function testGetIncludedGroups(): void + { + $groupsToAdd = [ + 'foo', + 'bar', + 'baz', + 'foo', + 'Foo', + 'baZ', + ]; + + $expected = [ + 'foo', + 'bar', + 'baz', + 'Foo', + 'baZ', + ]; + + $task = new GroupFilter(); + foreach ($groupsToAdd as $group) { + $task->groupIncluded($group); + } + + $this->assertSame($expected, $task->getIncludedGroups()); + } + + /** + * @covers ::groupIncluded + * @covers ::groupExcluded + */ + public function testDoNotAddGroupToIncludedAndExcluded(): void + { + $task = new GroupFilter(); + $task->groupIncluded('foo'); + $this->expectException(InvalidArgumentException::class); + $this->expectErrorMessageMatches( + '/^You can mark group "\w+" only as included OR excluded.$/' + ); + $task->groupExcluded('foo'); + } + + /** + * @covers ::groupIncluded + * @covers ::groupExcluded + */ + public function testDoNotAddGroupToExcludedAndIncluded(): void + { + $task = (new GroupFilter())->groupExcluded('bar'); + $this->expectException(InvalidArgumentException::class); + $this->expectErrorMessageMatches( + '/^You can mark group "\w+" only as included OR excluded.$/' + ); + $task->groupIncluded('bar'); + } + + /** + * @covers ::filter + */ + public function testFilterWithCestFiles(): void + { + $loader = new TestLoader(['path' => TEST_PATH . '/fixtures/Cests']); + $loader->loadTests(TEST_PATH . '/fixtures/Cests'); + $tests = $loader->getTests(); + $this->assertCount(3, $tests); + // Filter with no groups should return all tests + $filter = new GroupFilter(); + $filter->setTests($tests); + $filtered = $filter->filter(); + $this->assertCount(3, $filtered); + // Filter with group foo should return 2 Tests + $filter->groupIncluded('foo'); + $filtered = $filter->filter(); + $this->assertCount(2, $filtered); + // Filter with group foo from before and new excluded group no should return 1 test + $filter->groupExcluded('no'); + $filtered = $filter->filter(); + $this->assertCount(1, $filtered); + $filter->reset(); + $filtered = $filter->filter(); + $this->assertCount(3, $filtered); + foreach ($filtered as $test) { + $this->assertInstanceOf(SelfDescribing::class, $test); + } + } + + public function testFilterWithUnitTests(): void + { + $loader = new TestLoader(['path' => TEST_PATH . '/fixtures/Unit']); + $loader->loadTests(TEST_PATH . '/fixtures/Unit'); + $tests = $loader->getTests(); + $this->assertCount(4, $tests); + // Filter with no groups should return all tests + $filter = new GroupFilter(); + $filter->setTests($tests); + $filtered = $filter->filter(); + $this->assertCount(4, $filtered); + // Filter with group foo should return 2 Tests + $filter->groupIncluded('foo'); + $filtered = $filter->filter(); + $this->assertCount(3, $filtered); + // Filter with group foo from before and new excluded group no should return 1 test + $filter->groupExcluded('no'); + $filtered = $filter->filter(); + $this->assertCount(1, $filtered); + $filter->reset(); + $filtered = $filter->filter(); + $this->assertCount(4, $filtered); + foreach ($filtered as $test) { + $this->assertInstanceOf(SelfDescribing::class, $test); + } + } +} diff --git a/tests/fixtures/Cests/DirA/ExampleACest.php b/tests/fixtures/Cests/DirA/ExampleACest.php index 4b87bb0..e88e059 100644 --- a/tests/fixtures/Cests/DirA/ExampleACest.php +++ b/tests/fixtures/Cests/DirA/ExampleACest.php @@ -1,13 +1,17 @@ assertTrue(false); + // nothing } } diff --git a/tests/fixtures/Cests/DirB/ExampleACest.php b/tests/fixtures/Cests/DirB/ExampleACest.php index 801e222..9b8f601 100644 --- a/tests/fixtures/Cests/DirB/ExampleACest.php +++ b/tests/fixtures/Cests/DirB/ExampleACest.php @@ -1,13 +1,16 @@ assertTrue(false); + // nothing } } diff --git a/tests/fixtures/Cests/DirC/ExampleACest.php b/tests/fixtures/Cests/DirC/ExampleACest.php index 6400ef1..77d236f 100644 --- a/tests/fixtures/Cests/DirC/ExampleACest.php +++ b/tests/fixtures/Cests/DirC/ExampleACest.php @@ -1,13 +1,16 @@ assertTrue(false); + // nothing } } diff --git a/tests/fixtures/Unit/ExampleATest.php b/tests/fixtures/Unit/ExampleATest.php new file mode 100644 index 0000000..46405d8 --- /dev/null +++ b/tests/fixtures/Unit/ExampleATest.php @@ -0,0 +1,31 @@ +assertTrue(false); + } + + /** + * @group foo + * @group bar + * @group no + * @group example + */ + public function testB(): void + { + $this->assertTrue(false); + } +} diff --git a/tests/fixtures/Unit/ExampleBTest.php b/tests/fixtures/Unit/ExampleBTest.php new file mode 100644 index 0000000..179c113 --- /dev/null +++ b/tests/fixtures/Unit/ExampleBTest.php @@ -0,0 +1,31 @@ +assertTrue(false); + } + + /** + * @group foo + * @group baz + * @group no + * @group example + */ + public function testB(): void + { + $this->assertTrue(false); + } +} From 36db36c9114b3b13206d8a5e90d5f69e76e7cd86 Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Tue, 20 Jul 2021 17:52:37 +0300 Subject: [PATCH 09/52] Fix split by time (#57) * split by time task * fix * fix * Feature/fix split by time tests (#58) * fixing namespace for tests * Test Fix: Cests should not extends any unit class * Fixing Test Namspace * readStatFileContent in separate Method, fixing path content because of TimeReporter which cuts the rootpath from the filepath * Plublic getter for the ProjectRoot (How can we get the Config here from Codeception) * Example json File for testing * Raw Test for TimeTask * fixing TimeReporter.php, a little bit CS * Fixing Tests for SplitTestsByTimeTask.php, Resolve BUG with the path * Fixing namespace for Tests * Generating Tests for TimeReporter.php * clean up tests/result directory * updated composer lock * Bugfix/fix split by time and update readme (#61) * Fixing Tests for TimeTaskTest * resolve bug by resolving dependencies, better tests * Updated Readme with new feature of filters, checks switched to abstract class * Correct the typo * Codestyle fix Co-authored-by: Ivan Borzenkov Co-authored-by: KJunker --- README.md | 77 ++++++++-- composer.json | 3 +- composer.lock | 8 +- src/Extension/TimeReporter.php | 54 +++++++ src/Splitter/SplitTestsByTimeTask.php | 134 ++++++++++++++++++ src/Splitter/TestsSplitter.php | 43 +++++- src/Splitter/TestsSplitterTask.php | 31 +--- src/Splitter/TestsSplitterTrait.php | 10 ++ tests/Extension/TimeReporterTest.php | 103 ++++++++++++++ tests/Splitter/SplitTestsByTimeTaskTest.php | 103 ++++++++++++++ tests/Splitter/TestsSplitterTaskTest.php | 71 ++++++++-- tests/fixtures/Cests/DirA/ExampleACest.php | 2 +- tests/fixtures/Cests/DirB/ExampleACest.php | 2 +- tests/fixtures/Cests/DirC/ExampleACest.php | 2 +- .../DirA/Example1Test.php | 2 + .../DirA/Example2Test.php | 4 +- .../DirB/Example3Test.php | 2 + .../DirA/Example1Test.php | 4 +- tests/fixtures/Unit/ExampleBTest.php | 2 +- tests/fixtures/timeReport.json | 18 +++ 20 files changed, 615 insertions(+), 60 deletions(-) create mode 100644 src/Extension/TimeReporter.php create mode 100644 src/Splitter/SplitTestsByTimeTask.php create mode 100644 tests/Extension/TimeReporterTest.php create mode 100644 tests/Splitter/SplitTestsByTimeTaskTest.php create mode 100644 tests/fixtures/timeReport.json diff --git a/README.md b/README.md index fcbdec0..8a347f2 100644 --- a/README.md +++ b/README.md @@ -29,14 +29,6 @@ class RoboFile extends \Robo\Tasks ?> ``` -### PHPUnit 6 compatiblity - -Add ` 'vendor/codeception/codeception/autoload.php'` to enabled PHPUnit 6 class names: - -```php -require_once 'vendor/codeception/codeception/autoload.php'; -``` - ## Idea Parallel execution of Codeception tests can be implemented in different ways. @@ -47,7 +39,7 @@ Thus, we are going to prepare a set of predefined tasks that can be combined and ### SplitTestsByGroups -Loads tests from a folder and distributes them between groups. +Load tests from a folder and distributes them between groups. ```php $this->taskSplitTestsByGroups(5) @@ -65,7 +57,74 @@ $this->taskSplitTestFilesByGroups(5) ->groupsTo('tests/_data/paratest_') ->run(); ``` +### SplitTestsByTime + +Enable extension for collect execution time of you use taskSplitTestsByTime + +``` +extensions: + enabled: + - Codeception\Task\Extension\TimeReporter +``` + +Load tests from a folder and distributes them between groups by execution time. + +```php +$this->taskSplitTestsByTime(5) + ->testsFrom('tests/acceptance') + ->projectRoot('.') + ->groupsTo('tests/_data/group_') + ->run(); +``` + +this command need run all tests with `Codeception\Task\TimeReporter` for collect execution time. If you want just split tests between group (and not execute its) you can use SplitTestsByGroups. +**Please be aware**: This task will not consider any 'depends' annotation! + +### Filter + +You can use a custom filter to select the necessary tests. + +Two filters already included: DefaultFilter, GroupFilter + +**DefaultFilter** is used by default and is every time the first filter which will be used. +**GroupFilter** _Can only be used by taskSplitTestsByGroups_, allows you to filter the loaded tests by the given groups. You have the possibility to declare groups which you want to include or exclude. If you declare foo and bar as included, only tests with this both group annotations will be matched. The same thing is happend when you add excluded groups. If you combine the included and excluded group the only tests which have exactly the correct group annotations for the included items and none of the excluded items. + +You can add as many filters as you want. The FIFO principle applies. The next filter will only get the result of the filter before. +####USAGE: + +For example, you want all tests which have in the doc comment the groups 'foo' AND 'bar' but not 'baz' then you can do it like this: + +```php +$filter = new GroupFilter(); +$filter + ->groupIncluded('foo') + ->groupIncluded('bar') + ->groupExcluded('baz'); + +$this->taskSplitTestsByGroups(5) + ->testsFrom('tests') + ->groupsTo('tests/_data/paratest_') + ->addFilter($filter) + ->run(); +``` + +Now create your own filter class: +```php +=2.7 <6.0", "ext-dom": "*", - "ext-libxml": "*" + "ext-libxml": "*", + "ext-json": "*" }, "autoload-dev": { "psr-4": { diff --git a/composer.lock b/composer.lock index f686518..6842fe1 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": "76954ba038aa10e4972b05222d42938c", + "content-hash": "a8b431b5c85a1eede7d313207c0f1932", "packages": [ { "name": "consolidation/annotated-command", @@ -4304,7 +4304,6 @@ "zfr/zfr-oauth2-server-module": "<0.1.2", "zoujingli/thinkadmin": "<6.0.22" }, - "default-branch": true, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5750,8 +5749,9 @@ "platform": { "php": ">=7.3 <9.0", "ext-dom": "*", - "ext-libxml": "*" + "ext-libxml": "*", + "ext-json": "*" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "1.1.0" } diff --git a/src/Extension/TimeReporter.php b/src/Extension/TimeReporter.php new file mode 100644 index 0000000..9c4bb0d --- /dev/null +++ b/src/Extension/TimeReporter.php @@ -0,0 +1,54 @@ + 'endRun', + Events::TEST_END => 'after', + ]; + + private $timeList = []; + + /** + * Event handler after each test - collect stat + * + * @param TestEvent $e + */ + public function after(TestEvent $e): void + { + $name = $this->getTestname($e); + + if (empty($this->timeList[$name])) { + $this->timeList[$name] = 0; + } + $this->timeList[$name] += $e->getTime(); + } + + /** + * Event handler after all tests - save stat + */ + public function endRun(): void + { + $file = $this->getLogDir() . 'timeReport.json'; + $data = is_file($file) ? json_decode(file_get_contents($file), true) : []; + $data = array_replace($data, $this->timeList); + file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT)); + } + + /** + * @param TestEvent $e + * @return false|string + */ + public function getTestname(TestEvent $e): string + { + $name = Descriptor::getTestFullName($e->getTest()); + return substr(str_replace($this->getRootDir(), '', $name), 1); + } +} diff --git a/src/Splitter/SplitTestsByTimeTask.php b/src/Splitter/SplitTestsByTimeTask.php new file mode 100644 index 0000000..7bccb94 --- /dev/null +++ b/src/Splitter/SplitTestsByTimeTask.php @@ -0,0 +1,134 @@ +statFile = $path; + + return $this; + } + + public function run(): void + { + $this->claimCodeceptionLoaded(); + + if (!is_file($this->statFile)) { + throw new TaskException($this, 'Can not find stat file - run tests with TimeReporter extension'); + } + + $testLoader = new Loader(['path' => $this->testsFrom]); + $testLoader->loadTests($this->testsFrom); + $tests = $testLoader->getTests(); + $data = $this->readStatFileContent(); + + $testsWithTime = []; + $groups = []; + + $this->printTaskInfo('Processing ' . count($tests) . ' tests'); + foreach ($tests as $test) { + if ($test instanceof DataProviderTestSuite) { + $test = current($test->tests()); + } + $testName = Descriptor::getTestFullName($test); + if (1 !== preg_match('~^/~', $testName)) { + $testName = '/' . $testName; + } + + $testName = substr(str_replace($this->getProjectDir(), '', $testName), 1); + $testsWithTime[$testName] = $data[$testName] ?? 0; + } + + arsort($testsWithTime); + + for ($i = 0; $i < $this->numGroups; $i++) { + $groups[$i] = [ + 'tests' => [], + 'sum' => 0, + ]; + } + + foreach ($testsWithTime as $test => $time) { + $i = $this->getMinGroup($groups); + $groups[$i]['tests'][] = $test; + $groups[$i]['sum'] += $time; + } + + // saving group files + foreach ($groups as $i => ['tests' => $tests, 'sum' => $sum]) { + $filename = $this->saveTo . ($i + 1); + $this->printTaskInfo( + sprintf( + 'Writing %s: %d tests with %01.2f seconds', + $filename, + count($tests), + number_format($sum, 2) + ) + ); + file_put_contents($filename, implode("\n", $tests)); + } + } + + /** + * Find group num with min execute time + * + * @param array $groups + * @return int + */ + protected function getMinGroup(array $groups): int + { + $min = 0; + $minSum = $groups[0]['sum']; + foreach ($groups as $i => $data) { + if ($data['sum'] < $minSum) { + $min = $i; + $minSum = $data['sum']; + } + } + + return $min; + } + + /** + * @return array + */ + private function readStatFileContent(): array + { + if (false === ($data = file_get_contents($this->statFile))) { + throw new RuntimeException('Could not read content of stat file.'); + } + + try { + $data = json_decode($data, true, 512, JSON_THROW_ON_ERROR); + } catch (JsonException $exception) { + throw new RuntimeException( + "Could not decode content of stat file.", + 0, + $exception + ); + } + + return $data; + } + + public function getProjectDir(): string + { + return Configuration::projectDir(); + } +} diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 1ea80ed..9345ba9 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -6,6 +6,8 @@ use Codeception\Task\Filter\DefaultFilter; use Codeception\Task\Filter\Filter; +use ReflectionClass; +use Robo\Exception\TaskException; use Robo\Task\BaseTask; abstract class TestsSplitter extends BaseTask @@ -42,6 +44,14 @@ public function addFilter(Filter $filter): TestsSplitter return $this; } + /** + * @return string + */ + public function getProjectRoot(): string + { + return realpath($this->projectRoot); + } + public function projectRoot(string $path): TestsSplitter { $this->projectRoot = $path; @@ -121,7 +131,11 @@ protected function resolveDependenciesToFullNames(array $testsListWithDependenci foreach ($testsListWithDependencies as $testName => $test) { foreach ($test as $i => $dependency) { if (is_a($dependency, '\PHPUnit\Framework\ExecutionOrderDependency')) { + // getTarget gives the classname::method $dependency = $dependency->getTarget(); + [$class, $method] = explode('::', $dependency); + $ref = new ReflectionClass($class); + $dependency = $ref->getFileName() . ':' . $method; } // sometimes it is written as class::method. // for that reason we do trim in first case and replace from :: to one in second case @@ -136,20 +150,23 @@ protected function resolveDependenciesToFullNames(array $testsListWithDependenci $dependency = str_replace('::', ':', $dependency); // className:testName, that means we need to find proper test. [$targetTestFileName, $targetTestMethodName] = explode(':', $dependency); - + if (false === strrpos($targetTestFileName, '.php')) { + $targetTestFileName .= '.php'; + } // look for proper test in list of all tests. Test could be in different directory // so we need to compare strings and if matched we just assign found test name foreach (array_keys($testsListWithDependencies) as $arrayKey) { if ( str_contains( $arrayKey, - $targetTestFileName . '.php:' . $targetTestMethodName + $targetTestFileName . ':' . $targetTestMethodName ) ) { $testsListWithDependencies[$testName][$i] = $arrayKey; continue 2; } } + throw new \RuntimeException( 'Dependency target test ' . $dependency . ' not found.' . 'Please make sure test exists and you are using full test name' @@ -174,4 +191,26 @@ protected function filter(array $tests): array return $tests; } + + /** + * Claims that the Codeception is loaded for Tasks which need it + * @throws TaskException + */ + protected function claimCodeceptionLoaded(): void + { + if (!$this->doCodeceptLoaderExists()) { + throw new TaskException( + $this, + 'This task requires Codeception to be loaded. Please require autoload.php of Codeception' + ); + } + } + + /** + * @return bool + */ + protected function doCodeceptLoaderExists(): bool + { + return class_exists('\Codeception\Test\Loader'); + } } diff --git a/src/Splitter/TestsSplitterTask.php b/src/Splitter/TestsSplitterTask.php index 3eeca50..a51c56f 100644 --- a/src/Splitter/TestsSplitterTask.php +++ b/src/Splitter/TestsSplitterTask.php @@ -12,7 +12,6 @@ use PHPUnit\Framework\DataProviderTestSuite; use PHPUnit\Framework\TestCase; use ReflectionObject; -use Robo\Exception\TaskException; /** * Loads all tests into groups and saves them to groupfile according to pattern. @@ -36,7 +35,6 @@ public function run() { $this->claimCodeceptionLoaded(); $tests = $this->filter($this->loadTests()); - $this->printTaskInfo('Processing ' . count($tests) . ' tests'); $testsHaveAtLeastOneDependency = false; @@ -58,11 +56,12 @@ public function run() if (method_exists($test, 'getMetadata')) { $dependencies = $test->getMetadata()->getDependencies(); - if ($testsHaveAtLeastOneDependency === false && count($dependencies) !== 0) { + if (count($dependencies) !== 0) { $testsHaveAtLeastOneDependency = true; $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = $dependencies; + } else { + $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = []; } - // little hack to get dependencies from phpunit test cases that are private. } elseif ($test instanceof TestCase) { $ref = new ReflectionObject($test); @@ -71,7 +70,7 @@ public function run() $property = $ref->getProperty('dependencies'); $property->setAccessible(true); $dependencies = $property->getValue($test); - if ($testsHaveAtLeastOneDependency === false && count($dependencies) !== 0) { + if (count($dependencies) !== 0) { $testsHaveAtLeastOneDependency = true; $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = $dependencies; } else { @@ -152,28 +151,6 @@ public function run() return true; } - /** - * Claims that the Codeception is loaded for Tasks which need it - * @throws TaskException - */ - protected function claimCodeceptionLoaded(): void - { - if (!$this->doCodeceptLoaderExists()) { - throw new TaskException( - $this, - 'This task requires Codeception to be loaded. Please require autoload.php of Codeception' - ); - } - } - - /** - * @return bool - */ - protected function doCodeceptLoaderExists(): bool - { - return class_exists(TestLoader::class); - } - /** * @return TestLoader */ diff --git a/src/Splitter/TestsSplitterTrait.php b/src/Splitter/TestsSplitterTrait.php index ca86db7..b8cfed7 100644 --- a/src/Splitter/TestsSplitterTrait.php +++ b/src/Splitter/TestsSplitterTrait.php @@ -25,4 +25,14 @@ protected function taskSplitTestFilesByGroups(int $numGroups): TestFileSplitterT { return $this->task(TestFileSplitterTask::class, $numGroups); } + + /** + * @param $numGroups + * + * @return TestFileSplitterTask + */ + protected function taskSplitTestsByTime($numGroups): TestFileSplitterTask + { + return $this->task(SplitTestsByTimeTask::class, $numGroups); + } } diff --git a/tests/Extension/TimeReporterTest.php b/tests/Extension/TimeReporterTest.php new file mode 100644 index 0000000..4abc817 --- /dev/null +++ b/tests/Extension/TimeReporterTest.php @@ -0,0 +1,103 @@ + 'tests/acceptance/bar/baz.php:testA', 'time' => 10,], + ['testname' => 'tests/acceptance/bar/baz.php:testA', 'time' => 50,], // rerun + ['testname' => 'tests/acceptance/bar/baz.php:testB', 'time' => 100,], + ['testname' => 'tests/acceptance/bar/baz.php:testC', 'time' => 50,], + ['testname' => 'tests/acceptance/bar/baz.php:testD', 'time' => 33,], + ['testname' => 'tests/acceptance/bar/baz.php:testD', 'time' => 50,], // rerun + ['testname' => 'tests/acceptance/bar/baz.php:testE', 'time' => 66,], + ['testname' => 'tests/acceptance/bar/baz.php:testF', 'time' => 90,], + ['testname' => 'tests/acceptance/bar/baz.php:testG', 'time' => 100,], + ['testname' => 'tests/acceptance/bar/baz.php:testG', 'time' => 13,], //rerun + ['testname' => 'tests/acceptance/bar/baz.php:testH', 'time' => 50,], + ]; + + $expected = [ + 'tests/acceptance/bar/baz.php:testA' => 60, + 'tests/acceptance/bar/baz.php:testB' => 100, + 'tests/acceptance/bar/baz.php:testC' => 50, + 'tests/acceptance/bar/baz.php:testD' => 83, + 'tests/acceptance/bar/baz.php:testE' => 66, + 'tests/acceptance/bar/baz.php:testF' => 90, + 'tests/acceptance/bar/baz.php:testG' => 113, + 'tests/acceptance/bar/baz.php:testH' => 50, + ]; + + $reporter = $this->getMockBuilder(TimeReporter::class) + ->disableOriginalConstructor() + ->onlyMethods(['getTestname', 'getLogDir']) + ->getMock(); + $reporter->method('getLogDir')->willReturn(TEST_PATH . '/result/'); + + // prepare Mocks for Test + $testEvents = []; + foreach ($eventTests as $test) { + $eventMock = $this->getMockBuilder(TestEvent::class) + ->disableOriginalConstructor() + ->onlyMethods(['getTime']) + ->getMock(); + + $eventMock->method('getTime')->willReturn($test['time']); + $testEvents[] = [ + 'mock' => $eventMock, + 'testname' => $test['testname'] + ]; + } + + // get Testname by the TestEventMock + $reporter + ->method('getTestname') + ->withConsecutive( + ...array_map( + static function (TestEvent $event): array { + return [$event]; + }, + array_column($testEvents, 'mock') + ) + ) + ->willReturnOnConsecutiveCalls(...array_column($testEvents, 'testname')); + + // fill timeList with the mocked Events + foreach ($testEvents as $testEvent) { + $reporter->after($testEvent['mock']); + } + + $reporter->endRun(); + $reportFile = TEST_PATH . '/result/timeReport.json'; + $this->assertFileExists($reportFile); + + $lines = json_decode(file_get_contents($reportFile), true); + $this->assertCount(count($expected), $lines); + foreach ($expected as $test => $time) { + $this->assertContains($test, array_keys($lines), $test . ' does not exists in file.'); + $this->assertSame($time, $lines[$test], 'Calculated time does not match the expected.'); + } + } + + protected function tearDown(): void + { + parent::tearDown(); // TODO: Change the autogenerated stub + unlink(TEST_PATH . '/result/timeReport.json'); + } +} diff --git a/tests/Splitter/SplitTestsByTimeTaskTest.php b/tests/Splitter/SplitTestsByTimeTaskTest.php new file mode 100644 index 0000000..a03db51 --- /dev/null +++ b/tests/Splitter/SplitTestsByTimeTaskTest.php @@ -0,0 +1,103 @@ + [ // 150 sec. + 20 sec. = 170 sec. + 'tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php:testA', + 'tests/fixtures/DependencyResolutionExampleTests2/DirA/Example1Test.php:testB', + ], + 'group_2' => [ // 130 sec. + 20 sec. + 10 sec. = 160 sec. + 'tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php:testB', + 'tests/fixtures/Cests/DirB/ExampleACest.php:testExampleGoFrom', + 'tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php:testC', + ], + 'group_3' => [ // 120.10 sec. + 29.98 sec. + 0.5 sec. + 1.5 sec. + 0.3 sec. = 152.38 sec. + 'tests/fixtures/Cests/DirC/ExampleACest.php:testExampleStayHere', + 'tests/fixtures/Cests/DirA/ExampleACest.php:testExampleGoTo', + 'tests/fixtures/Unit/ExampleBTest.php:testB', + 'tests/fixtures/Unit/ExampleBTest.php:testA', + 'tests/fixtures/Unit/ExampleATest.php:testB', + ], + 'group_4' => [ // 34 sec. + 35 sec. + 33 sec. + 30 sec. + 20 sec. + 0.3 sec. = 152.3 sec. + 'tests/fixtures/DependencyResolutionExampleTests/DirA/Example2Test.php:testD', + 'tests/fixtures/DependencyResolutionExampleTests/DirA/Example2Test.php:testE', + 'tests/fixtures/DependencyResolutionExampleTests/DirB/Example3Test.php:testF', + 'tests/fixtures/DependencyResolutionExampleTests/DirB/Example3Test.php:testG', + 'tests/fixtures/DependencyResolutionExampleTests2/DirA/Example1Test.php:testA', + 'tests/fixtures/Unit/ExampleATest.php:testA', + ], + ]; + + $expectedFiles = 4; + + $task = $this->getMockBuilder(SplitTestsByTimeTask::class) + ->setConstructorArgs([4]) + ->onlyMethods(['getProjectDir']) + ->getMock(); + + $task->method('getProjectDir')->willReturn(dirname(TEST_PATH)); + $groupTo = TEST_PATH . '/result/group_'; + $task->setLogger(new Logger(new NullOutput())); + $task->statFile(TEST_PATH . '/fixtures/timeReport.json') + ->projectRoot(TEST_PATH . '/../') + ->testsFrom(TEST_PATH . '/fixtures/') + ->groupsTo($groupTo) + ->run(); + + + for ($i = 1; $i <= $expectedFiles; $i++) { + $filename = $groupTo . $i; + $this->assertFileExists($filename); + $lines = explode(PHP_EOL, file_get_contents($filename)); + $this->assertCount(count($expectedGroupContent['group_' . $i]), $lines); + foreach ($expectedGroupContent['group_' . $i] as $expectedSubpath) { + $matches = preg_grep('~' . preg_quote($expectedSubpath, '~') . '$~', $lines); + $this->assertCount( + 1, + $matches, + sprintf( + 'Did not found expected subpath %s in lines of file %s.', + $expectedSubpath, + $filename + ) + ); + } + } + + $this->assertFileDoesNotExist($groupTo . ($expectedFiles + 1)); + } + + protected function tearDown(): void + { + parent::tearDown(); // TODO: Change the autogenerated stub + $finder = Finder::create() + ->files() + ->name('group_*'); + + foreach ($finder->in(TEST_PATH . '/result') as $file) { + unlink($file->getPathname()); + } + } +} diff --git a/tests/Splitter/TestsSplitterTaskTest.php b/tests/Splitter/TestsSplitterTaskTest.php index 1c9a570..29d9baf 100644 --- a/tests/Splitter/TestsSplitterTaskTest.php +++ b/tests/Splitter/TestsSplitterTaskTest.php @@ -40,17 +40,29 @@ public function testRunThrowsExceptionIfCodeceptLoaderIsNotLoaded(): void public function providerTestLoadTestsWithDifferentPatterns(): array { return [ - [ - 'groups' => 1, - 'expectedFiles' => 7, + 'Cests' => [ + 'type' => 'cest', + 'groups' => 2, + 'from' => TEST_PATH . '/fixtures/Cests/', + 'expectedFiles' => 2, + ], + 'Dependencies' => [ + 'type' => 'depends', + 'groups' => 2, + 'from' => TEST_PATH . '/fixtures/DependencyResolutionExampleTests/', + 'expectedFiles' => 2, ], - [ + 'Unit Tests' => [ + 'type' => 'unit', 'groups' => 2, - 'expectedFiles' => 7, + 'from' => TEST_PATH . '/fixtures/Unit/', + 'expectedFiles' => 2, ], - [ - 'groups' => 7, - 'expectedFiles' => 7, + 'Circular Dep' => [ + 'type' => 'circ_depends', + 'groups' => 1, + 'from' => TEST_PATH . '/fixtures/DependencyResolutionExampleTests2/', + 'expectedFiles' => 0, // Circular dependency ], ]; } @@ -58,16 +70,20 @@ public function providerTestLoadTestsWithDifferentPatterns(): array /** * @covers ::run * @dataProvider providerTestLoadTestsWithDifferentPatterns + * @param string $type * @param int $groups + * @param string $from * @param int $expectedFiles */ public function testLoadTests( + string $type, int $groups, + string $from, int $expectedFiles ): void { $task = new TestsSplitterTask($groups); $task->setLogger(new Logger(new NullOutput())); - $task->testsFrom(TEST_PATH . '/fixtures/'); + $task->testsFrom($from); $groupTo = TEST_PATH . '/result/group_'; $task->groupsTo($groupTo); $task->run(); @@ -77,11 +93,44 @@ public function testLoadTests( ->in(TEST_PATH . '/result/') ->name('group_*'); - $this->assertCount($groups, $files->getIterator()); + $this->assertCount($expectedFiles, $files->getIterator()); - for ($i = 1; $i <= $groups; $i++) { + for ($i = 1; $i <= $expectedFiles; $i++) { $this->assertFileExists($groupTo . $i); } + // check that the dependencies are ordered correct + if ('depends' === $type) { + for ($i = 1; $i <= $expectedFiles; $i++) { + $content = explode(PHP_EOL, file_get_contents($groupTo . $i)); + $check = array_flip( + array_map( + static function (string $fullpath): string { + return explode(':', $fullpath)[1]; + }, + $content + ) + ); + if (preg_grep('/Example1Test\.php/', $content)) { + $this->assertGreaterThan( + $check['testB'], + $check['testA'], + 'The index of testA must be greater than testB to ensure the correct order.' + ); + $this->assertGreaterThan( + $check['testA'], + $check['testC'], + 'The index of testC must be greater than testA to ensure the correct order.' + ); + } + if (preg_grep('/Example2Test\.php/', $content)) { + $this->assertGreaterThan( + $check['testE'], + $check['testD'], + 'The index of testD must be greater than testE to ensure the correct order.' + ); + } + } + } } protected function tearDown(): void diff --git a/tests/fixtures/Cests/DirA/ExampleACest.php b/tests/fixtures/Cests/DirA/ExampleACest.php index e88e059..1e389a5 100644 --- a/tests/fixtures/Cests/DirA/ExampleACest.php +++ b/tests/fixtures/Cests/DirA/ExampleACest.php @@ -10,7 +10,7 @@ class ExampleACest * @group no * @group example */ - public function testExampleGoTo() + public function testExampleGoTo(): void { // nothing } diff --git a/tests/fixtures/Cests/DirB/ExampleACest.php b/tests/fixtures/Cests/DirB/ExampleACest.php index 9b8f601..7041b3f 100644 --- a/tests/fixtures/Cests/DirB/ExampleACest.php +++ b/tests/fixtures/Cests/DirB/ExampleACest.php @@ -9,7 +9,7 @@ class ExampleACest * @group bar * @group example */ - public function testExampleGoFrom() + public function testExampleGoFrom(): void { // nothing } diff --git a/tests/fixtures/Cests/DirC/ExampleACest.php b/tests/fixtures/Cests/DirC/ExampleACest.php index 77d236f..dbdc774 100644 --- a/tests/fixtures/Cests/DirC/ExampleACest.php +++ b/tests/fixtures/Cests/DirC/ExampleACest.php @@ -9,7 +9,7 @@ class ExampleACest * @group no * @group example */ - public function testExampleStayHere() + public function testExampleStayHere(): void { // nothing } diff --git a/tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php b/tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php index b67c416..4dca1a5 100644 --- a/tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php +++ b/tests/fixtures/DependencyResolutionExampleTests/DirA/Example1Test.php @@ -1,5 +1,7 @@ Date: Tue, 20 Jul 2021 18:00:17 +0300 Subject: [PATCH 10/52] Update README.md --- README.md | 68 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 8a347f2..a0dda16 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Robo tasks for Codeception tests parallel execution. Requires [Robo Task Runner] ## Install via Composer ``` -"codeception/robo-paracept":"~0.4" +composer require codeception/robo-paracept --dev ``` Include into your RoboFile @@ -33,7 +33,7 @@ class RoboFile extends \Robo\Tasks Parallel execution of Codeception tests can be implemented in different ways. Depending on a project the actual needs can be different. -Thus, we are going to prepare a set of predefined tasks that can be combined and reconfigured to fit needs. +So we prepared a set of predefined Robo tasks that can be combined and reconfigured to fit your needs. ## Tasks @@ -77,20 +77,46 @@ $this->taskSplitTestsByTime(5) ->run(); ``` -this command need run all tests with `Codeception\Task\TimeReporter` for collect execution time. If you want just split tests between group (and not execute its) you can use SplitTestsByGroups. -**Please be aware**: This task will not consider any 'depends' annotation! +this command need run all tests with `Codeception\Task\TimeReporter` for collect execution time. If you want just split tests between group (and not execute its) you can use SplitTestsByGroups. **Please be aware**: This task will not consider any 'depends' annotation! + +### MergeXmlReports + +Mergex several XML reports: + +```php +$this->taskMergeXmlReports() + ->from('tests/result/result1.xml') + ->from('tests/result/result2.xml') + ->into('tests/result/merged.xml') + ->run(); +``` + + +### MergeHtmlReports + +Mergex several HTML reports: + +```php +$this->taskMergeHtmlReports() + ->from('tests/result/result1.html') + ->from('tests/result/result2.html') + ->into('tests/result/merged.html') + ->run(); +``` -### Filter + +## Filters You can use a custom filter to select the necessary tests. Two filters already included: DefaultFilter, GroupFilter -**DefaultFilter** is used by default and is every time the first filter which will be used. -**GroupFilter** _Can only be used by taskSplitTestsByGroups_, allows you to filter the loaded tests by the given groups. You have the possibility to declare groups which you want to include or exclude. If you declare foo and bar as included, only tests with this both group annotations will be matched. The same thing is happend when you add excluded groups. If you combine the included and excluded group the only tests which have exactly the correct group annotations for the included items and none of the excluded items. +* **DefaultFilter** is enabled by default, takes all tests. +* **GroupFilter** _(Can only be used by taskSplitTestsByGroups)_, allows you to filter the loaded tests by the given groups. You have the possibility to declare groups which you want to include or exclude. If you declare foo and bar as included, only tests with this both group annotations will be matched. The same thing is happend when you add excluded groups. If you combine the included and excluded group the only tests which have exactly the correct group annotations for the included items and none of the excluded items. + +You can add as many filters as you want. The FIFO (First In - First Out) principle applies. The next filter will only get the result of the filter before. -You can add as many filters as you want. The FIFO principle applies. The next filter will only get the result of the filter before. -####USAGE: +### Usage For example, you want all tests which have in the doc comment the groups 'foo' AND 'bar' but not 'baz' then you can do it like this: @@ -125,27 +151,5 @@ class CustomFilter extends DefaultFilter { The TestFileSplitterTask.php pushes an array of SplFileInfo Objects to the filter. The TestsSplitterTask.php pushes an array of SelfDescribing Objects to the filter. -### MergeXmlReports - -Mergex several XML reports: - -```php -$this->taskMergeXmlReports() - ->from('tests/result/result1.xml') - ->from('tests/result/result2.xml') - ->into('tests/result/merged.xml') - ->run(); -``` - -### MergeHtmlReports - -Mergex several HTML reports: - -```php -$this->taskMergeHtmlReports() - ->from('tests/result/result1.html') - ->from('tests/result/result2.html') - ->into('tests/result/merged.html') - ->run(); -``` +### License MIT From 38effbd066775b8cb6304352504b283d01d2380c Mon Sep 17 00:00:00 2001 From: KJunker Date: Sun, 25 Jul 2021 17:28:11 +0200 Subject: [PATCH 11/52] Feature/reporter ext and splitter for failed tests (#66) * Create php.yml * Added a FailedTestsReporter which catched all failed Tests and write it to the failedTests.txt * outsourced method which groups the files/tests * FailedTestSplitterTask.php created, Tests for the Task * Updated Readme.md, fixed Returntype in trait --- README.md | 19 +++++ src/Extension/FailedTestsReporter.php | 75 +++++++++++++++++ src/Splitter/FailedTestSplitterTask.php | 63 ++++++++++++++ src/Splitter/TestFileSplitterTask.php | 27 ++---- src/Splitter/TestsSplitter.php | 27 ++++++ src/Splitter/TestsSplitterTrait.php | 26 ++++-- tests/Extension/FailedTestsReporterTest.php | 81 ++++++++++++++++++ tests/Splitter/FailedTestSplitterTaskTest.php | 83 +++++++++++++++++++ tests/fixtures/failedTests.txt | 8 ++ 9 files changed, 383 insertions(+), 26 deletions(-) create mode 100644 src/Extension/FailedTestsReporter.php create mode 100644 src/Splitter/FailedTestSplitterTask.php create mode 100644 tests/Extension/FailedTestsReporterTest.php create mode 100644 tests/Splitter/FailedTestSplitterTaskTest.php create mode 100644 tests/fixtures/failedTests.txt diff --git a/README.md b/README.md index a0dda16..1e0f9b8 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,25 @@ $this->taskSplitTestsByTime(5) this command need run all tests with `Codeception\Task\TimeReporter` for collect execution time. If you want just split tests between group (and not execute its) you can use SplitTestsByGroups. **Please be aware**: This task will not consider any 'depends' annotation! +### SplitFailedTests + +Enable extension for collect failed tests if you use taskSplitFailedTests + +``` +extensions: + enabled: + - Codeception\Task\Extension\FailedTestsReporter +``` + +Load the failed Tests from a reportfile into the groups: +- Default report path is: `Configuration::outputDir() . 'failedTests.txt'` +```php +$this + ->taskSplitFailedTests(5) + ->setReportPath('tests/_output/' . FailedTestsReporter::REPORT_NAME) + ->groupsTo('tests/_data/group_') + ->run(); +``` ### MergeXmlReports Mergex several XML reports: diff --git a/src/Extension/FailedTestsReporter.php b/src/Extension/FailedTestsReporter.php new file mode 100644 index 0000000..7044caa --- /dev/null +++ b/src/Extension/FailedTestsReporter.php @@ -0,0 +1,75 @@ + 'afterFail', + Events::RESULT_PRINT_AFTER => 'endRun', + ]; + + /** + * Event after each failed test - collect the failed test + * @param FailEvent $event + */ + public function afterFail(FailEvent $event): void + { + $this->failedTests[] = $this->getTestname($event); + } + + /** + * Event after all Tests - write failed tests to reportfile + */ + public function endRun(): void + { + if (empty($this->failedTests)) { + return; + } + + $file = $this->getLogDir() . $this->reportFile; + if (is_file($file)) { + unlink($file); // remove old reportFile + } + + file_put_contents($file, implode(PHP_EOL, $this->failedTests)); + } + + /** + * @param TestEvent $e + * @return false|string + */ + public function getTestname(TestEvent $e): string + { + $name = Descriptor::getTestFullName($e->getTest()); + + return substr(str_replace($this->getRootDir(), '', $name), 1); + } +} diff --git a/src/Splitter/FailedTestSplitterTask.php b/src/Splitter/FailedTestSplitterTask.php new file mode 100644 index 0000000..dc2cf2d --- /dev/null +++ b/src/Splitter/FailedTestSplitterTask.php @@ -0,0 +1,63 @@ +reportPath ?? (Configuration::logDir() . FailedTestsReporter::REPORT_NAME); + } + + /** + * @inheritDoc + */ + public function run() + { + $this->claimCodeceptionLoaded(); + $reportPath = $this->getReportPath(); + + if (!@file_exists($reportPath)) { + throw new RuntimeException( + 'The reportfile "failedTests.txt" did not exists.' + ); + } + + $this->splitToGroupFiles( + $this->filter( + explode( + PHP_EOL, + file_get_contents($reportPath) + ) + ) + ); + } + + /** + * @param string $reportPath + * @return FailedTestSplitterTask + */ + public function setReportPath(string $reportPath): FailedTestSplitterTask + { + if (empty($reportPath)) { + throw new \InvalidArgumentException('The reportPath could not be empty!'); + } + + $this->reportPath = $reportPath; + + return $this; + } +} diff --git a/src/Splitter/TestFileSplitterTask.php b/src/Splitter/TestFileSplitterTask.php index 9160c9e..9a69b18 100644 --- a/src/Splitter/TestFileSplitterTask.php +++ b/src/Splitter/TestFileSplitterTask.php @@ -38,25 +38,14 @@ public function run() ->in($this->projectRoot ?: getcwd()) ->exclude($this->excludePath); - $i = 0; - $groups = []; - - $this->printTaskInfo('Processing ' . count($files) . ' files'); - $files = $this->filter(iterator_to_array($files->getIterator())); - - // splitting tests by groups - /** @var SplFileInfo $file */ - foreach ($files as $file) { - $groups[($i % $this->numGroups) + 1][] = $file->getRelativePathname(); - $i++; - } - - // saving group files - foreach ($groups as $i => $tests) { - $filename = $this->saveTo . $i; - $this->printTaskInfo("Writing $filename"); - file_put_contents($filename, implode("\n", $tests)); - } + $this->splitToGroupFiles( + array_map( + static function (SplFileInfo $fileInfo): string { + return $fileInfo->getRelativePathname(); + }, + $this->filter(iterator_to_array($files->getIterator())) + ) + ); } /** diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 9345ba9..2cd1a14 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -213,4 +213,31 @@ protected function doCodeceptLoaderExists(): bool { return class_exists('\Codeception\Test\Loader'); } + + /** + * Splitting array of files to the group files + * @param string[] $files - the relative path of the Testfile with or without test function + * @example $this->splitToGroupFiles(['tests/FooCest.php', 'tests/BarTest.php:testBarReturn']); + */ + protected function splitToGroupFiles(array $files): void + { + $i = 0; + $groups = []; + + $this->printTaskInfo('Processing ' . count($files) . ' files'); + + // splitting tests by groups + /** @var string $file */ + foreach ($files as $file) { + $groups[($i % $this->numGroups) + 1][] = $file; + $i++; + } + + // saving group files + foreach ($groups as $i => $tests) { + $filename = $this->saveTo . $i; + $this->printTaskInfo("Writing $filename"); + file_put_contents($filename, implode("\n", $tests)); + } + } } diff --git a/src/Splitter/TestsSplitterTrait.php b/src/Splitter/TestsSplitterTrait.php index b8cfed7..84f4af2 100644 --- a/src/Splitter/TestsSplitterTrait.php +++ b/src/Splitter/TestsSplitterTrait.php @@ -4,14 +4,16 @@ namespace Codeception\Task\Splitter; +use Robo\Collection\CollectionBuilder; + trait TestsSplitterTrait { /** * @param int $numGroups * - * @return TestsSplitterTask + * @return TestsSplitterTask|CollectionBuilder */ - protected function taskSplitTestsByGroups(int $numGroups): TestsSplitterTask + protected function taskSplitTestsByGroups(int $numGroups) { return $this->task(TestsSplitterTask::class, $numGroups); } @@ -19,20 +21,30 @@ protected function taskSplitTestsByGroups(int $numGroups): TestsSplitterTask /** * @param int $numGroups * - * @return TestFileSplitterTask + * @return TestFileSplitterTask|CollectionBuilder */ - protected function taskSplitTestFilesByGroups(int $numGroups): TestFileSplitterTask + protected function taskSplitTestFilesByGroups(int $numGroups) { return $this->task(TestFileSplitterTask::class, $numGroups); } /** - * @param $numGroups + * @param int $numGroups * - * @return TestFileSplitterTask + * @return TestFileSplitterTask|CollectionBuilder */ - protected function taskSplitTestsByTime($numGroups): TestFileSplitterTask + protected function taskSplitTestsByTime(int $numGroups) { return $this->task(SplitTestsByTimeTask::class, $numGroups); } + + /** + * @param int $numGroups + * + * @return TestFileSplitterTask|CollectionBuilder + */ + protected function taskSplitFailedTests(int $numGroups) + { + return $this->task(FailedTestSplitterTask::class, $numGroups); + } } diff --git a/tests/Extension/FailedTestsReporterTest.php b/tests/Extension/FailedTestsReporterTest.php new file mode 100644 index 0000000..2daf101 --- /dev/null +++ b/tests/Extension/FailedTestsReporterTest.php @@ -0,0 +1,81 @@ + 'tests/acceptance/bar/baz.php:testA',], + ['testname' => 'tests/acceptance/bar/baz.php:testB',], + ['testname' => 'tests/acceptance/bar/baz.php:testC',], + ['testname' => 'tests/acceptance/bar/baz.php:testD',], + ['testname' => 'tests/acceptance/bar/baz.php:testE',], + ['testname' => 'tests/acceptance/bar/baz.php:testF',], + ['testname' => 'tests/acceptance/bar/baz.php:testG',], + ['testname' => 'tests/acceptance/bar/baz.php:testH',], + ]; + + /** + * @covers ::endRun + */ + public function testEndRun(): void + { + $reporter = $this->getMockBuilder(FailedTestsReporter::class) + ->disableOriginalConstructor() + ->onlyMethods(['getTestname', 'getLogDir']) + ->getMock(); + + $reporter->method('getLogDir')->willReturn(TEST_PATH . '/result/'); + + // prepare Mocks for Test + $testEvents = []; + foreach ($this->failedTests as $test) { + $eventMock = $this->getMockBuilder(FailEvent::class) + ->disableOriginalConstructor() + ->getMock(); + + $testEvents[] = [ + 'mock' => $eventMock, + 'testname' => $test['testname'] + ]; + } + + // get Testname by the TestEventMock + $reporter + ->method('getTestname') + ->withConsecutive( + ...array_map( + static function (FailEvent $event): array { + return [$event]; + }, + array_column($testEvents, 'mock') + ) + ) + ->willReturnOnConsecutiveCalls(...array_column($testEvents, 'testname')); + + foreach ($testEvents as $event) { + $reporter->afterFail($event['mock']); + } + + $reporter->endRun(); + $file = TEST_PATH . '/result/failedTests.txt'; + $this->assertFileExists($file); + $content = explode(PHP_EOL, file_get_contents($file)); + $this->assertCount(8, $content); + } + + protected function tearDown(): void + { + parent::tearDown(); // TODO: Change the autogenerated stub + unlink(TEST_PATH . '/result/failedTests.txt'); + } +} diff --git a/tests/Splitter/FailedTestSplitterTaskTest.php b/tests/Splitter/FailedTestSplitterTaskTest.php new file mode 100644 index 0000000..969f7a1 --- /dev/null +++ b/tests/Splitter/FailedTestSplitterTaskTest.php @@ -0,0 +1,83 @@ +setLogger(new Logger(new NullOutput())); + $task->setReportPath('tests/_output/') + ->groupsTo(TEST_PATH . '/result/group_'); + + $this->expectException(RuntimeException::class); + $task->run(); + } + + /** + * @covers ::run + */ + public function testRun(): void + { + $expected = 4; + $task = new FailedTestSplitterTask($expected); + $task->setLogger(new Logger(new NullOutput())); + $groupTo = TEST_PATH . '/result/group_'; + $task + ->setReportPath(TEST_PATH . '/fixtures/' . FailedTestsReporter::REPORT_NAME) + ->groupsTo($groupTo) + ->run(); + + $countedFiles = 0; + for ($i = 1; $i <= $expected; $i++) { + $this->assertFileExists($groupTo . $i); + $countedFiles += count( + explode( + PHP_EOL, + file_get_contents($groupTo . $i) + ) + ); + } + $this->assertSame( + 8, + $countedFiles, + "Expected 8 tests but got {$countedFiles} tests." + ); + $this->assertFileDoesNotExist($groupTo . ($expected + 1)); + } + + /** + * @covers ::setReportPath + */ + public function testSetReportPathWillThrowExceptionWithEmptyPath(): void + { + $task = new FailedTestSplitterTask(5); + $task->setLogger(new Logger(new NullOutput())); + $this->expectException(InvalidArgumentException::class); + $task->setReportPath(''); + } + + protected function tearDown(): void + { + parent::tearDown(); // TODO: Change the autogenerated stub + $finder = Finder::create() + ->files() + ->name('group_*'); + + foreach ($finder->in(TEST_PATH . '/result') as $file) { + unlink($file->getPathname()); + } + } +} diff --git a/tests/fixtures/failedTests.txt b/tests/fixtures/failedTests.txt new file mode 100644 index 0000000..e53018c --- /dev/null +++ b/tests/fixtures/failedTests.txt @@ -0,0 +1,8 @@ +tests/acceptance/bar/baz.php:testA +tests/acceptance/bar/baz.php:testB +tests/acceptance/bar/baz.php:testC +tests/acceptance/bar/baz.php:testD +tests/acceptance/bar/baz.php:testE +tests/acceptance/bar/baz.php:testF +tests/acceptance/bar/baz.php:testG +tests/acceptance/bar/baz.php:testH \ No newline at end of file From 1f066dd2f5b0436ba8de363a9e8e1a064ebb06a4 Mon Sep 17 00:00:00 2001 From: KJunker Date: Mon, 26 Jul 2021 17:07:42 +0200 Subject: [PATCH 12/52] Hotfix/remove return from tests splitter task run (#68) * Create php.yml * fixing return type for run method in TestsSplitterTask.php --- src/Splitter/TestsSplitterTask.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Splitter/TestsSplitterTask.php b/src/Splitter/TestsSplitterTask.php index a51c56f..020000a 100644 --- a/src/Splitter/TestsSplitterTask.php +++ b/src/Splitter/TestsSplitterTask.php @@ -31,6 +31,10 @@ class TestsSplitterTask extends TestsSplitter { + /** + * @return bool|null + * @throws \Robo\Exception\TaskException + */ public function run() { $this->claimCodeceptionLoaded(); @@ -148,7 +152,7 @@ public function run() file_put_contents($filename, implode("\n", $tests)); } - return true; + return null; } /** From 30dd28543db5b860deadcf63d82a5dcc48141f8a Mon Sep 17 00:00:00 2001 From: KJunker Date: Fri, 6 Aug 2021 09:59:12 +0200 Subject: [PATCH 13/52] Bugfix/fix extension failed tests writer (#75) * Create php.yml * Add a unique suffix for failed tests report files * add a new merger to merge the created report files from the FailedTestsMergerTask into one file * updated the FailedTestSplitterTask * Fixed issue in FailedTestSplitterTask * Updated README.md for usage of FailedTests Reports * Created new abtract class for the mergers * Created new abtract class for the mergers --- README.md | 17 +- src/Extension/FailedTestsReporter.php | 21 +- src/Merger/AbstractMerger.php | 35 ++++ src/Merger/FailedTestsMergerTask.php | 122 +++++++++++ src/Merger/HtmlReportMerger.php | 8 +- src/Merger/ReportMerger.php | 5 + src/Merger/XmlReportMergerTask.php | 7 +- src/Splitter/FailedTestSplitterTask.php | 22 +- tests/Extension/FailedTestsReporterTest.php | 31 ++- tests/Merger/FailedTestsMergerTaskTest.php | 196 ++++++++++++++++++ tests/Splitter/FailedTestSplitterTaskTest.php | 6 +- 11 files changed, 427 insertions(+), 43 deletions(-) create mode 100644 src/Merger/AbstractMerger.php create mode 100644 src/Merger/FailedTestsMergerTask.php create mode 100644 tests/Merger/FailedTestsMergerTaskTest.php diff --git a/README.md b/README.md index 1e0f9b8..d466607 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,8 @@ this command need run all tests with `Codeception\Task\TimeReporter` for collect ### SplitFailedTests -Enable extension for collect failed tests if you use taskSplitFailedTests +Enable extension for collect failed tests if you use taskSplitFailedTests +The extension saves the report files into \Codeception\Configuration::outputDir() ``` extensions: @@ -89,15 +90,23 @@ extensions: - Codeception\Task\Extension\FailedTestsReporter ``` +Merge the created report files from the FailedTestsReporter into single file +```php +$this->taskMergeFailedTestsReports() + ->fromPathWithPattern(\Codeception\Configuration::outputDir(), '/failedTests_\w+\.txt$/') + ->into(\Codeception\Configuration::outputDir() . 'failedTests.txt') // absolute path with Filename + ->run(); +``` + Load the failed Tests from a reportfile into the groups: -- Default report path is: `Configuration::outputDir() . 'failedTests.txt'` ```php $this ->taskSplitFailedTests(5) - ->setReportPath('tests/_output/' . FailedTestsReporter::REPORT_NAME) - ->groupsTo('tests/_data/group_') + ->setReportPath(\Codeception\Configuration::outputDir() . 'failedTests.txt') // absoulute Path to Reportfile + ->groupsTo(\Codeception\Configuration::outputDir() . 'group_') ->run(); ``` + ### MergeXmlReports Mergex several XML reports: diff --git a/src/Extension/FailedTestsReporter.php b/src/Extension/FailedTestsReporter.php index 7044caa..af13077 100644 --- a/src/Extension/FailedTestsReporter.php +++ b/src/Extension/FailedTestsReporter.php @@ -11,7 +11,11 @@ use Codeception\Test\Descriptor; /** - * Class FailedTestsReporter - reports the failed tests to a reportfile + * Class FailedTestsReporter - reports the failed tests to a reportfile with + * a unique name for parallel execution. + * + * Pattern is '/failedTests_\w+\.\w+\.txt/' + * * Modify the codeception.yml to enable this extension: * extensions: * enabled: @@ -20,10 +24,7 @@ class FailedTestsReporter extends Extension { /** @var string */ - public const REPORT_NAME = 'failedTests.txt'; - - /** @var string $reportFile */ - private $reportFile = self::REPORT_NAME; + public const REPORT_NAME = 'failedTests'; /** @var array $failedTests */ private $failedTests = []; @@ -54,7 +55,7 @@ public function endRun(): void return; } - $file = $this->getLogDir() . $this->reportFile; + $file = $this->getLogDir() . $this->getUniqReportFile(); if (is_file($file)) { unlink($file); // remove old reportFile } @@ -72,4 +73,12 @@ public function getTestname(TestEvent $e): string return substr(str_replace($this->getRootDir(), '', $name), 1); } + + /** + * @return string + */ + public function getUniqReportFile(): string + { + return self::REPORT_NAME . '_' . uniqid('', true) . '.txt'; + } } diff --git a/src/Merger/AbstractMerger.php b/src/Merger/AbstractMerger.php new file mode 100644 index 0000000..7bd060d --- /dev/null +++ b/src/Merger/AbstractMerger.php @@ -0,0 +1,35 @@ +src = $src; + } + + /** + * @inheritDoc + */ + abstract public function from($fileName); + + /** + * @inheritDoc + */ + abstract public function into(string $fileName); + + /** + * @inheritDoc + */ + abstract public function run(); +} diff --git a/src/Merger/FailedTestsMergerTask.php b/src/Merger/FailedTestsMergerTask.php new file mode 100644 index 0000000..c360897 --- /dev/null +++ b/src/Merger/FailedTestsMergerTask.php @@ -0,0 +1,122 @@ +taskMergeFailedTestsReports() + * ->from(__DIR__ . 'tests/_data/Acme/failedTests_123.txt') + * ->from(__DIR__ . 'tests/_data/failedTests_foo.txt') + * ->from([__DIR__ . 'tests/_data/Acme/failedTests_bar.txt', __DIR__ . 'tests/_data/Acme/failedTests_baz.txt',]) + * ->fromPathWithPattern(__DIR__ . 'tests/_data/failed_1/', '/failedTests_\w+\.txt$/') + * ->fromPathWithPattern(__DIR__ . 'tests/_data/failed_2/', '/failedTests_\w+\.txt$/') + * ->into(__DIR__ . '/failedTests.txt') // absolute path with Filename + * ->run(); + * ?> + * ``` + */ +class FailedTestsMergerTask extends AbstractMerger +{ + public const DEFAULT_PATTERN = '/^failedTests_\w+\.\w+\.txt$/'; + + public $pathPatterns = []; + + /** + * @var string + */ + private $dest; + + /** @var string[] */ + protected $src = []; + + /** + * @param string[]|string $fileName + * @return FailedTestsMergerTask|void + */ + public function from($fileName): self + { + if (!(is_array($fileName) || is_string($fileName) || !empty($fileName))) { + throw new InvalidArgumentException( + 'The argument must be an array or string and could not be empty.' + ); + } + + $this->src = array_merge($this->src, (is_string($fileName) ? [$fileName] : $fileName)); + + return $this; + } + + /** + * Search all report files in path with default pattern or the given pattern + * @param string $path - The path where the report files exists + * @param string|null $pattern - The regex pattern for the files (optional) + * @return $this + */ + public function fromPathWithPattern(string $path, ?string $pattern = null): self + { + $this->pathPatterns[$path] = $pattern ?? self::DEFAULT_PATTERN; + + return $this; + } + + public function into(string $fileName): self + { + $this->dest = $fileName; + + return $this; + } + + public function run() + { + $content = []; + $files = array_merge($this->src, $this->searchFilesByPattern()); + foreach ($files as $file) { + if (!is_file($file)) { + continue; + } + $tmpContent = file_get_contents($file); + if (!$tmpContent) { + throw new RuntimeException( + 'Could not read content of reportfile: ' . $file + ); + } + $content[] = $tmpContent; + } + + if (!empty($content)) { + file_put_contents($this->dest, implode(PHP_EOL, $content)); + } + } + + /** + * Search the files by the given path and pattern + * @return array + */ + private function searchFilesByPattern(): array + { + $results = []; + foreach ($this->pathPatterns as $path => $pattern) { + $files = Finder::create() + ->files() + ->in($path) + ->name($pattern ?? self::DEFAULT_PATTERN); + foreach ($files->getIterator() as $splFileInfo) { + $results[] = $splFileInfo->getPathname(); + } + } + + return $results; + } +} diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php index a5254bc..1ca2f53 100644 --- a/src/Merger/HtmlReportMerger.php +++ b/src/Merger/HtmlReportMerger.php @@ -15,8 +15,9 @@ * Class MergeHTMLReportsTask * @author Kerimov Asif */ -class HtmlReportMerger extends BaseTask implements ReportMergerTaskInterface +class HtmlReportMerger extends AbstractMerger { + /** @var string[] */ protected $src = []; protected $dst; protected $countSuccess = 0; @@ -25,11 +26,6 @@ class HtmlReportMerger extends BaseTask implements ReportMergerTaskInterface protected $countIncomplete = 0; protected $previousLibXmlUseErrors; - public function __construct($src = []) - { - $this->src = $src; - } - public function from($fileName) { if (is_array($fileName)) { diff --git a/src/Merger/ReportMerger.php b/src/Merger/ReportMerger.php index 44c9fd5..b45da16 100644 --- a/src/Merger/ReportMerger.php +++ b/src/Merger/ReportMerger.php @@ -15,4 +15,9 @@ protected function taskMergeHTMLReports($src = []) { return $this->task(HtmlReportMerger::class, $src); } + + protected function taskMergeFailedTestsReports($src = []) + { + return $this->task(FailedTestsMergerTask::class, $src); + } } diff --git a/src/Merger/XmlReportMergerTask.php b/src/Merger/XmlReportMergerTask.php index ae7caf9..6515406 100644 --- a/src/Merger/XmlReportMergerTask.php +++ b/src/Merger/XmlReportMergerTask.php @@ -11,7 +11,7 @@ use Robo\Exception\TaskException; use Robo\Task\BaseTask; -class XmlReportMergerTask extends BaseTask implements ReportMergerTaskInterface +class XmlReportMergerTask extends AbstractMerger { /** * @var array|mixed @@ -32,11 +32,6 @@ class XmlReportMergerTask extends BaseTask implements ReportMergerTaskInterface /** @var DOMElement[][] */ protected $suites = []; - public function __construct(array $src = []) - { - $this->src = $src; - } - public function sumTime(): void { $this->summarizeTime = true; diff --git a/src/Splitter/FailedTestSplitterTask.php b/src/Splitter/FailedTestSplitterTask.php index dc2cf2d..74fe796 100644 --- a/src/Splitter/FailedTestSplitterTask.php +++ b/src/Splitter/FailedTestSplitterTask.php @@ -4,8 +4,7 @@ namespace Codeception\Task\Splitter; -use Codeception\Configuration; -use Codeception\Task\Extension\FailedTestsReporter; +use InvalidArgumentException; use RuntimeException; class FailedTestSplitterTask extends TestsSplitter @@ -14,12 +13,11 @@ class FailedTestSplitterTask extends TestsSplitter private $reportPath = null; /** - * @return string - * @throws \Codeception\Exception\ConfigurationException + * @return string - the absolute path to the report file with the failed tests */ public function getReportPath(): string { - return $this->reportPath ?? (Configuration::logDir() . FailedTestsReporter::REPORT_NAME); + return $this->reportPath; } /** @@ -30,9 +28,9 @@ public function run() $this->claimCodeceptionLoaded(); $reportPath = $this->getReportPath(); - if (!@file_exists($reportPath)) { + if (!@file_exists($reportPath) || !is_file($reportPath)) { throw new RuntimeException( - 'The reportfile "failedTests.txt" did not exists.' + 'The reportfile did not exists or is not a regular file.' ); } @@ -47,16 +45,16 @@ public function run() } /** - * @param string $reportPath + * @param string $reportFilePath * @return FailedTestSplitterTask */ - public function setReportPath(string $reportPath): FailedTestSplitterTask + public function setReportPath(string $reportFilePath): FailedTestSplitterTask { - if (empty($reportPath)) { - throw new \InvalidArgumentException('The reportPath could not be empty!'); + if (empty($reportFilePath)) { + throw new InvalidArgumentException('The reportPath could not be empty!'); } - $this->reportPath = $reportPath; + $this->reportPath = $reportFilePath; return $this; } diff --git a/tests/Extension/FailedTestsReporterTest.php b/tests/Extension/FailedTestsReporterTest.php index 2daf101..c7e6571 100644 --- a/tests/Extension/FailedTestsReporterTest.php +++ b/tests/Extension/FailedTestsReporterTest.php @@ -3,9 +3,10 @@ namespace Tests\Codeception\Task\Extension; use Codeception\Event\FailEvent; -use Codeception\Event\TestEvent; use Codeception\Task\Extension\FailedTestsReporter; use PHPUnit\Framework\TestCase; +use SplFileInfo; +use Symfony\Component\Finder\Finder; /** * Class FailedTestsReporterTest @@ -67,15 +68,35 @@ static function (FailEvent $event): array { } $reporter->endRun(); - $file = TEST_PATH . '/result/failedTests.txt'; - $this->assertFileExists($file); - $content = explode(PHP_EOL, file_get_contents($file)); + $files = Finder::create() + ->followLinks() + ->files() + ->in(TEST_PATH) + ->path('result') + ->name('/^failedTests_\w+\.\w+\.txt$/'); + + $iterator = $files->getIterator(); + $this->assertCount(1, $iterator); + $iterator->rewind(); + /** @var SplFileInfo $file */ + $file = $iterator->current(); + $this->assertTrue($file->isFile()); + $content = explode(PHP_EOL, file_get_contents($file->getPathname())); $this->assertCount(8, $content); } protected function tearDown(): void { parent::tearDown(); // TODO: Change the autogenerated stub - unlink(TEST_PATH . '/result/failedTests.txt'); + $files = Finder::create() + ->followLinks() + ->files() + ->in(TEST_PATH) + ->path('result') + ->name('/^failedTests_\w+\.\w+\.txt$/'); + + foreach ($files->getIterator() as $file) { + unlink($file->getPathname()); + } } } diff --git a/tests/Merger/FailedTestsMergerTaskTest.php b/tests/Merger/FailedTestsMergerTaskTest.php new file mode 100644 index 0000000..f3d25ef --- /dev/null +++ b/tests/Merger/FailedTestsMergerTaskTest.php @@ -0,0 +1,196 @@ + '/foo_\w+\.txt/', + 'bar' => '/bar_\w+\.txt/', + 'baz' => '/baz_\w+\.txt/', + ]; + + private static $testContent = [ + 'tests/acceptance/%s/baz.php:testA', + 'tests/acceptance/%s/baz.php:testB', + 'tests/acceptance/%s/baz.php:testC', + 'tests/acceptance/%s/baz.php:testD', + 'tests/acceptance/%s/baz.php:testE', + 'tests/acceptance/%s/baz.php:testF', + 'tests/acceptance/%s/baz.php:testG', + 'tests/acceptance/%s/baz.php:testH', + ]; + + private static $testFiles = []; + + /** + * Prepare the test files and directories + */ + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + $tmpDir = sys_get_temp_dir(); + foreach (self::$tmpDirsPattern as $dir => $pattern) { + $tempDir = $tmpDir . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR; + if (!is_dir($tempDir)) { + mkdir($tempDir); + } + $i = 1; + while ($i <= self::TEST_FILES_PER_DIR) { + $tempfile = $tempDir . $dir . '_unit' . $i++ . '.txt'; + file_put_contents( + $tempfile, + implode( + PHP_EOL, + array_map( + static function (string $filename) use ($dir): string { + return sprintf($filename, $dir); + }, + self::$testContent + ) + ) + ); + self::$testFiles[] = $tempfile; + } + } + } + + /** + * @covers ::run + */ + public function testRunSingleFile(): void + { + $tmpDir = sys_get_temp_dir() . '/foz/'; + $testFile = $tmpDir . 'foz_123456.txt'; + + if (!is_dir($tmpDir)) { + mkdir($tmpDir); + } + + $this->putContents($testFile); + $task = new FailedTestsMergerTask(); + $task->setLogger(new Logger(new NullOutput())); + $task + ->from($testFile) + ->into(self::EXPECTED_TEST_MERGED_FILE) + ->run(); + + $this->assertFileExists(self::EXPECTED_TEST_MERGED_FILE); + $content = explode(PHP_EOL, file_get_contents(self::EXPECTED_TEST_MERGED_FILE)); + $this->assertCount( + count(self::$testContent), + $content + ); + } + + public function testRunWithPathAndFilePatterns(): void + { + $task = new FailedTestsMergerTask(); + $task->setLogger(new Logger(new NullOutput())); + + foreach (self::$tmpDirsPattern as $path => $pattern) { + $task->fromPathWithPattern( + sys_get_temp_dir() . DIRECTORY_SEPARATOR . $path, + $pattern + ); + } + + $task + ->into(self::EXPECTED_TEST_MERGED_FILE) + ->run(); + + $this->assertFileExists(self::EXPECTED_TEST_MERGED_FILE); + $this->assertCount( + (count(self::$testContent) * count(self::$testFiles)), + explode(PHP_EOL, file_get_contents(self::EXPECTED_TEST_MERGED_FILE)) + ); + } + + public function testRunWithFileAndArrayAndPathWithPatterns(): void + { + $tmpDir = sys_get_temp_dir() . '/foz/'; + $testFile = $tmpDir . 'foz_123456.txt'; + + if (!is_dir($tmpDir)) { + mkdir($tmpDir); + } + $this->putContents($testFile); + + $fileData = []; + $i = 0; + while ($i < self::TEST_FILES_PER_DIR) { + $testFile = $tmpDir . 'foz_' . (123456 + ++$i) . '.txt'; + $this->putContents($testFile); + $fileData[] = $testFile; + } + + $task = new FailedTestsMergerTask(); + $task->setLogger(new Logger(new NullOutput())); + $task->from($testFile); + $task->from($fileData); + foreach (self::$tmpDirsPattern as $path => $pattern) { + $task->fromPathWithPattern( + sys_get_temp_dir() . DIRECTORY_SEPARATOR . $path, + $pattern + ); + } + + $task + ->into(self::EXPECTED_TEST_MERGED_FILE) + ->run(); + + $this->assertFileExists(self::EXPECTED_TEST_MERGED_FILE); + $this->assertCount( + ( + count(self::$testContent) * ( + count(self::$testFiles) + + count($fileData) + + count([$testFile]) + ) + ), + explode(PHP_EOL, file_get_contents(self::EXPECTED_TEST_MERGED_FILE)) + ); + } + + public function tearDown(): void + { + parent::tearDown(); // TODO: Change the autogenerated stub + unlink(self::EXPECTED_TEST_MERGED_FILE); + } + + public static function tearDownAfterClass(): void + { + parent::tearDownAfterClass(); // TODO: Change the autogenerated stub + foreach (self::$testFiles as $file) { + unlink($file); + } + } + + /** + * @param string $testFile + */ + protected function putContents(string $testFile): void + { + file_put_contents( + $testFile, + implode( + PHP_EOL, + array_map( + static function (string $filename): string { + return sprintf($filename, 'foz'); + }, + self::$testContent + ) + ) + ); + } +} diff --git a/tests/Splitter/FailedTestSplitterTaskTest.php b/tests/Splitter/FailedTestSplitterTaskTest.php index 969f7a1..1b77658 100644 --- a/tests/Splitter/FailedTestSplitterTaskTest.php +++ b/tests/Splitter/FailedTestSplitterTaskTest.php @@ -2,13 +2,11 @@ namespace Tests\Codeception\Task\Splitter; -use Codeception\Task\Extension\FailedTestsReporter; use Codeception\Task\Splitter\FailedTestSplitterTask; use Codeception\Task\Splitter\TestsSplitter; use Consolidation\Log\Logger; use InvalidArgumentException; use PHPUnit\Framework\TestCase; -use Robo\Exception\TaskException; use RuntimeException; use Symfony\Component\Console\Output\NullOutput; use Symfony\Component\Finder\Finder; @@ -19,7 +17,7 @@ public function testRunWillFailIfReportFileDoesNotExists(): void { $task = new FailedTestSplitterTask(5); $task->setLogger(new Logger(new NullOutput())); - $task->setReportPath('tests/_output/') + $task->setReportPath('tests/_output/failedTests.txt') ->groupsTo(TEST_PATH . '/result/group_'); $this->expectException(RuntimeException::class); @@ -36,7 +34,7 @@ public function testRun(): void $task->setLogger(new Logger(new NullOutput())); $groupTo = TEST_PATH . '/result/group_'; $task - ->setReportPath(TEST_PATH . '/fixtures/' . FailedTestsReporter::REPORT_NAME) + ->setReportPath(TEST_PATH . '/fixtures/failedTests.txt') ->groupsTo($groupTo) ->run(); From ed5796bddaaa8fa426a054dc1b50daf7d9fa1533 Mon Sep 17 00:00:00 2001 From: KJunker Date: Fri, 6 Aug 2021 10:00:42 +0200 Subject: [PATCH 14/52] Bugfix/merge html correction execution time (#74) * Create php.yml * Building Test for HTMLMerger, find error by summary of Test Execution Time * Sum the execution Time for the merged Reports * Codestyle fixing Co-authored-by: Michael Bodnarchuk --- src/Exception/KeyNotFoundException.php | 12 + src/Exception/XPathExpressionException.php | 15 + src/Merger/HtmlReportMerger.php | 147 ++++- tests/Merger/HtmlReportMergerTest.php | 61 ++ .../reports/html/expected_report.html | 528 ++++++++++++++++++ tests/fixtures/reports/html/report_1.html | 317 +++++++++++ tests/fixtures/reports/html/report_2.html | 292 ++++++++++ tests/fixtures/reports/html/report_3.html | 319 +++++++++++ 8 files changed, 1675 insertions(+), 16 deletions(-) create mode 100644 src/Exception/KeyNotFoundException.php create mode 100644 src/Exception/XPathExpressionException.php create mode 100644 tests/Merger/HtmlReportMergerTest.php create mode 100644 tests/fixtures/reports/html/expected_report.html create mode 100644 tests/fixtures/reports/html/report_1.html create mode 100644 tests/fixtures/reports/html/report_2.html create mode 100644 tests/fixtures/reports/html/report_3.html diff --git a/src/Exception/KeyNotFoundException.php b/src/Exception/KeyNotFoundException.php new file mode 100644 index 0000000..2e1a000 --- /dev/null +++ b/src/Exception/KeyNotFoundException.php @@ -0,0 +1,12 @@ +src = $src; + } + + /** + * @param string[]|string $fileName - a single report file or array of report files + * @return $this|HtmlReportMerger + */ + public function from($fileName): self { if (is_array($fileName)) { $this->src = array_merge($fileName, $this->src); @@ -36,7 +65,11 @@ public function from($fileName) return $this; } - public function into($fileName) + /** + * @param string $fileName + * @return $this|HtmlReportMerger + */ + public function into(string $fileName): self { $this->dst = $fileName; return $this; @@ -57,18 +90,34 @@ public function run() //read first source file as main $dstHTML = new DOMDocument(); $dstHTML->loadHTMLFile($this->src[0], LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - + $this->countExecutionTime($dstHTML); //main node for all table rows - $table = (new \DOMXPath($dstHTML))->query("//table")->item(0); - + $nodeList = (new DOMXPath($dstHTML))->query("//table"); + if (!$nodeList) { + throw XPathExpressionException::malformedXPath("//table"); + } + $index = 0; + /** @var DOMNode $table */ + $table = $nodeList->item($index); + if (null === $table) { + throw new KeyNotFoundException('Could not find table item at pos: ' . $index); + } //prepare reference nodes for envs - $refnodes = (new DOMXPath($dstHTML))->query("//div[@class='layout']/table/tr[not(@class)]"); - + $xpathExprRefNodes = "//div[@class='layout']/table/tr[not(@class)]"; + $refnodes = (new DOMXPath($dstHTML))->query($xpathExprRefNodes); + if (!$refnodes) { + throw XPathExpressionException::malformedXPath($xpathExprRefNodes); + } for ($k = 1, $kMax = count($this->src); $k < $kMax; $k++) { $srcHTML = new DOMDocument(); $src = $this->src[$k]; $srcHTML->loadHTMLFile($src, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - $suiteNodes = (new DOMXPath($srcHTML))->query("//div[@class='layout']/table/tr"); + $this->countExecutionTime($srcHTML); + $xpathExprSuiteNodes = "//div[@class='layout']/table/tr"; + $suiteNodes = (new DOMXPath($srcHTML))->query($xpathExprSuiteNodes); + if (!$suiteNodes) { + throw XPathExpressionException::malformedXPath($xpathExprSuiteNodes); + } $j = 0; foreach ($suiteNodes as $suiteNode) { if ($suiteNode->getAttribute('class') == '') { @@ -86,13 +135,14 @@ public function run() } /** - * The next 5 functions correct our almost finished final report + * The next 6 functions correct our almost finished final report */ $this->countSummary($dstHTML); $this->moveSummaryTable($dstHTML, $table); $this->updateSummaryTable($dstHTML); $this->updateToolbarTable($dstHTML); $this->updateButtons($dstHTML); + $this->updateHeaderLine($dstHTML); //save final report file_put_contents($this->dst, $dstHTML->saveHTML()); @@ -102,12 +152,72 @@ public function run() } /** - * This function counts all types of tests' scenarios and writes in class members - * @param $dstFile DOMDocument - destination file + * This function sums all execution time of each report + * @param DOMDocument $dstFile + * @throws XPathExpressionException */ - private function countSummary($dstFile) + private function countExecutionTime(DOMDocument $dstFile): void { - $tests = (new \DOMXPath($dstFile))->query("//table/tr[contains(@class,'scenarioRow')]"); + $xpathHeadline = "//h1[text() = 'Codeception Results ']"; + $nodeList = (new DOMXPath($dstFile)) + ->query($xpathHeadline); + if (!$nodeList) { + throw XPathExpressionException::malformedXPath($xpathHeadline); + } + $pregResult = preg_match( + '/^Codeception Results .* \((?\d+\.\d+)s\)$/', + $nodeList[0]->nodeValue, + $matches + ); + + if (false === $pregResult) { + throw new RuntimeException('Regexpression is malformed'); + } + + if (0 === $pregResult) { + return; + } + + $this->executionTimeSum += (float)$matches['timesum']; + } + + /** + * @param DOMDocument $dstFile + * @throws XPathExpressionException + */ + private function updateHeaderLine(DOMDocument $dstFile): void + { + $xpathHeadline = "//h1[text() = 'Codeception Results ']"; + $nodeList = (new DOMXPath($dstFile)) + ->query($xpathHeadline); + if (!$nodeList) { + throw XPathExpressionException::malformedXPath($xpathHeadline); + } + /** @var DOMNode $executionTimeNode */ + $executionTimeNode = $nodeList[0]->childNodes[1]->childNodes[1]; + /** @var DOMAttr $statusAttr */ + $statusNode = $nodeList[0]->childNodes[1]->childNodes[0]; + $statusAttr = $statusNode->attributes[0]; + if (0 !== ($this->countFailed + $this->countIncomplete + $this->countSkipped)) { + $statusNode->nodeValue = 'NOT OK'; + $statusAttr->value = 'color: red'; + } + $executionTimeNode->nodeValue = " ({$this->executionTimeSum}s)"; + } + + /** + * This function counts all types of tests' scenarios and writes in class members + * @param DOMDocument $dstFile - destination file + * @throws XPathExpressionException + */ + private function countSummary(DOMDocument $dstFile): void + { + $xpathExprTests = "//table/tr[contains(@class,'scenarioRow')]"; + /** @var DOMNodeList $tests */ + $tests = (new DOMXPath($dstFile))->query($xpathExprTests); + if (!$tests) { + throw XPathExpressionException::malformedXPath($xpathExprTests); + } foreach ($tests as $test) { $class = str_replace('scenarioRow ', '', $test->getAttribute('class')); switch ($class) { @@ -150,7 +260,7 @@ private function updateSummaryTable(DOMDocument $dstFile) */ private function moveSummaryTable(DOMDocument $dstFile, DOMNode $node) { - $summaryTable = (new \DOMXPath($dstFile))->query("//div[@id='stepContainerSummary']") + $summaryTable = (new DOMXPath($dstFile))->query("//div[@id='stepContainerSummary']") ->item(0)->parentNode->parentNode; $node->appendChild($dstFile->importNode($summaryTable, true)); } @@ -162,7 +272,7 @@ private function moveSummaryTable(DOMDocument $dstFile, DOMNode $node) */ private function updateToolbarTable(DOMDocument $dstFile) { - $dstFile = new \DOMXPath($dstFile); + $dstFile = new DOMXPath($dstFile); $pathFor = static function (string $type): string { return "//ul[@id='toolbar-filter']//a[@title='$type']"; }; @@ -175,10 +285,15 @@ private function updateToolbarTable(DOMDocument $dstFile) /** * This function updates "+" and "-" button for viewing test steps in final report * @param $dstFile DOMDocument - destination file + * @throws XPathExpressionException */ private function updateButtons(DOMDocument $dstFile) { - $nodes = (new \DOMXPath($dstFile))->query("//div[@class='layout']/table/tr[contains(@class, 'scenarioRow')]"); + $xpathExprNodes = "//div[@class='layout']/table/tr[contains(@class, 'scenarioRow')]"; + $nodes = (new DOMXPath($dstFile))->query($xpathExprNodes); + if (!$nodes) { + throw XPathExpressionException::malformedXPath($xpathExprNodes); + } for ($i = 2; $i < $nodes->length; $i += 2) { $n = $i / 2 + 1; $p = $nodes->item($i)->childNodes->item(1)->childNodes->item(1); diff --git a/tests/Merger/HtmlReportMergerTest.php b/tests/Merger/HtmlReportMergerTest.php new file mode 100644 index 0000000..129a563 --- /dev/null +++ b/tests/Merger/HtmlReportMergerTest.php @@ -0,0 +1,61 @@ +setLogger(new Logger(new NullOutput())); + $resultReport = TEST_PATH . '/result/report.html'; + $task + ->from( + [ + $reportPath . 'report_1.html', + $reportPath . 'report_2.html', + $reportPath . 'report_3.html', + ] + ) + ->into($resultReport) + ->run(); + + $this->assertFileExists($resultReport); + + //read first source file as main + $dstHTML = new DOMDocument(); + $dstHTML->loadHTMLFile($resultReport, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + /** @var DOMNodeList $values */ + $values = (new DOMXPath($dstHTML)) + ->query("//*[contains(@class,'scenarioSuccessValue')]"); + + $this->assertCount(1, $values); + $this->assertSame($expectedSuccess, (int)$values[0]->nodeValue); + + $values = (new DOMXPath($dstHTML)) + ->query("//h1[text() = 'Codeception Results ']"); + preg_match( + '/^Codeception Results .* \((?\d+\.\d+)s\)$/', + $values[0]->nodeValue, + $matches + ); + + $this->assertSame($expectedTimeInSeconds, (float)$matches['timesum']); + } +} diff --git a/tests/fixtures/reports/html/expected_report.html b/tests/fixtures/reports/html/expected_report.html new file mode 100644 index 0000000..0c496f3 --- /dev/null +++ b/tests/fixtures/reports/html/expected_report.html @@ -0,0 +1,528 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (234.98s)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Acceptance (cloud-stage) Tests

+
+

+ + ExpleogroupCest » Student apply expleogroup and + choose interest 103.29s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ I acting as "Vincenzo" +

+ +

+ I set locale "fr"

+ +

+ I visit "Page\Applications\ApplicationFormPage","","appsource=expleogroup" +

+ +

+ Page\Applications\ApplicationFormPage: start + application {"title":"La première étape de votre candidature","button":"Commencer"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + personal details {"title":"Votre profil","birthdate":"Votre date de naissance","address":"Votre adresse","gender":"Votre genre"},{"gender":"Masculin","address":"7 cité paradis PARIS"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + education {"title":"Vos études","education":"","diploma":"Quel est votre niveau de diplôme le plus élevé ?","frenchLevel":"","englishLevel":"Quel est votre niveau d’anglais ?"},{"diploma":"Bac+2","englishLevel":"Intermédiaire (B1-B2)"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + learning resources {"title":"La formation en ligne et vous","followedCourses":"Avez-vous déjà suivi des cours en ligne ?","followedCoursesSubject":"Sur quels sujets et sur quels sites ?","resources":"Pour cette formation, vous aurez accès à :"},{"followedCourses":"Oui","followedCoursesSubject":"Coursera","resources":["Un endroit calme","Un ordinateur","Un micro"]} +

+ +

+ Page\Applications\ApplicationFormPage: fill + motivation {"title":"Votre nouvelle carrière","professionalProject":"Détaillez votre projet professionnel (à court, moyen et long-terme)","cv":"Ajoutez votre CV","linkedin":"","foundEmployer":"","desiredStartDate":"","nextButton":"Envoyer la candidature"},{"cv":"cv.pdf"} +

+ +

+ Page\Applications\ApplicationFormPage: see + application end {"title":"Merci de votre intérêt pour nos formations !","button":"RETOUR À L’ACCUEIL"} +

+ +
+
+

Api (cloud-stage) Tests

+
+

+ + AnalyticsCest » Get analytics with paths code + 2.44s

+
+ + + + + + + + + + + + + +

+ I acting as "Business\Users\BotAdmin" +

+ +

+ I get analytics "PATHS",[],"0-1000" +

+ +

+ I see analytics "PATHS" +

+ +
+ + +
+

Bdd (cloud-stage) Tests

+
+

+ + Course » Member can follow a course and pass a + quiz 129.25s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    As a member +
    I want to follow a + course and pass a quiz
    In order to make + progress on the platform

+ Given i am "member"

+ +

+ When i choose a course

+ +

+ And i follow a course

+ +

+ And i pass a quiz

+ +

+ Then i see that i have followed the course

+ +

+ And i see that i have passed the quiz

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:3
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_1.html b/tests/fixtures/reports/html/report_1.html new file mode 100644 index 0000000..d91f6fd --- /dev/null +++ b/tests/fixtures/reports/html/report_1.html @@ -0,0 +1,317 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (103.29s)

+ + + + + + + + + + + + + + + +
+

Acceptance (cloud-stage) Tests

+
+

+ + ExpleogroupCest » Student apply expleogroup and choose interest 103.29s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ I acting as "Vincenzo"

+ +

+ I set locale "fr"

+ +

+ I visit "Page\Applications\ApplicationFormPage","","appsource=expleogroup"

+ +

+ Page\Applications\ApplicationFormPage: start application {"title":"La première étape de votre candidature","button":"Commencer"}

+ +

+ Page\Applications\ApplicationFormPage: fill personal details {"title":"Votre profil","birthdate":"Votre date de naissance","address":"Votre adresse","gender":"Votre genre"},{"gender":"Masculin","address":"7 cité paradis PARIS"}

+ +

+ Page\Applications\ApplicationFormPage: fill education {"title":"Vos études","education":"","diploma":"Quel est votre niveau de diplôme le plus élevé ?","frenchLevel":"","englishLevel":"Quel est votre niveau d’anglais ?"},{"diploma":"Bac+2","englishLevel":"Intermédiaire (B1-B2)"}

+ +

+ Page\Applications\ApplicationFormPage: fill learning resources {"title":"La formation en ligne et vous","followedCourses":"Avez-vous déjà suivi des cours en ligne ?","followedCoursesSubject":"Sur quels sujets et sur quels sites ?","resources":"Pour cette formation, vous aurez accès à :"},{"followedCourses":"Oui","followedCoursesSubject":"Coursera","resources":["Un endroit calme","Un ordinateur","Un micro"]}

+ +

+ Page\Applications\ApplicationFormPage: fill motivation {"title":"Votre nouvelle carrière","professionalProject":"Détaillez votre projet professionnel (à court, moyen et long-terme)","cv":"Ajoutez votre CV","linkedin":"","foundEmployer":"","desiredStartDate":"","nextButton":"Envoyer la candidature"},{"cv":"cv.pdf"}

+ +

+ Page\Applications\ApplicationFormPage: see application end {"title":"Merci de votre intérêt pour nos formations !","button":"RETOUR À L’ACCUEIL"}

+ +
+
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_2.html b/tests/fixtures/reports/html/report_2.html new file mode 100644 index 0000000..5e9d9dd --- /dev/null +++ b/tests/fixtures/reports/html/report_2.html @@ -0,0 +1,292 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (2.44s)

+ + + + + + + + + + + + + + + + + + + + +
+

Api (cloud-stage) Tests

+
+

+ + AnalyticsCest » Get analytics with paths code 2.44s

+
+ + + + + + + + + + + + + +

+ I acting as "Business\Users\BotAdmin"

+ +

+ I get analytics "PATHS",[],"0-1000"

+ +

+ I see analytics "PATHS"

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_3.html b/tests/fixtures/reports/html/report_3.html new file mode 100644 index 0000000..db1be8e --- /dev/null +++ b/tests/fixtures/reports/html/report_3.html @@ -0,0 +1,319 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (129.25s)

+ + + + + + + + + + + + + + + + + + + + + +
+

Bdd (cloud-stage) Tests

+
+

+ + Course » Member can follow a course and pass a quiz 129.25s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    As a member
    I want to follow a course and pass a quiz
    In order to make progress on the platform

+ Given i am "member"

+ +

+ When i choose a course

+ +

+ And i follow a course

+ +

+ And i pass a quiz

+ +

+ Then i see that i have followed the course

+ +

+ And i see that i have passed the quiz

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + From 7fa164016db5894bf0363c898984e20a8173d2de Mon Sep 17 00:00:00 2001 From: Caroline BUZENET Date: Fri, 6 Aug 2021 10:01:12 +0200 Subject: [PATCH 15/52] testsFrom() method allow string or array (#73) --- src/Splitter/TestsSplitter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 2cd1a14..2259e60 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -16,7 +16,7 @@ abstract class TestsSplitter extends BaseTask protected $numGroups; /** @var string */ protected $projectRoot = '.'; - /** @var string */ + /** @var string|array */ protected $testsFrom = 'tests'; /** @var string */ protected $saveTo = 'tests/_data/paracept_'; @@ -59,7 +59,7 @@ public function projectRoot(string $path): TestsSplitter return $this; } - public function testsFrom(string $path): TestsSplitter + public function testsFrom(string|array $path): TestsSplitter { $this->testsFrom = $path; From 8fe2370f834592de89276c7e08214bed041380bf Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Fri, 6 Aug 2021 11:05:10 +0300 Subject: [PATCH 16/52] Revert "testsFrom() method allow string or array (#73)" (#77) This reverts commit 7fa164016db5894bf0363c898984e20a8173d2de. --- src/Splitter/TestsSplitter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 2259e60..2cd1a14 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -16,7 +16,7 @@ abstract class TestsSplitter extends BaseTask protected $numGroups; /** @var string */ protected $projectRoot = '.'; - /** @var string|array */ + /** @var string */ protected $testsFrom = 'tests'; /** @var string */ protected $saveTo = 'tests/_data/paracept_'; @@ -59,7 +59,7 @@ public function projectRoot(string $path): TestsSplitter return $this; } - public function testsFrom(string|array $path): TestsSplitter + public function testsFrom(string $path): TestsSplitter { $this->testsFrom = $path; From db609ea240524b6c463b292917e5dd0ff8597617 Mon Sep 17 00:00:00 2001 From: Caroline BUZENET Date: Fri, 6 Aug 2021 10:21:35 +0200 Subject: [PATCH 17/52] Feat tests from allow string or array (#78) * testsFrom() method allow string or array * testsFrom() method allow string or array --- src/Splitter/TestsSplitter.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 2cd1a14..28b0471 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -16,7 +16,7 @@ abstract class TestsSplitter extends BaseTask protected $numGroups; /** @var string */ protected $projectRoot = '.'; - /** @var string */ + /** @var string[]|string */ protected $testsFrom = 'tests'; /** @var string */ protected $saveTo = 'tests/_data/paracept_'; @@ -59,7 +59,11 @@ public function projectRoot(string $path): TestsSplitter return $this; } - public function testsFrom(string $path): TestsSplitter + /** + * @param string[]|string $path - a single path or array of paths + * @return $this|TestsSplitter + */ + public function testsFrom($path): TestsSplitter { $this->testsFrom = $path; From 3a046b691845d06748da9e54b07b74cf856083fc Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Tue, 10 Aug 2021 00:36:47 +0300 Subject: [PATCH 18/52] add changelog (#80) --- CHANGELOG.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ed059d4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,81 @@ +## [1.2.0](1.2.0) + +- Bugfix for extension FailedTestsReporter and new FailedTestsMergerTask [#75](https://github.com/Codeception/robo-paracept/pull/75) + - generated Files will not be overwriten anymore + - each generated File has now a uniqid-suffix (PHP Function uniqid('', true)) + - merge generated report files from FailedTestsReporter into single file + - posibility to merge also another files into a single file + + +- Bugfix src/Splitter/TestsSplitter.php::testsFrom [#78](https://github.com/Codeception/robo-paracept/pull/78) @ccsuperstar + - revert string type hint and allow array or string again + +## [1.1.1](https://github.com/Codeception/robo-paracept/releases/tag/1.1.1) Bugfix + +* Fixed return type declaraton [#68](https://github.com/Codeception/robo-paracept/pull/68) + +## [1.1.0](https://github.com/Codeception/robo-paracept/releases/tag/1.1.0) Robo-Paracept 1.1 + +* SplitFailedTests task added to split by groups failed tests only [#65](https://github.com/Codeception/robo-paracept/pull/65) +* Fixed return type in taskSplitTestFilesByGroups [#62](https://github.com/Codeception/robo-paracept/pull/62) + +## [1.0.0](https://github.com/Codeception/robo-paracept/releases/tag/1.0.0) Robo-Paracept 1.0 + +Big day for Robo-Paracept. The first stable version is released! ✈️ + +### Changes + +* **Support for modern PHP 7.3, 7.4, 8.0** +* Added support for the latest [Robo task runner](https://robo.li) +* Added **Filters** to select tests before splitting them +* Added **SplitByTime** task to use time statistics of previous runs to balance groups of tests. Thanks to @ivan1986 + +## [0.4.2](https://github.com/Codeception/robo-paracept/releases/tag/0.4.2) Resolve dependencies when splitting tests + +[#46](https://github.com/Codeception/robo-paracept/pull/46) + +## [0.4.1](https://github.com/Codeception/robo-paracept/releases/tag/0.4.1) Release with new PHPUnit support + +* PHPUnit 6.x support in split [#45](https://github.com/Codeception/robo-paracept/pull/45) +* follow symlinks while scanning for tests [#44](https://github.com/Codeception/robo-paracept/pull/44) + +## [0.4.0](https://github.com/Codeception/robo-paracept/releases/tag/0.4.0) Minor improvements + +* [#37](https://github.com/Codeception/robo-paracept/pull/37) Added `excluePath` option to `SplitTestsByGroups` task. By @thejanasatan +* [#36](https://github.com/Codeception/robo-paracept/pull/36) Added mergeRewrite to merge reports by @maxgorovenko +* [#30](https://github.com/Codeception/robo-paracept/pull/30) Fixed execute test name from data provider by @ivan1986 + +Also PHPUnit 6 compatibility can be achieved by including Codeception's autoloader: + +```php +require 'vendor/codeception/codeception/autoload.php' +``` + +See https://github.com/Codeception/robo-paracept/issues/35#issuecomment-311605115 + +## [0.3.1](https://github.com/Codeception/robo-paracept/releases/tag/0.3.1) 0.3.1: Merge pull request #27 from dhiva/master + +Improved HTML report merge [#27](https://github.com/Codeception/robo-paracept/pull/27) + +## [0.3.0](https://github.com/Codeception/robo-paracept/releases/tag/0.3.0) Robo 1.0 compatibility + +* Robo 1.0 compatibility (Merged [#19](https://github.com/Codeception/robo-paracept/issues/19) , Fixed [#16](https://github.com/Codeception/robo-paracept/issues/16) [#17](https://github.com/Codeception/robo-paracept/pull/17)) +* Support for `.feature` files in `SplitGroups`. Merged [#23](https://github.com/Codeception/robo-paracept/pull/23) + +## [0.2.0](https://github.com/Codeception/robo-paracept/releases/tag/0.2.0) Support for Robo 0.7-1.0 + +Fixed using with Robo >= 0.7 + +* [#12](https://github.com/Codeception/robo-paracept/pull/12) +* [#15](https://github.com/Codeception/robo-paracept/pull/15) +* Fixed [#14](https://github.com/Codeception/robo-paracept/issues/14) + +## [0.1.1](https://github.com/Codeception/robo-paracept/releases/tag/0.1.1) Codeception v2.2 and Robo 0.7 compat + +Reference + +https://codeception.com/docs/12-ParallelExecution#Robo + +## [0.1.0](https://github.com/Codeception/robo-paracept/releases/tag/0.1.0) + +To be compatible with codeception 2.2.2 \ No newline at end of file From 63e7d989a80cb43a1edbfde33fc854e94be409b3 Mon Sep 17 00:00:00 2001 From: KJunker Date: Wed, 11 Aug 2021 22:14:13 +0200 Subject: [PATCH 19/52] Bugfix/number of elements in group (#82) --- src/Splitter/TestsSplitterTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Splitter/TestsSplitterTask.php b/src/Splitter/TestsSplitterTask.php index 020000a..9d6dc1a 100644 --- a/src/Splitter/TestsSplitterTask.php +++ b/src/Splitter/TestsSplitterTask.php @@ -125,7 +125,7 @@ public function run() } // for even split, calculate number of tests in each group - $numberOfElementsInGroup = floor(count($orderedListOfTests) / $this->numGroups); + $numberOfElementsInGroup = round(count($orderedListOfTests) / $this->numGroups); $i = 1; $groups = []; From 447243ae51ab3157000d4a1f0fdb19a9d7df72d0 Mon Sep 17 00:00:00 2001 From: KJunker Date: Fri, 6 Aug 2021 09:59:12 +0200 Subject: [PATCH 20/52] Bugfix/fix extension failed tests writer (#75) * Create php.yml * Add a unique suffix for failed tests report files * add a new merger to merge the created report files from the FailedTestsMergerTask into one file * updated the FailedTestSplitterTask * Fixed issue in FailedTestSplitterTask * Updated README.md for usage of FailedTests Reports * Created new abtract class for the mergers * Created new abtract class for the mergers --- README.md | 17 +- src/Extension/FailedTestsReporter.php | 21 +- src/Merger/AbstractMerger.php | 35 ++++ src/Merger/FailedTestsMergerTask.php | 122 +++++++++++ src/Merger/HtmlReportMerger.php | 8 +- src/Merger/ReportMerger.php | 5 + src/Merger/XmlReportMergerTask.php | 7 +- src/Splitter/FailedTestSplitterTask.php | 22 +- tests/Extension/FailedTestsReporterTest.php | 31 ++- tests/Merger/FailedTestsMergerTaskTest.php | 196 ++++++++++++++++++ tests/Splitter/FailedTestSplitterTaskTest.php | 6 +- 11 files changed, 427 insertions(+), 43 deletions(-) create mode 100644 src/Merger/AbstractMerger.php create mode 100644 src/Merger/FailedTestsMergerTask.php create mode 100644 tests/Merger/FailedTestsMergerTaskTest.php diff --git a/README.md b/README.md index 1e0f9b8..d466607 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,8 @@ this command need run all tests with `Codeception\Task\TimeReporter` for collect ### SplitFailedTests -Enable extension for collect failed tests if you use taskSplitFailedTests +Enable extension for collect failed tests if you use taskSplitFailedTests +The extension saves the report files into \Codeception\Configuration::outputDir() ``` extensions: @@ -89,15 +90,23 @@ extensions: - Codeception\Task\Extension\FailedTestsReporter ``` +Merge the created report files from the FailedTestsReporter into single file +```php +$this->taskMergeFailedTestsReports() + ->fromPathWithPattern(\Codeception\Configuration::outputDir(), '/failedTests_\w+\.txt$/') + ->into(\Codeception\Configuration::outputDir() . 'failedTests.txt') // absolute path with Filename + ->run(); +``` + Load the failed Tests from a reportfile into the groups: -- Default report path is: `Configuration::outputDir() . 'failedTests.txt'` ```php $this ->taskSplitFailedTests(5) - ->setReportPath('tests/_output/' . FailedTestsReporter::REPORT_NAME) - ->groupsTo('tests/_data/group_') + ->setReportPath(\Codeception\Configuration::outputDir() . 'failedTests.txt') // absoulute Path to Reportfile + ->groupsTo(\Codeception\Configuration::outputDir() . 'group_') ->run(); ``` + ### MergeXmlReports Mergex several XML reports: diff --git a/src/Extension/FailedTestsReporter.php b/src/Extension/FailedTestsReporter.php index 7044caa..af13077 100644 --- a/src/Extension/FailedTestsReporter.php +++ b/src/Extension/FailedTestsReporter.php @@ -11,7 +11,11 @@ use Codeception\Test\Descriptor; /** - * Class FailedTestsReporter - reports the failed tests to a reportfile + * Class FailedTestsReporter - reports the failed tests to a reportfile with + * a unique name for parallel execution. + * + * Pattern is '/failedTests_\w+\.\w+\.txt/' + * * Modify the codeception.yml to enable this extension: * extensions: * enabled: @@ -20,10 +24,7 @@ class FailedTestsReporter extends Extension { /** @var string */ - public const REPORT_NAME = 'failedTests.txt'; - - /** @var string $reportFile */ - private $reportFile = self::REPORT_NAME; + public const REPORT_NAME = 'failedTests'; /** @var array $failedTests */ private $failedTests = []; @@ -54,7 +55,7 @@ public function endRun(): void return; } - $file = $this->getLogDir() . $this->reportFile; + $file = $this->getLogDir() . $this->getUniqReportFile(); if (is_file($file)) { unlink($file); // remove old reportFile } @@ -72,4 +73,12 @@ public function getTestname(TestEvent $e): string return substr(str_replace($this->getRootDir(), '', $name), 1); } + + /** + * @return string + */ + public function getUniqReportFile(): string + { + return self::REPORT_NAME . '_' . uniqid('', true) . '.txt'; + } } diff --git a/src/Merger/AbstractMerger.php b/src/Merger/AbstractMerger.php new file mode 100644 index 0000000..7bd060d --- /dev/null +++ b/src/Merger/AbstractMerger.php @@ -0,0 +1,35 @@ +src = $src; + } + + /** + * @inheritDoc + */ + abstract public function from($fileName); + + /** + * @inheritDoc + */ + abstract public function into(string $fileName); + + /** + * @inheritDoc + */ + abstract public function run(); +} diff --git a/src/Merger/FailedTestsMergerTask.php b/src/Merger/FailedTestsMergerTask.php new file mode 100644 index 0000000..c360897 --- /dev/null +++ b/src/Merger/FailedTestsMergerTask.php @@ -0,0 +1,122 @@ +taskMergeFailedTestsReports() + * ->from(__DIR__ . 'tests/_data/Acme/failedTests_123.txt') + * ->from(__DIR__ . 'tests/_data/failedTests_foo.txt') + * ->from([__DIR__ . 'tests/_data/Acme/failedTests_bar.txt', __DIR__ . 'tests/_data/Acme/failedTests_baz.txt',]) + * ->fromPathWithPattern(__DIR__ . 'tests/_data/failed_1/', '/failedTests_\w+\.txt$/') + * ->fromPathWithPattern(__DIR__ . 'tests/_data/failed_2/', '/failedTests_\w+\.txt$/') + * ->into(__DIR__ . '/failedTests.txt') // absolute path with Filename + * ->run(); + * ?> + * ``` + */ +class FailedTestsMergerTask extends AbstractMerger +{ + public const DEFAULT_PATTERN = '/^failedTests_\w+\.\w+\.txt$/'; + + public $pathPatterns = []; + + /** + * @var string + */ + private $dest; + + /** @var string[] */ + protected $src = []; + + /** + * @param string[]|string $fileName + * @return FailedTestsMergerTask|void + */ + public function from($fileName): self + { + if (!(is_array($fileName) || is_string($fileName) || !empty($fileName))) { + throw new InvalidArgumentException( + 'The argument must be an array or string and could not be empty.' + ); + } + + $this->src = array_merge($this->src, (is_string($fileName) ? [$fileName] : $fileName)); + + return $this; + } + + /** + * Search all report files in path with default pattern or the given pattern + * @param string $path - The path where the report files exists + * @param string|null $pattern - The regex pattern for the files (optional) + * @return $this + */ + public function fromPathWithPattern(string $path, ?string $pattern = null): self + { + $this->pathPatterns[$path] = $pattern ?? self::DEFAULT_PATTERN; + + return $this; + } + + public function into(string $fileName): self + { + $this->dest = $fileName; + + return $this; + } + + public function run() + { + $content = []; + $files = array_merge($this->src, $this->searchFilesByPattern()); + foreach ($files as $file) { + if (!is_file($file)) { + continue; + } + $tmpContent = file_get_contents($file); + if (!$tmpContent) { + throw new RuntimeException( + 'Could not read content of reportfile: ' . $file + ); + } + $content[] = $tmpContent; + } + + if (!empty($content)) { + file_put_contents($this->dest, implode(PHP_EOL, $content)); + } + } + + /** + * Search the files by the given path and pattern + * @return array + */ + private function searchFilesByPattern(): array + { + $results = []; + foreach ($this->pathPatterns as $path => $pattern) { + $files = Finder::create() + ->files() + ->in($path) + ->name($pattern ?? self::DEFAULT_PATTERN); + foreach ($files->getIterator() as $splFileInfo) { + $results[] = $splFileInfo->getPathname(); + } + } + + return $results; + } +} diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php index a5254bc..1ca2f53 100644 --- a/src/Merger/HtmlReportMerger.php +++ b/src/Merger/HtmlReportMerger.php @@ -15,8 +15,9 @@ * Class MergeHTMLReportsTask * @author Kerimov Asif */ -class HtmlReportMerger extends BaseTask implements ReportMergerTaskInterface +class HtmlReportMerger extends AbstractMerger { + /** @var string[] */ protected $src = []; protected $dst; protected $countSuccess = 0; @@ -25,11 +26,6 @@ class HtmlReportMerger extends BaseTask implements ReportMergerTaskInterface protected $countIncomplete = 0; protected $previousLibXmlUseErrors; - public function __construct($src = []) - { - $this->src = $src; - } - public function from($fileName) { if (is_array($fileName)) { diff --git a/src/Merger/ReportMerger.php b/src/Merger/ReportMerger.php index 44c9fd5..b45da16 100644 --- a/src/Merger/ReportMerger.php +++ b/src/Merger/ReportMerger.php @@ -15,4 +15,9 @@ protected function taskMergeHTMLReports($src = []) { return $this->task(HtmlReportMerger::class, $src); } + + protected function taskMergeFailedTestsReports($src = []) + { + return $this->task(FailedTestsMergerTask::class, $src); + } } diff --git a/src/Merger/XmlReportMergerTask.php b/src/Merger/XmlReportMergerTask.php index ae7caf9..6515406 100644 --- a/src/Merger/XmlReportMergerTask.php +++ b/src/Merger/XmlReportMergerTask.php @@ -11,7 +11,7 @@ use Robo\Exception\TaskException; use Robo\Task\BaseTask; -class XmlReportMergerTask extends BaseTask implements ReportMergerTaskInterface +class XmlReportMergerTask extends AbstractMerger { /** * @var array|mixed @@ -32,11 +32,6 @@ class XmlReportMergerTask extends BaseTask implements ReportMergerTaskInterface /** @var DOMElement[][] */ protected $suites = []; - public function __construct(array $src = []) - { - $this->src = $src; - } - public function sumTime(): void { $this->summarizeTime = true; diff --git a/src/Splitter/FailedTestSplitterTask.php b/src/Splitter/FailedTestSplitterTask.php index dc2cf2d..74fe796 100644 --- a/src/Splitter/FailedTestSplitterTask.php +++ b/src/Splitter/FailedTestSplitterTask.php @@ -4,8 +4,7 @@ namespace Codeception\Task\Splitter; -use Codeception\Configuration; -use Codeception\Task\Extension\FailedTestsReporter; +use InvalidArgumentException; use RuntimeException; class FailedTestSplitterTask extends TestsSplitter @@ -14,12 +13,11 @@ class FailedTestSplitterTask extends TestsSplitter private $reportPath = null; /** - * @return string - * @throws \Codeception\Exception\ConfigurationException + * @return string - the absolute path to the report file with the failed tests */ public function getReportPath(): string { - return $this->reportPath ?? (Configuration::logDir() . FailedTestsReporter::REPORT_NAME); + return $this->reportPath; } /** @@ -30,9 +28,9 @@ public function run() $this->claimCodeceptionLoaded(); $reportPath = $this->getReportPath(); - if (!@file_exists($reportPath)) { + if (!@file_exists($reportPath) || !is_file($reportPath)) { throw new RuntimeException( - 'The reportfile "failedTests.txt" did not exists.' + 'The reportfile did not exists or is not a regular file.' ); } @@ -47,16 +45,16 @@ public function run() } /** - * @param string $reportPath + * @param string $reportFilePath * @return FailedTestSplitterTask */ - public function setReportPath(string $reportPath): FailedTestSplitterTask + public function setReportPath(string $reportFilePath): FailedTestSplitterTask { - if (empty($reportPath)) { - throw new \InvalidArgumentException('The reportPath could not be empty!'); + if (empty($reportFilePath)) { + throw new InvalidArgumentException('The reportPath could not be empty!'); } - $this->reportPath = $reportPath; + $this->reportPath = $reportFilePath; return $this; } diff --git a/tests/Extension/FailedTestsReporterTest.php b/tests/Extension/FailedTestsReporterTest.php index 2daf101..c7e6571 100644 --- a/tests/Extension/FailedTestsReporterTest.php +++ b/tests/Extension/FailedTestsReporterTest.php @@ -3,9 +3,10 @@ namespace Tests\Codeception\Task\Extension; use Codeception\Event\FailEvent; -use Codeception\Event\TestEvent; use Codeception\Task\Extension\FailedTestsReporter; use PHPUnit\Framework\TestCase; +use SplFileInfo; +use Symfony\Component\Finder\Finder; /** * Class FailedTestsReporterTest @@ -67,15 +68,35 @@ static function (FailEvent $event): array { } $reporter->endRun(); - $file = TEST_PATH . '/result/failedTests.txt'; - $this->assertFileExists($file); - $content = explode(PHP_EOL, file_get_contents($file)); + $files = Finder::create() + ->followLinks() + ->files() + ->in(TEST_PATH) + ->path('result') + ->name('/^failedTests_\w+\.\w+\.txt$/'); + + $iterator = $files->getIterator(); + $this->assertCount(1, $iterator); + $iterator->rewind(); + /** @var SplFileInfo $file */ + $file = $iterator->current(); + $this->assertTrue($file->isFile()); + $content = explode(PHP_EOL, file_get_contents($file->getPathname())); $this->assertCount(8, $content); } protected function tearDown(): void { parent::tearDown(); // TODO: Change the autogenerated stub - unlink(TEST_PATH . '/result/failedTests.txt'); + $files = Finder::create() + ->followLinks() + ->files() + ->in(TEST_PATH) + ->path('result') + ->name('/^failedTests_\w+\.\w+\.txt$/'); + + foreach ($files->getIterator() as $file) { + unlink($file->getPathname()); + } } } diff --git a/tests/Merger/FailedTestsMergerTaskTest.php b/tests/Merger/FailedTestsMergerTaskTest.php new file mode 100644 index 0000000..f3d25ef --- /dev/null +++ b/tests/Merger/FailedTestsMergerTaskTest.php @@ -0,0 +1,196 @@ + '/foo_\w+\.txt/', + 'bar' => '/bar_\w+\.txt/', + 'baz' => '/baz_\w+\.txt/', + ]; + + private static $testContent = [ + 'tests/acceptance/%s/baz.php:testA', + 'tests/acceptance/%s/baz.php:testB', + 'tests/acceptance/%s/baz.php:testC', + 'tests/acceptance/%s/baz.php:testD', + 'tests/acceptance/%s/baz.php:testE', + 'tests/acceptance/%s/baz.php:testF', + 'tests/acceptance/%s/baz.php:testG', + 'tests/acceptance/%s/baz.php:testH', + ]; + + private static $testFiles = []; + + /** + * Prepare the test files and directories + */ + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + $tmpDir = sys_get_temp_dir(); + foreach (self::$tmpDirsPattern as $dir => $pattern) { + $tempDir = $tmpDir . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR; + if (!is_dir($tempDir)) { + mkdir($tempDir); + } + $i = 1; + while ($i <= self::TEST_FILES_PER_DIR) { + $tempfile = $tempDir . $dir . '_unit' . $i++ . '.txt'; + file_put_contents( + $tempfile, + implode( + PHP_EOL, + array_map( + static function (string $filename) use ($dir): string { + return sprintf($filename, $dir); + }, + self::$testContent + ) + ) + ); + self::$testFiles[] = $tempfile; + } + } + } + + /** + * @covers ::run + */ + public function testRunSingleFile(): void + { + $tmpDir = sys_get_temp_dir() . '/foz/'; + $testFile = $tmpDir . 'foz_123456.txt'; + + if (!is_dir($tmpDir)) { + mkdir($tmpDir); + } + + $this->putContents($testFile); + $task = new FailedTestsMergerTask(); + $task->setLogger(new Logger(new NullOutput())); + $task + ->from($testFile) + ->into(self::EXPECTED_TEST_MERGED_FILE) + ->run(); + + $this->assertFileExists(self::EXPECTED_TEST_MERGED_FILE); + $content = explode(PHP_EOL, file_get_contents(self::EXPECTED_TEST_MERGED_FILE)); + $this->assertCount( + count(self::$testContent), + $content + ); + } + + public function testRunWithPathAndFilePatterns(): void + { + $task = new FailedTestsMergerTask(); + $task->setLogger(new Logger(new NullOutput())); + + foreach (self::$tmpDirsPattern as $path => $pattern) { + $task->fromPathWithPattern( + sys_get_temp_dir() . DIRECTORY_SEPARATOR . $path, + $pattern + ); + } + + $task + ->into(self::EXPECTED_TEST_MERGED_FILE) + ->run(); + + $this->assertFileExists(self::EXPECTED_TEST_MERGED_FILE); + $this->assertCount( + (count(self::$testContent) * count(self::$testFiles)), + explode(PHP_EOL, file_get_contents(self::EXPECTED_TEST_MERGED_FILE)) + ); + } + + public function testRunWithFileAndArrayAndPathWithPatterns(): void + { + $tmpDir = sys_get_temp_dir() . '/foz/'; + $testFile = $tmpDir . 'foz_123456.txt'; + + if (!is_dir($tmpDir)) { + mkdir($tmpDir); + } + $this->putContents($testFile); + + $fileData = []; + $i = 0; + while ($i < self::TEST_FILES_PER_DIR) { + $testFile = $tmpDir . 'foz_' . (123456 + ++$i) . '.txt'; + $this->putContents($testFile); + $fileData[] = $testFile; + } + + $task = new FailedTestsMergerTask(); + $task->setLogger(new Logger(new NullOutput())); + $task->from($testFile); + $task->from($fileData); + foreach (self::$tmpDirsPattern as $path => $pattern) { + $task->fromPathWithPattern( + sys_get_temp_dir() . DIRECTORY_SEPARATOR . $path, + $pattern + ); + } + + $task + ->into(self::EXPECTED_TEST_MERGED_FILE) + ->run(); + + $this->assertFileExists(self::EXPECTED_TEST_MERGED_FILE); + $this->assertCount( + ( + count(self::$testContent) * ( + count(self::$testFiles) + + count($fileData) + + count([$testFile]) + ) + ), + explode(PHP_EOL, file_get_contents(self::EXPECTED_TEST_MERGED_FILE)) + ); + } + + public function tearDown(): void + { + parent::tearDown(); // TODO: Change the autogenerated stub + unlink(self::EXPECTED_TEST_MERGED_FILE); + } + + public static function tearDownAfterClass(): void + { + parent::tearDownAfterClass(); // TODO: Change the autogenerated stub + foreach (self::$testFiles as $file) { + unlink($file); + } + } + + /** + * @param string $testFile + */ + protected function putContents(string $testFile): void + { + file_put_contents( + $testFile, + implode( + PHP_EOL, + array_map( + static function (string $filename): string { + return sprintf($filename, 'foz'); + }, + self::$testContent + ) + ) + ); + } +} diff --git a/tests/Splitter/FailedTestSplitterTaskTest.php b/tests/Splitter/FailedTestSplitterTaskTest.php index 969f7a1..1b77658 100644 --- a/tests/Splitter/FailedTestSplitterTaskTest.php +++ b/tests/Splitter/FailedTestSplitterTaskTest.php @@ -2,13 +2,11 @@ namespace Tests\Codeception\Task\Splitter; -use Codeception\Task\Extension\FailedTestsReporter; use Codeception\Task\Splitter\FailedTestSplitterTask; use Codeception\Task\Splitter\TestsSplitter; use Consolidation\Log\Logger; use InvalidArgumentException; use PHPUnit\Framework\TestCase; -use Robo\Exception\TaskException; use RuntimeException; use Symfony\Component\Console\Output\NullOutput; use Symfony\Component\Finder\Finder; @@ -19,7 +17,7 @@ public function testRunWillFailIfReportFileDoesNotExists(): void { $task = new FailedTestSplitterTask(5); $task->setLogger(new Logger(new NullOutput())); - $task->setReportPath('tests/_output/') + $task->setReportPath('tests/_output/failedTests.txt') ->groupsTo(TEST_PATH . '/result/group_'); $this->expectException(RuntimeException::class); @@ -36,7 +34,7 @@ public function testRun(): void $task->setLogger(new Logger(new NullOutput())); $groupTo = TEST_PATH . '/result/group_'; $task - ->setReportPath(TEST_PATH . '/fixtures/' . FailedTestsReporter::REPORT_NAME) + ->setReportPath(TEST_PATH . '/fixtures/failedTests.txt') ->groupsTo($groupTo) ->run(); From 66cf5400832a6929e6718a68a8a1c3eaa856c10a Mon Sep 17 00:00:00 2001 From: KJunker Date: Fri, 6 Aug 2021 10:00:42 +0200 Subject: [PATCH 21/52] Bugfix/merge html correction execution time (#74) * Create php.yml * Building Test for HTMLMerger, find error by summary of Test Execution Time * Sum the execution Time for the merged Reports * Codestyle fixing Co-authored-by: Michael Bodnarchuk --- src/Exception/KeyNotFoundException.php | 12 + src/Exception/XPathExpressionException.php | 15 + src/Merger/HtmlReportMerger.php | 147 ++++- tests/Merger/HtmlReportMergerTest.php | 61 ++ .../reports/html/expected_report.html | 528 ++++++++++++++++++ tests/fixtures/reports/html/report_1.html | 317 +++++++++++ tests/fixtures/reports/html/report_2.html | 292 ++++++++++ tests/fixtures/reports/html/report_3.html | 319 +++++++++++ 8 files changed, 1675 insertions(+), 16 deletions(-) create mode 100644 src/Exception/KeyNotFoundException.php create mode 100644 src/Exception/XPathExpressionException.php create mode 100644 tests/Merger/HtmlReportMergerTest.php create mode 100644 tests/fixtures/reports/html/expected_report.html create mode 100644 tests/fixtures/reports/html/report_1.html create mode 100644 tests/fixtures/reports/html/report_2.html create mode 100644 tests/fixtures/reports/html/report_3.html diff --git a/src/Exception/KeyNotFoundException.php b/src/Exception/KeyNotFoundException.php new file mode 100644 index 0000000..2e1a000 --- /dev/null +++ b/src/Exception/KeyNotFoundException.php @@ -0,0 +1,12 @@ +src = $src; + } + + /** + * @param string[]|string $fileName - a single report file or array of report files + * @return $this|HtmlReportMerger + */ + public function from($fileName): self { if (is_array($fileName)) { $this->src = array_merge($fileName, $this->src); @@ -36,7 +65,11 @@ public function from($fileName) return $this; } - public function into($fileName) + /** + * @param string $fileName + * @return $this|HtmlReportMerger + */ + public function into(string $fileName): self { $this->dst = $fileName; return $this; @@ -57,18 +90,34 @@ public function run() //read first source file as main $dstHTML = new DOMDocument(); $dstHTML->loadHTMLFile($this->src[0], LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - + $this->countExecutionTime($dstHTML); //main node for all table rows - $table = (new \DOMXPath($dstHTML))->query("//table")->item(0); - + $nodeList = (new DOMXPath($dstHTML))->query("//table"); + if (!$nodeList) { + throw XPathExpressionException::malformedXPath("//table"); + } + $index = 0; + /** @var DOMNode $table */ + $table = $nodeList->item($index); + if (null === $table) { + throw new KeyNotFoundException('Could not find table item at pos: ' . $index); + } //prepare reference nodes for envs - $refnodes = (new DOMXPath($dstHTML))->query("//div[@class='layout']/table/tr[not(@class)]"); - + $xpathExprRefNodes = "//div[@class='layout']/table/tr[not(@class)]"; + $refnodes = (new DOMXPath($dstHTML))->query($xpathExprRefNodes); + if (!$refnodes) { + throw XPathExpressionException::malformedXPath($xpathExprRefNodes); + } for ($k = 1, $kMax = count($this->src); $k < $kMax; $k++) { $srcHTML = new DOMDocument(); $src = $this->src[$k]; $srcHTML->loadHTMLFile($src, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - $suiteNodes = (new DOMXPath($srcHTML))->query("//div[@class='layout']/table/tr"); + $this->countExecutionTime($srcHTML); + $xpathExprSuiteNodes = "//div[@class='layout']/table/tr"; + $suiteNodes = (new DOMXPath($srcHTML))->query($xpathExprSuiteNodes); + if (!$suiteNodes) { + throw XPathExpressionException::malformedXPath($xpathExprSuiteNodes); + } $j = 0; foreach ($suiteNodes as $suiteNode) { if ($suiteNode->getAttribute('class') == '') { @@ -86,13 +135,14 @@ public function run() } /** - * The next 5 functions correct our almost finished final report + * The next 6 functions correct our almost finished final report */ $this->countSummary($dstHTML); $this->moveSummaryTable($dstHTML, $table); $this->updateSummaryTable($dstHTML); $this->updateToolbarTable($dstHTML); $this->updateButtons($dstHTML); + $this->updateHeaderLine($dstHTML); //save final report file_put_contents($this->dst, $dstHTML->saveHTML()); @@ -102,12 +152,72 @@ public function run() } /** - * This function counts all types of tests' scenarios and writes in class members - * @param $dstFile DOMDocument - destination file + * This function sums all execution time of each report + * @param DOMDocument $dstFile + * @throws XPathExpressionException */ - private function countSummary($dstFile) + private function countExecutionTime(DOMDocument $dstFile): void { - $tests = (new \DOMXPath($dstFile))->query("//table/tr[contains(@class,'scenarioRow')]"); + $xpathHeadline = "//h1[text() = 'Codeception Results ']"; + $nodeList = (new DOMXPath($dstFile)) + ->query($xpathHeadline); + if (!$nodeList) { + throw XPathExpressionException::malformedXPath($xpathHeadline); + } + $pregResult = preg_match( + '/^Codeception Results .* \((?\d+\.\d+)s\)$/', + $nodeList[0]->nodeValue, + $matches + ); + + if (false === $pregResult) { + throw new RuntimeException('Regexpression is malformed'); + } + + if (0 === $pregResult) { + return; + } + + $this->executionTimeSum += (float)$matches['timesum']; + } + + /** + * @param DOMDocument $dstFile + * @throws XPathExpressionException + */ + private function updateHeaderLine(DOMDocument $dstFile): void + { + $xpathHeadline = "//h1[text() = 'Codeception Results ']"; + $nodeList = (new DOMXPath($dstFile)) + ->query($xpathHeadline); + if (!$nodeList) { + throw XPathExpressionException::malformedXPath($xpathHeadline); + } + /** @var DOMNode $executionTimeNode */ + $executionTimeNode = $nodeList[0]->childNodes[1]->childNodes[1]; + /** @var DOMAttr $statusAttr */ + $statusNode = $nodeList[0]->childNodes[1]->childNodes[0]; + $statusAttr = $statusNode->attributes[0]; + if (0 !== ($this->countFailed + $this->countIncomplete + $this->countSkipped)) { + $statusNode->nodeValue = 'NOT OK'; + $statusAttr->value = 'color: red'; + } + $executionTimeNode->nodeValue = " ({$this->executionTimeSum}s)"; + } + + /** + * This function counts all types of tests' scenarios and writes in class members + * @param DOMDocument $dstFile - destination file + * @throws XPathExpressionException + */ + private function countSummary(DOMDocument $dstFile): void + { + $xpathExprTests = "//table/tr[contains(@class,'scenarioRow')]"; + /** @var DOMNodeList $tests */ + $tests = (new DOMXPath($dstFile))->query($xpathExprTests); + if (!$tests) { + throw XPathExpressionException::malformedXPath($xpathExprTests); + } foreach ($tests as $test) { $class = str_replace('scenarioRow ', '', $test->getAttribute('class')); switch ($class) { @@ -150,7 +260,7 @@ private function updateSummaryTable(DOMDocument $dstFile) */ private function moveSummaryTable(DOMDocument $dstFile, DOMNode $node) { - $summaryTable = (new \DOMXPath($dstFile))->query("//div[@id='stepContainerSummary']") + $summaryTable = (new DOMXPath($dstFile))->query("//div[@id='stepContainerSummary']") ->item(0)->parentNode->parentNode; $node->appendChild($dstFile->importNode($summaryTable, true)); } @@ -162,7 +272,7 @@ private function moveSummaryTable(DOMDocument $dstFile, DOMNode $node) */ private function updateToolbarTable(DOMDocument $dstFile) { - $dstFile = new \DOMXPath($dstFile); + $dstFile = new DOMXPath($dstFile); $pathFor = static function (string $type): string { return "//ul[@id='toolbar-filter']//a[@title='$type']"; }; @@ -175,10 +285,15 @@ private function updateToolbarTable(DOMDocument $dstFile) /** * This function updates "+" and "-" button for viewing test steps in final report * @param $dstFile DOMDocument - destination file + * @throws XPathExpressionException */ private function updateButtons(DOMDocument $dstFile) { - $nodes = (new \DOMXPath($dstFile))->query("//div[@class='layout']/table/tr[contains(@class, 'scenarioRow')]"); + $xpathExprNodes = "//div[@class='layout']/table/tr[contains(@class, 'scenarioRow')]"; + $nodes = (new DOMXPath($dstFile))->query($xpathExprNodes); + if (!$nodes) { + throw XPathExpressionException::malformedXPath($xpathExprNodes); + } for ($i = 2; $i < $nodes->length; $i += 2) { $n = $i / 2 + 1; $p = $nodes->item($i)->childNodes->item(1)->childNodes->item(1); diff --git a/tests/Merger/HtmlReportMergerTest.php b/tests/Merger/HtmlReportMergerTest.php new file mode 100644 index 0000000..129a563 --- /dev/null +++ b/tests/Merger/HtmlReportMergerTest.php @@ -0,0 +1,61 @@ +setLogger(new Logger(new NullOutput())); + $resultReport = TEST_PATH . '/result/report.html'; + $task + ->from( + [ + $reportPath . 'report_1.html', + $reportPath . 'report_2.html', + $reportPath . 'report_3.html', + ] + ) + ->into($resultReport) + ->run(); + + $this->assertFileExists($resultReport); + + //read first source file as main + $dstHTML = new DOMDocument(); + $dstHTML->loadHTMLFile($resultReport, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + /** @var DOMNodeList $values */ + $values = (new DOMXPath($dstHTML)) + ->query("//*[contains(@class,'scenarioSuccessValue')]"); + + $this->assertCount(1, $values); + $this->assertSame($expectedSuccess, (int)$values[0]->nodeValue); + + $values = (new DOMXPath($dstHTML)) + ->query("//h1[text() = 'Codeception Results ']"); + preg_match( + '/^Codeception Results .* \((?\d+\.\d+)s\)$/', + $values[0]->nodeValue, + $matches + ); + + $this->assertSame($expectedTimeInSeconds, (float)$matches['timesum']); + } +} diff --git a/tests/fixtures/reports/html/expected_report.html b/tests/fixtures/reports/html/expected_report.html new file mode 100644 index 0000000..0c496f3 --- /dev/null +++ b/tests/fixtures/reports/html/expected_report.html @@ -0,0 +1,528 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (234.98s)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Acceptance (cloud-stage) Tests

+
+

+ + ExpleogroupCest » Student apply expleogroup and + choose interest 103.29s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ I acting as "Vincenzo" +

+ +

+ I set locale "fr"

+ +

+ I visit "Page\Applications\ApplicationFormPage","","appsource=expleogroup" +

+ +

+ Page\Applications\ApplicationFormPage: start + application {"title":"La première étape de votre candidature","button":"Commencer"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + personal details {"title":"Votre profil","birthdate":"Votre date de naissance","address":"Votre adresse","gender":"Votre genre"},{"gender":"Masculin","address":"7 cité paradis PARIS"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + education {"title":"Vos études","education":"","diploma":"Quel est votre niveau de diplôme le plus élevé ?","frenchLevel":"","englishLevel":"Quel est votre niveau d’anglais ?"},{"diploma":"Bac+2","englishLevel":"Intermédiaire (B1-B2)"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + learning resources {"title":"La formation en ligne et vous","followedCourses":"Avez-vous déjà suivi des cours en ligne ?","followedCoursesSubject":"Sur quels sujets et sur quels sites ?","resources":"Pour cette formation, vous aurez accès à :"},{"followedCourses":"Oui","followedCoursesSubject":"Coursera","resources":["Un endroit calme","Un ordinateur","Un micro"]} +

+ +

+ Page\Applications\ApplicationFormPage: fill + motivation {"title":"Votre nouvelle carrière","professionalProject":"Détaillez votre projet professionnel (à court, moyen et long-terme)","cv":"Ajoutez votre CV","linkedin":"","foundEmployer":"","desiredStartDate":"","nextButton":"Envoyer la candidature"},{"cv":"cv.pdf"} +

+ +

+ Page\Applications\ApplicationFormPage: see + application end {"title":"Merci de votre intérêt pour nos formations !","button":"RETOUR À L’ACCUEIL"} +

+ +
+
+

Api (cloud-stage) Tests

+
+

+ + AnalyticsCest » Get analytics with paths code + 2.44s

+
+ + + + + + + + + + + + + +

+ I acting as "Business\Users\BotAdmin" +

+ +

+ I get analytics "PATHS",[],"0-1000" +

+ +

+ I see analytics "PATHS" +

+ +
+ + +
+

Bdd (cloud-stage) Tests

+
+

+ + Course » Member can follow a course and pass a + quiz 129.25s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    As a member +
    I want to follow a + course and pass a quiz
    In order to make + progress on the platform

+ Given i am "member"

+ +

+ When i choose a course

+ +

+ And i follow a course

+ +

+ And i pass a quiz

+ +

+ Then i see that i have followed the course

+ +

+ And i see that i have passed the quiz

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:3
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_1.html b/tests/fixtures/reports/html/report_1.html new file mode 100644 index 0000000..d91f6fd --- /dev/null +++ b/tests/fixtures/reports/html/report_1.html @@ -0,0 +1,317 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (103.29s)

+ + + + + + + + + + + + + + + +
+

Acceptance (cloud-stage) Tests

+
+

+ + ExpleogroupCest » Student apply expleogroup and choose interest 103.29s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ I acting as "Vincenzo"

+ +

+ I set locale "fr"

+ +

+ I visit "Page\Applications\ApplicationFormPage","","appsource=expleogroup"

+ +

+ Page\Applications\ApplicationFormPage: start application {"title":"La première étape de votre candidature","button":"Commencer"}

+ +

+ Page\Applications\ApplicationFormPage: fill personal details {"title":"Votre profil","birthdate":"Votre date de naissance","address":"Votre adresse","gender":"Votre genre"},{"gender":"Masculin","address":"7 cité paradis PARIS"}

+ +

+ Page\Applications\ApplicationFormPage: fill education {"title":"Vos études","education":"","diploma":"Quel est votre niveau de diplôme le plus élevé ?","frenchLevel":"","englishLevel":"Quel est votre niveau d’anglais ?"},{"diploma":"Bac+2","englishLevel":"Intermédiaire (B1-B2)"}

+ +

+ Page\Applications\ApplicationFormPage: fill learning resources {"title":"La formation en ligne et vous","followedCourses":"Avez-vous déjà suivi des cours en ligne ?","followedCoursesSubject":"Sur quels sujets et sur quels sites ?","resources":"Pour cette formation, vous aurez accès à :"},{"followedCourses":"Oui","followedCoursesSubject":"Coursera","resources":["Un endroit calme","Un ordinateur","Un micro"]}

+ +

+ Page\Applications\ApplicationFormPage: fill motivation {"title":"Votre nouvelle carrière","professionalProject":"Détaillez votre projet professionnel (à court, moyen et long-terme)","cv":"Ajoutez votre CV","linkedin":"","foundEmployer":"","desiredStartDate":"","nextButton":"Envoyer la candidature"},{"cv":"cv.pdf"}

+ +

+ Page\Applications\ApplicationFormPage: see application end {"title":"Merci de votre intérêt pour nos formations !","button":"RETOUR À L’ACCUEIL"}

+ +
+
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_2.html b/tests/fixtures/reports/html/report_2.html new file mode 100644 index 0000000..5e9d9dd --- /dev/null +++ b/tests/fixtures/reports/html/report_2.html @@ -0,0 +1,292 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (2.44s)

+ + + + + + + + + + + + + + + + + + + + +
+

Api (cloud-stage) Tests

+
+

+ + AnalyticsCest » Get analytics with paths code 2.44s

+
+ + + + + + + + + + + + + +

+ I acting as "Business\Users\BotAdmin"

+ +

+ I get analytics "PATHS",[],"0-1000"

+ +

+ I see analytics "PATHS"

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_3.html b/tests/fixtures/reports/html/report_3.html new file mode 100644 index 0000000..db1be8e --- /dev/null +++ b/tests/fixtures/reports/html/report_3.html @@ -0,0 +1,319 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (129.25s)

+ + + + + + + + + + + + + + + + + + + + + +
+

Bdd (cloud-stage) Tests

+
+

+ + Course » Member can follow a course and pass a quiz 129.25s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    As a member
    I want to follow a course and pass a quiz
    In order to make progress on the platform

+ Given i am "member"

+ +

+ When i choose a course

+ +

+ And i follow a course

+ +

+ And i pass a quiz

+ +

+ Then i see that i have followed the course

+ +

+ And i see that i have passed the quiz

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + From 57f0f50618d10eb5bee096c2486eb93c5c1d8359 Mon Sep 17 00:00:00 2001 From: Caroline BUZENET Date: Fri, 6 Aug 2021 10:01:12 +0200 Subject: [PATCH 22/52] testsFrom() method allow string or array (#73) --- src/Splitter/TestsSplitter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 2cd1a14..2259e60 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -16,7 +16,7 @@ abstract class TestsSplitter extends BaseTask protected $numGroups; /** @var string */ protected $projectRoot = '.'; - /** @var string */ + /** @var string|array */ protected $testsFrom = 'tests'; /** @var string */ protected $saveTo = 'tests/_data/paracept_'; @@ -59,7 +59,7 @@ public function projectRoot(string $path): TestsSplitter return $this; } - public function testsFrom(string $path): TestsSplitter + public function testsFrom(string|array $path): TestsSplitter { $this->testsFrom = $path; From 97df7e9d86c30b0252a02ad5256467b1f1dc01b2 Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Fri, 6 Aug 2021 11:05:10 +0300 Subject: [PATCH 23/52] Revert "testsFrom() method allow string or array (#73)" (#77) This reverts commit 7fa164016db5894bf0363c898984e20a8173d2de. --- src/Splitter/TestsSplitter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 2259e60..2cd1a14 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -16,7 +16,7 @@ abstract class TestsSplitter extends BaseTask protected $numGroups; /** @var string */ protected $projectRoot = '.'; - /** @var string|array */ + /** @var string */ protected $testsFrom = 'tests'; /** @var string */ protected $saveTo = 'tests/_data/paracept_'; @@ -59,7 +59,7 @@ public function projectRoot(string $path): TestsSplitter return $this; } - public function testsFrom(string|array $path): TestsSplitter + public function testsFrom(string $path): TestsSplitter { $this->testsFrom = $path; From cef4bd70ed43c29d28ecd2200c1a86bbe4b35558 Mon Sep 17 00:00:00 2001 From: Caroline BUZENET Date: Fri, 6 Aug 2021 10:21:35 +0200 Subject: [PATCH 24/52] Feat tests from allow string or array (#78) * testsFrom() method allow string or array * testsFrom() method allow string or array --- src/Splitter/TestsSplitter.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 2cd1a14..28b0471 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -16,7 +16,7 @@ abstract class TestsSplitter extends BaseTask protected $numGroups; /** @var string */ protected $projectRoot = '.'; - /** @var string */ + /** @var string[]|string */ protected $testsFrom = 'tests'; /** @var string */ protected $saveTo = 'tests/_data/paracept_'; @@ -59,7 +59,11 @@ public function projectRoot(string $path): TestsSplitter return $this; } - public function testsFrom(string $path): TestsSplitter + /** + * @param string[]|string $path - a single path or array of paths + * @return $this|TestsSplitter + */ + public function testsFrom($path): TestsSplitter { $this->testsFrom = $path; From cb1c350c8e22d343bb1561e5a7ecef8964cd1ea5 Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Tue, 10 Aug 2021 00:36:47 +0300 Subject: [PATCH 25/52] add changelog (#80) --- CHANGELOG.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ed059d4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,81 @@ +## [1.2.0](1.2.0) + +- Bugfix for extension FailedTestsReporter and new FailedTestsMergerTask [#75](https://github.com/Codeception/robo-paracept/pull/75) + - generated Files will not be overwriten anymore + - each generated File has now a uniqid-suffix (PHP Function uniqid('', true)) + - merge generated report files from FailedTestsReporter into single file + - posibility to merge also another files into a single file + + +- Bugfix src/Splitter/TestsSplitter.php::testsFrom [#78](https://github.com/Codeception/robo-paracept/pull/78) @ccsuperstar + - revert string type hint and allow array or string again + +## [1.1.1](https://github.com/Codeception/robo-paracept/releases/tag/1.1.1) Bugfix + +* Fixed return type declaraton [#68](https://github.com/Codeception/robo-paracept/pull/68) + +## [1.1.0](https://github.com/Codeception/robo-paracept/releases/tag/1.1.0) Robo-Paracept 1.1 + +* SplitFailedTests task added to split by groups failed tests only [#65](https://github.com/Codeception/robo-paracept/pull/65) +* Fixed return type in taskSplitTestFilesByGroups [#62](https://github.com/Codeception/robo-paracept/pull/62) + +## [1.0.0](https://github.com/Codeception/robo-paracept/releases/tag/1.0.0) Robo-Paracept 1.0 + +Big day for Robo-Paracept. The first stable version is released! ✈️ + +### Changes + +* **Support for modern PHP 7.3, 7.4, 8.0** +* Added support for the latest [Robo task runner](https://robo.li) +* Added **Filters** to select tests before splitting them +* Added **SplitByTime** task to use time statistics of previous runs to balance groups of tests. Thanks to @ivan1986 + +## [0.4.2](https://github.com/Codeception/robo-paracept/releases/tag/0.4.2) Resolve dependencies when splitting tests + +[#46](https://github.com/Codeception/robo-paracept/pull/46) + +## [0.4.1](https://github.com/Codeception/robo-paracept/releases/tag/0.4.1) Release with new PHPUnit support + +* PHPUnit 6.x support in split [#45](https://github.com/Codeception/robo-paracept/pull/45) +* follow symlinks while scanning for tests [#44](https://github.com/Codeception/robo-paracept/pull/44) + +## [0.4.0](https://github.com/Codeception/robo-paracept/releases/tag/0.4.0) Minor improvements + +* [#37](https://github.com/Codeception/robo-paracept/pull/37) Added `excluePath` option to `SplitTestsByGroups` task. By @thejanasatan +* [#36](https://github.com/Codeception/robo-paracept/pull/36) Added mergeRewrite to merge reports by @maxgorovenko +* [#30](https://github.com/Codeception/robo-paracept/pull/30) Fixed execute test name from data provider by @ivan1986 + +Also PHPUnit 6 compatibility can be achieved by including Codeception's autoloader: + +```php +require 'vendor/codeception/codeception/autoload.php' +``` + +See https://github.com/Codeception/robo-paracept/issues/35#issuecomment-311605115 + +## [0.3.1](https://github.com/Codeception/robo-paracept/releases/tag/0.3.1) 0.3.1: Merge pull request #27 from dhiva/master + +Improved HTML report merge [#27](https://github.com/Codeception/robo-paracept/pull/27) + +## [0.3.0](https://github.com/Codeception/robo-paracept/releases/tag/0.3.0) Robo 1.0 compatibility + +* Robo 1.0 compatibility (Merged [#19](https://github.com/Codeception/robo-paracept/issues/19) , Fixed [#16](https://github.com/Codeception/robo-paracept/issues/16) [#17](https://github.com/Codeception/robo-paracept/pull/17)) +* Support for `.feature` files in `SplitGroups`. Merged [#23](https://github.com/Codeception/robo-paracept/pull/23) + +## [0.2.0](https://github.com/Codeception/robo-paracept/releases/tag/0.2.0) Support for Robo 0.7-1.0 + +Fixed using with Robo >= 0.7 + +* [#12](https://github.com/Codeception/robo-paracept/pull/12) +* [#15](https://github.com/Codeception/robo-paracept/pull/15) +* Fixed [#14](https://github.com/Codeception/robo-paracept/issues/14) + +## [0.1.1](https://github.com/Codeception/robo-paracept/releases/tag/0.1.1) Codeception v2.2 and Robo 0.7 compat + +Reference + +https://codeception.com/docs/12-ParallelExecution#Robo + +## [0.1.0](https://github.com/Codeception/robo-paracept/releases/tag/0.1.0) + +To be compatible with codeception 2.2.2 \ No newline at end of file From 653d053694ec76e0eb70894098c5520d164615f9 Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Fri, 13 Aug 2021 02:22:38 +0300 Subject: [PATCH 26/52] update changelog (#83) --- CHANGELOG.md | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed059d4..f694e92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,22 @@ -## [1.2.0](1.2.0) +## [1.2.1](https://github.com/Codeception/robo-paracept/releases/tag/1.2.1) Bugfix + +Pull Request: [#82](https://github.com/Codeception/robo-paracept/pull/82) + +Calculation number of tests in groups in class TestsSplitterTask did not work as expected. +If you have a high number of Tests it was possible that the last group received a huge number of tests while all others had a stable small number of tests. + +- Fixing calculation number of tests in Groups +- Using PHP Built In round() instead of floor() + +## [1.2.0](https://github.com/Codeception/robo-paracept/releases/tag/1.2.0) - Bugfix for extension FailedTestsReporter and new FailedTestsMergerTask [#75](https://github.com/Codeception/robo-paracept/pull/75) - generated Files will not be overwriten anymore - each generated File has now a uniqid-suffix (PHP Function uniqid('', true)) - merge generated report files from FailedTestsReporter into single file - posibility to merge also another files into a single file - - -- Bugfix src/Splitter/TestsSplitter.php::testsFrom [#78](https://github.com/Codeception/robo-paracept/pull/78) @ccsuperstar + +- Bugfix src/Splitter/TestsSplitter.php::testsFrom [#78](https://github.com/Codeception/robo-paracept/pull/78) [@ccsuperstar](https://github.com/ccsuperstar) - revert string type hint and allow array or string again ## [1.1.1](https://github.com/Codeception/robo-paracept/releases/tag/1.1.1) Bugfix @@ -28,7 +37,7 @@ Big day for Robo-Paracept. The first stable version is released! ✈️ * **Support for modern PHP 7.3, 7.4, 8.0** * Added support for the latest [Robo task runner](https://robo.li) * Added **Filters** to select tests before splitting them -* Added **SplitByTime** task to use time statistics of previous runs to balance groups of tests. Thanks to @ivan1986 +* Added **SplitByTime** task to use time statistics of previous runs to balance groups of tests. Thanks to [@ivan1986](https://github.com/ivan1986) ## [0.4.2](https://github.com/Codeception/robo-paracept/releases/tag/0.4.2) Resolve dependencies when splitting tests @@ -41,9 +50,9 @@ Big day for Robo-Paracept. The first stable version is released! ✈️ ## [0.4.0](https://github.com/Codeception/robo-paracept/releases/tag/0.4.0) Minor improvements -* [#37](https://github.com/Codeception/robo-paracept/pull/37) Added `excluePath` option to `SplitTestsByGroups` task. By @thejanasatan -* [#36](https://github.com/Codeception/robo-paracept/pull/36) Added mergeRewrite to merge reports by @maxgorovenko -* [#30](https://github.com/Codeception/robo-paracept/pull/30) Fixed execute test name from data provider by @ivan1986 +* [#37](https://github.com/Codeception/robo-paracept/pull/37) Added `excluePath` option to `SplitTestsByGroups` task. By [@thejanasatan](https://github.com/thejanasatan) +* [#36](https://github.com/Codeception/robo-paracept/pull/36) Added mergeRewrite to merge reports by [@maxgorovenko](https://github.com/maxgorovenko) +* [#30](https://github.com/Codeception/robo-paracept/pull/30) Fixed execute test name from data provider by [@ivan1986](https://github.com/ivan1986) Also PHPUnit 6 compatibility can be achieved by including Codeception's autoloader: @@ -51,7 +60,7 @@ Also PHPUnit 6 compatibility can be achieved by including Codeception's autoload require 'vendor/codeception/codeception/autoload.php' ``` -See https://github.com/Codeception/robo-paracept/issues/35#issuecomment-311605115 +See [#35 (comment)](https://github.com/Codeception/robo-paracept/issues/35#issuecomment-311605115) ## [0.3.1](https://github.com/Codeception/robo-paracept/releases/tag/0.3.1) 0.3.1: Merge pull request #27 from dhiva/master From b5ae1323015007c19a9073d060f0954e0c0c5131 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Sep 2021 21:52:24 +0200 Subject: [PATCH 27/52] Bump codeception/codeception from 4.1.21 to 4.1.22 (#84) Bumps [codeception/codeception](https://github.com/Codeception/Codeception) from 4.1.21 to 4.1.22. - [Release notes](https://github.com/Codeception/Codeception/releases) - [Changelog](https://github.com/Codeception/Codeception/blob/4.1/CHANGELOG-4.x.md) - [Commits](https://github.com/Codeception/Codeception/compare/4.1.21...4.1.22) --- updated-dependencies: - dependency-name: codeception/codeception dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 543 ++++++++++++++------------------------------------ 1 file changed, 149 insertions(+), 394 deletions(-) diff --git a/composer.lock b/composer.lock index 6842fe1..7c109f5 100644 --- a/composer.lock +++ b/composer.lock @@ -55,10 +55,6 @@ } ], "description": "Initialize Symfony Console commands from annotated command class methods.", - "support": { - "issues": "https://github.com/consolidation/annotated-command/issues", - "source": "https://github.com/consolidation/annotated-command/tree/4.2.4" - }, "time": "2020-12-10T16:56:39+00:00" }, { @@ -115,10 +111,6 @@ } ], "description": "Provide configuration services for a commandline tool.", - "support": { - "issues": "https://github.com/consolidation/config/issues", - "source": "https://github.com/consolidation/config/tree/2.0.1" - }, "time": "2020-12-06T00:03:30+00:00" }, { @@ -167,10 +159,6 @@ } ], "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", - "support": { - "issues": "https://github.com/consolidation/log/issues", - "source": "https://github.com/consolidation/log/tree/2.0.2" - }, "time": "2020-12-10T16:26:23+00:00" }, { @@ -226,10 +214,6 @@ } ], "description": "Format text by applying transformations provided by plug-in formatters.", - "support": { - "issues": "https://github.com/consolidation/output-formatters/issues", - "source": "https://github.com/consolidation/output-formatters/tree/4.1.2" - }, "time": "2020-12-12T19:04:59+00:00" }, { @@ -325,10 +309,6 @@ } ], "description": "Modern task runner", - "support": { - "issues": "https://github.com/consolidation/Robo/issues", - "source": "https://github.com/consolidation/Robo/tree/3.0.3" - }, "time": "2021-02-21T19:19:43+00:00" }, { @@ -379,10 +359,6 @@ } ], "description": "Provides a self:update command for Symfony Console applications.", - "support": { - "issues": "https://github.com/consolidation/self-update/issues", - "source": "https://github.com/consolidation/self-update/tree/1.2.0" - }, "time": "2020-04-13T02:49:20+00:00" }, { @@ -442,10 +418,6 @@ "dot", "notation" ], - "support": { - "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/master" - }, "time": "2017-01-20T21:14:22+00:00" }, { @@ -493,10 +465,6 @@ } ], "description": "Expands internal property references in PHP arrays file.", - "support": { - "issues": "https://github.com/grasmash/expander/issues", - "source": "https://github.com/grasmash/expander/tree/master" - }, "time": "2017-12-21T22:14:55+00:00" }, { @@ -566,10 +534,6 @@ "provider", "service" ], - "support": { - "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/3.4.1" - }, "funding": [ { "url": "https://github.com/philipobenito", @@ -620,10 +584,6 @@ "container-interop", "psr" ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, "time": "2021-03-05T17:36:06+00:00" }, { @@ -670,10 +630,6 @@ "psr", "psr-14" ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, "time": "2019-01-08T18:20:26+00:00" }, { @@ -721,9 +677,6 @@ "psr", "psr-3" ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, "time": "2021-05-03T11:20:27+00:00" }, { @@ -798,9 +751,6 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v5.1.11" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -865,9 +815,6 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -886,23 +833,23 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.3.0", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce" + "reference": "ce7b20d69c66a20939d8952b617506a44d102130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67a5f354afa8e2f231081b3fa11a5912f933c3ce", - "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", + "reference": "ce7b20d69c66a20939d8952b617506a44d102130", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -912,7 +859,7 @@ "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-handler": "^4.4|^5.0", @@ -950,9 +897,6 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -967,7 +911,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -1029,9 +973,6 @@ "interoperability", "standards" ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1091,9 +1032,6 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.3" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1152,9 +1090,6 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1231,9 +1166,6 @@ "polyfill", "portable" ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1252,16 +1184,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", "shasum": "" }, "require": { @@ -1312,9 +1244,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1329,7 +1258,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-intl-normalizer", @@ -1396,9 +1325,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1417,16 +1343,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { @@ -1476,9 +1402,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1493,7 +1416,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php73", @@ -1555,9 +1478,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1576,16 +1496,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -1638,9 +1558,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1655,7 +1572,7 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/process", @@ -1700,9 +1617,6 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.3.2" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1779,9 +1693,6 @@ "interoperability", "standards" ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1800,16 +1711,16 @@ }, { "name": "symfony/string", - "version": "v5.3.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", - "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", "shasum": "" }, "require": { @@ -1862,9 +1773,6 @@ "utf-8", "utf8" ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.3.3" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1879,20 +1787,20 @@ "type": "tidelift" } ], - "time": "2021-06-27T11:44:38+00:00" + "time": "2021-08-26T08:00:08+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.3", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229" + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", - "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", "shasum": "" }, "require": { @@ -1937,9 +1845,6 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.3" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1954,7 +1859,7 @@ "type": "tidelift" } ], - "time": "2021-06-24T08:13:00+00:00" + "time": "2021-07-29T06:20:01+00:00" } ], "packages-dev": [ @@ -2016,24 +1921,20 @@ "gherkin", "parser" ], - "support": { - "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" - }, "time": "2021-02-04T12:44:21+00:00" }, { "name": "codeception/codeception", - "version": "4.1.21", + "version": "4.1.22", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "c25f20d842a7e3fa0a8e6abf0828f102c914d419" + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/c25f20d842a7e3fa0a8e6abf0828f102c914d419", - "reference": "c25f20d842a7e3fa0a8e6abf0828f102c914d419", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", "shasum": "" }, "require": { @@ -2044,7 +1945,7 @@ "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/psr7": "~1.4", + "guzzlehttp/psr7": "^1.4 | ^2.0", "php": ">=5.6.0 <9.0", "symfony/console": ">=2.7 <6.0", "symfony/css-selector": ">=2.7 <6.0", @@ -2105,17 +2006,13 @@ "functional testing", "unit testing" ], - "support": { - "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.1.21" - }, "funding": [ { "url": "https://opencollective.com/codeception", "type": "open_collective" } ], - "time": "2021-05-28T17:43:39+00:00" + "time": "2021-08-06T17:15:34+00:00" }, { "name": "codeception/lib-asserts", @@ -2165,10 +2062,6 @@ "keywords": [ "codeception" ], - "support": { - "issues": "https://github.com/Codeception/lib-asserts/issues", - "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" - }, "time": "2020-10-21T16:26:20+00:00" }, { @@ -2214,10 +2107,6 @@ } ], "description": "PHPUnit classes used by Codeception", - "support": { - "issues": "https://github.com/Codeception/phpunit-wrapper/issues", - "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.6" - }, "time": "2020-12-28T13:59:47+00:00" }, { @@ -2248,10 +2137,6 @@ "MIT" ], "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", - "support": { - "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/3.7.0" - }, "time": "2020-07-03T15:54:43+00:00" }, { @@ -2314,11 +2199,6 @@ "validation", "versioning" ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" - }, "funding": [ { "url": "https://packagist.com", @@ -2378,11 +2258,6 @@ "Xdebug", "performance" ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.1" - }, "funding": [ { "url": "https://packagist.com", @@ -2465,10 +2340,6 @@ "docblock", "parser" ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.1" - }, "time": "2021-05-16T18:07:53+00:00" }, { @@ -2520,10 +2391,6 @@ "constructor", "instantiate" ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" - }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -2600,10 +2467,6 @@ "parser", "php" ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" - }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -2696,10 +2559,6 @@ } ], "description": "A tool to automatically fix PHP code style", - "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.0.0" - }, "funding": [ { "url": "https://github.com/keradus", @@ -2710,29 +2569,32 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.8.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91" + "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", + "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2740,16 +2602,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2764,6 +2623,11 @@ { "name": "Tobias Schultze", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -2777,11 +2641,7 @@ "uri", "url" ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.2" - }, - "time": "2021-04-26T09:17:50+00:00" + "time": "2021-06-30T20:03:07+00:00" }, { "name": "myclabs/deep-copy", @@ -2829,10 +2689,6 @@ "object", "object graph" ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" - }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", @@ -2875,10 +2731,6 @@ } ], "description": "JUnit XML Document generation library", - "support": { - "issues": "https://github.com/cmuench/junit-xml/issues", - "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" - }, "time": "2020-12-25T09:08:58+00:00" }, { @@ -2931,10 +2783,6 @@ "parser", "php" ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.11.0" - }, "time": "2021-07-03T13:36:55+00:00" }, { @@ -3001,10 +2849,6 @@ "phplint", "syntax" ], - "support": { - "issues": "https://github.com/overtrue/phplint/issues", - "source": "https://github.com/overtrue/phplint/tree/3.0.0" - }, "time": "2021-06-02T13:27:41+00:00" }, { @@ -3061,10 +2905,6 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" - }, "time": "2020-06-27T14:33:11+00:00" }, { @@ -3112,10 +2952,6 @@ } ], "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" - }, "time": "2021-02-23T14:00:09+00:00" }, { @@ -3164,10 +3000,6 @@ "keywords": [ "diff" ], - "support": { - "issues": "https://github.com/PHP-CS-Fixer/diff/issues", - "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" - }, "time": "2020-10-14T08:32:19+00:00" }, { @@ -3217,10 +3049,6 @@ "reflection", "static analysis" ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, "time": "2020-06-27T09:03:43+00:00" }, { @@ -3273,10 +3101,6 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" - }, "time": "2020-09-03T19:13:55+00:00" }, { @@ -3322,10 +3146,6 @@ } ], "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.4.0" - }, "time": "2020-09-17T18:55:26+00:00" }, { @@ -3389,10 +3209,6 @@ "spy", "stub" ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" - }, "time": "2021-03-17T13:42:18+00:00" }, { @@ -3460,10 +3276,6 @@ "testing", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3520,10 +3332,6 @@ "filesystem", "iterator" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3583,10 +3391,6 @@ "keywords": [ "process" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3642,10 +3446,6 @@ "keywords": [ "template" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3701,10 +3501,6 @@ "keywords": [ "timer" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3800,10 +3596,6 @@ "testing", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.6" - }, "funding": [ { "url": "https://phpunit.de/donate.html", @@ -3860,11 +3652,60 @@ "psr", "psr-6" ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, "time": "2016-08-06T20:24:11+00:00" }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2019-04-30T12:38:16+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -3913,9 +3754,6 @@ "request", "response" ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, "time": "2016-08-06T14:39:51+00:00" }, { @@ -3956,10 +3794,6 @@ } ], "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -3968,12 +3802,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "fc5e5d772af47d035df8178172391259b6e30566" + "reference": "94cca8d2520d4626036c799109c278548572bdbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/fc5e5d772af47d035df8178172391259b6e30566", - "reference": "fc5e5d772af47d035df8178172391259b6e30566", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/94cca8d2520d4626036c799109c278548572bdbe", + "reference": "94cca8d2520d4626036c799109c278548572bdbe", "shasum": "" }, "conflict": { @@ -3990,13 +3824,14 @@ "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": "<4.4.5", + "baserproject/basercms": "<=4.5", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bolt/bolt": "<3.7.2", "bolt/core": "<4.1.13", "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<5.1.2", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cachethq/cachet": "<2.5.1", "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", @@ -4006,7 +3841,7 @@ "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.16|>=4.10,<4.11.5|= 4.10.0", + "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", "craftcms/cms": "<3.6.7", "croogo/croogo": "<3.0.7", @@ -4023,10 +3858,10 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<11.0.4", + "dolibarr/dolibarr": "<14", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", - "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", @@ -4049,6 +3884,7 @@ "ezyang/htmlpurifier": "<4.1.1", "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=0.1.3", "firebase/php-jwt": "<2", "flarum/core": ">=1,<=1.0.1", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", @@ -4062,6 +3898,7 @@ "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", "getgrav/grav": "<=1.7.10", "getkirby/cms": "<=3.5.6", @@ -4069,7 +3906,9 @@ "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<5.6", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "helloxz/imgurl": "<=2.31", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", "illuminate/database": "<6.20.26|>=7,<8.40", @@ -4090,18 +3929,21 @@ "laminas/laminas-http": "<2.14.2", "laravel/framework": "<6.20.26|>=7,<8.40", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "lavalite/cms": "<=5.8", "league/commonmark": "<0.18.3", "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", "librenms/librenms": "<21.1", "livewire/livewire": ">2.2.4,<2.2.6", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<3.3.2|= 2.13.1", + "mautic/core": "<4|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", @@ -4112,6 +3954,7 @@ "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<=2.1.27.36", "nukeviet/nukeviet": "<4.3.4", "nystudio107/craft-seomatic": "<3.3", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", @@ -4119,11 +3962,12 @@ "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", "october/october": ">=1.0.319,<1.0.466", "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.472|>=1.1.1,<1.1.5", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "opencart/opencart": "<=3.0.3.2", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", + "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", @@ -4133,10 +3977,10 @@ "paragonie/random_compat": "<2", "passbolt/passbolt_api": "<2.11", "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.12", + "pear/archive_tar": "<1.4.14", "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", - "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", @@ -4146,7 +3990,7 @@ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<10.0.7", + "pimcore/pimcore": "<10.1.1", "pocketmine/pocketmine-mp": "<3.15.4", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", @@ -4169,8 +4013,8 @@ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.4.1", - "shopware/platform": "<=6.4.1", + "shopware/core": "<=6.4.3", + "shopware/platform": "<=6.4.3", "shopware/production": "<=6.3.5.2", "shopware/shopware": "<=5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", @@ -4244,12 +4088,13 @@ "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "titon/framework": ">=0,<9.9.99", + "topthink/think": "<=6.0.9", "tribalsystems/zenario": "<8.8.53370", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", @@ -4258,9 +4103,11 @@ "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "vrana/adminer": "<4.7.9", "wallabag/tcpdf": "<6.2.22", + "webcoast/deferred-image-processing": "<1.0.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", "wp-cli/wp-cli": "<2.5", @@ -4275,7 +4122,7 @@ "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", "yoast-seo-for-typo3/yoast_seo": "<7.2.1", - "yourls/yourls": "<1.7.4", + "yourls/yourls": "<=1.8.1", "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -4322,10 +4169,6 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "support": { - "issues": "https://github.com/Roave/SecurityAdvisories/issues", - "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" - }, "funding": [ { "url": "https://github.com/Ocramius", @@ -4336,7 +4179,7 @@ "type": "tidelift" } ], - "time": "2021-07-13T18:03:10+00:00" + "time": "2021-09-01T09:02:34+00:00" }, { "name": "sebastian/cli-parser", @@ -4382,10 +4225,6 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4438,10 +4277,6 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4493,10 +4328,6 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4567,10 +4398,6 @@ "compare", "equality" ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4624,10 +4451,6 @@ ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4690,10 +4513,6 @@ "unidiff", "unified diff" ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4753,10 +4572,6 @@ "environment", "hhvm" ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4830,10 +4645,6 @@ "export", "exporter" ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4894,10 +4705,6 @@ "keywords": [ "global state" ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4951,10 +4758,6 @@ ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5008,10 +4811,6 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5063,10 +4862,6 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5126,10 +4921,6 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5181,10 +4972,6 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5237,10 +5024,6 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5290,10 +5073,6 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5351,29 +5130,25 @@ "phpcs", "standards" ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, "time": "2021-04-09T00:54:41+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814" + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", - "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5404,9 +5179,6 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5421,7 +5193,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:40:38+00:00" + "time": "2021-07-21T12:38:00+00:00" }, { "name": "symfony/options-resolver", @@ -5473,9 +5245,6 @@ "configuration", "options" ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5549,9 +5318,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5611,9 +5377,6 @@ ], "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5668,10 +5431,6 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" - }, "funding": [ { "url": "https://github.com/theseer", @@ -5732,10 +5491,6 @@ "check", "validate" ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, "time": "2021-03-09T10:59:23+00:00" } ], From a0b2aa1c5be81a52877d8ddc2c993130a42b72c1 Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Fri, 13 Aug 2021 02:22:38 +0300 Subject: [PATCH 28/52] update changelog (#83) --- CHANGELOG.md | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed059d4..f694e92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,22 @@ -## [1.2.0](1.2.0) +## [1.2.1](https://github.com/Codeception/robo-paracept/releases/tag/1.2.1) Bugfix + +Pull Request: [#82](https://github.com/Codeception/robo-paracept/pull/82) + +Calculation number of tests in groups in class TestsSplitterTask did not work as expected. +If you have a high number of Tests it was possible that the last group received a huge number of tests while all others had a stable small number of tests. + +- Fixing calculation number of tests in Groups +- Using PHP Built In round() instead of floor() + +## [1.2.0](https://github.com/Codeception/robo-paracept/releases/tag/1.2.0) - Bugfix for extension FailedTestsReporter and new FailedTestsMergerTask [#75](https://github.com/Codeception/robo-paracept/pull/75) - generated Files will not be overwriten anymore - each generated File has now a uniqid-suffix (PHP Function uniqid('', true)) - merge generated report files from FailedTestsReporter into single file - posibility to merge also another files into a single file - - -- Bugfix src/Splitter/TestsSplitter.php::testsFrom [#78](https://github.com/Codeception/robo-paracept/pull/78) @ccsuperstar + +- Bugfix src/Splitter/TestsSplitter.php::testsFrom [#78](https://github.com/Codeception/robo-paracept/pull/78) [@ccsuperstar](https://github.com/ccsuperstar) - revert string type hint and allow array or string again ## [1.1.1](https://github.com/Codeception/robo-paracept/releases/tag/1.1.1) Bugfix @@ -28,7 +37,7 @@ Big day for Robo-Paracept. The first stable version is released! ✈️ * **Support for modern PHP 7.3, 7.4, 8.0** * Added support for the latest [Robo task runner](https://robo.li) * Added **Filters** to select tests before splitting them -* Added **SplitByTime** task to use time statistics of previous runs to balance groups of tests. Thanks to @ivan1986 +* Added **SplitByTime** task to use time statistics of previous runs to balance groups of tests. Thanks to [@ivan1986](https://github.com/ivan1986) ## [0.4.2](https://github.com/Codeception/robo-paracept/releases/tag/0.4.2) Resolve dependencies when splitting tests @@ -41,9 +50,9 @@ Big day for Robo-Paracept. The first stable version is released! ✈️ ## [0.4.0](https://github.com/Codeception/robo-paracept/releases/tag/0.4.0) Minor improvements -* [#37](https://github.com/Codeception/robo-paracept/pull/37) Added `excluePath` option to `SplitTestsByGroups` task. By @thejanasatan -* [#36](https://github.com/Codeception/robo-paracept/pull/36) Added mergeRewrite to merge reports by @maxgorovenko -* [#30](https://github.com/Codeception/robo-paracept/pull/30) Fixed execute test name from data provider by @ivan1986 +* [#37](https://github.com/Codeception/robo-paracept/pull/37) Added `excluePath` option to `SplitTestsByGroups` task. By [@thejanasatan](https://github.com/thejanasatan) +* [#36](https://github.com/Codeception/robo-paracept/pull/36) Added mergeRewrite to merge reports by [@maxgorovenko](https://github.com/maxgorovenko) +* [#30](https://github.com/Codeception/robo-paracept/pull/30) Fixed execute test name from data provider by [@ivan1986](https://github.com/ivan1986) Also PHPUnit 6 compatibility can be achieved by including Codeception's autoloader: @@ -51,7 +60,7 @@ Also PHPUnit 6 compatibility can be achieved by including Codeception's autoload require 'vendor/codeception/codeception/autoload.php' ``` -See https://github.com/Codeception/robo-paracept/issues/35#issuecomment-311605115 +See [#35 (comment)](https://github.com/Codeception/robo-paracept/issues/35#issuecomment-311605115) ## [0.3.1](https://github.com/Codeception/robo-paracept/releases/tag/0.3.1) 0.3.1: Merge pull request #27 from dhiva/master From b4627eec712142d122f41d7eda85030d8ec51a28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Sep 2021 21:52:24 +0200 Subject: [PATCH 29/52] Bump codeception/codeception from 4.1.21 to 4.1.22 (#84) Bumps [codeception/codeception](https://github.com/Codeception/Codeception) from 4.1.21 to 4.1.22. - [Release notes](https://github.com/Codeception/Codeception/releases) - [Changelog](https://github.com/Codeception/Codeception/blob/4.1/CHANGELOG-4.x.md) - [Commits](https://github.com/Codeception/Codeception/compare/4.1.21...4.1.22) --- updated-dependencies: - dependency-name: codeception/codeception dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 543 ++++++++++++++------------------------------------ 1 file changed, 149 insertions(+), 394 deletions(-) diff --git a/composer.lock b/composer.lock index 6842fe1..7c109f5 100644 --- a/composer.lock +++ b/composer.lock @@ -55,10 +55,6 @@ } ], "description": "Initialize Symfony Console commands from annotated command class methods.", - "support": { - "issues": "https://github.com/consolidation/annotated-command/issues", - "source": "https://github.com/consolidation/annotated-command/tree/4.2.4" - }, "time": "2020-12-10T16:56:39+00:00" }, { @@ -115,10 +111,6 @@ } ], "description": "Provide configuration services for a commandline tool.", - "support": { - "issues": "https://github.com/consolidation/config/issues", - "source": "https://github.com/consolidation/config/tree/2.0.1" - }, "time": "2020-12-06T00:03:30+00:00" }, { @@ -167,10 +159,6 @@ } ], "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", - "support": { - "issues": "https://github.com/consolidation/log/issues", - "source": "https://github.com/consolidation/log/tree/2.0.2" - }, "time": "2020-12-10T16:26:23+00:00" }, { @@ -226,10 +214,6 @@ } ], "description": "Format text by applying transformations provided by plug-in formatters.", - "support": { - "issues": "https://github.com/consolidation/output-formatters/issues", - "source": "https://github.com/consolidation/output-formatters/tree/4.1.2" - }, "time": "2020-12-12T19:04:59+00:00" }, { @@ -325,10 +309,6 @@ } ], "description": "Modern task runner", - "support": { - "issues": "https://github.com/consolidation/Robo/issues", - "source": "https://github.com/consolidation/Robo/tree/3.0.3" - }, "time": "2021-02-21T19:19:43+00:00" }, { @@ -379,10 +359,6 @@ } ], "description": "Provides a self:update command for Symfony Console applications.", - "support": { - "issues": "https://github.com/consolidation/self-update/issues", - "source": "https://github.com/consolidation/self-update/tree/1.2.0" - }, "time": "2020-04-13T02:49:20+00:00" }, { @@ -442,10 +418,6 @@ "dot", "notation" ], - "support": { - "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/master" - }, "time": "2017-01-20T21:14:22+00:00" }, { @@ -493,10 +465,6 @@ } ], "description": "Expands internal property references in PHP arrays file.", - "support": { - "issues": "https://github.com/grasmash/expander/issues", - "source": "https://github.com/grasmash/expander/tree/master" - }, "time": "2017-12-21T22:14:55+00:00" }, { @@ -566,10 +534,6 @@ "provider", "service" ], - "support": { - "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/3.4.1" - }, "funding": [ { "url": "https://github.com/philipobenito", @@ -620,10 +584,6 @@ "container-interop", "psr" ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, "time": "2021-03-05T17:36:06+00:00" }, { @@ -670,10 +630,6 @@ "psr", "psr-14" ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, "time": "2019-01-08T18:20:26+00:00" }, { @@ -721,9 +677,6 @@ "psr", "psr-3" ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, "time": "2021-05-03T11:20:27+00:00" }, { @@ -798,9 +751,6 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v5.1.11" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -865,9 +815,6 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -886,23 +833,23 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.3.0", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce" + "reference": "ce7b20d69c66a20939d8952b617506a44d102130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67a5f354afa8e2f231081b3fa11a5912f933c3ce", - "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", + "reference": "ce7b20d69c66a20939d8952b617506a44d102130", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -912,7 +859,7 @@ "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-handler": "^4.4|^5.0", @@ -950,9 +897,6 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -967,7 +911,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -1029,9 +973,6 @@ "interoperability", "standards" ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1091,9 +1032,6 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.3" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1152,9 +1090,6 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1231,9 +1166,6 @@ "polyfill", "portable" ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1252,16 +1184,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", "shasum": "" }, "require": { @@ -1312,9 +1244,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1329,7 +1258,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-intl-normalizer", @@ -1396,9 +1325,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1417,16 +1343,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { @@ -1476,9 +1402,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1493,7 +1416,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php73", @@ -1555,9 +1478,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1576,16 +1496,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -1638,9 +1558,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1655,7 +1572,7 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/process", @@ -1700,9 +1617,6 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.3.2" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1779,9 +1693,6 @@ "interoperability", "standards" ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1800,16 +1711,16 @@ }, { "name": "symfony/string", - "version": "v5.3.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", - "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", "shasum": "" }, "require": { @@ -1862,9 +1773,6 @@ "utf-8", "utf8" ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.3.3" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1879,20 +1787,20 @@ "type": "tidelift" } ], - "time": "2021-06-27T11:44:38+00:00" + "time": "2021-08-26T08:00:08+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.3", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229" + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", - "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", "shasum": "" }, "require": { @@ -1937,9 +1845,6 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.3" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1954,7 +1859,7 @@ "type": "tidelift" } ], - "time": "2021-06-24T08:13:00+00:00" + "time": "2021-07-29T06:20:01+00:00" } ], "packages-dev": [ @@ -2016,24 +1921,20 @@ "gherkin", "parser" ], - "support": { - "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" - }, "time": "2021-02-04T12:44:21+00:00" }, { "name": "codeception/codeception", - "version": "4.1.21", + "version": "4.1.22", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "c25f20d842a7e3fa0a8e6abf0828f102c914d419" + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/c25f20d842a7e3fa0a8e6abf0828f102c914d419", - "reference": "c25f20d842a7e3fa0a8e6abf0828f102c914d419", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", "shasum": "" }, "require": { @@ -2044,7 +1945,7 @@ "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/psr7": "~1.4", + "guzzlehttp/psr7": "^1.4 | ^2.0", "php": ">=5.6.0 <9.0", "symfony/console": ">=2.7 <6.0", "symfony/css-selector": ">=2.7 <6.0", @@ -2105,17 +2006,13 @@ "functional testing", "unit testing" ], - "support": { - "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.1.21" - }, "funding": [ { "url": "https://opencollective.com/codeception", "type": "open_collective" } ], - "time": "2021-05-28T17:43:39+00:00" + "time": "2021-08-06T17:15:34+00:00" }, { "name": "codeception/lib-asserts", @@ -2165,10 +2062,6 @@ "keywords": [ "codeception" ], - "support": { - "issues": "https://github.com/Codeception/lib-asserts/issues", - "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" - }, "time": "2020-10-21T16:26:20+00:00" }, { @@ -2214,10 +2107,6 @@ } ], "description": "PHPUnit classes used by Codeception", - "support": { - "issues": "https://github.com/Codeception/phpunit-wrapper/issues", - "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.6" - }, "time": "2020-12-28T13:59:47+00:00" }, { @@ -2248,10 +2137,6 @@ "MIT" ], "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", - "support": { - "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/3.7.0" - }, "time": "2020-07-03T15:54:43+00:00" }, { @@ -2314,11 +2199,6 @@ "validation", "versioning" ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" - }, "funding": [ { "url": "https://packagist.com", @@ -2378,11 +2258,6 @@ "Xdebug", "performance" ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.1" - }, "funding": [ { "url": "https://packagist.com", @@ -2465,10 +2340,6 @@ "docblock", "parser" ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.1" - }, "time": "2021-05-16T18:07:53+00:00" }, { @@ -2520,10 +2391,6 @@ "constructor", "instantiate" ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" - }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -2600,10 +2467,6 @@ "parser", "php" ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" - }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -2696,10 +2559,6 @@ } ], "description": "A tool to automatically fix PHP code style", - "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.0.0" - }, "funding": [ { "url": "https://github.com/keradus", @@ -2710,29 +2569,32 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.8.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91" + "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", + "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2740,16 +2602,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2764,6 +2623,11 @@ { "name": "Tobias Schultze", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -2777,11 +2641,7 @@ "uri", "url" ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.2" - }, - "time": "2021-04-26T09:17:50+00:00" + "time": "2021-06-30T20:03:07+00:00" }, { "name": "myclabs/deep-copy", @@ -2829,10 +2689,6 @@ "object", "object graph" ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" - }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", @@ -2875,10 +2731,6 @@ } ], "description": "JUnit XML Document generation library", - "support": { - "issues": "https://github.com/cmuench/junit-xml/issues", - "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" - }, "time": "2020-12-25T09:08:58+00:00" }, { @@ -2931,10 +2783,6 @@ "parser", "php" ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.11.0" - }, "time": "2021-07-03T13:36:55+00:00" }, { @@ -3001,10 +2849,6 @@ "phplint", "syntax" ], - "support": { - "issues": "https://github.com/overtrue/phplint/issues", - "source": "https://github.com/overtrue/phplint/tree/3.0.0" - }, "time": "2021-06-02T13:27:41+00:00" }, { @@ -3061,10 +2905,6 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" - }, "time": "2020-06-27T14:33:11+00:00" }, { @@ -3112,10 +2952,6 @@ } ], "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" - }, "time": "2021-02-23T14:00:09+00:00" }, { @@ -3164,10 +3000,6 @@ "keywords": [ "diff" ], - "support": { - "issues": "https://github.com/PHP-CS-Fixer/diff/issues", - "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" - }, "time": "2020-10-14T08:32:19+00:00" }, { @@ -3217,10 +3049,6 @@ "reflection", "static analysis" ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, "time": "2020-06-27T09:03:43+00:00" }, { @@ -3273,10 +3101,6 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" - }, "time": "2020-09-03T19:13:55+00:00" }, { @@ -3322,10 +3146,6 @@ } ], "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.4.0" - }, "time": "2020-09-17T18:55:26+00:00" }, { @@ -3389,10 +3209,6 @@ "spy", "stub" ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" - }, "time": "2021-03-17T13:42:18+00:00" }, { @@ -3460,10 +3276,6 @@ "testing", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3520,10 +3332,6 @@ "filesystem", "iterator" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3583,10 +3391,6 @@ "keywords": [ "process" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3642,10 +3446,6 @@ "keywords": [ "template" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3701,10 +3501,6 @@ "keywords": [ "timer" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3800,10 +3596,6 @@ "testing", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.6" - }, "funding": [ { "url": "https://phpunit.de/donate.html", @@ -3860,11 +3652,60 @@ "psr", "psr-6" ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, "time": "2016-08-06T20:24:11+00:00" }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2019-04-30T12:38:16+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -3913,9 +3754,6 @@ "request", "response" ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, "time": "2016-08-06T14:39:51+00:00" }, { @@ -3956,10 +3794,6 @@ } ], "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -3968,12 +3802,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "fc5e5d772af47d035df8178172391259b6e30566" + "reference": "94cca8d2520d4626036c799109c278548572bdbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/fc5e5d772af47d035df8178172391259b6e30566", - "reference": "fc5e5d772af47d035df8178172391259b6e30566", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/94cca8d2520d4626036c799109c278548572bdbe", + "reference": "94cca8d2520d4626036c799109c278548572bdbe", "shasum": "" }, "conflict": { @@ -3990,13 +3824,14 @@ "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": "<4.4.5", + "baserproject/basercms": "<=4.5", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bolt/bolt": "<3.7.2", "bolt/core": "<4.1.13", "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<5.1.2", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cachethq/cachet": "<2.5.1", "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", @@ -4006,7 +3841,7 @@ "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.16|>=4.10,<4.11.5|= 4.10.0", + "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", "craftcms/cms": "<3.6.7", "croogo/croogo": "<3.0.7", @@ -4023,10 +3858,10 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<11.0.4", + "dolibarr/dolibarr": "<14", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", - "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", @@ -4049,6 +3884,7 @@ "ezyang/htmlpurifier": "<4.1.1", "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=0.1.3", "firebase/php-jwt": "<2", "flarum/core": ">=1,<=1.0.1", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", @@ -4062,6 +3898,7 @@ "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", "getgrav/grav": "<=1.7.10", "getkirby/cms": "<=3.5.6", @@ -4069,7 +3906,9 @@ "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<5.6", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "helloxz/imgurl": "<=2.31", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", "illuminate/database": "<6.20.26|>=7,<8.40", @@ -4090,18 +3929,21 @@ "laminas/laminas-http": "<2.14.2", "laravel/framework": "<6.20.26|>=7,<8.40", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "lavalite/cms": "<=5.8", "league/commonmark": "<0.18.3", "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", "librenms/librenms": "<21.1", "livewire/livewire": ">2.2.4,<2.2.6", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<3.3.2|= 2.13.1", + "mautic/core": "<4|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", @@ -4112,6 +3954,7 @@ "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<=2.1.27.36", "nukeviet/nukeviet": "<4.3.4", "nystudio107/craft-seomatic": "<3.3", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", @@ -4119,11 +3962,12 @@ "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", "october/october": ">=1.0.319,<1.0.466", "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.472|>=1.1.1,<1.1.5", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "opencart/opencart": "<=3.0.3.2", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", + "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", @@ -4133,10 +3977,10 @@ "paragonie/random_compat": "<2", "passbolt/passbolt_api": "<2.11", "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.12", + "pear/archive_tar": "<1.4.14", "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", - "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", @@ -4146,7 +3990,7 @@ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<10.0.7", + "pimcore/pimcore": "<10.1.1", "pocketmine/pocketmine-mp": "<3.15.4", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", @@ -4169,8 +4013,8 @@ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.4.1", - "shopware/platform": "<=6.4.1", + "shopware/core": "<=6.4.3", + "shopware/platform": "<=6.4.3", "shopware/production": "<=6.3.5.2", "shopware/shopware": "<=5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", @@ -4244,12 +4088,13 @@ "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "titon/framework": ">=0,<9.9.99", + "topthink/think": "<=6.0.9", "tribalsystems/zenario": "<8.8.53370", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", @@ -4258,9 +4103,11 @@ "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "vrana/adminer": "<4.7.9", "wallabag/tcpdf": "<6.2.22", + "webcoast/deferred-image-processing": "<1.0.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", "wp-cli/wp-cli": "<2.5", @@ -4275,7 +4122,7 @@ "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", "yoast-seo-for-typo3/yoast_seo": "<7.2.1", - "yourls/yourls": "<1.7.4", + "yourls/yourls": "<=1.8.1", "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -4322,10 +4169,6 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "support": { - "issues": "https://github.com/Roave/SecurityAdvisories/issues", - "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" - }, "funding": [ { "url": "https://github.com/Ocramius", @@ -4336,7 +4179,7 @@ "type": "tidelift" } ], - "time": "2021-07-13T18:03:10+00:00" + "time": "2021-09-01T09:02:34+00:00" }, { "name": "sebastian/cli-parser", @@ -4382,10 +4225,6 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4438,10 +4277,6 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4493,10 +4328,6 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4567,10 +4398,6 @@ "compare", "equality" ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4624,10 +4451,6 @@ ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4690,10 +4513,6 @@ "unidiff", "unified diff" ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4753,10 +4572,6 @@ "environment", "hhvm" ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4830,10 +4645,6 @@ "export", "exporter" ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4894,10 +4705,6 @@ "keywords": [ "global state" ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4951,10 +4758,6 @@ ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5008,10 +4811,6 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5063,10 +4862,6 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5126,10 +4921,6 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5181,10 +4972,6 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5237,10 +5024,6 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5290,10 +5073,6 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5351,29 +5130,25 @@ "phpcs", "standards" ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, "time": "2021-04-09T00:54:41+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814" + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", - "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5404,9 +5179,6 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5421,7 +5193,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:40:38+00:00" + "time": "2021-07-21T12:38:00+00:00" }, { "name": "symfony/options-resolver", @@ -5473,9 +5245,6 @@ "configuration", "options" ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5549,9 +5318,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5611,9 +5377,6 @@ ], "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5668,10 +5431,6 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" - }, "funding": [ { "url": "https://github.com/theseer", @@ -5732,10 +5491,6 @@ "check", "validate" ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, "time": "2021-03-09T10:59:23+00:00" } ], From 659a9f939731cae675b3d852952ff2cb637bd092 Mon Sep 17 00:00:00 2001 From: KJunker Date: Mon, 6 Sep 2021 21:22:39 +0200 Subject: [PATCH 30/52] html report merger skip not existing report (#85) * Issue https://github.com/Codeception/robo-paracept/issues/31 - Fixing headerline from NOT OK to Standard FAILED after merge - continue if report html file did not exist - print task warning message --- src/Merger/HtmlReportMerger.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php index 5726713..d2ce82e 100644 --- a/src/Merger/HtmlReportMerger.php +++ b/src/Merger/HtmlReportMerger.php @@ -109,8 +109,12 @@ public function run() throw XPathExpressionException::malformedXPath($xpathExprRefNodes); } for ($k = 1, $kMax = count($this->src); $k < $kMax; $k++) { - $srcHTML = new DOMDocument(); $src = $this->src[$k]; + if (!file_exists($src) || !is_readable($src)) { + $this->printTaskWarning('File did not exists or is not readable: ' . $src); + continue; + } + $srcHTML = new DOMDocument(); $srcHTML->loadHTMLFile($src, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $this->countExecutionTime($srcHTML); $xpathExprSuiteNodes = "//div[@class='layout']/table/tr"; @@ -199,7 +203,7 @@ private function updateHeaderLine(DOMDocument $dstFile): void $statusNode = $nodeList[0]->childNodes[1]->childNodes[0]; $statusAttr = $statusNode->attributes[0]; if (0 !== ($this->countFailed + $this->countIncomplete + $this->countSkipped)) { - $statusNode->nodeValue = 'NOT OK'; + $statusNode->nodeValue = 'FAILED'; $statusAttr->value = 'color: red'; } $executionTimeNode->nodeValue = " ({$this->executionTimeSum}s)"; From c3d3d84986d98fe021e9e01feccaf6ca9e2859d7 Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Thu, 9 Sep 2021 01:10:13 +0300 Subject: [PATCH 31/52] update changelog (#87) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f694e92..1527fab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [1.2.2](https://github.com/Codeception/robo-paracept/releases/tag/1.2.2) Bugfix HTML Merger + +Fix [#31](https://github.com/Codeception/robo-paracept/issues/31) + ## [1.2.1](https://github.com/Codeception/robo-paracept/releases/tag/1.2.1) Bugfix Pull Request: [#82](https://github.com/Codeception/robo-paracept/pull/82) From 16e92c798fe69fef2db2f473939623bb1ef122dd Mon Sep 17 00:00:00 2001 From: KJunker Date: Thu, 16 Sep 2021 21:35:03 +0200 Subject: [PATCH 32/52] Bugfix/xml merger do not throw exception of missing xml (#88) * Issue XML Report Merger - continue if xml report file did not exist - print task warning message --- src/Merger/XmlReportMergerTask.php | 5 +++-- tests/Merger/XmlReportMergerTaskTest.php | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Merger/XmlReportMergerTask.php b/src/Merger/XmlReportMergerTask.php index 6515406..999b1bc 100644 --- a/src/Merger/XmlReportMergerTask.php +++ b/src/Merger/XmlReportMergerTask.php @@ -92,8 +92,9 @@ public function run(): void $this->printTaskInfo("Processing $src"); $srcXml = new DOMDocument(); - if (!file_exists($src)) { - throw new TaskException($this, "XML file $src does not exist"); + if (!file_exists($src) || !is_readable($src)) { + $this->printTaskWarning('File did not exists or is not readable: ' . $src); + continue; } $loaded = $srcXml->load($src); if (!$loaded) { diff --git a/tests/Merger/XmlReportMergerTaskTest.php b/tests/Merger/XmlReportMergerTaskTest.php index b4a9ae5..dad79f3 100644 --- a/tests/Merger/XmlReportMergerTaskTest.php +++ b/tests/Merger/XmlReportMergerTaskTest.php @@ -16,6 +16,8 @@ public function testMergeReports(): void $task->setLogger(new Logger(new NullOutput())); $task->from(TEST_PATH . '/fixtures/result1.xml') ->from(TEST_PATH . '/fixtures/result2.xml') + // This report did not exists and we should not throw an exception + ->from(TEST_PATH . '/fixtures/result3.xml') ->into(TEST_PATH . '/result/merged.xml') ->run(); From 13e2a48b71877bf71be88d62ad66a6f9984ce28a Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Sun, 19 Sep 2021 00:25:27 +0300 Subject: [PATCH 33/52] Update CHANGELOG.md (#90) --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1527fab..cca4ca0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [1.2.3](https://github.com/Codeception/robo-paracept/releases/tag/1.2.3) Bugfix Release XmlMerger + +Fix the issue that an exception is thrown if a xml report does not exists. + ## [1.2.2](https://github.com/Codeception/robo-paracept/releases/tag/1.2.2) Bugfix HTML Merger Fix [#31](https://github.com/Codeception/robo-paracept/issues/31) @@ -91,4 +95,4 @@ https://codeception.com/docs/12-ParallelExecution#Robo ## [0.1.0](https://github.com/Codeception/robo-paracept/releases/tag/0.1.0) -To be compatible with codeception 2.2.2 \ No newline at end of file +To be compatible with codeception 2.2.2 From ca1650ec00baea1b740cba02b9041c79bb64c1c3 Mon Sep 17 00:00:00 2001 From: KJunker Date: Fri, 29 Oct 2021 21:18:06 +0200 Subject: [PATCH 34/52] Bugfix/91 fixing html merger (#92) * Issue HTML Report Merger - continue if html report file did not exist - print task warning message --- src/Merger/HtmlReportMerger.php | 12 ++++++++++++ tests/Merger/HtmlReportMergerTest.php | 1 + 2 files changed, 13 insertions(+) diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php index d2ce82e..66fc492 100644 --- a/src/Merger/HtmlReportMerger.php +++ b/src/Merger/HtmlReportMerger.php @@ -85,6 +85,18 @@ public function run() throw new TaskException($this, "No destination file is set. Use `->into()` method to set result HTML"); } + $this->printTaskInfo("Remove not existing HTML reports..."); + foreach ($this->src as $index => $item) { + if (!file_exists($item)) { + unset($this->src[$index]); + $this->printTaskWarning( + "HTML report {$item} did not exist and was removed from merge list" + ); + } + } + // Resetting keys + $this->src = array_values($this->src); + $this->printTaskInfo("Merging HTML reports into {$this->dst}"); //read first source file as main diff --git a/tests/Merger/HtmlReportMergerTest.php b/tests/Merger/HtmlReportMergerTest.php index 129a563..55328d9 100644 --- a/tests/Merger/HtmlReportMergerTest.php +++ b/tests/Merger/HtmlReportMergerTest.php @@ -28,6 +28,7 @@ public function testRun(): void $task ->from( [ + $reportPath . 'report_0.html', // this file did not exists and it should not fail $reportPath . 'report_1.html', $reportPath . 'report_2.html', $reportPath . 'report_3.html', From 616747b7e825e5ea8afb0c8c917b94f572476a55 Mon Sep 17 00:00:00 2001 From: Michael Bodnarchuk Date: Sat, 18 Dec 2021 03:34:33 +0200 Subject: [PATCH 35/52] Group loader fixes (#96) * fixed loading groups in filter * make all tasks to return results * added warning that relative path not set * fixed codestyle --- README.md | 38 ++++++++++++++++++++---- src/Filter/GroupFilter.php | 12 +++++--- src/Splitter/FailedTestSplitterTask.php | 11 +++++-- src/Splitter/SplitTestsByTimeTask.php | 11 ++++++- src/Splitter/TestFileSplitterTask.php | 13 ++++++-- src/Splitter/TestsSplitter.php | 14 ++++++++- src/Splitter/TestsSplitterTask.php | 24 ++++++++++----- tests/Splitter/TestsSplitterTaskTest.php | 9 +++++- 8 files changed, 108 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index d466607..c25185e 100644 --- a/README.md +++ b/README.md @@ -42,21 +42,39 @@ So we prepared a set of predefined Robo tasks that can be combined and reconfigu Load tests from a folder and distributes them between groups. ```php -$this->taskSplitTestsByGroups(5) +$result = $this->taskSplitTestsByGroups(5) ->testsFrom('tests/acceptance') ->projectRoot('.') ->groupsTo('tests/_data/group_') ->run(); + +// task returns a result which contains information about processed data: +// optionally check result data +if ($result->wasSuccessful()) { + $groups = $result['groups']; + $tests = $result['tests']; + $filenames = $result['files']; +} ``` -this command uses `Codeception\Test\Loader` to load tests and organize them between group. If you want just split test file and not actual tests (and not load tests into memory) you can use: +> This command **loads Codeception into memory**, loads and parses tests to organize them between group. If you want just split test file and not actual tests (and not load tests into memory) use `taskSplitTestFilesByGroups`: + +### SplitTestFilesByGroups + +To split tests by suites (files) without loading them into memory use `taskSplitTestFilesByGroups` method: ```php -$this->taskSplitTestFilesByGroups(5) +$result = $this->taskSplitTestFilesByGroups(5) ->testsFrom('tests') ->groupsTo('tests/_data/paratest_') ->run(); + +// optionally check result data +if ($result->wasSuccessful()) { + $filenames = $result['files']; +} ``` + ### SplitTestsByTime Enable extension for collect execution time of you use taskSplitTestsByTime @@ -70,11 +88,16 @@ extensions: Load tests from a folder and distributes them between groups by execution time. ```php -$this->taskSplitTestsByTime(5) +$result = $this->taskSplitTestsByTime(5) ->testsFrom('tests/acceptance') ->projectRoot('.') ->groupsTo('tests/_data/group_') ->run(); + +// optionally check result data +if ($result->wasSuccessful()) { + $filenames = $result['files']; +} ``` this command need run all tests with `Codeception\Task\TimeReporter` for collect execution time. If you want just split tests between group (and not execute its) you can use SplitTestsByGroups. **Please be aware**: This task will not consider any 'depends' annotation! @@ -100,11 +123,16 @@ $this->taskMergeFailedTestsReports() Load the failed Tests from a reportfile into the groups: ```php -$this +$result = $this ->taskSplitFailedTests(5) ->setReportPath(\Codeception\Configuration::outputDir() . 'failedTests.txt') // absoulute Path to Reportfile ->groupsTo(\Codeception\Configuration::outputDir() . 'group_') ->run(); + +// optionally check result data +if ($result->wasSuccessful()) { + $filenames = $result['files']; +} ``` ### MergeXmlReports diff --git a/src/Filter/GroupFilter.php b/src/Filter/GroupFilter.php index 26d3dfc..3d2b9bb 100644 --- a/src/Filter/GroupFilter.php +++ b/src/Filter/GroupFilter.php @@ -4,6 +4,7 @@ namespace Codeception\Task\Filter; +use Codeception\Lib\GroupManager; use Codeception\Test\Descriptor as TestDescriptor; use Codeception\Util\Annotation; use InvalidArgumentException; @@ -123,6 +124,8 @@ public function setTests(array $tests): void */ public function filter(): array { + $groupManager = new GroupManager([]); + $testsByGroups = []; foreach ($this->getTests() as $test) { if (!($test instanceof SelfDescribing)) { @@ -130,17 +133,18 @@ public function filter(): array 'Tests must be an instance of ' . SelfDescribing::class ); } - [$class, $method] = explode(':', TestDescriptor::getTestSignature($test)); - $annotations = Annotation::forMethod($class, $method)->fetchAll('group'); + + $groups = $groupManager->groupsForTest($test); + if ( !empty($this->getExcludedGroups()) - && [] === array_diff($this->getExcludedGroups(), $annotations) + && [] === array_diff($this->getExcludedGroups(), $groups) ) { continue; } if ( !empty($this->getIncludedGroups()) - && [] !== array_diff($this->getIncludedGroups(), $annotations) + && [] !== array_diff($this->getIncludedGroups(), $groups) ) { continue; } diff --git a/src/Splitter/FailedTestSplitterTask.php b/src/Splitter/FailedTestSplitterTask.php index 74fe796..1c9b6e5 100644 --- a/src/Splitter/FailedTestSplitterTask.php +++ b/src/Splitter/FailedTestSplitterTask.php @@ -5,6 +5,7 @@ namespace Codeception\Task\Splitter; use InvalidArgumentException; +use Robo\Result; use RuntimeException; class FailedTestSplitterTask extends TestsSplitter @@ -23,7 +24,7 @@ public function getReportPath(): string /** * @inheritDoc */ - public function run() + public function run(): Result { $this->claimCodeceptionLoaded(); $reportPath = $this->getReportPath(); @@ -34,7 +35,7 @@ public function run() ); } - $this->splitToGroupFiles( + $filenames = $this->splitToGroupFiles( $this->filter( explode( PHP_EOL, @@ -42,6 +43,12 @@ public function run() ) ) ); + + $numFiles = count($filenames); + + return Result::success($this, "Split all tests into $numFiles group files", [ + 'files' => $filenames, + ]); } /** diff --git a/src/Splitter/SplitTestsByTimeTask.php b/src/Splitter/SplitTestsByTimeTask.php index 7bccb94..ec80195 100644 --- a/src/Splitter/SplitTestsByTimeTask.php +++ b/src/Splitter/SplitTestsByTimeTask.php @@ -8,6 +8,7 @@ use JsonException; use PHPUnit\Framework\DataProviderTestSuite; use Robo\Exception\TaskException; +use Robo\Result; use RuntimeException; /** @@ -25,7 +26,7 @@ public function statFile(string $path): self return $this; } - public function run(): void + public function run(): Result { $this->claimCodeceptionLoaded(); @@ -70,6 +71,7 @@ public function run(): void $groups[$i]['sum'] += $time; } + $filenames = []; // saving group files foreach ($groups as $i => ['tests' => $tests, 'sum' => $sum]) { $filename = $this->saveTo . ($i + 1); @@ -82,7 +84,14 @@ public function run(): void ) ); file_put_contents($filename, implode("\n", $tests)); + $filenames[] = $filename; } + + $numFiles = count($filenames); + + return Result::success($this, "Split all tests into $numFiles group files", [ + 'files' => $filenames, + ]); } /** diff --git a/src/Splitter/TestFileSplitterTask.php b/src/Splitter/TestFileSplitterTask.php index 9a69b18..2f7b0f0 100644 --- a/src/Splitter/TestFileSplitterTask.php +++ b/src/Splitter/TestFileSplitterTask.php @@ -4,6 +4,7 @@ namespace Codeception\Task\Splitter; +use Robo\Result; use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\SplFileInfo; @@ -29,7 +30,7 @@ class TestFileSplitterTask extends TestsSplitter { private $pattern = ['*Cept.php', '*Cest.php', '*Test.php', '*.feature']; - public function run() + public function run(): Result { $files = Finder::create() ->followLinks() @@ -38,7 +39,9 @@ public function run() ->in($this->projectRoot ?: getcwd()) ->exclude($this->excludePath); - $this->splitToGroupFiles( + + + $filenames = $this->splitToGroupFiles( array_map( static function (SplFileInfo $fileInfo): string { return $fileInfo->getRelativePathname(); @@ -46,6 +49,12 @@ static function (SplFileInfo $fileInfo): string { $this->filter(iterator_to_array($files->getIterator())) ) ); + + $numFiles = count($filenames); + + return Result::success($this, "Split all tests into $numFiles group files", [ + 'files' => $filenames, + ]); } /** diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 28b0471..66840f2 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -4,6 +4,7 @@ namespace Codeception\Task\Splitter; +use Codeception\Configuration; use Codeception\Task\Filter\DefaultFilter; use Codeception\Task\Filter\Filter; use ReflectionClass; @@ -208,6 +209,8 @@ protected function claimCodeceptionLoaded(): void 'This task requires Codeception to be loaded. Please require autoload.php of Codeception' ); } + // autoload PHPUnit files + \Codeception\PHPUnit\Init::init(); } /** @@ -223,11 +226,17 @@ protected function doCodeceptLoaderExists(): bool * @param string[] $files - the relative path of the Testfile with or without test function * @example $this->splitToGroupFiles(['tests/FooCest.php', 'tests/BarTest.php:testBarReturn']); */ - protected function splitToGroupFiles(array $files): void + protected function splitToGroupFiles(array $files): array { $i = 0; $groups = []; + if (!Configuration::projectDir()) { + $this->output()->writeln("Codeception config was not loaded, paths to tests may not be set correctly."); + $this->output()->writeln("Execute \Codeception\Configuration::config() before this task"); + } + + $this->printTaskInfo('Processing ' . count($files) . ' files'); // splitting tests by groups @@ -237,11 +246,14 @@ protected function splitToGroupFiles(array $files): void $i++; } + $filenames = []; // saving group files foreach ($groups as $i => $tests) { $filename = $this->saveTo . $i; $this->printTaskInfo("Writing $filename"); file_put_contents($filename, implode("\n", $tests)); + $filenames[] = $filename; } + return $filenames; } } diff --git a/src/Splitter/TestsSplitterTask.php b/src/Splitter/TestsSplitterTask.php index 9d6dc1a..a5129d1 100644 --- a/src/Splitter/TestsSplitterTask.php +++ b/src/Splitter/TestsSplitterTask.php @@ -12,6 +12,7 @@ use PHPUnit\Framework\DataProviderTestSuite; use PHPUnit\Framework\TestCase; use ReflectionObject; +use Robo\Result; /** * Loads all tests into groups and saves them to groupfile according to pattern. @@ -32,14 +33,14 @@ class TestsSplitterTask extends TestsSplitter { /** - * @return bool|null * @throws \Robo\Exception\TaskException */ - public function run() + public function run(): Result { $this->claimCodeceptionLoaded(); $tests = $this->filter($this->loadTests()); - $this->printTaskInfo('Processing ' . count($tests) . ' tests'); + $numTests = count($tests); + $this->printTaskInfo("Processing $numTests tests"); $testsHaveAtLeastOneDependency = false; @@ -98,7 +99,7 @@ public function run() ); } catch (Exception $e) { $this->printTaskError($e->getMessage()); - return false; + return Result::error($this, $e->getMessage(), ['exception' => $e]); } // resolved and ordered list of dependencies $orderedListOfTests = []; @@ -116,7 +117,7 @@ public function run() ); } catch (Exception $e) { $this->printTaskError($e->getMessage()); - return false; + return Result::error($this, $e->getMessage(), ['exception' => $e]); } } // if we don't have any dependencies just use keys from original list. @@ -145,14 +146,21 @@ public function run() $groups[$i][] = $test; } + $filenames = []; // saving group files - foreach ($groups as $i => $tests) { + foreach ($groups as $i => $groupTests) { $filename = $this->saveTo . $i; $this->printTaskInfo("Writing $filename"); - file_put_contents($filename, implode("\n", $tests)); + file_put_contents($filename, implode("\n", $groupTests)); + $filenames[] = $filename; } + $numFiles = count($filenames); - return null; + return Result::success($this, "Split $numTests into $numFiles group files", [ + 'groups' => $groups, + 'tests' => $tests, + 'files' => $filenames, + ]); } /** diff --git a/tests/Splitter/TestsSplitterTaskTest.php b/tests/Splitter/TestsSplitterTaskTest.php index 29d9baf..86cff53 100644 --- a/tests/Splitter/TestsSplitterTaskTest.php +++ b/tests/Splitter/TestsSplitterTaskTest.php @@ -86,7 +86,14 @@ public function testLoadTests( $task->testsFrom($from); $groupTo = TEST_PATH . '/result/group_'; $task->groupsTo($groupTo); - $task->run(); + $result = $task->run(); + + $this->assertNotEmpty($result); + + if ($expectedFiles > 0) { + $this->assertTrue($result->wasSuccessful()); + $this->assertEquals($expectedFiles, count($result['files'])); + } $files = Finder::create() ->files() From 87390e012d94709b922dbc8c7c65600ac1ff0d45 Mon Sep 17 00:00:00 2001 From: Davert Date: Sat, 18 Dec 2021 02:42:49 +0100 Subject: [PATCH 36/52] autoloading splitter --- README.md | 8 ++++++++ src/Splitter/TestsSplitter.php | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/README.md b/README.md index c25185e..1828d4a 100644 --- a/README.md +++ b/README.md @@ -208,4 +208,12 @@ class CustomFilter extends DefaultFilter { The TestFileSplitterTask.php pushes an array of SplFileInfo Objects to the filter. The TestsSplitterTask.php pushes an array of SelfDescribing Objects to the filter. +## Configuration + +Load Codeception config file to specify the path to Codeception before split* tasks: + +```php +\Codeception\Configuration::config('tests/codeception.yml'); +``` + ### License MIT diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 66840f2..3936c26 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -211,6 +211,13 @@ protected function claimCodeceptionLoaded(): void } // autoload PHPUnit files \Codeception\PHPUnit\Init::init(); + + try { + // load Codeception config to set base directory + \Codeception\Configuration::config(); + } catch (\Exception $e) { + $this->output()->writeln('Codeception config was not loaded, please load it manually'); + } } /** From b7ef6c8497b79040d13119033430e3b2d64cef6e Mon Sep 17 00:00:00 2001 From: KJunker Date: Sat, 18 Dec 2021 10:45:42 +0100 Subject: [PATCH 37/52] Bugfix/94 wrong html status fix (#95) * Only Failed Tests can change status to FAILED --- src/Merger/HtmlReportMerger.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php index 66fc492..c91f235 100644 --- a/src/Merger/HtmlReportMerger.php +++ b/src/Merger/HtmlReportMerger.php @@ -214,7 +214,7 @@ private function updateHeaderLine(DOMDocument $dstFile): void /** @var DOMAttr $statusAttr */ $statusNode = $nodeList[0]->childNodes[1]->childNodes[0]; $statusAttr = $statusNode->attributes[0]; - if (0 !== ($this->countFailed + $this->countIncomplete + $this->countSkipped)) { + if (0 !== $this->countFailed) { $statusNode->nodeValue = 'FAILED'; $statusAttr->value = 'color: red'; } From 6b2d9a96ea80b7b719037a03018d3e8eea557a32 Mon Sep 17 00:00:00 2001 From: Gustavo Nieves <64917965+TavoNiievez@users.noreply.github.com> Date: Wed, 12 Jan 2022 10:51:51 -0500 Subject: [PATCH 38/52] Update codebase to PHP 7.4 (#93) Co-authored-by: KJunker Thanks to @TavoNiievez for his contribution --- .github/workflows/php.yml | 2 +- README.md | 2 +- composer.json | 7 +- composer.lock | 929 +++++++++++++----- src/Extension/FailedTestsReporter.php | 19 +- src/Extension/TimeReporter.php | 16 +- src/Filter/DefaultFilter.php | 5 +- src/Filter/Filter.php | 2 - src/Filter/GroupFilter.php | 25 +- src/Merger/AbstractMerger.php | 12 +- src/Merger/FailedTestsMergerTask.php | 22 +- src/Merger/HtmlReportMerger.php | 106 +- src/Merger/ReportMergerTaskInterface.php | 9 +- src/Merger/XmlReportMergerTask.php | 52 +- src/Splitter/FailedTestSplitterTask.php | 16 +- src/Splitter/SplitTestsByTimeTask.php | 16 +- src/Splitter/TestFileSplitterTask.php | 24 +- src/Splitter/TestsSplitter.php | 57 +- src/Splitter/TestsSplitterTask.php | 20 +- src/Splitter/TestsSplitterTrait.php | 8 - tests/Extension/FailedTestsReporterTest.php | 34 +- tests/Extension/TimeReporterTest.php | 41 +- tests/Filter/GroupFilterTest.php | 11 +- tests/Merger/FailedTestsMergerTaskTest.php | 40 +- tests/Merger/HtmlReportMergerTest.php | 9 +- tests/Merger/XmlReportMergerTaskTest.php | 6 +- tests/Splitter/FailedTestSplitterTaskTest.php | 10 +- tests/Splitter/SplitTestsByTimeTaskTest.php | 8 +- tests/Splitter/TestFileSplitterTaskTest.php | 10 +- tests/Splitter/TestsSplitterTaskTest.php | 28 +- tests/bootstrap.php | 11 +- 31 files changed, 1015 insertions(+), 542 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 8687cd6..64ce6da 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: operating-system: ['ubuntu-latest'] - php-versions: ['7.3', '7.4', '8.0'] + php-versions: ['7.4', '8.0', '8.1'] phpunit-versions: ['latest'] steps: - name: Checkout diff --git a/README.md b/README.md index 1828d4a..d7bb63f 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Include into your RoboFile ```php ``` ## Idea diff --git a/composer.json b/composer.json index 4bf3756..7675958 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ } }, "require": { - "php": ">=7.3 <9.0", + "php": "^7.4 | ^8.0", "consolidation/robo": "3.0.*", "symfony/finder": ">=2.7 <6.0", "ext-dom": "*", @@ -35,6 +35,11 @@ "phpunit/phpunit": ">=9.0", "codeception/phpunit-wrapper": "^9.0.6" }, + "config": { + "platform": { + "php": "7.4.0" + } + }, "scripts": { "unit": "vendor/bin/phpunit --bootstrap tests/bootstrap.php tests/ --exclude-group example --stderr -v --debug", "lint": "vendor/bin/phplint -v ./ --exclude=vendor", diff --git a/composer.lock b/composer.lock index 7c109f5..1a94bf7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,101 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a8b431b5c85a1eede7d313207c0f1932", + "content-hash": "d50b1264751a69ce330053abfd2d09ba", "packages": [ + { + "name": "composer/semver", + "version": "3.2.6", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "83e511e247de329283478496f7a1e114c9517506" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506", + "reference": "83e511e247de329283478496f7a1e114c9517506", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.54", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.2.6" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-10-25T11:34:17+00:00" + }, { "name": "consolidation/annotated-command", - "version": "4.2.4", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/consolidation/annotated-command.git", - "reference": "ec297e05cb86557671c2d6cbb1bebba6c7ae2c60" + "reference": "308f6ac178566a1ce9aa90ed908dac90a2c1e707" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/ec297e05cb86557671c2d6cbb1bebba6c7ae2c60", - "reference": "ec297e05cb86557671c2d6cbb1bebba6c7ae2c60", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/308f6ac178566a1ce9aa90ed908dac90a2c1e707", + "reference": "308f6ac178566a1ce9aa90ed908dac90a2c1e707", "shasum": "" }, "require": { @@ -29,7 +110,7 @@ "symfony/finder": "^4.4.8|^5" }, "require-dev": { - "phpunit/phpunit": ">=7.5.20", + "phpunit/phpunit": "^7.5.20 || ^8 || ^9", "squizlabs/php_codesniffer": "^3", "yoast/phpunit-polyfills": "^0.2.0" }, @@ -55,7 +136,11 @@ } ], "description": "Initialize Symfony Console commands from annotated command class methods.", - "time": "2020-12-10T16:56:39+00:00" + "support": { + "issues": "https://github.com/consolidation/annotated-command/issues", + "source": "https://github.com/consolidation/annotated-command/tree/4.4.0" + }, + "time": "2021-09-30T01:08:15+00:00" }, { "name": "consolidation/config", @@ -111,6 +196,10 @@ } ], "description": "Provide configuration services for a commandline tool.", + "support": { + "issues": "https://github.com/consolidation/config/issues", + "source": "https://github.com/consolidation/config/tree/2.0.1" + }, "time": "2020-12-06T00:03:30+00:00" }, { @@ -159,6 +248,10 @@ } ], "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", + "support": { + "issues": "https://github.com/consolidation/log/issues", + "source": "https://github.com/consolidation/log/tree/2.0.2" + }, "time": "2020-12-10T16:26:23+00:00" }, { @@ -214,28 +307,32 @@ } ], "description": "Format text by applying transformations provided by plug-in formatters.", + "support": { + "issues": "https://github.com/consolidation/output-formatters/issues", + "source": "https://github.com/consolidation/output-formatters/tree/4.1.2" + }, "time": "2020-12-12T19:04:59+00:00" }, { "name": "consolidation/robo", - "version": "3.0.3", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/consolidation/Robo.git", - "reference": "734620ad3f9bb457fda1a52338b42439115cf941" + "reference": "36dce2965a67abe5cf91f2bc36d2582a64a11258" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/Robo/zipball/734620ad3f9bb457fda1a52338b42439115cf941", - "reference": "734620ad3f9bb457fda1a52338b42439115cf941", + "url": "https://api.github.com/repos/consolidation/Robo/zipball/36dce2965a67abe5cf91f2bc36d2582a64a11258", + "reference": "36dce2965a67abe5cf91f2bc36d2582a64a11258", "shasum": "" }, "require": { - "consolidation/annotated-command": "^4.2.4", + "consolidation/annotated-command": "^4.3", "consolidation/config": "^1.2.1|^2.0.1", "consolidation/log": "^1.1.1|^2.0.2", "consolidation/output-formatters": "^4.1.2", - "consolidation/self-update": "^1.2", + "consolidation/self-update": "^2.0", "league/container": "^3.3.1", "php": ">=7.1.3", "symfony/console": "^4.4.19 || ^5", @@ -253,7 +350,7 @@ "patchwork/jsqueeze": "^2", "pear/archive_tar": "^1.4.4", "phpunit/phpunit": "^7.5.20 | ^8", - "squizlabs/php_codesniffer": "^3", + "squizlabs/php_codesniffer": "^3.6", "yoast/phpunit-polyfills": "^0.2.0" }, "suggest": { @@ -309,23 +406,28 @@ } ], "description": "Modern task runner", - "time": "2021-02-21T19:19:43+00:00" + "support": { + "issues": "https://github.com/consolidation/Robo/issues", + "source": "https://github.com/consolidation/Robo/tree/3.0.6" + }, + "time": "2021-10-05T23:56:45+00:00" }, { "name": "consolidation/self-update", - "version": "1.2.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/consolidation/self-update.git", - "reference": "dba6b2c0708f20fa3ba8008a2353b637578849b4" + "reference": "7d6877f8006c51069e1469a9c57b1435640f74b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/self-update/zipball/dba6b2c0708f20fa3ba8008a2353b637578849b4", - "reference": "dba6b2c0708f20fa3ba8008a2353b637578849b4", + "url": "https://api.github.com/repos/consolidation/self-update/zipball/7d6877f8006c51069e1469a9c57b1435640f74b7", + "reference": "7d6877f8006c51069e1469a9c57b1435640f74b7", "shasum": "" }, "require": { + "composer/semver": "^3.2", "php": ">=5.5.0", "symfony/console": "^2.8|^3|^4|^5", "symfony/filesystem": "^2.5|^3|^4|^5" @@ -336,7 +438,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "2.x-dev" } }, "autoload": { @@ -359,7 +461,11 @@ } ], "description": "Provides a self:update command for Symfony Console applications.", - "time": "2020-04-13T02:49:20+00:00" + "support": { + "issues": "https://github.com/consolidation/self-update/issues", + "source": "https://github.com/consolidation/self-update/tree/2.0.0" + }, + "time": "2021-10-05T23:29:47+00:00" }, { "name": "dflydev/dot-access-data", @@ -418,6 +524,10 @@ "dot", "notation" ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/master" + }, "time": "2017-01-20T21:14:22+00:00" }, { @@ -465,6 +575,10 @@ } ], "description": "Expands internal property references in PHP arrays file.", + "support": { + "issues": "https://github.com/grasmash/expander/issues", + "source": "https://github.com/grasmash/expander/tree/master" + }, "time": "2017-12-21T22:14:55+00:00" }, { @@ -534,6 +648,10 @@ "provider", "service" ], + "support": { + "issues": "https://github.com/thephpleague/container/issues", + "source": "https://github.com/thephpleague/container/tree/3.4.1" + }, "funding": [ { "url": "https://github.com/philipobenito", @@ -584,6 +702,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, "time": "2021-03-05T17:36:06+00:00" }, { @@ -630,6 +752,10 @@ "psr", "psr-14" ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, "time": "2019-01-08T18:20:26+00:00" }, { @@ -677,6 +803,9 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, "time": "2021-05-03T11:20:27+00:00" }, { @@ -751,6 +880,9 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v5.1.11" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -815,6 +947,9 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -897,6 +1032,9 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -973,6 +1111,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -991,21 +1132,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.3.3", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/19b71c8f313b411172dd5f470fd61f24466d79a9", - "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -1032,6 +1174,9 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1046,24 +1191,25 @@ "type": "tidelift" } ], - "time": "2021-06-30T07:27:52+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.3.0", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -1090,6 +1236,9 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1104,7 +1253,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T12:52:38+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1166,6 +1315,9 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1244,6 +1396,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1325,6 +1480,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1402,6 +1560,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1478,6 +1639,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1558,6 +1722,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1576,21 +1743,21 @@ }, { "name": "symfony/process", - "version": "v5.3.2", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "714b47f9196de61a196d86c4bad5f09201b307df" + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/714b47f9196de61a196d86c4bad5f09201b307df", - "reference": "714b47f9196de61a196d86c4bad5f09201b307df", + "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -1617,6 +1784,9 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1631,7 +1801,7 @@ "type": "tidelift" } ], - "time": "2021-06-12T10:15:01+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/service-contracts", @@ -1693,6 +1863,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1711,16 +1884,16 @@ }, { "name": "symfony/string", - "version": "v5.3.7", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", "shasum": "" }, "require": { @@ -1773,6 +1946,9 @@ "utf-8", "utf8" ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.10" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1787,7 +1963,7 @@ "type": "tidelift" } ], - "time": "2021-08-26T08:00:08+00:00" + "time": "2021-10-27T18:21:46+00:00" }, { "name": "symfony/yaml", @@ -1845,6 +2021,9 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.3.6" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1865,25 +2044,24 @@ "packages-dev": [ { "name": "behat/gherkin", - "version": "v4.8.0", + "version": "v4.9.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd" + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/2391482cd003dfdc36b679b27e9f5326bd656acd", - "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", "shasum": "" }, "require": { "php": "~7.2|~8.0" }, "require-dev": { - "cucumber/cucumber": "dev-gherkin-16.0.0", + "cucumber/cucumber": "dev-gherkin-22.0.0", "phpunit/phpunit": "~8|~9", - "symfony/phpunit-bridge": "~3|~4|~5", "symfony/yaml": "~3|~4|~5" }, "suggest": { @@ -1892,7 +2070,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "4.x-dev" } }, "autoload": { @@ -1921,7 +2099,11 @@ "gherkin", "parser" ], - "time": "2021-02-04T12:44:21+00:00" + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + }, + "time": "2021-10-12T13:05:09+00:00" }, { "name": "codeception/codeception", @@ -2006,6 +2188,10 @@ "functional testing", "unit testing" ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/4.1.22" + }, "funding": [ { "url": "https://opencollective.com/codeception", @@ -2062,6 +2248,10 @@ "keywords": [ "codeception" ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" + }, "time": "2020-10-21T16:26:20+00:00" }, { @@ -2107,6 +2297,10 @@ } ], "description": "PHPUnit classes used by Codeception", + "support": { + "issues": "https://github.com/Codeception/phpunit-wrapper/issues", + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.6" + }, "time": "2020-12-28T13:59:47+00:00" }, { @@ -2137,101 +2331,29 @@ "MIT" ], "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", - "time": "2020-07-03T15:54:43+00:00" - }, - { - "name": "composer/semver", - "version": "3.2.5", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.54", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/3.7.0" }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-05-24T12:41:47+00:00" + "time": "2020-07-03T15:54:43+00:00" }, { "name": "composer/xdebug-handler", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496" + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/964adcdd3a28bf9ed5d9ac6450064e0d71ed7496", - "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { "phpstan/phpstan": "^0.12.55", @@ -2258,6 +2380,11 @@ "Xdebug", "performance" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" + }, "funding": [ { "url": "https://packagist.com", @@ -2272,20 +2399,20 @@ "type": "tidelift" } ], - "time": "2021-05-05T19:37:51+00:00" + "time": "2021-07-31T17:03:58+00:00" }, { "name": "doctrine/annotations", - "version": "1.13.1", + "version": "1.13.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", "shasum": "" }, "require": { @@ -2340,7 +2467,11 @@ "docblock", "parser" ], - "time": "2021-05-16T18:07:53+00:00" + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.13.2" + }, + "time": "2021-08-05T19:00:23+00:00" }, { "name": "doctrine/instantiator", @@ -2391,6 +2522,10 @@ "constructor", "instantiate" ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -2467,6 +2602,10 @@ "parser", "php" ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -2485,16 +2624,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.0.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "c15377bdfa8d1ecf186f1deadec39c89984e1167" + "reference": "13ae36a76b6e329e44ca3cafaa784ea02db9ff14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c15377bdfa8d1ecf186f1deadec39c89984e1167", - "reference": "c15377bdfa8d1ecf186f1deadec39c89984e1167", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/13ae36a76b6e329e44ca3cafaa784ea02db9ff14", + "reference": "13ae36a76b6e329e44ca3cafaa784ea02db9ff14", "shasum": "" }, "require": { @@ -2503,20 +2642,22 @@ "doctrine/annotations": "^1.12", "ext-json": "*", "ext-tokenizer": "*", - "php": "^7.1.3 || ^8.0", + "php": "^7.2 || ^8.0", "php-cs-fixer/diff": "^2.0", "symfony/console": "^4.4.20 || ^5.1.3", "symfony/event-dispatcher": "^4.4.20 || ^5.0", "symfony/filesystem": "^4.4.20 || ^5.0", "symfony/finder": "^4.4.20 || ^5.0", "symfony/options-resolver": "^4.4.20 || ^5.0", - "symfony/polyfill-php72": "^1.22", + "symfony/polyfill-php72": "^1.23", + "symfony/polyfill-php80": "^1.23", + "symfony/polyfill-php81": "^1.23", "symfony/process": "^4.4.20 || ^5.0", "symfony/stopwatch": "^4.4.20 || ^5.0" }, "require-dev": { "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^1.4", + "keradus/cli-executor": "^1.5", "mikey179/vfsstream": "^1.6.8", "php-coveralls/php-coveralls": "^2.4.3", "php-cs-fixer/accessible-object": "^1.1", @@ -2559,26 +2700,30 @@ } ], "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.2.1" + }, "funding": [ { "url": "https://github.com/keradus", "type": "github" } ], - "time": "2021-05-03T21:51:58+00:00" + "time": "2021-10-05T08:12:17+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7" + "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", - "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", "shasum": "" }, "require": { @@ -2602,7 +2747,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -2615,13 +2760,34 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, { "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" }, { @@ -2641,7 +2807,25 @@ "uri", "url" ], - "time": "2021-06-30T20:03:07+00:00" + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2021-10-06T17:43:30+00:00" }, { "name": "myclabs/deep-copy", @@ -2689,6 +2873,10 @@ "object", "object graph" ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", @@ -2731,20 +2919,24 @@ } ], "description": "JUnit XML Document generation library", + "support": { + "issues": "https://github.com/cmuench/junit-xml/issues", + "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" + }, "time": "2020-12-25T09:08:58+00:00" }, { "name": "nikic/php-parser", - "version": "v4.11.0", + "version": "v4.13.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94" + "reference": "50953a2691a922aa1769461637869a0a2faa3f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/fe14cf3672a149364fb66dfe11bf6549af899f94", - "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", + "reference": "50953a2691a922aa1769461637869a0a2faa3f53", "shasum": "" }, "require": { @@ -2783,7 +2975,11 @@ "parser", "php" ], - "time": "2021-07-03T13:36:55+00:00" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" + }, + "time": "2021-09-20T12:20:58+00:00" }, { "name": "overtrue/phplint", @@ -2849,20 +3045,24 @@ "phplint", "syntax" ], + "support": { + "issues": "https://github.com/overtrue/phplint/issues", + "source": "https://github.com/overtrue/phplint/tree/3.0.0" + }, "time": "2021-06-02T13:27:41+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { @@ -2905,7 +3105,11 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2020-06-27T14:33:11+00:00" + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", @@ -2952,6 +3156,10 @@ } ], "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" + }, "time": "2021-02-23T14:00:09+00:00" }, { @@ -3000,6 +3208,10 @@ "keywords": [ "diff" ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/diff/issues", + "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" + }, "time": "2020-10-14T08:32:19+00:00" }, { @@ -3049,20 +3261,24 @@ "reflection", "static analysis" ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", "shasum": "" }, "require": { @@ -3073,7 +3289,8 @@ "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2" + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -3101,20 +3318,24 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-09-03T19:13:55+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", "shasum": "" }, "require": { @@ -3122,7 +3343,8 @@ "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-tokenizer": "*", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -3146,37 +3368,41 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-09-17T18:55:26+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + }, + "time": "2021-10-02T14:08:47+00:00" }, { "name": "phpspec/prophecy", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", + "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" }, "require-dev": { - "phpspec/phpspec": "^6.0", + "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -3209,27 +3435,31 @@ "spy", "stub" ], - "time": "2021-03-17T13:42:18+00:00" + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + }, + "time": "2021-09-10T09:02:12+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.6", + "version": "9.2.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f6293e1b30a2354e8428e004689671b83871edde" + "reference": "cf04e88a2e3c56fc1a65488afd493325b4c1bc3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", - "reference": "f6293e1b30a2354e8428e004689671b83871edde", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cf04e88a2e3c56fc1a65488afd493325b4c1bc3e", + "reference": "cf04e88a2e3c56fc1a65488afd493325b4c1bc3e", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.13.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3276,13 +3506,17 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.8" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2021-03-28T07:26:59+00:00" + "time": "2021-10-30T08:01:38+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3332,6 +3566,10 @@ "filesystem", "iterator" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3391,6 +3629,10 @@ "keywords": [ "process" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3446,6 +3688,10 @@ "keywords": [ "template" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3501,6 +3747,10 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3511,16 +3761,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.6", + "version": "9.5.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb" + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb", - "reference": "fb9b8333f14e3dce976a60ef6a7e05c7c7ed8bfb", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", "shasum": "" }, "require": { @@ -3532,11 +3782,11 @@ "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.1", + "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.3", + "phpunit/php-code-coverage": "^9.2.7", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -3596,6 +3846,10 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" + }, "funding": [ { "url": "https://phpunit.de/donate.html", @@ -3606,7 +3860,7 @@ "type": "github" } ], - "time": "2021-06-23T05:14:38+00:00" + "time": "2021-09-25T07:38:51+00:00" }, { "name": "psr/cache", @@ -3652,6 +3906,9 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { @@ -3704,6 +3961,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, "time": "2019-04-30T12:38:16+00:00" }, { @@ -3754,6 +4014,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { @@ -3794,6 +4057,10 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -3802,17 +4069,18 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "94cca8d2520d4626036c799109c278548572bdbe" + "reference": "0488e161600117fc3a0d72397dad154729002f54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/94cca8d2520d4626036c799109c278548572bdbe", - "reference": "94cca8d2520d4626036c799109c278548572bdbe", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/0488e161600117fc3a0d72397dad154729002f54", + "reference": "0488e161600117fc3a0d72397dad154729002f54", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", "adodb/adodb-php": "<5.20.12", + "akaunting/akaunting": "<2.1.13", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "amphp/artax": "<1.0.6|>=2,<2.0.6", @@ -3825,6 +4093,7 @@ "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", "baserproject/basercms": "<=4.5", + "billz/raspap-webgui": "<=2.6.6", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bolt/bolt": "<3.7.2", "bolt/core": "<4.1.13", @@ -3837,7 +4106,9 @@ "cartalyst/sentry": "<=2.1.6", "centreon/centreon": "<20.10.7", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", + "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", @@ -3858,11 +4129,12 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<14", + "dolibarr/dolibarr": "<14|>= 3.3.beta1, < 13.0.2", "dompdf/dompdf": ">=0.6,<0.6.2", "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", + "ecodev/newsletter": "<=4", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", @@ -3871,14 +4143,14 @@ "ezsystems/ez-support-tools": ">=2.2,<2.2.3", "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", - "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", - "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", "ezsystems/ezplatform-user": ">=1,<1.0.1", "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", @@ -3891,7 +4163,7 @@ "flarum/tags": "<=0.1-beta.13", "fluidtypo3/vhs": "<5.1.1", "fooman/tcpdf": "<6.2.22", - "forkcms/forkcms": "<5.8.3", + "forkcms/forkcms": "<=5.9.2", "fossar/tcpdf-parser": "<6.2.22", "francoisjacquet/rosariosis": "<6.5.1", "friendsofsymfony/oauth2-php": "<1.3", @@ -3900,21 +4172,25 @@ "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", - "getgrav/grav": "<=1.7.10", + "getgrav/grav": "<1.7.21", "getkirby/cms": "<=3.5.6", "getkirby/panel": "<2.5.14", + "gilacms/gila": "<=1.11.4", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<5.6", + "grumpydictator/firefly-iii": "<5.6.1", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "helloxz/imgurl": "<=2.31", + "ibexa/post-install": "<=1.0.4", + "icecoder/icecoder": "<=8", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", "illuminate/database": "<6.20.26|>=7,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", "impresscms/impresscms": "<=1.4.2", + "in2code/femanager": "<5.5.1|>=6,<6.3.1", "intelliants/subrion": "<=4.2.1", "ivankristianto/phpwhois": "<=4.3", "james-heinrich/getid3": "<1.9.9", @@ -3930,11 +4206,13 @@ "laravel/framework": "<6.20.26|>=7,<8.40", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "lavalite/cms": "<=5.8", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<0.18.3", "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", "librenms/librenms": "<21.1", "livewire/livewire": ">2.2.4,<2.2.6", + "lms/routes": "<2.1.1", "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", @@ -3990,7 +4268,7 @@ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<10.1.1", + "pimcore/pimcore": "<10.1.3", "pocketmine/pocketmine-mp": "<3.15.4", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", @@ -4016,7 +4294,8 @@ "shopware/core": "<=6.4.3", "shopware/platform": "<=6.4.3", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<=5.6.9", + "shopware/shopware": "<5.6.10", + "showdoc/showdoc": "<=2.9.8", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", @@ -4043,6 +4322,7 @@ "ssddanbrown/bookstack": "<0.29.2", "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.59", + "subrion/cms": "<=4.2.1", "sulu/sulu": "<1.6.41|>=2,<2.0.10|>=2.1,<2.1.1", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", @@ -4053,6 +4333,7 @@ "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0,<4", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", @@ -4089,6 +4370,7 @@ "theonedemon/phpwhois": "<=4.2.5", "titon/framework": ">=0,<9.9.99", "topthink/think": "<=6.0.9", + "topthink/thinkphp": "<=3.2.3", "tribalsystems/zenario": "<8.8.53370", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", @@ -4107,6 +4389,7 @@ "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "vrana/adminer": "<4.7.9", "wallabag/tcpdf": "<6.2.22", + "web-auth/webauthn-framework": ">=3.3,<3.3.4", "webcoast/deferred-image-processing": "<1.0.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", @@ -4116,13 +4399,13 @@ "yiisoft/yii": ">=1.1.14,<1.1.15", "yiisoft/yii2": "<2.0.38", "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-dev": "<2.0.43", "yiisoft/yii2-elasticsearch": "<2.0.5", "yiisoft/yii2-gii": "<2.0.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", - "yoast-seo-for-typo3/yoast_seo": "<7.2.1", - "yourls/yourls": "<=1.8.1", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -4151,6 +4434,7 @@ "zfr/zfr-oauth2-server-module": "<0.1.2", "zoujingli/thinkadmin": "<6.0.22" }, + "default-branch": true, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4169,6 +4453,10 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, "funding": [ { "url": "https://github.com/Ocramius", @@ -4179,7 +4467,7 @@ "type": "tidelift" } ], - "time": "2021-09-01T09:02:34+00:00" + "time": "2021-09-30T18:03:50+00:00" }, { "name": "sebastian/cli-parser", @@ -4225,6 +4513,10 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4277,6 +4569,10 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4328,6 +4624,10 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4398,6 +4698,10 @@ "compare", "equality" ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4451,6 +4755,10 @@ ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4513,6 +4821,10 @@ "unidiff", "unified diff" ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4572,6 +4884,10 @@ "environment", "hhvm" ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4645,6 +4961,10 @@ "export", "exporter" ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4705,6 +5025,10 @@ "keywords": [ "global state" ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4758,6 +5082,10 @@ ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4811,6 +5139,10 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4862,6 +5194,10 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4921,6 +5257,10 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4972,6 +5312,10 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5024,6 +5368,10 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5073,6 +5421,10 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5083,16 +5435,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.0", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", "shasum": "" }, "require": { @@ -5130,7 +5482,12 @@ "phpcs", "standards" ], - "time": "2021-04-09T00:54:41+00:00" + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2021-10-11T04:00:11+00:00" }, { "name": "symfony/css-selector", @@ -5179,6 +5536,9 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.3.4" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5197,23 +5557,23 @@ }, { "name": "symfony/options-resolver", - "version": "v5.3.0", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" + "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", - "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4b78e55b179003a42523a362cc0e8327f7a69b5e", + "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5245,6 +5605,9 @@ "configuration", "options" ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5259,7 +5622,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/polyfill-php72", @@ -5318,6 +5681,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5334,18 +5700,97 @@ ], "time": "2021-05-27T09:17:38+00:00" }, + { + "name": "symfony/polyfill-php81", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" + }, { "name": "symfony/stopwatch", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", - "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", "shasum": "" }, "require": { @@ -5377,6 +5822,9 @@ ], "description": "Provides a way to profile code", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5391,20 +5839,20 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-10T08:58:57+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -5431,13 +5879,17 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2021-07-28T10:34:58+00:00" }, { "name": "webmozart/assert", @@ -5491,6 +5943,10 @@ "check", "validate" ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, "time": "2021-03-09T10:59:23+00:00" } ], @@ -5502,11 +5958,14 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.3 <9.0", + "php": "^7.4 | ^8.0", "ext-dom": "*", "ext-libxml": "*", "ext-json": "*" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "platform-overrides": { + "php": "7.4.0" + }, + "plugin-api-version": "2.1.0" } diff --git a/src/Extension/FailedTestsReporter.php b/src/Extension/FailedTestsReporter.php index af13077..fcc21ff 100644 --- a/src/Extension/FailedTestsReporter.php +++ b/src/Extension/FailedTestsReporter.php @@ -26,28 +26,26 @@ class FailedTestsReporter extends Extension /** @var string */ public const REPORT_NAME = 'failedTests'; - /** @var array $failedTests */ - private $failedTests = []; + private array $failedTests = []; /** * @var string[] $events */ - public static $events = [ + public static array $events = [ Events::TEST_FAIL => 'afterFail', Events::RESULT_PRINT_AFTER => 'endRun', ]; /** * Event after each failed test - collect the failed test - * @param FailEvent $event */ public function afterFail(FailEvent $event): void { - $this->failedTests[] = $this->getTestname($event); + $this->failedTests[] = $this->getTestName($event); } /** - * Event after all Tests - write failed tests to reportfile + * Event after all Tests - write failed tests to report file */ public function endRun(): void { @@ -63,20 +61,13 @@ public function endRun(): void file_put_contents($file, implode(PHP_EOL, $this->failedTests)); } - /** - * @param TestEvent $e - * @return false|string - */ - public function getTestname(TestEvent $e): string + public function getTestName(TestEvent $e): string { $name = Descriptor::getTestFullName($e->getTest()); return substr(str_replace($this->getRootDir(), '', $name), 1); } - /** - * @return string - */ public function getUniqReportFile(): string { return self::REPORT_NAME . '_' . uniqid('', true) . '.txt'; diff --git a/src/Extension/TimeReporter.php b/src/Extension/TimeReporter.php index 9c4bb0d..0cab436 100644 --- a/src/Extension/TimeReporter.php +++ b/src/Extension/TimeReporter.php @@ -1,5 +1,7 @@ 'endRun', Events::TEST_END => 'after', ]; - private $timeList = []; + private array $timeList = []; /** * Event handler after each test - collect stat - * - * @param TestEvent $e */ public function after(TestEvent $e): void { - $name = $this->getTestname($e); + $name = $this->getTestName($e); if (empty($this->timeList[$name])) { $this->timeList[$name] = 0; @@ -42,11 +42,7 @@ public function endRun(): void file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT)); } - /** - * @param TestEvent $e - * @return false|string - */ - public function getTestname(TestEvent $e): string + public function getTestName(TestEvent $e): string { $name = Descriptor::getTestFullName($e->getTest()); return substr(str_replace($this->getRootDir(), '', $name), 1); diff --git a/src/Filter/DefaultFilter.php b/src/Filter/DefaultFilter.php index d3a3b31..11cb690 100644 --- a/src/Filter/DefaultFilter.php +++ b/src/Filter/DefaultFilter.php @@ -9,10 +9,7 @@ */ class DefaultFilter implements Filter { - /** - * @var array - */ - private $tests; + private array $tests = []; /** * @inheritDoc diff --git a/src/Filter/Filter.php b/src/Filter/Filter.php index 573f455..60bda4d 100644 --- a/src/Filter/Filter.php +++ b/src/Filter/Filter.php @@ -12,13 +12,11 @@ interface Filter { /** * Set the collection of tests which should be filtered - * @param array $tests */ public function setTests(array $tests): void; /** * Returns the filtered Tests - * @return array */ public function filter(): array; } diff --git a/src/Filter/GroupFilter.php b/src/Filter/GroupFilter.php index 3d2b9bb..f372424 100644 --- a/src/Filter/GroupFilter.php +++ b/src/Filter/GroupFilter.php @@ -12,18 +12,18 @@ /** * Class GroupFilter - allows to filter tests by the @group Annotation + * + * @see \Tests\Codeception\Task\Filter\GroupFilterTest */ class GroupFilter implements Filter { /** @var string[] $includedGroups */ - private $includedGroups = []; + private array $includedGroups = []; - /** @var array[] $excludedGroups */ - private $excludedGroups = []; - /** - * @var SelfDescribing[] - */ - private $tests = []; + private array $excludedGroups = []; + + /** @var SelfDescribing[] */ + private array $tests = []; public function reset(): void { @@ -51,8 +51,6 @@ public function getTests(): array /** * Adds a group name to the excluded array - * @param string $group - * @return $this */ public function groupExcluded(string $group): self { @@ -74,8 +72,6 @@ public function groupExcluded(string $group): self /** * Adds a group name to the included array - * @param string $group - * @return $this */ public function groupIncluded(string $group): self { @@ -95,9 +91,6 @@ public function groupIncluded(string $group): self return $this; } - /** - * @return array[] - */ public function getExcludedGroups(): array { return $this->excludedGroups; @@ -121,6 +114,8 @@ public function setTests(array $tests): void /** * Filter the tests by the given included and excluded @group annotations + * + * @return \PHPUnit\Framework\SelfDescribing[] */ public function filter(): array { @@ -142,12 +137,14 @@ public function filter(): array ) { continue; } + if ( !empty($this->getIncludedGroups()) && [] !== array_diff($this->getIncludedGroups(), $groups) ) { continue; } + $testsByGroups[] = $test; } diff --git a/src/Merger/AbstractMerger.php b/src/Merger/AbstractMerger.php index 7bd060d..d774524 100644 --- a/src/Merger/AbstractMerger.php +++ b/src/Merger/AbstractMerger.php @@ -8,10 +8,7 @@ abstract class AbstractMerger extends BaseTask implements ReportMergerTaskInterface { - /** - * @var array - */ - protected $src; + protected array $src = []; public function __construct($src = []) { @@ -21,12 +18,9 @@ public function __construct($src = []) /** * @inheritDoc */ - abstract public function from($fileName); + abstract public function from($fileName): self; - /** - * @inheritDoc - */ - abstract public function into(string $fileName); + abstract public function into(string $fileName): self; /** * @inheritDoc diff --git a/src/Merger/FailedTestsMergerTask.php b/src/Merger/FailedTestsMergerTask.php index c360897..d8bdcd3 100644 --- a/src/Merger/FailedTestsMergerTask.php +++ b/src/Merger/FailedTestsMergerTask.php @@ -5,7 +5,6 @@ namespace Codeception\Task\Merger; use InvalidArgumentException; -use Robo\Task\BaseTask; use RuntimeException; use Symfony\Component\Finder\Finder; @@ -24,22 +23,23 @@ * ->fromPathWithPattern(__DIR__ . 'tests/_data/failed_2/', '/failedTests_\w+\.txt$/') * ->into(__DIR__ . '/failedTests.txt') // absolute path with Filename * ->run(); - * ?> * ``` + * + * @see \Tests\Codeception\Task\Merger\FailedTestsMergerTaskTest */ class FailedTestsMergerTask extends AbstractMerger { - public const DEFAULT_PATTERN = '/^failedTests_\w+\.\w+\.txt$/'; - - public $pathPatterns = []; - /** * @var string */ - private $dest; + public const DEFAULT_PATTERN = '/^failedTests_\w+\.\w+\.txt$/'; + + public array $pathPatterns = []; + + private string $dest = ''; /** @var string[] */ - protected $src = []; + protected array $src = []; /** * @param string[]|string $fileName @@ -60,6 +60,7 @@ public function from($fileName): self /** * Search all report files in path with default pattern or the given pattern + * * @param string $path - The path where the report files exists * @param string|null $pattern - The regex pattern for the files (optional) * @return $this @@ -78,7 +79,7 @@ public function into(string $fileName): self return $this; } - public function run() + public function run(): void { $content = []; $files = array_merge($this->src, $this->searchFilesByPattern()); @@ -86,12 +87,14 @@ public function run() if (!is_file($file)) { continue; } + $tmpContent = file_get_contents($file); if (!$tmpContent) { throw new RuntimeException( 'Could not read content of reportfile: ' . $file ); } + $content[] = $tmpContent; } @@ -102,7 +105,6 @@ public function run() /** * Search the files by the given path and pattern - * @return array */ private function searchFilesByPattern(): array { diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php index c91f235..88f198d 100644 --- a/src/Merger/HtmlReportMerger.php +++ b/src/Merger/HtmlReportMerger.php @@ -12,38 +12,49 @@ use DOMNodeList; use DOMXPath; use Robo\Exception\TaskException; -use Robo\Task\BaseTask; use RuntimeException; /** * Generate common HTML report * Class MergeHTMLReportsTask * @author Kerimov Asif + * + * @see \Tests\Codeception\Task\Merger\HtmlReportMergerTest */ class HtmlReportMerger extends AbstractMerger { /** @var string[] */ - protected $src = []; - /** @var string */ - protected $dst; - /** @var int */ + protected array $src = []; + + protected string $dst = ''; + + /** + * @var int|float + */ protected $countSuccess = 0; - /** @var int */ + + /** + * @var int|float + */ protected $countFailed = 0; - /** @var int */ + + /** + * @var int|float + */ protected $countSkipped = 0; - /** @var int */ - protected $countIncomplete = 0; - /** @var bool */ - protected $previousLibXmlUseErrors; /** - * @var float + * @var int|float */ - private $executionTimeSum = 0; + protected $countIncomplete = 0; + + protected bool $previousLibXmlUseErrors = false; + + private float $executionTimeSum = 0; /** * HtmlReportMerger constructor. + * * @param string[] $src - array of source reports */ public function __construct(array $src = []) @@ -62,11 +73,11 @@ public function from($fileName): self } else { $this->src[] = $fileName; } + return $this; } /** - * @param string $fileName * @return $this|HtmlReportMerger */ public function into(string $fileName): self @@ -75,12 +86,12 @@ public function into(string $fileName): self return $this; } - public function run() + public function run(): void { //save initial statament and switch on use_internal_errors mode $this->previousLibXmlUseErrors = libxml_use_internal_errors(true); - if (!$this->dst) { + if ($this->dst === '' || $this->dst === '0') { libxml_use_internal_errors($this->previousLibXmlUseErrors); throw new TaskException($this, "No destination file is set. Use `->into()` method to set result HTML"); } @@ -94,6 +105,7 @@ public function run() ); } } + // Resetting keys $this->src = array_values($this->src); @@ -108,24 +120,27 @@ public function run() if (!$nodeList) { throw XPathExpressionException::malformedXPath("//table"); } + $index = 0; - /** @var DOMNode $table */ $table = $nodeList->item($index); - if (null === $table) { + if (!$table instanceof DOMNode) { throw new KeyNotFoundException('Could not find table item at pos: ' . $index); } + //prepare reference nodes for envs $xpathExprRefNodes = "//div[@class='layout']/table/tr[not(@class)]"; $refnodes = (new DOMXPath($dstHTML))->query($xpathExprRefNodes); if (!$refnodes) { throw XPathExpressionException::malformedXPath($xpathExprRefNodes); } - for ($k = 1, $kMax = count($this->src); $k < $kMax; $k++) { + + for ($k = 1, $kMax = count($this->src); $k < $kMax; ++$k) { $src = $this->src[$k]; if (!file_exists($src) || !is_readable($src)) { $this->printTaskWarning('File did not exists or is not readable: ' . $src); continue; } + $srcHTML = new DOMDocument(); $srcHTML->loadHTMLFile($src, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $this->countExecutionTime($srcHTML); @@ -134,16 +149,19 @@ public function run() if (!$suiteNodes) { throw XPathExpressionException::malformedXPath($xpathExprSuiteNodes); } + $j = 0; foreach ($suiteNodes as $suiteNode) { if ($suiteNode->getAttribute('class') == '') { //move to next reference node - $j++; + ++$j; if ($j > $refnodes->length - 1) { break; } + continue; } + //insert nodes before current reference node $suiteNode = $dstHTML->importNode($suiteNode, true); $table->insertBefore($suiteNode, $refnodes->item($j)); @@ -180,8 +198,9 @@ private function countExecutionTime(DOMDocument $dstFile): void if (!$nodeList) { throw XPathExpressionException::malformedXPath($xpathHeadline); } + $pregResult = preg_match( - '/^Codeception Results .* \((?\d+\.\d+)s\)$/', + '#^Codeception Results .* \((?\d+\.\d+)s\)$#', $nodeList[0]->nodeValue, $matches ); @@ -209,6 +228,7 @@ private function updateHeaderLine(DOMDocument $dstFile): void if (!$nodeList) { throw XPathExpressionException::malformedXPath($xpathHeadline); } + /** @var DOMNode $executionTimeNode */ $executionTimeNode = $nodeList[0]->childNodes[1]->childNodes[1]; /** @var DOMAttr $statusAttr */ @@ -218,14 +238,16 @@ private function updateHeaderLine(DOMDocument $dstFile): void $statusNode->nodeValue = 'FAILED'; $statusAttr->value = 'color: red'; } - $executionTimeNode->nodeValue = " ({$this->executionTimeSum}s)"; + + $executionTimeNode->nodeValue = sprintf(' (%ss)', $this->executionTimeSum); } /** - * This function counts all types of tests' scenarios and writes in class members - * @param DOMDocument $dstFile - destination file - * @throws XPathExpressionException - */ + * This function counts all types of tests' scenarios and writes in class members + * + * @param DOMDocument $dstFile - destination file + * @throws XPathExpressionException + */ private function countSummary(DOMDocument $dstFile): void { $xpathExprTests = "//table/tr[contains(@class,'scenarioRow')]"; @@ -234,6 +256,7 @@ private function countSummary(DOMDocument $dstFile): void if (!$tests) { throw XPathExpressionException::malformedXPath($xpathExprTests); } + foreach ($tests as $test) { $class = str_replace('scenarioRow ', '', $test->getAttribute('class')); switch ($class) { @@ -255,26 +278,26 @@ private function countSummary(DOMDocument $dstFile): void /** * This function updates values in Summary block for each type of scenarios + * * @param DOMDocument $dstFile - destination file */ - private function updateSummaryTable(DOMDocument $dstFile) + private function updateSummaryTable(DOMDocument $dstFile): void { $dstFile = new DOMXPath($dstFile); - $pathFor = function ($type) { - return "//div[@id='stepContainerSummary']//td[@class='$type']"; - }; - $dstFile->query($pathFor('scenarioSuccessValue'))->item(0)->nodeValue = $this->countSuccess; - $dstFile->query($pathFor('scenarioFailedValue'))->item(0)->nodeValue = $this->countFailed; - $dstFile->query($pathFor('scenarioSkippedValue'))->item(0)->nodeValue = $this->countSkipped; - $dstFile->query($pathFor('scenarioIncompleteValue'))->item(0)->nodeValue = $this->countIncomplete; + $pathFor = fn($type): string => sprintf("//div[@id='stepContainerSummary']//td[@class='%s']", $type); + $dstFile->query($pathFor('scenarioSuccessValue'))->item(0)->nodeValue = (string)$this->countSuccess; + $dstFile->query($pathFor('scenarioFailedValue'))->item(0)->nodeValue = (string)$this->countFailed; + $dstFile->query($pathFor('scenarioSkippedValue'))->item(0)->nodeValue = (string)$this->countSkipped; + $dstFile->query($pathFor('scenarioIncompleteValue'))->item(0)->nodeValue = (string)$this->countIncomplete; } /** * This function moves Summary block in the bottom of result report + * * @param $dstFile DOMDocument - destination file * @param $node DOMNode - parent node of Summary table */ - private function moveSummaryTable(DOMDocument $dstFile, DOMNode $node) + private function moveSummaryTable(DOMDocument $dstFile, DOMNode $node): void { $summaryTable = (new DOMXPath($dstFile))->query("//div[@id='stepContainerSummary']") ->item(0)->parentNode->parentNode; @@ -284,14 +307,13 @@ private function moveSummaryTable(DOMDocument $dstFile, DOMNode $node) /** * This function updates values in Toolbar block for each type of scenarios * (blue block on the left side of the report) + * * @param DOMDocument $dstFile - destination file */ - private function updateToolbarTable(DOMDocument $dstFile) + private function updateToolbarTable(DOMDocument $dstFile): void { $dstFile = new DOMXPath($dstFile); - $pathFor = static function (string $type): string { - return "//ul[@id='toolbar-filter']//a[@title='$type']"; - }; + $pathFor = static fn(string $type): string => sprintf("//ul[@id='toolbar-filter']//a[@title='%s']", $type); $dstFile->query($pathFor('Successful'))->item(0)->nodeValue = '✔ ' . $this->countSuccess; $dstFile->query($pathFor('Failed'))->item(0)->nodeValue = '✗ ' . $this->countFailed; $dstFile->query($pathFor('Skipped'))->item(0)->nodeValue = 'S ' . $this->countSkipped; @@ -300,21 +322,23 @@ private function updateToolbarTable(DOMDocument $dstFile) /** * This function updates "+" and "-" button for viewing test steps in final report + * * @param $dstFile DOMDocument - destination file * @throws XPathExpressionException */ - private function updateButtons(DOMDocument $dstFile) + private function updateButtons(DOMDocument $dstFile): void { $xpathExprNodes = "//div[@class='layout']/table/tr[contains(@class, 'scenarioRow')]"; $nodes = (new DOMXPath($dstFile))->query($xpathExprNodes); if (!$nodes) { throw XPathExpressionException::malformedXPath($xpathExprNodes); } + for ($i = 2; $i < $nodes->length; $i += 2) { $n = $i / 2 + 1; $p = $nodes->item($i)->childNodes->item(1)->childNodes->item(1); $table = $nodes->item($i + 1)->childNodes->item(1)->childNodes->item(1); - $p->setAttribute('onclick', "showHide('$n', this)"); + $p->setAttribute('onclick', "showHide('{$n}', this)"); $table->setAttribute('id', "stepContainer" . $n); } } diff --git a/src/Merger/ReportMergerTaskInterface.php b/src/Merger/ReportMergerTaskInterface.php index 56fb75e..5378811 100644 --- a/src/Merger/ReportMergerTaskInterface.php +++ b/src/Merger/ReportMergerTaskInterface.php @@ -10,12 +10,7 @@ interface ReportMergerTaskInterface * @param array|string $fileName * @return $this */ - public function from($fileName); + public function from($fileName): self; - - /** - * @param string $fileName - * @return $this - */ - public function into(string $fileName); + public function into(string $fileName): self; } diff --git a/src/Merger/XmlReportMergerTask.php b/src/Merger/XmlReportMergerTask.php index 999b1bc..d8d88e6 100644 --- a/src/Merger/XmlReportMergerTask.php +++ b/src/Merger/XmlReportMergerTask.php @@ -9,28 +9,22 @@ use DOMNode; use DOMXPath; use Robo\Exception\TaskException; -use Robo\Task\BaseTask; +/** + * @see \Tests\Codeception\Task\Merger\XmlReportMergerTaskTest + */ class XmlReportMergerTask extends AbstractMerger { - /** - * @var array|mixed - */ - protected $src = []; - /** - * @var string - */ - protected $dst; - /** - * @var bool - */ - protected $summarizeTime = true; - /** - * @var bool - */ - protected $mergeRewrite = false; + protected array $src = []; + + protected string $dst = ''; + + protected bool $summarizeTime = true; + + protected bool $mergeRewrite = false; + /** @var DOMElement[][] */ - protected $suites = []; + protected array $suites = []; public function sumTime(): void { @@ -51,7 +45,6 @@ public function mergeRewrite(): self /** * @param array|string $fileName - * @return $this */ public function from($fileName): self { @@ -64,11 +57,7 @@ public function from($fileName): self return $this; } - /** - * @param string $fileName - * @return $this - */ - public function into($fileName): self + public function into(string $fileName): self { $this->dst = $fileName; @@ -77,34 +66,37 @@ public function into($fileName): self public function run(): void { - if (!$this->dst) { + if ($this->dst === '' || $this->dst === '0') { throw new TaskException( $this, "No destination file is set. Use `->into()` method to set result xml" ); } - $this->printTaskInfo("Merging JUnit XML reports into {$this->dst}"); + + $this->printTaskInfo(sprintf('Merging JUnit XML reports into %s', $this->dst)); $dstXml = new DOMDocument(); $dstXml->appendChild($dstXml->createElement('testsuites')); $this->suites = []; foreach ($this->src as $src) { - $this->printTaskInfo("Processing $src"); + $this->printTaskInfo("Processing {$src}"); $srcXml = new DOMDocument(); if (!file_exists($src) || !is_readable($src)) { $this->printTaskWarning('File did not exists or is not readable: ' . $src); continue; } + $loaded = $srcXml->load($src); if (!$loaded) { - $this->printTaskInfo("File $src can't be loaded as XML"); + $this->printTaskInfo("File {$src} can't be loaded as XML"); continue; } + $suiteNodes = (new DOMXPath($srcXml))->query('//testsuites/testsuite'); foreach ($suiteNodes as $suiteNode) { + /** @var $suiteNode DOMElement **/ $suiteNode = $dstXml->importNode($suiteNode, true); - /** @var $suiteNode DOMElement * */ $this->loadSuites($suiteNode); } } @@ -155,9 +147,11 @@ protected function mergeSuites(DOMDocument $dstXml): void $data['failures'] += $test->getElementsByTagName('failure')->length; $data['errors'] += $test->getElementsByTagName('error')->length; } + foreach ($data as $key => $value) { $resultNode->setAttribute($key, (string)$value); } + $dstXml->firstChild->appendChild($resultNode); } } diff --git a/src/Splitter/FailedTestSplitterTask.php b/src/Splitter/FailedTestSplitterTask.php index 1c9b6e5..e1fe000 100644 --- a/src/Splitter/FailedTestSplitterTask.php +++ b/src/Splitter/FailedTestSplitterTask.php @@ -8,15 +8,17 @@ use Robo\Result; use RuntimeException; +/** + * @see \Tests\Codeception\Task\Splitter\FailedTestSplitterTaskTest + */ class FailedTestSplitterTask extends TestsSplitter { - /** @var string */ - private $reportPath = null; + private ?string $reportPath = null; /** * @return string - the absolute path to the report file with the failed tests */ - public function getReportPath(): string + public function getReportPath(): ?string { return $this->reportPath; } @@ -31,7 +33,7 @@ public function run(): Result if (!@file_exists($reportPath) || !is_file($reportPath)) { throw new RuntimeException( - 'The reportfile did not exists or is not a regular file.' + 'The report file did not exists or is not a regular file.' ); } @@ -51,11 +53,7 @@ public function run(): Result ]); } - /** - * @param string $reportFilePath - * @return FailedTestSplitterTask - */ - public function setReportPath(string $reportFilePath): FailedTestSplitterTask + public function setReportPath(string $reportFilePath): self { if (empty($reportFilePath)) { throw new InvalidArgumentException('The reportPath could not be empty!'); diff --git a/src/Splitter/SplitTestsByTimeTask.php b/src/Splitter/SplitTestsByTimeTask.php index ec80195..f7b19af 100644 --- a/src/Splitter/SplitTestsByTimeTask.php +++ b/src/Splitter/SplitTestsByTimeTask.php @@ -14,10 +14,12 @@ /** * This task will not consider any 'depends' annotation! * It will only split tests by the execution time + * + * @see \Tests\Codeception\Task\Splitter\SplitTestsByTimeTaskTest */ class SplitTestsByTimeTask extends TestsSplitter { - protected $statFile = 'tests/_output/timeReport.json'; + protected string $statFile = 'tests/_output/timeReport.json'; public function statFile(string $path): self { @@ -36,6 +38,7 @@ public function run(): Result $testLoader = new Loader(['path' => $this->testsFrom]); $testLoader->loadTests($this->testsFrom); + $tests = $testLoader->getTests(); $data = $this->readStatFileContent(); @@ -47,8 +50,9 @@ public function run(): Result if ($test instanceof DataProviderTestSuite) { $test = current($test->tests()); } + $testName = Descriptor::getTestFullName($test); - if (1 !== preg_match('~^/~', $testName)) { + if (1 !== preg_match('#^/#', $testName)) { $testName = '/' . $testName; } @@ -58,7 +62,7 @@ public function run(): Result arsort($testsWithTime); - for ($i = 0; $i < $this->numGroups; $i++) { + for ($i = 0; $i < $this->numGroups; ++$i) { $groups[$i] = [ 'tests' => [], 'sum' => 0, @@ -96,9 +100,6 @@ public function run(): Result /** * Find group num with min execute time - * - * @param array $groups - * @return int */ protected function getMinGroup(array $groups): int { @@ -114,9 +115,6 @@ protected function getMinGroup(array $groups): int return $min; } - /** - * @return array - */ private function readStatFileContent(): array { if (false === ($data = file_get_contents($this->statFile))) { diff --git a/src/Splitter/TestFileSplitterTask.php b/src/Splitter/TestFileSplitterTask.php index 2f7b0f0..d1d4b0e 100644 --- a/src/Splitter/TestFileSplitterTask.php +++ b/src/Splitter/TestFileSplitterTask.php @@ -23,12 +23,16 @@ * ->addFilter(new Filter1()) * ->addFilter(new Filter2()) * ->run(); - * ?> * ``` + * + * @see \Tests\Codeception\Task\Splitter\TestFileSplitterTaskTest */ class TestFileSplitterTask extends TestsSplitter { - private $pattern = ['*Cept.php', '*Cest.php', '*Test.php', '*.feature']; + /** + * @var string[] + */ + private array $pattern = ['*Cept.php', '*Cest.php', '*Test.php', '*.feature']; public function run(): Result { @@ -43,9 +47,7 @@ public function run(): Result $filenames = $this->splitToGroupFiles( array_map( - static function (SplFileInfo $fileInfo): string { - return $fileInfo->getRelativePathname(); - }, + static fn(SplFileInfo $fileInfo): string => $fileInfo->getRelativePathname(), $this->filter(iterator_to_array($files->getIterator())) ) ); @@ -59,26 +61,24 @@ static function (SplFileInfo $fileInfo): string { /** * @param string[] $pattern - * @return TestFileSplitterTask */ - public function setPattern(array $pattern): TestFileSplitterTask + public function setPattern(array $pattern): self { $this->pattern = $pattern; return $this; } - /** - * @param string $pattern - * @return TestFileSplitterTask - */ - public function addPattern(string $pattern): TestFileSplitterTask + public function addPattern(string $pattern): self { $this->pattern[] = $pattern; return $this; } + /** + * @return string[] + */ public function getPattern(): array { return $this->pattern; diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 3936c26..83a186b 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -10,24 +10,27 @@ use ReflectionClass; use Robo\Exception\TaskException; use Robo\Task\BaseTask; +use RuntimeException; abstract class TestsSplitter extends BaseTask { - /** @var int */ - protected $numGroups; - /** @var string */ - protected $projectRoot = '.'; + protected int $numGroups; + + protected string $projectRoot = '.'; + /** @var string[]|string */ protected $testsFrom = 'tests'; - /** @var string */ - protected $saveTo = 'tests/_data/paracept_'; - /** @var string */ - protected $excludePath = 'vendor'; + + protected string $saveTo = 'tests/_data/paracept_'; + + protected string $excludePath = 'vendor'; + /** @var Filter[] $filter */ - protected $filter; + protected array $filter = []; /** * TestsSplitter constructor. + * * @param int $groups number of groups to use */ public function __construct(int $groups) @@ -45,9 +48,6 @@ public function addFilter(Filter $filter): TestsSplitter return $this; } - /** - * @return string - */ public function getProjectRoot(): string { return realpath($this->projectRoot); @@ -86,12 +86,7 @@ public function excludePath(string $path): TestsSplitter } /** - * @param $item - * @param array $items - * @param array $resolved - * @param array $unresolved - * - * @return array + * @param mixed $item */ protected function resolveDependencies( $item, @@ -107,14 +102,16 @@ protected function resolveDependencies( [$resolved, $unresolved] = $this->resolveDependencies($dep, $items, $resolved, $unresolved); } else { - throw new \RuntimeException("Circular dependency: $item -> $dep"); + throw new RuntimeException(sprintf('Circular dependency: %s -> %s', $item, $dep)); } } } + // Add $item to $resolved if it's not already there if (!in_array($item, $resolved, true)) { $resolved[] = $item; } + // Remove all occurrences of $item in $unresolved while (($index = array_search($item, $unresolved, true)) !== false) { unset($unresolved[$index]); @@ -125,10 +122,6 @@ protected function resolveDependencies( /** * Make sure that tests are in array are always with full path and name. - * - * @param array $testsListWithDependencies - * - * @return array */ protected function resolveDependenciesToFullNames(array $testsListWithDependencies): array { @@ -142,6 +135,7 @@ protected function resolveDependenciesToFullNames(array $testsListWithDependenci $ref = new ReflectionClass($class); $dependency = $ref->getFileName() . ':' . $method; } + // sometimes it is written as class::method. // for that reason we do trim in first case and replace from :: to one in second case // just test name, that means that class name is the same, just different method name @@ -152,12 +146,14 @@ protected function resolveDependenciesToFullNames(array $testsListWithDependenci ) . ':' . $dependency; continue; } + $dependency = str_replace('::', ':', $dependency); // className:testName, that means we need to find proper test. [$targetTestFileName, $targetTestMethodName] = explode(':', $dependency); if (false === strrpos($targetTestFileName, '.php')) { $targetTestFileName .= '.php'; } + // look for proper test in list of all tests. Test could be in different directory // so we need to compare strings and if matched we just assign found test name foreach (array_keys($testsListWithDependencies) as $arrayKey) { @@ -172,7 +168,7 @@ protected function resolveDependenciesToFullNames(array $testsListWithDependenci } } - throw new \RuntimeException( + throw new RuntimeException( 'Dependency target test ' . $dependency . ' not found.' . 'Please make sure test exists and you are using full test name' ); @@ -184,8 +180,6 @@ protected function resolveDependenciesToFullNames(array $testsListWithDependenci /** * Filter tests by the given filters, FIFO principal - * @param array $tests - * @return array */ protected function filter(array $tests): array { @@ -199,6 +193,7 @@ protected function filter(array $tests): array /** * Claims that the Codeception is loaded for Tasks which need it + * * @throws TaskException */ protected function claimCodeceptionLoaded(): void @@ -220,16 +215,14 @@ protected function claimCodeceptionLoaded(): void } } - /** - * @return bool - */ protected function doCodeceptLoaderExists(): bool { - return class_exists('\Codeception\Test\Loader'); + return class_exists(\Codeception\Test\Loader::class); } /** * Splitting array of files to the group files + * * @param string[] $files - the relative path of the Testfile with or without test function * @example $this->splitToGroupFiles(['tests/FooCest.php', 'tests/BarTest.php:testBarReturn']); */ @@ -250,14 +243,14 @@ protected function splitToGroupFiles(array $files): array /** @var string $file */ foreach ($files as $file) { $groups[($i % $this->numGroups) + 1][] = $file; - $i++; + ++$i; } $filenames = []; // saving group files foreach ($groups as $i => $tests) { $filename = $this->saveTo . $i; - $this->printTaskInfo("Writing $filename"); + $this->printTaskInfo("Writing {$filename}"); file_put_contents($filename, implode("\n", $tests)); $filenames[] = $filename; } diff --git a/src/Splitter/TestsSplitterTask.php b/src/Splitter/TestsSplitterTask.php index a5129d1..23b27ea 100644 --- a/src/Splitter/TestsSplitterTask.php +++ b/src/Splitter/TestsSplitterTask.php @@ -11,6 +11,7 @@ use Exception; use PHPUnit\Framework\DataProviderTestSuite; use PHPUnit\Framework\TestCase; +use ReflectionException; use ReflectionObject; use Robo\Result; @@ -26,12 +27,12 @@ * ->addFilter(new Filter1()) * ->addFilter(new Filter2()) * ->run(); - * ?> * ``` + * + * @see \Tests\Codeception\Task\Splitter\TestsSplitterTaskTest */ class TestsSplitterTask extends TestsSplitter { - /** * @throws \Robo\Exception\TaskException */ @@ -53,7 +54,6 @@ public function run(): Result $test = current($test->tests()); } - // load dependencies for cest type. Unit tests dependencies are loaded automatically if ($test instanceof Cest) { $test->getMetadata()->setServices(['di' => $di]); $test->preload(); @@ -67,7 +67,7 @@ public function run(): Result } else { $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = []; } - // little hack to get dependencies from phpunit test cases that are private. + // little hack to get dependencies from phpunit test cases that are private. } elseif ($test instanceof TestCase) { $ref = new ReflectionObject($test); do { @@ -81,7 +81,7 @@ public function run(): Result } else { $testsListWithDependencies[TestDescriptor::getTestFullName($test)] = []; } - } catch (\ReflectionException $e) { + } catch (ReflectionException $exception) { // go up on level on inheritance chain. } } while ($ref = $ref->getParentClass()); @@ -101,6 +101,7 @@ public function run(): Result $this->printTaskError($e->getMessage()); return Result::error($this, $e->getMessage(), ['exception' => $e]); } + // resolved and ordered list of dependencies $orderedListOfTests = []; // helper array @@ -120,6 +121,7 @@ public function run(): Result return Result::error($this, $e->getMessage(), ['exception' => $e]); } } + // if we don't have any dependencies just use keys from original list. } else { $orderedListOfTests = array_keys($testsListWithDependencies); @@ -140,7 +142,7 @@ public function run(): Result && $i <= ($this->numGroups - 1) && count($groups[$i]) >= $numberOfElementsInGroup ) { - $i++; + ++$i; } $groups[$i][] = $test; @@ -163,17 +165,11 @@ public function run(): Result ]); } - /** - * @return TestLoader - */ protected function getTestLoader(): TestLoader { return new TestLoader(['path' => $this->testsFrom]); } - /** - * @return array - */ protected function loadTests(): array { $testLoader = $this->getTestLoader(); diff --git a/src/Splitter/TestsSplitterTrait.php b/src/Splitter/TestsSplitterTrait.php index 84f4af2..184466f 100644 --- a/src/Splitter/TestsSplitterTrait.php +++ b/src/Splitter/TestsSplitterTrait.php @@ -9,8 +9,6 @@ trait TestsSplitterTrait { /** - * @param int $numGroups - * * @return TestsSplitterTask|CollectionBuilder */ protected function taskSplitTestsByGroups(int $numGroups) @@ -19,8 +17,6 @@ protected function taskSplitTestsByGroups(int $numGroups) } /** - * @param int $numGroups - * * @return TestFileSplitterTask|CollectionBuilder */ protected function taskSplitTestFilesByGroups(int $numGroups) @@ -29,8 +25,6 @@ protected function taskSplitTestFilesByGroups(int $numGroups) } /** - * @param int $numGroups - * * @return TestFileSplitterTask|CollectionBuilder */ protected function taskSplitTestsByTime(int $numGroups) @@ -39,8 +33,6 @@ protected function taskSplitTestsByTime(int $numGroups) } /** - * @param int $numGroups - * * @return TestFileSplitterTask|CollectionBuilder */ protected function taskSplitFailedTests(int $numGroups) diff --git a/tests/Extension/FailedTestsReporterTest.php b/tests/Extension/FailedTestsReporterTest.php index c7e6571..8daab49 100644 --- a/tests/Extension/FailedTestsReporterTest.php +++ b/tests/Extension/FailedTestsReporterTest.php @@ -1,5 +1,7 @@ 'tests/acceptance/bar/baz.php:testA',], - ['testname' => 'tests/acceptance/bar/baz.php:testB',], - ['testname' => 'tests/acceptance/bar/baz.php:testC',], - ['testname' => 'tests/acceptance/bar/baz.php:testD',], - ['testname' => 'tests/acceptance/bar/baz.php:testE',], - ['testname' => 'tests/acceptance/bar/baz.php:testF',], - ['testname' => 'tests/acceptance/bar/baz.php:testG',], - ['testname' => 'tests/acceptance/bar/baz.php:testH',], + private array $failedTests = [ + ['testName' => 'tests/acceptance/bar/baz.php:testA',], + ['testName' => 'tests/acceptance/bar/baz.php:testB',], + ['testName' => 'tests/acceptance/bar/baz.php:testC',], + ['testName' => 'tests/acceptance/bar/baz.php:testD',], + ['testName' => 'tests/acceptance/bar/baz.php:testE',], + ['testName' => 'tests/acceptance/bar/baz.php:testF',], + ['testName' => 'tests/acceptance/bar/baz.php:testG',], + ['testName' => 'tests/acceptance/bar/baz.php:testH',], ]; /** @@ -32,7 +36,7 @@ public function testEndRun(): void { $reporter = $this->getMockBuilder(FailedTestsReporter::class) ->disableOriginalConstructor() - ->onlyMethods(['getTestname', 'getLogDir']) + ->onlyMethods(['getTestName', 'getLogDir']) ->getMock(); $reporter->method('getLogDir')->willReturn(TEST_PATH . '/result/'); @@ -46,13 +50,13 @@ public function testEndRun(): void $testEvents[] = [ 'mock' => $eventMock, - 'testname' => $test['testname'] + 'testName' => $test['testName'] ]; } - // get Testname by the TestEventMock + // get test name by the TestEventMock $reporter - ->method('getTestname') + ->method('getTestName') ->withConsecutive( ...array_map( static function (FailEvent $event): array { @@ -61,7 +65,7 @@ static function (FailEvent $event): array { array_column($testEvents, 'mock') ) ) - ->willReturnOnConsecutiveCalls(...array_column($testEvents, 'testname')); + ->willReturnOnConsecutiveCalls(...array_column($testEvents, 'testName')); foreach ($testEvents as $event) { $reporter->afterFail($event['mock']); diff --git a/tests/Extension/TimeReporterTest.php b/tests/Extension/TimeReporterTest.php index 4abc817..afdc7ee 100644 --- a/tests/Extension/TimeReporterTest.php +++ b/tests/Extension/TimeReporterTest.php @@ -1,36 +1,39 @@ 'tests/acceptance/bar/baz.php:testA', 'time' => 10,], - ['testname' => 'tests/acceptance/bar/baz.php:testA', 'time' => 50,], // rerun - ['testname' => 'tests/acceptance/bar/baz.php:testB', 'time' => 100,], - ['testname' => 'tests/acceptance/bar/baz.php:testC', 'time' => 50,], - ['testname' => 'tests/acceptance/bar/baz.php:testD', 'time' => 33,], - ['testname' => 'tests/acceptance/bar/baz.php:testD', 'time' => 50,], // rerun - ['testname' => 'tests/acceptance/bar/baz.php:testE', 'time' => 66,], - ['testname' => 'tests/acceptance/bar/baz.php:testF', 'time' => 90,], - ['testname' => 'tests/acceptance/bar/baz.php:testG', 'time' => 100,], - ['testname' => 'tests/acceptance/bar/baz.php:testG', 'time' => 13,], //rerun - ['testname' => 'tests/acceptance/bar/baz.php:testH', 'time' => 50,], + ['testName' => 'tests/acceptance/bar/baz.php:testA', 'time' => 10,], + ['testName' => 'tests/acceptance/bar/baz.php:testA', 'time' => 50,], // rerun + ['testName' => 'tests/acceptance/bar/baz.php:testB', 'time' => 100,], + ['testName' => 'tests/acceptance/bar/baz.php:testC', 'time' => 50,], + ['testName' => 'tests/acceptance/bar/baz.php:testD', 'time' => 33,], + ['testName' => 'tests/acceptance/bar/baz.php:testD', 'time' => 50,], // rerun + ['testName' => 'tests/acceptance/bar/baz.php:testE', 'time' => 66,], + ['testName' => 'tests/acceptance/bar/baz.php:testF', 'time' => 90,], + ['testName' => 'tests/acceptance/bar/baz.php:testG', 'time' => 100,], + ['testName' => 'tests/acceptance/bar/baz.php:testG', 'time' => 13,], //rerun + ['testName' => 'tests/acceptance/bar/baz.php:testH', 'time' => 50,], ]; $expected = [ @@ -46,7 +49,7 @@ public function testAfterAndEndRun(): void $reporter = $this->getMockBuilder(TimeReporter::class) ->disableOriginalConstructor() - ->onlyMethods(['getTestname', 'getLogDir']) + ->onlyMethods(['getTestName', 'getLogDir']) ->getMock(); $reporter->method('getLogDir')->willReturn(TEST_PATH . '/result/'); @@ -61,13 +64,13 @@ public function testAfterAndEndRun(): void $eventMock->method('getTime')->willReturn($test['time']); $testEvents[] = [ 'mock' => $eventMock, - 'testname' => $test['testname'] + 'testName' => $test['testName'] ]; } - // get Testname by the TestEventMock + // get test name by the TestEventMock $reporter - ->method('getTestname') + ->method('getTestName') ->withConsecutive( ...array_map( static function (TestEvent $event): array { @@ -76,7 +79,7 @@ static function (TestEvent $event): array { array_column($testEvents, 'mock') ) ) - ->willReturnOnConsecutiveCalls(...array_column($testEvents, 'testname')); + ->willReturnOnConsecutiveCalls(...array_column($testEvents, 'testName')); // fill timeList with the mocked Events foreach ($testEvents as $testEvent) { diff --git a/tests/Filter/GroupFilterTest.php b/tests/Filter/GroupFilterTest.php index 2f2fab6..7ee7e10 100644 --- a/tests/Filter/GroupFilterTest.php +++ b/tests/Filter/GroupFilterTest.php @@ -1,5 +1,7 @@ TEST_PATH . '/fixtures/Cests']); $loader->loadTests(TEST_PATH . '/fixtures/Cests'); + $tests = $loader->getTests(); $this->assertCount(3, $tests); // Filter with no groups should return all tests $filter = new GroupFilter(); $filter->setTests($tests); + $filtered = $filter->filter(); $this->assertCount(3, $filtered); // Filter with group foo should return 2 Tests @@ -142,11 +147,13 @@ public function testFilterWithUnitTests(): void { $loader = new TestLoader(['path' => TEST_PATH . '/fixtures/Unit']); $loader->loadTests(TEST_PATH . '/fixtures/Unit'); + $tests = $loader->getTests(); $this->assertCount(4, $tests); // Filter with no groups should return all tests $filter = new GroupFilter(); $filter->setTests($tests); + $filtered = $filter->filter(); $this->assertCount(4, $filtered); // Filter with group foo should return 2 Tests diff --git a/tests/Merger/FailedTestsMergerTaskTest.php b/tests/Merger/FailedTestsMergerTaskTest.php index f3d25ef..053c79c 100644 --- a/tests/Merger/FailedTestsMergerTaskTest.php +++ b/tests/Merger/FailedTestsMergerTaskTest.php @@ -1,25 +1,34 @@ '/foo_\w+\.txt/', 'bar' => '/bar_\w+\.txt/', 'baz' => '/baz_\w+\.txt/', ]; - private static $testContent = [ + private static array $testContent = [ 'tests/acceptance/%s/baz.php:testA', 'tests/acceptance/%s/baz.php:testB', 'tests/acceptance/%s/baz.php:testC', @@ -30,7 +39,7 @@ class FailedTestsMergerTaskTest extends TestCase 'tests/acceptance/%s/baz.php:testH', ]; - private static $testFiles = []; + private static array $testFiles = []; /** * Prepare the test files and directories @@ -39,27 +48,26 @@ public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); $tmpDir = sys_get_temp_dir(); - foreach (self::$tmpDirsPattern as $dir => $pattern) { + foreach (array_keys(self::$tmpDirsPattern) as $dir) { $tempDir = $tmpDir . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR; if (!is_dir($tempDir)) { mkdir($tempDir); } + $i = 1; while ($i <= self::TEST_FILES_PER_DIR) { - $tempfile = $tempDir . $dir . '_unit' . $i++ . '.txt'; + $tempFile = $tempDir . $dir . '_unit' . $i++ . '.txt'; file_put_contents( - $tempfile, + $tempFile, implode( PHP_EOL, array_map( - static function (string $filename) use ($dir): string { - return sprintf($filename, $dir); - }, + static fn(string $filename): string => sprintf($filename, $dir), self::$testContent ) ) ); - self::$testFiles[] = $tempfile; + self::$testFiles[] = $tempFile; } } } @@ -123,6 +131,7 @@ public function testRunWithFileAndArrayAndPathWithPatterns(): void if (!is_dir($tmpDir)) { mkdir($tmpDir); } + $this->putContents($testFile); $fileData = []; @@ -161,7 +170,7 @@ public function testRunWithFileAndArrayAndPathWithPatterns(): void ); } - public function tearDown(): void + protected function tearDown(): void { parent::tearDown(); // TODO: Change the autogenerated stub unlink(self::EXPECTED_TEST_MERGED_FILE); @@ -175,9 +184,6 @@ public static function tearDownAfterClass(): void } } - /** - * @param string $testFile - */ protected function putContents(string $testFile): void { file_put_contents( @@ -185,9 +191,7 @@ protected function putContents(string $testFile): void implode( PHP_EOL, array_map( - static function (string $filename): string { - return sprintf($filename, 'foz'); - }, + static fn(string $filename): string => sprintf($filename, 'foz'), self::$testContent ) ) diff --git a/tests/Merger/HtmlReportMergerTest.php b/tests/Merger/HtmlReportMergerTest.php index 55328d9..d3df126 100644 --- a/tests/Merger/HtmlReportMergerTest.php +++ b/tests/Merger/HtmlReportMergerTest.php @@ -1,5 +1,7 @@ setLogger(new Logger(new NullOutput())); + $resultReport = TEST_PATH . '/result/report.html'; $task ->from( @@ -52,7 +55,7 @@ public function testRun(): void $values = (new DOMXPath($dstHTML)) ->query("//h1[text() = 'Codeception Results ']"); preg_match( - '/^Codeception Results .* \((?\d+\.\d+)s\)$/', + '#^Codeception Results .* \((?\d+\.\d+)s\)$#', $values[0]->nodeValue, $matches ); diff --git a/tests/Merger/XmlReportMergerTaskTest.php b/tests/Merger/XmlReportMergerTaskTest.php index dad79f3..9cf40cd 100644 --- a/tests/Merger/XmlReportMergerTaskTest.php +++ b/tests/Merger/XmlReportMergerTaskTest.php @@ -1,5 +1,6 @@ setLogger(new Logger(new NullOutput())); + $groupTo = TEST_PATH . '/result/group_'; $task ->setReportPath(TEST_PATH . '/fixtures/failedTests.txt') @@ -39,7 +42,7 @@ public function testRun(): void ->run(); $countedFiles = 0; - for ($i = 1; $i <= $expected; $i++) { + for ($i = 1; $i <= $expected; ++$i) { $this->assertFileExists($groupTo . $i); $countedFiles += count( explode( @@ -48,6 +51,7 @@ public function testRun(): void ) ); } + $this->assertSame( 8, $countedFiles, diff --git a/tests/Splitter/SplitTestsByTimeTaskTest.php b/tests/Splitter/SplitTestsByTimeTaskTest.php index a03db51..5148a9c 100644 --- a/tests/Splitter/SplitTestsByTimeTaskTest.php +++ b/tests/Splitter/SplitTestsByTimeTaskTest.php @@ -1,5 +1,7 @@ run(); - for ($i = 1; $i <= $expectedFiles; $i++) { + for ($i = 1; $i <= $expectedFiles; ++$i) { $filename = $groupTo . $i; $this->assertFileExists($filename); $lines = explode(PHP_EOL, file_get_contents($filename)); diff --git a/tests/Splitter/TestFileSplitterTaskTest.php b/tests/Splitter/TestFileSplitterTaskTest.php index 4003509..6eb2988 100644 --- a/tests/Splitter/TestFileSplitterTaskTest.php +++ b/tests/Splitter/TestFileSplitterTaskTest.php @@ -1,5 +1,6 @@ groupsTo($groupTo) ->run(); - for ($i = 1; $i <= $expected; $i++) { + for ($i = 1; $i <= $expected; ++$i) { $this->assertFileExists($groupTo . $i); } + $this->assertFileDoesNotExist($groupTo . ($expected + 1)); } diff --git a/tests/Splitter/TestsSplitterTaskTest.php b/tests/Splitter/TestsSplitterTaskTest.php index 86cff53..dc5fab2 100644 --- a/tests/Splitter/TestsSplitterTaskTest.php +++ b/tests/Splitter/TestsSplitterTaskTest.php @@ -1,5 +1,7 @@ expectException(TaskException::class); $this->expectErrorMessage( - 'This task requires Codeception to be loaded.' - . ' Please require autoload.php of Codeception' + 'This task requires Codeception to be loaded. Please require autoload.php of Codeception' ); $service->run(); } @@ -70,10 +73,6 @@ public function providerTestLoadTestsWithDifferentPatterns(): array /** * @covers ::run * @dataProvider providerTestLoadTestsWithDifferentPatterns - * @param string $type - * @param int $groups - * @param string $from - * @param int $expectedFiles */ public function testLoadTests( string $type, @@ -84,6 +83,7 @@ public function testLoadTests( $task = new TestsSplitterTask($groups); $task->setLogger(new Logger(new NullOutput())); $task->testsFrom($from); + $groupTo = TEST_PATH . '/result/group_'; $task->groupsTo($groupTo); $result = $task->run(); @@ -102,22 +102,21 @@ public function testLoadTests( $this->assertCount($expectedFiles, $files->getIterator()); - for ($i = 1; $i <= $expectedFiles; $i++) { + for ($i = 1; $i <= $expectedFiles; ++$i) { $this->assertFileExists($groupTo . $i); } + // check that the dependencies are ordered correct if ('depends' === $type) { - for ($i = 1; $i <= $expectedFiles; $i++) { + for ($i = 1; $i <= $expectedFiles; ++$i) { $content = explode(PHP_EOL, file_get_contents($groupTo . $i)); $check = array_flip( array_map( - static function (string $fullpath): string { - return explode(':', $fullpath)[1]; - }, + static fn(string $fullPath): string => explode(':', $fullPath)[1], $content ) ); - if (preg_grep('/Example1Test\.php/', $content)) { + if (preg_grep('#Example1Test\.php#', $content)) { $this->assertGreaterThan( $check['testB'], $check['testA'], @@ -129,7 +128,8 @@ static function (string $fullpath): string { 'The index of testC must be greater than testA to ensure the correct order.' ); } - if (preg_grep('/Example2Test\.php/', $content)) { + + if (preg_grep('#Example2Test\.php#', $content)) { $this->assertGreaterThan( $check['testE'], $check['testD'], diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 195a328..9965e7f 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,9 +1,18 @@ Date: Thu, 20 Jan 2022 00:43:01 +0200 Subject: [PATCH 39/52] update changelog (#98) --- CHANGELOG.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cca4ca0..aef97c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,37 @@ +## [2.0.0](https://github.com/Codeception/robo-paracept/releases/tag/2.0.0) 2.0.0 Major Release + +robo-paracept 2.0 is now released + +- support for PHP 7.4 , 8.0, 8.1 +- refactorings + +Thanks to @DavertMik and @TavoNiievez for their contributions. + +## [1.3.1](https://github.com/Codeception/robo-paracept/releases/tag/1.3.1) Preloading Codeception configuration + +* Loading default Codeception config to detect the main directory path +* Show warning if Codeception config was not loaded + +## [1.3.0](https://github.com/Codeception/robo-paracept/releases/tag/1.3.0) Split group improvements + +* Load PHPUnit bridge of Codeception before splitting tests +* All `Split*` to return result objects (readme updated) +* Warn if root directory for Codeception is not set when splitting by groups +* Improved matching groups by using GroupManager + +See [#96](https://github.com/Codeception/robo-paracept/pull/96) + +## [1.2.4](https://github.com/Codeception/robo-paracept/releases/tag/1.2.4) Bugfix Release HTMLMerger + +If one of the html reports wasn't created by a parallel job the merger will not longer throw an exception. +The Merger will show a warning that an expected html report wasn't found. + +## What's Changed +* Update CHANGELOG.md by @Arhell in https://github.com/Codeception/robo-paracept/pull/90 +* Bugfix/91 fixing html merger by @vansari in https://github.com/Codeception/robo-paracept/pull/92 + +**Full Changelog**: https://github.com/Codeception/robo-paracept/compare/1.2.3...1.2.4 + ## [1.2.3](https://github.com/Codeception/robo-paracept/releases/tag/1.2.3) Bugfix Release XmlMerger Fix the issue that an exception is thrown if a xml report does not exists. From 5865967f663bbb2526fecfa68639bb0155149f24 Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Sun, 23 Jan 2022 00:10:39 +0200 Subject: [PATCH 40/52] Update CHANGELOG.md (#100) --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aef97c6..ccbea5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ robo-paracept 2.0 is now released - support for PHP 7.4 , 8.0, 8.1 - refactorings -Thanks to @DavertMik and @TavoNiievez for their contributions. +Thanks to (@DavertMik)[https://github.com/DavertMik] and @TavoNiievez for their contributions. ## [1.3.1](https://github.com/Codeception/robo-paracept/releases/tag/1.3.1) Preloading Codeception configuration @@ -27,8 +27,8 @@ If one of the html reports wasn't created by a parallel job the merger will not The Merger will show a warning that an expected html report wasn't found. ## What's Changed -* Update CHANGELOG.md by @Arhell in https://github.com/Codeception/robo-paracept/pull/90 -* Bugfix/91 fixing html merger by @vansari in https://github.com/Codeception/robo-paracept/pull/92 +* Update CHANGELOG.md by (@Arhell)[https://github.com/Arhell] in https://github.com/Codeception/robo-paracept/pull/90 +* Bugfix/91 fixing html merger by (@vansari)[https://github.com/vansari] in https://github.com/Codeception/robo-paracept/pull/92 **Full Changelog**: https://github.com/Codeception/robo-paracept/compare/1.2.3...1.2.4 From 676460c69f39476072cdd5f341a3c27b7bea8984 Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Tue, 25 Jan 2022 00:41:34 +0200 Subject: [PATCH 41/52] Update CHANGELOG.md (#101) --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccbea5c..b088930 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ robo-paracept 2.0 is now released - support for PHP 7.4 , 8.0, 8.1 - refactorings -Thanks to (@DavertMik)[https://github.com/DavertMik] and @TavoNiievez for their contributions. +Thanks to [@DavertMik](https://github.com/DavertMik) and [@TavoNiievez](https://github.com/TavoNiievez) for their contributions. ## [1.3.1](https://github.com/Codeception/robo-paracept/releases/tag/1.3.1) Preloading Codeception configuration @@ -27,8 +27,8 @@ If one of the html reports wasn't created by a parallel job the merger will not The Merger will show a warning that an expected html report wasn't found. ## What's Changed -* Update CHANGELOG.md by (@Arhell)[https://github.com/Arhell] in https://github.com/Codeception/robo-paracept/pull/90 -* Bugfix/91 fixing html merger by (@vansari)[https://github.com/vansari] in https://github.com/Codeception/robo-paracept/pull/92 +* Update CHANGELOG.md by [@Arhell](https://github.com/Arhell) in https://github.com/Codeception/robo-paracept/pull/90 +* Bugfix/91 fixing html merger by [@vansari](https://github.com/vansari) in https://github.com/Codeception/robo-paracept/pull/92 **Full Changelog**: https://github.com/Codeception/robo-paracept/compare/1.2.3...1.2.4 From 10bbd3b13043e68c645aea646b6fd89cb9c76e02 Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Thu, 27 Jan 2022 00:15:43 +0200 Subject: [PATCH 42/52] Update CHANGELOG.md (#102) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b088930..fa0a9a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## [2.0.0](https://github.com/Codeception/robo-paracept/releases/tag/2.0.0) 2.0.0 Major Release +## [2.0.0](https://github.com/Codeception/robo-paracept/releases/tag/2.0.0) Major Release robo-paracept 2.0 is now released From 03581baa7893108c98f9c4221bbcae797abadf8b Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Sun, 3 Jul 2022 00:14:38 +0300 Subject: [PATCH 43/52] update link (#110) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7bb63f..2204d68 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ robo-paracept [![Total Downloads](https://poser.pugx.org/codeception/robo-paracept/downloads)](https://packagist.org/packages/codeception/robo-paracept) [![License](https://poser.pugx.org/codeception/robo-paracept/license)](https://packagist.org/packages/codeception/robo-paracept) -Robo tasks for Codeception tests parallel execution. Requires [Robo Task Runner](http://robo.li) +Robo tasks for Codeception tests parallel execution. Requires [Robo Task Runner](https://robo.li) ## Install via Composer From b1d6d9c33c4295c62dbf9958f14188803421950b Mon Sep 17 00:00:00 2001 From: jmrieger Date: Sun, 10 Jul 2022 15:29:50 -0400 Subject: [PATCH 44/52] bug/103 - Fix bug where leading character of a relative test name was being removed erroneously (#106) --- CHANGELOG.md | 4 ++++ src/Extension/FailedTestsReporter.php | 3 ++- src/Extension/TimeReporter.php | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa0a9a3..277b18e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [2.0.1](https://github.com/Codeception/robo-paracept/releases/tag/2.0.1) Bugfix Release - TimeReporter and FailedTestsReporter + +* Fix bug where leading character was being removed from tests in the reporter instead of leading directory separator + ## [2.0.0](https://github.com/Codeception/robo-paracept/releases/tag/2.0.0) Major Release robo-paracept 2.0 is now released diff --git a/src/Extension/FailedTestsReporter.php b/src/Extension/FailedTestsReporter.php index fcc21ff..ec3feea 100644 --- a/src/Extension/FailedTestsReporter.php +++ b/src/Extension/FailedTestsReporter.php @@ -65,7 +65,8 @@ public function getTestName(TestEvent $e): string { $name = Descriptor::getTestFullName($e->getTest()); - return substr(str_replace($this->getRootDir(), '', $name), 1); + // If a leading DIRECTORY_SEPARATOR was found, remove it + return ltrim(str_replace($this->getRootDir(), '', $name), DIRECTORY_SEPARATOR); } public function getUniqReportFile(): string diff --git a/src/Extension/TimeReporter.php b/src/Extension/TimeReporter.php index 0cab436..4268648 100644 --- a/src/Extension/TimeReporter.php +++ b/src/Extension/TimeReporter.php @@ -45,6 +45,8 @@ public function endRun(): void public function getTestName(TestEvent $e): string { $name = Descriptor::getTestFullName($e->getTest()); - return substr(str_replace($this->getRootDir(), '', $name), 1); + + // If a leading DIRECTORY_SEPARATOR was found, remove it + return ltrim(str_replace($this->getRootDir(), '', $name), DIRECTORY_SEPARATOR); } } From 987a956e93300af61c0a2223689d17ca95a5a45a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhold=20F=C3=BCreder?= Date: Sun, 13 Nov 2022 12:39:37 +0100 Subject: [PATCH 45/52] Fix detection of @groups for dataprovider tests (#108) --- src/Filter/GroupFilter.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Filter/GroupFilter.php b/src/Filter/GroupFilter.php index f372424..793f18c 100644 --- a/src/Filter/GroupFilter.php +++ b/src/Filter/GroupFilter.php @@ -131,6 +131,14 @@ public function filter(): array $groups = $groupManager->groupsForTest($test); + if (!$groups && $test instanceof \PHPUnit\Framework\DataProviderTestSuite) { + /** @var \PHPUnit\Framework\DataProviderTestSuite $dataProviderTestSuite */ + $dataProviderTestSuite = $test; + // By definition (a) all tests of dataprovider test suite are the same test case definition, and (b) there is at least one test case + $firstDataProviderTest = $dataProviderTestSuite->tests()[0]; + $groups = $groupManager->groupsForTest($firstDataProviderTest); + } + if ( !empty($this->getExcludedGroups()) && [] === array_diff($this->getExcludedGroups(), $groups) From 7fb0845ecb9b9b396f5682820563d208f40b17c3 Mon Sep 17 00:00:00 2001 From: KJunker Date: Sun, 13 Nov 2022 13:09:55 +0100 Subject: [PATCH 46/52] Bugfix/codestyle (#115) * Fixing Codestyle * added new script 'test' to run all Tests, extends the README.md with steps to contributing --- README.md | 28 ++++++++++++++++++++++++++++ composer.json | 7 ++++++- src/Filter/GroupFilter.php | 11 ++++++----- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2204d68..900ee5b 100644 --- a/README.md +++ b/README.md @@ -216,4 +216,32 @@ Load Codeception config file to specify the path to Codeception before split* ta \Codeception\Configuration::config('tests/codeception.yml'); ``` +## Contributing + +Thank you for contributing to codeception/robo-paracept! + +1. Fork this project +2. install all deps +3. create a branch from master +4. make your changes +5. extend or create tests for your changes +6. run `composer test` (This will execute lint, codestyle and unit tests sequential) +7. open a Merge Request + +### Coding Standard + +Please note that this project follows the PSR-12 Coding Standard. You can check your coding style with: + +```shell +composer codestyle +``` + +### Unit Tests + +All changes which you will done must pass the unit tests. If you change some logic or you add some new methods please be fair and write a test. + +```shell +composer unit +``` + ### License MIT diff --git a/composer.json b/composer.json index 7675958..5689f78 100644 --- a/composer.json +++ b/composer.json @@ -43,6 +43,11 @@ "scripts": { "unit": "vendor/bin/phpunit --bootstrap tests/bootstrap.php tests/ --exclude-group example --stderr -v --debug", "lint": "vendor/bin/phplint -v ./ --exclude=vendor", - "codestyle": "vendor/bin/phpcs --standard=PSR12 ./src" + "codestyle": "vendor/bin/phpcs --standard=PSR12 ./src", + "test": [ + "@lint", + "@codestyle", + "@unit" + ] } } diff --git a/src/Filter/GroupFilter.php b/src/Filter/GroupFilter.php index 793f18c..e46f66c 100644 --- a/src/Filter/GroupFilter.php +++ b/src/Filter/GroupFilter.php @@ -132,11 +132,12 @@ public function filter(): array $groups = $groupManager->groupsForTest($test); if (!$groups && $test instanceof \PHPUnit\Framework\DataProviderTestSuite) { - /** @var \PHPUnit\Framework\DataProviderTestSuite $dataProviderTestSuite */ - $dataProviderTestSuite = $test; - // By definition (a) all tests of dataprovider test suite are the same test case definition, and (b) there is at least one test case - $firstDataProviderTest = $dataProviderTestSuite->tests()[0]; - $groups = $groupManager->groupsForTest($firstDataProviderTest); + /** @var \PHPUnit\Framework\DataProviderTestSuite $dataProviderTestSuite */ + $dataProviderTestSuite = $test; + // By definition (a) all tests of dataprovider test suite are the same test + // case definition, and (b) there is at least one test case + $firstDataProviderTest = $dataProviderTestSuite->tests()[0]; + $groups = $groupManager->groupsForTest($firstDataProviderTest); } if ( From f844be4b82fc09691be8d19fd61a4225c479683c Mon Sep 17 00:00:00 2001 From: vincent-joignie-dd <103102299+vincent-joignie-dd@users.noreply.github.com> Date: Sun, 13 Nov 2022 15:42:04 +0100 Subject: [PATCH 47/52] Adding the symfony 6 compatibility (#112) * adding the symfony 6 compatibility as codeception 5 is now compatible with it * Update composer.json added extra version for robo Co-authored-by: @vansari Co-authored-by: @vincent-joignie-dd --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 5689f78..9900b67 100644 --- a/composer.json +++ b/composer.json @@ -15,8 +15,8 @@ }, "require": { "php": "^7.4 | ^8.0", - "consolidation/robo": "3.0.*", - "symfony/finder": ">=2.7 <6.0", + "consolidation/robo": "3.0.* | 4.0.*", + "symfony/finder": ">=2.7", "ext-dom": "*", "ext-libxml": "*", "ext-json": "*" From 4c020f422df2efecd81f656b581e0c36bdaa4e31 Mon Sep 17 00:00:00 2001 From: KJunker Date: Sun, 13 Nov 2022 16:52:50 +0100 Subject: [PATCH 48/52] Feature/fixing deps cc5 sf6 cr4 (#116) * Upgraded PHP Version, fixed the Version to ^8.1, upgraded all packages to newest stable versions * Fixed classes after test result --- composer.json | 18 +- composer.lock | 3147 +++++++++--------------- src/Exception/KeyNotFoundException.php | 1 - src/Splitter/TestsSplitter.php | 2 - tests/Extension/TimeReporterTest.php | 22 +- 5 files changed, 1151 insertions(+), 2039 deletions(-) diff --git a/composer.json b/composer.json index 9900b67..1306de9 100644 --- a/composer.json +++ b/composer.json @@ -14,9 +14,9 @@ } }, "require": { - "php": "^7.4 | ^8.0", - "consolidation/robo": "3.0.* | 4.0.*", - "symfony/finder": ">=2.7", + "php": "^8.1", + "consolidation/robo": "^4.0", + "symfony/finder": "^6.0", "ext-dom": "*", "ext-libxml": "*", "ext-json": "*" @@ -28,16 +28,14 @@ }, "require-dev": { "roave/security-advisories": "dev-latest", - "codeception/codeception": "4.1.*", - "squizlabs/php_codesniffer": "^3.6.0", - "overtrue/phplint": "^3.0.0", - "friendsofphp/php-cs-fixer": "^3.0.0", - "phpunit/phpunit": ">=9.0", - "codeception/phpunit-wrapper": "^9.0.6" + "codeception/codeception": "^5.0", + "squizlabs/php_codesniffer": "^3.7", + "overtrue/phplint": "^5.3", + "phpunit/phpunit": "^9.5" }, "config": { "platform": { - "php": "7.4.0" + "php": "8.1.12" } }, "scripts": { diff --git a/composer.lock b/composer.lock index 1a94bf7..161edde 100644 --- a/composer.lock +++ b/composer.lock @@ -4,27 +4,27 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d50b1264751a69ce330053abfd2d09ba", + "content-hash": "a930ee448b8ac2a99ff0ab440da0513f", "packages": [ { "name": "composer/semver", - "version": "3.2.6", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "83e511e247de329283478496f7a1e114c9517506" + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506", - "reference": "83e511e247de329283478496f7a1e114c9517506", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.54", + "phpstan/phpstan": "^1.4", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -69,7 +69,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.6" + "source": "https://github.com/composer/semver/tree/3.3.2" }, "funding": [ { @@ -85,31 +85,32 @@ "type": "tidelift" } ], - "time": "2021-10-25T11:34:17+00:00" + "time": "2022-04-01T19:23:25+00:00" }, { "name": "consolidation/annotated-command", - "version": "4.4.0", + "version": "4.6.1", "source": { "type": "git", "url": "https://github.com/consolidation/annotated-command.git", - "reference": "308f6ac178566a1ce9aa90ed908dac90a2c1e707" + "reference": "76835d35fcb0b879170129e82adfa1536b72921f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/308f6ac178566a1ce9aa90ed908dac90a2c1e707", - "reference": "308f6ac178566a1ce9aa90ed908dac90a2c1e707", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/76835d35fcb0b879170129e82adfa1536b72921f", + "reference": "76835d35fcb0b879170129e82adfa1536b72921f", "shasum": "" }, "require": { "consolidation/output-formatters": "^4.1.1", "php": ">=7.1.3", - "psr/log": "^1|^2", - "symfony/console": "^4.4.8|~5.1.0", - "symfony/event-dispatcher": "^4.4.8|^5", - "symfony/finder": "^4.4.8|^5" + "psr/log": "^1|^2|^3", + "symfony/console": "^4.4.8|^5|^6", + "symfony/event-dispatcher": "^4.4.8|^5|^6", + "symfony/finder": "^4.4.8|^5|^6" }, "require-dev": { + "composer-runtime-api": "^2.0", "phpunit/phpunit": "^7.5.20 || ^8 || ^9", "squizlabs/php_codesniffer": "^3", "yoast/phpunit-polyfills": "^0.2.0" @@ -138,37 +139,37 @@ "description": "Initialize Symfony Console commands from annotated command class methods.", "support": { "issues": "https://github.com/consolidation/annotated-command/issues", - "source": "https://github.com/consolidation/annotated-command/tree/4.4.0" + "source": "https://github.com/consolidation/annotated-command/tree/4.6.1" }, - "time": "2021-09-30T01:08:15+00:00" + "time": "2022-11-09T18:31:17+00:00" }, { "name": "consolidation/config", - "version": "2.0.1", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/consolidation/config.git", - "reference": "9a2c2a7b2aea1b3525984a4378743a8b74c14e1c" + "reference": "597f8d7fbeef801736250ec10c3e190569b1b0ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/config/zipball/9a2c2a7b2aea1b3525984a4378743a8b74c14e1c", - "reference": "9a2c2a7b2aea1b3525984a4378743a8b74c14e1c", + "url": "https://api.github.com/repos/consolidation/config/zipball/597f8d7fbeef801736250ec10c3e190569b1b0ae", + "reference": "597f8d7fbeef801736250ec10c3e190569b1b0ae", "shasum": "" }, "require": { - "dflydev/dot-access-data": "^1.1.0", - "grasmash/expander": "^1", + "dflydev/dot-access-data": "^1.1.0 || ^2 || ^3", + "grasmash/expander": "^2.0.1 || ^3", "php": ">=7.1.3", - "psr/log": "^1.1", - "symfony/event-dispatcher": "^4||^5" + "symfony/event-dispatcher": "^4 || ^5 || ^6" }, "require-dev": { + "ext-json": "*", "phpunit/phpunit": ">=7.5.20", "squizlabs/php_codesniffer": "^3", - "symfony/console": "^4||^5", - "symfony/yaml": "^4||^5", - "yoast/phpunit-polyfills": "^0.2.0" + "symfony/console": "^4 || ^5 || ^6", + "symfony/yaml": "^4 || ^5 || ^6", + "yoast/phpunit-polyfills": "^1" }, "suggest": { "symfony/event-dispatcher": "Required to inject configuration into Command options", @@ -198,28 +199,28 @@ "description": "Provide configuration services for a commandline tool.", "support": { "issues": "https://github.com/consolidation/config/issues", - "source": "https://github.com/consolidation/config/tree/2.0.1" + "source": "https://github.com/consolidation/config/tree/2.1.2" }, - "time": "2020-12-06T00:03:30+00:00" + "time": "2022-10-06T17:48:03+00:00" }, { "name": "consolidation/log", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/consolidation/log.git", - "reference": "82a2aaaa621a7b976e50a745a8d249d5085ee2b1" + "reference": "caaad9d70dae54eb49002666f000e3c607066878" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/log/zipball/82a2aaaa621a7b976e50a745a8d249d5085ee2b1", - "reference": "82a2aaaa621a7b976e50a745a8d249d5085ee2b1", + "url": "https://api.github.com/repos/consolidation/log/zipball/caaad9d70dae54eb49002666f000e3c607066878", + "reference": "caaad9d70dae54eb49002666f000e3c607066878", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "^1.0", - "symfony/console": "^4|^5" + "php": ">=8.0.0", + "psr/log": "^3", + "symfony/console": "^5 || ^6" }, "require-dev": { "phpunit/phpunit": ">=7.5.20", @@ -250,36 +251,36 @@ "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", "support": { "issues": "https://github.com/consolidation/log/issues", - "source": "https://github.com/consolidation/log/tree/2.0.2" + "source": "https://github.com/consolidation/log/tree/3.0.0" }, - "time": "2020-12-10T16:26:23+00:00" + "time": "2022-04-05T16:53:32+00:00" }, { "name": "consolidation/output-formatters", - "version": "4.1.2", + "version": "4.2.3", "source": { "type": "git", "url": "https://github.com/consolidation/output-formatters.git", - "reference": "5821e6ae076bf690058a4de6c94dce97398a69c9" + "reference": "cbb50cc86775f14972003f797b61e232788bee1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/5821e6ae076bf690058a4de6c94dce97398a69c9", - "reference": "5821e6ae076bf690058a4de6c94dce97398a69c9", + "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/cbb50cc86775f14972003f797b61e232788bee1f", + "reference": "cbb50cc86775f14972003f797b61e232788bee1f", "shasum": "" }, "require": { - "dflydev/dot-access-data": "^1.1.0", + "dflydev/dot-access-data": "^1.1.0 || ^2 || ^3", "php": ">=7.1.3", - "symfony/console": "^4|^5", - "symfony/finder": "^4|^5" + "symfony/console": "^4|^5|^6", + "symfony/finder": "^4|^5|^6" }, "require-dev": { "php-coveralls/php-coveralls": "^2.4.2", "phpunit/phpunit": ">=7", "squizlabs/php_codesniffer": "^3", - "symfony/var-dumper": "^4", - "symfony/yaml": "^4", + "symfony/var-dumper": "^4|^5|^6", + "symfony/yaml": "^4|^5|^6", "yoast/phpunit-polyfills": "^0.2.0" }, "suggest": { @@ -309,38 +310,39 @@ "description": "Format text by applying transformations provided by plug-in formatters.", "support": { "issues": "https://github.com/consolidation/output-formatters/issues", - "source": "https://github.com/consolidation/output-formatters/tree/4.1.2" + "source": "https://github.com/consolidation/output-formatters/tree/4.2.3" }, - "time": "2020-12-12T19:04:59+00:00" + "time": "2022-10-17T04:01:40+00:00" }, { "name": "consolidation/robo", - "version": "3.0.6", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/consolidation/Robo.git", - "reference": "36dce2965a67abe5cf91f2bc36d2582a64a11258" + "url": "https://github.com/consolidation/robo.git", + "reference": "86b4c35770a9e734112571b3b73e13bd03ac710e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/Robo/zipball/36dce2965a67abe5cf91f2bc36d2582a64a11258", - "reference": "36dce2965a67abe5cf91f2bc36d2582a64a11258", + "url": "https://api.github.com/repos/consolidation/robo/zipball/86b4c35770a9e734112571b3b73e13bd03ac710e", + "reference": "86b4c35770a9e734112571b3b73e13bd03ac710e", "shasum": "" }, "require": { "consolidation/annotated-command": "^4.3", - "consolidation/config": "^1.2.1|^2.0.1", - "consolidation/log": "^1.1.1|^2.0.2", + "consolidation/config": "^2.0.1", + "consolidation/log": "^2.0.2 || ^3", "consolidation/output-formatters": "^4.1.2", "consolidation/self-update": "^2.0", - "league/container": "^3.3.1", - "php": ">=7.1.3", - "symfony/console": "^4.4.19 || ^5", - "symfony/event-dispatcher": "^4.4.19 || ^5", - "symfony/filesystem": "^4.4.9 || ^5", - "symfony/finder": "^4.4.9 || ^5", - "symfony/process": "^4.4.9 || ^5", - "symfony/yaml": "^4.4 || ^5" + "league/container": "^3.3.1 || ^4.0", + "php": ">=8.0", + "phpowermove/docblock": "^4.0", + "symfony/console": "^6", + "symfony/event-dispatcher": "^6", + "symfony/filesystem": "^6", + "symfony/finder": "^6", + "symfony/process": "^6", + "symfony/yaml": "^6" }, "conflict": { "codegyre/robo": "*" @@ -349,7 +351,7 @@ "natxet/cssmin": "3.0.4", "patchwork/jsqueeze": "^2", "pear/archive_tar": "^1.4.4", - "phpunit/phpunit": "^7.5.20 | ^8", + "phpunit/phpunit": "^7.5.20 || ^8", "squizlabs/php_codesniffer": "^3.6", "yoast/phpunit-polyfills": "^0.2.0" }, @@ -363,33 +365,6 @@ "robo" ], "type": "library", - "extra": { - "scenarios": { - "symfony4": { - "require": { - "symfony/console": "^4.4.11", - "symfony/event-dispatcher": "^4.4.11", - "symfony/filesystem": "^4.4.11", - "symfony/finder": "^4.4.11", - "symfony/process": "^4.4.11", - "phpunit/phpunit": "^6", - "nikic/php-parser": "^2" - }, - "remove": [ - "codeception/phpunit-wrapper" - ], - "config": { - "platform": { - "php": "7.1.3" - } - } - } - }, - "branch-alias": { - "dev-master": "2.x-dev", - "dev-main": "2.x-dev" - } - }, "autoload": { "psr-4": { "Robo\\": "src" @@ -407,30 +382,30 @@ ], "description": "Modern task runner", "support": { - "issues": "https://github.com/consolidation/Robo/issues", - "source": "https://github.com/consolidation/Robo/tree/3.0.6" + "issues": "https://github.com/consolidation/robo/issues", + "source": "https://github.com/consolidation/robo/tree/4.0.1" }, - "time": "2021-10-05T23:56:45+00:00" + "time": "2022-09-20T16:53:20+00:00" }, { "name": "consolidation/self-update", - "version": "2.0.0", + "version": "2.0.5", "source": { "type": "git", "url": "https://github.com/consolidation/self-update.git", - "reference": "7d6877f8006c51069e1469a9c57b1435640f74b7" + "reference": "8a64bdd8daf5faa8e85f56534dd99caf928164b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/self-update/zipball/7d6877f8006c51069e1469a9c57b1435640f74b7", - "reference": "7d6877f8006c51069e1469a9c57b1435640f74b7", + "url": "https://api.github.com/repos/consolidation/self-update/zipball/8a64bdd8daf5faa8e85f56534dd99caf928164b3", + "reference": "8a64bdd8daf5faa8e85f56534dd99caf928164b3", "shasum": "" }, "require": { "composer/semver": "^3.2", "php": ">=5.5.0", - "symfony/console": "^2.8|^3|^4|^5", - "symfony/filesystem": "^2.5|^3|^4|^5" + "symfony/console": "^2.8 || ^3 || ^4 || ^5 || ^6", + "symfony/filesystem": "^2.5 || ^3 || ^4 || ^5 || ^6" }, "bin": [ "scripts/release" @@ -463,36 +438,43 @@ "description": "Provides a self:update command for Symfony Console applications.", "support": { "issues": "https://github.com/consolidation/self-update/issues", - "source": "https://github.com/consolidation/self-update/tree/2.0.0" + "source": "https://github.com/consolidation/self-update/tree/2.0.5" }, - "time": "2021-10-05T23:29:47+00:00" + "time": "2022-02-09T22:44:24+00:00" }, { "name": "dflydev/dot-access-data", - "version": "v1.1.0", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a" + "reference": "f41715465d65213d644d3141a6a93081be5d3549" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/3fbd874921ab2c041e899d044585a2ab9795df8a", - "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", "shasum": "" }, "require": { - "php": ">=5.3.2" + "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-master": "1.0-dev" + "dev-main": "3.x-dev" } }, "autoload": { - "psr-0": { - "Dflydev\\DotAccessData": "src" + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -514,6 +496,11 @@ "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.", @@ -526,33 +513,34 @@ ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/master" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" }, - "time": "2017-01-20T21:14:22+00:00" + "time": "2022-10-27T11:44:00+00:00" }, { "name": "grasmash/expander", - "version": "1.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/grasmash/expander.git", - "reference": "95d6037344a4be1dd5f8e0b0b2571a28c397578f" + "reference": "bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/grasmash/expander/zipball/95d6037344a4be1dd5f8e0b0b2571a28c397578f", - "reference": "95d6037344a4be1dd5f8e0b0b2571a28c397578f", + "url": "https://api.github.com/repos/grasmash/expander/zipball/bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82", + "reference": "bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82", "shasum": "" }, "require": { - "dflydev/dot-access-data": "^1.1.0", - "php": ">=5.4" + "dflydev/dot-access-data": "^3.0.0", + "php": ">=8.0", + "psr/log": "^2 | ^3" }, "require-dev": { "greg-1-anderson/composer-test-scenarios": "^1", - "phpunit/phpunit": "^4|^5.5.4", - "satooshi/php-coveralls": "^1.0.2|dev-master", - "squizlabs/php_codesniffer": "^2.7" + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.3" }, "type": "library", "extra": { @@ -577,27 +565,27 @@ "description": "Expands internal property references in PHP arrays file.", "support": { "issues": "https://github.com/grasmash/expander/issues", - "source": "https://github.com/grasmash/expander/tree/master" + "source": "https://github.com/grasmash/expander/tree/3.0.0" }, - "time": "2017-12-21T22:14:55+00:00" + "time": "2022-05-10T13:14:49+00:00" }, { "name": "league/container", - "version": "3.4.1", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/container.git", - "reference": "84ecbc2dbecc31bd23faf759a0e329ee49abddbd" + "reference": "375d13cb828649599ef5d48a339c4af7a26cd0ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/container/zipball/84ecbc2dbecc31bd23faf759a0e329ee49abddbd", - "reference": "84ecbc2dbecc31bd23faf759a0e329ee49abddbd", + "url": "https://api.github.com/repos/thephpleague/container/zipball/375d13cb828649599ef5d48a339c4af7a26cd0ab", + "reference": "375d13cb828649599ef5d48a339c4af7a26cd0ab", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0", - "psr/container": "^1.0.0" + "php": "^7.2 || ^8.0", + "psr/container": "^1.1 || ^2.0" }, "provide": { "psr/container-implementation": "^1.0" @@ -606,15 +594,19 @@ "orno/di": "~2.0" }, "require-dev": { - "phpunit/phpunit": "^6.0 || ^7.0", + "nette/php-generator": "^3.4", + "nikic/php-parser": "^4.10", + "phpstan/phpstan": "^0.12.47", + "phpunit/phpunit": "^8.5.17", "roave/security-advisories": "dev-latest", "scrutinizer/ocular": "^1.8", - "squizlabs/php_codesniffer": "^3.5" + "squizlabs/php_codesniffer": "^3.6" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev", + "dev-master": "4.x-dev", + "dev-4.x": "4.x-dev", "dev-3.x": "3.x-dev", "dev-2.x": "2.x-dev", "dev-1.x": "1.x-dev" @@ -632,8 +624,7 @@ "authors": [ { "name": "Phil Bennett", - "email": "philipobenito@gmail.com", - "homepage": "http://www.philipobenito.com", + "email": "mail@philbennett.co.uk", "role": "Developer" } ], @@ -650,7 +641,7 @@ ], "support": { "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/3.4.1" + "source": "https://github.com/thephpleague/container/tree/4.2.0" }, "funding": [ { @@ -658,26 +649,187 @@ "type": "github" } ], - "time": "2021-07-09T08:23:52+00:00" + "time": "2021-11-16T10:29:06+00:00" + }, + { + "name": "phootwork/collection", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phootwork/collection.git", + "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phootwork/collection/zipball/46dde20420fba17766c89200bc3ff91d3e58eafa", + "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa", + "shasum": "" + }, + "require": { + "phootwork/lang": "^3.0", + "php": ">=8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "phootwork\\collection\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Gossmann", + "homepage": "http://gos.si" + } + ], + "description": "The phootwork library fills gaps in the php language and provides better solutions than the existing ones php offers.", + "homepage": "https://phootwork.github.io/collection/", + "keywords": [ + "Array object", + "Text object", + "collection", + "collections", + "json", + "list", + "map", + "queue", + "set", + "stack", + "xml" + ], + "support": { + "issues": "https://github.com/phootwork/phootwork/issues", + "source": "https://github.com/phootwork/collection/tree/v3.2.1" + }, + "time": "2022-08-27T12:51:24+00:00" + }, + { + "name": "phootwork/lang", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phootwork/lang.git", + "reference": "f6687cb0e5453ceb7b4a2c4f9fa81273758eedd0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phootwork/lang/zipball/f6687cb0e5453ceb7b4a2c4f9fa81273758eedd0", + "reference": "f6687cb0e5453ceb7b4a2c4f9fa81273758eedd0", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/polyfill-php81": "^1.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "phootwork\\lang\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Gossmann", + "homepage": "http://gos.si" + } + ], + "description": "Missing PHP language constructs", + "homepage": "https://phootwork.github.io/lang/", + "keywords": [ + "array", + "comparator", + "comparison", + "string" + ], + "support": { + "issues": "https://github.com/phootwork/phootwork/issues", + "source": "https://github.com/phootwork/lang/tree/v3.2.1" + }, + "time": "2022-08-27T12:51:24+00:00" + }, + { + "name": "phpowermove/docblock", + "version": "v4.0", + "source": { + "type": "git", + "url": "https://github.com/phpowermove/docblock.git", + "reference": "a73f6e17b7d4e1b92ca5378c248c952c9fae7826" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpowermove/docblock/zipball/a73f6e17b7d4e1b92ca5378c248c952c9fae7826", + "reference": "a73f6e17b7d4e1b92ca5378c248c952c9fae7826", + "shasum": "" + }, + "require": { + "phootwork/collection": "^3.0", + "phootwork/lang": "^3.0", + "php": ">=8.0" + }, + "require-dev": { + "phootwork/php-cs-fixer-config": "^0.4", + "phpunit/phpunit": "^9.0", + "psalm/phar": "^4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "phpowermove\\docblock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Gossmann", + "homepage": "http://gos.si" + } + ], + "description": "PHP Docblock parser and generator. An API to read and write Docblocks.", + "keywords": [ + "docblock", + "generator", + "parser" + ], + "support": { + "issues": "https://github.com/phpowermove/docblock/issues", + "source": "https://github.com/phpowermove/docblock/tree/v4.0" + }, + "time": "2021-09-22T16:57:06+00:00" }, { "name": "psr/container", - "version": "1.1.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -704,9 +856,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/2.0.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", @@ -760,30 +912,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -804,50 +956,49 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { "name": "symfony/console", - "version": "v5.1.11", + "version": "v6.1.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d9a267b621c5082e0a6c659d73633b6fd28a8a08" + "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d9a267b621c5082e0a6c659d73633b6fd28a8a08", - "reference": "d9a267b621c5082e0a6c659d73633b6fd28a8a08", + "url": "https://api.github.com/repos/symfony/console/zipball/a1282bd0c096e0bdb8800b104177e2ce404d8815", + "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" }, "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -880,8 +1031,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v5.1.11" + "source": "https://github.com/symfony/console/tree/v6.1.7" }, "funding": [ { @@ -897,29 +1054,29 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2022-10-26T21:42:49+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.1-dev" }, "thanks": { "name": "symfony/contracts", @@ -948,7 +1105,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" }, "funding": [ { @@ -964,44 +1121,42 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-02-25T11:15:52+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.3.7", + "version": "v6.1.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ce7b20d69c66a20939d8952b617506a44d102130" + "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", - "reference": "ce7b20d69c66a20939d8952b617506a44d102130", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0" + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -1033,7 +1188,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.1.0" }, "funding": [ { @@ -1049,24 +1204,24 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-05-05T16:51:07+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.4.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" + "reference": "02ff5eea2f453731cfbc6bc215e456b781480448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", - "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448", + "reference": "02ff5eea2f453731cfbc6bc215e456b781480448", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, "suggest": { @@ -1075,7 +1230,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.1-dev" }, "thanks": { "name": "symfony/contracts", @@ -1112,7 +1267,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1" }, "funding": [ { @@ -1128,26 +1283,26 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-02-25T11:15:52+00:00" }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v6.1.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "4d216a2beef096edf040a070117c39ca2abce307" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d216a2beef096edf040a070117c39ca2abce307", + "reference": "4d216a2beef096edf040a070117c39ca2abce307", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "type": "library", "autoload": { @@ -1175,7 +1330,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v6.1.5" }, "funding": [ { @@ -1191,25 +1346,27 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2022-09-21T20:29:40+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v6.1.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" }, "type": "library", "autoload": { @@ -1237,7 +1394,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v6.1.3" }, "funding": [ { @@ -1253,32 +1410,35 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-07-29T07:42:06+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1286,12 +1446,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1316,7 +1476,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -1332,20 +1492,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -1357,7 +1517,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1365,12 +1525,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1397,7 +1557,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -1413,20 +1573,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -1438,7 +1598,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1446,12 +1606,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -1481,7 +1641,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -1497,32 +1657,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1530,12 +1693,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1561,7 +1724,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -1577,20 +1740,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "name": "symfony/polyfill-php81", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { @@ -1599,7 +1762,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1607,91 +1770,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, "files": [ "bootstrap.php" ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, - "files": [ - "bootstrap.php" - ], "classmap": [ "Resources/stubs" ] @@ -1701,10 +1785,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -1714,7 +1794,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -1723,7 +1803,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -1739,25 +1819,24 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", - "version": "v5.3.7", + "version": "v6.1.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" + "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", - "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", + "url": "https://api.github.com/repos/symfony/process/zipball/a6506e99cfad7059b1ab5cab395854a0a0c21292", + "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -1785,7 +1864,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.3.7" + "source": "https://github.com/symfony/process/tree/v6.1.3" }, "funding": [ { @@ -1801,25 +1880,28 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-06-27T17:24:16+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", + "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -1827,7 +1909,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.1-dev" }, "thanks": { "name": "symfony/contracts", @@ -1837,7 +1919,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1864,7 +1949,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" }, "funding": [ { @@ -1880,44 +1965,46 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2022-05-30T19:18:58+00:00" }, { "name": "symfony/string", - "version": "v5.3.10", + "version": "v6.1.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", - "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, "files": [ "Resources/functions.php" ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, "exclude-from-classmap": [ "/Tests/" ] @@ -1947,7 +2034,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.10" + "source": "https://github.com/symfony/string/tree/v6.1.7" }, "funding": [ { @@ -1963,32 +2050,31 @@ "type": "tidelift" } ], - "time": "2021-10-27T18:21:46+00:00" + "time": "2022-10-10T09:34:31+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.6", + "version": "v6.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" + "reference": "66c6b0cf52b00f74614a2cf7ae7db08ea1095931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "url": "https://api.github.com/repos/symfony/yaml/zipball/66c6b0cf52b00f74614a2cf7ae7db08ea1095931", + "reference": "66c6b0cf52b00f74614a2cf7ae7db08ea1095931", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" + "php": ">=8.1", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^4.4|^5.0" + "symfony/console": "^5.4|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -2022,7 +2108,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.6" + "source": "https://github.com/symfony/yaml/tree/v6.1.6" }, "funding": [ { @@ -2038,7 +2124,7 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:20:01+00:00" + "time": "2022-10-07T08:04:03+00:00" } ], "packages-dev": [ @@ -2107,66 +2193,86 @@ }, { "name": "codeception/codeception", - "version": "4.1.22", + "version": "5.0.4", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" + "reference": "e3a69881696935c4209a7a45958a3bdd17def56a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", - "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/e3a69881696935c4209a7a45958a3bdd17def56a", + "reference": "e3a69881696935c4209a7a45958a3bdd17def56a", "shasum": "" }, "require": { - "behat/gherkin": "^4.4.0", - "codeception/lib-asserts": "^1.0", - "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1 | ^9.0", - "codeception/stub": "^2.0 | ^3.0", + "behat/gherkin": "^4.6.2", + "codeception/lib-asserts": "2.0.*@dev", + "codeception/stub": "^3.7 | ^4.0", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/psr7": "^1.4 | ^2.0", - "php": ">=5.6.0 <9.0", - "symfony/console": ">=2.7 <6.0", - "symfony/css-selector": ">=2.7 <6.0", - "symfony/event-dispatcher": ">=2.7 <6.0", - "symfony/finder": ">=2.7 <6.0", - "symfony/yaml": ">=2.7 <6.0" + "php": "^8.0", + "phpunit/php-code-coverage": "^9.2", + "phpunit/php-text-template": "^2.0", + "phpunit/php-timer": "^5.0.3", + "phpunit/phpunit": "^9.5", + "psy/psysh": "^0.11.2", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "symfony/console": ">=4.4.24 <7.0", + "symfony/css-selector": ">=4.4.24 <7.0", + "symfony/event-dispatcher": ">=4.4.24 <7.0", + "symfony/finder": ">=4.4.24 <7.0", + "symfony/var-dumper": ">=4.4.24 < 7.0", + "symfony/yaml": ">=4.4.24 <7.0" + }, + "conflict": { + "codeception/lib-innerbrowser": "<3.1", + "codeception/module-filesystem": "<3.0", + "codeception/module-phpbrowser": "<2.5" + }, + "replace": { + "codeception/phpunit-wrapper": "*" }, "require-dev": { - "codeception/module-asserts": "1.*@dev", - "codeception/module-cli": "1.*@dev", - "codeception/module-db": "1.*@dev", - "codeception/module-filesystem": "1.*@dev", - "codeception/module-phpbrowser": "1.*@dev", - "codeception/specify": "~0.3", + "codeception/lib-innerbrowser": "*@dev", + "codeception/lib-web": "^1.0", + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", "codeception/util-universalframework": "*@dev", - "monolog/monolog": "~1.8", - "squizlabs/php_codesniffer": "~2.0", - "symfony/process": ">=2.7 <6.0", - "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0 | ^5.0" + "ext-simplexml": "*", + "symfony/dotenv": ">=4.4.24 <7.0", + "symfony/process": ">=4.4.24 <7.0", + "vlucas/phpdotenv": "^5.1" }, "suggest": { "codeception/specify": "BDD-style code blocks", "codeception/verify": "BDD-style assertions", - "hoa/console": "For interactive console functionality", + "ext-simplexml": "For loading params from XML files", "stecman/symfony-console-completion": "For BASH autocompletion", - "symfony/phpunit-bridge": "For phpunit-bridge support" + "symfony/dotenv": "For loading params from .env files", + "symfony/phpunit-bridge": "For phpunit-bridge support", + "vlucas/phpdotenv": "For loading params from .env files" }, "bin": [ "codecept" ], "type": "library", - "extra": { - "branch-alias": [] - }, "autoload": { + "files": [ + "functions.php" + ], "psr-4": { "Codeception\\": "src/Codeception", "Codeception\\Extension\\": "ext" - } + }, + "classmap": [ + "src/PHPUnit/TestCase.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2175,12 +2281,12 @@ "authors": [ { "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "http://codegyre.com" + "email": "davert.ua@gmail.com", + "homepage": "https://codeception.com" } ], "description": "BDD-style testing framework", - "homepage": "http://codeception.com/", + "homepage": "https://codeception.com/", "keywords": [ "BDD", "TDD", @@ -2190,7 +2296,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.1.22" + "source": "https://github.com/Codeception/Codeception/tree/5.0.4" }, "funding": [ { @@ -2198,26 +2304,26 @@ "type": "open_collective" } ], - "time": "2021-08-06T17:15:34+00:00" + "time": "2022-10-30T19:15:56+00:00" }, { "name": "codeception/lib-asserts", - "version": "1.13.2", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/Codeception/lib-asserts.git", - "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6" + "reference": "78c55044611437988b54e1daecf13f247a742bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/184231d5eab66bc69afd6b9429344d80c67a33b6", - "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/78c55044611437988b54e1daecf13f247a742bf8", + "reference": "78c55044611437988b54e1daecf13f247a742bf8", "shasum": "" }, "require": { - "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3 | ^9.0", + "codeception/phpunit-wrapper": "^7.7.1 | ^8.0.3 | ^9.0", "ext-dom": "*", - "php": ">=5.6.0 <9.0" + "php": "^7.4 | ^8.0" }, "type": "library", "autoload": { @@ -2250,75 +2356,30 @@ ], "support": { "issues": "https://github.com/Codeception/lib-asserts/issues", - "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" - }, - "time": "2020-10-21T16:26:20+00:00" - }, - { - "name": "codeception/phpunit-wrapper", - "version": "9.0.6", - "source": { - "type": "git", - "url": "https://github.com/Codeception/phpunit-wrapper.git", - "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/b0c06abb3181eedca690170f7ed0fd26a70bfacc", - "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "phpunit/phpunit": "^9.0" + "source": "https://github.com/Codeception/lib-asserts/tree/2.0.1" }, - "require-dev": { - "codeception/specify": "*", - "consolidation/robo": "^3.0.0-alpha3", - "vlucas/phpdotenv": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Codeception\\PHPUnit\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Davert", - "email": "davert.php@resend.cc" - }, - { - "name": "Naktibalda" - } - ], - "description": "PHPUnit classes used by Codeception", - "support": { - "issues": "https://github.com/Codeception/phpunit-wrapper/issues", - "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.6" - }, - "time": "2020-12-28T13:59:47+00:00" + "time": "2022-09-27T06:17:39+00:00" }, { "name": "codeception/stub", - "version": "3.7.0", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "468dd5fe659f131fc997f5196aad87512f9b1304" + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/468dd5fe659f131fc997f5196aad87512f9b1304", - "reference": "468dd5fe659f131fc997f5196aad87512f9b1304", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/18a148dacd293fc7b044042f5aa63a82b08bff5d", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d", "shasum": "" }, "require": { - "phpunit/phpunit": "^8.4 | ^9.0" + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" + }, + "require-dev": { + "consolidation/robo": "^3.0" }, "type": "library", "autoload": { @@ -2333,171 +2394,36 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/3.7.0" - }, - "time": "2020-07-03T15:54:43+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-07-31T17:03:58+00:00" - }, - { - "name": "doctrine/annotations", - "version": "1.13.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.2" + "source": "https://github.com/Codeception/Stub/tree/4.0.2" }, - "time": "2021-08-05T19:00:23+00:00" + "time": "2022-01-31T19:25:15+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^9", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -2524,7 +2450,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" }, "funding": [ { @@ -2540,372 +2466,88 @@ "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" + "time": "2022-03-03T08:28:38+00:00" }, { - "name": "doctrine/lexer", - "version": "1.2.1", + "name": "myclabs/deep-copy", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "description": "Create deep copies (clones) of your objects", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "clone", + "copy", + "duplicate", + "object", + "object graph" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", "type": "tidelift" } ], - "time": "2020-05-25T17:44:05+00:00" - }, - { - "name": "friendsofphp/php-cs-fixer", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "13ae36a76b6e329e44ca3cafaa784ea02db9ff14" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/13ae36a76b6e329e44ca3cafaa784ea02db9ff14", - "reference": "13ae36a76b6e329e44ca3cafaa784ea02db9ff14", - "shasum": "" - }, - "require": { - "composer/semver": "^3.2", - "composer/xdebug-handler": "^2.0", - "doctrine/annotations": "^1.12", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^7.2 || ^8.0", - "php-cs-fixer/diff": "^2.0", - "symfony/console": "^4.4.20 || ^5.1.3", - "symfony/event-dispatcher": "^4.4.20 || ^5.0", - "symfony/filesystem": "^4.4.20 || ^5.0", - "symfony/finder": "^4.4.20 || ^5.0", - "symfony/options-resolver": "^4.4.20 || ^5.0", - "symfony/polyfill-php72": "^1.23", - "symfony/polyfill-php80": "^1.23", - "symfony/polyfill-php81": "^1.23", - "symfony/process": "^4.4.20 || ^5.0", - "symfony/stopwatch": "^4.4.20 || ^5.0" - }, - "require-dev": { - "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^1.5", - "mikey179/vfsstream": "^1.6.8", - "php-coveralls/php-coveralls": "^2.4.3", - "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.10.3", - "phpspec/prophecy-phpunit": "^1.1 || ^2.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5", - "phpunitgoodpractices/polyfill": "^1.5", - "phpunitgoodpractices/traits": "^1.9.1", - "symfony/phpunit-bridge": "^5.2.4", - "symfony/yaml": "^4.4.20 || ^5.0" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters.", - "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." - }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", - "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - } - ], - "description": "A tool to automatically fix PHP code style", - "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.2.1" - }, - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "time": "2021-10-05T08:12:17+00:00" + "time": "2022-03-03T13:19:32+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "2.1.0", + "name": "n98/junit-xml", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" + "url": "https://github.com/cmuench/junit-xml.git", + "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/0017dd92ac8cb619f02e32f4cffd768cfe327c73", + "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73", "shasum": "" }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.8 || ^9.3.10" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + "phpunit/phpunit": "^9.5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.1.0" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2021-10-06T17:43:30+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.2", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2020-11-13T09:40:50+00:00" - }, - { - "name": "n98/junit-xml", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/cmuench/junit-xml.git", - "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/0017dd92ac8cb619f02e32f4cffd768cfe327c73", - "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": "^9.5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "N98\\JUnitXml\\": "src/N98/JUnitXml" + "N98\\JUnitXml\\": "src/N98/JUnitXml" } }, "notification-url": "https://packagist.org/downloads/", @@ -2918,389 +2560,113 @@ "email": "c.muench@netz98.de" } ], - "description": "JUnit XML Document generation library", - "support": { - "issues": "https://github.com/cmuench/junit-xml/issues", - "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" - }, - "time": "2020-12-25T09:08:58+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.13.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "50953a2691a922aa1769461637869a0a2faa3f53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", - "reference": "50953a2691a922aa1769461637869a0a2faa3f53", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" - }, - "time": "2021-09-20T12:20:58+00:00" - }, - { - "name": "overtrue/phplint", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/overtrue/phplint.git", - "reference": "2d68ee8ab9083041a297cb6897ccec6290814c88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/overtrue/phplint/zipball/2d68ee8ab9083041a297cb6897ccec6290814c88", - "reference": "2d68ee8ab9083041a297cb6897ccec6290814c88", - "shasum": "" - }, - "require": { - "ext-json": "*", - "n98/junit-xml": "1.1.0", - "php": ">=5.5.9", - "symfony/console": "^3.2|^4.0|^5.0", - "symfony/finder": "^3.0|^4.0|^5.0", - "symfony/process": "^3.3|^4.0|^5.0", - "symfony/yaml": "^3.0|^4.0|^5.0" - }, - "require-dev": { - "brainmaestro/composer-git-hooks": "^2.7", - "friendsofphp/php-cs-fixer": "^2.16", - "jakub-onderka/php-console-highlighter": "^0.3.2 || ^0.4" - }, - "bin": [ - "bin/phplint" - ], - "type": "library", - "extra": { - "hooks": { - "pre-commit": [ - "composer fix-style" - ], - "pre-push": [ - "composer check-style" - ] - } - }, - "autoload": { - "psr-4": { - "Overtrue\\PHPLint\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "overtrue", - "email": "anzhengchao@gmail.com" - } - ], - "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.", - "keywords": [ - "check", - "lint", - "phplint", - "syntax" - ], - "support": { - "issues": "https://github.com/overtrue/phplint/issues", - "source": "https://github.com/overtrue/phplint/tree/3.0.0" - }, - "time": "2021-06-02T13:27:41+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" - }, - "time": "2021-02-23T14:00:09+00:00" - }, - { - "name": "php-cs-fixer/diff", - "version": "v2.0.2", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3", - "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", - "symfony/process": "^3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "sebastian/diff v3 backport support for PHP 5.6+", - "homepage": "https://github.com/PHP-CS-Fixer", - "keywords": [ - "diff" - ], + "description": "JUnit XML Document generation library", "support": { - "issues": "https://github.com/PHP-CS-Fixer/diff/issues", - "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" + "issues": "https://github.com/cmuench/junit-xml/issues", + "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" }, - "time": "2020-10-14T08:32:19+00:00" + "time": "2020-12-25T09:08:58+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", + "name": "nikic/php-parser", + "version": "v4.15.2", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", "extra": { "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-master": "4.9-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src/" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "Nikita Popov" } ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", + "description": "A PHP parser written in PHP", "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" + "parser", + "php" ], "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" }, - "time": "2020-06-27T09:03:43+00:00" + "time": "2022-11-12T15:38:23+00:00" }, { - "name": "phpdocumentor/reflection-docblock", + "name": "overtrue/phplint", "version": "5.3.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "url": "https://github.com/overtrue/phplint.git", + "reference": "42ddcab45454e0cf3f1522340fc22f3875c4c74f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/overtrue/phplint/zipball/42ddcab45454e0cf3f1522340fc22f3875c4c74f", + "reference": "42ddcab45454e0cf3f1522340fc22f3875c4c74f", "shasum": "" }, "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" + "ext-json": "*", + "n98/junit-xml": "1.1.0", + "php": "^8.1", + "symfony/console": "^5.0 || ^6.0", + "symfony/finder": "^6.0", + "symfony/process": "^6.0", + "symfony/yaml": "^6.0" }, "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "bamarni/composer-bin-plugin": "^1.4", + "brainmaestro/composer-git-hooks": "^2.8.5", + "friendsofphp/php-cs-fixer": "^3.4.0", + "jakub-onderka/php-console-highlighter": "^0.4", + "jetbrains/phpstorm-stubs": "^2021.3 || ^2022.0" }, + "bin": [ + "bin/phplint" + ], "type": "library", "extra": { - "branch-alias": { - "dev-master": "5.x-dev" + "hooks": { + "pre-commit": [ + "composer fix-style" + ] } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "Overtrue\\PHPLint\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3309,157 +2675,159 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "name": "overtrue", + "email": "anzhengchao@gmail.com" } ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.", + "keywords": [ + "check", + "lint", + "phplint", + "syntax" + ], "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + "issues": "https://github.com/overtrue/phplint/issues", + "source": "https://github.com/overtrue/phplint/tree/5.3.0" }, - "time": "2021-10-19T17:43:47+00:00" + "funding": [ + { + "url": "https://github.com/overtrue", + "type": "github" + } + ], + "time": "2022-07-12T07:42:45+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "1.5.1", + "name": "phar-io/manifest", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "time": "2021-10-02T14:08:47+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { - "name": "phpspec/prophecy", - "version": "1.14.0", + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "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" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" + "php": "^7.2 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2021-09-10T09:02:12+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.8", + "version": "9.2.18", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "cf04e88a2e3c56fc1a65488afd493325b4c1bc3e" + "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cf04e88a2e3c56fc1a65488afd493325b4c1bc3e", - "reference": "cf04e88a2e3c56fc1a65488afd493325b4c1bc3e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a", + "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a", "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", @@ -3508,7 +2876,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.8" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18" }, "funding": [ { @@ -3516,20 +2884,20 @@ "type": "github" } ], - "time": "2021-10-30T08:01:38+00:00" + "time": "2022-10-27T13:35:33+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { @@ -3568,7 +2936,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -3576,7 +2944,7 @@ "type": "github" } ], - "time": "2020-09-28T05:57:25+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", @@ -3761,16 +3129,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.10", + "version": "9.5.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", "shasum": "" }, "require": { @@ -3785,28 +3153,23 @@ "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.7", + "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "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": "^2.3.4", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -3821,11 +3184,11 @@ } }, "autoload": { - "classmap": [ - "src/" - ], "files": [ "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3848,203 +3211,74 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" }, "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2021-09-25T07:38:51+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" - }, - "time": "2019-04-30T12:38:16+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + }, { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" + ], + "time": "2022-10-28T06:00:21+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "psy/psysh", + "version": "v0.11.9", "source": { "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" + "url": "https://github.com/bobthecow/psysh.git", + "reference": "1acec99d6684a54ff92f8b548a4e41b566963778" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1acec99d6684a54ff92f8b548a4e41b566963778", + "reference": "1acec99d6684a54ff92f8b548a4e41b566963778", "shasum": "" }, "require": { - "php": ">=5.6" + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^4.0 || ^3.1", + "php": "^8.0 || ^7.0.8", + "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." }, + "bin": [ + "bin/psysh" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.11.x-dev" + } + }, "autoload": { "files": [ - "src/getallheaders.php" - ] + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4052,16 +3286,24 @@ ], "authors": [ { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" } ], - "description": "A polyfill for getallheaders.", + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.11.9" }, - "time": "2019-03-08T08:55:37+00:00" + "time": "2022-11-06T15:29:46+00:00" }, { "name": "roave/security-advisories", @@ -4069,53 +3311,81 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "0488e161600117fc3a0d72397dad154729002f54" + "reference": "5317244268eb40e418f1cf8afa6d1d9df4e1f4a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/0488e161600117fc3a0d72397dad154729002f54", - "reference": "0488e161600117fc3a0d72397dad154729002f54", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5317244268eb40e418f1cf8afa6d1d9df4e1f4a3", + "reference": "5317244268eb40e418f1cf8afa6d1d9df4e1f4a3", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", - "adodb/adodb-php": "<5.20.12", + "admidio/admidio": "<4.1.9", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "aheinze/cockpit": "<=2.2.1", "akaunting/akaunting": "<2.1.13", + "alextselegidis/easyappointments": "<=1.4.3", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", + "apereo/phpcas": "<1.6", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "appwrite/server-ce": "<0.11.1|>=0.12,<0.12.2", + "area17/twill": "<1.2.5|>=2,<2.5.3", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "awesome-support/awesome-support": "<=6.0.7", "aws/aws-sdk-php": ">=3,<3.2.1", + "badaso/core": "<2.6.1", "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": "<=4.5", + "barryvdh/laravel-translation-manager": "<0.6.2", + "baserproject/basercms": "<4.5.4", "billz/raspap-webgui": "<=2.6.6", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bmarshall511/wordpress_zero_spam": "<5.2.13", "bolt/bolt": "<3.7.2", - "bolt/core": "<4.1.13", + "bolt/core": "<=4.2", + "bottelet/flarepoint": "<2.2.1", "brightlocal/phpwhois": "<=4.2.5", - "buddypress/buddypress": "<5.1.2", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "bytefury/crater": "<6.0.2", "cachethq/cachet": "<2.5.1", - "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.6", + "cardgate/magento2": "<2.0.33", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", - "centreon/centreon": "<20.10.7", + "catfan/medoo": "<1.7.5", + "centreon/centreon": "<22.10-beta.1", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", + "codeigniter4/framework": "<4.2.7", + "codeigniter4/shield": "= 1.0.0-beta", "codiad/codiad": "<=2.8.4", - "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", + "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5", + "concrete5/concrete5": "<9", + "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", + "contao/core-bundle": "<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", - "craftcms/cms": "<3.6.7", + "contao/managed-edition": "<=1.5", + "craftcms/cms": "<3.7.55.2|>= 4.0.0-RC1, < 4.2.1", "croogo/croogo": "<3.0.7", + "cuyz/valinor": "<0.12", + "czproject/git-php": "<4.0.3", + "darylldoyle/safe-svg": "<1.9.10", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", @@ -4123,132 +3393,193 @@ "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", "doctrine/doctrine-bundle": "<1.5.2", "doctrine/doctrine-module": "<=0.7.1", "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<14|>= 3.3.beta1, < 13.0.2", - "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "dolibarr/dolibarr": "<16|= 12.0.5|>= 3.3.beta1, < 13.0.2", + "dompdf/dompdf": "<2.0.1", + "drupal/core": ">=7,<7.91|>=8,<9.3.19|>=9.4,<9.4.3", "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "elefant/cms": "<1.3.13", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", "endroid/qr-code-bundle": "<3.4.2", - "enshrined/svg-sanitize": "<0.13.1", + "enshrined/svg-sanitize": "<0.15", "erusev/parsedown": "<1.7.2", "ether/logs": "<3.0.4", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "= 3.0.0|<2.2.3", "ezsystems/demobundle": ">=5.4,<5.4.6.1", "ezsystems/ez-support-tools": ">=2.2,<2.2.3", "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", + "ezsystems/ezplatform-graphql": ">=1-rc.1,<1.0.13|>=2-beta.1,<2.3.12", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<1.3.26", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<=2.3.7", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.30", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", - "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1|>=2.5,<2.5.15", "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2022.8", "feehi/cms": "<=2.1.1", - "feehi/feehicms": "<=0.1.3", + "feehi/feehicms": "<=2.0.1.1", + "fenom/fenom": "<=2.12.1", + "filegator/filegator": "<7.8", "firebase/php-jwt": "<2", "flarum/core": ">=1,<=1.0.1", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3-beta.2,<1.1.7", + "fof/upload": "<1.2.3", "fooman/tcpdf": "<6.2.22", - "forkcms/forkcms": "<=5.9.2", + "forkcms/forkcms": "<5.11.1", "fossar/tcpdf-parser": "<6.2.22", - "francoisjacquet/rosariosis": "<6.5.1", + "francoisjacquet/rosariosis": "<10.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", + "froxlor/froxlor": "<0.10.39", "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7.21", - "getkirby/cms": "<=3.5.6", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "getgrav/grav": "<1.7.34", + "getkirby/cms": "= 3.8.0|<3.5.8.2|>=3.6,<3.6.6.2|>=3.7,<3.7.5.1", "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", "gilacms/gila": "<=1.11.4", + "globalpayments/php-sdk": "<2", + "google/protobuf": "<3.15", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<5.6.1", - "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", - "helloxz/imgurl": "<=2.31", + "grumpydictator/firefly-iii": "<5.6.5", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/psr7": "<1.8.4|>=2,<2.1.1", + "helloxz/imgurl": "= 2.31|<=2.31", + "hillelcoren/invoice-ninja": "<5.3.35", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/admin-ui": ">=4.2,<4.2.3", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", "ibexa/post-install": "<=1.0.4", - "icecoder/icecoder": "<=8", + "icecoder/icecoder": "<=8.1", + "idno/known": "<=1.3.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.26|>=7,<8.40", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": ">=7,<7.1.2", - "impresscms/impresscms": "<=1.4.2", - "in2code/femanager": "<5.5.1|>=6,<6.3.1", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "impresscms/impresscms": "<=1.4.3", + "in2code/femanager": "<5.5.2|>=6,<6.3.3|>=7,<7.0.1", + "in2code/lux": "<17.6.1|>=18,<24.0.2", "intelliants/subrion": "<=4.2.1", + "islandora/islandora": ">=2,<2.4.1", "ivankristianto/phpwhois": "<=4.3", - "james-heinrich/getid3": "<1.9.9", - "joomla/archive": "<1.1.10", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<1.4.4|>=2,<2.0.1", + "joomla/input": ">=2,<2.0.2", "joomla/session": "<1.3.1", + "joyqi/hyper-down": "<=2.4.27", + "jsdecena/laracom": "<2.0.9", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", + "kevinpapst/kimai2": "<1.16.7", "kitodo/presentation": "<3.1.2", "klaviyo/magento2-extension": ">=1,<3", + "krayin/laravel-crm": "<1.2.2", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-diactoros": "<2.11.1", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", "laminas/laminas-http": "<2.14.2", - "laravel/framework": "<6.20.26|>=7,<8.40", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "latte/latte": "<2.10.8", "lavalite/cms": "<=5.8", "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<0.18.3", "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", - "librenms/librenms": "<21.1", + "librenms/librenms": "<=22.8", + "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", "livewire/livewire": ">2.2.4,<2.2.6", "lms/routes": "<2.1.1", "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luyadev/yii-helpers": "<1.2.1", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<4|= 2.13.1", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<4.3|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "melisplatform/melis-asset-manager": "<5.0.1", + "melisplatform/melis-cms": "<5.0.1", + "melisplatform/melis-front": "<5.0.1", + "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", + "microweber/microweber": "<=1.3.1", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", + "modx/revolution": "<= 2.8.3-pl|<2.8", + "mojo42/jirafeau": "<4.4", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", + "moodle/moodle": "<4.0.1", + "mustache/mustache": ">=2,<2.14.1", "namshi/jose": "<2.2", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.4", "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", - "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nilsteampassnet/teampass": "<=2.1.27.36", - "nukeviet/nukeviet": "<4.3.4", - "nystudio107/craft-seomatic": "<3.3", + "notrinos/notrinos-erp": "<=0.7", + "noumo/easyii": "<=0.9", + "nukeviet/nukeviet": "<4.5.2", + "nystudio107/craft-seomatic": "<3.4.12", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", - "october/october": ">=1.0.319,<1.0.466", + "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12", "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<1.0.472|>=1.1.1,<1.1.5", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", - "opencart/opencart": "<=3.0.3.2", + "open-web-analytics/open-web-analytics": "<1.7.4", + "opencart/opencart": "<=3.0.3.7", "openid/php-openid": "<2.3", "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", - "oro/crm": ">=1.7,<1.7.4", - "oro/platform": ">=1.7,<1.7.4", + "oro/commerce": ">=4.1,<5.0.6", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", + "packbackbooks/lti-1-3-php-library": "<5", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", "pagekit/pagekit": "<=1.0.18", @@ -4256,55 +3587,76 @@ "passbolt/passbolt_api": "<2.11", "paypal/merchant-sdk-php": "<3.12", "pear/archive_tar": "<1.4.14", + "pear/crypt_gpg": "<1.6.7", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", - "phpoffice/phpexcel": "<1.8.2", + "phpmyadmin/phpmyadmin": "<5.1.3", + "phpmyfaq/phpmyfaq": "<=3.1.7", + "phpoffice/phpexcel": "<1.8", "phpoffice/phpspreadsheet": "<1.16", "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpservermon/phpservermon": "<=3.5.2", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<10.1.3", - "pocketmine/pocketmine-mp": "<3.15.4", + "pimcore/data-hub": "<1.2.4", + "pimcore/pimcore": "<10.5.9", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": "<4.7.2|>= 4.0.0-BETA5, < 4.4.2", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", - "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/blockwishlist": ">=2,<2.1.1", + "prestashop/contactform": ">=1.0.1,<4.3", "prestashop/gamification": "<2.3.2", - "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/prestashop": ">=1.6.0.10,<1.7.8.7", + "prestashop/productcomments": "<5.0.2", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", - "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4", + "processwire/processwire": "<=3.0.200", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", + "pterodactyl/panel": "<1.7", + "ptrofimov/beanstalk_console": "<1.7.14", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", + "rankmath/seo-by-rank-math": "<=1.0.95", + "react/http": ">=0.7,<1.7", + "remdex/livehelperchat": "<3.99", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", + "rudloff/alltube": "<3.0.3", + "s-cart/core": "<6.9", + "s-cart/s-cart": "<6.9", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.4.3", - "shopware/platform": "<=6.4.3", + "shopware/core": "<=6.4.9", + "shopware/platform": "<=6.4.9", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<5.6.10", - "showdoc/showdoc": "<=2.9.8", - "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", - "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "shopware/shopware": "<=5.7.14", + "shopware/storefront": "<=6.4.8.1", + "shopxo/shopxo": "<2.2.6", + "showdoc/showdoc": "<2.10.4", + "silverstripe/admin": ">=1,<1.8.1", + "silverstripe/assets": ">=1,<1.10.1", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.7.4", - "silverstripe/graphql": "<=3.5|>=4-alpha.1,<4-alpha.2", + "silverstripe/framework": "<4.10.9", + "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2|= 4.0.0-alpha1", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", "silverstripe/subsites": ">=2,<2.1.1", "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", "silverstripe/userforms": "<3", @@ -4314,22 +3666,26 @@ "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", - "smarty/smarty": "<3.1.39", + "smarty/smarty": "<3.1.47|>=4,<4.2.1", + "snipe/snipe-it": "<6.0.11|>= 6.0.0-RC-1, <= 6.0.0-RC-5", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", + "spipu/html2pdf": "<5.2.4", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<0.29.2", + "ssddanbrown/bookstack": "<22.2.3", + "statamic/cms": "<3.2.39|>=3.3,<3.3.2", "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.59", "subrion/cms": "<=4.2.1", - "sulu/sulu": "<1.6.41|>=2,<2.0.10|>=2.1,<2.1.1", + "sulu/sulu": "= 2.4.0-RC1|<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5", + "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", @@ -4338,9 +3694,9 @@ "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3|= 6.0.3|= 5.4.3|= 5.3.14", "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5|>=5.2,<5.3.12", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", "symfony/mime": ">=4.3,<4.3.8", @@ -4350,13 +3706,13 @@ "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", - "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11|>=5.3,<5.3.12", "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.35|>=5,<5.3.12|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -4364,36 +3720,54 @@ "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", "t3/dce": ">=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", + "tastyigniter/tastyigniter": "<3.3", "tecnickcom/tcpdf": "<6.2.22", + "terminal42/contao-tablelookupwizard": "<3.3.5", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<=5.1.7", + "thorsten/phpmyfaq": "<3.1.8", + "tinymce/tinymce": "<5.10", "titon/framework": ">=0,<9.9.99", + "tobiasbg/tablepress": "<= 2.0-RC1", + "topthink/framework": "<=6.0.13", "topthink/think": "<=6.0.9", "topthink/thinkphp": "<=3.2.3", - "tribalsystems/zenario": "<8.8.53370", + "tribalsystems/zenario": "<9.2.55826", "truckersmp/phpwhois": "<=4.3.1", - "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", + "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.32|>=11,<11.5.16", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<7.6.58|>=8,<8.7.48|>=9,<9.5.37|>=10,<10.4.32|>=11,<11.5.16", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": ">=1,<1.0.7|>=2,<2.0.16", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", + "unisharp/laravel-filemanager": "<=2.5.1", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", - "vrana/adminer": "<4.7.9", + "vrana/adminer": "<4.8.1", "wallabag/tcpdf": "<6.2.22", + "wanglelecc/laracms": "<=1.0.3", "web-auth/webauthn-framework": ">=3.3,<3.3.4", "webcoast/deferred-image-processing": "<1.0.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", + "wintercms/winter": "<1.0.475|>=1.1,<1.1.10|>=1.2,<1.2.1", + "woocommerce/woocommerce": "<6.6", "wp-cli/wp-cli": "<2.5", + "wp-graphql/wp-graphql": "<0.3.5", + "wpanel/wpanel4-cms": "<=4.3.1", + "wwbn/avideo": "<=11.6", + "yeswiki/yeswiki": "<4.1", + "yetiforce/yetiforce-crm": "<=6.4", "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", @@ -4412,10 +3786,10 @@ "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", - "zendframework/zend-diactoros": ">=1,<1.8.4", - "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-http": "<2.8.1", "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", @@ -4467,7 +3841,7 @@ "type": "tidelift" } ], - "time": "2021-09-30T18:03:50+00:00" + "time": "2022-11-11T00:18:57+00:00" }, { "name": "sebastian/cli-parser", @@ -4638,16 +4012,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://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -4700,7 +4074,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": [ { @@ -4708,7 +4082,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -4835,16 +4209,16 @@ }, { "name": "sebastian/environment", - "version": "5.1.3", + "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", "shasum": "" }, "require": { @@ -4886,7 +4260,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" }, "funding": [ { @@ -4894,20 +4268,20 @@ "type": "github" } ], - "time": "2020-09-28T05:52:38+00:00" + "time": "2022-04-03T09:37:03+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.3", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -4956,14 +4330,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -4971,20 +4345,20 @@ "type": "github" } ], - "time": "2020-09-28T05:24:23+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.3", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { @@ -5027,7 +4401,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { @@ -5035,7 +4409,7 @@ "type": "github" } ], - "time": "2021-06-11T13:31:12+00:00" + "time": "2022-02-14T08:28:10+00:00" }, { "name": "sebastian/lines-of-code", @@ -5326,28 +4700,28 @@ }, { "name": "sebastian/type", - "version": "2.3.4", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -5370,7 +4744,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" }, "funding": [ { @@ -5378,7 +4752,7 @@ "type": "github" } ], - "time": "2021-06-15T12:49:02+00:00" + "time": "2022-09-12T14:47:03+00:00" }, { "name": "sebastian/version", @@ -5435,16 +4809,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.1", + "version": "3.7.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", - "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", "shasum": "" }, "require": { @@ -5487,25 +4861,24 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-10-11T04:00:11+00:00" + "time": "2022-06-18T07:21:10+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.4", + "version": "v6.1.3", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/0dd5e36b80e1de97f8f74ed7023ac2b837a36443", + "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -5537,76 +4910,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-21T12:38:00+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4b78e55b179003a42523a362cc0e8327f7a69b5e", - "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.7" + "source": "https://github.com/symfony/css-selector/tree/v6.1.3" }, "funding": [ { @@ -5622,185 +4926,52 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-06-27T17:24:16+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.23.0", + "name": "symfony/var-dumper", + "version": "v6.1.6", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0f0adde127f24548e23cbde83bcaeadc491c551f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0f0adde127f24548e23cbde83bcaeadc491c551f", + "reference": "0f0adde127f24548e23cbde83bcaeadc491c551f", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<5.4" }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } + "bin": [ + "Resources/bin/var-dump-server" ], - "time": "2021-05-27T09:17:38+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "e66119f3de95efc359483f810c4c3e6436279436" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", - "reference": "e66119f3de95efc359483f810c4c3e6436279436", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, "files": [ - "bootstrap.php" + "Resources/functions/dump.php" ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-21T13:25:03+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v5.3.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" - }, - "type": "library", - "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Component\\VarDumper\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5812,18 +4983,22 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" + "source": "https://github.com/symfony/var-dumper/tree/v6.1.6" }, "funding": [ { @@ -5839,7 +5014,7 @@ "type": "tidelift" } ], - "time": "2021-07-10T08:58:57+00:00" + "time": "2022-10-07T08:04:03+00:00" }, { "name": "theseer/tokenizer", @@ -5890,64 +5065,6 @@ } ], "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" } ], "aliases": [], @@ -5958,14 +5075,14 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.4 | ^8.0", + "php": "^8.1", "ext-dom": "*", "ext-libxml": "*", "ext-json": "*" }, "platform-dev": [], "platform-overrides": { - "php": "7.4.0" + "php": "8.1.12" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.3.0" } diff --git a/src/Exception/KeyNotFoundException.php b/src/Exception/KeyNotFoundException.php index 2e1a000..2c59765 100644 --- a/src/Exception/KeyNotFoundException.php +++ b/src/Exception/KeyNotFoundException.php @@ -8,5 +8,4 @@ class KeyNotFoundException extends Exception { - } diff --git a/src/Splitter/TestsSplitter.php b/src/Splitter/TestsSplitter.php index 83a186b..1029afc 100644 --- a/src/Splitter/TestsSplitter.php +++ b/src/Splitter/TestsSplitter.php @@ -204,8 +204,6 @@ protected function claimCodeceptionLoaded(): void 'This task requires Codeception to be loaded. Please require autoload.php of Codeception' ); } - // autoload PHPUnit files - \Codeception\PHPUnit\Init::init(); try { // load Codeception config to set base directory diff --git a/tests/Extension/TimeReporterTest.php b/tests/Extension/TimeReporterTest.php index afdc7ee..7a30f73 100644 --- a/tests/Extension/TimeReporterTest.php +++ b/tests/Extension/TimeReporterTest.php @@ -23,17 +23,17 @@ final class TimeReporterTest extends TestCase public function testAfterAndEndRun() { $eventTests = [ - ['testName' => 'tests/acceptance/bar/baz.php:testA', 'time' => 10,], - ['testName' => 'tests/acceptance/bar/baz.php:testA', 'time' => 50,], // rerun - ['testName' => 'tests/acceptance/bar/baz.php:testB', 'time' => 100,], - ['testName' => 'tests/acceptance/bar/baz.php:testC', 'time' => 50,], - ['testName' => 'tests/acceptance/bar/baz.php:testD', 'time' => 33,], - ['testName' => 'tests/acceptance/bar/baz.php:testD', 'time' => 50,], // rerun - ['testName' => 'tests/acceptance/bar/baz.php:testE', 'time' => 66,], - ['testName' => 'tests/acceptance/bar/baz.php:testF', 'time' => 90,], - ['testName' => 'tests/acceptance/bar/baz.php:testG', 'time' => 100,], - ['testName' => 'tests/acceptance/bar/baz.php:testG', 'time' => 13,], //rerun - ['testName' => 'tests/acceptance/bar/baz.php:testH', 'time' => 50,], + ['testName' => 'tests/acceptance/bar/baz.php:testA', 'time' => 10.0,], + ['testName' => 'tests/acceptance/bar/baz.php:testA', 'time' => 50.0,], // rerun + ['testName' => 'tests/acceptance/bar/baz.php:testB', 'time' => 100.0,], + ['testName' => 'tests/acceptance/bar/baz.php:testC', 'time' => 50.0,], + ['testName' => 'tests/acceptance/bar/baz.php:testD', 'time' => 33.0,], + ['testName' => 'tests/acceptance/bar/baz.php:testD', 'time' => 50.0,], // rerun + ['testName' => 'tests/acceptance/bar/baz.php:testE', 'time' => 66.0,], + ['testName' => 'tests/acceptance/bar/baz.php:testF', 'time' => 90.0,], + ['testName' => 'tests/acceptance/bar/baz.php:testG', 'time' => 100.0,], + ['testName' => 'tests/acceptance/bar/baz.php:testG', 'time' => 13.0,], //rerun + ['testName' => 'tests/acceptance/bar/baz.php:testH', 'time' => 50.0,], ]; $expected = [ From 7331c4dad90401fa30840082226ad59a39c6a4d4 Mon Sep 17 00:00:00 2001 From: vansari Date: Sun, 13 Nov 2022 16:55:36 +0100 Subject: [PATCH 49/52] Fixing php.yml --- .github/workflows/php.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 64ce6da..0a22667 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -2,9 +2,9 @@ name: Unit Tests on: push: - branches: [ master ] + branches: [ "3.0" ] pull_request: - branches: [ master ] + branches: [ "3.0" ] jobs: test: @@ -12,7 +12,7 @@ jobs: strategy: matrix: operating-system: ['ubuntu-latest'] - php-versions: ['7.4', '8.0', '8.1'] + php-versions: [ '8.1' ] phpunit-versions: ['latest'] steps: - name: Checkout From e35b32fbc49264d02a139a5a793a6fd3567ef61a Mon Sep 17 00:00:00 2001 From: Caroline BUZENET Date: Tue, 15 Nov 2022 16:11:27 +0100 Subject: [PATCH 50/52] Remove not allowed addFilter method on taskSplitTestFilesByGroups example --- src/Splitter/TestFileSplitterTask.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Splitter/TestFileSplitterTask.php b/src/Splitter/TestFileSplitterTask.php index d1d4b0e..c0b318b 100644 --- a/src/Splitter/TestFileSplitterTask.php +++ b/src/Splitter/TestFileSplitterTask.php @@ -20,8 +20,6 @@ * ->testsFrom('tests/unit/Acme') * ->codeceptionRoot('projects/tested') * ->groupsTo('tests/_log/paratest_') - * ->addFilter(new Filter1()) - * ->addFilter(new Filter2()) * ->run(); * ``` * From 626c2da39172de9cfb44306f773171cda08d581c Mon Sep 17 00:00:00 2001 From: vansari Date: Sat, 17 Dec 2022 20:18:31 +0100 Subject: [PATCH 51/52] Using Makefile and Docker for a better Test Feeling --- Makefile | 31 +++++++++++++++++++++++++++++++ docker/Dockerfile | 13 +++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 Makefile create mode 100644 docker/Dockerfile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6efb163 --- /dev/null +++ b/Makefile @@ -0,0 +1,31 @@ +.DEFAULT_GOAL := help + +mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) +current_dir := $(dir $(mkfile_path)) + +help: + @echo "Use this makefile to execute your tests in correct php version" + @echo "\tr.php-7.4\t\trun Tests with PHP 7.4" + @echo "\tr.php-8.0\t\trun Tests with PHP 8.0" + @echo "\tr.php-8.1\t\trun Tests with PHP 8.1" + @echo "\tr.php-8.2\t\trun Tests with PHP 8.2" + +r.php-7.4: + docker build -t robo:php-7.4 --target PHP74 --build-arg PHP_VERSION=7.4 docker + docker run --rm -v $(current_dir):/app -w /app robo:php-7.4 composer install + docker run --rm -v $(current_dir):/app -w /app robo:php-7.4 composer test + +r.php-8.0: + docker build -t robo:php-8.0 --target PHP8 --build-arg PHP_VERSION=8.0 docker + docker run --rm -v $(current_dir):/app -w /app robo:php-8.0 composer install + docker run --rm -v $(current_dir):/app -w /app robo:php-8.0 composer test + +r.php-8.1: + docker build -t robo:php-8.1 --target PHP8 --build-arg PHP_VERSION=8.1 docker + docker run --rm -v $(current_dir):/app -w /app robo:php-8.1 composer install + docker run --rm -v $(current_dir):/app -w /app robo:php-8.1 composer test + +r.php-8.2: + docker build -t robo:php-8.2 --target PHP8 --build-arg PHP_VERSION=8.2 docker + docker run --rm -v $(current_dir):/app -w /app robo:php-8.2 composer install + docker run --rm -v $(current_dir):/app -w /app robo:php-8.2 composer test \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..073ad7b --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,13 @@ +ARG PHP_VERSION=7.4 +FROM php:${PHP_VERSION}-cli as base +COPY --from=composer /usr/bin/composer /usr/bin/composer + +RUN apt update \ + && apt upgrade -y \ + && apt install -y apt-utils libxml2-dev libzip-dev + +FROM base as PHP74 +RUN docker-php-ext-install dom json xml zip + +FROM base as PHP8 +RUN docker-php-ext-install dom xml zip \ No newline at end of file From d91d2bf55da2a05bb6373bb7e728d2f2716e8c52 Mon Sep 17 00:00:00 2001 From: Caroline BUZENET Date: Tue, 15 Nov 2022 16:15:53 +0100 Subject: [PATCH 52/52] Max execution time for suite in final report xml and max execution time of all html reports for report.html --- src/Merger/HtmlReportMerger.php | 83 ++- src/Merger/XmlReportMergerTask.php | 22 +- tests/Merger/HtmlReportMergerTest.php | 152 +++++ tests/Merger/XmlReportMergerTaskTest.php | 26 +- .../html/expected_report_codeception5.html | 528 ++++++++++++++++++ .../reports/html/report_1_codeception5.html | 317 +++++++++++ .../reports/html/report_2_codeception5.html | 292 ++++++++++ .../reports/html/report_3_codeception5.html | 319 +++++++++++ 8 files changed, 1728 insertions(+), 11 deletions(-) create mode 100644 tests/fixtures/reports/html/expected_report_codeception5.html create mode 100644 tests/fixtures/reports/html/report_1_codeception5.html create mode 100644 tests/fixtures/reports/html/report_2_codeception5.html create mode 100644 tests/fixtures/reports/html/report_3_codeception5.html diff --git a/src/Merger/HtmlReportMerger.php b/src/Merger/HtmlReportMerger.php index 88f198d..a2c0066 100644 --- a/src/Merger/HtmlReportMerger.php +++ b/src/Merger/HtmlReportMerger.php @@ -50,7 +50,20 @@ class HtmlReportMerger extends AbstractMerger protected bool $previousLibXmlUseErrors = false; - private float $executionTimeSum = 0; + protected bool $maxTime = false; + + protected array $executionTime = []; + + /** + * @var string|float + */ + private $executionTimeSum = 0; + + + public function maxTime(): void + { + $this->maxTime = true; + } /** * HtmlReportMerger constructor. @@ -198,9 +211,10 @@ private function countExecutionTime(DOMDocument $dstFile): void if (!$nodeList) { throw XPathExpressionException::malformedXPath($xpathHeadline); } - + $hoursMinutesSeconds = '(([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))\.\d+)'; + $seconds = '\d+\.\d+s'; $pregResult = preg_match( - '#^Codeception Results .* \((?\d+\.\d+)s\)$#', + "#^Codeception Results .* \((?$hoursMinutesSeconds|$seconds)\)$#", $nodeList[0]->nodeValue, $matches ); @@ -213,7 +227,18 @@ private function countExecutionTime(DOMDocument $dstFile): void return; } - $this->executionTimeSum += (float)$matches['timesum']; + if (str_contains($matches['timesum'], 's')) { + $matches['timesum'] = str_replace('s', '', $matches['timesum']); + } + if (!$this->maxTime) { + if (str_contains($matches['timesum'], ':')) { + $this->executionTimeSum = $this->sumTime(strval($this->executionTimeSum), (string)$matches['timesum']); + } else { + $this->executionTimeSum += (float)$matches['timesum']; + } + } else { + $this->executionTime[] = (string)$matches['timesum']; + } } /** @@ -238,8 +263,20 @@ private function updateHeaderLine(DOMDocument $dstFile): void $statusNode->nodeValue = 'FAILED'; $statusAttr->value = 'color: red'; } - - $executionTimeNode->nodeValue = sprintf(' (%ss)', $this->executionTimeSum); + if (!$this->maxTime) { + $executionTime = (string)$this->executionTimeSum; + } else { + usort($this->executionTime, function ($a, $b) { + return strcmp($a, $b); + }); + $executionTime = max($this->executionTime); + } + $executionTimeNode->nodeValue = sprintf( + (preg_match('#([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))\.\d+#', $executionTime)) + ? ' (%s)' + : ' (%ss)', + $executionTime + ); } /** @@ -342,4 +379,38 @@ private function updateButtons(DOMDocument $dstFile): void $table->setAttribute('id', "stepContainer" . $n); } } + + private function sumTime(string $time1, string $time2): string + { + $times = [$time1, $time2]; + $seconds = 0; + $milliseconds = 0; + $isHour = false; + foreach ($times as $time) { + if ($time !== '0') { + $output = explode(':', $time); + if (count($output) > 2) { + $isHour = true; + [$hour, $minute, $second] = $output; + $seconds += $hour * 3600; + } else { + [$minute, $second] = $output; + } + $seconds += $minute * 60; + [$second, $millisecond] = explode('.', $second); + $seconds += $second; + $milliseconds += $millisecond; + } + } + if ($isHour) { + $hours = floor($seconds / 3600); + $seconds -= $hours * 3600; + } + $minutes = floor($seconds / 60); + $seconds -= $minutes * 60; + + return $isHour + ? sprintf('%02d:%02d:%02d.%02d', $hours, $minutes, $seconds, $milliseconds) + : sprintf('%02d:%02d.%02d', $minutes, $seconds, $milliseconds); + } } diff --git a/src/Merger/XmlReportMergerTask.php b/src/Merger/XmlReportMergerTask.php index d8d88e6..fcbc5b1 100644 --- a/src/Merger/XmlReportMergerTask.php +++ b/src/Merger/XmlReportMergerTask.php @@ -18,8 +18,10 @@ class XmlReportMergerTask extends AbstractMerger protected array $src = []; protected string $dst = ''; + protected array $suiteDuration = []; protected bool $summarizeTime = true; + protected bool $maxSuiteTime = false; protected bool $mergeRewrite = false; @@ -36,6 +38,12 @@ public function maxTime(): void $this->summarizeTime = false; } + public function maxSuiteTime(): void + { + $this->summarizeTime = false; + $this->maxSuiteTime = true; + } + public function mergeRewrite(): self { $this->mergeRewrite = true; @@ -111,6 +119,7 @@ public function run(): void protected function loadSuites(DOMElement $current): void { + $this->suiteDuration[$current->getAttribute('name')][] = (float) $current->getAttribute('time'); /** @var DOMNode $node */ foreach ($current->childNodes as $node) { if ($node instanceof DOMElement) { @@ -136,13 +145,20 @@ protected function mergeSuites(DOMDocument $dstXml): void 'errors' => 0, 'time' => 0, ]; + foreach ($tests as $test) { $resultNode->appendChild($test); $data['assertions'] += (int)$test->getAttribute('assertions'); - $data['time'] = $this->summarizeTime - ? ((float)$test->getAttribute('time') + $data['time']) - : max($test->getAttribute('time'), $data['time']); + if ($this->summarizeTime) { + $data['time'] = ((float)$test->getAttribute('time') + $data['time']); + } else { + if ($this->maxSuiteTime) { + $data['time'] = max($this->suiteDuration[$suiteName]); + } else { + $data['time'] = max($test->getAttribute('time'), $data['time']); + } + } $data['failures'] += $test->getElementsByTagName('failure')->length; $data['errors'] += $test->getElementsByTagName('error')->length; diff --git a/tests/Merger/HtmlReportMergerTest.php b/tests/Merger/HtmlReportMergerTest.php index d3df126..f5be1f5 100644 --- a/tests/Merger/HtmlReportMergerTest.php +++ b/tests/Merger/HtmlReportMergerTest.php @@ -62,4 +62,156 @@ public function testRun(): void $this->assertSame($expectedTimeInSeconds, (float)$matches['timesum']); } + + /** + * @covers ::run + */ + public function testRunWithCodeception5Reports(): void + { + $expectedTimeInSeconds = '03:34.98'; + $expectedSuccess= 3; + + $reportPath = TEST_PATH . '/fixtures/reports/html/'; + $task = new HtmlReportMerger(); + $task->setLogger(new Logger(new NullOutput())); + + $resultReport = TEST_PATH . '/result/report_codeception5.html'; + $task + ->from( + [ + $reportPath . 'report_0_codeception5.html', // this file did not exists and it should not fail + $reportPath . 'report_1_codeception5.html', + $reportPath . 'report_2_codeception5.html', + $reportPath . 'report_3_codeception5.html', + ] + ) + ->into($resultReport) + ->run(); + + $this->assertFileExists($resultReport); + + //read first source file as main + $dstHTML = new DOMDocument(); + $dstHTML->loadHTMLFile($resultReport, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + /** @var DOMNodeList $values */ + $values = (new DOMXPath($dstHTML)) + ->query("//*[contains(@class,'scenarioSuccessValue')]"); + + $this->assertCount(1, $values); + $this->assertSame($expectedSuccess, (int)$values[0]->nodeValue); + + $values = (new DOMXPath($dstHTML)) + ->query("//h1[text() = 'Codeception Results ']"); + preg_match( + '#^Codeception Results .* \((?(([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))\.\d+))\)$#', + $values[0]->nodeValue, + $matches + ); + + $this->assertSame($expectedTimeInSeconds, (string)$matches['timesum']); + } + + /** + * @covers ::run + */ + public function testRunMaxTimeReports(): void + { + $expectedTime = '129.25'; + $expectedSuccess= 3; + + $reportPath = TEST_PATH . '/fixtures/reports/html/'; + $task = new HtmlReportMerger(); + $task->setLogger(new Logger(new NullOutput())); + + $resultReport = TEST_PATH . '/result/report_max_time.html'; + $task->maxTime(); + $task + ->from( + [ + $reportPath . 'report_0.html', // this file did not exists and it should not fail + $reportPath . 'report_1.html', + $reportPath . 'report_2.html', + $reportPath . 'report_3.html', + ] + ) + ->into($resultReport) + ->run(); + + $this->assertFileExists($resultReport); + + //read first source file as main + $dstHTML = new DOMDocument(); + $dstHTML->loadHTMLFile($resultReport, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + /** @var DOMNodeList $values */ + $values = (new DOMXPath($dstHTML)) + ->query("//*[contains(@class,'scenarioSuccessValue')]"); + + $this->assertCount(1, $values); + $this->assertSame($expectedSuccess, (int)$values[0]->nodeValue); + + $values = (new DOMXPath($dstHTML)) + ->query("//h1[text() = 'Codeception Results ']"); + preg_match( + '#^Codeception Results .* \((?\d+\.\d+)s\)$#', + $values[0]->nodeValue, + $matches + ); + $executionTime[] = (string)$matches['timesum']; + usort($executionTime, function ($a, $b) { + return strcmp($a, $b); + }); + $this->assertSame($expectedTime, max($executionTime)); + } + + /** + * @covers ::run + */ + public function testRunMaxTimeWithCodeception5Reports(): void + { + $expectedTime = '02:09.25'; + $expectedSuccess= 3; + + $reportPath = TEST_PATH . '/fixtures/reports/html/'; + $task = new HtmlReportMerger(); + $task->setLogger(new Logger(new NullOutput())); + + $resultReport = TEST_PATH . '/result/report_codeception5_max_time.html'; + $task->maxTime(); + $task + ->from( + [ + $reportPath . 'report_0_codeception5.html', // this file did not exists and it should not fail + $reportPath . 'report_1_codeception5.html', + $reportPath . 'report_2_codeception5.html', + $reportPath . 'report_3_codeception5.html', + ] + ) + ->into($resultReport) + ->run(); + + $this->assertFileExists($resultReport); + + //read first source file as main + $dstHTML = new DOMDocument(); + $dstHTML->loadHTMLFile($resultReport, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + /** @var DOMNodeList $values */ + $values = (new DOMXPath($dstHTML)) + ->query("//*[contains(@class,'scenarioSuccessValue')]"); + + $this->assertCount(1, $values); + $this->assertSame($expectedSuccess, (int)$values[0]->nodeValue); + + $values = (new DOMXPath($dstHTML)) + ->query("//h1[text() = 'Codeception Results ']"); + preg_match( + '#^Codeception Results .* \((?(([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))\.\d+))\)$#', + $values[0]->nodeValue, + $matches + ); + $executionTime[] = (string)$matches['timesum']; + usort($executionTime, function ($a, $b) { + return strcmp($a, $b); + }); + $this->assertSame($expectedTime, max($executionTime)); + } } diff --git a/tests/Merger/XmlReportMergerTaskTest.php b/tests/Merger/XmlReportMergerTaskTest.php index 9cf40cd..22416bc 100644 --- a/tests/Merger/XmlReportMergerTaskTest.php +++ b/tests/Merger/XmlReportMergerTaskTest.php @@ -26,11 +26,11 @@ public function testMergeReports(): void $this->assertFileExists(TEST_PATH . '/result/merged.xml'); $xml = file_get_contents(TEST_PATH . '/result/merged.xml'); $this->assertStringContainsString( - '', $xml ); $this->assertStringContainsString( - '', $xml ); $this->assertStringContainsString( @@ -45,6 +45,28 @@ public function testMergeReports(): void ); } + public function testMergeReportsMaxSuiteTime(): void + { + $task = new XmlReportMergerTask(); + $task->setLogger(new Logger(new NullOutput())); + $task->maxSuiteTime(); + $task->from(TEST_PATH . '/fixtures/result1.xml') + ->from(TEST_PATH . '/fixtures/result2.xml') + ->into(TEST_PATH . '/result/merged.xml') + ->run(); + + $this->assertFileExists(TEST_PATH . '/result/merged.xml'); + $xml = file_get_contents(TEST_PATH . '/result/merged.xml'); + $this->assertStringContainsString( + '', + $xml + ); + $this->assertStringContainsString( + '', + $xml + ); + } + public function testMergeRewriteReports(): void { $task = new XmlReportMergerTask(); diff --git a/tests/fixtures/reports/html/expected_report_codeception5.html b/tests/fixtures/reports/html/expected_report_codeception5.html new file mode 100644 index 0000000..0c496f3 --- /dev/null +++ b/tests/fixtures/reports/html/expected_report_codeception5.html @@ -0,0 +1,528 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (234.98s)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Acceptance (cloud-stage) Tests

+
+

+ + ExpleogroupCest » Student apply expleogroup and + choose interest 103.29s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ I acting as "Vincenzo" +

+ +

+ I set locale "fr"

+ +

+ I visit "Page\Applications\ApplicationFormPage","","appsource=expleogroup" +

+ +

+ Page\Applications\ApplicationFormPage: start + application {"title":"La première étape de votre candidature","button":"Commencer"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + personal details {"title":"Votre profil","birthdate":"Votre date de naissance","address":"Votre adresse","gender":"Votre genre"},{"gender":"Masculin","address":"7 cité paradis PARIS"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + education {"title":"Vos études","education":"","diploma":"Quel est votre niveau de diplôme le plus élevé ?","frenchLevel":"","englishLevel":"Quel est votre niveau d’anglais ?"},{"diploma":"Bac+2","englishLevel":"Intermédiaire (B1-B2)"} +

+ +

+ Page\Applications\ApplicationFormPage: fill + learning resources {"title":"La formation en ligne et vous","followedCourses":"Avez-vous déjà suivi des cours en ligne ?","followedCoursesSubject":"Sur quels sujets et sur quels sites ?","resources":"Pour cette formation, vous aurez accès à :"},{"followedCourses":"Oui","followedCoursesSubject":"Coursera","resources":["Un endroit calme","Un ordinateur","Un micro"]} +

+ +

+ Page\Applications\ApplicationFormPage: fill + motivation {"title":"Votre nouvelle carrière","professionalProject":"Détaillez votre projet professionnel (à court, moyen et long-terme)","cv":"Ajoutez votre CV","linkedin":"","foundEmployer":"","desiredStartDate":"","nextButton":"Envoyer la candidature"},{"cv":"cv.pdf"} +

+ +

+ Page\Applications\ApplicationFormPage: see + application end {"title":"Merci de votre intérêt pour nos formations !","button":"RETOUR À L’ACCUEIL"} +

+ +
+
+

Api (cloud-stage) Tests

+
+

+ + AnalyticsCest » Get analytics with paths code + 2.44s

+
+ + + + + + + + + + + + + +

+ I acting as "Business\Users\BotAdmin" +

+ +

+ I get analytics "PATHS",[],"0-1000" +

+ +

+ I see analytics "PATHS" +

+ +
+ + +
+

Bdd (cloud-stage) Tests

+
+

+ + Course » Member can follow a course and pass a + quiz 129.25s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    As a member +
    I want to follow a + course and pass a quiz
    In order to make + progress on the platform

+ Given i am "member"

+ +

+ When i choose a course

+ +

+ And i follow a course

+ +

+ And i pass a quiz

+ +

+ Then i see that i have followed the course

+ +

+ And i see that i have passed the quiz

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:3
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_1_codeception5.html b/tests/fixtures/reports/html/report_1_codeception5.html new file mode 100644 index 0000000..3073123 --- /dev/null +++ b/tests/fixtures/reports/html/report_1_codeception5.html @@ -0,0 +1,317 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (01:23.29)

+ + + + + + + + + + + + + + + +
+

Acceptance (cloud-stage) Tests

+
+

+ + ExpleogroupCest » Student apply expleogroup and choose interest 103.29s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ I acting as "Vincenzo"

+ +

+ I set locale "fr"

+ +

+ I visit "Page\Applications\ApplicationFormPage","","appsource=expleogroup"

+ +

+ Page\Applications\ApplicationFormPage: start application {"title":"La première étape de votre candidature","button":"Commencer"}

+ +

+ Page\Applications\ApplicationFormPage: fill personal details {"title":"Votre profil","birthdate":"Votre date de naissance","address":"Votre adresse","gender":"Votre genre"},{"gender":"Masculin","address":"7 cité paradis PARIS"}

+ +

+ Page\Applications\ApplicationFormPage: fill education {"title":"Vos études","education":"","diploma":"Quel est votre niveau de diplôme le plus élevé ?","frenchLevel":"","englishLevel":"Quel est votre niveau d’anglais ?"},{"diploma":"Bac+2","englishLevel":"Intermédiaire (B1-B2)"}

+ +

+ Page\Applications\ApplicationFormPage: fill learning resources {"title":"La formation en ligne et vous","followedCourses":"Avez-vous déjà suivi des cours en ligne ?","followedCoursesSubject":"Sur quels sujets et sur quels sites ?","resources":"Pour cette formation, vous aurez accès à :"},{"followedCourses":"Oui","followedCoursesSubject":"Coursera","resources":["Un endroit calme","Un ordinateur","Un micro"]}

+ +

+ Page\Applications\ApplicationFormPage: fill motivation {"title":"Votre nouvelle carrière","professionalProject":"Détaillez votre projet professionnel (à court, moyen et long-terme)","cv":"Ajoutez votre CV","linkedin":"","foundEmployer":"","desiredStartDate":"","nextButton":"Envoyer la candidature"},{"cv":"cv.pdf"}

+ +

+ Page\Applications\ApplicationFormPage: see application end {"title":"Merci de votre intérêt pour nos formations !","button":"RETOUR À L’ACCUEIL"}

+ +
+
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_2_codeception5.html b/tests/fixtures/reports/html/report_2_codeception5.html new file mode 100644 index 0000000..8bb50e2 --- /dev/null +++ b/tests/fixtures/reports/html/report_2_codeception5.html @@ -0,0 +1,292 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (00:02.44)

+ + + + + + + + + + + + + + + + + + + + +
+

Api (cloud-stage) Tests

+
+

+ + AnalyticsCest » Get analytics with paths code 2.44s

+
+ + + + + + + + + + + + + +

+ I acting as "Business\Users\BotAdmin"

+ +

+ I get analytics "PATHS",[],"0-1000"

+ +

+ I see analytics "PATHS"

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ + diff --git a/tests/fixtures/reports/html/report_3_codeception5.html b/tests/fixtures/reports/html/report_3_codeception5.html new file mode 100644 index 0000000..bffa76b --- /dev/null +++ b/tests/fixtures/reports/html/report_3_codeception5.html @@ -0,0 +1,319 @@ + + + Test results + + + + + + + + + + +
+

Codeception Results OK (02:09.25)

+ + + + + + + + + + + + + + + + + + + + + +
+

Bdd (cloud-stage) Tests

+
+

+ + Course » Member can follow a course and pass a quiz 129.25s

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    As a member
    I want to follow a course and pass a quiz
    In order to make progress on the platform

+ Given i am "member"

+ +

+ When i choose a course

+ +

+ And i follow a course

+ +

+ And i pass a quiz

+ +

+ Then i see that i have followed the course

+ +

+ And i see that i have passed the quiz

+ +
+ + +
+

Summary

+
+ + + + + + + + + + + + + + + + + +
Successful scenarios:1
Failed scenarios:0
Skipped scenarios:0
Incomplete scenarios:0
+
+
+
+ +