diff --git a/.gitattributes b/.gitattributes index 1c8e494..46ee961 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,4 +7,5 @@ /phpunit.xml.dist export-ignore /phpcs.xml.dist export-ignore /phpstan.neon export-ignore +/psalm.xml export-ignore /composer.lock export-ignore diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml index 18fcfa0..85d61d1 100644 --- a/.github/workflows/coding-standards.yml +++ b/.github/workflows/coding-standards.yml @@ -5,11 +5,9 @@ on: pull_request: branches: - "*.x" - - "master" push: branches: - "*.x" - - "master" env: COMPOSER_ROOT_VERSION: "2.1" @@ -35,15 +33,10 @@ jobs: php-version: "${{ matrix.php-version }}" tools: "cs2pr" - - name: "Cache dependencies installed with Composer" - uses: "actions/cache@v2" - with: - path: "~/.composer/cache" - key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}" - restore-keys: "php-${{ matrix.php-version }}-composer-locked-" - - name: "Install dependencies with Composer" - run: "composer install --no-interaction --no-progress --no-suggest" + uses: "ramsey/composer-install@v1" + with: + dependency-versions: "${{ matrix.deps }}" # https://github.com/doctrine/.github/issues/3 - name: "Run PHP_CodeSniffer" diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index d806c78..2ad7f28 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -20,7 +20,7 @@ jobs: - "7.4" - "8.0" deps: - - "normal" + - "highest" include: - deps: "low" php-version: "7.2" @@ -37,31 +37,11 @@ jobs: php-version: "${{ matrix.php-version }}" coverage: "pcov" - - name: "Cache dependencies installed with composer" - uses: "actions/cache@v2" + + - name: "Update dependencies with Composer" + uses: "ramsey/composer-install@v1" with: - path: "~/.composer/cache" - key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}" - restore-keys: "php-${{ matrix.php-version }}-composer-locked-" - - # Remove this block when - # https://github.com/felixfbecker/php-language-server-protocol/pull/15 is - # merged and released - - name: "Remove dependency on vimeo/psalm for PHP8" - run: "composer remove --dev --no-update vimeo/psalm" - if: "${{ matrix.php-version == '8.0' }}" - - - name: "Downgrade Composer" - run: "composer self-update --1" - if: "${{ matrix.php-version == '7.1' }}" - - - name: "Update dependencies with composer" - run: "composer update --no-interaction --no-progress --no-suggest" - if: "${{ matrix.deps == 'normal' }}" - - - name: "Install lowest possible dependencies with composer" - run: "composer update --no-interaction --no-progress --no-suggest --prefer-dist --prefer-lowest" - if: "${{ matrix.deps == 'low' }}" + dependency-versions: "${{ matrix.deps }}" - name: "Run PHPUnit" run: "vendor/bin/phpunit --coverage-clover=coverage.xml" diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 2cd3a3e..19fa6b0 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -5,11 +5,9 @@ on: pull_request: branches: - "*.x" - - "master" push: branches: - "*.x" - - "master" env: COMPOSER_ROOT_VERSION: "2.1" @@ -34,15 +32,10 @@ jobs: php-version: "${{ matrix.php-version }}" tools: "cs2pr" - - name: "Cache dependencies installed with composer" - uses: "actions/cache@v2" + - name: "Install dependencies with Composer" + uses: "ramsey/composer-install@v1" with: - path: "~/.composer/cache" - key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}" - restore-keys: "php-${{ matrix.php-version }}-composer-locked-" - - - name: "Install dependencies with composer" - run: "composer install --no-interaction --no-progress --no-suggest" + dependency-versions: "${{ matrix.deps }}" - name: "Run a static analysis with phpstan/phpstan" run: "vendor/bin/phpstan analyse --error-format=checkstyle | cs2pr" @@ -57,10 +50,19 @@ jobs: - "7.4" steps: - - name: Checkout code - uses: actions/checkout@v2 + - name: "Checkout code" + uses: "actions/checkout@v2" - - name: Psalm - uses: docker://vimeo/psalm-github-actions + - name: "Install PHP" + uses: "shivammathur/setup-php@v2" with: - composer_require_dev: true + coverage: "none" + php-version: "${{ matrix.php-version }}" + + - name: "Install dependencies with Composer" + uses: "ramsey/composer-install@v1" + with: + dependency-versions: "highest" + + - name: "Run a static analysis with vimeo/psalm" + run: "vendor/bin/psalm --show-info=false --stats --output-format=github --threads=$(nproc)" diff --git a/.gitignore b/.gitignore index 6a947a3..d40493f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /phpcs.xml /.phpcs-cache /.phpunit.result.cache +/composer.lock diff --git a/UPGRADE-2.2.md b/UPGRADE-2.2.md new file mode 100644 index 0000000..9b06aba --- /dev/null +++ b/UPGRADE-2.2.md @@ -0,0 +1,11 @@ +UPGRADE FROM 2.1 to 2.2 +======================= + +* Deprecated using doctrine/cache for metadata caching. The `setCacheDriver` and + `getCacheDriver` methods in `Doctrine\Persistence\Mapping\AbstractMetadata` + have been deprecated. Please use `getCache` and `setCache` with a PSR-6 + implementation instead. Note that even after switching to PSR-6, + `getCacheDriver` will return a cache instance that wraps the PSR-6 cache. + Note that if you use a custom implementation of doctrine/cache, the library + may not be able to provide a forward compatibility layer. The cache + implementation MUST extend the `Doctrine\Common\Cache\CacheProvider` class. diff --git a/composer.json b/composer.json index 49cb16c..2eed89b 100644 --- a/composer.json +++ b/composer.json @@ -22,19 +22,21 @@ "require": { "php": "^7.2 || ^8.0", "doctrine/annotations": "^1.7.0", - "doctrine/cache": "^1.0", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0" + "doctrine/event-manager": "^1.0", + "psr/cache": "^1.0|^2.0|^3.0" }, "require-dev": { "composer/package-versions-deprecated": "^1.11", - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "0.12.84", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", - "doctrine/coding-standard": "^6.0 || ^8.0", + "doctrine/coding-standard": "^6.0 || ^9.0", "doctrine/common": "^3.0", "phpunit/phpunit": "^8.0 || ^9.0", - "vimeo/psalm": "^3.11" + "symfony/cache": "^4.4|^5.0", + "vimeo/psalm": "4.7.0" }, "conflict": { "doctrine/common": "<2.10@dev" diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 26bccb7..0000000 --- a/composer.lock +++ /dev/null @@ -1,4677 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "1288c158f99321c673e6966b36713acc", - "packages": [ - { - "name": "doctrine/annotations", - "version": "1.11.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "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.11.1" - }, - "time": "2020-10-26T10:28:16+00:00" - }, - { - "name": "doctrine/cache", - "version": "1.10.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2020-07-07T18:54:01+00:00" - }, - { - "name": "doctrine/collections", - "version": "1.6.7", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "shasum": "" - }, - "require": { - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.7" - }, - "time": "2020-07-27T17:53:49+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2020-05-29T18:28:51+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "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": "2020-05-25T17:44:05+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "ecdc3c476b3ccff02f8e5d5bcc04f7ccfd18751c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/ecdc3c476b3ccff02f8e5d5bcc04f7ccfd18751c", - "reference": "ecdc3c476b3ccff02f8e5d5bcc04f7ccfd18751c", - "shasum": "" - }, - "require": { - "php": ">=7" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6.0.9 | ^7", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Amp\\": "lib" - }, - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "http://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.5.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2020-11-03T16:23:45+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v1.8.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/f0c20cf598a958ba2aa8c6e5a71c697d652c7088", - "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Amp\\ByteStream\\": "lib" - }, - "files": [ - "lib/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/master" - }, - "time": "2020-06-29T18:35:05+00:00" - }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.1", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.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": "2020-11-11T10:22:58+00:00" - }, - { - "name": "composer/semver", - "version": "3.2.4", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", - "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.4" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-11-13T08:59:24+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.5", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f28d44c286812c714741478d968104c5e604a1d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4", - "reference": "f28d44c286812c714741478d968104c5e604a1d4", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/1.4.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": "2020-11-13T08:04:11+00:00" - }, - { - "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v0.7.0", - "source": { - "type": "git", - "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", - "reference": "e8d808670b8f882188368faaf1144448c169c0b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/e8d808670b8f882188368faaf1144448c169c0b7", - "reference": "e8d808670b8f882188368faaf1144448c169c0b7", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.3", - "squizlabs/php_codesniffer": "^2 || ^3 || 4.0.x-dev" - }, - "require-dev": { - "composer/composer": "*", - "phpcompatibility/php-compatibility": "^9.0", - "sensiolabs/security-checker": "^4.1.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" - }, - "autoload": { - "psr-4": { - "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl", - "role": "Developer / IT Manager" - } - ], - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com", - "keywords": [ - "PHPCodeSniffer", - "PHP_CodeSniffer", - "code quality", - "codesniffer", - "composer", - "installer", - "phpcs", - "plugin", - "qa", - "quality", - "standard", - "standards", - "style guide", - "stylecheck", - "tests" - ], - "support": { - "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", - "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" - }, - "time": "2020-06-25T14:57:39+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" - }, - { - "name": "doctrine/coding-standard", - "version": "8.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/coding-standard.git", - "reference": "529d385bb3790431080493c0fe7adaec39df368a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/coding-standard/zipball/529d385bb3790431080493c0fe7adaec39df368a", - "reference": "529d385bb3790431080493c0fe7adaec39df368a", - "shasum": "" - }, - "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", - "php": "^7.1 || ^8.0", - "slevomat/coding-standard": "^6.3.9", - "squizlabs/php_codesniffer": "^3.5.5" - }, - "type": "phpcodesniffer-standard", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Steve Müller", - "email": "st.mueller@dzh-online.de" - } - ], - "description": "The Doctrine Coding Standard is a set of PHPCS rules applied to all Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/coding-standard.html", - "keywords": [ - "checks", - "code", - "coding", - "cs", - "doctrine", - "rules", - "sniffer", - "sniffs", - "standard", - "style" - ], - "support": { - "issues": "https://github.com/doctrine/coding-standard/issues", - "source": "https://github.com/doctrine/coding-standard/tree/8.2.0" - }, - "time": "2020-10-25T14:56:19+00:00" - }, - { - "name": "doctrine/common", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "a3c6479858989e242a2465972b4f7a8642baf0d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/a3c6479858989e242a2465972b4f7a8642baf0d4", - "reference": "a3c6479858989e242a2465972b4f7a8642baf0d4", - "shasum": "" - }, - "require": { - "doctrine/persistence": "^2.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^1.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpunit/phpunit": "^7.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.0.2" - }, - "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%2Fcommon", - "type": "tidelift" - } - ], - "time": "2020-06-05T16:59:53+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.0", - "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" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "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": "felixfbecker/advanced-json-rpc", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "0ed363f8de17d284d479ec813c9ad3f6834b5c40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/0ed363f8de17d284d479ec813c9ad3f6834b5c40", - "reference": "0ed363f8de17d284d479ec813c9ad3f6834b5c40", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0", - "php": ">=7.0", - "phpdocumentor/reflection-docblock": "^4.0.0 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/master" - }, - "time": "2020-03-11T15:21:41+00:00" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/85e83cacd2ed573238678c6875f8f0d7ec699541", - "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.0" - }, - "time": "2020-10-23T13:55: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": "netresearch/jsonmapper", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/e0f1e33a71587aca81be5cffbb9746510e1fe04e", - "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/master" - }, - "time": "2020-04-16T18:48:43+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.10.2", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "658f1be311a230e0907f5dfe0213742aff0596de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/658f1be311a230e0907f5dfe0213742aff0596de", - "reference": "658f1be311a230e0907f5dfe0213742aff0596de", - "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.10.2" - }, - "time": "2020-09-26T10:30:38+00:00" - }, - { - "name": "openlss/lib-array2xml", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "LSS": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bryan Tong", - "email": "bryan@nullivex.com", - "homepage": "https://www.nullivex.com" - }, - { - "name": "Tony Butler", - "email": "spudz76@gmail.com", - "homepage": "https://www.nullivex.com" - } - ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", - "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" - ], - "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" - }, - "time": "2019-03-29T20:06:56+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "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/master" - }, - "time": "2020-06-27T14:33:11+00:00" - }, - { - "name": "phar-io/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/c6bb6825def89e0a32220f88337f8ceaf1975fa0", - "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0", - "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/master" - }, - "time": "2020-06-27T14:39:04+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "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", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "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": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "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.12.1", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.12.1" - }, - "time": "2020-09-29T09:10:42+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "0.4.9", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/98a088b17966bdf6ee25c8a4b634df313d8aa531", - "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "consistence/coding-standard": "^3.5", - "ergebnis/composer-normalize": "^2.0.2", - "jakub-onderka/php-parallel-lint": "^0.9.2", - "phing/phing": "^2.16.0", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.26", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^6.3", - "slevomat/coding-standard": "^4.7.2", - "symfony/process": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" - } - }, - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/master" - }, - "time": "2020-08-03T20:32:43+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "0.12.57", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "f9909d1d0c44b4cbaf72babcf80e8f14d6fdd55b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f9909d1d0c44b4cbaf72babcf80e8f14d6fdd55b", - "reference": "f9909d1d0c44b4cbaf72babcf80e8f14d6fdd55b", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.12-dev" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "support": { - "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/0.12.57" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpstan", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], - "time": "2020-11-21T12:53:28+00:00" - }, - { - "name": "phpstan/phpstan-phpunit", - "version": "0.12.16", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "1dd916d181b0539dea5cd37e91546afb8b107e17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/1dd916d181b0539dea5cd37e91546afb8b107e17", - "reference": "1dd916d181b0539dea5cd37e91546afb8b107e17", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "phpstan/phpstan": "^0.12.33" - }, - "conflict": { - "phpunit/phpunit": "<7.0" - }, - "require-dev": { - "consistence/coding-standard": "^3.5", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.0.2", - "jakub-onderka/php-parallel-lint": "^1.0", - "phing/phing": "^2.16.0", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "satooshi/php-coveralls": "^1.0", - "slevomat/coding-standard": "^4.7.2" - }, - "type": "phpstan-extension", - "extra": { - "branch-alias": { - "dev-master": "0.12-dev" - }, - "phpstan": { - "includes": [ - "extension.neon", - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPUnit extensions and rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/0.12.16" - }, - "time": "2020-08-05T13:28:50+00:00" - }, - { - "name": "phpstan/phpstan-strict-rules", - "version": "0.12.5", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "334898a32217e4605e0f9cfa3d3fc3101bda26be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/334898a32217e4605e0f9cfa3d3fc3101bda26be", - "reference": "334898a32217e4605e0f9cfa3d3fc3101bda26be", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "phpstan/phpstan": "^0.12.33" - }, - "require-dev": { - "consistence/coding-standard": "^3.0.1", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.0.2", - "jakub-onderka/php-parallel-lint": "^1.0", - "phing/phing": "^2.16.0", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0", - "slevomat/coding-standard": "^4.5.2" - }, - "type": "phpstan-extension", - "extra": { - "branch-alias": { - "dev-master": "0.12-dev" - }, - "phpstan": { - "includes": [ - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Extra strict and opinionated rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/master" - }, - "time": "2020-08-30T15:42:06+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "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": "^9.3" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-28T06:44:49+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "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-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "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/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "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", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "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", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "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", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "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", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.4.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9fa359ff5ddaa5eb2be2bedb08a6a5787a5807ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9fa359ff5ddaa5eb2be2bedb08a6a5787a5807ab", - "reference": "9fa359ff5ddaa5eb2be2bedb08a6a5787a5807ab", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "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", - "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", - "sebastian/version": "^3.0.2" - }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ], - "files": [ - "src/Framework/Assert/Functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.4.3" - }, - "funding": [ - { - "url": "https://phpunit.de/donate.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-10T12:53:30+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" - }, - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" - }, - "time": "2020-03-23T09:12:05+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": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "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", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "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": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "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", - "type": "github" - } - ], - "time": "2020-10-26T15:49:45+00:00" - }, - { - "name": "sebastian/complexity", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "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", - "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": "2020-10-26T13:10:38+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "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": "4.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "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": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "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.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "a90ccbddffa067b51f574dea6eb25d5680839455" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455", - "reference": "a90ccbddffa067b51f574dea6eb25d5680839455", - "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" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:55:19+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.6", - "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 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": "2020-11-28T06:42:11+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "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" - } - ], - "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", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "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", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "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": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "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", - "type": "github" - } - ], - "time": "2020-10-26T13:17:30+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "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.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2", - "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.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:18:59+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "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": "slevomat/coding-standard", - "version": "6.4.1", - "source": { - "type": "git", - "url": "https://github.com/slevomat/coding-standard.git", - "reference": "696dcca217d0c9da2c40d02731526c1e25b65346" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/696dcca217d0c9da2c40d02731526c1e25b65346", - "reference": "696dcca217d0c9da2c40d02731526c1e25b65346", - "shasum": "" - }, - "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", - "php": "^7.1 || ^8.0", - "phpstan/phpdoc-parser": "0.4.5 - 0.4.9", - "squizlabs/php_codesniffer": "^3.5.6" - }, - "require-dev": { - "phing/phing": "2.16.3", - "php-parallel-lint/php-parallel-lint": "1.2.0", - "phpstan/phpstan": "0.12.48", - "phpstan/phpstan-deprecation-rules": "0.12.5", - "phpstan/phpstan-phpunit": "0.12.16", - "phpstan/phpstan-strict-rules": "0.12.5", - "phpunit/phpunit": "7.5.20|8.5.5|9.4.0" - }, - "type": "phpcodesniffer-standard", - "extra": { - "branch-alias": { - "dev-master": "6.x-dev" - } - }, - "autoload": { - "psr-4": { - "SlevomatCodingStandard\\": "SlevomatCodingStandard" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", - "support": { - "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/6.4.1" - }, - "funding": [ - { - "url": "https://github.com/kukulich", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", - "type": "tidelift" - } - ], - "time": "2020-10-05T12:39:37+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.5.8", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "9d583721a7157ee997f235f327de038e7ea6dac4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4", - "reference": "9d583721a7157ee997f235f327de038e7ea6dac4", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "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": "2020-10-23T02:01:07+00:00" - }, - { - "name": "symfony/console", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e", - "reference": "e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e", - "shasum": "" - }, - "require": { - "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": "<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": "^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": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", - "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.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": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", - "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.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": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "727d1096295d807c309fb01a851577302394c897" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", - "reference": "727d1096295d807c309fb01a851577302394c897", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.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": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.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": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.20.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": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.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": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/string", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "a97573e960303db71be0dd8fda9be3bca5e0feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a97573e960303db71be0dd8fda9be3bca5e0feea", - "reference": "a97573e960303db71be0dd8fda9be3bca5e0feea", - "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": "Symfony String component", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "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": "vimeo/psalm", - "version": "3.18.2", - "source": { - "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "19aa905f7c3c7350569999a93c40ae91ae4e1626" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/19aa905f7c3c7350569999a93c40ae91ae4e1626", - "reference": "19aa905f7c3c7350569999a93c40ae91ae4e1626", - "shasum": "" - }, - "require": { - "amphp/amp": "^2.1", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.4", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0", - "nikic/php-parser": "4.3.* || 4.4.* || 4.5.* || 4.6.* || ^4.8", - "openlss/lib-array2xml": "^1.0", - "php": "^7.1.3|^8", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", - "webmozart/glob": "^4.1", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "amphp/amp": "^2.4.2", - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0.0", - "ext-curl": "*", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5", - "phpmyadmin/sql-parser": "5.1.0", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^7.5.16 || ^8.5 || ^9.0", - "psalm/plugin-phpunit": "^0.11", - "slevomat/coding-standard": "^5.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-igbinary": "^2.0.5" - }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psalm\\": "src/Psalm/" - }, - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Brown" - } - ], - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "code", - "inspection", - "php" - ], - "support": { - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/3.18.2" - }, - "time": "2020-10-20T13:48:22+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozart/assert/issues", - "source": "https://github.com/webmozart/assert/tree/master" - }, - "time": "2020-07-08T17:02:28+00:00" - }, - { - "name": "webmozart/glob", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/glob.git", - "reference": "3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/glob/zipball/3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe", - "reference": "3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe", - "shasum": "" - }, - "require": { - "php": "^5.3.3|^7.0", - "webmozart/path-util": "^2.2" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1", - "symfony/filesystem": "^2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.1-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Glob\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A PHP implementation of Ant's glob.", - "support": { - "issues": "https://github.com/webmozart/glob/issues", - "source": "https://github.com/webmozart/glob/tree/master" - }, - "time": "2015-12-29T11:14:33+00:00" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "time": "2015-12-17T08:42:14+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.2 || ^8.0" - }, - "platform-dev": [], - "plugin-api-version": "2.0.0" -} diff --git a/lib/Doctrine/Persistence/AbstractManagerRegistry.php b/lib/Doctrine/Persistence/AbstractManagerRegistry.php index 5cfbabc..ff877a2 100644 --- a/lib/Doctrine/Persistence/AbstractManagerRegistry.php +++ b/lib/Doctrine/Persistence/AbstractManagerRegistry.php @@ -31,12 +31,16 @@ abstract class AbstractManagerRegistry implements ManagerRegistry /** @var string */ private $defaultManager; - /** @var string */ + /** + * @var string + * @psalm-var class-string + */ private $proxyInterfaceName; /** * @param array $connections * @param array $managers + * @psalm-param class-string $proxyInterfaceName */ public function __construct( string $name, @@ -166,14 +170,9 @@ abstract class AbstractManagerRegistry implements ManagerRegistry */ public function getManagerForClass(string $class) { - // Check for namespace alias - if (strpos($class, ':') !== false) { - [$namespaceAlias, $simpleClassName] = explode(':', $class, 2); + $className = $this->getRealClassName($class); - $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; - } - - $proxyClass = new ReflectionClass($class); + $proxyClass = new ReflectionClass($className); if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { $parentClass = $proxyClass->getParentClass(); @@ -182,13 +181,13 @@ abstract class AbstractManagerRegistry implements ManagerRegistry return null; } - $class = $parentClass->getName(); + $className = $parentClass->getName(); } foreach ($this->managers as $id) { $manager = $this->getService($id); - if (! $manager->getMetadataFactory()->isTransient($class)) { + if (! $manager->getMetadataFactory()->isTransient($className)) { return $manager; } } @@ -264,4 +263,21 @@ abstract class AbstractManagerRegistry implements ManagerRegistry return $this->getManagerForClass($persistentObject) ?? $this->getManager(); } + + /** + * @psalm-return class-string + */ + private function getRealClassName(string $classNameOrAlias): string + { + // Check for namespace alias + if (strpos($classNameOrAlias, ':') !== false) { + [$namespaceAlias, $simpleClassName] = explode(':', $classNameOrAlias, 2); + + /** @psalm-var class-string */ + return $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + /** @psalm-var class-string */ + return $classNameOrAlias; + } } diff --git a/lib/Doctrine/Persistence/Event/LoadClassMetadataEventArgs.php b/lib/Doctrine/Persistence/Event/LoadClassMetadataEventArgs.php index f372a3a..b313f54 100644 --- a/lib/Doctrine/Persistence/Event/LoadClassMetadataEventArgs.php +++ b/lib/Doctrine/Persistence/Event/LoadClassMetadataEventArgs.php @@ -13,12 +13,15 @@ use Doctrine\Persistence\ObjectManager; */ class LoadClassMetadataEventArgs extends EventArgs { - /** @var ClassMetadata */ + /** @psalm-var ClassMetadata */ private $classMetadata; /** @var ObjectManager */ private $objectManager; + /** + * @psalm-param ClassMetadata $classMetadata + */ public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) { $this->classMetadata = $classMetadata; @@ -28,7 +31,7 @@ class LoadClassMetadataEventArgs extends EventArgs /** * Retrieves the associated ClassMetadata. * - * @return ClassMetadata + * @psalm-return ClassMetadata */ public function getClassMetadata() { diff --git a/lib/Doctrine/Persistence/ManagerRegistry.php b/lib/Doctrine/Persistence/ManagerRegistry.php index d070403..383605b 100644 --- a/lib/Doctrine/Persistence/ManagerRegistry.php +++ b/lib/Doctrine/Persistence/ManagerRegistry.php @@ -58,7 +58,7 @@ interface ManagerRegistry extends ConnectionRegistry * * @param string $alias The alias. * - * @phpstan-return class-string The full namespace. + * @phpstan-return string The full namespace. */ public function getAliasNamespace(string $alias); @@ -74,12 +74,12 @@ interface ManagerRegistry extends ConnectionRegistry * * @param string $persistentObject The name of the persistent object. * @param string $persistentManagerName The object manager name (null for the default one). + * @psalm-param class-string $persistentObject * * @return ObjectRepository + * @psalm-return ObjectRepository * * @template T of object - * @psalm-param class-string $persistentObject - * @psalm-return ObjectRepository */ public function getRepository( string $persistentObject, diff --git a/lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php b/lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php index a2b9312..51b9eb4 100644 --- a/lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php +++ b/lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -4,17 +4,32 @@ declare(strict_types=1); namespace Doctrine\Persistence\Mapping; +use BadMethodCallException; use Doctrine\Common\Cache\Cache; +use Doctrine\Common\Cache\CacheProvider; +use Doctrine\Common\Cache\Psr6\CacheAdapter; +use Doctrine\Common\Cache\Psr6\DoctrineProvider; use Doctrine\Persistence\Mapping\Driver\MappingDriver; use Doctrine\Persistence\Proxy; +use Psr\Cache\CacheItemPoolInterface; use ReflectionException; +use function array_combine; +use function array_keys; +use function array_map; use function array_reverse; use function array_unshift; +use function assert; use function explode; +use function is_array; +use function sprintf; +use function str_replace; use function strpos; use function strrpos; use function substr; +use function trigger_error; + +use const E_USER_DEPRECATED; /** * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the @@ -22,6 +37,9 @@ use function substr; * to a relational database. * * This class was abstracted from the ORM ClassMetadataFactory. + * + * @template CMTemplate of ClassMetadata + * @template-implements ClassMetadataFactory */ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory { @@ -30,12 +48,18 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory * * @var string */ - protected $cacheSalt = '$CLASSMETADATA'; + protected $cacheSalt = '__CLASSMETADATA__'; /** @var Cache|null */ private $cacheDriver; - /** @var array */ + /** @var CacheItemPoolInterface|null */ + private $cache; + + /** + * @var array + * @psalm-var CMTemplate[] + */ private $loadedMetadata = []; /** @var bool */ @@ -44,30 +68,65 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory /** @var ReflectionService|null */ private $reflectionService = null; + /** @var ProxyClassNameResolver|null */ + private $proxyClassNameResolver = null; + /** * Sets the cache driver used by the factory to cache ClassMetadata instances. * + * @deprecated setCacheDriver was deprecated in doctrine/persistence 2.2 and will be removed in 3.0. Use setCache instead + * * @return void */ public function setCacheDriver(?Cache $cacheDriver = null) { + @trigger_error(sprintf('%s is deprecated. Use setCache() with a PSR-6 cache instead.', __METHOD__), E_USER_DEPRECATED); + $this->cacheDriver = $cacheDriver; + + if ($cacheDriver === null) { + $this->cache = null; + + return; + } + + if (! $cacheDriver instanceof CacheProvider) { + throw new BadMethodCallException('Cannot convert cache to PSR-6 cache'); + } + + $this->cache = CacheAdapter::wrap($cacheDriver); } /** * Gets the cache driver used by the factory to cache ClassMetadata instances. * + * @deprecated getCacheDriver was deprecated in doctrine/persistence 2.2 and will be removed in 3.0. + * * @return Cache|null */ public function getCacheDriver() { + @trigger_error(sprintf('%s is deprecated. Use getCache() instead.', __METHOD__), E_USER_DEPRECATED); + return $this->cacheDriver; } + public function setCache(CacheItemPoolInterface $cache): void + { + $this->cache = $cache; + $this->cacheDriver = DoctrineProvider::wrap($cache); + } + + final protected function getCache(): ?CacheItemPoolInterface + { + return $this->cache; + } + /** * Returns an array of all the loaded metadata currently in memory. * * @return ClassMetadata[] + * @psalm-return CMTemplate[] */ public function getLoadedMetadata() { @@ -75,10 +134,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory } /** - * Forces the factory to load the metadata of all classes known to the underlying - * mapping driver. - * - * @return array The ClassMetadata instances of all mapped classes. + * {@inheritDoc} */ public function getAllMetadata() { @@ -95,6 +151,11 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory return $metadata; } + public function setProxyClassNameResolver(ProxyClassNameResolver $resolver): void + { + $this->proxyClassNameResolver = $resolver; + } + /** * Lazy initialization of this stuff, especially the metadata driver, * since these are not needed at all when a metadata cache is active. @@ -107,7 +168,6 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory * Gets the fully qualified class-name from the namespace alias. * * @return string - * * @psalm-return class-string */ abstract protected function getFqcnFromAlias( @@ -125,6 +185,8 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory /** * Wakes up reflection after ClassMetadata gets unserialized from cache. * + * @psalm-param CMTemplate $class + * * @return void */ abstract protected function wakeupReflection( @@ -135,6 +197,8 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory /** * Initializes Reflection after ClassMetadata was constructed. * + * @psalm-param CMTemplate $class + * * @return void */ abstract protected function initializeReflection( @@ -147,16 +211,14 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory * * This method should return false for mapped superclasses or embedded classes. * + * @psalm-param CMTemplate $class + * * @return bool */ abstract protected function isEntity(ClassMetadata $class); /** - * Gets the class metadata descriptor for a class. - * - * @param string $className The name of the class. - * - * @return ClassMetadata + * {@inheritDoc} * * @throws ReflectionException * @throws MappingException @@ -173,6 +235,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); } else { + /** @psalm-var class-string $className */ $realClassName = $this->getRealClass($className); } @@ -184,20 +247,31 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory $loadingException = null; try { - if ($this->cacheDriver !== null) { - $cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt); - + if ($this->cache !== null) { + $cached = $this->cache->getItem($this->getCacheKey($realClassName))->get(); if ($cached instanceof ClassMetadata) { + /** @psalm-var CMTemplate $cached */ $this->loadedMetadata[$realClassName] = $cached; $this->wakeupReflection($cached, $this->getReflectionService()); } else { - foreach ($this->loadMetadata($realClassName) as $loadedClassName) { - $this->cacheDriver->save( - $loadedClassName . $this->cacheSalt, - $this->loadedMetadata[$loadedClassName] - ); + $loadedMetadata = $this->loadMetadata($realClassName); + $classNames = array_combine( + array_map([$this, 'getCacheKey'], $loadedMetadata), + $loadedMetadata + ); + assert(is_array($classNames)); + + foreach ($this->cache->getItems(array_keys($classNames)) as $item) { + if (! isset($classNames[$item->getKey()])) { + continue; + } + + $item->set($this->loadedMetadata[$classNames[$item->getKey()]]); + $this->cache->saveDeferred($item); } + + $this->cache->commit(); } } else { $this->loadMetadata($realClassName); @@ -221,9 +295,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory } /** - * Checks whether the factory has the metadata for a class loaded already. - * - * @return bool TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + * {@inheritDoc} */ public function hasMetadataFor(string $className) { @@ -235,6 +307,8 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory * * NOTE: This is only useful in very special cases, like when generating proxy classes. * + * @psalm-param CMTemplate $class + * * @return void */ public function setMetadataFor(string $className, ClassMetadata $class) @@ -245,9 +319,10 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory /** * Gets an array of parent classes for the given entity class. * - * @return array - * * @psalm-param class-string $name + * + * @return string[] + * @psalm-return class-string[] */ protected function getParentClasses(string $name) { @@ -279,10 +354,9 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory * should be used for reflection. * * @param string $name The name of the class for which the metadata should get loaded. + * @psalm-param class-string $name * * @return array - * - * @psalm-param class-string $name */ protected function loadMetadata(string $name) { @@ -343,6 +417,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory * Override this method to implement a fallback strategy for failed metadata loading * * @return ClassMetadata|null + * @psalm-return CMTemplate|null */ protected function onNotFoundMetadata(string $className) { @@ -352,7 +427,10 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory /** * Actually loads the metadata from the underlying metadata. * - * @param array $nonSuperclassParents All parent class names that are not marked as mapped superclasses. + * @param string[] $nonSuperclassParents All parent class names that are + * not marked as mapped superclasses. + * @psalm-param CMTemplate $class + * @psalm-param CMTemplate|null $parent * * @return void */ @@ -366,12 +444,19 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory /** * Creates a new ClassMetadata instance for the given class name. * - * @return ClassMetadata + * @psalm-param class-string $className + * + * @return ClassMetadata + * @psalm-return CMTemplate + * + * @template T of object */ abstract protected function newClassMetadataInstance(string $className); /** * {@inheritDoc} + * + * @psalm-param class-string|string $class */ public function isTransient(string $class) { @@ -386,6 +471,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory $class = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); } + /** @psalm-var class-string $class */ return $this->getDriver()->isTransient($class); } @@ -413,20 +499,53 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory return $this->reflectionService; } + protected function getCacheKey(string $realClassName): string + { + return str_replace('\\', '__', $realClassName) . $this->cacheSalt; + } + /** * Gets the real class name of a class name that could be a proxy. * - * @psalm-param class-string $class - * @psalm-return class-string + * @psalm-param class-string>|class-string $class + * + * @psalm-return class-string + * + * @template T of object */ private function getRealClass(string $class): string { - $pos = strrpos($class, '\\' . Proxy::MARKER . '\\'); - - if ($pos === false) { - return $class; + if ($this->proxyClassNameResolver === null) { + $this->createDefaultProxyClassNameResolver(); } - return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + assert($this->proxyClassNameResolver !== null); + + return $this->proxyClassNameResolver->resolveClassName($class); + } + + private function createDefaultProxyClassNameResolver(): void + { + $this->proxyClassNameResolver = new class implements ProxyClassNameResolver { + /** + * @psalm-param class-string>|class-string $className + * + * @psalm-return class-string + * + * @template T of object + */ + public function resolveClassName(string $className): string + { + $pos = strrpos($className, '\\' . Proxy::MARKER . '\\'); + + if ($pos === false) { + /** @psalm-var class-string */ + return $className; + } + + /** @psalm-var class-string */ + return substr($className, $pos + Proxy::MARKER_LENGTH + 2); + } + }; } } diff --git a/lib/Doctrine/Persistence/Mapping/ClassMetadata.php b/lib/Doctrine/Persistence/Mapping/ClassMetadata.php index 5255283..01b3ed4 100644 --- a/lib/Doctrine/Persistence/Mapping/ClassMetadata.php +++ b/lib/Doctrine/Persistence/Mapping/ClassMetadata.php @@ -8,6 +8,8 @@ use ReflectionClass; /** * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @template-covariant T of object */ interface ClassMetadata { @@ -15,6 +17,7 @@ interface ClassMetadata * Gets the fully-qualified class name of this persistent class. * * @return string + * @psalm-return class-string */ public function getName(); @@ -30,7 +33,7 @@ interface ClassMetadata /** * Gets the ReflectionClass instance for this mapped class. * - * @return ReflectionClass + * @return ReflectionClass */ public function getReflectionClass(); @@ -108,6 +111,7 @@ interface ClassMetadata * Returns the target class name of the given association. * * @return string + * @psalm-return class-string */ public function getAssociationTargetClass(string $assocName); diff --git a/lib/Doctrine/Persistence/Mapping/ClassMetadataFactory.php b/lib/Doctrine/Persistence/Mapping/ClassMetadataFactory.php index ebcfe17..c74aebe 100644 --- a/lib/Doctrine/Persistence/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/Persistence/Mapping/ClassMetadataFactory.php @@ -6,6 +6,8 @@ namespace Doctrine\Persistence\Mapping; /** * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @template T of ClassMetadata */ interface ClassMetadataFactory { @@ -13,7 +15,8 @@ interface ClassMetadataFactory * Forces the factory to load the metadata of all classes known to the underlying * mapping driver. * - * @return array The ClassMetadata instances of all mapped classes. + * @return ClassMetadata[] The ClassMetadata instances of all mapped classes. + * @psalm-return T[] */ public function getAllMetadata(); @@ -23,6 +26,7 @@ interface ClassMetadataFactory * @param string $className The name of the class. * * @return ClassMetadata + * @psalm-return T */ public function getMetadataFor(string $className); @@ -36,6 +40,8 @@ interface ClassMetadataFactory /** * Sets the metadata descriptor for a specific class. * + * @psalm-param T $class + * * @return void */ public function setMetadataFor(string $className, ClassMetadata $class); @@ -44,6 +50,8 @@ interface ClassMetadataFactory * Returns whether the class with the specified name should have its metadata loaded. * This is only the case if it is either mapped directly or as a MappedSuperclass. * + * @psalm-param class-string $className + * * @return bool */ public function isTransient(string $className); diff --git a/lib/Doctrine/Persistence/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/Persistence/Mapping/Driver/AnnotationDriver.php index 98139a9..b607e37 100644 --- a/lib/Doctrine/Persistence/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/Persistence/Mapping/Driver/AnnotationDriver.php @@ -71,7 +71,7 @@ abstract class AnnotationDriver implements MappingDriver /** * Name of the entity annotations as keys. * - * @var array + * @var array */ protected $entityAnnotationClasses = []; @@ -122,7 +122,7 @@ abstract class AnnotationDriver implements MappingDriver /** * Append exclude lookup paths to metadata driver. * - * @param array $paths + * @param string[] $paths * * @return void */ @@ -181,6 +181,8 @@ abstract class AnnotationDriver implements MappingDriver * * A class is non-transient if it is annotated with an annotation * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * {@inheritDoc} */ public function isTransient(string $className) { diff --git a/lib/Doctrine/Persistence/Mapping/Driver/FileDriver.php b/lib/Doctrine/Persistence/Mapping/Driver/FileDriver.php index 56feb2c..5fd4e70 100644 --- a/lib/Doctrine/Persistence/Mapping/Driver/FileDriver.php +++ b/lib/Doctrine/Persistence/Mapping/Driver/FileDriver.php @@ -26,7 +26,7 @@ abstract class FileDriver implements MappingDriver /** @var FileLocator */ protected $locator; - /** @var ClassMetadata[]|null */ + /** @psalm-var ClassMetadata[]|null */ protected $classCache; /** @var string */ @@ -72,7 +72,7 @@ abstract class FileDriver implements MappingDriver * Gets the element of schema meta data for the class from the mapping file. * This will lazily load the mapping file if it is not loaded yet. * - * @return ClassMetadata The element of schema meta data. + * @psalm-return ClassMetadata The element of schema meta data. * * @throws MappingException */ @@ -129,7 +129,7 @@ abstract class FileDriver implements MappingDriver return $this->locator->getAllClassNames($this->globalBasename); } - /** @var array $classCache */ + /** @var array> $classCache */ $classCache = $this->classCache; /** @var array $keys */ @@ -148,6 +148,7 @@ abstract class FileDriver implements MappingDriver * @param string $file The mapping file to load. * * @return ClassMetadata[] + * @psalm-return array> */ abstract protected function loadMappingFile(string $file); diff --git a/lib/Doctrine/Persistence/Mapping/Driver/MappingDriver.php b/lib/Doctrine/Persistence/Mapping/Driver/MappingDriver.php index a584eab..423824e 100644 --- a/lib/Doctrine/Persistence/Mapping/Driver/MappingDriver.php +++ b/lib/Doctrine/Persistence/Mapping/Driver/MappingDriver.php @@ -14,6 +14,8 @@ interface MappingDriver /** * Loads the metadata for the specified class into the provided container. * + * @param ClassMetadata $metadata + * * @return void */ public function loadMetadataForClass(string $className, ClassMetadata $metadata); @@ -29,9 +31,9 @@ interface MappingDriver * Returns whether the class with the specified name should have its metadata loaded. * This is only the case if it is either mapped as an Entity or a MappedSuperclass. * - * @return bool - * * @psalm-param class-string $className + * + * @return bool */ public function isTransient(string $className); } diff --git a/lib/Doctrine/Persistence/Mapping/Driver/PHPDriver.php b/lib/Doctrine/Persistence/Mapping/Driver/PHPDriver.php index 70564ca..dbbbfc2 100644 --- a/lib/Doctrine/Persistence/Mapping/Driver/PHPDriver.php +++ b/lib/Doctrine/Persistence/Mapping/Driver/PHPDriver.php @@ -12,7 +12,7 @@ use Doctrine\Persistence\Mapping\ClassMetadata; */ class PHPDriver extends FileDriver { - /** @var ClassMetadata */ + /** @var ClassMetadata */ protected $metadata; /** diff --git a/lib/Doctrine/Persistence/Mapping/MappingException.php b/lib/Doctrine/Persistence/Mapping/MappingException.php index 256cd0f..2b50a77 100644 --- a/lib/Doctrine/Persistence/Mapping/MappingException.php +++ b/lib/Doctrine/Persistence/Mapping/MappingException.php @@ -52,7 +52,7 @@ class MappingException extends Exception return new self(sprintf( 'File mapping drivers must have a valid directory path, ' . 'however the given path %s seems to be incorrect!', - $path + (string) $path )); } diff --git a/lib/Doctrine/Persistence/Mapping/ProxyClassNameResolver.php b/lib/Doctrine/Persistence/Mapping/ProxyClassNameResolver.php new file mode 100644 index 0000000..2801d90 --- /dev/null +++ b/lib/Doctrine/Persistence/Mapping/ProxyClassNameResolver.php @@ -0,0 +1,19 @@ +>|class-string $className + * + * @psalm-return class-string + * + * @template T of object + */ + public function resolveClassName(string $className): string; +} diff --git a/lib/Doctrine/Persistence/Mapping/ReflectionService.php b/lib/Doctrine/Persistence/Mapping/ReflectionService.php index 4debcc6..d955a0e 100644 --- a/lib/Doctrine/Persistence/Mapping/ReflectionService.php +++ b/lib/Doctrine/Persistence/Mapping/ReflectionService.php @@ -18,56 +18,57 @@ interface ReflectionService /** * Returns an array of the parent classes (not interfaces) for the given class. * + * @psalm-param class-string $class + * * @return string[] + * @psalm-return class-string[] * * @throws MappingException - * - * @psalm-param class-string $class - * @psalm-return class-string[] */ public function getParentClasses(string $class); /** * Returns the shortname of a class. * - * @return string - * * @psalm-param class-string $class + * + * @return string */ public function getClassShortName(string $class); /** - * @return string - * * @psalm-param class-string $class + * + * @return string */ public function getClassNamespace(string $class); /** * Returns a reflection class instance or null. * + * @psalm-param class-string $class + * * @return ReflectionClass|null * * @template T of object - * @psalm-param class-string $class */ public function getClass(string $class); /** * Returns an accessible property (setAccessible(true)) or null. * - * @return ReflectionProperty|null - * * @psalm-param class-string $class + * + * @return ReflectionProperty|null */ public function getAccessibleProperty(string $class, string $property); /** * Checks if the class have a public method with the given name. * - * @return bool - * * @psalm-param class-string $class + * + * @return bool */ public function hasPublicMethod(string $class, string $method); } diff --git a/lib/Doctrine/Persistence/Mapping/RuntimeReflectionService.php b/lib/Doctrine/Persistence/Mapping/RuntimeReflectionService.php index b47d929..17bc743 100644 --- a/lib/Doctrine/Persistence/Mapping/RuntimeReflectionService.php +++ b/lib/Doctrine/Persistence/Mapping/RuntimeReflectionService.php @@ -12,6 +12,7 @@ use ReflectionMethod; use ReflectionProperty; use function array_key_exists; +use function assert; use function class_exists; use function class_parents; use function phpversion; @@ -39,7 +40,11 @@ class RuntimeReflectionService implements ReflectionService throw MappingException::nonExistingClass($class); } - return class_parents($class); + $parents = class_parents($class); + + assert($parents !== false); + + return $parents; } /** @@ -63,7 +68,11 @@ class RuntimeReflectionService implements ReflectionService } /** - * {@inheritDoc} + * @psalm-param class-string $class + * + * @return ReflectionClass + * + * @template T of object */ public function getClass(string $class) { diff --git a/lib/Doctrine/Persistence/Mapping/StaticReflectionService.php b/lib/Doctrine/Persistence/Mapping/StaticReflectionService.php index 4bc178b..09ecda6 100644 --- a/lib/Doctrine/Persistence/Mapping/StaticReflectionService.php +++ b/lib/Doctrine/Persistence/Mapping/StaticReflectionService.php @@ -4,8 +4,6 @@ declare(strict_types=1); namespace Doctrine\Persistence\Mapping; -use function assert; -use function is_int; use function strpos; use function strrev; use function strrpos; @@ -29,11 +27,10 @@ class StaticReflectionService implements ReflectionService */ public function getClassShortName(string $className) { - if (strpos($className, '\\') !== false) { - $pos = strrpos($className, '\\'); - assert(is_int($pos)); + $nsSeparatorLastPosition = strrpos($className, '\\'); - $className = substr($className, $pos + 1); + if ($nsSeparatorLastPosition !== false) { + $className = substr($className, $nsSeparatorLastPosition + 1); } return $className; @@ -47,10 +44,7 @@ class StaticReflectionService implements ReflectionService $namespace = ''; if (strpos($className, '\\') !== false) { - $pos = strpos(strrev($className), '\\'); - assert(is_int($pos)); - - $namespace = strrev(substr(strrev($className), $pos + 1)); + $namespace = strrev(substr(strrev($className), (int) strpos(strrev($className), '\\') + 1)); } return $namespace; diff --git a/lib/Doctrine/Persistence/ObjectManager.php b/lib/Doctrine/Persistence/ObjectManager.php index 293ddec..ab9b419 100644 --- a/lib/Doctrine/Persistence/ObjectManager.php +++ b/lib/Doctrine/Persistence/ObjectManager.php @@ -19,12 +19,12 @@ interface ObjectManager * * @param string $className The class name of the object to find. * @param mixed $id The identity of the object to find. + * @psalm-param class-string $className * * @return object|null The found object. + * @psalm-return T|null * * @template T of object - * @psalm-param class-string $className - * @psalm-return T|null */ public function find(string $className, $id): ?object; @@ -100,9 +100,11 @@ interface ObjectManager /** * Gets the repository for a class. * - * @template T of object * @psalm-param class-string $className + * * @psalm-return ObjectRepository + * + * @template T of object */ public function getRepository(string $className): ObjectRepository; @@ -111,11 +113,19 @@ interface ObjectManager * * The class name must be the fully-qualified class name without a leading backslash * (as it is returned by get_class($obj)). + * + * @psalm-param class-string $className + * + * @psalm-return ClassMetadata + * + * @template T of object */ public function getClassMetadata(string $className): ClassMetadata; /** * Gets the metadata factory used to gather the metadata of classes. + * + * @psalm-return ClassMetadataFactory> */ public function getMetadataFactory(): ClassMetadataFactory; diff --git a/lib/Doctrine/Persistence/ObjectManagerAware.php b/lib/Doctrine/Persistence/ObjectManagerAware.php index f557058..1db3dbf 100644 --- a/lib/Doctrine/Persistence/ObjectManagerAware.php +++ b/lib/Doctrine/Persistence/ObjectManagerAware.php @@ -24,6 +24,8 @@ interface ObjectManagerAware { /** * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @psalm-param ClassMetadata $classMetadata */ public function injectObjectManager( ObjectManager $objectManager, diff --git a/lib/Doctrine/Persistence/ObjectManagerDecorator.php b/lib/Doctrine/Persistence/ObjectManagerDecorator.php index 0c3a684..16fcf01 100644 --- a/lib/Doctrine/Persistence/ObjectManagerDecorator.php +++ b/lib/Doctrine/Persistence/ObjectManagerDecorator.php @@ -68,6 +68,9 @@ abstract class ObjectManagerDecorator implements ObjectManager return $this->wrapped->getClassMetadata($className); } + /** + * @psalm-return ClassMetadataFactory> + */ public function getMetadataFactory(): ClassMetadataFactory { return $this->wrapped->getMetadataFactory(); diff --git a/lib/Doctrine/Persistence/ObjectRepository.php b/lib/Doctrine/Persistence/ObjectRepository.php index c5feca0..eb5c3ed 100644 --- a/lib/Doctrine/Persistence/ObjectRepository.php +++ b/lib/Doctrine/Persistence/ObjectRepository.php @@ -19,7 +19,6 @@ interface ObjectRepository * @param mixed $id The identifier. * * @return object|null The object. - * * @psalm-return T|null */ public function find($id): ?object; @@ -28,7 +27,6 @@ interface ObjectRepository * Finds all objects in the repository. * * @return array The objects. - * * @psalm-return T[] */ public function findAll(): array; @@ -42,12 +40,12 @@ interface ObjectRepository * * @param array $criteria * @param array $orderBy + * @psalm-param array $orderBy * * @return array The objects. + * @psalm-return T[] * * @throws UnexpectedValueException - * - * @psalm-return T[] */ public function findBy( array $criteria, @@ -62,7 +60,6 @@ interface ObjectRepository * @param array $criteria The criteria. * * @return object|null The object. - * * @psalm-return T|null */ public function findOneBy(array $criteria): ?object; diff --git a/lib/Doctrine/Persistence/Proxy.php b/lib/Doctrine/Persistence/Proxy.php index 4f579bc..cdd08f6 100644 --- a/lib/Doctrine/Persistence/Proxy.php +++ b/lib/Doctrine/Persistence/Proxy.php @@ -6,6 +6,8 @@ namespace Doctrine\Persistence; /** * Interface for proxy classes. + * + * @template T of object */ interface Proxy { diff --git a/lib/Doctrine/Persistence/Reflection/TypedNoDefaultReflectionProperty.php b/lib/Doctrine/Persistence/Reflection/TypedNoDefaultReflectionProperty.php index 273a31a..bf7d102 100644 --- a/lib/Doctrine/Persistence/Reflection/TypedNoDefaultReflectionProperty.php +++ b/lib/Doctrine/Persistence/Reflection/TypedNoDefaultReflectionProperty.php @@ -4,8 +4,11 @@ declare(strict_types=1); namespace Doctrine\Persistence\Reflection; +use Closure; use ReflectionProperty; +use function assert; + /** * PHP Typed No Default Reflection Property - special override for typed properties without a default value. */ @@ -42,6 +45,7 @@ class TypedNoDefaultReflectionProperty extends ReflectionProperty unset($this->$propertyName); }; $unsetter = $unsetter->bindTo($object, $this->getDeclaringClass()->getName()); + $unsetter(); return; diff --git a/phpcs.xml.dist b/phpcs.xml.dist index f1427e8..62564ef 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -48,12 +48,4 @@ lib/Doctrine/Persistence/Mapping/MappingException.php - - - RuntimeReflectionServiceTest - - - - tests/Doctrine/Tests_PHP74/Persistence/Reflection/TypedNoDefaultReflectionPropertyTest.php - diff --git a/phpstan.neon b/phpstan.neon index c2a33b5..9109bae 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -20,29 +20,16 @@ parameters: - message: '#Parameter \#1 \$class of method Doctrine\\Persistence\\Mapping\\RuntimeReflectionService\:\:getParentClasses\(\) expects class\-string, string given\.#' path: 'tests/Doctrine/Tests/Persistence/Mapping/RuntimeReflectionServiceTest.php' - - - message: '#Parameter \#1 \$className of method Doctrine\\Persistence\\Mapping\\Driver\\MappingDriverChain\:\:isTransient\(\) expects class\-string, string given\.#' - path: 'tests/Doctrine/Tests/Persistence/Mapping/DriverChainTest.php' - - - message: '#Parameter \#1 \$className of method Doctrine\\Persistence\\Mapping\\Driver\\FileDriver\:\:isTransient\(\) expects class\-string, string given\.#' - path: 'tests/Doctrine/Tests/Persistence/Mapping/FileDriverTest.php' - message: '#Method Doctrine\\Tests\\Persistence\\Mapping\\TestClassMetadataFactory\:\:getFqcnFromAlias\(\) should return class\-string but returns string\.#' path: 'tests/Doctrine/Tests/Persistence/Mapping/TestClassMetadataFactory.php' + + - "#^Instantiated class Doctrine\\\\Common\\\\Cache\\\\ArrayCache not found\\.$#" + - - message: '#Method Doctrine\\Tests\\Persistence\\TestManagerRegistry\:\:getAliasNamespace\(\) should return class\-string but returns string\.#' - path: 'tests/Doctrine/Tests/Persistence/ManagerRegistryTest.php' - - - message: '#Method Doctrine\\Persistence\\Mapping\\AbstractClassMetadataFactory\:\:getRealClass\(\) should return class\-string but returns string\.#' - path: 'lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php' - - - message: '#Parameter \#1 \$class of method Doctrine\\Persistence\\Mapping\\AbstractClassMetadataFactory\:\:getRealClass\(\) expects class\-string, string given\.#' - path: 'lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php' - - - message: '#Parameter \#1 \$className of method Doctrine\\Persistence\\Mapping\\Driver\\MappingDriver\:\:isTransient\(\) expects class\-string, string given\.#' - path: 'lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php' - - - message: '#Parameter \#1 \$argument of class ReflectionClass constructor expects class\-string\\|T of object, string given\.#' + message: '#Method Doctrine\\Persistence\\AbstractManagerRegistry\:\:getRealClassName\(\) should return class\-string but returns string\.#' path: 'lib/Doctrine/Persistence/AbstractManagerRegistry.php' - + - + message: '#Call to static method PHPUnit\\Framework\\Assert\:\:assertSame\(\) with Symfony\\Component\\Cache\\Adapter\\ArrayAdapter and null will always evaluate to false\.#' + path: 'tests/Doctrine/Tests/Persistence/Mapping/ClassMetadataFactoryTest.php' diff --git a/psalm.xml b/psalm.xml index d92c344..c80b293 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,16 +1,17 @@ + + @@ -20,5 +21,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/Doctrine/Tests/Persistence/ManagerRegistryTest.php b/tests/Doctrine/Tests/Persistence/ManagerRegistryTest.php index 7fe1d40..cd29b52 100644 --- a/tests/Doctrine/Tests/Persistence/ManagerRegistryTest.php +++ b/tests/Doctrine/Tests/Persistence/ManagerRegistryTest.php @@ -205,6 +205,8 @@ class TestManagerRegistry extends AbstractManagerRegistry /** * {@inheritDoc} + * + * @psalm-param class-string $proxyInterfaceName */ public function __construct( string $name, diff --git a/tests/Doctrine/Tests/Persistence/Mapping/AnnotationDriverTest.php b/tests/Doctrine/Tests/Persistence/Mapping/AnnotationDriverTest.php index 64f8c4e..0360c43 100644 --- a/tests/Doctrine/Tests/Persistence/Mapping/AnnotationDriverTest.php +++ b/tests/Doctrine/Tests/Persistence/Mapping/AnnotationDriverTest.php @@ -88,8 +88,8 @@ class AnnotationDriverTest extends TestCase class SimpleAnnotationDriver extends AnnotationDriver { - /** @var array */ - protected $entityAnnotationClasses = [Entity::class => 1]; + /** @var array */ + protected $entityAnnotationClasses = [Entity::class => true]; public function loadMetadataForClass(string $className, ClassMetadata $metadata): void { diff --git a/tests/Doctrine/Tests/Persistence/Mapping/ClassMetadataFactoryTest.php b/tests/Doctrine/Tests/Persistence/Mapping/ClassMetadataFactoryTest.php index 6ebff94..473768b 100644 --- a/tests/Doctrine/Tests/Persistence/Mapping/ClassMetadataFactoryTest.php +++ b/tests/Doctrine/Tests/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -6,41 +6,63 @@ namespace Doctrine\Tests\Persistence\Mapping; use Doctrine\Common\Cache\ArrayCache; use Doctrine\Common\Cache\Cache; +use Doctrine\Common\Cache\Psr6\DoctrineProvider; +use Doctrine\Persistence\Mapping\AbstractClassMetadataFactory; use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\Mapping\Driver\MappingDriver; use Doctrine\Persistence\Mapping\MappingException; use Doctrine\Tests\DoctrineTestCase; +use Psr\Cache\CacheItemInterface; +use Psr\Cache\CacheItemPoolInterface; +use ReflectionMethod; use stdClass; +use Symfony\Component\Cache\Adapter\ArrayAdapter; use function assert; +use function class_exists; /** * @covers \Doctrine\Persistence\Mapping\AbstractClassMetadataFactory */ class ClassMetadataFactoryTest extends DoctrineTestCase { - /** @var TestClassMetadataFactory */ + /** @var TestClassMetadataFactory> */ private $cmf; protected function setUp(): void { $driver = $this->createMock(MappingDriver::class); + + /** @psalm-var ClassMetadata */ $metadata = $this->createMock(ClassMetadata::class); $this->cmf = new TestClassMetadataFactory($driver, $metadata); } - public function testGetCacheDriver(): void + public function testSetGetCacheDriver(): void { self::assertNull($this->cmf->getCacheDriver()); + self::assertNull(self::getCache($this->cmf)); - $cache = new ArrayCache(); - + $cache = $this->getArrayCache(); $this->cmf->setCacheDriver($cache); - $cacheDriver = $this->cmf->getCacheDriver(); - assert($cacheDriver instanceof ArrayCache); + self::assertSame($cache, $this->cmf->getCacheDriver()); + self::assertInstanceOf(CacheItemPoolInterface::class, self::getCache($this->cmf)); - self::assertSame($cache, $cacheDriver); + $this->cmf->setCacheDriver(null); + self::assertNull($this->cmf->getCacheDriver()); + self::assertNull(self::getCache($this->cmf)); + } + + public function testSetGetCache(): void + { + self::assertNull(self::getCache($this->cmf)); + self::assertNull($this->cmf->getCacheDriver()); + + $cache = new ArrayAdapter(); + $this->cmf->setCache($cache); + self::assertSame($cache, self::getCache($this->cmf)); + self::assertInstanceOf(DoctrineProvider::class, $this->cmf->getCacheDriver()); } public function testGetMetadataFor(): void @@ -67,22 +89,26 @@ class ClassMetadataFactoryTest extends DoctrineTestCase public function testGetCachedMetadata(): void { $metadata = $this->createMock(ClassMetadata::class); - $cache = new ArrayCache(); - $cache->save(ChildEntity::class . '$CLASSMETADATA', $metadata); + $cache = new ArrayAdapter(); + $item = $cache->getItem($this->cmf->getCacheKey(ChildEntity::class)); + $item->set($metadata); + $cache->save($item); - $this->cmf->setCacheDriver($cache); + $this->cmf->setCache($cache); - self::assertSame($metadata, $this->cmf->getMetadataFor(ChildEntity::class)); + self::assertEquals($metadata, $this->cmf->getMetadataFor(ChildEntity::class)); } public function testCacheGetMetadataFor(): void { - $cache = new ArrayCache(); - $this->cmf->setCacheDriver($cache); + $cache = new ArrayAdapter(); + $this->cmf->setCache($cache); $loadedMetadata = $this->cmf->getMetadataFor(ChildEntity::class); - self::assertSame($loadedMetadata, $cache->fetch(ChildEntity::class . '$CLASSMETADATA')); + $item = $cache->getItem($this->cmf->getCacheKey(ChildEntity::class)); + self::assertTrue($item->isHit()); + self::assertEquals($loadedMetadata, $item->get()); } public function testGetAliasedMetadata(): void @@ -122,9 +148,7 @@ class ClassMetadataFactoryTest extends DoctrineTestCase return $classMetadata; }; - $fooClassMetadata = $this->cmf->getMetadataFor('Foo'); - - self::assertSame($classMetadata, $fooClassMetadata); + self::assertSame($classMetadata, $this->cmf->getMetadataFor('Foo')); } public function testWillFailOnFallbackFailureWithNotLoadedMetadata(): void @@ -144,33 +168,103 @@ class ClassMetadataFactoryTest extends DoctrineTestCase */ public function testWillIgnoreCacheEntriesThatAreNotMetadataInstances(): void { - $cacheDriver = $this->createMock(Cache::class); + $key = $this->cmf->getCacheKey(RootEntity::class); - $this->cmf->setCacheDriver($cacheDriver); + $metadata = $this->cmf->metadata; - $cacheDriver->expects(self::once())->method('fetch')->with('Foo$CLASSMETADATA')->willReturn(new stdClass()); + $item = $this->createMock(CacheItemInterface::class); - $metadata = $this->createMock(ClassMetadata::class); + $item + ->method('getKey') + ->willReturn($key); + $item + ->method('get') + ->willReturn(new stdClass()); + $item + ->expects(self::once()) + ->method('set') + ->with($metadata); - $fallbackCallback = new class ($metadata) { - /** @var ClassMetadata */ - private $metadata; + $cacheDriver = $this->createMock(CacheItemPoolInterface::class); + $cacheDriver + ->method('getItem') + ->with($key) + ->willReturn($item); + $cacheDriver + ->expects(self::once()) + ->method('getItems') + ->with([$key]) + ->willReturn([$item]); + $cacheDriver + ->expects(self::once()) + ->method('saveDeferred') + ->with($item); + $cacheDriver + ->expects(self::once()) + ->method('commit'); - public function __construct(ClassMetadata $metadata) - { - $this->metadata = $metadata; - } + $this->cmf->setCache($cacheDriver); - public function __invoke(): ClassMetadata - { - return $this->metadata; - } + self::assertSame($metadata, $this->cmf->getMetadataFor(RootEntity::class)); + } + + public function testWillNotCacheFallbackMetadata(): void + { + $key = $this->cmf->getCacheKey('Foo'); + + $metadata = $this->cmf->metadata; + + $item = $this->createMock(CacheItemInterface::class); + + $item + ->method('get') + ->willReturn(null); + $item + ->expects(self::never()) + ->method('set'); + + $cacheDriver = $this->createMock(CacheItemPoolInterface::class); + $cacheDriver + ->expects(self::once()) + ->method('getItem') + ->with($key) + ->willReturn($item); + $cacheDriver + ->expects(self::never()) + ->method('saveDeferred'); + $cacheDriver + ->expects(self::never()) + ->method('commit'); + + $this->cmf->setCache($cacheDriver); + + $this->cmf->fallbackCallback = static function () use ($metadata): ClassMetadata { + return $metadata; }; - $this->cmf->fallbackCallback = $fallbackCallback; - self::assertSame($metadata, $this->cmf->getMetadataFor('Foo')); } + + /** + * @psalm-param AbstractClassMetadataFactory> $classMetadataFactory + */ + private static function getCache(AbstractClassMetadataFactory $classMetadataFactory): ?CacheItemPoolInterface + { + $method = new ReflectionMethod($classMetadataFactory, 'getCache'); + $method->setAccessible(true); + + return $method->invoke($classMetadataFactory); + } + + private function getArrayCache(): Cache + { + $cache = class_exists(DoctrineProvider::class) + ? DoctrineProvider::wrap(new ArrayAdapter()) + : new ArrayCache(); + assert($cache instanceof Cache); + + return $cache; + } } class RootEntity diff --git a/tests/Doctrine/Tests/Persistence/Mapping/DriverChainTest.php b/tests/Doctrine/Tests/Persistence/Mapping/DriverChainTest.php index c020810..f0af449 100644 --- a/tests/Doctrine/Tests/Persistence/Mapping/DriverChainTest.php +++ b/tests/Doctrine/Tests/Persistence/Mapping/DriverChainTest.php @@ -9,6 +9,9 @@ use Doctrine\Persistence\Mapping\Driver\MappingDriver; use Doctrine\Persistence\Mapping\Driver\MappingDriverChain; use Doctrine\Persistence\Mapping\MappingException; use Doctrine\Tests\DoctrineTestCase; +use Doctrine\Tests\Persistence\Mapping\Fixtures\Manager\Manager; +use Doctrine\Tests\Persistence\Mapping\Fixtures\Model; +use stdClass; class DriverChainTest extends DoctrineTestCase { @@ -26,13 +29,13 @@ class DriverChainTest extends DoctrineTestCase ->method('isTransient'); $driver2 = $this->createMock(MappingDriver::class); - $driver2->expects(self::at(0)) + $driver2->expects(self::once()) ->method('loadMetadataForClass') ->with(self::equalTo($className), self::equalTo($classMetadata)); - $driver2->expects(self::at(1)) + $driver2->expects(self::once()) ->method('isTransient') ->with(self::equalTo($className)) - ->will(self::returnValue(true)); + ->willReturn(true); $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); $chain->addDriver($driver2, 'Doctrine\Tests\Persistence\Mapping'); @@ -86,7 +89,7 @@ class DriverChainTest extends DoctrineTestCase $chain = new MappingDriverChain(); $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); - self::assertTrue($chain->isTransient('stdClass'), 'stdClass isTransient'); + self::assertTrue($chain->isTransient(stdClass::class), 'stdClass isTransient'); } /** @@ -96,8 +99,8 @@ class DriverChainTest extends DoctrineTestCase { $companyDriver = $this->createMock(MappingDriver::class); $defaultDriver = $this->createMock(MappingDriver::class); - $entityClassName = DriverChainEntity::class; - $managerClassName = 'Doctrine\Tests\Models\Company\CompanyManager'; + $entityClassName = Model::class; + $managerClassName = Manager::class; $chain = new MappingDriverChain(); $companyDriver->expects(self::never()) @@ -117,7 +120,7 @@ class DriverChainTest extends DoctrineTestCase self::assertNull($chain->getDefaultDriver()); $chain->setDefaultDriver($defaultDriver); - $chain->addDriver($companyDriver, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($companyDriver, 'Doctrine\Tests\Persistence\Mapping\Fixtures\Manager'); $driver = $chain->getDefaultDriver(); diff --git a/tests/Doctrine/Tests/Persistence/Mapping/FileDriverTest.php b/tests/Doctrine/Tests/Persistence/Mapping/FileDriverTest.php index cbc6b72..a5977b0 100644 --- a/tests/Doctrine/Tests/Persistence/Mapping/FileDriverTest.php +++ b/tests/Doctrine/Tests/Persistence/Mapping/FileDriverTest.php @@ -8,7 +8,12 @@ use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\Mapping\Driver\FileDriver; use Doctrine\Persistence\Mapping\Driver\FileLocator; use Doctrine\Tests\DoctrineTestCase; +use Doctrine\Tests\Persistence\Mapping\Fixtures\AnotherGlobalClass; +use Doctrine\Tests\Persistence\Mapping\Fixtures\GlobalClass; +use Doctrine\Tests\Persistence\Mapping\Fixtures\NotLoadedClass; +use Doctrine\Tests\Persistence\Mapping\Fixtures\TestClassMetadata; use PHPUnit\Framework\MockObject\MockObject; +use stdClass; use function strpos; @@ -31,9 +36,9 @@ class FileDriverTest extends DoctrineTestCase $driver->setGlobalBasename('global'); - $element = $driver->getElement('stdGlobal'); + $element = $driver->getElement(GlobalClass::class); - self::assertSame($driver->stdGlobal, $element); + self::assertSame(GlobalClass::class, $element->getName()); } public function testGetElementFromFile(): void @@ -41,12 +46,12 @@ class FileDriverTest extends DoctrineTestCase $locator = $this->newLocator(); $locator->expects(self::once()) ->method('findMappingFile') - ->with(self::equalTo('stdClass')) + ->with(self::equalTo(stdClass::class)) ->will(self::returnValue(__DIR__ . '/_files/stdClass.yml')); $driver = $this->createTestFileDriver($locator); - self::assertSame($driver->stdClass, $driver->getElement('stdClass')); + self::assertSame(stdClass::class, $driver->getElement(stdClass::class)->getName()); } public function testGetElementUpdatesClassCache(): void @@ -56,29 +61,32 @@ class FileDriverTest extends DoctrineTestCase // findMappingFile should only be called once $locator->expects(self::once()) ->method('findMappingFile') - ->with(self::equalTo('stdClass')) + ->with(self::equalTo(stdClass::class)) ->will(self::returnValue(__DIR__ . '/_files/stdClass.yml')); $driver = $this->createTestFileDriver($locator); // not cached - self::assertSame($driver->stdClass, $driver->getElement('stdClass')); + self::assertSame(stdClass::class, $driver->getElement(stdClass::class)->getName()); // cached call - self::assertSame($driver->stdClass, $driver->getElement('stdClass')); + self::assertSame(stdClass::class, $driver->getElement(stdClass::class)->getName()); } public function testGetAllClassNamesGlobalBasename(): void { $locator = $this->newLocator(); - $locator->expects(self::any())->method('getAllClassNames')->with('global')->will(self::returnValue(['stdGlobal', 'stdGlobal2'])); + $locator->expects(self::any())->method('getAllClassNames')->with('global')->will(self::returnValue([ + GlobalClass::class, + AnotherGlobalClass::class, + ])); $driver = $this->createTestFileDriver($locator); $driver->setGlobalBasename('global'); $classNames = $driver->getAllClassNames(); - self::assertSame(['stdGlobal', 'stdGlobal2'], $classNames); + self::assertSame([GlobalClass::class, AnotherGlobalClass::class], $classNames); } public function testGetAllClassNamesFromMappingFile(): void @@ -86,14 +94,13 @@ class FileDriverTest extends DoctrineTestCase $locator = $this->newLocator(); $locator->expects(self::any()) ->method('getAllClassNames') - ->with(self::equalTo('')) - ->will(self::returnValue(['stdClass'])); - - $driver = $this->createTestFileDriver($locator); + ->with(self::equalTo(null)) + ->will(self::returnValue([stdClass::class])); + $driver = new TestFileDriver($locator); $classNames = $driver->getAllClassNames(); - self::assertSame(['stdClass'], $classNames); + self::assertSame([stdClass::class], $classNames); } public function testGetAllClassNamesBothSources(): void @@ -102,14 +109,13 @@ class FileDriverTest extends DoctrineTestCase $locator->expects(self::any()) ->method('getAllClassNames') ->with(self::equalTo('global')) - ->will(self::returnValue(['stdClass'])); - - $driver = $this->createTestFileDriver($locator); + ->will(self::returnValue([stdClass::class])); + $driver = new TestFileDriver($locator); $driver->setGlobalBasename('global'); $classNames = $driver->getAllClassNames(); - self::assertSame(['stdGlobal', 'stdGlobal2', 'stdClass'], $classNames); + self::assertSame([GlobalClass::class, AnotherGlobalClass::class, stdClass::class], $classNames); } public function testGetAllClassNamesBothSourcesNoDupes(): void @@ -118,20 +124,18 @@ class FileDriverTest extends DoctrineTestCase $locator->expects(self::once()) ->method('getAllClassNames') ->with(self::equalTo('global')) - ->willReturn(['stdClass']); - - $driver = $this->createTestFileDriver($locator); - $driver->setGlobalBasename('global'); - + ->willReturn([stdClass::class]); $locator->expects(self::once()) ->method('findMappingFile') - ->with('stdClass') - ->willReturn(''); + ->with(self::equalTo(stdClass::class)) + ->will(self::returnValue(__DIR__ . '/_files/stdClass.yml')); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename('global'); - $driver->getElement('stdClass'); + $driver->getElement(stdClass::class); $classNames = $driver->getAllClassNames(); - self::assertSame(['stdGlobal', 'stdGlobal2', 'stdClass'], $classNames); + self::assertSame([GlobalClass::class, AnotherGlobalClass::class, stdClass::class], $classNames); } public function testIsNotTransient(): void @@ -139,15 +143,15 @@ class FileDriverTest extends DoctrineTestCase $locator = $this->newLocator(); $locator->expects(self::once()) ->method('fileExists') - ->with(self::equalTo('stdClass')) + ->with(self::equalTo(stdClass::class)) ->will(self::returnValue(true)); $driver = $this->createTestFileDriver($locator); $driver->setGlobalBasename('global'); - self::assertFalse($driver->isTransient('stdClass')); - self::assertFalse($driver->isTransient('stdGlobal')); - self::assertFalse($driver->isTransient('stdGlobal2')); + self::assertFalse($driver->isTransient(stdClass::class)); + self::assertFalse($driver->isTransient(GlobalClass::class)); + self::assertFalse($driver->isTransient(AnotherGlobalClass::class)); } public function testIsTransient(): void @@ -155,19 +159,19 @@ class FileDriverTest extends DoctrineTestCase $locator = $this->newLocator(); $locator->expects(self::once()) ->method('fileExists') - ->with(self::equalTo('stdClass2')) + ->with(self::equalTo(NotLoadedClass::class)) ->will(self::returnValue(false)); $driver = $this->createTestFileDriver($locator); - self::assertTrue($driver->isTransient('stdClass2')); + self::assertTrue($driver->isTransient(NotLoadedClass::class)); } public function testNonLocatorFallback(): void { - $driver = $this->createTestFileDriver(__DIR__ . '/_files', '.yml'); - self::assertTrue($driver->isTransient('stdClass2')); - self::assertFalse($driver->isTransient('stdClass')); + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + self::assertTrue($driver->isTransient(NotLoadedClass::class)); + self::assertFalse($driver->isTransient(stdClass::class)); } /** @@ -199,13 +203,13 @@ class FileDriverTest extends DoctrineTestCase class TestFileDriver extends FileDriver { - /** @var ClassMetadata */ + /** @var ClassMetadata */ public $stdGlobal; - /** @var ClassMetadata */ + /** @var ClassMetadata */ public $stdGlobal2; - /** @var ClassMetadata */ + /** @var ClassMetadata */ public $stdClass; /** @@ -215,14 +219,17 @@ class TestFileDriver extends FileDriver { if (strpos($file, 'global.yml') !== false) { return [ - 'stdGlobal' => $this->stdGlobal, - 'stdGlobal2' => $this->stdGlobal2, + GlobalClass::class => new TestClassMetadata(GlobalClass::class), + AnotherGlobalClass::class => new TestClassMetadata(AnotherGlobalClass::class), ]; } - return ['stdClass' => $this->stdClass]; + return [stdClass::class => new TestClassMetadata(stdClass::class)]; } + /** + * @param ClassMetadata $metadata + */ public function loadMetadataForClass(string $className, ClassMetadata $metadata): void { } diff --git a/tests/Doctrine/Tests/Persistence/Mapping/Fixtures/AnotherGlobalClass.php b/tests/Doctrine/Tests/Persistence/Mapping/Fixtures/AnotherGlobalClass.php new file mode 100644 index 0000000..5f20aec --- /dev/null +++ b/tests/Doctrine/Tests/Persistence/Mapping/Fixtures/AnotherGlobalClass.php @@ -0,0 +1,9 @@ + + */ +final class TestClassMetadata implements ClassMetadata +{ + /** + * @var string + * @psalm-var class-string + */ + private $className; + + /** + * @psalm-param class-string $className + */ + public function __construct(string $className) + { + $this->className = $className; + } + + public function getName(): string + { + return $this->className; + } + + /** + * {@inheritDoc} + */ + public function getIdentifier(): array + { + return ['id']; + } + + public function getReflectionClass(): ReflectionClass + { + return new ReflectionClass($this->getName()); + } + + /** + * {@inheritDoc} + */ + public function isIdentifier(string $fieldName): bool + { + return false; + } + + /** + * {@inheritDoc} + */ + public function hasField(string $fieldName): bool + { + return false; + } + + /** + * {@inheritDoc} + */ + public function hasAssociation(string $fieldName) + { + return false; + } + + /** + * {@inheritDoc} + */ + public function isSingleValuedAssociation(string $fieldName) + { + return false; + } + + /** + * {@inheritDoc} + */ + public function isCollectionValuedAssociation(string $fieldName) + { + return false; + } + + /** + * {@inheritDoc} + */ + public function getFieldNames(): array + { + return []; + } + + /** + * {@inheritDoc} + */ + public function getIdentifierFieldNames(): array + { + return []; + } + + /** + * {@inheritDoc} + */ + public function getAssociationNames(): array + { + return []; + } + + /** + * {@inheritDoc} + */ + public function getTypeOfField(string $fieldName) + { + throw new LogicException('Not implemented'); + } + + /** + * {@inheritDoc} + */ + public function getAssociationTargetClass(string $assocName) + { + throw new LogicException('Not implemented'); + } + + public function isAssociationInverseSide(string $assocName): bool + { + return false; + } + + /** + * {@inheritDoc} + */ + public function getAssociationMappedByTargetField(string $assocName) + { + throw new LogicException('Not implemented'); + } + + /** + * {@inheritDoc} + */ + public function getIdentifierValues(object $object): array + { + return []; + } +} diff --git a/tests/Doctrine/Tests/Persistence/Mapping/StaticPHPDriverTest.php b/tests/Doctrine/Tests/Persistence/Mapping/StaticPHPDriverTest.php index ce7ef7d..60151f7 100644 --- a/tests/Doctrine/Tests/Persistence/Mapping/StaticPHPDriverTest.php +++ b/tests/Doctrine/Tests/Persistence/Mapping/StaticPHPDriverTest.php @@ -30,6 +30,9 @@ class StaticPHPDriverTest extends DoctrineTestCase class TestEntity { + /** + * @psalm-param ClassMetadata $metadata + */ public static function loadMetadata(ClassMetadata $metadata): void { $metadata->getFieldNames(); diff --git a/tests/Doctrine/Tests/Persistence/Mapping/TestClassMetadataFactory.php b/tests/Doctrine/Tests/Persistence/Mapping/TestClassMetadataFactory.php index fe8f97a..264c35b 100644 --- a/tests/Doctrine/Tests/Persistence/Mapping/TestClassMetadataFactory.php +++ b/tests/Doctrine/Tests/Persistence/Mapping/TestClassMetadataFactory.php @@ -9,17 +9,27 @@ use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\Mapping\Driver\MappingDriver; use Doctrine\Persistence\Mapping\ReflectionService; +/** + * @template CMTemplate of ClassMetadata + * @template-extends AbstractClassMetadataFactory + */ class TestClassMetadataFactory extends AbstractClassMetadataFactory { /** @var MappingDriver */ public $driver; - /** @var ClassMetadata */ + /** + * @var ClassMetadata + * @psalm-var CMTemplate + */ public $metadata; /** @var callable|null */ public $fallbackCallback; + /** + * @psalm-param CMTemplate $metadata + */ public function __construct(MappingDriver $driver, ClassMetadata $metadata) { $this->driver = $driver; @@ -39,6 +49,7 @@ class TestClassMetadataFactory extends AbstractClassMetadataFactory protected function getFqcnFromAlias(string $namespaceAlias, string $simpleClassName): string { + /** @psalm-var class-string */ return __NAMESPACE__ . '\\' . $simpleClassName; } @@ -84,4 +95,9 @@ class TestClassMetadataFactory extends AbstractClassMetadataFactory return $class !== $name; } + + public function getCacheKey(string $realClassName): string + { + return parent::getCacheKey($realClassName); + } } diff --git a/tests/Doctrine/Tests/Persistence/ObjectManagerDecoratorTest.php b/tests/Doctrine/Tests/Persistence/ObjectManagerDecoratorTest.php index 836bbcf..f7778f3 100644 --- a/tests/Doctrine/Tests/Persistence/ObjectManagerDecoratorTest.php +++ b/tests/Doctrine/Tests/Persistence/ObjectManagerDecoratorTest.php @@ -14,7 +14,7 @@ use PHPUnit\Framework\TestCase; class ObjectManagerDecoratorTest extends TestCase { - /** @var ObjectManager|MockObject */ + /** @var MockObject&ObjectManager */ private $wrapped; /** @var NullObjectManagerDecorator */ @@ -182,7 +182,7 @@ class ObjectManagerDecoratorTest extends TestCase class NullObjectManagerDecorator extends ObjectManagerDecorator { /** - * @param ObjectManager|MockObject $wrapped + * @psalm-param ObjectManager&MockObject $wrapped */ public function __construct(ObjectManager $wrapped) { diff --git a/tests/Doctrine/Tests/Persistence/RuntimePublicReflectionPropertyTest.php b/tests/Doctrine/Tests/Persistence/RuntimePublicReflectionPropertyTest.php index e62724d..5af099d 100644 --- a/tests/Doctrine/Tests/Persistence/RuntimePublicReflectionPropertyTest.php +++ b/tests/Doctrine/Tests/Persistence/RuntimePublicReflectionPropertyTest.php @@ -143,7 +143,6 @@ class RuntimePublicReflectionPropertyTestProxyMock implements Proxy * * @return mixed[] Keys are the property names, and values are the default * values for those properties. - * * @phpstan-return array */ public function __getLazyProperties()