diff --git a/.github/logo.svg b/.github/logo.svg index f2fdc94..4891e4b 100644 --- a/.github/logo.svg +++ b/.github/logo.svg @@ -1,61 +1,61 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore index 35ed9b4..bb9187c 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ # Static utilities .php_cs.cache +cghooks.lock + diff --git a/composer.json b/composer.json index d7586aa..a1c2a1a 100644 --- a/composer.json +++ b/composer.json @@ -16,10 +16,23 @@ "issues": "https://github.com/rich-id/terms-module/issues" }, "require": { - "php": ">=7.3", - "richcongress/bundle-toolbox": "^1.0" + "php": ">=7.3|^8.0", + "doctrine/migrations": "^3.0", + "doctrine/orm": "^2.7", + "friendsofsymfony/ckeditor-bundle": "^2.3", + "psr/log": "^1.1", + "richcongress/bundle-toolbox": "*", + "sensio/framework-extra-bundle": "^5.0|^6.0", + "symfony/form": "^4.0|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/routing": "^4.0|^5.0", + "symfony/security-bundle": "^4.0|^5.0", + "symfony/translation": "^4.0|^5.0", + "symfony/twig-bundle": "^4.0|^5.0", + "symfony/validator": "^4.0|^5.0" }, "require-dev": { + "doctrine/doctrine-bundle": "^2.0", "phpunit/phpunit": "^8.5", "richcongress/static-analysis": "^0.1", "richcongress/test-suite": "^0.1", diff --git a/composer.lock b/composer.lock index 15bbffe..fb5750c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,82 +4,44 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f9b04524081a0cb95334a3f3f44f2c28", + "content-hash": "43b5fc4dd509508caa6280de6194cf0e", "packages": [ { - "name": "psr/container", - "version": "1.1.1", + "name": "composer/package-versions-deprecated", + "version": "1.11.99.2", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c6522afe5540d5fc46675043d3ed5a45a740b27c", + "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c", "shasum": "" }, "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://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/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" + "replace": { + "ocramius/package-versions": "1.11.99" }, - "require": { - "php": ">=5.3.0" + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" }, - "type": "library", + "type": "composer-plugin", "extra": { + "class": "PackageVersions\\Installer", "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "PackageVersions\\": "src/PackageVersions" } }, "notification-url": "https://packagist.org/downloads/", @@ -88,50 +50,66 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.2" }, - "time": "2021-05-03T11:20:27+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-05-24T07:46:03+00:00" }, { - "name": "richcongress/bundle-toolbox", - "version": "v1.1.1", + "name": "doctrine/annotations", + "version": "1.13.1", "source": { "type": "git", - "url": "https://github.com/richcongress/bundle-toolbox.git", - "reference": "c35f39efb84de16bf8287891355ffeae15b31ed5" + "url": "https://github.com/doctrine/annotations.git", + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/richcongress/bundle-toolbox/zipball/c35f39efb84de16bf8287891355ffeae15b31ed5", - "reference": "c35f39efb84de16bf8287891355ffeae15b31ed5", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/config": "^3.0 || ^4.0 || ^5.0", - "symfony/dependency-injection": "^3.0 || ^4.0 || ^5.0", - "symfony/http-kernel": "^3.0 || ^4.0 || ^5.0" + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "phpunit/phpunit": "^7.5", - "roave/security-advisories": "dev-master" + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" }, - "type": "symfony-bundle", + "type": "library", "autoload": { "psr-4": { - "RichCongress\\BundleToolbox\\": "" + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", @@ -140,58 +118,78 @@ ], "authors": [ { - "name": "RichCongress", - "homepage": "https://www.richcongress.com" + "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": "A set of classes and tools to quickly build a bundle", + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], "support": { - "issues": "https://github.com/richcongress/bundle-toolbox/issues", - "source": "https://github.com/richcongress/bundle-toolbox/tree/master" + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.13.1" }, - "time": "2020-06-29T16:35:48+00:00" + "time": "2021-05-16T18:07:53+00:00" }, { - "name": "symfony/config", - "version": "v4.4.25", + "name": "doctrine/cache", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "2803882bb10353d277d4539635dd688a053d571c" + "url": "https://github.com/doctrine/cache.git", + "reference": "c9622c6820d3ede1e2315a6a377ea1076e421d88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/2803882bb10353d277d4539635dd688a053d571c", - "reference": "2803882bb10353d277d4539635dd688a053d571c", + "url": "https://api.github.com/repos/doctrine/cache/zipball/c9622c6820d3ede1e2315a6a377ea1076e421d88", + "reference": "c9622c6820d3ede1e2315a6a377ea1076e421d88", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php81": "^1.22" + "php": "~7.1 || ^8.0" }, "conflict": { - "symfony/finder": "<3.4" + "doctrine/common": ">2.2,<2.4", + "psr/cache": ">=3" }, "require-dev": { - "symfony/event-dispatcher": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/messenger": "^4.1|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" + "alcaeus/mongo-php-adapter": "^1.1", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0", + "symfony/cache": "^4.4 || ^5.2" }, "suggest": { - "symfony/yaml": "To use the yaml reference dumper" + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -199,68 +197,87 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "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": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.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": { - "source": "https://github.com/symfony/config/tree/v4.4.25" + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", "type": "tidelift" } ], - "time": "2021-05-26T11:20:16+00:00" + "time": "2021-05-25T09:43:04+00:00" }, { - "name": "symfony/debug", - "version": "v4.4.25", + "name": "doctrine/collections", + "version": "1.6.7", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "a8d2d5c94438548bff9f998ca874e202bb29d07f" + "url": "https://github.com/doctrine/collections.git", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/a8d2d5c94438548bff9f998ca874e202bb29d07f", - "reference": "a8d2d5c94438548bff9f998ca874e202bb29d07f", + "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/http-kernel": "<3.4" + "php": "^7.1.3 || ^8.0" }, "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "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": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -268,84 +285,72 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to ease debugging PHP code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/debug/tree/v4.4.25" - }, - "funding": [ + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, { - "url": "https://symfony.com/sponsor", - "type": "custom" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "url": "https://github.com/fabpot", - "type": "github" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "time": "2021-05-26T17:39:37+00:00" + "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": "symfony/dependency-injection", - "version": "v4.4.25", + "name": "doctrine/common", + "version": "3.1.2", "source": { "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "2ed2a0a6c960bf4e2e862ec77b2f2c558b83c64d" + "url": "https://github.com/doctrine/common.git", + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ed2a0a6c960bf4e2e862ec77b2f2c558b83c64d", - "reference": "2ed2a0a6c960bf4e2e862ec77b2f2c558b83c64d", + "url": "https://api.github.com/repos/doctrine/common/zipball/a036d90c303f3163b5be8b8fde9b6755b2be4a3a", + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/container": "^1.0", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/config": "<4.3|>=5.0", - "symfony/finder": "<3.4", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<3.4" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0|2.0" + "doctrine/persistence": "^2.0", + "php": "^7.1 || ^8.0" }, "require-dev": { - "symfony/config": "^4.3", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" + "doctrine/coding-standard": "^6.0 || ^8.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5", + "vimeo/psalm": "^4.4" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Common\\": "lib/Doctrine/Common" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -353,135 +358,99 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v4.4.25" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, { - "url": "https://github.com/fabpot", - "type": "github" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-26T17:54:16+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.1.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2021-02-10T20:18:51+00:00" }, { - "name": "symfony/error-handler", - "version": "v4.4.25", + "name": "doctrine/dbal", + "version": "2.13.2", "source": { "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "310a756cec00d29d89a08518405aded046a54a8b" + "url": "https://github.com/doctrine/dbal.git", + "reference": "8dd39d2ead4409ce652fd4f02621060f009ea5e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/310a756cec00d29d89a08518405aded046a54a8b", - "reference": "310a756cec00d29d89a08518405aded046a54a8b", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/8dd39d2ead4409ce652fd4f02621060f009ea5e4", + "reference": "8dd39d2ead4409ce652fd4f02621060f009ea5e4", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/debug": "^4.4.5", - "symfony/polyfill-php80": "^1.15", - "symfony/var-dumper": "^4.4|^5.0" + "doctrine/cache": "^1.0|^2.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1 || ^8" }, "require-dev": { - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2020.2", + "phpstan/phpstan": "0.12.81", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.5", + "squizlabs/php_codesniffer": "3.6.0", + "symfony/cache": "^4.4", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "4.6.4" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." }, + "bin": [ + "bin/doctrine-dbal" + ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -489,152 +458,141 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" } ], - "description": "Provides tools to manage errors and ease debugging PHP code", - "homepage": "https://symfony.com", + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], "support": { - "source": "https://github.com/symfony/error-handler/tree/v4.4.25" + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", "type": "tidelift" } ], - "time": "2021-05-26T17:39:37+00:00" + "time": "2021-06-18T21:48:39+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v4.4.25", + "name": "doctrine/deprecations", + "version": "v0.5.3", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/047773e7016e4fd45102cedf4bd2558ae0d0c32f", - "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" - }, - "conflict": { - "symfony/dependency-injection": "<3.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" + "php": "^7.1|^8.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "~3.4|~4.4", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" + "doctrine/coding-standard": "^6.0|^7.0|^8.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "psr/log": "^1.0" }, "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.25" + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-26T17:39:37+00:00" + "time": "2021-03-21T12:59:47+00:00" }, { - "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.9", + "name": "doctrine/event-manager", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" + "url": "https://github.com/doctrine/event-manager.git", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": "^7.1 || ^8.0" }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" + "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.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" + "Doctrine\\Common\\": "lib/Doctrine/Common" } }, "notification-url": "https://packagist.org/downloads/", @@ -643,69 +601,93 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "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": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.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": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "event", + "event dispatcher", + "event manager", + "event system", + "events" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.1.x" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", "type": "tidelift" } ], - "time": "2020-07-06T13:19:58+00:00" + "time": "2020-05-29T18:28:51+00:00" }, { - "name": "symfony/filesystem", - "version": "v5.3.0", + "name": "doctrine/inflector", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "348116319d7fb7d1faa781d26a48922428013eb2" + "url": "https://github.com/doctrine/inflector.git", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/348116319d7fb7d1faa781d26a48922428013eb2", - "reference": "348116319d7fb7d1faa781d26a48922428013eb2", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -713,68 +695,90 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.0" - }, - "funding": [ + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, { - "url": "https://symfony.com/sponsor", + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2020-05-29T15:13:26+00:00" }, { - "name": "symfony/http-client-contracts", - "version": "v2.4.0", + "name": "doctrine/instantiator", + "version": "1.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", - "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": "^7.1 || ^8.0" }, - "suggest": { - "symfony/http-client-implementation": "" + "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", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, "autoload": { "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -783,80 +787,69 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" } ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "constructor", + "instantiate" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", "type": "tidelift" } ], - "time": "2021-04-11T23:07:08+00:00" + "time": "2020-11-10T18:47:58+00:00" }, { - "name": "symfony/http-foundation", - "version": "v5.3.2", + "name": "doctrine/lexer", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "7b6dd714d95106b831aaa7f3c9c612ab886516bd" + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7b6dd714d95106b831aaa7f3c9c612ab886516bd", - "reference": "7b6dd714d95106b831aaa7f3c9c612ab886516bd", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" + "php": "^7.2 || ^8.0" }, "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "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": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -864,103 +857,107 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.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": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.2" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", "type": "tidelift" } ], - "time": "2021-06-12T10:15:17+00:00" + "time": "2020-05-25T17:44:05+00:00" }, { - "name": "symfony/http-kernel", - "version": "v4.4.25", + "name": "doctrine/migrations", + "version": "3.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "3795165596fe81a52296b78c9aae938d434069cc" + "url": "https://github.com/doctrine/migrations.git", + "reference": "072c11c1dcfced4505e29a0487b06ea774c403f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3795165596fe81a52296b78c9aae938d434069cc", - "reference": "3795165596fe81a52296b78c9aae938d434069cc", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/072c11c1dcfced4505e29a0487b06ea774c403f4", + "reference": "072c11c1dcfced4505e29a0487b06ea774c403f4", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/error-handler": "^4.4", - "symfony/event-dispatcher": "^4.4", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/browser-kit": "<4.3", - "symfony/config": "<3.4", - "symfony/console": ">=5", - "symfony/dependency-injection": "<4.3", - "symfony/translation": "<4.2", - "twig/twig": "<1.43|<2.13,>=2" - }, - "provide": { - "psr/log-implementation": "1.0" + "composer/package-versions-deprecated": "^1.8", + "doctrine/dbal": "^2.11", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.2 || ^8.0", + "psr/log": "^1.1.3", + "symfony/console": "^3.4 || ^4.4.16 || ^5.0", + "symfony/stopwatch": "^3.4 || ^4.0 || ^5.0" }, "require-dev": { - "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^4.3|^5.0", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/routing": "^3.4|^4.0|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.43|^2.13|^3.0.4" + "doctrine/coding-standard": "^8.0", + "doctrine/orm": "^2.6", + "doctrine/persistence": "^1.3 || ^2.0", + "doctrine/sql-formatter": "^1.0", + "ergebnis/composer-normalize": "^2.9", + "ext-pdo_sqlite": "*", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpstan/phpstan-symfony": "^0.12", + "phpunit/phpunit": "^8.5 || ^9.4", + "symfony/cache": "^5.3", + "symfony/process": "^3.4 || ^4.0 || ^5.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0" }, "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" + "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." }, + "bin": [ + "bin/doctrine-migrations" + ], "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 4, + "indent-style": "space" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -968,72 +965,98 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" } ], - "description": "Provides a structured process for converting a Request into a Response", - "homepage": "https://symfony.com", + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations" + ], "support": { - "source": "https://github.com/symfony/http-kernel/tree/v4.4.25" + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/3.2.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", "type": "tidelift" } ], - "time": "2021-06-01T07:12:08+00:00" + "time": "2021-07-05T07:06:31+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "name": "doctrine/orm", + "version": "2.9.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "url": "https://github.com/doctrine/orm.git", + "reference": "82e77cf5089a1303733f75f0f0ed01be3ab9ec22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/doctrine/orm/zipball/82e77cf5089a1303733f75f0f0ed01be3ab9ec22", + "reference": "82e77cf5089a1303733f75f0f0ed01be3ab9ec22", "shasum": "" }, "require": { - "php": ">=7.1" + "composer/package-versions-deprecated": "^1.8", + "doctrine/annotations": "^1.13", + "doctrine/cache": "^1.11.3|^2.0.3", + "doctrine/collections": "^1.5", + "doctrine/common": "^3.0.3", + "doctrine/dbal": "^2.13.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.1", + "doctrine/inflector": "^1.4|^2.0", + "doctrine/instantiator": "^1.3", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^2.2", + "ext-pdo": "*", + "php": "^7.1|^8.0", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^3.0|^4.0|^5.0|^6.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^0.12.83", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "squizlabs/php_codesniffer": "3.6.0", + "symfony/cache": "^4.4|^5.2", + "symfony/yaml": "^3.4|^4.0|^5.0|^6.0", + "vimeo/psalm": "4.7.0" }, "suggest": { - "ext-ctype": "For best performance" + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" }, + "bin": [ + "bin/doctrine" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1041,78 +1064,166 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "database", + "orm" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.9.3" }, - "funding": [ + "time": "2021-06-13T10:29:22+00:00" + }, + { + "name": "doctrine/persistence", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "d138f3ab5f761055cab1054070377cfd3222e368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/d138f3ab5f761055cab1054070377cfd3222e368", + "reference": "d138f3ab5f761055cab1054070377cfd3222e368", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/collections": "^1.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "php": "^7.1 || ^8.0", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "conflict": { + "doctrine/common": "<2.10@dev" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^6.0 || ^9.0", + "doctrine/common": "^3.0", + "phpstan/phpstan": "0.12.84", + "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", + "symfony/cache": "^4.4|^5.0", + "vimeo/psalm": "4.7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common", + "Doctrine\\Persistence\\": "lib/Doctrine/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "url": "https://github.com/fabpot", - "type": "github" + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "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" } ], - "time": "2021-02-19T12:13:01+00:00" + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/2.2.1" + }, + "time": "2021-05-19T07:07:01+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "006aa5d32f887a4db4353b13b5b5095613e0611f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/006aa5d32f887a4db4353b13b5b5095613e0611f", + "reference": "006aa5d32f887a4db4353b13b5b5095613e0611f", "shasum": "" }, "require": { - "php": ">=7.1" + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0|^6.0" }, - "suggest": { - "ext-mbstring": "For best performance" + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.2|^6.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] + "ProxyManager\\": "src/ProxyManager" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1120,79 +1231,96 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.5" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/Ocramius", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2021-05-22T16:11:15+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "name": "friendsofsymfony/ckeditor-bundle", + "version": "2.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "url": "https://github.com/FriendsOfSymfony/FOSCKEditorBundle.git", + "reference": "282c79b0d3eda68855ea4c8732ab8d249cd5fbd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSCKEditorBundle/zipball/282c79b0d3eda68855ea4c8732ab8d249cd5fbd0", + "reference": "282c79b0d3eda68855ea4c8732ab8d249cd5fbd0", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-json": "*", + "ext-zip": "*", + "php": "^7.1|^8.0", + "symfony/asset": "^4.4 || ^5.0", + "symfony/config": "^4.4 || ^5.0", + "symfony/dependency-injection": "^4.4 || ^5.0", + "symfony/expression-language": "^4.4 || ^5.0", + "symfony/form": "^4.4 || ^5.0", + "symfony/framework-bundle": "^4.4 || ^5.0", + "symfony/http-foundation": "^4.4 || ^5.0", + "symfony/http-kernel": "^4.4 || ^5.0", + "symfony/options-resolver": "^4.4 || ^5.0", + "symfony/property-access": "^4.4 || ^5.0", + "symfony/routing": "^4.4 || ^5.0", + "symfony/twig-bundle": "^4.4 || ^5.0", + "twig/twig": "^2.4 || ^3.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "conflict": { + "sebastian/environment": "<1.3.4", + "sebastian/exporter": "<2.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "matthiasnoback/symfony-dependency-injection-test": "^3.0 || ^4.0", + "symfony/console": "^4.4 || ^5.0", + "symfony/phpunit-bridge": "^4.4 || ^5.0", + "symfony/yaml": "^4.4 || ^5.0" + }, + "suggest": { + "egeloen/form-extra-bundle": "Allows to load CKEditor asynchronously" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] + "FOS\\CKEditorBundle\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1200,330 +1328,248 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "FriendsOfSymfony Community", + "homepage": "https://github.com/FriendsOfSymfony/FOSCKEditorBundle/graphs/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "Provides a CKEditor integration for your Symfony project.", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "CKEditor" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "issues": "https://github.com/FriendsOfSymfony/FOSCKEditorBundle/issues", + "source": "https://github.com/FriendsOfSymfony/FOSCKEditorBundle/tree/2.3.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2020-12-26T14:29:00+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.23.0", + "name": "laminas/laminas-code", + "version": "3.4.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" + "url": "https://github.com/laminas/laminas-code.git", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1cb8f203389ab1482bf89c0e70a04849bacd7766", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766", "shasum": "" }, "require": { - "php": ">=7.1" + "laminas/laminas-eventmanager": "^2.6 || ^3.0", + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^7.1" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0" + }, + "replace": { + "zendframework/zend-code": "self.version" + }, + "require-dev": { + "doctrine/annotations": "^1.7", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^1.0", + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "phpunit/phpunit": "^7.5.16 || ^8.4" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "3.4.x-dev", + "dev-develop": "3.5.x-dev", + "dev-dev-4.0": "4.0.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] + "Laminas\\Code\\": "src/" + } }, "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" - } + "BSD-3-Clause" ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "code", + "laminas" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2019-12-31T16:28:24+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.23.0", + "name": "laminas/laminas-eventmanager", + "version": "3.3.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "e66119f3de95efc359483f810c4c3e6436279436" + "url": "https://github.com/laminas/laminas-eventmanager.git", + "reference": "966c859b67867b179fde1eff0cd38df51472ce4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", - "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/966c859b67867b179fde1eff0cd38df51472ce4a", + "reference": "966c859b67867b179fde1eff0cd38df51472ce4a", "shasum": "" }, "require": { - "php": ">=7.1" + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^7.3 || ^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "replace": { + "zendframework/zend-eventmanager": "^3.2.1" + }, + "require-dev": { + "container-interop/container-interop": "^1.1", + "laminas/laminas-coding-standard": "~1.0.0", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0", + "phpbench/phpbench": "^0.17.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "container-interop/container-interop": "^1.1, to use the lazy listeners feature", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] + "Laminas\\EventManager\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } + "BSD-3-Clause" ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://laminas.dev", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "event", + "eventmanager", + "events", + "laminas" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-eventmanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-eventmanager/issues", + "rss": "https://github.com/laminas/laminas-eventmanager/releases.atom", + "source": "https://github.com/laminas/laminas-eventmanager" }, "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" + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" } ], - "time": "2021-05-21T13:25:03+00:00" + "time": "2021-03-08T15:24:29+00:00" }, { - "name": "symfony/service-contracts", - "version": "v2.4.0", + "name": "laminas/laminas-zendframework-bridge", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "url": "https://github.com/laminas/laminas-zendframework-bridge.git", + "reference": "13af2502d9bb6f7d33be2de4b51fb68c6cdb476e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/13af2502d9bb6f7d33be2de4b51fb68c6cdb476e", + "reference": "13af2502d9bb6f7d33be2de4b51fb68c6cdb476e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" + "php": "^7.3 || ^8.0" }, - "suggest": { - "symfony/service-implementation": "" + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", + "psalm/plugin-phpunit": "^0.15.1", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.6" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "laminas": { + "module": "Laminas\\ZendFrameworkBridge" } }, "autoload": { + "files": [ + "src/autoload.php" + ], "psr-4": { - "Symfony\\Contracts\\Service\\": "" + "Laminas\\ZendFrameworkBridge\\": "src//" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } + "BSD-3-Clause" ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", + "description": "Alias legacy ZF class names to Laminas Project equivalents.", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "ZendFramework", + "autoloading", + "laminas", + "zf" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "forum": "https://discourse.laminas.dev/", + "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", + "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", + "source": "https://github.com/laminas/laminas-zendframework-bridge" }, "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" + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2021-06-24T12:49:22+00:00" }, { - "name": "symfony/var-dumper", - "version": "v5.3.2", + "name": "psr/cache", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "905a22c68b292ffb6f20d7636c36b220d1fba5ae" + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/905a22c68b292ffb6f20d7636c36b220d1fba5ae", - "reference": "905a22c68b292ffb6f20d7636c36b220d1fba5ae", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" + "php": ">=5.3.0" }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.13|^3.0.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { - "files": [ - "Resources/functions/dump.php" - ], "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Psr\\Cache\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1531,91 +1577,43 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", + "description": "Common interface for caching libraries", "keywords": [ - "debug", - "dump" + "cache", + "psr", + "psr-6" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.2" + "source": "https://github.com/php-fig/cache/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": "2021-06-06T09:51:56+00:00" - } - ], - "packages-dev": [ + "time": "2016-08-06T20:24:11+00:00" + }, { - "name": "brainmaestro/composer-git-hooks", - "version": "v2.8.5", + "name": "psr/container", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/BrainMaestro/composer-git-hooks.git", - "reference": "ffed8803690ac12214082120eee3441b00aa390e" + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/ffed8803690ac12214082120eee3441b00aa390e", - "reference": "ffed8803690ac12214082120eee3441b00aa390e", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": "^5.6 || >=7.0", - "symfony/console": "^3.2 || ^4.0 || ^5.0" - }, - "require-dev": { - "ext-json": "*", - "friendsofphp/php-cs-fixer": "^2.9", - "phpunit/phpunit": "^5.7 || ^7.0" + "php": ">=7.2.0" }, - "bin": [ - "cghooks" - ], "type": "library", - "extra": { - "hooks": { - "pre-commit": "composer check-style", - "pre-push": [ - "composer test", - "appver=$(grep -o -E '\\d.\\d.\\d' cghooks)", - "tag=$(git describe --tags --abbrev=0)", - "if [ \"$tag\" != \"v$appver\" ]; then", - "echo \"The most recent tag $tag does not match the application version $appver\\n\"", - "tag=${tag#v}", - "sed -i -E \"s/$appver/$tag/\" cghooks", - "exit 1", - "fi" - ] - } - }, "autoload": { "psr-4": { - "BrainMaestro\\GitHooks\\": "src/" - }, - "files": [ - "src/helpers.php" - ] + "Psr\\Container\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1623,56 +1621,51 @@ ], "authors": [ { - "name": "Ezinwa Okpoechi", - "email": "brainmaestro@outlook.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Easily manage git hooks in your composer config", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "HOOK", - "composer", - "git" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "issues": "https://github.com/BrainMaestro/composer-git-hooks/issues", - "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v2.8.5" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2021-02-08T15:59:11+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { - "name": "composer/ca-bundle", - "version": "1.2.10", + "name": "psr/log", + "version": "1.1.4", "source": { "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8" + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/9fdb22c2e97a614657716178093cd1da90a64aa8", - "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Composer\\CaBundle\\": "src" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1681,93 +1674,50 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" + "log", + "psr", + "psr-3" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.2.10" + "source": "https://github.com/php-fig/log/tree/1.1.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": "2021-06-07T13:58:28+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { - "name": "composer/composer", - "version": "1.10.22", + "name": "richcongress/bundle-toolbox", + "version": "v1.1.1", "source": { "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "28c9dfbe2351635961f670773e8d7b17bc5eda25" + "url": "https://github.com/richcongress/bundle-toolbox.git", + "reference": "c35f39efb84de16bf8287891355ffeae15b31ed5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/28c9dfbe2351635961f670773e8d7b17bc5eda25", - "reference": "28c9dfbe2351635961f670773e8d7b17bc5eda25", + "url": "https://api.github.com/repos/richcongress/bundle-toolbox/zipball/c35f39efb84de16bf8287891355ffeae15b31ed5", + "reference": "c35f39efb84de16bf8287891355ffeae15b31ed5", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.0", - "composer/semver": "^1.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^5.2.10", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "conflict": { - "symfony/console": "2.8.38" + "php": ">=7.1", + "symfony/config": "^3.0 || ^4.0 || ^5.0", + "symfony/dependency-injection": "^3.0 || ^4.0 || ^5.0", + "symfony/http-kernel": "^3.0 || ^4.0 || ^5.0" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } + "phpunit/phpunit": "^7.5", + "roave/security-advisories": "dev-master" }, + "type": "symfony-bundle", "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "RichCongress\\BundleToolbox\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1776,81 +1726,75 @@ ], "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": "RichCongress", + "homepage": "https://www.richcongress.com" } ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], + "description": "A set of classes and tools to quickly build a bundle", "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/1.10.22" + "issues": "https://github.com/richcongress/bundle-toolbox/issues", + "source": "https://github.com/richcongress/bundle-toolbox/tree/master" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-04-27T11:10:45+00:00" + "time": "2020-06-29T16:35:48+00:00" }, { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.2", + "name": "sensio/framework-extra-bundle", + "version": "v5.6.1", "source": { "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c" + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "430d14c01836b77c28092883d195a43ce413ee32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c6522afe5540d5fc46675043d3ed5a45a740b27c", - "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/430d14c01836b77c28092883d195a43ce413ee32", + "reference": "430d14c01836b77c28092883d195a43ce413ee32", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" + "doctrine/annotations": "^1.0", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" }, - "replace": { - "ocramius/package-versions": "1.11.99" + "conflict": { + "doctrine/doctrine-cache-bundle": "<1.3.1", + "doctrine/persistence": "<1.3" }, "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" + "doctrine/dbal": "^2.10|^3.0", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.5", + "nyholm/psr7": "^1.1", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/doctrine-bridge": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/monolog-bridge": "^4.0|^5.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9", + "symfony/psr-http-message-bridge": "^1.1", + "symfony/security-bundle": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/twig": "^1.34|^2.4|^3.0" }, - "type": "composer-plugin", + "type": "symfony-bundle", "extra": { - "class": "PackageVersions\\Installer", "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "5.6.x-dev" } }, "autoload": { "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1858,65 +1802,54 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.2" + "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", + "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v5.6.1" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-05-24T07:46:03+00:00" + "time": "2020-08-25T19:10:18+00:00" }, { - "name": "composer/semver", - "version": "1.7.2", + "name": "symfony/asset", + "version": "v5.2.10", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a" + "url": "https://github.com/symfony/asset.git", + "reference": "c65584ca108c9e51c80cc49ebdcb47dfd995431c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/647490bbcaf7fc4891c58f47b825eb99d19c377a", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a", + "url": "https://api.github.com/repos/symfony/asset/zipball/c65584ca108c9e51c80cc49ebdcb47dfd995431c", + "reference": "c65584ca108c9e51c80cc49ebdcb47dfd995431c", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": ">=7.2.5" }, "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" + "symfony/http-client": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } + "suggest": { + "symfony/http-foundation": "" }, + "type": "library", "autoload": { "psr-4": { - "Composer\\Semver\\": "src" - } + "Symfony\\Component\\Asset\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1924,79 +1857,91 @@ ], "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": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], + "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/1.7.2" + "source": "https://github.com/symfony/asset/tree/v5.2.10" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2020-12-03T15:47:16+00:00" + "time": "2021-05-26T17:40:38+00:00" }, { - "name": "composer/spdx-licenses", - "version": "1.5.5", + "name": "symfony/cache", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" + "url": "https://github.com/symfony/cache.git", + "reference": "82962a497f090e95e3b357c21bf6f54991c9b1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", + "url": "https://api.github.com/repos/symfony/cache/zipball/82962a497f090e95e3b357c21bf6f54991c9b1a5", + "reference": "82962a497f090e95e3b357c21bf6f54991c9b1a5", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "conflict": { + "doctrine/dbal": "<2.10", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0", + "symfony/cache-implementation": "1.0|2.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", + "doctrine/dbal": "^2.10|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Composer\\Spdx\\": "src" - } + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2004,74 +1949,73 @@ ], "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": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "SPDX licenses list and validation library.", + "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", + "homepage": "https://symfony.com", "keywords": [ - "license", - "spdx", - "validator" + "caching", + "psr6" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" + "source": "https://github.com/symfony/cache/tree/v5.3.3" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2020-12-03T16:04:16+00:00" + "time": "2021-06-24T08:13:00+00:00" }, { - "name": "composer/xdebug-handler", - "version": "1.4.6", + "name": "symfony/cache-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c" + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "c0446463729b89dd4fa62e9aeecc80287323615d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f27e06cd9675801df441b3656569b328e04aa37c", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/c0446463729b89dd4fa62e9aeecc80287323615d", + "reference": "c0446463729b89dd4fa62e9aeecc80287323615d", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "suggest": { + "symfony/cache-implementation": "" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" + "Symfony\\Contracts\\Cache\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2080,75 +2024,86 @@ ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } ], - "description": "Restarts a process without Xdebug.", + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", "keywords": [ - "Xdebug", - "performance" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "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.6" + "source": "https://github.com/symfony/cache-contracts/tree/v2.4.0" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-03-25T17:01:18+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { - "name": "dama/doctrine-test-bundle", - "version": "v6.6.0", + "name": "symfony/config", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/dmaicher/doctrine-test-bundle.git", - "reference": "8cfd3f9a4cc0f26101e6170f592900384b78b799" + "url": "https://github.com/symfony/config.git", + "reference": "a69e0c55528b47df88d3c4067ddedf32d485d662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/8cfd3f9a4cc0f26101e6170f592900384b78b799", - "reference": "8cfd3f9a4cc0f26101e6170f592900384b78b799", + "url": "https://api.github.com/repos/symfony/config/zipball/a69e0c55528b47df88d3c4067ddedf32d485d662", + "reference": "a69e0c55528b47df88d3c4067ddedf32d485d662", "shasum": "" }, "require": { - "doctrine/dbal": "^2.9.3 || ^3.0", - "doctrine/doctrine-bundle": "^1.11 || ^2.0", - "php": "^7.1 || ^8.0", - "symfony/cache": "^4.4 || ^5.2", - "symfony/framework-bundle": "^4.4 || ^5.2" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/filesystem": "^4.4|^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php81": "^1.22" + }, + "conflict": { + "symfony/finder": "<4.4" }, "require-dev": { - "behat/behat": "^3.0", - "phpstan/phpstan": "^0.12.85", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "symfony/phpunit-bridge": "^5.2", - "symfony/process": "^4.4 || ^5.2", - "symfony/yaml": "^4.4 || ^5.2" + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/yaml": "^4.4|^5.0" }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "7.0.x-dev" - } + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" }, + "type": "library", "autoload": { "psr-4": { - "DAMA\\DoctrineTestBundle\\": "src/DAMA/DoctrineTestBundle" - } + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2156,56 +2111,88 @@ ], "authors": [ { - "name": "David Maicher", - "email": "mail@dmaicher.de" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony bundle to isolate doctrine database tests and improve test performance", - "keywords": [ - "doctrine", - "isolation", - "performance", - "symfony", - "tests" - ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/dmaicher/doctrine-test-bundle/issues", - "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v6.6.0" + "source": "https://github.com/symfony/config/tree/v5.3.3" }, - "time": "2021-06-01T18:12:34+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-24T08:13:00+00:00" }, { - "name": "doctrine/annotations", - "version": "1.13.1", + "name": "symfony/console", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" + "url": "https://github.com/symfony/console.git", + "reference": "9aa1eb46c1b12fada74dc0c529e93d1ccef22576" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "url": "https://api.github.com/repos/symfony/console/zipball/9aa1eb46c1b12fada74dc0c529e93d1ccef22576", + "reference": "9aa1eb46c1b12fada74dc0c529e93d1ccef22576", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2213,78 +2200,68 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v4.4.26" + }, + "funding": [ { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.1" - }, - "time": "2021-05-16T18:07:53+00:00" + "time": "2021-06-06T09:12:27+00:00" }, { - "name": "doctrine/cache", - "version": "2.0.3", + "name": "symfony/debug", + "version": "v4.4.25", "source": { "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "c9622c6820d3ede1e2315a6a377ea1076e421d88" + "url": "https://github.com/symfony/debug.git", + "reference": "a8d2d5c94438548bff9f998ca874e202bb29d07f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/c9622c6820d3ede1e2315a6a377ea1076e421d88", - "reference": "c9622c6820d3ede1e2315a6a377ea1076e421d88", + "url": "https://api.github.com/repos/symfony/debug/zipball/a8d2d5c94438548bff9f998ca874e202bb29d07f", + "reference": "a8d2d5c94438548bff9f998ca874e202bb29d07f", "shasum": "" }, "require": { - "php": "~7.1 || ^8.0" + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { - "doctrine/common": ">2.2,<2.4", - "psr/cache": ">=3" + "symfony/http-kernel": "<3.4" }, "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^8.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "predis/predis": "~1.0", - "psr/cache": "^1.0 || ^2.0", - "symfony/cache": "^4.4 || ^5.2" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + "symfony/http-kernel": "^3.4|^4.0|^5.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2292,87 +2269,87 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v4.4.25" + }, + "funding": [ { - "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/2.0.3" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-25T09:43:04+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { - "name": "doctrine/collections", - "version": "1.6.7", + "name": "symfony/dependency-injection", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "e421c4f161848740ad1fcf09b12391ddca168d95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e421c4f161848740ad1fcf09b12391ddca168d95", + "reference": "e421c4f161848740ad1fcf09b12391ddca168d95", "shasum": "" }, "require": { - "php": "^7.1.3 || ^8.0" + "php": ">=7.2.5", + "psr/container": "^1.1.1", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" + "symfony/config": "^5.3", + "symfony/expression-language": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2380,171 +2357,135 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.3" + }, + "funding": [ { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "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" + "time": "2021-06-24T08:13:00+00:00" }, { - "name": "doctrine/common", - "version": "3.1.2", + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/a036d90c303f3163b5be8b8fde9b6755b2be4a3a", - "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { - "doctrine/persistence": "^2.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0 || ^8.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5", - "vimeo/psalm": "^4.4" + "php": ">=7.1" }, "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, + "autoload": { + "files": [ + "function.php" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "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": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.1.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-10T20:18:51+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { - "name": "doctrine/data-fixtures", - "version": "1.5.0", + "name": "symfony/error-handler", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5" + "url": "https://github.com/symfony/error-handler.git", + "reference": "4001f01153d0eb5496fe11d8c76d1e56b47fdb88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51d3d4880d28951fff42a635a2389f8c63baddc5", - "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/4001f01153d0eb5496fe11d8c76d1e56b47fdb88", + "reference": "4001f01153d0eb5496fe11d8c76d1e56b47fdb88", "shasum": "" }, "require": { - "doctrine/common": "^2.13|^3.0", - "doctrine/persistence": "^1.3.3|^2.0", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "doctrine/phpcr-odm": "<1.3.0" + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/debug": "^4.4.5", + "symfony/polyfill-php80": "^1.15", + "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { - "doctrine/coding-standard": "^8.2", - "doctrine/dbal": "^2.5.4", - "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", - "doctrine/orm": "^2.7.0", - "ext-sqlite3": "*", - "phpunit/phpunit": "^8.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", - "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", - "doctrine/orm": "For loading ORM fixtures", - "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" - } + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2552,77 +2493,82 @@ ], "authors": [ { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Data Fixtures for all Doctrine Object Managers", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database" - ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.5.0" + "source": "https://github.com/symfony/error-handler/tree/v4.4.26" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-01-23T10:20:43+00:00" + "time": "2021-06-24T07:57:22+00:00" }, { - "name": "doctrine/dbal", - "version": "2.13.2", + "name": "symfony/event-dispatcher", + "version": "v4.4.25", "source": { "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "8dd39d2ead4409ce652fd4f02621060f009ea5e4" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/8dd39d2ead4409ce652fd4f02621060f009ea5e4", - "reference": "8dd39d2ead4409ce652fd4f02621060f009ea5e4", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/047773e7016e4fd45102cedf4bd2558ae0d0c32f", + "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f", "shasum": "" }, "require": { - "doctrine/cache": "^1.0|^2.0", - "doctrine/deprecations": "^0.5.3", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1 || ^8" + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { - "doctrine/coding-standard": "9.0.0", - "jetbrains/phpstorm-stubs": "2020.2", - "phpstan/phpstan": "0.12.81", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.5", - "squizlabs/php_codesniffer": "3.6.0", - "symfony/cache": "^4.4", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.6.4" + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" }, "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." + "symfony/dependency-injection": "", + "symfony/http-kernel": "" }, - "bin": [ - "bin/doctrine-dbal" - ], "type": "library", "autoload": { "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" - } + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2630,171 +2576,144 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlanywhere", - "sqlite", - "sqlserver", - "sqlsrv" - ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.13.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.25" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-06-18T21:48:39+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { - "name": "doctrine/deprecations", - "version": "v0.5.3", + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.9", "source": { "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", - "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", "shasum": "" }, "require": { - "php": "^7.1|^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0|^7.0|^8.0", - "phpunit/phpunit": "^7.0|^8.0|^9.0", - "psr/log": "^1.0" + "php": ">=7.1.3" }, "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "Symfony\\Contracts\\EventDispatcher\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" }, - "time": "2021-03-21T12:59:47+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" }, { - "name": "doctrine/doctrine-bundle", - "version": "2.4.2", + "name": "symfony/expression-language", + "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "4202ce675d29e70a8b9ee763bec021b6f44caccb" + "url": "https://github.com/symfony/expression-language.git", + "reference": "e3c136ac5333b0d2ca9de9e7e3efe419362aa046" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/4202ce675d29e70a8b9ee763bec021b6f44caccb", - "reference": "4202ce675d29e70a8b9ee763bec021b6f44caccb", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/e3c136ac5333b0d2ca9de9e7e3efe419362aa046", + "reference": "e3c136ac5333b0d2ca9de9e7e3efe419362aa046", "shasum": "" }, "require": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^2.9.0|^3.0", - "doctrine/persistence": "^1.3.3|^2.0", - "doctrine/sql-formatter": "^1.0.1", - "php": "^7.1 || ^8.0", - "symfony/cache": "^4.3.3|^5.0|^6.0", - "symfony/config": "^4.4.3|^5.0|^6.0", - "symfony/console": "^3.4.30|^4.3.3|^5.0|^6.0", - "symfony/dependency-injection": "^4.3.3|^5.0|^6.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/doctrine-bridge": "^4.4.22|^5.2.7|^6.0", - "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", - "symfony/service-contracts": "^1.1.1|^2.0" - }, - "conflict": { - "doctrine/orm": "<2.9", - "twig/twig": "<1.34|>=2.0,<2.4" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0", - "doctrine/orm": "^2.9", - "friendsofphp/proxy-manager-lts": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", - "psalm/plugin-phpunit": "^0.15.1", - "psalm/plugin-symfony": "^2.3.0", - "symfony/phpunit-bridge": "^5.2|^6.0", - "symfony/property-info": "^4.3.3|^5.0|^6.0", - "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0|^6.0", - "symfony/security-bundle": "^4.4|^5.0|^6.0", - "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0|^6.0", - "symfony/validator": "^3.4.30|^4.3.3|^5.0|^6.0", - "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", - "symfony/yaml": "^3.4.30|^4.3.3|^5.0|^6.0", - "twig/twig": "^1.34|^2.12|^3.0", - "vimeo/psalm": "^4.7" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "ext-pdo": "*", - "symfony/web-profiler-bundle": "To use the data collector." + "php": ">=7.2.5", + "symfony/cache": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" }, - "type": "symfony-bundle", + "type": "library", "autoload": { "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2803,83 +2722,58 @@ "name": "Fabien Potencier", "email": "fabien@symfony.com" }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org/" + "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DoctrineBundle", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "orm", - "persistence" - ], + "description": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.4.2" + "source": "https://github.com/symfony/expression-language/tree/v5.3.0" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-06-05T13:40:39+00:00" + "time": "2021-05-26T12:52:38+00:00" }, { - "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.4.0", + "name": "symfony/filesystem", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "870189619a7770f468ffb0b80925302e065a3b34" + "url": "https://github.com/symfony/filesystem.git", + "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/870189619a7770f468ffb0b80925302e065a3b34", - "reference": "870189619a7770f468ffb0b80925302e065a3b34", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/19b71c8f313b411172dd5f470fd61f24466d79a9", + "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9", "shasum": "" }, "require": { - "doctrine/data-fixtures": "^1.3", - "doctrine/doctrine-bundle": "^1.11|^2.0", - "doctrine/orm": "^2.6.0", - "doctrine/persistence": "^1.3.7|^2.0", - "php": "^7.1 || ^8.0", - "symfony/config": "^3.4|^4.3|^5.0", - "symfony/console": "^3.4|^4.3|^5.0", - "symfony/dependency-injection": "^3.4|^4.3|^5.0", - "symfony/doctrine-bridge": "^3.4|^4.1|^5.0", - "symfony/http-kernel": "^3.4|^4.3|^5.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.4 || ^8.0 || ^9.2", - "symfony/phpunit-bridge": "^4.1|^5.0" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8" }, - "type": "symfony-bundle", + "type": "library", "autoload": { "psr-4": { - "Doctrine\\Bundle\\FixturesBundle\\": "" - } + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2890,75 +2784,57 @@ "name": "Fabien Potencier", "email": "fabien@symfony.com" }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org" - }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DoctrineFixturesBundle", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "Fixture", - "persistence" - ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.0" + "source": "https://github.com/symfony/filesystem/tree/v5.3.3" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-fixtures-bundle", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2020-11-14T09:36:49+00:00" + "time": "2021-06-30T07:27:52+00:00" }, { - "name": "doctrine/event-manager", - "version": "1.1.1", + "name": "symfony/finder", + "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + "url": "https://github.com/symfony/finder.git", + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" + "php": ">=7.2.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2966,93 +2842,96 @@ ], "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": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "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" - ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + "source": "https://github.com/symfony/finder/tree/v5.3.0" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2020-05-29T18:28:51+00:00" + "time": "2021-05-26T12:52:38+00:00" }, { - "name": "doctrine/inflector", - "version": "2.0.3", + "name": "symfony/form", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" + "url": "https://github.com/symfony/form.git", + "reference": "c0b7a80561f45b2970f77c4a7958224189c126c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "url": "https://api.github.com/repos/symfony/form/zipball/c0b7a80561f45b2970f77c4a7958224189c126c0", + "reference": "c0b7a80561f45b2970f77c4a7958224189c126c0", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=7.1.3", + "symfony/event-dispatcher": "^4.3", + "symfony/intl": "^4.4|^5.0", + "symfony/options-resolver": "~4.3|^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/property-access": "^3.4.40|^4.4.8|^5.0.8", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<4.3", + "symfony/dependency-injection": "<3.4", + "symfony/doctrine-bridge": "<3.4", + "symfony/framework-bundle": "<3.4", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.3", + "symfony/translation": "<4.2", + "symfony/twig-bridge": "<3.4.5|<4.0.5,>=4.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "doctrine/collections": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^4.3|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/security-csrf": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/validator": "^4.4.17|^5.1.9", + "symfony/var-dumper": "^4.3|^5.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "suggest": { + "symfony/security-csrf": "For protecting forms against CSRF attacks.", + "symfony/twig-bridge": "For templating with Twig.", + "symfony/validator": "For form validation." }, + "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } + "Symfony\\Component\\Form\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3060,91 +2939,144 @@ ], "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": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], + "description": "Allows to easily create, process and reuse HTML forms", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.x" + "source": "https://github.com/symfony/form/tree/v4.4.26" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2020-05-29T15:13:26+00:00" + "time": "2021-06-27T12:32:53+00:00" }, { - "name": "doctrine/instantiator", - "version": "1.4.0", + "name": "symfony/framework-bundle", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "fb29db31d6a1bb69271009c47ce19d59c6fef25a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/fb29db31d6a1bb69271009c47ce19d59c6fef25a", + "reference": "fb29db31d6a1bb69271009c47ce19d59c6fef25a", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "ext-xml": "*", + "php": ">=7.1.3", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.4.11|~5.0.11|^5.1.3", + "symfony/dependency-injection": "^4.4.1|^5.0.1", + "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^4.4.12|^5.1.4" + }, + "conflict": { + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2", + "phpdocumentor/type-resolver": "<0.3.0|1.3.*", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/asset": "<3.4", + "symfony/browser-kit": "<4.3", + "symfony/console": "<4.4.21", + "symfony/dom-crawler": "<4.3", + "symfony/dotenv": "<4.3.6", + "symfony/form": "<4.3.5", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<4.4", + "symfony/messenger": "<4.4", + "symfony/mime": "<4.4", + "symfony/property-info": "<3.4", + "symfony/security-bundle": "<4.4", + "symfony/serializer": "<4.4", + "symfony/stopwatch": "<3.4", + "symfony/translation": "<4.4", + "symfony/twig-bridge": "<4.1.1", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<4.4", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<4.3.6" }, "require-dev": { - "doctrine/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" + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "^1.0|^2.0", + "doctrine/persistence": "^1.3|^2.0", + "paragonie/sodium_compat": "^1.8", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^3.4|^4.0|^5.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/console": "^4.4.21|^5.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dom-crawler": "^4.3|^5.0", + "symfony/dotenv": "^4.3.6|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/form": "^4.3.5|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/security-core": "^3.4|^4.4|^5.2", + "symfony/security-csrf": "^3.4|^4.0|^5.0", + "symfony/security-http": "^3.4|^4.0|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.3.6|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0", + "twig/twig": "^1.43|^2.13|^3.0.4" }, - "type": "library", + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3152,68 +3084,68 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "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" - ], + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + "source": "https://github.com/symfony/framework-bundle/tree/v4.4.26" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" + "time": "2021-06-28T15:39:02+00:00" }, { - "name": "doctrine/lexer", - "version": "1.2.1", + "name": "symfony/http-client-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=7.2.5" }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" + "suggest": { + "symfony/http-client-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Symfony\\Contracts\\HttpClient\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3222,180 +3154,179 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" + "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2020-05-25T17:44:05+00:00" + "time": "2021-04-11T23:07:08+00:00" }, { - "name": "doctrine/orm", - "version": "2.9.3", + "name": "symfony/http-foundation", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/doctrine/orm.git", - "reference": "82e77cf5089a1303733f75f0f0ed01be3ab9ec22" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "8759ed5c27c2a8a47cb60f367f4be6727f08d58b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/82e77cf5089a1303733f75f0f0ed01be3ab9ec22", - "reference": "82e77cf5089a1303733f75f0f0ed01be3ab9ec22", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8759ed5c27c2a8a47cb60f367f4be6727f08d58b", + "reference": "8759ed5c27c2a8a47cb60f367f4be6727f08d58b", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "^1.13", - "doctrine/cache": "^1.11.3|^2.0.3", - "doctrine/collections": "^1.5", - "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.13.0", - "doctrine/deprecations": "^0.5.3", - "doctrine/event-manager": "^1.1", - "doctrine/inflector": "^1.4|^2.0", - "doctrine/instantiator": "^1.3", - "doctrine/lexer": "^1.0", - "doctrine/persistence": "^2.2", - "ext-pdo": "*", - "php": "^7.1|^8.0", - "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^3.0|^4.0|^5.0|^6.0" + "php": ">=7.1.3", + "symfony/mime": "^4.3|^5.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^0.12.83", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "squizlabs/php_codesniffer": "3.6.0", - "symfony/cache": "^4.4|^5.2", - "symfony/yaml": "^3.4|^4.0|^5.0|^6.0", - "vimeo/psalm": "4.7.0" - }, - "suggest": { - "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + "predis/predis": "~1.0", + "symfony/expression-language": "^3.4|^4.0|^5.0" }, - "bin": [ - "bin/doctrine" - ], "type": "library", "autoload": { "psr-4": { - "Doctrine\\ORM\\": "lib/Doctrine/ORM" - } - }, - "notification-url": "https://packagist.org/downloads/", + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v4.4.26" + }, + "funding": [ { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "https://www.doctrine-project.org/projects/orm.html", - "keywords": [ - "database", - "orm" - ], - "support": { - "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.9.3" - }, - "time": "2021-06-13T10:29:22+00:00" + "time": "2021-06-26T21:56:04+00:00" }, { - "name": "doctrine/persistence", - "version": "2.2.1", + "name": "symfony/http-kernel", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/doctrine/persistence.git", - "reference": "d138f3ab5f761055cab1054070377cfd3222e368" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "e08b2fb8a6eedd81c70522e514bad9b2c1fff881" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/d138f3ab5f761055cab1054070377cfd3222e368", - "reference": "d138f3ab5f761055cab1054070377cfd3222e368", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e08b2fb8a6eedd81c70522e514bad9b2c1fff881", + "reference": "e08b2fb8a6eedd81c70522e514bad9b2c1fff881", "shasum": "" }, "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/collections": "^1.0", - "doctrine/deprecations": "^0.5.3", - "doctrine/event-manager": "^1.0", - "php": "^7.1 || ^8.0", - "psr/cache": "^1.0|^2.0|^3.0" + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/error-handler": "^4.4", + "symfony/event-dispatcher": "^4.4", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" }, "conflict": { - "doctrine/common": "<2.10@dev" + "symfony/browser-kit": "<4.3", + "symfony/config": "<3.4", + "symfony/console": ">=5", + "symfony/dependency-injection": "<4.3", + "symfony/translation": "<4.2", + "twig/twig": "<1.43|<2.13,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" }, "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^6.0 || ^9.0", - "doctrine/common": "^3.0", - "phpstan/phpstan": "0.12.84", - "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", - "symfony/cache": "^4.4|^5.0", - "vimeo/psalm": "4.7.0" + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^4.3|^5.0", + "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^1.43|^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common", - "Doctrine\\Persistence\\": "lib/Doctrine/Persistence" - } + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3403,78 +3334,71 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v4.4.26" + }, + "funding": [ { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://doctrine-project.org/projects/persistence.html", - "keywords": [ - "mapper", - "object", - "odm", - "orm", - "persistence" - ], - "support": { - "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.2.1" - }, - "time": "2021-05-19T07:07:01+00:00" + "time": "2021-06-30T08:18:06+00:00" }, { - "name": "doctrine/sql-formatter", - "version": "1.1.1", + "name": "symfony/intl", + "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "56070bebac6e77230ed7d306ad13528e60732871" + "url": "https://github.com/symfony/intl.git", + "reference": "92a24a5fd1087511d29a5c7dd98d97c9e2208e75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/56070bebac6e77230ed7d306ad13528e60732871", - "reference": "56070bebac6e77230ed7d306ad13528e60732871", + "url": "https://api.github.com/repos/symfony/intl/zipball/92a24a5fd1087511d29a5c7dd98d97c9e2208e75", + "reference": "92a24a5fd1087511d29a5c7dd98d97c9e2208e75", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4" + "symfony/filesystem": "^4.4|^5.0" }, - "bin": [ - "bin/sql-formatter" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Doctrine\\SqlFormatter\\": "src" - } + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3482,66 +3406,94 @@ ], "authors": [ { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/doctrine/sql-formatter/", + "description": "Provides a PHP replacement layer for the C intl extension that includes additional data from the ICU library", + "homepage": "https://symfony.com", "keywords": [ - "highlight", - "sql" + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" ], "support": { - "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.1.x" + "source": "https://github.com/symfony/intl/tree/v5.3.0" }, - "time": "2020-07-30T16:57:33+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:28:50+00:00" }, { - "name": "fakerphp/faker", - "version": "v1.14.1", + "name": "symfony/mime", + "version": "v5.3.2", "source": { "type": "git", - "url": "https://github.com/FakerPHP/Faker.git", - "reference": "ed22aee8d17c7b396f74a58b1e7fefa4f90d5ef1" + "url": "https://github.com/symfony/mime.git", + "reference": "47dd7912152b82d0d4c8d9040dbc93d6232d472a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/ed22aee8d17c7b396f74a58b1e7fefa4f90d5ef1", - "reference": "ed22aee8d17c7b396f74a58b1e7fefa4f90d5ef1", + "url": "https://api.github.com/repos/symfony/mime/zipball/47dd7912152b82d0d4c8d9040dbc93d6232d472a", + "reference": "47dd7912152b82d0d4c8d9040dbc93d6232d472a", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "psr/container": "^1.0", - "symfony/deprecation-contracts": "^2.2" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { - "fzaninotto/faker": "*" + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "ext-intl": "*", - "symfony/phpunit-bridge": "^4.4 || ^5.2" - }, - "suggest": { - "ext-curl": "Required by Faker\\Provider\\Image to download images.", - "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", - "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", - "ext-mbstring": "Required for multibyte Unicode string functionality." + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "v1.15-dev" - } - }, "autoload": { "psr-4": { - "Faker\\": "src/Faker/" - } + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3549,101 +3501,66 @@ ], "authors": [ { - "name": "François Zaninotto" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Faker is a PHP library that generates fake data for you.", + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", "keywords": [ - "data", - "faker", - "fixtures" + "mime", + "mime-type" ], "support": { - "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v.1.14.1" + "source": "https://github.com/symfony/mime/tree/v5.3.2" }, - "time": "2021-03-30T06:27:33+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-09T10:58:01+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "v2.19.0", + "name": "symfony/options-resolver", + "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "d5b8a9d852b292c2f8a035200fa6844b1f82300b" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/d5b8a9d852b292c2f8a035200fa6844b1f82300b", - "reference": "d5b8a9d852b292c2f8a035200fa6844b1f82300b", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", "shasum": "" }, "require": { - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.2 || ^2.0", - "doctrine/annotations": "^1.2", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^5.6 || ^7.0 || ^8.0", - "php-cs-fixer/diff": "^1.3", - "symfony/console": "^3.4.43 || ^4.1.6 || ^5.0", - "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^3.0 || ^4.0 || ^5.0", - "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", - "symfony/polyfill-php70": "^1.0", - "symfony/polyfill-php72": "^1.4", - "symfony/process": "^3.0 || ^4.0 || ^5.0", - "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" - }, - "require-dev": { - "justinrainbow/json-schema": "^5.0", - "keradus/cli-executor": "^1.4", - "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.4.2", - "php-cs-fixer/accessible-object": "^1.0", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy-phpunit": "^1.1 || ^2.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.13 || ^9.5", - "phpunitgoodpractices/polyfill": "^1.5", - "phpunitgoodpractices/traits": "^1.9.1", - "sanmai/phpunit-legacy-adapter": "^6.4 || ^8.2.1", - "symfony/phpunit-bridge": "^5.2.1", - "symfony/yaml": "^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters.", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", - "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." - }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", - "extra": { - "branch-alias": { - "dev-master": "2.19-dev" - } + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" }, + "type": "library", "autoload": { "psr-4": { - "PhpCsFixer\\": "src/" + "Symfony\\Component\\OptionsResolver\\": "" }, - "classmap": [ - "tests/Test/AbstractFixerTestCase.php", - "tests/Test/AbstractIntegrationCaseFactory.php", - "tests/Test/AbstractIntegrationTestCase.php", - "tests/Test/Assert/AssertTokensTrait.php", - "tests/Test/IntegrationCase.php", - "tests/Test/IntegrationCaseFactory.php", - "tests/Test/IntegrationCaseFactoryInterface.php", - "tests/Test/InternalIntegrationCaseFactory.php", - "tests/Test/IsIdenticalConstraint.php", - "tests/Test/TokensWithObservedTransformers.php", - "tests/TestCase.php" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3656,105 +3573,152 @@ "email": "fabien@symfony.com" }, { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A tool to automatically fix PHP code style", + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v2.19.0" + "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" }, "funding": [ { - "url": "https://github.com/keradus", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2021-05-03T21:43:24+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { - "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { - "php": "^5.3|^7.0|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" + "php": ">=7.1" }, - "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { - "classmap": [ - "hamcrest" + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "description": "This is the PHP port of Hamcrest Matchers", + "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": [ - "test" + "compatibility", + "ctype", + "polyfill", + "portable" ], "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, - "time": "2020-07-09T08:09:16+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "jean85/pretty-package-versions", - "version": "1.6.0", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "1e0104b46f045868f11942aea058cd7186d6c303" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/1e0104b46f045868f11942aea058cd7186d6c303", - "reference": "1e0104b46f045868f11942aea058cd7186d6c303", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", + "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.8.0", - "php": "^7.0|^8.0" + "php": ">=7.1" }, - "require-dev": { - "phpunit/phpunit": "^6.0|^8.5|^9.2" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" - } - }, + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { "psr-4": { - "Jean85\\": "src/" - } + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3762,58 +3726,82 @@ ], "authors": [ { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A wrapper for ocramius/package-versions to get pretty versions strings", + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", "keywords": [ - "composer", - "package", - "release", - "versions" + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/1.6.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" }, - "time": "2021-02-04T16:20:16+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" }, { - "name": "justinrainbow/json-schema", - "version": "5.2.10", + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "suggest": { + "ext-intl": "For best performance" }, - "bin": [ - "bin/validate-json" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3821,77 +3809,87 @@ ], "authors": [ { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" + "name": "Laurent Bassin", + "email": "laurent@bassin.info" }, { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" }, { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", "keywords": [ - "json", - "schema" + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" }, - "time": "2020-05-27T16:41:55+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" }, { - "name": "league/container", - "version": "3.3.5", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/container.git", - "reference": "048ab87810f508dbedbcb7ae941b606eb8ee353b" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/container/zipball/048ab87810f508dbedbcb7ae941b606eb8ee353b", - "reference": "048ab87810f508dbedbcb7ae941b606eb8ee353b", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0", - "psr/container": "^1.0.0 || ^2.0.0" - }, - "provide": { - "psr/container-implementation": "^1.0" - }, - "replace": { - "orno/di": "~2.0" + "php": ">=7.1" }, - "require-dev": { - "phpunit/phpunit": "^6.0", - "roave/security-advisories": "dev-master", - "scrutinizer/ocular": "^1.8", - "squizlabs/php_codesniffer": "^3.5" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "League\\Container\\": "src" - } + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3899,217 +3897,236 @@ ], "authors": [ { - "name": "Phil Bennett", - "email": "philipobenito@gmail.com", - "homepage": "http://www.philipobenito.com", - "role": "Developer" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A fast and intuitive dependency injection container.", - "homepage": "https://github.com/thephpleague/container", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", "keywords": [ - "container", - "dependency", - "di", - "injection", - "league", - "provider", - "service" + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/3.3.5" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { - "url": "https://github.com/philipobenito", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2021-03-16T09:42:56+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "mockery/mockery", - "version": "1.4.3", + "name": "symfony/polyfill-mbstring", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "d1339f64479af1bee0e82a0413813fe5345a54ea" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/d1339f64479af1bee0e82a0413813fe5345a54ea", - "reference": "d1339f64479af1bee0e82a0413813fe5345a54ea", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", "shasum": "" }, "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": "^7.3 || ^8.0" - }, - "conflict": { - "phpunit/phpunit": "<8.0" + "php": ">=7.1" }, - "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3" + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { - "psr-0": { - "Mockery": "library/" - } + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.4.3" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" }, - "time": "2021-02-24T09:51:49+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.10.2", + "name": "symfony/polyfill-php72", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "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" + "php": ">=7.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { "psr-4": { - "DeepCopy\\": "src/DeepCopy/" + "Symfony\\Polyfill\\Php72\\": "" }, "files": [ - "src/DeepCopy/deep_copy.php" + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "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-11-13T09:40:50+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { - "name": "nelmio/alice", - "version": "v3.8.2", + "name": "symfony/polyfill-php73", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/nelmio/alice.git", - "reference": "b57f4c6f039baa72e2bd5b75fd8de77e1b9228e3" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/alice/zipball/b57f4c6f039baa72e2bd5b75fd8de77e1b9228e3", - "reference": "b57f4c6f039baa72e2bd5b75fd8de77e1b9228e3", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { - "fakerphp/faker": "^1.10", - "myclabs/deep-copy": "^1.10", - "php": "^7.3 || ^8.0", - "sebastian/comparator": "^3.0 || ^4.0", - "symfony/property-access": "^2.8 || ^3.4 || ^4.0 || ^5.0", - "symfony/yaml": "^2.8 || ^3.4 || ^4.0 || ^5.0" - }, - "conflict": { - "symfony/framework-bundle": "<3.4" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.1.0", - "phpspec/prophecy": "^1.6", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^8.5.4 || ^9.3", - "symfony/phpunit-bridge": "^5.1.3", - "symfony/var-dumper": "^3.4 || ^4.0 || ^5.0" - }, - "suggest": { - "theofidry/alice-data-fixtures": "Wrapper for Alice to provide a persistence layer." + "php": ">=7.1" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": false - }, "branch-alias": { - "dev-master": "3.x-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, "files": [ - "src/deep_clone.php" + "bootstrap.php" ], - "psr-4": { - "Nelmio\\Alice\\": "src" - } + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4117,368 +4134,420 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - }, - { - "name": "Tim Shelburne", - "email": "shelburt02@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Expressive fixtures generator", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "Fixture", - "data", - "faker", - "test" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/nelmio/alice/issues", - "source": "https://github.com/nelmio/alice/tree/v3.8.2" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { - "url": "https://github.com/theofidry", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2021-02-27T19:13:09+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "nette/finder", - "version": "v2.5.2", + "name": "symfony/polyfill-php80", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/nette/finder.git", - "reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/finder/zipball/4ad2c298eb8c687dd0e74ae84206a4186eeaed50", - "reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", "shasum": "" }, "require": { - "nette/utils": "^2.4 || ^3.0", "php": ">=7.1" }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "^2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], "classmap": [ - "src/" + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" }, { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "🔍 Nette Finder: find files and directories with an intuitive API.", - "homepage": "https://nette.org", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "filesystem", - "glob", - "iterator", - "nette" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/nette/finder/issues", - "source": "https://github.com/nette/finder/tree/v2.5.2" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" }, - "time": "2020-01-03T20:35:40+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "nette/robot-loader", - "version": "v3.4.0", + "name": "symfony/polyfill-php81", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/nette/robot-loader.git", - "reference": "3973cf3970d1de7b30888fd10b92dac9e0c2fd82" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/robot-loader/zipball/3973cf3970d1de7b30888fd10b92dac9e0c2fd82", - "reference": "3973cf3970d1de7b30888fd10b92dac9e0c2fd82", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "nette/finder": "^2.5 || ^3.0", - "nette/utils": "^3.0", "php": ">=7.1" }, - "require-dev": { - "nette/tester": "^2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], "classmap": [ - "src/" + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", - "homepage": "https://nette.org", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "autoload", - "class", - "interface", - "nette", - "trait" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/nette/robot-loader/issues", - "source": "https://github.com/nette/robot-loader/tree/v3.4.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" }, - "time": "2021-03-07T15:12:01+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" }, { - "name": "nette/utils", - "version": "v3.2.2", + "name": "symfony/property-access", + "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c" + "url": "https://github.com/symfony/property-access.git", + "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/967cfc4f9a1acd5f1058d76715a424c53343c20c", - "reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c", + "url": "https://api.github.com/repos/symfony/property-access/zipball/8988399a556cffb0fba9bb3603f8d1ba4543eceb", + "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb", "shasum": "" }, "require": { - "php": ">=7.2 <8.1" - }, - "conflict": { - "nette/di": "<3.0.6" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/property-info": "^5.2" }, "require-dev": { - "nette/tester": "~2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" + "symfony/cache": "^4.4|^5.0" }, "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" + "psr/cache-implementation": "To cache access methods." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", "keywords": [ + "access", "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" ], "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.2" + "source": "https://github.com/symfony/property-access/tree/v5.3.0" }, - "time": "2021-03-03T22:53:25+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" }, { - "name": "nikic/php-parser", - "version": "v4.10.5", + "name": "symfony/property-info", + "version": "v5.3.1", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f" + "url": "https://github.com/symfony/property-info.git", + "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4432ba399e47c66624bc73c8c0f811e5c109576f", - "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f", + "url": "https://api.github.com/repos/symfony/property-info/zipball/6f8bff281f215dbf41929c7ec6f8309cdc0912cf", + "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/string": "^5.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" }, "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "doctrine/annotations": "^1.10.4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" }, + "type": "library", "autoload": { "psr-4": { - "PhpParser\\": "lib/PhpParser" - } + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A PHP parser written in PHP", + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", "keywords": [ - "parser", - "php" + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.5" + "source": "https://github.com/symfony/property-info/tree/v5.3.1" }, - "time": "2021-05-03T19:11:20+00:00" - }, - { - "name": "nunomaduro/phpinsights", - "version": "v1.9.0", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/phpinsights.git", - "reference": "7453929847df79aeaacddc2753186aa6b16cbdb4" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-31T12:40:48+00:00" + }, + { + "name": "symfony/routing", + "version": "v4.4.25", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "3a3c2f197ad0846ac6413225fc78868ba1c61434" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/phpinsights/zipball/7453929847df79aeaacddc2753186aa6b16cbdb4", - "reference": "7453929847df79aeaacddc2753186aa6b16cbdb4", + "url": "https://api.github.com/repos/symfony/routing/zipball/3a3c2f197ad0846ac6413225fc78868ba1c61434", + "reference": "3a3c2f197ad0846ac6413225fc78868ba1c61434", "shasum": "" }, "require": { - "composer/composer": "^1.7", - "ext-iconv": "*", - "ext-json": "*", - "league/container": "^3.2", - "object-calisthenics/phpcs-calisthenics-rules": "^3.5", - "php": "^7.2", - "phploc/phploc": "^5.0", - "sensiolabs/security-checker": "^6.0", - "symfony/console": "^4.2", - "symfony/finder": "^4.2", - "symplify/coding-standard": "^6.0.4", - "symplify/easy-coding-standard": "^6.0.4", - "symplify/package-builder": "^6.0.4" + "php": ">=7.1.3" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" }, "require-dev": { - "illuminate/console": "^5.8", - "illuminate/support": "^5.8", - "localheinz/phpstan-rules": "^0.10.0", - "mockery/mockery": "^1.0", - "phpstan/phpstan": "^0.11.5", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^8.0", - "roave/no-floaters": "^1.1", - "symfony/var-dumper": "^4.2", - "thecodingmachine/phpstan-strict-rules": "^0.11.0" + "doctrine/annotations": "^1.10.4", + "psr/log": "~1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" }, - "bin": [ - "bin/phpinsights" - ], - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\PhpInsights\\Application\\Adapters\\Laravel\\InsightsServiceProvider" - ] - } + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" }, + "type": "library", "autoload": { "psr-4": { - "NunoMaduro\\PhpInsights\\": "src" - } + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4486,307 +4555,471 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Instant PHP quality checks from your console.", + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", "keywords": [ - "Insights", - "code", - "console", - "php", - "quality", - "source" + "router", + "routing", + "uri", + "url" ], "support": { - "issues": "https://github.com/nunomaduro/phpinsights/issues", - "source": "https://github.com/nunomaduro/phpinsights/tree/master" + "source": "https://github.com/symfony/routing/tree/v4.4.25" }, - "time": "2019-08-20T14:41:42+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:39:37+00:00" }, { - "name": "object-calisthenics/phpcs-calisthenics-rules", - "version": "v3.7.0", + "name": "symfony/security-bundle", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/object-calisthenics/phpcs-calisthenics-rules.git", - "reference": "f7bca2448514a9c36f244994aa05fc9e41182246" + "url": "https://github.com/symfony/security-bundle.git", + "reference": "48329a558dcfdc9ccb27dc08fc53ac72c4bdfd35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/object-calisthenics/phpcs-calisthenics-rules/zipball/f7bca2448514a9c36f244994aa05fc9e41182246", - "reference": "f7bca2448514a9c36f244994aa05fc9e41182246", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/48329a558dcfdc9ccb27dc08fc53ac72c4bdfd35", + "reference": "48329a558dcfdc9ccb27dc08fc53ac72c4bdfd35", "shasum": "" }, "require": { - "nette/utils": "^3.0", - "php": "^7.2", - "slevomat/coding-standard": "^5.0.4|^6.0", - "squizlabs/php_codesniffer": "^3.5" + "ext-xml": "*", + "php": ">=7.1.3", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/security-core": "^4.4", + "symfony/security-csrf": "^4.2|^5.0", + "symfony/security-guard": "^4.2|^5.0", + "symfony/security-http": "^4.4.5" + }, + "conflict": { + "symfony/browser-kit": "<4.2", + "symfony/console": "<3.4", + "symfony/framework-bundle": "<4.4", + "symfony/ldap": "<4.4", + "symfony/twig-bundle": "<4.4" }, "require-dev": { - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8.5", - "rector/rector": "^0.6", - "symplify/changelog-linker": "^7.1", - "symplify/coding-standard": "^7.1", - "symplify/easy-coding-standard-tester": "^7.1", - "symplify/phpstan-extensions": "^7.1", - "tracy/tracy": "^2.7" + "doctrine/annotations": "^1.10.4", + "symfony/asset": "^3.4|^4.0|^5.0", + "symfony/browser-kit": "^4.2|^5.0", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/form": "^3.4|^4.0|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/translation": "^3.4|^4.0|^5.0", + "symfony/twig-bridge": "^3.4|^4.0|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0", + "twig/twig": "^1.43|^2.13|^3.0.4" }, - "type": "phpcodesniffer-standard", + "type": "symfony-bundle", "autoload": { "psr-4": { - "ObjectCalisthenics\\": "src/ObjectCalisthenics" - } + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHP CodeSniffer Object Calisthenics rules/sniffs", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/object-calisthenics/phpcs-calisthenics-rules/issues", - "source": "https://github.com/object-calisthenics/phpcs-calisthenics-rules/tree/v3.7.0" + "source": "https://github.com/symfony/security-bundle/tree/v4.4.26" }, - "abandoned": "symplify/phpstan-rules", - "time": "2019-12-11T15:46:58+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-27T12:24:10+00:00" }, { - "name": "phar-io/manifest", - "version": "2.0.1", + "name": "symfony/security-core", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" + "url": "https://github.com/symfony/security-core.git", + "reference": "3d17ab62cf4a227afea09bac7cf5d359658c1908" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "url": "https://api.github.com/repos/symfony/security-core/zipball/3d17ab62cf4a227afea09bac7cf5d359658c1908", + "reference": "3d17ab62cf4a227afea09bac7cf5d359658c1908", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/service-contracts": "^1.1.6|^2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "conflict": { + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.3" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.3", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/ldap": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^3.4.31|^4.3.4|^5.0" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" }, + "type": "library", "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" + "source": "https://github.com/symfony/security-core/tree/v4.4.26" }, - "time": "2020-06-27T14:33:11+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-23T21:43:12+00:00" }, { - "name": "phar-io/version", - "version": "3.1.0", + "name": "symfony/security-csrf", + "version": "v5.2.10", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" + "url": "https://github.com/symfony/security-csrf.git", + "reference": "89f7d0778d988579e16a173cbdd9656c1bfd8b79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/89f7d0778d988579e16a173cbdd9656c1bfd8b79", + "reference": "89f7d0778d988579e16a173cbdd9656c1bfd8b79", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=7.2.5", + "symfony/security-core": "^4.4|^5.0" + }, + "conflict": { + "symfony/http-foundation": "<4.4" + }, + "require-dev": { + "symfony/http-foundation": "^4.4|^5.0" + }, + "suggest": { + "symfony/http-foundation": "For using the class SessionTokenStorage." }, "type": "library", "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library for handling version information and constraints", + "description": "Symfony Security Component - CSRF Library", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" + "source": "https://github.com/symfony/security-csrf/tree/v5.2.10" }, - "time": "2021-02-23T14:00:09+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T12:52:38+00:00" }, { - "name": "php-cs-fixer/diff", - "version": "v1.3.1", + "name": "symfony/security-guard", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759" + "url": "https://github.com/symfony/security-guard.git", + "reference": "a517da0efcfde6f89bae6e8b7a3cb88f488485c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/dbd31aeb251639ac0b9e7e29405c1441907f5759", - "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759", + "url": "https://api.github.com/repos/symfony/security-guard/zipball/a517da0efcfde6f89bae6e8b7a3cb88f488485c5", + "reference": "a517da0efcfde6f89bae6e8b7a3cb88f488485c5", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "php": ">=7.1.3", + "symfony/security-core": "^3.4.22|^4.2.3|^5.0", + "symfony/security-http": "^4.4.1" }, "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", - "symfony/process": "^3.3" + "psr/log": "~1.0" }, "type": "library", "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Security\\Guard\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "SpacePossum" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "sebastian/diff v2 backport support for PHP5.6", - "homepage": "https://github.com/PHP-CS-Fixer", - "keywords": [ - "diff" - ], + "description": "Symfony Security Component - Guard", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/PHP-CS-Fixer/diff/issues", - "source": "https://github.com/PHP-CS-Fixer/diff/tree/v1.3.1" + "source": "https://github.com/symfony/security-guard/tree/v4.4.26" }, - "time": "2020-10-14T08:39:05+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T16:29:25+00:00" }, { - "name": "php-di/phpdoc-reader", - "version": "2.2.1", + "name": "symfony/security-http", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/PHP-DI/PhpDocReader.git", - "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" + "url": "https://github.com/symfony/security-http.git", + "reference": "07adcd5550ea79ee0baca406040eac272ac8e3fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", - "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", + "url": "https://api.github.com/repos/symfony/security-http/zipball/07adcd5550ea79ee0baca406040eac272ac8e3fd", + "reference": "07adcd5550ea79ee0baca406040eac272ac8e3fd", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.1.3", + "symfony/http-foundation": "^3.4.40|^4.4.7|^5.0.7", + "symfony/http-kernel": "^4.4", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/security-core": "^4.4.8" + }, + "conflict": { + "symfony/event-dispatcher": ">=5", + "symfony/security-csrf": "<3.4.11|~4.0,<4.0.11" }, "require-dev": { - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^8.5|^9.0" + "psr/log": "~1.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/security-csrf": "^3.4.11|^4.0.11|^5.0" + }, + "suggest": { + "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", + "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" }, "type": "library", "autoload": { "psr-4": { - "PhpDocReader\\": "src/PhpDocReader" - } + "Symfony\\Component\\Security\\Http\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", - "keywords": [ - "phpdoc", - "reflection" + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } ], + "description": "Symfony Security Component - HTTP Integration", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/PHP-DI/PhpDocReader/issues", - "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + "source": "https://github.com/symfony/security-http/tree/v4.4.26" }, - "time": "2020-10-12T12:39:22+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T16:29:25+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", + "name": "symfony/service-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "suggest": { + "symfony/service-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src/" + "Symfony\\Contracts\\Service\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4795,59 +5028,69 @@ ], "authors": [ { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, - "time": "2020-06-27T09:03:43+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", + "name": "symfony/stopwatch", + "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + "url": "https://github.com/symfony/stopwatch.git", + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", "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" + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4855,52 +5098,74 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" }, - "time": "2020-09-03T19:13:55+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "name": "symfony/string", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "url": "https://github.com/symfony/string.git", + "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "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": { - "ext-tokenizer": "*" + "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", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4908,109 +5173,94 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "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": "phploc/phploc", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phploc.git", - "reference": "5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884", - "reference": "5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884", - "shasum": "" - }, - "require": { - "php": "^7.2", - "sebastian/finder-facade": "^1.1", - "sebastian/version": "^2.0", - "symfony/console": "^4.0" - }, - "bin": [ - "phploc" + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.3" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "funding": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "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" } ], - "description": "A tool for quickly measuring the size of a PHP project.", - "homepage": "https://github.com/sebastianbergmann/phploc", - "support": { - "issues": "https://github.com/sebastianbergmann/phploc/issues", - "source": "https://github.com/sebastianbergmann/phploc/tree/master" - }, - "time": "2019-03-16T10:41:19+00:00" + "time": "2021-06-27T11:44:38+00:00" }, { - "name": "phpmetrics/phpmetrics", - "version": "v2.7.4", + "name": "symfony/translation", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/phpmetrics/PhpMetrics.git", - "reference": "e6a7aee0e0948e363eb78ce9d58573cd5af2cdec" + "url": "https://github.com/symfony/translation.git", + "reference": "2f7fa60b8d10ca71c30dc46b0870143183a8f131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/e6a7aee0e0948e363eb78ce9d58573cd5af2cdec", - "reference": "e6a7aee0e0948e363eb78ce9d58573cd5af2cdec", + "url": "https://api.github.com/repos/symfony/translation/zipball/2f7fa60b8d10ca71c30dc46b0870143183a8f131", + "reference": "2f7fa60b8d10ca71c30dc46b0870143183a8f131", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "nikic/php-parser": "^3|^4", - "php": ">=5.5" + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^1.1.6|^2" }, - "replace": { - "halleck45/php-metrics": "*", - "halleck45/phpmetrics": "*" + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/http-kernel": "<4.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "symfony/translation-implementation": "1.0|2.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14", - "sebastian/comparator": ">=1.2.3", - "squizlabs/php_codesniffer": "^3.5" + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/finder": "~2.8|~3.0|~4.0|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/intl": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" }, - "bin": [ - "bin/phpmetrics" - ], "type": "library", "autoload": { - "psr-0": { - "Hal\\": "./src/" + "psr-4": { + "Symfony\\Component\\Translation\\": "" }, - "files": [ - "./src/functions.php" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5019,60 +5269,68 @@ ], "authors": [ { - "name": "Jean-François Lépine", - "email": "lepinejeanfrancois@yahoo.fr", - "homepage": "http://www.lepine.pro", - "role": "Copyright Holder" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Static analyzer tool for PHP : Coupling, Cyclomatic complexity, Maintainability Index, Halstead's metrics... and more !", - "homepage": "http://www.phpmetrics.org", - "keywords": [ - "analysis", - "qa", - "quality", - "testing" - ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/PhpMetrics/PhpMetrics/issues", - "source": "https://github.com/phpmetrics/PhpMetrics/tree/master" + "source": "https://github.com/symfony/translation/tree/v4.4.26" }, - "time": "2020-06-30T20:33:55+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-06T08:51:46+00:00" }, { - "name": "phpspec/prophecy", - "version": "1.13.0", + "name": "symfony/translation-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", "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" + "php": ">=7.2.5" }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0" + "suggest": { + "symfony/translation-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { "psr-4": { - "Prophecy\\": "src/Prophecy" + "Symfony\\Contracts\\Translation\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -5081,354 +5339,545 @@ ], "authors": [ { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" }, - "time": "2021-03-17T13:42:18+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" }, { - "name": "phpstan/phpdoc-parser", - "version": "0.3.5", + "name": "symfony/twig-bridge", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "8c4ef2aefd9788238897b678a985e1d5c8df6db4" + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "9d02487374439164ef508824977ecdd146b9509f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/8c4ef2aefd9788238897b678a985e1d5c8df6db4", - "reference": "8c4ef2aefd9788238897b678a985e1d5c8df6db4", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/9d02487374439164ef508824977ecdd146b9509f", + "reference": "9d02487374439164ef508824977ecdd146b9509f", "shasum": "" }, "require": { - "php": "~7.1" + "php": ">=7.1.3", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^1.43|^2.13|^3.0.4" + }, + "conflict": { + "symfony/console": "<3.4", + "symfony/form": "<4.4", + "symfony/http-foundation": "<4.3", + "symfony/translation": "<4.2", + "symfony/workflow": "<4.3" }, "require-dev": { - "consistence/coding-standard": "^3.5", - "jakub-onderka/php-parallel-lint": "^0.9.2", - "phing/phing": "^2.16.0", - "phpstan/phpstan": "^0.10", - "phpunit/phpunit": "^6.3", - "slevomat/coding-standard": "^4.7.2", - "squizlabs/php_codesniffer": "^3.3.2", - "symfony/process": "^3.4 || ^4.0" + "egulias/email-validator": "^2.1.10|^3", + "symfony/asset": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/form": "^4.4.17", + "symfony/http-foundation": "^4.3|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/intl": "^4.4|^5.0", + "symfony/mime": "^4.3|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^3.0|^4.0|^5.0", + "symfony/security-csrf": "^3.4|^4.0|^5.0", + "symfony/security-http": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2.1|^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.3|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0", + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } + "suggest": { + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/templating": "For using the TwigEngine", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" }, + "type": "symfony-bridge", "autoload": { "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Twig with various Symfony components", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/master" + "source": "https://github.com/symfony/twig-bridge/tree/v4.4.26" }, - "time": "2019-06-07T19:13:52+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T16:29:25+00:00" }, { - "name": "phpstan/phpstan", - "version": "0.12.90", + "name": "symfony/twig-bundle", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "f0e4b56630fc3d4eb5be86606d07212ac212ede4" + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "1aab630e70f0ab1b77529e7f061c9e5f1f11dca7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f0e4b56630fc3d4eb5be86606d07212ac212ede4", - "reference": "f0e4b56630fc3d4eb5be86606d07212ac212ede4", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/1aab630e70f0ab1b77529e7f061c9e5f1f11dca7", + "reference": "1aab630e70f0ab1b77529e7f061c9e5f1f11dca7", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": ">=7.1.3", + "symfony/http-foundation": "^4.3|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^4.4|^5.0", + "twig/twig": "^1.43|^2.13|^3.0.4" }, "conflict": { - "phpstan/phpstan-shim": "*" + "symfony/dependency-injection": "<4.1", + "symfony/framework-bundle": "<4.4", + "symfony/translation": "<4.2" }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.12-dev" - } + "require-dev": { + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "^1.0|^2.0", + "symfony/asset": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^4.2.5|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/form": "^3.4|^4.0|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/web-link": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" }, + "type": "symfony-bundle", "autoload": { - "files": [ - "bootstrap.php" + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHPStan - PHP Static Analysis Tool", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/0.12.90" + "source": "https://github.com/symfony/twig-bundle/tree/v4.4.26" }, "funding": [ { - "url": "https://github.com/ondrejmirtes", - "type": "github" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "url": "https://github.com/phpstan", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://www.patreon.com/phpstan", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-06-18T07:15:38+00:00" + "time": "2021-06-28T15:39:02+00:00" }, { - "name": "phpunit/php-code-coverage", - "version": "7.0.14", + "name": "symfony/validator", + "version": "v4.4.26", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "bb7c9a210c72e4709cdde67f8b7362f672f2225c" + "url": "https://github.com/symfony/validator.git", + "reference": "1f20bad74b6d62f1a5779eeed47e91f3fa476094" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bb7c9a210c72e4709cdde67f8b7362f672f2225c", - "reference": "bb7c9a210c72e4709cdde67f8b7362f672f2225c", + "url": "https://api.github.com/repos/symfony/validator/zipball/1f20bad74b6d62f1a5779eeed47e91f3fa476094", + "reference": "1f20bad74b6d62f1a5779eeed47e91f3fa476094", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": ">=7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.1 || ^4.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^1.1|^2" + }, + "conflict": { + "doctrine/lexer": "<1.0.2", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.3", + "symfony/translation": ">=5.0", + "symfony/yaml": "<3.4" }, "require-dev": { - "phpunit/phpunit": "^8.2.2" + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "^1.0|^2.0", + "egulias/email-validator": "^2.1.10|^3", + "symfony/cache": "^3.4|^4.0|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-client": "^4.3|^5.0", + "symfony/http-foundation": "^4.1|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/intl": "^4.3|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2", + "symfony/yaml": "^3.4|^4.0|^5.0" }, "suggest": { - "ext-xdebug": "^2.7.2" + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader.", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "psr/cache-implementation": "For using the mapping cache.", + "symfony/config": "", + "symfony/expression-language": "For using the Expression validator", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For accessing properties within comparison constraints", + "symfony/property-info": "To automatically add NotNull and Type constraints", + "symfony/translation": "For translating validation errors.", + "symfony/yaml": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "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" - ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.14" + "source": "https://github.com/symfony/validator/tree/v4.4.26" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-12-02T13:39:03+00:00" + "time": "2021-06-30T07:16:09+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "2.0.3", + "name": "symfony/var-dumper", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "46aa709affb9ad3355bd7a810f9662d71025c384" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/4b49fb70f067272b659ef0174ff9ca40fdaa6357", - "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46aa709affb9ad3355bd7a810f9662d71025c384", + "reference": "46aa709affb9ad3355bd7a810f9662d71025c384", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", "autoload": { - "classmap": [ - "src/" + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", "keywords": [ - "filesystem", - "iterator" + "debug", + "dump" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.3" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.3" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-11-30T08:25:21+00:00" + "time": "2021-06-24T08:13:00+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "symfony/var-exporter", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "903c2c0babd6267de5bcb2995e8fc1efb5f01f1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/903c2c0babd6267de5bcb2995e8fc1efb5f01f1f", + "reference": "903c2c0babd6267de5bcb2995e8fc1efb5f01f1f", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/var-dumper": "^4.4.9|^5.0.9" }, "type": "library", "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", "keywords": [ - "template" + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "source": "https://github.com/symfony/var-exporter/tree/v5.3.3" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-27T09:16:08+00:00" }, { - "name": "phpunit/php-timer", - "version": "2.1.3", + "name": "twig/twig", + "version": "v3.3.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + "url": "https://github.com/twigphp/Twig.git", + "reference": "21578f00e83d4a82ecfa3d50752b609f13de6790" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/21578f00e83d4a82ecfa3d50752b609f13de6790", + "reference": "21578f00e83d4a82ecfa3d50752b609f13de6790", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "3.3-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Twig\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5436,211 +5885,246 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", "keywords": [ - "timer" + "templating" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.3.2" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" } ], - "time": "2020-11-30T08:20:02+00:00" - }, + "time": "2021-05-16T12:14:13+00:00" + } + ], + "packages-dev": [ { - "name": "phpunit/php-token-stream", - "version": "4.0.4", + "name": "brainmaestro/composer-git-hooks", + "version": "v2.8.5", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" + "url": "https://github.com/BrainMaestro/composer-git-hooks.git", + "reference": "ffed8803690ac12214082120eee3441b00aa390e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/ffed8803690ac12214082120eee3441b00aa390e", + "reference": "ffed8803690ac12214082120eee3441b00aa390e", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.3 || ^8.0" + "php": "^5.6 || >=7.0", + "symfony/console": "^3.2 || ^4.0 || ^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "ext-json": "*", + "friendsofphp/php-cs-fixer": "^2.9", + "phpunit/phpunit": "^5.7 || ^7.0" }, + "bin": [ + "cghooks" + ], "type": "library", "extra": { - "branch-alias": { - "dev-master": "4.0-dev" + "hooks": { + "pre-commit": "composer check-style", + "pre-push": [ + "composer test", + "appver=$(grep -o -E '\\d.\\d.\\d' cghooks)", + "tag=$(git describe --tags --abbrev=0)", + "if [ \"$tag\" != \"v$appver\" ]; then", + "echo \"The most recent tag $tag does not match the application version $appver\\n\"", + "tag=${tag#v}", + "sed -i -E \"s/$appver/$tag/\" cghooks", + "exit 1", + "fi" + ] } }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "BrainMaestro\\GitHooks\\": "src/" + }, + "files": [ + "src/helpers.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Ezinwa Okpoechi", + "email": "brainmaestro@outlook.com" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Easily manage git hooks in your composer config", "keywords": [ - "tokenizer" + "HOOK", + "composer", + "git" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" + "issues": "https://github.com/BrainMaestro/composer-git-hooks/issues", + "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v2.8.5" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "abandoned": true, - "time": "2020-08-04T08:28:15+00:00" + "time": "2021-02-08T15:59:11+00:00" }, { - "name": "phpunit/phpunit", - "version": "8.5.17", + "name": "composer/ca-bundle", + "version": "1.2.10", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "79067856d85421c56d413bd238d4e2cd6b0e54da" + "url": "https://github.com/composer/ca-bundle.git", + "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/79067856d85421c56d413bd238d4e2cd6b0e54da", - "reference": "79067856d85421c56d413bd238d4e2cd6b0e54da", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/9fdb22c2e97a614657716178093cd1da90a64aa8", + "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.0", - "phar-io/manifest": "^2.0.1", - "phar-io/version": "^3.0.2", - "php": ">=7.2", - "phpspec/prophecy": "^1.10.3", - "phpunit/php-code-coverage": "^7.0.12", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.3", - "sebastian/exporter": "^3.1.2", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" + "phpstan/phpstan": "^0.12.55", + "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "8.5-dev" + "dev-main": "1.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Composer\\CaBundle\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", "keywords": [ - "phpunit", - "testing", - "xunit" + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" ], "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.17" + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.2.10" }, "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/composer", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" } ], - "time": "2021-06-23T05:12:43+00:00" + "time": "2021-06-07T13:58:28+00:00" }, { - "name": "psr/cache", - "version": "1.0.1", + "name": "composer/composer", + "version": "1.10.22", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "url": "https://github.com/composer/composer.git", + "reference": "28c9dfbe2351635961f670773e8d7b17bc5eda25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/composer/composer/zipball/28c9dfbe2351635961f670773e8d7b17bc5eda25", + "reference": "28c9dfbe2351635961f670773e8d7b17bc5eda25", "shasum": "" }, "require": { - "php": ">=5.3.0" + "composer/ca-bundle": "^1.0", + "composer/semver": "^1.0", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^1.1", + "justinrainbow/json-schema": "^5.2.10", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.0", + "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "conflict": { + "symfony/console": "2.8.38" + }, + "require-dev": { + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2" }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Composer\\": "src/Composer" } }, "notification-url": "https://packagist.org/downloads/", @@ -5649,47 +6133,73 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Common interface for caching libraries", + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", "keywords": [ - "cache", - "psr", - "psr-6" + "autoload", + "dependency", + "package" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/composer/issues", + "source": "https://github.com/composer/composer/tree/1.10.22" }, - "time": "2016-08-06T20:24:11+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-04-27T11:10:45+00:00" }, { - "name": "psr/simple-cache", - "version": "1.0.1", + "name": "composer/semver", + "version": "1.7.2", "source": { "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + "url": "https://github.com/composer/semver.git", + "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "url": "https://api.github.com/repos/composer/semver/zipball/647490bbcaf7fc4891c58f47b825eb99d19c377a", + "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\SimpleCache\\": "src/" + "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5698,51 +6208,78 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "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": "Common interfaces for simple caching", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" + "semantic", + "semver", + "validation", + "versioning" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/1.7.2" }, - "time": "2017-10-23T01:57:42+00:00" + "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-12-03T15:47:16+00:00" }, { - "name": "richcongress/fixture-test", - "version": "v0.1.1", + "name": "composer/spdx-licenses", + "version": "1.5.5", "source": { "type": "git", - "url": "https://github.com/richcongress/fixture-test.git", - "reference": "00abb6cac8828ce1bc2fdd9f500b4043317a11bd" + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "de30328a7af8680efdc03e396aad24befd513200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/richcongress/fixture-test/zipball/00abb6cac8828ce1bc2fdd9f500b4043317a11bd", - "reference": "00abb6cac8828ce1bc2fdd9f500b4043317a11bd", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", + "reference": "de30328a7af8680efdc03e396aad24befd513200", "shasum": "" }, "require": { - "doctrine/annotations": "^1.11", - "nelmio/alice": "^3.7", - "php": ">=7.3", - "php-di/phpdoc-reader": "^2.2" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "richcongress/test-tools": "dev-master", - "roave/security-advisories": "dev-master" + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, "autoload": { "psr-4": { - "RichCongress\\FixtureTestBundle\\": "" + "Composer\\Spdx\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5751,49 +6288,74 @@ ], "authors": [ { - "name": "RichCongress", - "homepage": "https://www.richcongress.com" - } - ], - "description": "Generate random and meaningful data for objects", - "support": { - "docs": "https://github.com/richcongress/fixture-test/blob/master/README.md", - "email": "contact@richcongress.com", - "issues": "https://github.com/richcongress/fixture-test/issues", - "source": "https://github.com/richcongress/fixture-test" + "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": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" }, - "time": "2021-02-05T09:41:38+00:00" + "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-12-03T16:04:16+00:00" }, { - "name": "richcongress/recurrent-fixtures-test-bundle", - "version": "v0.1.2", + "name": "composer/xdebug-handler", + "version": "1.4.6", "source": { "type": "git", - "url": "https://github.com/rich-id/recurrent-fixtures-test-bundle.git", - "reference": "fe0f4a90b7748a3a91cdfdfb25859c40fd0fbdd7" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "f27e06cd9675801df441b3656569b328e04aa37c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rich-id/recurrent-fixtures-test-bundle/zipball/fe0f4a90b7748a3a91cdfdfb25859c40fd0fbdd7", - "reference": "fe0f4a90b7748a3a91cdfdfb25859c40fd0fbdd7", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f27e06cd9675801df441b3656569b328e04aa37c", + "reference": "f27e06cd9675801df441b3656569b328e04aa37c", "shasum": "" }, "require": { - "doctrine/doctrine-fixtures-bundle": "^3.4", - "php": ">=7.3", - "richcongress/bundle-toolbox": "*", - "richcongress/fixture-test": "^0.1", - "richcongress/web-test-bundle": "^0.1" + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" }, "require-dev": { - "infection/infection": "^0.16.4", - "php-coveralls/php-coveralls": "^2.1", - "roave/security-advisories": "dev-master" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, - "type": "symfony-bundle", + "type": "library", "autoload": { "psr-4": { - "RichCongress\\RecurrentFixturesTestBundle\\": "" + "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5802,92 +6364,132 @@ ], "authors": [ { - "name": "RichCongress", - "homepage": "https://www.richcongress.com" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "A magic bundle", + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], "support": { - "docs": "https://github.com/richcongress/recurrent-fixtures-test-bundle/blob/master/README.md", - "email": "contact@richcongress.com", - "issues": "https://github.com/richcongress/recurrent-fixtures-test-bundle/issues", - "source": "https://github.com/richcongress/recurrent-fixtures-test-bundle" + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/1.4.6" }, - "time": "2021-03-02T11:00:45+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-03-25T17:01:18+00:00" }, { - "name": "richcongress/static-analysis", - "version": "v0.1.0", + "name": "dama/doctrine-test-bundle", + "version": "v6.6.0", "source": { "type": "git", - "url": "https://github.com/rich-id/static-analysis.git", - "reference": "25efadca7d93c5c64c0ed1e31735bf45b8800268" + "url": "https://github.com/dmaicher/doctrine-test-bundle.git", + "reference": "8cfd3f9a4cc0f26101e6170f592900384b78b799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rich-id/static-analysis/zipball/25efadca7d93c5c64c0ed1e31735bf45b8800268", - "reference": "25efadca7d93c5c64c0ed1e31735bf45b8800268", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/8cfd3f9a4cc0f26101e6170f592900384b78b799", + "reference": "8cfd3f9a4cc0f26101e6170f592900384b78b799", "shasum": "" }, "require": { - "brainmaestro/composer-git-hooks": "^2.8", - "friendsofphp/php-cs-fixer": "^2.0 || ^3.0", - "nunomaduro/phpinsights": "^1.0 || ^2.0", - "phpmetrics/phpmetrics": "^2.7", - "phpstan/phpstan": "^0.12" + "doctrine/dbal": "^2.9.3 || ^3.0", + "doctrine/doctrine-bundle": "^1.11 || ^2.0", + "php": "^7.1 || ^8.0", + "symfony/cache": "^4.4 || ^5.2", + "symfony/framework-bundle": "^4.4 || ^5.2" + }, + "require-dev": { + "behat/behat": "^3.0", + "phpstan/phpstan": "^0.12.85", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "symfony/phpunit-bridge": "^5.2", + "symfony/process": "^4.4 || ^5.2", + "symfony/yaml": "^4.4 || ^5.2" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "7.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "DAMA\\DoctrineTestBundle\\": "src/DAMA/DoctrineTestBundle" + } }, - "bin": [ - "bin/static_analysis" - ], - "type": "library", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Nicolas Guilloux", - "email": "nguilloux@richcongress.com" + "name": "David Maicher", + "email": "mail@dmaicher.de" } ], - "description": "A library to setup quickly the static analysis tools for RichCongress", + "description": "Symfony bundle to isolate doctrine database tests and improve test performance", + "keywords": [ + "doctrine", + "isolation", + "performance", + "symfony", + "tests" + ], "support": { - "issues": "https://github.com/rich-id/static-analysis/issues", - "source": "https://github.com/rich-id/static-analysis/tree/v0.1.0" + "issues": "https://github.com/dmaicher/doctrine-test-bundle/issues", + "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v6.6.0" }, - "time": "2021-06-23T09:33:28+00:00" + "time": "2021-06-01T18:12:34+00:00" }, { - "name": "richcongress/test-framework", - "version": "v0.1.0", + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.1", "source": { "type": "git", - "url": "https://github.com/richcongress/test-framework.git", - "reference": "762c08ef66d5c1a13ed2a1b18cf2883acfa680de" + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/richcongress/test-framework/zipball/762c08ef66d5c1a13ed2a1b18cf2883acfa680de", - "reference": "762c08ef66d5c1a13ed2a1b18cf2883acfa680de", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c", "shasum": "" }, "require": { - "doctrine/annotations": "^1.11", - "php": ">=7.3", - "phpunit/phpunit": "^7|^8|^9" + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^7.5" + "composer/composer": "*", + "phpcompatibility/php-compatibility": "^9.0", + "sensiolabs/security-checker": "^4.1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, - "type": "library", "autoload": { "psr-4": { - "RichCongress\\TestFramework\\": "" - }, - "files": [ - "TestConfiguration/Annotation/TestConfig.php" - ] + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5895,45 +6497,77 @@ ], "authors": [ { - "name": "RichCongress", - "homepage": "https://www.richcongress.com" + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" } ], - "description": "A Test framework that uses the PHPUnit Extension with priorities", + "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": { - "docs": "https://github.com/richcongress/test-framework/blob/master/README.md", - "email": "contact@richcongress.com", - "issues": "https://github.com/richcongress/test-framework/issues", - "source": "https://github.com/richcongress/test-framework" + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" }, - "time": "2021-02-04T13:47:51+00:00" + "time": "2020-12-07T18:04:37+00:00" }, { - "name": "richcongress/test-suite", - "version": "v0.1.0", + "name": "doctrine/data-fixtures", + "version": "1.5.0", "source": { "type": "git", - "url": "https://github.com/richcongress/test-suite.git", - "reference": "3563ea09e3cf757b2425574f11a7bc3a91155968" + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/richcongress/test-suite/zipball/3563ea09e3cf757b2425574f11a7bc3a91155968", - "reference": "3563ea09e3cf757b2425574f11a7bc3a91155968", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51d3d4880d28951fff42a635a2389f8c63baddc5", + "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5", "shasum": "" }, "require": { - "php": ">=7.3", - "richcongress/fixture-test": "^0.1", - "richcongress/recurrent-fixtures-test-bundle": "^0.1", - "richcongress/test-framework": "^0.1", - "richcongress/test-tools": "^0.1", - "richcongress/web-test-bundle": "^0.1" + "doctrine/common": "^2.13|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "php": "^7.2 || ^8.0" }, - "type": "symfony-bundle", + "conflict": { + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "doctrine/dbal": "^2.5.4", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", + "doctrine/orm": "^2.7.0", + "ext-sqlite3": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", "autoload": { "psr-4": { - "RichCongress\\TestSuite\\": "" + "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" } }, "notification-url": "https://packagist.org/downloads/", @@ -5942,64 +6576,96 @@ ], "authors": [ { - "name": "RichCongress", - "homepage": "https://www.richcongress.com" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" } ], - "description": "The full RichCongress test suite for Symfony", + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database" + ], "support": { - "issues": "https://github.com/richcongress/test-suite/issues", - "source": "https://github.com/richcongress/test-suite/tree/v0.1.0" + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/1.5.0" }, - "time": "2021-02-05T12:53:55+00:00" - }, - { - "name": "richcongress/test-tools", - "version": "v0.1.0", - "source": { - "type": "git", - "url": "https://github.com/richcongress/test-tools.git", - "reference": "d22d3d6d4af9e29827c10ef1f40f785ae83d5651" + "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%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2021-01-23T10:20:43+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.4.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "4202ce675d29e70a8b9ee763bec021b6f44caccb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/richcongress/test-tools/zipball/d22d3d6d4af9e29827c10ef1f40f785ae83d5651", - "reference": "d22d3d6d4af9e29827c10ef1f40f785ae83d5651", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/4202ce675d29e70a8b9ee763bec021b6f44caccb", + "reference": "4202ce675d29e70a8b9ee763bec021b6f44caccb", "shasum": "" }, "require": { - "mockery/mockery": "^1.0", - "php": ">=7.3", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/dbal": "^2.9.0|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.1 || ^8.0", + "symfony/cache": "^4.3.3|^5.0|^6.0", + "symfony/config": "^4.4.3|^5.0|^6.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/dependency-injection": "^4.3.3|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/doctrine-bridge": "^4.4.22|^5.2.7|^6.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/service-contracts": "^1.1.1|^2.0" + }, + "conflict": { + "doctrine/orm": "<2.9", + "twig/twig": "<1.34|>=2.0,<2.4" }, "require-dev": { - "doctrine/annotations": "^1.11@dev", - "doctrine/orm": "^2.0 || ^3.0", - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^8.0", - "richcongress/static-analysis": "dev-master", - "roave/security-advisories": "dev-master", - "symfony/dependency-injection": "^4.0 || ^5.0", - "symfony/security": "^4.0 || ^5.0", - "symfony/translation": "^4.0 || ^5.0", - "symfony/validator": "^4.0 || ^5.0" + "doctrine/coding-standard": "^9.0", + "doctrine/orm": "^2.9", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", + "psalm/plugin-phpunit": "^0.15.1", + "psalm/plugin-symfony": "^2.3.0", + "symfony/phpunit-bridge": "^5.2|^6.0", + "symfony/property-info": "^4.3.3|^5.0|^6.0", + "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0|^6.0", + "twig/twig": "^1.34|^2.12|^3.0", + "vimeo/psalm": "^4.7" }, - "type": "library", - "extra": { - "hooks": { - "pre-commit": [ - "./bin/phpstan analyse", - "./bin/phpinsights analyse ./" - ] - } + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", + "symfony/web-profiler-bundle": "To use the data collector." }, + "type": "symfony-bundle", "autoload": { "psr-4": { - "RichCongress\\TestTools\\": "" - }, - "files": [ - "./Helper/GlobalNamespaceHelper.php" - ] + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6007,53 +6673,85 @@ ], "authors": [ { - "name": "RichCongress", - "homepage": "https://www.richcongress.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" } ], - "description": "This library gives a set of tools to test your application with Unit tests.", + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], "support": { - "issues": "https://github.com/richcongress/test-tools/issues", - "source": "https://github.com/richcongress/test-tools/tree/v0.1.0" + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.4.2" }, - "time": "2021-01-29T13:51:52+00:00" + "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%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2021-06-05T13:40:39+00:00" }, { - "name": "richcongress/web-test-bundle", - "version": "v0.1.1", + "name": "doctrine/doctrine-fixtures-bundle", + "version": "3.4.0", "source": { "type": "git", - "url": "https://github.com/richcongress/web-test-bundle.git", - "reference": "571e91406ff393ac32b2501193a01de3803ee145" + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "870189619a7770f468ffb0b80925302e065a3b34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/richcongress/web-test-bundle/zipball/571e91406ff393ac32b2501193a01de3803ee145", - "reference": "571e91406ff393ac32b2501193a01de3803ee145", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/870189619a7770f468ffb0b80925302e065a3b34", + "reference": "870189619a7770f468ffb0b80925302e065a3b34", "shasum": "" }, "require": { - "dama/doctrine-test-bundle": "^6.3", - "ext-json": "*", - "php": ">=7.3", - "php-di/phpdoc-reader": "^2.2", - "richcongress/bundle-toolbox": "*", - "richcongress/test-framework": "^0.1.", - "richcongress/test-tools": "^0.1", - "symfony/browser-kit": "^3.0 || ^4.0 || ^5.0", - "symfony/console": "^4.0|^5.0" + "doctrine/data-fixtures": "^1.3", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.6.0", + "doctrine/persistence": "^1.3.7|^2.0", + "php": "^7.1 || ^8.0", + "symfony/config": "^3.4|^4.3|^5.0", + "symfony/console": "^3.4|^4.3|^5.0", + "symfony/dependency-injection": "^3.4|^4.3|^5.0", + "symfony/doctrine-bridge": "^3.4|^4.1|^5.0", + "symfony/http-kernel": "^3.4|^4.3|^5.0" }, "require-dev": { - "roave/security-advisories": "dev-master", - "symfony/form": "^4.0|^5.0", - "symfony/orm-pack": "^1.0", - "symfony/security-bundle": "^4.0|^5.0", - "symfony/yaml": "^5.1" + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.4 || ^8.0 || ^9.2", + "symfony/phpunit-bridge": "^4.1|^5.0" }, "type": "symfony-bundle", "autoload": { "psr-4": { - "RichCongress\\WebTestBundle\\": "" + "Doctrine\\Bundle\\FixturesBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -6062,474 +6760,1384 @@ ], "authors": [ { - "name": "RichCongress", - "homepage": "https://www.richcongress.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" } ], - "description": "A magic bundle", + "description": "Symfony DoctrineFixturesBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], "support": { - "docs": "https://github.com/richcongress/web-test-bundle/blob/master/README.md", - "email": "contact@richcongress.com", - "issues": "https://github.com/richcongress/web-test-bundle/issues", - "source": "https://github.com/richcongress/web-test-bundle" + "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.0" }, - "time": "2021-02-05T09:31:06+00:00" + "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%2Fdoctrine-fixtures-bundle", + "type": "tidelift" + } + ], + "time": "2020-11-14T09:36:49+00:00" }, { - "name": "roave/security-advisories", - "version": "dev-latest", + "name": "doctrine/sql-formatter", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "a197227cab82dc91450ef7f6a03eb9db33603ca6" + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "56070bebac6e77230ed7d306ad13528e60732871" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/a197227cab82dc91450ef7f6a03eb9db33603ca6", - "reference": "a197227cab82dc91450ef7f6a03eb9db33603ca6", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/56070bebac6e77230ed7d306ad13528e60732871", + "reference": "56070bebac6e77230ed7d306ad13528e60732871", "shasum": "" }, - "conflict": { - "3f/pygmentize": "<1.2", - "adodb/adodb-php": "<5.20.12", - "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", - "amazing/media2click": ">=1,<1.3.3", - "amphp/artax": "<1.0.6|>=2,<2.0.6", - "amphp/http": "<1.0.1", - "amphp/http-client": ">=4,<4.4", - "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", - "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", - "aws/aws-sdk-php": ">=3,<3.2.1", - "bagisto/bagisto": "<0.1.5", - "barrelstrength/sprout-base-email": "<1.2.7", - "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": "<4.4.5", - "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", - "bolt/bolt": "<3.7.2", - "bolt/core": "<4.1.13", - "brightlocal/phpwhois": "<=4.2.5", - "buddypress/buddypress": "<5.1.2", - "bugsnag/bugsnag-laravel": ">=2,<2.0.2", - "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", - "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cartalyst/sentry": "<=2.1.6", - "centreon/centreon": "<20.10.7", - "cesnet/simplesamlphp-module-proxystatistics": "<3.1", - "codeigniter/framework": "<=3.0.6", - "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", - "contao-components/mediaelement": ">=2.14.2,<2.21.1", - "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", - "contao/listing-bundle": ">=4,<4.4.8", - "croogo/croogo": "<3.0.7", - "datadog/dd-trace": ">=0.30,<0.30.2", - "david-garcia/phpwhois": "<=4.3.1", - "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", - "directmailteam/direct-mail": "<5.2.4", - "doctrine/annotations": ">=1,<1.2.7", - "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", - "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", - "doctrine/doctrine-bundle": "<1.5.2", - "doctrine/doctrine-module": "<=0.7.1", - "doctrine/mongodb-odm": ">=1,<1.0.2", - "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<11.0.4", - "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", - "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", - "dweeves/magmi": "<=0.7.24", - "endroid/qr-code-bundle": "<3.4.2", - "enshrined/svg-sanitize": "<0.13.1", - "erusev/parsedown": "<1.7.2", - "ezsystems/demobundle": ">=5.4,<5.4.6.1", - "ezsystems/ez-support-tools": ">=2.2,<2.2.3", - "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", - "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", - "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", - "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", - "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", - "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", - "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", - "ezsystems/repository-forms": ">=2.3,<2.3.2.1", - "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", - "feehi/cms": "<=2.1.1", - "firebase/php-jwt": "<2", - "flarum/core": ">=1,<=1.0.1", - "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", - "flarum/tags": "<=0.1-beta.13", - "fluidtypo3/vhs": "<5.1.1", - "fooman/tcpdf": "<6.2.22", - "forkcms/forkcms": "<5.8.3", - "fossar/tcpdf-parser": "<6.2.22", - "francoisjacquet/rosariosis": "<6.5.1", - "friendsofsymfony/oauth2-php": "<1.3", - "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", - "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", - "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", - "fuel/core": "<1.8.1", - "getgrav/grav": "<=1.7.10", - "getkirby/cms": "<3.5.4", - "getkirby/panel": "<2.5.14", - "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", - "gree/jose": "<=2.2", - "gregwar/rst": "<1.0.3", - "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", - "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.26|>=7,<8.40", - "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": ">=7,<7.1.2", - "impresscms/impresscms": "<=1.4.2", - "intelliants/subrion": "<=4.2.1", - "ivankristianto/phpwhois": "<=4.3", - "james-heinrich/getid3": "<1.9.9", - "joomla/archive": "<1.1.10", - "joomla/session": "<1.3.1", - "jsmitty12/phpwhois": "<5.1", - "kazist/phpwhois": "<=4.2.6", - "kitodo/presentation": "<3.1.2", - "klaviyo/magento2-extension": ">=1,<3", - "kreait/firebase-php": ">=3.2,<3.8.1", - "la-haute-societe/tcpdf": "<6.2.22", - "laminas/laminas-http": "<2.14.2", - "laravel/framework": "<6.20.26|>=7,<8.40", - "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", - "league/commonmark": "<0.18.3", - "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", - "librenms/librenms": "<21.1", - "livewire/livewire": ">2.2.4,<2.2.6", - "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", - "magento/magento1ce": "<1.9.4.3", - "magento/magento1ee": ">=1,<1.14.4.3", - "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", - "marcwillmann/turn": "<0.3.3", - "mautic/core": "<3.3.2|= 2.13.1", - "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", - "mittwald/typo3_forum": "<1.2.1", - "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", - "namshi/jose": "<2.2", - "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", - "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", - "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", - "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", - "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", - "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", - "nukeviet/nukeviet": "<4.3.4", - "nystudio107/craft-seomatic": "<3.3", - "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", - "october/backend": "<1.1.2", - "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", - "october/october": ">=1.0.319,<1.0.466", - "october/rain": "<1.0.472|>=1.1,<1.1.2", - "onelogin/php-saml": "<2.10.4", - "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", - "opencart/opencart": "<=3.0.3.2", - "openid/php-openid": "<2.3", - "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", - "orchid/platform": ">=9,<9.4.4", - "oro/crm": ">=1.7,<1.7.4", - "oro/platform": ">=1.7,<1.7.4", - "padraic/humbug_get_contents": "<1.1.2", - "pagarme/pagarme-php": ">=0,<3", - "pagekit/pagekit": "<=1.0.18", - "paragonie/random_compat": "<2", - "passbolt/passbolt_api": "<2.11", - "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.12", - "personnummer/personnummer": "<3.0.2", - "phanan/koel": "<5.1.4", - "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.5", - "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", - "phpoffice/phpexcel": "<1.8.2", - "phpoffice/phpspreadsheet": "<1.16", - "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", - "phpwhois/phpwhois": "<=4.2.5", - "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<6.8.8", - "pocketmine/pocketmine-mp": "<3.15.4", - "pressbooks/pressbooks": "<5.18", - "prestashop/autoupgrade": ">=4,<4.10.1", - "prestashop/contactform": ">1.0.1,<4.3", - "prestashop/gamification": "<2.3.2", - "prestashop/productcomments": ">=4,<4.2.1", - "prestashop/ps_emailsubscription": "<2.6.1", - "prestashop/ps_facetedsearch": "<3.4.1", - "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", - "propel/propel": ">=2-alpha.1,<=2-alpha.7", - "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", - "pusher/pusher-php-server": "<2.2.1", - "pwweb/laravel-core": "<=0.3.6-beta", - "rainlab/debugbar-plugin": "<3.1", - "rmccue/requests": ">=1.6,<1.8", - "robrichards/xmlseclibs": "<3.0.4", - "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", - "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", - "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", - "sensiolabs/connect": "<4.2.3", - "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.3.5.2", - "shopware/platform": "<=6.3.5.2", - "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<=5.6.9", - "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", - "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", - "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", - "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", - "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.7.4", - "silverstripe/graphql": "<=3.5|>=4-alpha.1,<4-alpha.2", - "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", - "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", - "silverstripe/subsites": ">=2,<2.1.1", - "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", - "silverstripe/userforms": "<3", - "simple-updates/phpwhois": "<=1", - "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", - "simplesamlphp/simplesamlphp": "<1.18.6", - "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", - "simplito/elliptic-php": "<1.0.6", - "slim/slim": "<2.6", - "smarty/smarty": "<3.1.39", - "socalnick/scn-social-auth": "<1.15.2", - "socialiteproviders/steam": "<1.1", - "spoonity/tcpdf": "<6.2.22", - "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<0.29.2", - "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.59", - "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", - "swiftmailer/swiftmailer": ">=4,<5.4.5", - "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", - "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", - "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", - "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", - "symbiote/silverstripe-versionedfiles": "<=2.0.3", - "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", - "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", - "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", - "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", - "symfony/mime": ">=4.3,<4.3.8", - "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/polyfill": ">=1,<1.10", - "symfony/polyfill-php55": ">=1,<1.10", - "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", - "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", - "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", - "symfony/translation": ">=2,<2.0.17", - "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", - "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", - "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", - "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", - "t3/dce": ">=2.2,<2.6.2", - "t3g/svg-sanitizer": "<1.0.3", - "tecnickcom/tcpdf": "<6.2.22", - "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1-beta.1,<2.1.3", - "theonedemon/phpwhois": "<=4.2.5", - "titon/framework": ">=0,<9.9.99", - "tribalsystems/zenario": "<8.8.53370", - "truckersmp/phpwhois": "<=4.3.1", - "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", - "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", - "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", - "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", - "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", - "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", - "ua-parser/uap-php": "<3.8", - "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", - "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", - "vrana/adminer": "<4.7.9", - "wallabag/tcpdf": "<6.2.22", - "wikimedia/parsoid": "<0.12.2", - "willdurand/js-translation-bundle": "<2.1.1", - "wp-cli/wp-cli": "<2.5", - "yidashi/yii2cmf": "<=2", - "yii2mod/yii2-cms": "<1.9.2", - "yiisoft/yii": ">=1.1.14,<1.1.15", - "yiisoft/yii2": "<2.0.38", - "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.15", - "yiisoft/yii2-elasticsearch": "<2.0.5", - "yiisoft/yii2-gii": "<2.0.4", - "yiisoft/yii2-jui": "<2.0.4", - "yiisoft/yii2-redis": "<2.0.8", - "yoast-seo-for-typo3/yoast_seo": "<7.2.1", - "yourls/yourls": "<1.7.4", - "zendesk/zendesk_api_client_php": "<2.2.11", - "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", - "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", - "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", - "zendframework/zend-diactoros": ">=1,<1.8.4", - "zendframework/zend-feed": ">=1,<2.10.3", - "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": ">=1,<2.8.1", - "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", - "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", - "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", - "zendframework/zend-validator": ">=2.3,<2.3.6", - "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<=3", - "zendframework/zendframework1": "<1.12.20", - "zendframework/zendopenid": ">=2,<2.0.2", - "zendframework/zendxml": ">=1,<1.0.1", - "zetacomponents/mail": "<1.8.2", - "zf-commons/zfc-user": "<1.2.2", - "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2", - "zoujingli/thinkadmin": "<6.0.22" + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.x" + }, + "time": "2020-07-30T16:57:33+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.15.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "89c6201c74db25fa759ff16e78a4d8f32547770e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/89c6201c74db25fa759ff16e78a4d8f32547770e", + "reference": "89c6201c74db25fa759ff16e78a4d8f32547770e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/container": "^1.0", + "symfony/deprecation-contracts": "^2.2" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-intl": "*", + "symfony/phpunit-bridge": "^4.4 || ^5.2" + }, + "suggest": { + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.15-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.15.0" + }, + "time": "2021-07-06T20:39:40+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v2.19.0", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "d5b8a9d852b292c2f8a035200fa6844b1f82300b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/d5b8a9d852b292c2f8a035200fa6844b1f82300b", + "reference": "d5b8a9d852b292c2f8a035200fa6844b1f82300b", + "shasum": "" + }, + "require": { + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.2 || ^2.0", + "doctrine/annotations": "^1.2", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^5.6 || ^7.0 || ^8.0", + "php-cs-fixer/diff": "^1.3", + "symfony/console": "^3.4.43 || ^4.1.6 || ^5.0", + "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", + "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^3.0 || ^4.0 || ^5.0", + "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", + "symfony/polyfill-php70": "^1.0", + "symfony/polyfill-php72": "^1.4", + "symfony/process": "^3.0 || ^4.0 || ^5.0", + "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.0", + "keradus/cli-executor": "^1.4", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.4.2", + "php-cs-fixer/accessible-object": "^1.0", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy-phpunit": "^1.1 || ^2.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.13 || ^9.5", + "phpunitgoodpractices/polyfill": "^1.5", + "phpunitgoodpractices/traits": "^1.9.1", + "sanmai/phpunit-legacy-adapter": "^6.4 || ^8.2.1", + "symfony/phpunit-bridge": "^5.2.1", + "symfony/yaml": "^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters.", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", + "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "extra": { + "branch-alias": { + "dev-master": "2.19-dev" + } + }, + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "classmap": [ + "tests/Test/AbstractFixerTestCase.php", + "tests/Test/AbstractIntegrationCaseFactory.php", + "tests/Test/AbstractIntegrationTestCase.php", + "tests/Test/Assert/AssertTokensTrait.php", + "tests/Test/IntegrationCase.php", + "tests/Test/IntegrationCaseFactory.php", + "tests/Test/IntegrationCaseFactoryInterface.php", + "tests/Test/InternalIntegrationCaseFactory.php", + "tests/Test/IsIdenticalConstraint.php", + "tests/Test/TokensWithObservedTransformers.php", + "tests/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v2.19.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2021-05-03T21:43:24+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.10", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" + }, + "time": "2020-05-27T16:41:55+00:00" + }, + { + "name": "league/container", + "version": "3.3.5", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/container.git", + "reference": "048ab87810f508dbedbcb7ae941b606eb8ee353b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/container/zipball/048ab87810f508dbedbcb7ae941b606eb8ee353b", + "reference": "048ab87810f508dbedbcb7ae941b606eb8ee353b", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/container": "^1.0.0 || ^2.0.0" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "replace": { + "orno/di": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0", + "roave/security-advisories": "dev-master", + "scrutinizer/ocular": "^1.8", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Container\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Phil Bennett", + "email": "philipobenito@gmail.com", + "homepage": "http://www.philipobenito.com", + "role": "Developer" + } + ], + "description": "A fast and intuitive dependency injection container.", + "homepage": "https://github.com/thephpleague/container", + "keywords": [ + "container", + "dependency", + "di", + "injection", + "league", + "provider", + "service" + ], + "support": { + "issues": "https://github.com/thephpleague/container/issues", + "source": "https://github.com/thephpleague/container/tree/3.3.5" + }, + "funding": [ + { + "url": "https://github.com/philipobenito", + "type": "github" + } + ], + "time": "2021-03-16T09:42:56+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "d1339f64479af1bee0e82a0413813fe5345a54ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/d1339f64479af1bee0e82a0413813fe5345a54ea", + "reference": "d1339f64479af1bee0e82a0413813fe5345a54ea", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.4.3" + }, + "time": "2021-02-24T09:51:49+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": "nelmio/alice", + "version": "v3.8.2", + "source": { + "type": "git", + "url": "https://github.com/nelmio/alice.git", + "reference": "b57f4c6f039baa72e2bd5b75fd8de77e1b9228e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nelmio/alice/zipball/b57f4c6f039baa72e2bd5b75fd8de77e1b9228e3", + "reference": "b57f4c6f039baa72e2bd5b75fd8de77e1b9228e3", + "shasum": "" + }, + "require": { + "fakerphp/faker": "^1.10", + "myclabs/deep-copy": "^1.10", + "php": "^7.3 || ^8.0", + "sebastian/comparator": "^3.0 || ^4.0", + "symfony/property-access": "^2.8 || ^3.4 || ^4.0 || ^5.0", + "symfony/yaml": "^2.8 || ^3.4 || ^4.0 || ^5.0" + }, + "conflict": { + "symfony/framework-bundle": "<3.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.1.0", + "phpspec/prophecy": "^1.6", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.4 || ^9.3", + "symfony/phpunit-bridge": "^5.1.3", + "symfony/var-dumper": "^3.4 || ^4.0 || ^5.0" + }, + "suggest": { + "theofidry/alice-data-fixtures": "Wrapper for Alice to provide a persistence layer." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false + }, + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "files": [ + "src/deep_clone.php" + ], + "psr-4": { + "Nelmio\\Alice\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + }, + { + "name": "Tim Shelburne", + "email": "shelburt02@gmail.com" + }, + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Expressive fixtures generator", + "keywords": [ + "Fixture", + "data", + "faker", + "test" + ], + "support": { + "issues": "https://github.com/nelmio/alice/issues", + "source": "https://github.com/nelmio/alice/tree/v3.8.2" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2021-02-27T19:13:09+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.2", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/967cfc4f9a1acd5f1058d76715a424c53343c20c", + "reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.1" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "nette/tester": "~2.0", + "phpstan/phpstan": "^0.12", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.2" + }, + "time": "2021-03-03T22:53:25+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.11.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/fe14cf3672a149364fb66dfe11bf6549af899f94", + "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94", + "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.11.0" + }, + "time": "2021-07-03T13:36:55+00:00" + }, + { + "name": "nunomaduro/phpinsights", + "version": "v1.14.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/phpinsights.git", + "reference": "d8204dc1c30e5f0fe725b29eac1b5ea2202a7fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/phpinsights/zipball/d8204dc1c30e5f0fe725b29eac1b5ea2202a7fcf", + "reference": "d8204dc1c30e5f0fe725b29eac1b5ea2202a7fcf", + "shasum": "" + }, + "require": { + "composer/composer": "^1.7", + "ext-iconv": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "friendsofphp/php-cs-fixer": "^2.15", + "justinrainbow/json-schema": "^5.1", + "league/container": "^3.2", + "object-calisthenics/phpcs-calisthenics-rules": "^3.7", + "php": "^7.2", + "phploc/phploc": "^5.0|^6.0", + "psr/container": "^1.0", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.4", + "symfony/console": "^4.2|^5.0", + "symfony/finder": "^4.2|^5.0", + "symfony/http-client": "^4.3|^5.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^0.14.0", + "illuminate/console": "^5.8|^6.0|^7.0", + "illuminate/support": "^5.8|^6.0|^7.0", + "mockery/mockery": "^1.0", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^8.0|^9.0", + "symfony/var-dumper": "^4.2|^5.0", + "symplify/easy-coding-standard": "^7.1", + "thecodingmachine/phpstan-strict-rules": "^0.12.0" + }, + "suggest": { + "ext-simplexml": "It is needed for the checkstyle formatter" + }, + "bin": [ + "bin/phpinsights" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\PhpInsights\\Application\\Adapters\\Laravel\\InsightsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\PhpInsights\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Instant PHP quality checks from your console.", + "keywords": [ + "Insights", + "code", + "console", + "php", + "quality", + "source" + ], + "support": { + "issues": "https://github.com/nunomaduro/phpinsights/issues", + "source": "https://github.com/nunomaduro/phpinsights/tree/v1.14.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/olivernybroe", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-01-27T19:08:59+00:00" + }, + { + "name": "object-calisthenics/phpcs-calisthenics-rules", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/object-calisthenics/phpcs-calisthenics-rules.git", + "reference": "c26ce1f98ea25e4791ab0f171b2737a4f5609de6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/object-calisthenics/phpcs-calisthenics-rules/zipball/c26ce1f98ea25e4791ab0f171b2737a4f5609de6", + "reference": "c26ce1f98ea25e4791ab0f171b2737a4f5609de6", + "shasum": "" + }, + "require": { + "nette/utils": "^3.1", + "php": "^7.2", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "require-dev": { + "phpstan/phpdoc-parser": "0.4.8 as 0.4.4", + "phpstan/phpstan": "^0.12.32", + "phpunit/phpunit": "^8.5|^9.0", + "rector/rector": "^0.7.43", + "symplify/changelog-linker": "^8.1", + "symplify/coding-standard": "^8.1", + "symplify/easy-coding-standard-tester": "^8.1", + "symplify/phpstan-extensions": "^8.1", + "tracy/tracy": "^2.7" + }, + "type": "phpcodesniffer-standard", + "autoload": { + "psr-4": { + "ObjectCalisthenics\\": "src/ObjectCalisthenics" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP CodeSniffer Object Calisthenics rules/sniffs", + "support": { + "issues": "https://github.com/object-calisthenics/phpcs-calisthenics-rules/issues", + "source": "https://github.com/object-calisthenics/phpcs-calisthenics-rules/tree/master" + }, + "abandoned": "symplify/phpstan-rules", + "time": "2020-07-06T12:11:43+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.1.0", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "bae7c545bef187884426f042434e561ab1ddb182" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] }, - "default-branch": true, - "type": "metapackage", "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "role": "maintainer" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "name": "Ilya Tribusean", - "email": "slash3b@gmail.com", - "role": "maintainer" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/Roave/SecurityAdvisories/issues", - "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" }, - "funding": [ + "time": "2021-02-23T14:00:09+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/dbd31aeb251639ac0b9e7e29405c1441907f5759", + "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ { - "url": "https://github.com/Ocramius", - "type": "github" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", - "type": "tidelift" + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "SpacePossum" } ], - "time": "2021-06-22T16:08:33+00:00" + "description": "sebastian/diff v2 backport support for PHP5.6", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/diff/issues", + "source": "https://github.com/PHP-CS-Fixer/diff/tree/v1.3.1" + }, + "time": "2020-10-14T08:39:05+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", + "name": "php-di/phpdoc-reader", + "version": "2.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + "url": "https://github.com/PHP-DI/PhpDocReader.git", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.2.0" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpDocReader\\": "src/PhpDocReader" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", + "keywords": [ + "phpdoc", + "reflection" + ], + "support": { + "issues": "https://github.com/PHP-DI/PhpDocReader/issues", + "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + }, + "time": "2020-10-12T12:39:22+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-master": "1.0.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Mike van Riel", + "email": "me@mikevanriel.com" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T08:15:22+00:00" + "time": "2020-09-17T18:55:26+00:00" }, { - "name": "sebastian/comparator", - "version": "3.0.3", + "name": "phploc/phploc", + "version": "5.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" + "url": "https://github.com/sebastianbergmann/phploc.git", + "reference": "5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", + "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884", + "reference": "5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884", "shasum": "" }, "require": { - "php": ">=7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" + "php": "^7.2", + "sebastian/finder-facade": "^1.1", + "sebastian/version": "^2.0", + "symfony/console": "^4.0" }, + "bin": [ + "phploc" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -6544,324 +8152,305 @@ "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" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], + "description": "A tool for quickly measuring the size of a PHP project.", + "homepage": "https://github.com/sebastianbergmann/phploc", "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + "issues": "https://github.com/sebastianbergmann/phploc/issues", + "source": "https://github.com/sebastianbergmann/phploc/tree/master" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T08:04:30+00:00" + "time": "2019-03-16T10:41:19+00:00" }, { - "name": "sebastian/diff", - "version": "3.0.3", + "name": "phpmetrics/phpmetrics", + "version": "v2.7.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" + "url": "https://github.com/phpmetrics/PhpMetrics.git", + "reference": "e6a7aee0e0948e363eb78ce9d58573cd5af2cdec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/e6a7aee0e0948e363eb78ce9d58573cd5af2cdec", + "reference": "e6a7aee0e0948e363eb78ce9d58573cd5af2cdec", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-dom": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^3|^4", + "php": ">=5.5" + }, + "replace": { + "halleck45/php-metrics": "*", + "halleck45/phpmetrics": "*" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14", + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^3.5" }, + "bin": [ + "bin/phpmetrics" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-0": { + "Hal\\": "./src/" + }, + "files": [ + "./src/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Jean-François Lépine", + "email": "lepinejeanfrancois@yahoo.fr", + "homepage": "http://www.lepine.pro", + "role": "Copyright Holder" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", + "description": "Static analyzer tool for PHP : Coupling, Cyclomatic complexity, Maintainability Index, Halstead's metrics... and more !", + "homepage": "http://www.phpmetrics.org", "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" + "analysis", + "qa", + "quality", + "testing" ], "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + "issues": "https://github.com/PhpMetrics/PhpMetrics/issues", + "source": "https://github.com/phpmetrics/PhpMetrics/tree/master" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:59:04+00:00" + "time": "2020-06-30T20:33:55+00:00" }, { - "name": "sebastian/environment", - "version": "4.2.4", + "name": "phpspec/prophecy", + "version": "1.13.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + "url": "https://github.com/phpspec/prophecy.git", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", "shasum": "" }, "require": { - "php": ">=7.1" + "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": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Prophecy\\": "src/Prophecy" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", "keywords": [ - "Xdebug", - "environment", - "hhvm" + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" ], "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.13.0" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:53:42+00:00" + "time": "2021-03-17T13:42:18+00:00" }, { - "name": "sebastian/exporter", - "version": "3.1.3", + "name": "phpstan/phpdoc-parser", + "version": "0.4.9", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", - "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/98a088b17966bdf6ee25c8a4b634df313d8aa531", + "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/recursion-context": "^3.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "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": "3.1.x-dev" + "dev-master": "0.4-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "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" + "MIT" ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/master" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:47:53+00:00" + "time": "2020-08-03T20:32:43+00:00" }, { - "name": "sebastian/finder-facade", - "version": "1.2.3", + "name": "phpstan/phpstan", + "version": "0.12.91", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/finder-facade.git", - "reference": "167c45d131f7fc3d159f56f191a0a22228765e16" + "url": "https://github.com/phpstan/phpstan.git", + "reference": "8226701cd228a0d63c2df995de7ab6070c69ac6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/167c45d131f7fc3d159f56f191a0a22228765e16", - "reference": "167c45d131f7fc3d159f56f191a0a22228765e16", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8226701cd228a0d63c2df995de7ab6070c69ac6a", + "reference": "8226701cd228a0d63c2df995de7ab6070c69ac6a", "shasum": "" }, "require": { - "php": "^7.1", - "symfony/finder": "^2.3|^3.0|^4.0|^5.0", - "theseer/fdomdocument": "^1.6" + "php": "^7.1|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" }, + "bin": [ + "phpstan", + "phpstan.phar" + ], "type": "library", "extra": { - "branch-alias": [] + "branch-alias": { + "dev-master": "0.12-dev" + } }, "autoload": { - "classmap": [ - "src/" + "files": [ + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ + "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/0.12.91" + }, + "funding": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" } ], - "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", - "homepage": "https://github.com/sebastianbergmann/finder-facade", - "support": { - "issues": "https://github.com/sebastianbergmann/finder-facade/issues", - "source": "https://github.com/sebastianbergmann/finder-facade/tree/1.2" - }, - "abandoned": true, - "time": "2020-01-16T08:08:45+00:00" + "time": "2021-07-04T15:31:48+00:00" }, { - "name": "sebastian/global-state", - "version": "3.0.1", + "name": "phpunit/php-code-coverage", + "version": "7.0.14", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "474fb9edb7ab891665d3bfc6317f42a0a150454b" + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "bb7c9a210c72e4709cdde67f8b7362f672f2225c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/474fb9edb7ab891665d3bfc6317f42a0a150454b", - "reference": "474fb9edb7ab891665d3bfc6317f42a0a150454b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bb7c9a210c72e4709cdde67f8b7362f672f2225c", + "reference": "bb7c9a210c72e4709cdde67f8b7362f672f2225c", "shasum": "" }, "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", "php": ">=7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.1.1 || ^4.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^4.2.2", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1.3" }, "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^8.2.2" }, "suggest": { - "ext-uopz": "*" + "ext-xdebug": "^2.7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "7.0-dev" } }, "autoload": { @@ -6876,17 +8465,20 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ - "global state" + "coverage", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.1" + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.14" }, "funding": [ { @@ -6894,34 +8486,32 @@ "type": "github" } ], - "time": "2020-11-30T07:43:24+00:00" + "time": "2020-12-02T13:39:03+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "3.0.4", + "name": "phpunit/php-file-iterator", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/4b49fb70f067272b659ef0174ff9ca40fdaa6357", + "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -6936,14 +8526,19 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "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/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.3" }, "funding": [ { @@ -6951,34 +8546,26 @@ "type": "github" } ], - "time": "2020-11-30T07:40:27+00:00" + "time": "2020-11-30T08:25:21+00:00" }, { - "name": "sebastian/object-reflector", - "version": "1.1.2", + "name": "phpunit/php-text-template", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "shasum": "" }, "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" + "php": ">=5.3.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "classmap": [ "src/" @@ -6991,47 +8578,45 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:37:18+00:00" + "time": "2015-06-21T13:50:34+00:00" }, { - "name": "sebastian/recursion-context", - "version": "3.0.1", + "name": "phpunit/php-timer", + "version": "2.1.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -7046,22 +8631,18 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" }, "funding": [ { @@ -7069,29 +8650,33 @@ "type": "github" } ], - "time": "2020-11-30T07:34:24+00:00" + "time": "2020-11-30T08:20:02+00:00" }, { - "name": "sebastian/resource-operations", - "version": "2.0.2", + "name": "phpunit/php-token-stream", + "version": "4.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-tokenizer": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -7109,11 +8694,14 @@ "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", + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" }, "funding": [ { @@ -7121,32 +8709,65 @@ "type": "github" } ], - "time": "2020-11-30T07:30:19+00:00" + "abandoned": true, + "time": "2020-08-04T08:28:15+00:00" }, { - "name": "sebastian/type", - "version": "1.1.4", + "name": "phpunit/phpunit", + "version": "8.5.17", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "79067856d85421c56d413bd238d4e2cd6b0e54da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/79067856d85421c56d413bd238d4e2cd6b0e54da", + "reference": "79067856d85421c56d413bd238d4e2cd6b0e54da", "shasum": "" }, "require": { - "php": ">=7.2" + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.0", + "phar-io/manifest": "^2.0.1", + "phar-io/version": "^3.0.2", + "php": ">=7.2", + "phpspec/prophecy": "^1.10.3", + "phpunit/php-code-coverage": "^7.0.12", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1.2", + "sebastian/comparator": "^3.0.2", + "sebastian/diff": "^3.0.2", + "sebastian/environment": "^4.2.3", + "sebastian/exporter": "^3.1.2", + "sebastian/global-state": "^3.0.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", + "sebastian/version": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^8.2" + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0.0" }, + "bin": [ + "phpunit" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "8.5-dev" } }, "autoload": { @@ -7165,94 +8786,108 @@ "role": "lead" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.17" }, "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, { "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2020-11-30T07:25:11+00:00" + "time": "2021-06-23T05:12:43+00:00" }, { - "name": "sebastian/version", - "version": "2.0.1", + "name": "richcongress/fixture-test", + "version": "v0.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "url": "https://github.com/richcongress/fixture-test.git", + "reference": "00abb6cac8828ce1bc2fdd9f500b4043317a11bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/richcongress/fixture-test/zipball/00abb6cac8828ce1bc2fdd9f500b4043317a11bd", + "reference": "00abb6cac8828ce1bc2fdd9f500b4043317a11bd", "shasum": "" }, "require": { - "php": ">=5.6" + "doctrine/annotations": "^1.11", + "nelmio/alice": "^3.7", + "php": ">=7.3", + "php-di/phpdoc-reader": "^2.2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "require-dev": { + "richcongress/test-tools": "dev-master", + "roave/security-advisories": "dev-master" }, + "type": "library", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "RichCongress\\FixtureTestBundle\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "RichCongress", + "homepage": "https://www.richcongress.com" } ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", + "description": "Generate random and meaningful data for objects", "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" + "docs": "https://github.com/richcongress/fixture-test/blob/master/README.md", + "email": "contact@richcongress.com", + "issues": "https://github.com/richcongress/fixture-test/issues", + "source": "https://github.com/richcongress/fixture-test" }, - "time": "2016-10-03T07:35:21+00:00" + "time": "2021-02-05T09:41:38+00:00" }, { - "name": "seld/jsonlint", - "version": "1.8.3", + "name": "richcongress/recurrent-fixtures-test-bundle", + "version": "v0.1.4", "source": { "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "url": "https://github.com/rich-id/recurrent-fixtures-test-bundle.git", + "reference": "42cf253add52029e7876cb0ceaa8972c7aad0a2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/rich-id/recurrent-fixtures-test-bundle/zipball/42cf253add52029e7876cb0ceaa8972c7aad0a2f", + "reference": "42cf253add52029e7876cb0ceaa8972c7aad0a2f", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0 || ^8.0" + "doctrine/doctrine-fixtures-bundle": "^3.4", + "php": ">=7.3", + "richcongress/bundle-toolbox": "*", + "richcongress/fixture-test": "^0.1", + "richcongress/web-test-bundle": "^0.1" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "infection/infection": "^0.16.4", + "php-coveralls/php-coveralls": "^2.1", + "roave/security-advisories": "dev-master" }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", + "type": "symfony-bundle", "autoload": { "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" + "RichCongress\\RecurrentFixturesTestBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -7261,61 +8896,92 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "RichCongress", + "homepage": "https://www.richcongress.com" } ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], + "description": "A magic bundle", "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "docs": "https://github.com/richcongress/recurrent-fixtures-test-bundle/blob/master/README.md", + "email": "contact@richcongress.com", + "issues": "https://github.com/richcongress/recurrent-fixtures-test-bundle/issues", + "source": "https://github.com/richcongress/recurrent-fixtures-test-bundle" }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, + "time": "2021-07-08T08:40:56+00:00" + }, + { + "name": "richcongress/static-analysis", + "version": "v0.1.0", + "source": { + "type": "git", + "url": "https://github.com/rich-id/static-analysis.git", + "reference": "25efadca7d93c5c64c0ed1e31735bf45b8800268" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rich-id/static-analysis/zipball/25efadca7d93c5c64c0ed1e31735bf45b8800268", + "reference": "25efadca7d93c5c64c0ed1e31735bf45b8800268", + "shasum": "" + }, + "require": { + "brainmaestro/composer-git-hooks": "^2.8", + "friendsofphp/php-cs-fixer": "^2.0 || ^3.0", + "nunomaduro/phpinsights": "^1.0 || ^2.0", + "phpmetrics/phpmetrics": "^2.7", + "phpstan/phpstan": "^0.12" + }, + "bin": [ + "bin/static_analysis" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" + "name": "Nicolas Guilloux", + "email": "nguilloux@richcongress.com" } ], - "time": "2020-11-11T09:19:24+00:00" + "description": "A library to setup quickly the static analysis tools for RichCongress", + "support": { + "issues": "https://github.com/rich-id/static-analysis/issues", + "source": "https://github.com/rich-id/static-analysis/tree/v0.1.0" + }, + "time": "2021-06-23T09:33:28+00:00" }, { - "name": "seld/phar-utils", - "version": "1.1.1", + "name": "richcongress/test-framework", + "version": "v0.1.2", "source": { "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" + "url": "https://github.com/rich-id/test-framework.git", + "reference": "adb67d9360044e8dfc4ad8c58201482c425b6aaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", - "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", + "url": "https://api.github.com/repos/rich-id/test-framework/zipball/adb67d9360044e8dfc4ad8c58201482c425b6aaf", + "reference": "adb67d9360044e8dfc4ad8c58201482c425b6aaf", "shasum": "" }, "require": { - "php": ">=5.3" + "doctrine/annotations": "^1.11", + "php": "^7.1|^8.0", + "phpunit/phpunit": "^7|^8|^9" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^9.5" }, + "type": "library", "autoload": { "psr-4": { - "Seld\\PharUtils\\": "src/" - } + "RichCongress\\TestFramework\\": "" + }, + "files": [ + "TestConfiguration/Annotation/TestConfig.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7323,53 +8989,45 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "RichCongress", + "homepage": "https://www.richcongress.com" } ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], + "description": "A Test framework that uses the PHPUnit Extension with priorities", "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/master" + "docs": "https://github.com/richcongress/test-framework/blob/master/README.md", + "email": "contact@richcongress.com", + "issues": "https://github.com/richcongress/test-framework/issues", + "source": "https://github.com/richcongress/test-framework" }, - "time": "2020-07-07T18:42:57+00:00" + "time": "2021-07-08T08:14:06+00:00" }, { - "name": "sensiolabs/security-checker", - "version": "v6.0.3", + "name": "richcongress/test-suite", + "version": "v0.1.0", "source": { "type": "git", - "url": "https://github.com/sensiolabs/security-checker.git", - "reference": "a576c01520d9761901f269c4934ba55448be4a54" + "url": "https://github.com/richcongress/test-suite.git", + "reference": "3563ea09e3cf757b2425574f11a7bc3a91155968" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/a576c01520d9761901f269c4934ba55448be4a54", - "reference": "a576c01520d9761901f269c4934ba55448be4a54", + "url": "https://api.github.com/repos/richcongress/test-suite/zipball/3563ea09e3cf757b2425574f11a7bc3a91155968", + "reference": "3563ea09e3cf757b2425574f11a7bc3a91155968", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/console": "^2.8|^3.4|^4.2|^5.0", - "symfony/http-client": "^4.3|^5.0", - "symfony/mime": "^4.3|^5.0", - "symfony/polyfill-ctype": "^1.11" - }, - "bin": [ - "security-checker" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.0-dev" - } + "php": ">=7.3", + "richcongress/fixture-test": "^0.1", + "richcongress/recurrent-fixtures-test-bundle": "^0.1", + "richcongress/test-framework": "^0.1", + "richcongress/test-tools": "^0.1", + "richcongress/web-test-bundle": "^0.1" }, + "type": "symfony-bundle", "autoload": { "psr-4": { - "SensioLabs\\Security\\": "SensioLabs/Security" + "RichCongress\\TestSuite\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -7378,1352 +9036,1319 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien.potencier@gmail.com" + "name": "RichCongress", + "homepage": "https://www.richcongress.com" } ], - "description": "A security checker for your composer.lock", + "description": "The full RichCongress test suite for Symfony", "support": { - "issues": "https://github.com/sensiolabs/security-checker/issues", - "source": "https://github.com/sensiolabs/security-checker/tree/master" + "issues": "https://github.com/richcongress/test-suite/issues", + "source": "https://github.com/richcongress/test-suite/tree/v0.1.0" }, - "abandoned": "https://github.com/fabpot/local-php-security-checker", - "time": "2019-11-01T13:20:14+00:00" + "time": "2021-02-05T12:53:55+00:00" }, { - "name": "slevomat/coding-standard", - "version": "5.0.4", + "name": "richcongress/test-tools", + "version": "v0.1.0", "source": { "type": "git", - "url": "https://github.com/slevomat/coding-standard.git", - "reference": "287ac3347c47918c0bf5e10335e36197ea10894c" + "url": "https://github.com/richcongress/test-tools.git", + "reference": "d22d3d6d4af9e29827c10ef1f40f785ae83d5651" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/287ac3347c47918c0bf5e10335e36197ea10894c", - "reference": "287ac3347c47918c0bf5e10335e36197ea10894c", + "url": "https://api.github.com/repos/richcongress/test-tools/zipball/d22d3d6d4af9e29827c10ef1f40f785ae83d5651", + "reference": "d22d3d6d4af9e29827c10ef1f40f785ae83d5651", "shasum": "" }, "require": { - "php": "^7.1", - "phpstan/phpdoc-parser": "^0.3.1", - "squizlabs/php_codesniffer": "^3.4.1" + "mockery/mockery": "^1.0", + "php": ">=7.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "require-dev": { - "jakub-onderka/php-parallel-lint": "1.0.0", - "phing/phing": "2.16.1", - "phpstan/phpstan": "0.11.4", - "phpstan/phpstan-phpunit": "0.11", - "phpstan/phpstan-strict-rules": "0.11", - "phpunit/phpunit": "8.0.5" + "doctrine/annotations": "^1.11@dev", + "doctrine/orm": "^2.0 || ^3.0", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^8.0", + "richcongress/static-analysis": "dev-master", + "roave/security-advisories": "dev-master", + "symfony/dependency-injection": "^4.0 || ^5.0", + "symfony/security": "^4.0 || ^5.0", + "symfony/translation": "^4.0 || ^5.0", + "symfony/validator": "^4.0 || ^5.0" + }, + "type": "library", + "extra": { + "hooks": { + "pre-commit": [ + "./bin/phpstan analyse", + "./bin/phpinsights analyse ./" + ] + } }, - "type": "phpcodesniffer-standard", "autoload": { "psr-4": { - "SlevomatCodingStandard\\": "SlevomatCodingStandard" - } + "RichCongress\\TestTools\\": "" + }, + "files": [ + "./Helper/GlobalNamespaceHelper.php" + ] }, "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.", + "authors": [ + { + "name": "RichCongress", + "homepage": "https://www.richcongress.com" + } + ], + "description": "This library gives a set of tools to test your application with Unit tests.", "support": { - "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/master" + "issues": "https://github.com/richcongress/test-tools/issues", + "source": "https://github.com/richcongress/test-tools/tree/v0.1.0" }, - "time": "2019-03-22T19:10:53+00:00" + "time": "2021-01-29T13:51:52+00:00" }, { - "name": "squizlabs/php_codesniffer", - "version": "3.6.0", + "name": "richcongress/web-test-bundle", + "version": "v0.1.1", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" + "url": "https://github.com/richcongress/web-test-bundle.git", + "reference": "571e91406ff393ac32b2501193a01de3803ee145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "url": "https://api.github.com/repos/richcongress/web-test-bundle/zipball/571e91406ff393ac32b2501193a01de3803ee145", + "reference": "571e91406ff393ac32b2501193a01de3803ee145", "shasum": "" }, "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" + "dama/doctrine-test-bundle": "^6.3", + "ext-json": "*", + "php": ">=7.3", + "php-di/phpdoc-reader": "^2.2", + "richcongress/bundle-toolbox": "*", + "richcongress/test-framework": "^0.1.", + "richcongress/test-tools": "^0.1", + "symfony/browser-kit": "^3.0 || ^4.0 || ^5.0", + "symfony/console": "^4.0|^5.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "roave/security-advisories": "dev-master", + "symfony/form": "^4.0|^5.0", + "symfony/orm-pack": "^1.0", + "symfony/security-bundle": "^4.0|^5.0", + "symfony/yaml": "^5.1" }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "RichCongress\\WebTestBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Greg Sherwood", - "role": "lead" + "name": "RichCongress", + "homepage": "https://www.richcongress.com" } ], - "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" - ], + "description": "A magic bundle", "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + "docs": "https://github.com/richcongress/web-test-bundle/blob/master/README.md", + "email": "contact@richcongress.com", + "issues": "https://github.com/richcongress/web-test-bundle/issues", + "source": "https://github.com/richcongress/web-test-bundle" }, - "time": "2021-04-09T00:54:41+00:00" + "time": "2021-02-05T09:31:06+00:00" }, { - "name": "symfony/browser-kit", - "version": "v5.3.0", + "name": "roave/security-advisories", + "version": "dev-latest", "source": { "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734" + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "1a08d0c7ab47e57fad0d254951a615f07445e91f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/379984e25eee9811b0a25a2105e1a2b3b8d9b734", - "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/1a08d0c7ab47e57fad0d254951a615f07445e91f", + "reference": "1a08d0c7ab47e57fad0d254951a615f07445e91f", "shasum": "" }, - "require": { - "php": ">=7.2.5", - "symfony/dom-crawler": "^4.4|^5.0" - }, - "require-dev": { - "symfony/css-selector": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0" - }, - "suggest": { - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "baserproject/basercms": "<4.4.5", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bolt/bolt": "<3.7.2", + "bolt/core": "<4.1.13", + "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<20.10.7", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.16|>=4.10,<4.11.5|= 4.10.0", + "contao/listing-bundle": ">=4,<4.4.8", + "craftcms/cms": "<3.6.7", + "croogo/croogo": "<3.0.7", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "directmailteam/direct-mail": "<5.2.4", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<11.0.4", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "dweeves/magmi": "<=0.7.24", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", + "erusev/parsedown": "<1.7.2", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", + "feehi/cms": "<=2.1.1", + "firebase/php-jwt": "<2", + "flarum/core": ">=1,<=1.0.1", + "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", + "flarum/tags": "<=0.1-beta.13", + "fluidtypo3/vhs": "<5.1.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.8.3", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<6.5.1", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "fuel/core": "<1.8.1", + "getgrav/grav": "<=1.7.10", + "getkirby/cms": "<=3.5.6", + "getkirby/panel": "<2.5.14", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<8.40", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", + "impresscms/impresscms": "<=1.4.2", + "intelliants/subrion": "<=4.2.1", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/archive": "<1.1.10", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kitodo/presentation": "<3.1.2", + "klaviyo/magento2-extension": ">=1,<3", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-http": "<2.14.2", + "laravel/framework": "<6.20.26|>=7,<8.40", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<21.1", + "livewire/livewire": ">2.2.4,<2.2.6", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "marcwillmann/turn": "<0.3.3", + "mautic/core": "<3.3.2|= 2.13.1", + "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mittwald/typo3_forum": "<1.2.1", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", + "namshi/jose": "<2.2", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nukeviet/nukeviet": "<4.3.4", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", + "october/october": ">=1.0.319,<1.0.466", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "opencart/opencart": "<=3.0.3.2", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", + "orchid/platform": ">=9,<9.4.4", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.12", + "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<6.8.8", + "pocketmine/pocketmine-mp": "<3.15.4", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", + "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6-beta", + "rainlab/debugbar-plugin": "<3.1", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": "<3.0.4", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/core": "<=6.4.1", + "shopware/platform": "<=6.4.1", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.6.9", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.7.4", + "silverstripe/graphql": "<=3.5|>=4-alpha.1,<4-alpha.2", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.39", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.59", + "sulu/sulu": "<1.6.41|>=2,<2.0.10|>=2.1,<2.1.1", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3/dce": ">=2.2,<2.6.2", + "t3g/svg-sanitizer": "<1.0.3", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "tribalsystems/zenario": "<8.8.53370", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vrana/adminer": "<4.7.9", + "wallabag/tcpdf": "<6.2.22", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "wp-cli/wp-cli": "<2.5", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yoast-seo-for-typo3/yoast_seo": "<7.2.1", + "yourls/yourls": "<1.7.4", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" }, + "default-branch": true, + "type": "metapackage", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" } ], - "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", - "homepage": "https://symfony.com", + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.3.0" + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/Ocramius", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-02T20:02:51+00:00" }, { - "name": "symfony/cache", - "version": "v4.4.25", + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "e2486bd59ac996afff25cdbfb823e982a0550c3e" + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/e2486bd59ac996afff25cdbfb823e982a0550c3e", - "reference": "e2486bd59ac996afff25cdbfb823e982a0550c3e", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/cache": "^1.0|^2.0", - "psr/log": "~1.0", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/service-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.2|^5.0" - }, - "conflict": { - "doctrine/dbal": "<2.6", - "symfony/dependency-injection": "<3.4", - "symfony/http-kernel": "<4.4|>=5.0", - "symfony/var-dumper": "<4.4" - }, - "provide": { - "psr/cache-implementation": "1.0|2.0", - "psr/simple-cache-implementation": "1.0", - "symfony/cache-implementation": "1.0|2.0" + "php": ">=5.6" }, "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.6|^3.0", - "predis/predis": "^1.1", - "psr/simple-cache": "^1.0", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^3.4|^4.1|^5.0", - "symfony/filesystem": "^4.4|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/var-dumper": "^4.4|^5.0" + "phpunit/phpunit": "^8.5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { - "source": "https://github.com/symfony/cache/tree/v4.4.25" + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-05-26T17:39:37+00:00" + "time": "2020-11-30T08:15:22+00:00" }, { - "name": "symfony/cache-contracts", - "version": "v2.4.0", + "name": "sebastian/comparator", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "c0446463729b89dd4fa62e9aeecc80287323615d" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/c0446463729b89dd4fa62e9aeecc80287323615d", - "reference": "c0446463729b89dd4fa62e9aeecc80287323615d", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0|^3.0" + "php": ">=7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" }, - "suggest": { - "symfony/cache-implementation": "" + "require-dev": { + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "3.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\Cache\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" } ], - "description": "Generic abstractions related to caching", - "homepage": "https://symfony.com", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "comparator", + "compare", + "equality" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.4.0" + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2020-11-30T08:04:30+00:00" }, { - "name": "symfony/console", - "version": "v4.4.25", + "name": "sebastian/diff", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "a62acecdf5b50e314a4f305cd01b5282126f3095" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a62acecdf5b50e314a4f305cd01b5282126f3095", - "reference": "a62acecdf5b50e314a4f305cd01b5282126f3095", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "shasum": "" }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.25" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-05-26T11:20:16+00:00" + "time": "2020-11-30T07:59:04+00:00" }, { - "name": "symfony/doctrine-bridge", - "version": "v4.4.25", + "name": "sebastian/environment", + "version": "4.2.4", "source": { "type": "git", - "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "6b88860981116fcddb2ff91043dfc8ad458e5e14" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/6b88860981116fcddb2ff91043dfc8ad458e5e14", - "reference": "6b88860981116fcddb2ff91043dfc8ad458e5e14", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", "shasum": "" }, "require": { - "doctrine/event-manager": "~1.0", - "doctrine/persistence": "^1.3|^2", - "php": ">=7.1.3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/dependency-injection": "<3.4", - "symfony/form": "<4.4", - "symfony/http-kernel": "<4.3.7", - "symfony/messenger": "<4.3", - "symfony/security-core": "<4.4", - "symfony/validator": "<4.4.2|<5.0.2,>=5.0" + "php": ">=7.1" }, "require-dev": { - "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "^1.10.4", - "doctrine/collections": "~1.0", - "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "^2.6|^3.0", - "doctrine/orm": "^2.6.3", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/form": "^4.4.11|^5.0.11", - "symfony/http-kernel": "^4.3.7", - "symfony/messenger": "^4.4|^5.0", - "symfony/property-access": "^3.4|^4.0|^5.0", - "symfony/property-info": "^3.4|^4.0|^5.0", - "symfony/proxy-manager-bridge": "^3.4|^4.0|^5.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/translation": "^3.4|^4.0|^5.0", - "symfony/validator": "^4.4.2|^5.0.2", - "symfony/var-dumper": "^3.4|^4.0|^5.0" + "phpunit/phpunit": "^7.5" }, "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/property-info": "", - "symfony/validator": "" + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } }, - "type": "symfony-bridge", "autoload": { - "psr-4": { - "Symfony\\Bridge\\Doctrine\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Provides integration for Doctrine with various Symfony components", - "homepage": "https://symfony.com", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v4.4.25" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-05-26T11:20:16+00:00" + "time": "2020-11-30T07:53:42+00:00" }, { - "name": "symfony/dom-crawler", - "version": "v5.3.0", + "name": "sebastian/exporter", + "version": "3.1.3", "source": { "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/55fff62b19f413f897a752488ade1bc9c8a19cdd", - "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "masterminds/html5": "<2.6" + "php": ">=7.0", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "masterminds/html5": "^2.6", - "symfony/css-selector": "^4.4|^5.0" - }, - "suggest": { - "symfony/css-selector": "" + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "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": "Eases DOM navigation for HTML and XML documents", - "homepage": "https://symfony.com", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.3.0" + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2020-11-30T07:47:53+00:00" }, { - "name": "symfony/finder", - "version": "v4.4.25", + "name": "sebastian/finder-facade", + "version": "1.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "ed33314396d968a8936c95f5bd1b88bd3b3e94a3" + "url": "https://github.com/sebastianbergmann/finder-facade.git", + "reference": "167c45d131f7fc3d159f56f191a0a22228765e16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ed33314396d968a8936c95f5bd1b88bd3b3e94a3", - "reference": "ed33314396d968a8936c95f5bd1b88bd3b3e94a3", + "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/167c45d131f7fc3d159f56f191a0a22228765e16", + "reference": "167c45d131f7fc3d159f56f191a0a22228765e16", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": "^7.1", + "symfony/finder": "^2.3|^3.0|^4.0|^5.0", + "theseer/fdomdocument": "^1.6" }, "type": "library", + "extra": { + "branch-alias": [] + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", + "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", + "homepage": "https://github.com/sebastianbergmann/finder-facade", "support": { - "source": "https://github.com/symfony/finder/tree/v4.4.25" + "issues": "https://github.com/sebastianbergmann/finder-facade/issues", + "source": "https://github.com/sebastianbergmann/finder-facade/tree/1.2" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-26T11:20:16+00:00" + "abandoned": true, + "time": "2020-01-16T08:08:45+00:00" }, { - "name": "symfony/framework-bundle", - "version": "v4.4.25", + "name": "sebastian/global-state", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "182442cad12e3a2ba912eddc20566a51067f8069" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "474fb9edb7ab891665d3bfc6317f42a0a150454b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/182442cad12e3a2ba912eddc20566a51067f8069", - "reference": "182442cad12e3a2ba912eddc20566a51067f8069", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/474fb9edb7ab891665d3bfc6317f42a0a150454b", + "reference": "474fb9edb7ab891665d3bfc6317f42a0a150454b", "shasum": "" }, "require": { - "ext-xml": "*", - "php": ">=7.1.3", - "symfony/cache": "^4.4|^5.0", - "symfony/config": "^4.4.11|~5.0.11|^5.1.3", - "symfony/dependency-injection": "^4.4.1|^5.0.1", - "symfony/error-handler": "^4.4.1|^5.0.1", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^4.4.12|^5.1.4" - }, - "conflict": { - "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2", - "phpdocumentor/type-resolver": "<0.3.0|1.3.*", - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/asset": "<3.4", - "symfony/browser-kit": "<4.3", - "symfony/console": "<4.4.21", - "symfony/dom-crawler": "<4.3", - "symfony/dotenv": "<4.3.6", - "symfony/form": "<4.3.5", - "symfony/http-client": "<4.4", - "symfony/lock": "<4.4", - "symfony/mailer": "<4.4", - "symfony/messenger": "<4.4", - "symfony/mime": "<4.4", - "symfony/property-info": "<3.4", - "symfony/security-bundle": "<4.4", - "symfony/serializer": "<4.4", - "symfony/stopwatch": "<3.4", - "symfony/translation": "<4.4", - "symfony/twig-bridge": "<4.1.1", - "symfony/twig-bundle": "<4.4", - "symfony/validator": "<4.4", - "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<4.3.6" + "php": ">=7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "^1.0|^2.0", - "doctrine/persistence": "^1.3|^2.0", - "paragonie/sodium_compat": "^1.8", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^3.4|^4.0|^5.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/console": "^4.4.21|^5.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dom-crawler": "^4.3|^5.0", - "symfony/dotenv": "^4.3.6|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/form": "^4.3.5|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/property-info": "^3.4|^4.0|^5.0", - "symfony/security-core": "^3.4|^4.4|^5.2", - "symfony/security-csrf": "^3.4|^4.0|^5.0", - "symfony/security-http": "^3.4|^4.0|^5.0", - "symfony/serializer": "^4.4|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "symfony/validator": "^4.4|^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.3.6|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0", - "twig/twig": "^1.43|^2.13|^3.0.4" + "ext-dom": "*", + "phpunit/phpunit": "^8.0" }, "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } }, - "type": "symfony-bundle", "autoload": { - "psr-4": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", - "homepage": "https://symfony.com", + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v4.4.25" + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-05-26T11:20:16+00:00" + "time": "2020-11-30T07:43:24+00:00" }, { - "name": "symfony/http-client", - "version": "v5.3.2", + "name": "sebastian/object-enumerator", + "version": "3.0.4", "source": { "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "d2464f48482223c7c6826cd8c6ed7929d1ce6093" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/d2464f48482223c7c6826cd8c6ed7929d1ce6093", - "reference": "d2464f48482223c7c6826cd8c6ed7929d1ce6093", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/http-client-contracts": "^2.4", - "symfony/polyfill-php73": "^1.11", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.0|^2" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "2.4" + "php": ">=7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/http-kernel": "^4.4.13|^5.1.5", - "symfony/process": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" + "phpunit/phpunit": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", - "homepage": "https://symfony.com", + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.3.2" + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-06-12T10:15:17+00:00" + "time": "2020-11-30T07:40:27+00:00" }, { - "name": "symfony/mime", - "version": "v5.3.2", + "name": "sebastian/object-reflector", + "version": "1.1.2", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "47dd7912152b82d0d4c8d9040dbc93d6232d472a" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/47dd7912152b82d0d4c8d9040dbc93d6232d472a", - "reference": "47dd7912152b82d0d4c8d9040dbc93d6232d472a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "php": ">=7.0" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.1", - "symfony/property-info": "^4.4|^5.1", - "symfony/serializer": "^5.2" + "phpunit/phpunit": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Allows manipulating MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "source": "https://github.com/symfony/mime/tree/v5.3.2" + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-06-09T10:58:01+00:00" + "time": "2020-11-30T07:37:18+00:00" }, { - "name": "symfony/options-resolver", - "version": "v5.3.0", + "name": "sebastian/recursion-context", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", - "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.15" + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2020-11-30T07:34:24+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "name": "sebastian/resource-operations", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", "shasum": "" }, "require": { "php": ">=7.1" }, - "suggest": { - "ext-intl": "For best performance" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "2.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2020-11-30T07:30:19+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.23.0", + "name": "sebastian/type", + "version": "1.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", + "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "1.1-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2020-11-30T07:25:11+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "name": "sebastian/version", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" + "php": ">=5.6" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "2.0.x-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/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": "2021-02-19T12:13:01+00:00" + "time": "2016-10-03T07:35:21+00:00" }, { - "name": "symfony/polyfill-php70", - "version": "v1.20.0", + "name": "seld/jsonlint", + "version": "1.8.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644" + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/5f03a781d984aae42cebd18e7912fa80f02ee644", - "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", "shasum": "" }, "require": { - "php": ">=7.1" + "php": "^5.3 || ^7.0 || ^8.0" }, - "type": "metapackage", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" } }, "notification-url": "https://packagist.org/downloads/", @@ -8732,75 +10357,61 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "JSON Linter", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "json", + "linter", + "parser", + "validator" ], "support": { - "source": "https://github.com/symfony/polyfill-php70/tree/v1.20.0" + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/Seldaek", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2020-11-11T09:19:24+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.23.0", + "name": "seld/phar-utils", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=5.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] + "Seld\\PharUtils\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8808,226 +10419,168 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" } ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "PHAR file format utilities, for when PHP phars you up", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "phar" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/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": "2021-05-27T09:17:38+00:00" + "time": "2020-07-07T18:42:57+00:00" }, { - "name": "symfony/process", - "version": "v5.3.2", + "name": "slevomat/coding-standard", + "version": "6.4.1", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "714b47f9196de61a196d86c4bad5f09201b307df" + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "696dcca217d0c9da2c40d02731526c1e25b65346" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/714b47f9196de61a196d86c4bad5f09201b307df", - "reference": "714b47f9196de61a196d86c4bad5f09201b307df", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/696dcca217d0c9da2c40d02731526c1e25b65346", + "reference": "696dcca217d0c9da2c40d02731526c1e25b65346", "shasum": "" }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "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" + } }, - "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "SlevomatCodingStandard\\": "SlevomatCodingStandard" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", "support": { - "source": "https://github.com/symfony/process/tree/v5.3.2" + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/6.4.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/kukulich", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", "type": "tidelift" } ], - "time": "2021-06-12T10:15:01+00:00" + "time": "2020-10-05T12:39:37+00:00" }, { - "name": "symfony/property-access", - "version": "v5.3.0", + "name": "squizlabs/php_codesniffer", + "version": "3.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/property-access.git", - "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb" + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/8988399a556cffb0fba9bb3603f8d1ba4543eceb", - "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", - "symfony/property-info": "^5.2" + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" }, "require-dev": { - "symfony/cache": "^4.4|^5.0" - }, - "suggest": { - "psr/cache-implementation": "To cache access methods." + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\PropertyAccess\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Greg Sherwood", + "role": "lead" } ], - "description": "Provides functions to read and write from/to an object or array using a simple string notation", - "homepage": "https://symfony.com", + "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": [ - "access", - "array", - "extraction", - "index", - "injection", - "object", - "property", - "property path", - "reflection" + "phpcs", + "standards" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.3.0" + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-04-09T00:54:41+00:00" }, { - "name": "symfony/property-info", - "version": "v5.3.1", + "name": "symfony/browser-kit", + "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/property-info.git", - "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf" + "url": "https://github.com/symfony/browser-kit.git", + "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/6f8bff281f215dbf41929c7ec6f8309cdc0912cf", - "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/379984e25eee9811b0a25a2105e1a2b3b8d9b734", + "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", - "symfony/string": "^5.1" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<4.4" + "symfony/dom-crawler": "^4.4|^5.0" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/cache": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "symfony/css-selector": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0" }, "suggest": { - "phpdocumentor/reflection-docblock": "To use the PHPDoc", - "psr/cache-implementation": "To cache results", - "symfony/doctrine-bridge": "To use Doctrine metadata", - "symfony/serializer": "To use Serializer metadata" + "symfony/process": "" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\PropertyInfo\\": "" + "Symfony\\Component\\BrowserKit\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -9039,26 +10592,18 @@ ], "authors": [ { - "name": "Kévin Dunglas", - "email": "dunglas@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Extracts information about PHP class' properties using metadata of popular sources", + "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", - "keywords": [ - "doctrine", - "phpdoc", - "property", - "symfony", - "type", - "validator" - ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.3.1" + "source": "https://github.com/symfony/browser-kit/tree/v5.3.0" }, "funding": [ { @@ -9074,50 +10619,73 @@ "type": "tidelift" } ], - "time": "2021-05-31T12:40:48+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { - "name": "symfony/routing", + "name": "symfony/doctrine-bridge", "version": "v4.4.25", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "3a3c2f197ad0846ac6413225fc78868ba1c61434" + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "6b88860981116fcddb2ff91043dfc8ad458e5e14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3a3c2f197ad0846ac6413225fc78868ba1c61434", - "reference": "3a3c2f197ad0846ac6413225fc78868ba1c61434", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/6b88860981116fcddb2ff91043dfc8ad458e5e14", + "reference": "6b88860981116fcddb2ff91043dfc8ad458e5e14", "shasum": "" }, "require": { - "php": ">=7.1.3" + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "^1.3|^2", + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2" }, "conflict": { - "symfony/config": "<4.2", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", "symfony/dependency-injection": "<3.4", - "symfony/yaml": "<3.4" + "symfony/form": "<4.4", + "symfony/http-kernel": "<4.3.7", + "symfony/messenger": "<4.3", + "symfony/security-core": "<4.4", + "symfony/validator": "<4.4.2|<5.0.2,>=5.0" }, "require-dev": { + "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "^1.10.4", - "psr/log": "~1.0", + "doctrine/collections": "~1.0", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^2.6|^3.0", + "doctrine/orm": "^2.6.3", "symfony/config": "^4.2|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/form": "^4.4.11|^5.0.11", + "symfony/http-kernel": "^4.3.7", + "symfony/messenger": "^4.4|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/proxy-manager-bridge": "^3.4|^4.0|^5.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/translation": "^3.4|^4.0|^5.0", + "symfony/validator": "^4.4.2|^5.0.2", + "symfony/var-dumper": "^3.4|^4.0|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" }, - "type": "library", + "type": "symfony-bridge", "autoload": { "psr-4": { - "Symfony\\Component\\Routing\\": "" + "Symfony\\Bridge\\Doctrine\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -9137,16 +10705,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Maps an HTTP request to a set of configuration variables", + "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], "support": { - "source": "https://github.com/symfony/routing/tree/v4.4.25" + "source": "https://github.com/symfony/doctrine-bridge/tree/v4.4.25" }, "funding": [ { @@ -9162,30 +10724,43 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:39:37+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { - "name": "symfony/stopwatch", + "name": "symfony/dom-crawler", "version": "v5.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", - "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/55fff62b19f413f897a752488ade1bc9c8a19cdd", + "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^4.4|^5.0" + }, + "suggest": { + "symfony/css-selector": "" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Component\\DomCrawler\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -9205,10 +10780,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" + "source": "https://github.com/symfony/dom-crawler/tree/v5.3.0" }, "funding": [ { @@ -9227,41 +10802,53 @@ "time": "2021-05-26T17:43:10+00:00" }, { - "name": "symfony/string", - "version": "v5.3.2", + "name": "symfony/http-client", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "0732e97e41c0a590f77e231afc16a327375d50b0" + "url": "https://github.com/symfony/http-client.git", + "reference": "fde4bdb10bf197f932ebccfcb9982881d296fc4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/0732e97e41c0a590f77e231afc16a327375d50b0", - "reference": "0732e97e41c0a590f77e231afc16a327375d50b0", + "url": "https://api.github.com/repos/symfony/http-client/zipball/fde4bdb10bf197f932ebccfcb9982881d296fc4c", + "reference": "fde4bdb10bf197f932ebccfcb9982881d296fc4c", "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" + "psr/log": "^1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-client-contracts": "^2.4", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.0|^2" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.4" }, "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" + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4.13|^5.1.5", + "symfony/process": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\String\\": "" + "Symfony\\Component\\HttpClient\\": "" }, - "files": [ - "Resources/functions.php" - ], "exclude-from-classmap": [ "/Tests/" ] @@ -9280,18 +10867,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.2" + "source": "https://github.com/symfony/http-client/tree/v5.3.3" }, "funding": [ { @@ -9307,37 +10886,34 @@ "type": "tidelift" } ], - "time": "2021-06-06T09:51:56+00:00" + "time": "2021-06-24T08:13:00+00:00" }, { - "name": "symfony/var-exporter", - "version": "v5.3.2", + "name": "symfony/polyfill-php70", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "df663fb63bdcd7298373cbd431165ab031706cb2" + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df663fb63bdcd7298373cbd431165ab031706cb2", - "reference": "df663fb63bdcd7298373cbd431165ab031706cb2", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/5f03a781d984aae42cebd18e7912fa80f02ee644", + "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9" + "php": ">=7.1" }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" + "type": "metapackage", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" }, - "exclude-from-classmap": [ - "/Tests/" - ] + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9353,18 +10929,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "serialize" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.3.2" + "source": "https://github.com/symfony/polyfill-php70/tree/v1.20.0" }, "funding": [ { @@ -9380,39 +10954,30 @@ "type": "tidelift" } ], - "time": "2021-06-09T10:57:10+00:00" + "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/yaml", - "version": "v4.4.25", + "name": "symfony/process", + "version": "v5.3.2", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "81cdac5536925c1c4b7b50aabc9ff6330b9eb5fc" + "url": "https://github.com/symfony/process.git", + "reference": "714b47f9196de61a196d86c4bad5f09201b307df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/81cdac5536925c1c4b7b50aabc9ff6330b9eb5fc", - "reference": "81cdac5536925c1c4b7b50aabc9ff6330b9eb5fc", + "url": "https://api.github.com/repos/symfony/process/zipball/714b47f9196de61a196d86c4bad5f09201b307df", + "reference": "714b47f9196de61a196d86c4bad5f09201b307df", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Yaml\\": "" + "Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -9432,10 +10997,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Loads and dumps YAML files", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v4.4.25" + "source": "https://github.com/symfony/process/tree/v5.3.2" }, "funding": [ { @@ -9451,205 +11016,82 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:39:37+00:00" + "time": "2021-06-12T10:15:01+00:00" }, { - "name": "symplify/coding-standard", - "version": "v6.1.0", + "name": "symfony/yaml", + "version": "v5.3.3", "source": { "type": "git", - "url": "https://github.com/symplify/coding-standard.git", - "reference": "d692701e2c74edd8c0cc7c35f47b8421b8b4885c" + "url": "https://github.com/symfony/yaml.git", + "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/coding-standard/zipball/d692701e2c74edd8c0cc7c35f47b8421b8b4885c", - "reference": "d692701e2c74edd8c0cc7c35f47b8421b8b4885c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", + "reference": "485c83a2fb5893e2ff21bf4bfc7fdf48b4967229", "shasum": "" }, "require": { - "friendsofphp/php-cs-fixer": "^2.15", - "nette/finder": "^2.4", - "nette/utils": "^2.5|^3.0", - "php": "^7.1", - "phpstan/phpdoc-parser": "^0.3.4", - "squizlabs/php_codesniffer": "^3.4", - "symplify/package-builder": "^6.1" - }, - "require-dev": { - "nette/application": "^3.0", - "phpunit/phpunit": "^7.5|^8.0", - "symplify/easy-coding-standard-tester": "^6.1", - "symplify/package-builder": "^6.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symplify\\CodingStandard\\": "src", - "Symplify\\CodingStandard\\TokenRunner\\": "packages/TokenRunner/src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Set of Symplify rules for PHP_CodeSniffer and PHP CS Fixer.", - "support": { - "source": "https://github.com/symplify/coding-standard/tree/v6.1.0" - }, - "funding": [ - { - "url": "https://github.com/tomasvotruba", - "type": "github" - }, - { - "url": "https://www.patreon.com/rectorphp", - "type": "patreon" - } - ], - "time": "2019-09-18T08:01:34+00:00" - }, - { - "name": "symplify/easy-coding-standard", - "version": "v6.1.0", - "source": { - "type": "git", - "url": "https://github.com/symplify/easy-coding-standard.git", - "reference": "94b8cf03af132d007d8a33c8dad5655cff6a74e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symplify/easy-coding-standard/zipball/94b8cf03af132d007d8a33c8dad5655cff6a74e8", - "reference": "94b8cf03af132d007d8a33c8dad5655cff6a74e8", - "shasum": "" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" }, - "require": { - "composer/xdebug-handler": "^1.3", - "friendsofphp/php-cs-fixer": "^2.15", - "jean85/pretty-package-versions": "^1.2", - "nette/robot-loader": "^3.1.0", - "nette/utils": "^2.5|^3.0", - "ocramius/package-versions": "^1.3", - "php": "^7.1", - "psr/simple-cache": "^1.0", - "slevomat/coding-standard": "^5.0.1", - "squizlabs/php_codesniffer": "^3.4", - "symfony/cache": "^3.4|^4.3", - "symfony/config": "^3.4|^4.3", - "symfony/console": "^3.4|^4.3", - "symfony/dependency-injection": "^3.4.10|^4.2", - "symfony/finder": "^3.4|^4.3", - "symfony/http-kernel": "^3.4|^4.3", - "symfony/yaml": "^3.4|^4.3", - "symplify/coding-standard": "^6.1", - "symplify/package-builder": "^6.1" + "conflict": { + "symfony/console": "<4.4" }, "require-dev": { - "phpunit/phpunit": "^7.5|^8.0", - "symplify/easy-coding-standard-tester": "^6.1" + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" }, "bin": [ - "bin/ecs" + "Resources/bin/yaml-lint" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.1-dev" - } - }, "autoload": { "psr-4": { - "Symplify\\EasyCodingStandard\\": "src", - "Symplify\\EasyCodingStandard\\ChangedFilesDetector\\": "packages/ChangedFilesDetector/src", - "Symplify\\EasyCodingStandard\\Configuration\\": "packages/Configuration/src", - "Symplify\\EasyCodingStandard\\FixerRunner\\": "packages/FixerRunner/src", - "Symplify\\EasyCodingStandard\\SniffRunner\\": "packages/SniffRunner/src" - } + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer.", - "support": { - "source": "https://github.com/symplify/easy-coding-standard/tree/v6.1.0" - }, - "funding": [ + "authors": [ { - "url": "https://github.com/tomasvotruba", - "type": "github" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "url": "https://www.patreon.com/rectorphp", - "type": "patreon" - } - ], - "time": "2019-09-14T22:46:23+00:00" - }, - { - "name": "symplify/package-builder", - "version": "v6.1.0", - "source": { - "type": "git", - "url": "https://github.com/symplify/package-builder.git", - "reference": "fbdfe363a27070cfdfbc47d5f59e711ed08bb060" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symplify/package-builder/zipball/fbdfe363a27070cfdfbc47d5f59e711ed08bb060", - "reference": "fbdfe363a27070cfdfbc47d5f59e711ed08bb060", - "shasum": "" - }, - "require": { - "nette/finder": "^2.4", - "nette/utils": "^2.5|^3.0", - "php": "^7.1", - "symfony/config": "^3.4|^4.3", - "symfony/console": "^3.4|^4.3", - "symfony/debug": "^3.4|^4.3", - "symfony/dependency-injection": "^3.4.10|^4.2", - "symfony/finder": "^3.4|^4.3", - "symfony/http-kernel": "^3.4|^4.3", - "symfony/yaml": "^3.4|^4.3" - }, - "require-dev": { - "phpunit/phpunit": "^7.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symplify\\PackageBuilder\\": "src" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" ], - "description": "Dependency Injection, Console and Kernel toolkit for Symplify packages.", + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symplify/package-builder/tree/v6.1.0" + "source": "https://github.com/symfony/yaml/tree/v5.3.3" }, "funding": [ { - "url": "https://github.com/tomasvotruba", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://www.patreon.com/rectorphp", - "type": "patreon" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2019-09-17T20:48:03+00:00" + "time": "2021-06-24T08:13:00+00:00" }, { "name": "theseer/fdomdocument", diff --git a/phpunit.xml.dist b/phpunit.xml.dist index cabc86c..25e4b10 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -11,7 +11,7 @@ > - + @@ -29,9 +29,10 @@ src - DependencyInjection - Resources - RichIdTermsModuleBundle.php + src/Infrastructure/DependencyInjection + src/Infrastructure/Migrations + src/Infrastructure/Resources + src/Infrastructure/RichIdTermsModuleBundle.php diff --git a/src/DependencyInjection/RichIdTermsModuleExtension.php b/src/DependencyInjection/RichIdTermsModuleExtension.php deleted file mode 100644 index 784f594..0000000 --- a/src/DependencyInjection/RichIdTermsModuleExtension.php +++ /dev/null @@ -1,31 +0,0 @@ - $configs */ - public function load(array $configs, ContainerBuilder $container): void - { - $this->parseConfiguration( - $container, - new Configuration(), - $configs - ); - - $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources')); - $loader->load('services.xml'); - } -} diff --git a/src/Domain/Entity/Terms.php b/src/Domain/Entity/Terms.php new file mode 100644 index 0000000..b09d577 --- /dev/null +++ b/src/Domain/Entity/Terms.php @@ -0,0 +1,166 @@ + + * + * @ORM\OneToMany(targetEntity="RichId\TermsModuleBundle\Domain\Entity\TermsVersion", mappedBy="terms") + */ + private $versions; + + public function __construct() + { + $this->versions = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getSlug(): ?string + { + return $this->slug; + } + + public function setSlug(string $slug): self + { + $this->slug = $slug; + + return $this; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function isPublished(): bool + { + return $this->isPublished; + } + + public function setIsPublished(bool $isPublished): self + { + $this->isPublished = $isPublished; + + return $this; + } + + public function isDepublicationLocked(): bool + { + return $this->isDepublicationLocked; + } + + public function setIsDepublicationLocked(bool $isDepublicationLocked): self + { + $this->isDepublicationLocked = $isDepublicationLocked; + + return $this; + } + + /** @return ArrayCollection */ + public function getVersions(): Collection + { + return $this->versions; + } + + public function addVersion(TermsVersion $version): self + { + $this->versions->add($version); + + return $this; + } + + public function removeVersion(TermsVersion $version): self + { + $this->versions->removeElement($version); + + return $this; + } + + public function getLatestVersion(): ?TermsVersion + { + $version = $this->versions->matching( + Criteria::create() + ->orderBy(['version' => 'DESC']) + )->first(); + + return $version instanceof TermsVersion ? $version : null; + } + + public function getLatestPublishedVersion(): ?TermsVersion + { + $version = $this->versions->matching( + Criteria::create() + ->where(Criteria::expr()->eq('isEnabled', true)) + ->andWhere( + Criteria::expr()->orX( + Criteria::expr()->isNull('publicationDate'), + Criteria::expr()->lte('publicationDate', new \DateTime('now')) + ) + ) + ->orderBy(['version' => 'DESC']) + )->first(); + + return $version instanceof TermsVersion ? $version : null; + } +} diff --git a/src/Domain/Entity/TermsSubjectInterface.php b/src/Domain/Entity/TermsSubjectInterface.php new file mode 100644 index 0000000..1212903 --- /dev/null +++ b/src/Domain/Entity/TermsSubjectInterface.php @@ -0,0 +1,12 @@ + + * + * @ORM\OneToMany(targetEntity="RichId\TermsModuleBundle\Domain\Entity\TermsVersionSignature", mappedBy="version") + */ + protected $signatures; + + public function __construct() + { + $this->signatures = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getVersion(): ?int + { + return $this->version; + } + + public function setVersion(int $version): self + { + $this->version = $version; + + return $this; + } + + public function isEnabled(): bool + { + return $this->isEnabled; + } + + public function enable(): self + { + $this->isEnabled = true; + + return $this; + } + + public function getTitle(): ?string + { + return $this->title; + } + + public function setTitle(string $title): self + { + $this->title = $title; + + return $this; + } + + public function getContent(): ?string + { + return $this->content; + } + + public function setContent(string $content): self + { + $this->content = $content; + + return $this; + } + + public function getPublicationDate(): ?\DateTime + { + return $this->publicationDate; + } + + public function setPublicationDate(?\DateTime $publicationDate): self + { + $this->publicationDate = $publicationDate; + + return $this; + } + + public function getTerms(): Terms + { + return $this->terms; + } + + public function setTerms(Terms $terms): self + { + $this->terms = $terms; + + return $this; + } + + /** @return ArrayCollection */ + public function getSignatures(): Collection + { + return $this->signatures; + } + + public function addSignature(TermsVersionSignature $signature): self + { + $this->signatures->add($signature); + + return $this; + } + + public function removeSignature(TermsVersionSignature $signature): self + { + $this->signatures->removeElement($signature); + + return $this; + } +} diff --git a/src/Domain/Entity/TermsVersionSignature.php b/src/Domain/Entity/TermsVersionSignature.php new file mode 100644 index 0000000..10de1d6 --- /dev/null +++ b/src/Domain/Entity/TermsVersionSignature.php @@ -0,0 +1,110 @@ +id; + } + + public function setDate(\DateTime $date): self + { + $this->date = $date; + + return $this; + } + + public function getDate(): ?\DateTime + { + return $this->date; + } + + public function setSubjectType(string $subjectType): self + { + $this->subjectType = $subjectType; + + return $this; + } + + public function getSubjectType(): ?string + { + return $this->subjectType; + } + + public function setSubjectIdentifier(string $subjectIdentifier): self + { + $this->subjectIdentifier = $subjectIdentifier; + + return $this; + } + + public function getSubjectIdentifier(): ?string + { + return $this->subjectIdentifier; + } + + public function setVersion(TermsVersion $version): self + { + $this->version = $version; + + return $this; + } + + public function getVersion(): ?TermsVersion + { + return $this->version; + } +} diff --git a/src/Domain/Event/TermsEvent.php b/src/Domain/Event/TermsEvent.php new file mode 100644 index 0000000..9777879 --- /dev/null +++ b/src/Domain/Event/TermsEvent.php @@ -0,0 +1,9 @@ +termsVersion = $termsVersion; + $this->subject = $subject; + $this->accepted = $accepted; + $this->response = $response; + } + + public function getTermsVersion(): TermsVersion + { + return $this->termsVersion; + } + + public function getSubject(): TermsSubjectInterface + { + return $this->subject; + } + + public function isAccepted(): ?bool + { + return $this->accepted; + } + + public function getResponse(): Response + { + return $this->response; + } + + public function setResponse(Response $response): self + { + $this->response = $response; + + return $this; + } +} diff --git a/src/Domain/Event/TermsVersionCreatedEvent.php b/src/Domain/Event/TermsVersionCreatedEvent.php new file mode 100644 index 0000000..c65b2c5 --- /dev/null +++ b/src/Domain/Event/TermsVersionCreatedEvent.php @@ -0,0 +1,23 @@ +termsVersion = $termsVersion; + } + + public function getTermsVersion(): TermsVersion + { + return $this->termsVersion; + } +} diff --git a/src/Domain/Event/TermsVersionDeletedEvent.php b/src/Domain/Event/TermsVersionDeletedEvent.php new file mode 100644 index 0000000..db662b9 --- /dev/null +++ b/src/Domain/Event/TermsVersionDeletedEvent.php @@ -0,0 +1,23 @@ +termsVersion = $termsVersion; + } + + public function getTermsVersion(): TermsVersion + { + return $this->termsVersion; + } +} diff --git a/src/Domain/Event/TermsVersionEnabledEvent.php b/src/Domain/Event/TermsVersionEnabledEvent.php new file mode 100644 index 0000000..1c0b9f0 --- /dev/null +++ b/src/Domain/Event/TermsVersionEnabledEvent.php @@ -0,0 +1,23 @@ +termsVersion = $termsVersion; + } + + public function getTermsVersion(): TermsVersion + { + return $this->termsVersion; + } +} diff --git a/src/Domain/Event/TermsVersionUpdatedEvent.php b/src/Domain/Event/TermsVersionUpdatedEvent.php new file mode 100644 index 0000000..c2d7795 --- /dev/null +++ b/src/Domain/Event/TermsVersionUpdatedEvent.php @@ -0,0 +1,23 @@ +termsVersion = $termsVersion; + } + + public function getTermsVersion(): TermsVersion + { + return $this->termsVersion; + } +} diff --git a/src/Domain/EventListener/AutopublishFirstTermsVersionEventListener.php b/src/Domain/EventListener/AutopublishFirstTermsVersionEventListener.php new file mode 100644 index 0000000..f24862c --- /dev/null +++ b/src/Domain/EventListener/AutopublishFirstTermsVersionEventListener.php @@ -0,0 +1,29 @@ +activateTermsVersion = $activateTermsVersion; + } + + public function __invoke(TermsVersionUpdatedEvent $event): void + { + $termsVersion = $event->getTermsVersion(); + $terms = $termsVersion->getTerms(); + + if ($terms->isPublished() && $terms->getVersions()->count() === 1 && !$termsVersion->isEnabled()) { + ($this->activateTermsVersion)($termsVersion); + } + } +} diff --git a/src/Domain/EventListener/LogSignedTermsEventListener.php b/src/Domain/EventListener/LogSignedTermsEventListener.php new file mode 100644 index 0000000..5d5903f --- /dev/null +++ b/src/Domain/EventListener/LogSignedTermsEventListener.php @@ -0,0 +1,27 @@ +logger = $logger; + } + + public function __invoke(TermsSignedEvent $event): void + { + $termsVersion = $event->getTermsVersion(); + $terms = $termsVersion->getTerms(); + + $this->logger->logTermsSigned($terms->getSlug() ?? '', $event->getSubject(), $event->isAccepted()); + } +} diff --git a/src/Domain/EventListener/SetTermsVersionPublicationMetadataEventListener.php b/src/Domain/EventListener/SetTermsVersionPublicationMetadataEventListener.php new file mode 100644 index 0000000..dab7bd1 --- /dev/null +++ b/src/Domain/EventListener/SetTermsVersionPublicationMetadataEventListener.php @@ -0,0 +1,36 @@ +activateTermsVersion = $activateTermsVersion; + $this->entityRecoder = $entityRecoder; + } + + public function __invoke(TermsVersionEnabledEvent $event): void + { + $termsVersion = $event->getTermsVersion(); + + if ($termsVersion->getPublicationDate() !== null) { + return; + } + + $termsVersion->setPublicationDate(new \DateTime('today midnight')); + $this->entityRecoder->saveTermsVersion($termsVersion); + } +} diff --git a/src/Domain/Exception/AlreadyEnabledTermsVersionException.php b/src/Domain/Exception/AlreadyEnabledTermsVersionException.php new file mode 100644 index 0000000..7aa9cf5 --- /dev/null +++ b/src/Domain/Exception/AlreadyEnabledTermsVersionException.php @@ -0,0 +1,27 @@ +getTerms(); + $this->termsVersion = $termsVersion; + $message = \sprintf('Version %d of terms %s is already enabled.', $termsVersion->getVersion(), $terms->getSlug()); + + parent::__construct($message); + } + + public function getTermsVersion(): TermsVersion + { + return $this->termsVersion; + } +} diff --git a/src/Domain/Exception/AlreadySignLastTermsVersionException.php b/src/Domain/Exception/AlreadySignLastTermsVersionException.php new file mode 100644 index 0000000..2c06a45 --- /dev/null +++ b/src/Domain/Exception/AlreadySignLastTermsVersionException.php @@ -0,0 +1,35 @@ +termsSlug = $termsSlug; + $this->subject = $subject; + $message = \sprintf('Terms %s is already sign by this subject.', $termsSlug); + + parent::__construct($message); + } + + public function getTermsSlug(): string + { + return $this->termsSlug; + } + + public function getSubject(): TermsSubjectInterface + { + return $this->subject; + } +} diff --git a/src/Domain/Exception/CannotAddVersionToTermsException.php b/src/Domain/Exception/CannotAddVersionToTermsException.php new file mode 100644 index 0000000..b9411f3 --- /dev/null +++ b/src/Domain/Exception/CannotAddVersionToTermsException.php @@ -0,0 +1,26 @@ +terms = $terms; + $message = \sprintf('Cannot add new version to the terms %s.', $terms->getSlug()); + + parent::__construct($message); + } + + public function getTerms(): Terms + { + return $this->terms; + } +} diff --git a/src/Domain/Exception/EnabledVersionCannotBeDeletedException.php b/src/Domain/Exception/EnabledVersionCannotBeDeletedException.php new file mode 100644 index 0000000..356405b --- /dev/null +++ b/src/Domain/Exception/EnabledVersionCannotBeDeletedException.php @@ -0,0 +1,27 @@ +getTerms(); + $this->termsVersion = $termsVersion; + $message = \sprintf('Version %d of terms %s cannot be deleted.', $termsVersion->getVersion(), $terms->getSlug()); + + parent::__construct($message); + } + + public function getTermsVersion(): TermsVersion + { + return $this->termsVersion; + } +} diff --git a/src/Domain/Exception/FirstVersionCannotBeDeletedException.php b/src/Domain/Exception/FirstVersionCannotBeDeletedException.php new file mode 100644 index 0000000..85474db --- /dev/null +++ b/src/Domain/Exception/FirstVersionCannotBeDeletedException.php @@ -0,0 +1,27 @@ +getTerms(); + $this->termsVersion = $termsVersion; + $message = \sprintf('First version of terms %s cannot be deleted.', $terms->getSlug()); + + parent::__construct($message); + } + + public function getTermsVersion(): TermsVersion + { + return $this->termsVersion; + } +} diff --git a/src/Domain/Exception/InvalidTermsEditionException.php b/src/Domain/Exception/InvalidTermsEditionException.php new file mode 100644 index 0000000..70aea1b --- /dev/null +++ b/src/Domain/Exception/InvalidTermsEditionException.php @@ -0,0 +1,29 @@ + */ + protected $violations; + + /** @param ConstraintViolationListInterface $violations */ + public function __construct(ConstraintViolationListInterface $violations) + { + $this->violations = $violations; + $message = 'Invalid model TermsEdition.'; + + parent::__construct($message); + } + + /** @return ConstraintViolationListInterface */ + public function getViolations(): ConstraintViolationListInterface + { + return $this->violations; + } +} diff --git a/src/Domain/Exception/InvalidValueException.php b/src/Domain/Exception/InvalidValueException.php new file mode 100644 index 0000000..5c1c583 --- /dev/null +++ b/src/Domain/Exception/InvalidValueException.php @@ -0,0 +1,35 @@ +propertyPath = $propertyPath; + $this->value = $value; + $message = \sprintf('Invalid value for path %s', $propertyPath); + + parent::__construct($message); + } + + public function getPropertyPath(): string + { + return $this->propertyPath; + } + + /** @return mixed */ + public function getValue() + { + return $this->value; + } +} diff --git a/src/Domain/Exception/NotFoundTermsException.php b/src/Domain/Exception/NotFoundTermsException.php new file mode 100644 index 0000000..414c32e --- /dev/null +++ b/src/Domain/Exception/NotFoundTermsException.php @@ -0,0 +1,24 @@ +termsSlug = $termsSlug; + $message = \sprintf('Not found terms %s.', $termsSlug); + + parent::__construct($message); + } + + public function getTermsSlug(): string + { + return $this->termsSlug; + } +} diff --git a/src/Domain/Exception/NotPublishedTermsException.php b/src/Domain/Exception/NotPublishedTermsException.php new file mode 100644 index 0000000..c984cdf --- /dev/null +++ b/src/Domain/Exception/NotPublishedTermsException.php @@ -0,0 +1,24 @@ +termsSlug = $termsSlug; + $message = \sprintf('Terms %s is not published.', $termsSlug); + + parent::__construct($message); + } + + public function getTermsSlug(): string + { + return $this->termsSlug; + } +} diff --git a/src/Domain/Exception/SubjectNeedToSignTermsException.php b/src/Domain/Exception/SubjectNeedToSignTermsException.php new file mode 100644 index 0000000..c7fdf3f --- /dev/null +++ b/src/Domain/Exception/SubjectNeedToSignTermsException.php @@ -0,0 +1,34 @@ +termsSlug = $termsSlug; + $this->subject = $subject; + + parent::__construct(); + } + + public function getTermsSlug(): string + { + return $this->termsSlug; + } + + public function getSubject(): TermsSubjectInterface + { + return $this->subject; + } +} diff --git a/src/Domain/Exception/TermsHasNoPublishedVersionException.php b/src/Domain/Exception/TermsHasNoPublishedVersionException.php new file mode 100644 index 0000000..49680aa --- /dev/null +++ b/src/Domain/Exception/TermsHasNoPublishedVersionException.php @@ -0,0 +1,26 @@ +terms = $terms; + $message = \sprintf('Terms %s hasn\'t published version.', $terms->getSlug()); + + parent::__construct($message); + } + + public function getTerms(): Terms + { + return $this->terms; + } +} diff --git a/src/Domain/Exception/TermsModuleException.php b/src/Domain/Exception/TermsModuleException.php new file mode 100644 index 0000000..9b2c51b --- /dev/null +++ b/src/Domain/Exception/TermsModuleException.php @@ -0,0 +1,9 @@ +setTerms($terms); + $entity->setVersion(1); + $terms->addVersion($entity); + + return $entity; + } +} diff --git a/src/Domain/Factory/DuplicateTermsVersionFactory.php b/src/Domain/Factory/DuplicateTermsVersionFactory.php new file mode 100644 index 0000000..c7dc212 --- /dev/null +++ b/src/Domain/Factory/DuplicateTermsVersionFactory.php @@ -0,0 +1,35 @@ +getTitle() === null || $termsVersion->getTitle() === '') { + throw new InvalidValueException('title', $termsVersion->getTitle()); + } + + if ($termsVersion->getContent() === null || $termsVersion->getContent() === '') { + throw new InvalidValueException('content', $termsVersion->getContent()); + } + + $terms = $termsVersion->getTerms(); + $lastVersion = $terms->getLatestVersion(); + $nextVersion = $lastVersion !== null ? $lastVersion->getVersion() + 1 : 1; + + $entity = new TermsVersion(); + + $entity->setTerms($terms); + $entity->setVersion($nextVersion); + $entity->setTitle($termsVersion->getTitle()); + $entity->setContent($termsVersion->getContent()); + + return $entity; + } +} diff --git a/src/Domain/Factory/TermsVersionSignatureFactory.php b/src/Domain/Factory/TermsVersionSignatureFactory.php new file mode 100644 index 0000000..8c14acd --- /dev/null +++ b/src/Domain/Factory/TermsVersionSignatureFactory.php @@ -0,0 +1,24 @@ +setVersion($version); + $entity->setSubjectType($subject->getTermsSubjectType()); + $entity->setSubjectIdentifier($subject->getTermsSubjectIdentifier()); + $entity->setDate(new \DateTime()); + + return $entity; + } +} diff --git a/src/Domain/Fetcher/GetTermsVersionToSign.php b/src/Domain/Fetcher/GetTermsVersionToSign.php new file mode 100644 index 0000000..ef9480b --- /dev/null +++ b/src/Domain/Fetcher/GetTermsVersionToSign.php @@ -0,0 +1,62 @@ +termsRepository = $termsRepository; + $this->hasSignedTerms = $hasSignedTerms; + } + + public function __invoke(string $termsSlug, TermsSubjectInterface $subject): TermsVersion + { + $terms = $this->getTermsBySlug($termsSlug); + + if (!$terms->isPublished()) { + throw new NotPublishedTermsException($termsSlug); + } + + $lastVersion = $terms->getLatestPublishedVersion(); + + if ($lastVersion === null) { + throw new TermsHasNoPublishedVersionException($terms); + } + + if (($this->hasSignedTerms)($termsSlug, $subject) === HasSignedTerms::HAS_SIGNED_LATEST_VERSION) { + throw new AlreadySignLastTermsVersionException($termsSlug, $subject); + } + + return $lastVersion; + } + + protected function getTermsBySlug(string $termsSlug): Terms + { + $terms = $this->termsRepository->findOneBySlug($termsSlug); + + if ($terms === null) { + throw new NotFoundTermsException($termsSlug); + } + + return $terms; + } +} diff --git a/src/Domain/Guard/TermsGuardInterface.php b/src/Domain/Guard/TermsGuardInterface.php new file mode 100644 index 0000000..d04c447 --- /dev/null +++ b/src/Domain/Guard/TermsGuardInterface.php @@ -0,0 +1,12 @@ +type; + } + + public function getTermsSubjectIdentifier(): string + { + return $this->identifier; + } + + public static function create(string $type, string $identifier): self + { + $model = new self(); + + $model->type = $type; + $model->identifier = $identifier; + + return $model; + } +} diff --git a/src/Domain/Model/DummyTermsGuardValidation.php b/src/Domain/Model/DummyTermsGuardValidation.php new file mode 100644 index 0000000..7ff3c47 --- /dev/null +++ b/src/Domain/Model/DummyTermsGuardValidation.php @@ -0,0 +1,48 @@ +slug; + } + + public function getTermsSubjectType(): string + { + return $this->type; + } + + public function getTermsSubjectIdentifier(): string + { + return $this->identifier; + } + + public static function create(string $slug, string $type, string $identifier): self + { + $model = new self(); + + $model->slug = $slug; + $model->type = $type; + $model->identifier = $identifier; + + return $model; + } +} diff --git a/src/Domain/Model/TermsEdition.php b/src/Domain/Model/TermsEdition.php new file mode 100644 index 0000000..ad7f85f --- /dev/null +++ b/src/Domain/Model/TermsEdition.php @@ -0,0 +1,135 @@ +entity = $entity; + + $this->isTermsPublished = $entity->getTerms()->isPublished(); + $this->title = $entity->getTitle() ?? ''; + $this->content = $entity->getContent() ?? ''; + $this->publicationDate = $entity->getPublicationDate(); + } + + public function getEntity(): TermsVersion + { + return $this->entity; + } + + public function isTermsPublished(): ?bool + { + return $this->isTermsPublished; + } + + public function setIsTermsPublished(?bool $isTermsPublished): self + { + $this->isTermsPublished = $isTermsPublished; + + return $this; + } + + public function getTitle(): ?string + { + return $this->title; + } + + public function setTitle(?string $title): self + { + $this->title = $title; + + return $this; + } + + public function getContent(): ?string + { + return $this->content; + } + + public function setContent(?string $content): self + { + $this->content = $content; + + return $this; + } + + public function getPublicationDate(): ?\DateTime + { + return $this->publicationDate; + } + + public function setPublicationDate(?\DateTime $publicationDate): self + { + $this->publicationDate = $publicationDate; + + return $this; + } + + public function needVersionActivation(): ?bool + { + return $this->needVersionActivation; + } + + public function setNeedVersionActivation(?bool $needVersionActivation): self + { + $this->needVersionActivation = $needVersionActivation; + + return $this; + } +} diff --git a/src/Domain/Model/TermsGuardValidationInterface.php b/src/Domain/Model/TermsGuardValidationInterface.php new file mode 100644 index 0000000..8843e47 --- /dev/null +++ b/src/Domain/Model/TermsGuardValidationInterface.php @@ -0,0 +1,12 @@ +setIsPublished($termsEdition->isTermsPublished() ?? false); + + return $terms; + } +} diff --git a/src/Domain/Updater/TermsVersionUpdater.php b/src/Domain/Updater/TermsVersionUpdater.php new file mode 100644 index 0000000..83fbc75 --- /dev/null +++ b/src/Domain/Updater/TermsVersionUpdater.php @@ -0,0 +1,29 @@ +getTitle() === null || $termsEdition->getTitle() === '') { + throw new InvalidValueException('title', $termsEdition->getTitle()); + } + + if ($termsEdition->getContent() === null || $termsEdition->getContent() === '') { + throw new InvalidValueException('content', $termsEdition->getContent()); + } + + $termsVersion->setTitle($termsEdition->getTitle()); + $termsVersion->setContent($termsEdition->getContent()); + $termsVersion->setPublicationDate($termsEdition->getPublicationDate()); + + return $termsVersion; + } +} diff --git a/src/Domain/UseCase/ActivateTermsVersion.php b/src/Domain/UseCase/ActivateTermsVersion.php new file mode 100644 index 0000000..097c095 --- /dev/null +++ b/src/Domain/UseCase/ActivateTermsVersion.php @@ -0,0 +1,40 @@ +entityRecoder = $entityRecoder; + $this->eventDispatcher = $eventDispatcher; + } + + public function __invoke(TermsVersion $termsVersion): void + { + if ($termsVersion->isEnabled()) { + throw new AlreadyEnabledTermsVersionException($termsVersion); + } + + $termsVersion->enable(); + $this->entityRecoder->saveTermsVersion($termsVersion); + + $this->eventDispatcher->dispatchTermsEvent( + new TermsVersionEnabledEvent($termsVersion) + ); + } +} diff --git a/src/Domain/UseCase/CreateTermsVersion.php b/src/Domain/UseCase/CreateTermsVersion.php new file mode 100644 index 0000000..ccd46ff --- /dev/null +++ b/src/Domain/UseCase/CreateTermsVersion.php @@ -0,0 +1,49 @@ +duplicateTermsVersionFactory = $duplicateTermsVersionFactory; + $this->entityRecoder = $entityRecoder; + $this->eventDispatcher = $eventDispatcher; + } + + public function __invoke(TermsVersion $basedTermsVersion): void + { + $terms = $basedTermsVersion->getTerms(); + $lastVersion = $terms->getLatestVersion(); + + if ($lastVersion === null || !$lastVersion->isEnabled()) { + throw new CannotAddVersionToTermsException($terms); + } + + $newTermVersion = ($this->duplicateTermsVersionFactory)($basedTermsVersion); + + $this->entityRecoder->saveTermsVersion($newTermVersion); + + $this->eventDispatcher->dispatchTermsEvent( + new TermsVersionCreatedEvent($newTermVersion) + ); + } +} diff --git a/src/Domain/UseCase/EditTerms.php b/src/Domain/UseCase/EditTerms.php new file mode 100644 index 0000000..d2cd681 --- /dev/null +++ b/src/Domain/UseCase/EditTerms.php @@ -0,0 +1,72 @@ +activateTermsVersion = $activateTermsVersion; + $this->termsUpdater = $termsUpdater; + $this->termsVersionUpdater = $termsVersionUpdater; + $this->entityRecoder = $entityRecoder; + $this->eventDispatcher = $eventDispatcher; + $this->validator = $validator; + } + + public function __invoke(TermsEdition $termsEdition): void + { + $this->validator->validateTermsEdition($termsEdition); + + $termsVersion = $termsEdition->getEntity(); + $terms = $termsVersion->getTerms(); + + ($this->termsVersionUpdater)($termsVersion, $termsEdition); + ($this->termsUpdater)($terms, $termsEdition); + + $this->entityRecoder->saveTermsVersion($termsVersion); + $this->entityRecoder->saveTerms($terms); + + if ($termsEdition->needVersionActivation() === true) { + ($this->activateTermsVersion)($termsVersion); + } + + $this->eventDispatcher->dispatchTermsEvent( + new TermsVersionUpdatedEvent($termsVersion) + ); + } +} diff --git a/src/Domain/UseCase/HasSignedLastTermsVersion.php b/src/Domain/UseCase/HasSignedLastTermsVersion.php new file mode 100644 index 0000000..30762c0 --- /dev/null +++ b/src/Domain/UseCase/HasSignedLastTermsVersion.php @@ -0,0 +1,23 @@ +hasSignedTerms = $hasSignedTerms; + } + + public function __invoke(string $termsSlug, TermsSubjectInterface $subject): bool + { + return ($this->hasSignedTerms)($termsSlug, $subject) === HasSignedTerms::HAS_SIGNED_LATEST_VERSION; + } +} diff --git a/src/Domain/UseCase/HasSignedTerms.php b/src/Domain/UseCase/HasSignedTerms.php new file mode 100644 index 0000000..d2b73ee --- /dev/null +++ b/src/Domain/UseCase/HasSignedTerms.php @@ -0,0 +1,57 @@ +termsRepository = $termsRepository; + $this->termsVersionRepository = $termsVersionRepository; + } + + public function __invoke(string $termsSlug, TermsSubjectInterface $subject): int + { + $terms = $this->termsRepository->findOneBySlug($termsSlug); + + if ($terms === null) { + throw new NotFoundTermsException($termsSlug); + } + + if (!$terms->isPublished()) { + return self::HAS_NOT_SIGNED; + } + + $lastSignedVersion = $this->termsVersionRepository->findLastSignedVersionForTermsSubject($termsSlug, $subject); + + if ($lastSignedVersion === null) { + return self::HAS_NOT_SIGNED; + } + + $terms = $lastSignedVersion->getTerms(); + $lastVersion = $terms->getLatestPublishedVersion(); + + if ($lastVersion === null || $lastVersion->getId() !== $lastSignedVersion->getId()) { + return self::HAS_SIGNED_OLD_VERSION; + } + + return self::HAS_SIGNED_LATEST_VERSION; + } +} diff --git a/src/Domain/UseCase/RemoveTermsVersion.php b/src/Domain/UseCase/RemoveTermsVersion.php new file mode 100644 index 0000000..85789f9 --- /dev/null +++ b/src/Domain/UseCase/RemoveTermsVersion.php @@ -0,0 +1,46 @@ +entityRemover = $entityRemover; + $this->eventDispatcher = $eventDispatcher; + } + + public function __invoke(TermsVersion $termsVersion): void + { + $terms = $termsVersion->getTerms(); + + if ($termsVersion->isEnabled()) { + throw new EnabledVersionCannotBeDeletedException($termsVersion); + } + + if ($termsVersion->getVersion() === 1 || $terms->getVersions()->count() <= 1) { + throw new FirstVersionCannotBeDeletedException($termsVersion); + } + + $this->entityRemover->removeTermsVersion($termsVersion); + + $this->eventDispatcher->dispatchTermsEvent( + new TermsVersionDeletedEvent($termsVersion) + ); + } +} diff --git a/src/Domain/UseCase/SignTerms.php b/src/Domain/UseCase/SignTerms.php new file mode 100644 index 0000000..a5602e5 --- /dev/null +++ b/src/Domain/UseCase/SignTerms.php @@ -0,0 +1,62 @@ +termsVersionSignatureFactory = $termsVersionSignatureFactory; + $this->eventDispatcher = $eventDispatcher; + $this->entityRecoder = $entityRecoder; + $this->responseBuilder = $responseBuilder; + $this->getTermsVersionToSign = $getTermsVersionToSign; + } + + public function __invoke(string $termsSlug, TermsSubjectInterface $subject, ?bool $accepted): Response + { + $lastVersion = ($this->getTermsVersionToSign)($termsSlug, $subject); + + if ($accepted === true) { + $signature = ($this->termsVersionSignatureFactory)($lastVersion, $subject); + $this->entityRecoder->saveSignature($signature); + } + + $defaultResponse = $this->responseBuilder->buildDefaultTermsSignedResponse($accepted); + $event = new TermsSignedEvent($lastVersion, $subject, $accepted, $defaultResponse); + $this->eventDispatcher->dispatchTermsEvent($event); + + return $event->getResponse(); + } +} diff --git a/src/Infrastructure/Adapter/EntityRecorder.php b/src/Infrastructure/Adapter/EntityRecorder.php new file mode 100644 index 0000000..06a6b44 --- /dev/null +++ b/src/Infrastructure/Adapter/EntityRecorder.php @@ -0,0 +1,40 @@ +entityManager = $entityManager; + } + + public function saveSignature(TermsVersionSignature $signature): void + { + $this->entityManager->persist($signature); + $this->entityManager->flush(); + } + + public function saveTerms(Terms $terms): void + { + $this->entityManager->persist($terms); + $this->entityManager->flush(); + } + + public function saveTermsVersion(TermsVersion $termsVersion): void + { + $this->entityManager->persist($termsVersion); + $this->entityManager->flush(); + } +} diff --git a/src/Infrastructure/Adapter/EntityRemover.php b/src/Infrastructure/Adapter/EntityRemover.php new file mode 100644 index 0000000..9b96a91 --- /dev/null +++ b/src/Infrastructure/Adapter/EntityRemover.php @@ -0,0 +1,26 @@ +entityManager = $entityManager; + } + + public function removeTermsVersion(TermsVersion $termsVersion): void + { + $this->entityManager->remove($termsVersion); + $this->entityManager->flush(); + } +} diff --git a/src/Infrastructure/Adapter/EventDispatcher.php b/src/Infrastructure/Adapter/EventDispatcher.php new file mode 100644 index 0000000..1c46f09 --- /dev/null +++ b/src/Infrastructure/Adapter/EventDispatcher.php @@ -0,0 +1,25 @@ +eventDispatcher = $eventDispatcher; + } + + public function dispatchTermsEvent(TermsEvent $event): void + { + $this->eventDispatcher->dispatch($event); + } +} diff --git a/src/Infrastructure/Adapter/Logger.php b/src/Infrastructure/Adapter/Logger.php new file mode 100644 index 0000000..4e06c4a --- /dev/null +++ b/src/Infrastructure/Adapter/Logger.php @@ -0,0 +1,74 @@ +logger = $logger; + $this->translator = $translator; + $this->security = $security; + } + + public function logTermsSigned(string $termsSlug, TermsSubjectInterface $subject, ?bool $accepted): void + { + $message = 'terms_module.log.terms_signed'; + + $user = $this->security->getUser(); + $userUsername = $user !== null ? $user->getUsername() : ''; + $choice = $this->getTermsSignedChoice($accepted); + $now = new \DateTime(); + + $this->logger->info( + $this->translator->trans( + $message, + [ + '%terms_slug%' => $termsSlug, + '%choice%' => $choice, + '%date%' => $now->format('c'), + '%user%' => $userUsername, + ], + 'terms_module' + ), + [ + 'extra' => [ + '_event' => 'terms_module.terms_signed', + '_terms' => $termsSlug, + '_choice' => $choice, + '_user' => $userUsername, + ], + ] + ); + } + + private function getTermsSignedChoice(?bool $accepted): string + { + if ($accepted === null) { + return $this->translator->trans('terms_module.sign.prefer_answer_later', [], 'terms_module'); + } + + if ($accepted) { + return $this->translator->trans('terms_module.sign.accept', [], 'terms_module'); + } + + return $this->translator->trans('terms_module.sign.refuse', [], 'terms_module'); + } +} diff --git a/src/Infrastructure/Adapter/ResponseBuilder.php b/src/Infrastructure/Adapter/ResponseBuilder.php new file mode 100644 index 0000000..a65f51b --- /dev/null +++ b/src/Infrastructure/Adapter/ResponseBuilder.php @@ -0,0 +1,46 @@ +router = $router; + $this->parameterBag = $parameterBag; + } + + public function buildDefaultTermsSignedResponse(?bool $accepted): Response + { + $url = $this->router->generate($this->getRoute($accepted)); + + return new RedirectResponse($url); + } + + protected function getRoute(?bool $accepted): string + { + if ($accepted === null) { + return $this->parameterBag->get('rich_id_terms_module.default_redirection_routes.ignore'); + } + + if ($accepted) { + return $this->parameterBag->get('rich_id_terms_module.default_redirection_routes.acceptation'); + } + + return $this->parameterBag->get('rich_id_terms_module.default_redirection_routes.refusal'); + } +} diff --git a/src/Infrastructure/Adapter/TermsRepository.php b/src/Infrastructure/Adapter/TermsRepository.php new file mode 100644 index 0000000..956d9de --- /dev/null +++ b/src/Infrastructure/Adapter/TermsRepository.php @@ -0,0 +1,25 @@ +termsRepository = $termsRepository; + } + + public function findOneBySlug(string $termsSlug): ?Terms + { + return $this->termsRepository->findOneBySlug($termsSlug); + } +} diff --git a/src/Infrastructure/Adapter/TermsVersionRepository.php b/src/Infrastructure/Adapter/TermsVersionRepository.php new file mode 100644 index 0000000..25c6473 --- /dev/null +++ b/src/Infrastructure/Adapter/TermsVersionRepository.php @@ -0,0 +1,26 @@ +termsVersionRepository = $termsVersionRepository; + } + + public function findLastSignedVersionForTermsSubject(string $termsSlug, TermsSubjectInterface $subject): ?TermsVersion + { + return $this->termsVersionRepository->findLastSignedVersionForTermsSubject($termsSlug, $subject); + } +} diff --git a/src/Infrastructure/Adapter/Validator.php b/src/Infrastructure/Adapter/Validator.php new file mode 100644 index 0000000..ed94c4b --- /dev/null +++ b/src/Infrastructure/Adapter/Validator.php @@ -0,0 +1,32 @@ +validator = $validator; + } + + public function validateTermsEdition(TermsEdition $termsEdition): void + { + $violations = $this->validator->validate($termsEdition); + + if (\count($violations) === 0) { + return; + } + + throw new InvalidTermsEditionException($violations); + } +} diff --git a/src/Infrastructure/DependencyInjection/CompilerPass/TermsGuardCompilerPass.php b/src/Infrastructure/DependencyInjection/CompilerPass/TermsGuardCompilerPass.php new file mode 100644 index 0000000..30fbddb --- /dev/null +++ b/src/Infrastructure/DependencyInjection/CompilerPass/TermsGuardCompilerPass.php @@ -0,0 +1,29 @@ +findTaggedServiceIds(self::TAG); + $serviceReferences = \array_map( + static function (string $serviceId): Reference { + return new Reference($serviceId); + }, + \array_keys($services) + ); + + $definition = $container->findDefinition(TermsGuardVoter::class); + $definition->addMethodCall('setGuards', [$serviceReferences]); + } +} diff --git a/src/DependencyInjection/Configuration.php b/src/Infrastructure/DependencyInjection/Configuration.php similarity index 51% rename from src/DependencyInjection/Configuration.php rename to src/Infrastructure/DependencyInjection/Configuration.php index 604a753..c277ede 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/Infrastructure/DependencyInjection/Configuration.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace RichId\TermsModuleBundle\DependencyInjection; +namespace RichId\TermsModuleBundle\Infrastructure\DependencyInjection; use RichCongress\BundleToolbox\Configuration\AbstractConfiguration; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; @@ -15,8 +15,9 @@ class Configuration extends AbstractConfiguration protected function buildConfiguration(ArrayNodeDefinition $rootNode): void { $children = $rootNode->children(); + $this->addAdminRoles($children); - $this->addDefaultRefusalRoute($children); + $this->addDefaultRedirectionRoutes($children); } protected function addAdminRoles(NodeBuilder $nodeBuilder): void @@ -27,17 +28,36 @@ protected function addAdminRoles(NodeBuilder $nodeBuilder): void ->scalarPrototype(); } + protected function addDefaultRedirectionRoutes(NodeBuilder $nodeBuilder): void + { + $children = $nodeBuilder + ->arrayNode('default_redirection_routes') + ->isRequired() + ->children(); + + $this->addDefaultAcceptationRoute($children); + $this->addDefaultRefusalRoute($children); + $this->addDefaulIgnoreRoute($children); + } + + protected function addDefaultAcceptationRoute(NodeBuilder $nodeBuilder): void + { + $nodeBuilder + ->scalarNode('acceptation') + ->isRequired(); + } + protected function addDefaultRefusalRoute(NodeBuilder $nodeBuilder): void { - $nodeBuilder->scalarNode('default_refusal_route'); + $nodeBuilder + ->scalarNode('refusal') + ->isRequired(); } - protected function addAccessDeniedRedirection(NodeBuilder $nodeBuilder): void + protected function addDefaulIgnoreRoute(NodeBuilder $nodeBuilder): void { $nodeBuilder - ->arrayNode('access_denied_redirection') - ->example(['app_front_protected_by_terms']) - ->defaultValue([]) - ->scalarPrototype(); + ->scalarNode('ignore') + ->isRequired(); } } diff --git a/src/Infrastructure/DependencyInjection/PrependDoctrineMigrationTrait.php b/src/Infrastructure/DependencyInjection/PrependDoctrineMigrationTrait.php new file mode 100644 index 0000000..9c288ff --- /dev/null +++ b/src/Infrastructure/DependencyInjection/PrependDoctrineMigrationTrait.php @@ -0,0 +1,26 @@ +hasExtension('doctrine_migrations')) { + return; + } + + $doctrineConfig = $container->getExtensionConfig('doctrine_migrations'); + $doctrineMigrationPaths = \array_pop($doctrineConfig)['migrations_paths'] ?? []; + + $container->prependExtensionConfig('doctrine_migrations', [ + 'migrations_paths' => \array_merge($doctrineMigrationPaths, [ + 'RichId\TermsModuleBundle\Infrastructure\Migrations' => '@RichIdTermsModuleBundle/Migrations', + ]), + ]); + } +} diff --git a/src/Infrastructure/DependencyInjection/PrependFosCKEditorTrait.php b/src/Infrastructure/DependencyInjection/PrependFosCKEditorTrait.php new file mode 100644 index 0000000..81a9fb0 --- /dev/null +++ b/src/Infrastructure/DependencyInjection/PrependFosCKEditorTrait.php @@ -0,0 +1,35 @@ +hasExtension('fos_ck_editor')) { + return; + } + + $container->prependExtensionConfig( + 'fos_ck_editor', + [ + 'toolbars' => [ + 'configs' => [ + 'terms_module' => [ + '@full.clipboard', + '@full.basic_styles', + '@full.paragraph', + '/', + '@full.styles', + '@full.colors', + ], + ], + ], + ] + ); + } +} diff --git a/src/Infrastructure/DependencyInjection/RichIdTermsModuleExtension.php b/src/Infrastructure/DependencyInjection/RichIdTermsModuleExtension.php new file mode 100644 index 0000000..21b33f2 --- /dev/null +++ b/src/Infrastructure/DependencyInjection/RichIdTermsModuleExtension.php @@ -0,0 +1,47 @@ + $configs */ + public function load(array $configs, ContainerBuilder $container): void + { + $this->parseConfiguration( + $container, + new Configuration(), + $configs + ); + + $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); + $loader->load('services.xml'); + + $container + ->registerForAutoconfiguration(TermsGuardInterface::class) + ->addTag(TermsGuardCompilerPass::TAG); + } + + public function prepend(ContainerBuilder $container): void + { + $this->prependDoctrineMigrations($container); + $this->prependFosCKEditor($container); + } +} diff --git a/src/Infrastructure/FormType/TermsVersionFormType.php b/src/Infrastructure/FormType/TermsVersionFormType.php new file mode 100644 index 0000000..43d8d36 --- /dev/null +++ b/src/Infrastructure/FormType/TermsVersionFormType.php @@ -0,0 +1,100 @@ +add( + 'title', + TextType::class, + [ + 'required' => true, + 'label' => 'terms_module.admin.edit.label.title', + 'translation_domain' => 'terms_module', + 'attr' => [ + 'readonly' => $termsVersion->isEnabled(), + 'placeholder' => 'terms_module.admin.edit.placeholder.title', + ], + ] + ) + ->add( + 'content', + CKEditorType::class, + [ + 'required' => true, + 'label' => 'terms_module.admin.edit.label.content', + 'translation_domain' => 'terms_module', + 'disabled' => $termsVersion->isEnabled(), + 'config' => [ + 'toolbar' => 'terms_module', + ], + ] + ) + ->add( + 'isTermsPublished', + ChoiceType::class, + [ + 'required' => true, + 'label' => 'terms_module.admin.edit.label.status', + 'translation_domain' => 'terms_module', + 'choice_translation_domain' => 'terms_module', + 'choices' => [ + 'terms_module.admin.edit.status.enabled' => true, + 'terms_module.admin.edit.status.disabled' => false, + ], + ] + ) + ->add( + 'publicationDate', + DateType::class, + [ + 'required' => false, + 'label' => 'terms_module.admin.edit.label.publication_date', + 'translation_domain' => 'terms_module', + 'widget' => 'single_text', + 'attr' => [ + 'readonly' => $termsVersion->isEnabled(), + ], + ] + ) + ->add( + 'needVersionActivation', + HiddenType::class, + [ + 'required' => false, + ] + ) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults( + [ + self::TERMS_VERSION_ENTITY => null, + 'data_class' => TermsEdition::class, + ] + ); + } +} diff --git a/src/Infrastructure/Listener/RedirectToSigningPageOnAccessDeniedListener.php b/src/Infrastructure/Listener/RedirectToSigningPageOnAccessDeniedListener.php new file mode 100644 index 0000000..c482344 --- /dev/null +++ b/src/Infrastructure/Listener/RedirectToSigningPageOnAccessDeniedListener.php @@ -0,0 +1,43 @@ +router = $router; + } + + public function onKernelException(ExceptionEvent $event): void + { + $exception = $event->getThrowable(); + + if (!$exception instanceof SubjectNeedToSignTermsException) { + return; + } + + $event->setResponse( + new RedirectResponse( + $this->router->generate( + 'module_terms_sign', + [ + 'termsSlug' => $exception->getTermsSlug(), + 'type' => $exception->getSubject()->getTermsSubjectType(), + 'identifier' => $exception->getSubject()->getTermsSubjectIdentifier(), + ] + ) + ) + ); + } +} diff --git a/src/Infrastructure/Migrations/Version20210628151052.php b/src/Infrastructure/Migrations/Version20210628151052.php new file mode 100644 index 0000000..f2d9ffd --- /dev/null +++ b/src/Infrastructure/Migrations/Version20210628151052.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE module_terms_terms (id INT UNSIGNED AUTO_INCREMENT NOT NULL, slug VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, is_published TINYINT(1) NOT NULL, is_depublication_locked TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_67FAB3BA989D9B62 (slug), UNIQUE INDEX UNIQ_67FAB3BA5E237E06 (name), PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB'); + + $this->addSql('CREATE TABLE module_terms_terms_version (id INT UNSIGNED AUTO_INCREMENT NOT NULL, terms_id INT UNSIGNED NOT NULL, version INT UNSIGNED NOT NULL, is_enabled TINYINT(1) NOT NULL, title VARCHAR(255) NOT NULL, content LONGTEXT NOT NULL, publication_date DATETIME DEFAULT NULL, index IDX_2E43CCE53742F27 (terms_id), UNIQUE INDEX terms_version_terms_id_version_UNIQUE (version, terms_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE module_terms_terms_version ADD CONSTRAINT fk_2e43cce53742f27 FOREIGN KEY (terms_id) REFERENCES module_terms_terms (id) ON DELETE RESTRICT'); + + $this->addSql('CREATE TABLE module_terms_terms_version_signature (id INT UNSIGNED AUTO_INCREMENT NOT NULL, version_id INT UNSIGNED NOT NULL, date DATETIME NOT NULL, subject_type VARCHAR(255) NOT NULL, subject_identifier VARCHAR(255) NOT NULL, index IDX_DD62973A4BBC2705 (version_id), UNIQUE INDEX module_terms_terms_version_signature_UNIQUE (subject_type, subject_identifier, version_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE module_terms_terms_version_signature ADD CONSTRAINT fk_dd62973a4bbc2705 FOREIGN KEY (version_id) REFERENCES module_terms_terms_version (id) ON DELETE RESTRICT'); + } + + public function down(Schema $schema): void + { + $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE module_terms_terms_version DROP FOREIGN KEY FK_2E43CCE53742F27'); + $this->addSql('ALTER TABLE module_terms_terms_version_signature DROP FOREIGN KEY FK_DD62973A4BBC2705'); + $this->addSql('DROP TABLE module_terms_terms'); + $this->addSql('DROP TABLE module_terms_terms_version'); + $this->addSql('DROP TABLE module_terms_terms_version_signature'); + } +} diff --git a/src/Infrastructure/Repository/TermsRepository.php b/src/Infrastructure/Repository/TermsRepository.php new file mode 100644 index 0000000..7ec05fa --- /dev/null +++ b/src/Infrastructure/Repository/TermsRepository.php @@ -0,0 +1,29 @@ + + * + * @method Terms findOneBySlug(string $slug) + */ +class TermsRepository extends ServiceEntityRepository +{ + /** @codeCoverageIgnore */ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Terms::class); + } + + /** @return array */ + public function findAllOrderedByName(): array + { + return $this->findBy([], ['name' => 'ASC']); + } +} diff --git a/src/Infrastructure/Repository/TermsVersionRepository.php b/src/Infrastructure/Repository/TermsVersionRepository.php new file mode 100644 index 0000000..1829be7 --- /dev/null +++ b/src/Infrastructure/Repository/TermsVersionRepository.php @@ -0,0 +1,59 @@ + */ +class TermsVersionRepository extends ServiceEntityRepository +{ + /** @codeCoverageIgnore */ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, TermsVersion::class); + } + + public function findLastSignedVersionForTermsSubject(string $termsSlug, TermsSubjectInterface $subject): ?TermsVersion + { + $qb = $this->createQueryBuilder('tv'); + + return $qb->join('tv.terms', 't') + ->join('tv.signatures', 's') + ->where('t.slug = :termsSlug') + ->andWhere('s.subjectType = :subjectType') + ->andWhere('s.subjectIdentifier = :subjectIdentifier') + ->setParameters( + [ + 'termsSlug' => $termsSlug, + 'subjectType' => $subject->getTermsSubjectType(), + 'subjectIdentifier' => $subject->getTermsSubjectIdentifier(), + ] + ) + ->orderBy('tv.version', 'DESC') + ->setMaxResults(1) + ->getQuery() + ->getOneOrNullResult(); + } + + public function findOneByTermsAndVersion(string $termsSlug, int $version): ?TermsVersion + { + $qb = $this->createQueryBuilder('tv'); + + return $qb->join('tv.terms', 't') + ->where('t.slug = :termsSlug') + ->andWhere('tv.version = :version') + ->setParameters( + [ + 'termsSlug' => $termsSlug, + 'version' => $version, + ] + ) + ->getQuery() + ->getOneOrNullResult(); + } +} diff --git a/src/Infrastructure/Repository/TermsVersionSignatureRepository.php b/src/Infrastructure/Repository/TermsVersionSignatureRepository.php new file mode 100644 index 0000000..3820413 --- /dev/null +++ b/src/Infrastructure/Repository/TermsVersionSignatureRepository.php @@ -0,0 +1,19 @@ + */ +class TermsVersionSignatureRepository extends ServiceEntityRepository +{ + /** @codeCoverageIgnore */ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, TermsVersionSignature::class); + } +} diff --git a/src/Infrastructure/Resources/config/routing/routing.xml b/src/Infrastructure/Resources/config/routing/routing.xml new file mode 100644 index 0000000..12467a6 --- /dev/null +++ b/src/Infrastructure/Resources/config/routing/routing.xml @@ -0,0 +1,33 @@ + + + + + \d+ + + + + \d+ + + + + + + \d+ + + + + + diff --git a/src/Infrastructure/Resources/config/services.xml b/src/Infrastructure/Resources/config/services.xml new file mode 100644 index 0000000..f9850c3 --- /dev/null +++ b/src/Infrastructure/Resources/config/services.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Infrastructure/Resources/translations/terms_module.en.yml b/src/Infrastructure/Resources/translations/terms_module.en.yml new file mode 100644 index 0000000..8bd98bd --- /dev/null +++ b/src/Infrastructure/Resources/translations/terms_module.en.yml @@ -0,0 +1,26 @@ +terms_module.admin.edit.activate_version: Active +terms_module.admin.edit.cancel: Cancel +terms_module.admin.edit.close: Close +terms_module.admin.edit.duplicate: Duplicate +terms_module.admin.edit.label.content: Content +terms_module.admin.edit.label.publication_date: Publication date +terms_module.admin.edit.label.status: Status +terms_module.admin.edit.label.title: Title +terms_module.admin.edit.new_version: New version +terms_module.admin.edit.placeholder.title: Title to be displayed on the site +terms_module.admin.edit.save: Save +terms_module.admin.edit.save_and_exit: Save and exit +terms_module.admin.edit.status.disabled: Unpublished +terms_module.admin.edit.status.enabled: Published +terms_module.admin.edit.title: Terms management +terms_module.admin.edit.version: V. %version% + +terms_module.admin.list.title: Terms management + +terms_module.log.terms_signed: 'A decision has been made for the terms %terms_slug%. Decision: %choice%. Date: %date%. User: %user%.' + +terms_module.sign.accept: I agree +terms_module.sign.new_version: New version! +terms_module.sign.prefer_answer_later: I prefer to answer later +terms_module.sign.refuse: I refuse + diff --git a/src/Infrastructure/Resources/translations/terms_module.fr.yml b/src/Infrastructure/Resources/translations/terms_module.fr.yml new file mode 100644 index 0000000..798453d --- /dev/null +++ b/src/Infrastructure/Resources/translations/terms_module.fr.yml @@ -0,0 +1,25 @@ +terms_module.admin.edit.activate_version: Activer +terms_module.admin.edit.cancel: Annuler +terms_module.admin.edit.close: Fermer +terms_module.admin.edit.duplicate: Dupliquer +terms_module.admin.edit.label.content: Contenu +terms_module.admin.edit.label.publication_date: Début de publication +terms_module.admin.edit.label.status: Statut +terms_module.admin.edit.label.title: Titre +terms_module.admin.edit.new_version: Nouvelle version +terms_module.admin.edit.placeholder.title: Titre qui sera affiché sur le site +terms_module.admin.edit.save: Enregistrer +terms_module.admin.edit.save_and_exit: Enregistrer et fermer +terms_module.admin.edit.status.disabled: Non publiées +terms_module.admin.edit.status.enabled: Publiées +terms_module.admin.edit.title: Gestion des CGU +terms_module.admin.edit.version: V. %version% + +terms_module.admin.list.title: Gestion des CGU + +terms_module.log.terms_signed: 'Une décision a été prise pour le CGU %terms_slug%. Décision: %choice%. Date: %date%. Utilisateur: %user%.' + +terms_module.sign.accept: J'accepte +terms_module.sign.new_version: Nouvelle version ! +terms_module.sign.prefer_answer_later: Je préfère répondre plus tard +terms_module.sign.refuse: Je refuse diff --git a/src/Infrastructure/Resources/translations/terms_module_validation.en.yml b/src/Infrastructure/Resources/translations/terms_module_validation.en.yml new file mode 100644 index 0000000..79137fb --- /dev/null +++ b/src/Infrastructure/Resources/translations/terms_module_validation.en.yml @@ -0,0 +1,5 @@ +terms_edition.validation.cant_content_change_if_terms_published: The content cannot be changed when the version is published. +terms_edition.validation.cant_enable_version_if_already_enabled: The version is already activated. +terms_edition.validation.cant_publication_date_change_if_terms_published: The publication date cannot be changed when the version is published. +terms_edition.validation.cant_title_change_if_terms_published: The title cannot be changed when the version is published. +terms_edition.validation.cant_unpublish_locked_published_terms: It is not possible to unpublish a locked terms. diff --git a/src/Infrastructure/Resources/translations/terms_module_validation.fr.yml b/src/Infrastructure/Resources/translations/terms_module_validation.fr.yml new file mode 100644 index 0000000..b5a4723 --- /dev/null +++ b/src/Infrastructure/Resources/translations/terms_module_validation.fr.yml @@ -0,0 +1,5 @@ +terms_edition.validation.cant_content_change_if_terms_published: Le contenu ne peut être modifié quand la version est publiée. +terms_edition.validation.cant_enable_version_if_already_enabled: La version est déjà activée. +terms_edition.validation.cant_publication_date_change_if_terms_published: La date de publication ne peut être modifiée quand la version est publiée. +terms_edition.validation.cant_title_change_if_terms_published: Le titre ne peut être modifié quand la version est publiée. +terms_edition.validation.cant_unpublish_locked_published_terms: Il n'est pas possible de dé-publier un CGU qui est bloqué. diff --git a/src/Infrastructure/Resources/views/_form-theme.html.twig b/src/Infrastructure/Resources/views/_form-theme.html.twig new file mode 100644 index 0000000..12b5d34 --- /dev/null +++ b/src/Infrastructure/Resources/views/_form-theme.html.twig @@ -0,0 +1,20 @@ +{% block form_row -%} +
+
+ {{ form_widget(form, {attr: attr|merge({class: (attr.class|default('') ~ ' terms-module-form-field-input')|trim})}) }} + {{- form_label(form, '', {'label_attr': {'class': 'terms-module-form-field-label'}}) }} +
+ {{- form_help(form) -}} + {{ form_errors(form) }} +
+{%- endblock form_row %} + +{%- block form_errors -%} + {%- if errors|length > 0 -%} +
    + {%- for error in errors -%} +
  • {{ error.message }}
  • + {%- endfor -%} +
+ {%- endif -%} +{%- endblock form_errors -%} diff --git a/src/Infrastructure/Resources/views/_load-picto.html.twig b/src/Infrastructure/Resources/views/_load-picto.html.twig new file mode 100644 index 0000000..55e6b62 --- /dev/null +++ b/src/Infrastructure/Resources/views/_load-picto.html.twig @@ -0,0 +1,9 @@ + diff --git a/src/Infrastructure/Resources/views/_loader.html.twig b/src/Infrastructure/Resources/views/_loader.html.twig new file mode 100644 index 0000000..de5d55b --- /dev/null +++ b/src/Infrastructure/Resources/views/_loader.html.twig @@ -0,0 +1,25 @@ + + + diff --git a/src/Infrastructure/Resources/views/_partial/_loader.html.twig b/src/Infrastructure/Resources/views/_partial/_loader.html.twig new file mode 100644 index 0000000..67d90a1 --- /dev/null +++ b/src/Infrastructure/Resources/views/_partial/_loader.html.twig @@ -0,0 +1,5 @@ +
+ {% for i in range(1, 10) %} +
+ {% endfor %} +
diff --git a/src/Infrastructure/Resources/views/_styles.html.twig b/src/Infrastructure/Resources/views/_styles.html.twig new file mode 100644 index 0000000..f8500a4 --- /dev/null +++ b/src/Infrastructure/Resources/views/_styles.html.twig @@ -0,0 +1,655 @@ + + +{% block custom_style %}{% endblock %} diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/_body.html.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/_body.html.twig new file mode 100644 index 0000000..de9edd0 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/_body.html.twig @@ -0,0 +1,83 @@ +{% form_theme form '@RichIdTermsModule/_form-theme.html.twig' %} + +{% include '@RichIdTermsModule/_loader.html.twig' %} +{% set publishedTermsAndDepublicationLocked = terms.published() and terms.depublicationLocked %} + +{% if lastTermsVersion.isEnabled() %} + {% set lastEnabledVersion = lastTermsVersion %} +{% else %} + {% set lastEnabledVersion = terms.versions|sort((a, b) => b.version <=> a.version)|slice(1, 1)|first %} +{% endif %} + +
+
{{ terms.name }}
+ + {{ form_start(form, {'attr': {'id': 'terms-edition-form'}}) }} + {{ form_row(form.isTermsPublished, {'attr': {'class': 'terms-module-form-field-small'}}) }} + {{ form_row(form.needVersionActivation) }} + +
+
+ {% for termsVersion in terms.versions|sort((a, b) => b.version <=> a.version) %} + {% include '@RichIdTermsModule/admin/edit/_partial/_terms_version_card.html.twig' %} + {% endfor %} + +
...
+
+ +
+ {% if currentTermsVersion.id == lastTermsVersion.id and lastTermsVersion.isEnabled() %} + + {% endif %} + + {% if currentTermsVersion.id != lastTermsVersion.id %} + + {% endif %} + + {% if currentTermsVersion.id is not null and currentTermsVersion.id == lastTermsVersion.id and not lastTermsVersion.isEnabled() %} + + {% endif %} + + {% if currentTermsVersion.id is not null and not currentTermsVersion.isEnabled() and terms.versions|length > 1 %} + + {% endif %} +
+
+ +
+
{{ form_row(form.title, {'attr': {'class': 'terms-module-form-field-full'}}) }}
+
{{ form_row(form.publicationDate, {'attr': {'class': 'terms-module-form-field-small'}}) }}
+
+ + {{ form_row(form.content, {'attr': {'class': 'terms-module-form-field-full'}}) }} + +
+ + + {{ 'terms_module.admin.edit.close'|trans({}, 'terms_module') }} +
+ {{ form_end(form) }} +
+ +{% include '@RichIdTermsModule/_load-picto.html.twig' %} + + diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/_content.html.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/_content.html.twig new file mode 100644 index 0000000..d1c2094 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/_content.html.twig @@ -0,0 +1,10 @@ +{% include '@RichIdTermsModule/_styles.html.twig' %} +{% include '@RichIdTermsModule/admin/edit/_partial/_styles.html.twig' %} + +
+ {% include '@RichIdTermsModule/admin/edit/_partial/_header.html.twig' %} + +
+ {% include '@RichIdTermsModule/admin/edit/_partial/_body.html.twig' %} +
+
diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/_header.html.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/_header.html.twig new file mode 100644 index 0000000..6e1f229 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/_header.html.twig @@ -0,0 +1,3 @@ +
+ {{ 'terms_module.admin.edit.title'|trans({}, 'terms_module') }} +
diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/_styles.html.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/_styles.html.twig new file mode 100644 index 0000000..368dca1 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/_styles.html.twig @@ -0,0 +1,157 @@ + diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/_terms_version_card.html.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/_terms_version_card.html.twig new file mode 100644 index 0000000..49ea726 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/_terms_version_card.html.twig @@ -0,0 +1,14 @@ + + {% if termsVersion.id == lastTermsVersion.id and not termsVersion.isEnabled() %} + + {% elseif lastEnabledVersion != false and lastEnabledVersion.id == termsVersion.id %} + + {% else %} + + {% endif %} + + {{ 'terms_module.admin.edit.version'|trans({'%version%': termsVersion.version}, 'terms_module') }} + diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/js/_ajax.js.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_ajax.js.twig new file mode 100644 index 0000000..3dbfdb8 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_ajax.js.twig @@ -0,0 +1,47 @@ +window.saveTerms = function (exit) { + document.getElementById('{{ form.isTermsPublished.vars.id }}').disabled = false; + document.getElementById('terms-edition-form').action = window.getSaveTermsUrl(exit); + document.getElementById('terms-edition-form').submit(); +}; + +window.createNewVersion = function (versionId) { + var xhr = new XMLHttpRequest(); + let url ='{{ path('module_terms_add_terms_version', {'terms': terms.id}) }}'; + + if (typeof versionId !=='undefined' && versionId !== null) { + url += '?version=' + versionId; + } + + xhr.open('POST', url); + + xhr.onreadystatechange = function(){ + if (xhr.readyState === 4 && xhr.status === 201){ + window.location.href = '{{ path('module_terms_admin_edition', {'terms': terms.id}) }}'; + } + } + + xhr.send(null); +}; + +window.removeVersion = function () { + {% if currentTermsVersion.id is not null %} + var xhr = new XMLHttpRequest(); + + xhr.open('DELETE', '{{ path('module_terms_remove_terms_version', {'termsVersion': currentTermsVersion.id}) }}'); + + xhr.onreadystatechange = function(){ + if (xhr.readyState === 4 && xhr.status === 200){ + window.location.href = '{{ path('module_terms_admin_edition', {'terms': terms.id}) }}'; + } + } + + xhr.send(null); + {% endif %} +}; + +window.activateVersion = function () { + {% if currentTermsVersion.id is not null %} + document.getElementById('{{ form.needVersionActivation.vars.id }}').value = true; + window.saveTerms(); + {% endif %} +}; diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/js/_getter.js.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_getter.js.twig new file mode 100644 index 0000000..9b04e4a --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_getter.js.twig @@ -0,0 +1,46 @@ +window.getSaveTermsUrl = function (exit) { + if (typeof exit === 'undefined' || exit === null) { + exit = false; + } + var data = []; + + if (window.saveTermsVersion !== null) { + data.push('version=' + window.saveTermsVersion); + } + + if (exit) { + data.push('exit=true'); + } + + if (data.length === 0) { + return window.saveTermsUrl; + } + + return window.saveTermsUrl + '?' + data.join('&'); +}; + +window.isTermsPublished = function () { + let field = document.getElementById('{{ form.isTermsPublished.vars.id }}'); + return field ? field.value === '1' : false; +}; + +window.getTermsVersionTitle = function () { + let field = document.getElementById('{{ form.title.vars.id }}'); + return field ? field.value : ''; +}; + +window.getTermsVersionPublicationDate = function () { + let field = document.getElementById('{{ form.publicationDate.vars.id }}'); + return field ? field.value : ''; +}; + +window.getTermsVersionContent = function () { + return CKEDITOR.instances.terms_version_form_content.getData(); +}; + +window.termsHasChanges = function () { + return window.currentTermsVersion.isTermsPublished !== window.initialTermsVersion.isTermsPublished + || window.currentTermsVersion.title !== window.initialTermsVersion.title + || window.currentTermsVersion.content !== window.initialTermsVersion.content + || window.currentTermsVersion.publicationDate !== window.initialTermsVersion.publicationDate; +}; diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/js/_init.js.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_init.js.twig new file mode 100644 index 0000000..2b30a96 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_init.js.twig @@ -0,0 +1,14 @@ +window.saveTermsUrl = '{{ path('module_terms_admin_edition', {'terms': terms.id}) }}'; +window.saveTermsVersion = {% if app.request.query.has('version') %}'{{ app.request.query.get('version') }}'{% else %}null{% endif %}; +window.exitTermsCloseMessage = '{{ 'terms_module.admin.edit.close'|trans({}, 'terms_module') }}'; +window.exitTermsCancelMessage = '{{ 'terms_module.admin.edit.cancel'|trans({}, 'terms_module') }}'; + +window.currentTermsVersion = {}; +window.initialTermsVersion = { + isTermsPublished: {% if terms.isPublished %}true{% else %}false{% endif %}, + title: '{{ currentTermsVersion.title|e('js') }}', + content: '{{ currentTermsVersion.content|e('js') }}', + publicationDate: {% if currentTermsVersion.publicationDate is not null %}'{{ currentTermsVersion.publicationDate|date('Y-m-d') }}'{% else %}''{% endif %}, +}; + +Object.assign(window.currentTermsVersion, window.initialTermsVersion); diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/js/_listener.js.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_listener.js.twig new file mode 100644 index 0000000..d1b97ce --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_listener.js.twig @@ -0,0 +1,54 @@ +window.initTermsEdition = function () { + window.computeTermsPublicationStatus(); +}; + +document.getElementById('{{ form.isTermsPublished.vars.id }}').addEventListener('input', function () { + window.currentTermsVersion.isTermsPublished = window.isTermsPublished(); + window.computeSaveButtonStatus(); + window.computeExitButtonText(); +}); + +document.getElementById('{{ form.title.vars.id }}').addEventListener('input', function () { + window.currentTermsVersion.title = window.getTermsVersionTitle(); + window.computeTermsPublicationStatus(); + window.computeSaveButtonStatus(); + window.computeExitButtonText(); +}); + +document.getElementById('{{ form.publicationDate.vars.id }}').addEventListener('input', function () { + window.currentTermsVersion.publicationDate = window.getTermsVersionPublicationDate(); + window.computeSaveButtonStatus(); + window.computeExitButtonText(); +}); + +CKEDITOR.instances.terms_version_form_content.on('change', function () { + window.currentTermsVersion.content = window.getTermsVersionContent(); + window.computeTermsPublicationStatus(); + window.computeSaveButtonStatus(); + window.computeExitButtonText(); +}); + +CKEDITOR.instances.terms_version_form_content.on('instanceReady', function () { + window.initialTermsVersion.content = window.getTermsVersionContent(); + window.currentTermsVersion.content = window.getTermsVersionContent(); + window.computeTermsVersionContentStatus(); + + if (CKEDITOR.instances.terms_version_form_content.readOnly) { + let el = document.getElementById('{{ form.content.vars.id }}'); + + el.disabled = false + el.readOnly = true; + } +}); + +window.initTermsEdition(); + +const resize_ob = new ResizeObserver(function(entries) { + let rect = entries[0].contentRect; + + if (rect.height > 50) { + document.getElementById('terms-module-admin-edition-terms-version-tags').classList.add('with-next'); + } +}); + +resize_ob.observe(document.getElementById('terms-module-admin-edition-terms-version-tags')); diff --git a/src/Infrastructure/Resources/views/admin/edit/_partial/js/_updater.js.twig b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_updater.js.twig new file mode 100644 index 0000000..ba8778d --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/_partial/js/_updater.js.twig @@ -0,0 +1,36 @@ +window.computeTermsPublicationStatus = function () { + let publishedTermsAndDepublicationLocked = {% if publishedTermsAndDepublicationLocked %}true{% else %}false{% endif %}; + document.getElementById('{{ form.isTermsPublished.vars.id }}').disabled = publishedTermsAndDepublicationLocked || window.getTermsVersionTitle() === '' || window.getTermsVersionContent() === ''; +}; + +window.computeSaveButtonStatus = function () { + let valid = window.currentTermsVersion.title !== '' && window.currentTermsVersion.content !== ''; + let hasChanges = window.termsHasChanges(); + + let buttonSave = document.getElementById('save-terms'); + let buttonSaveAndExit = document.getElementById('save-and-exit-terms'); + + buttonSave.disabled = !valid || !hasChanges; + buttonSaveAndExit.disabled = !valid || !hasChanges; +}; + +window.computeExitButtonText = function () { + let button = document.getElementById('exit-terms'); + + if (window.termsHasChanges()) { + button.text = window.exitTermsCancelMessage; + } else { + button.text = window.exitTermsCloseMessage; + } +}; + +window.computeTermsVersionContentStatus = function () { + {% if currentTermsVersion.isEnabled() %} + CKEDITOR.instances.terms_version_form_content.setReadOnly(); + {% endif %} +}; + + +window.openOtherVersion = function () { + document.getElementById('terms-module-admin-edition-terms-version-tags').classList.add('open'); +}; diff --git a/src/Infrastructure/Resources/views/admin/edit/main.html.twig b/src/Infrastructure/Resources/views/admin/edit/main.html.twig new file mode 100644 index 0000000..bcbce67 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/edit/main.html.twig @@ -0,0 +1,14 @@ + + + + {% block terms_module_title %}{% endblock %} + + + + + + + + {% include '@RichIdTermsModule/admin/edit/_partial/_content.html.twig' %} + + diff --git a/src/Infrastructure/Resources/views/admin/list/_partial/_body.html.twig b/src/Infrastructure/Resources/views/admin/list/_partial/_body.html.twig new file mode 100644 index 0000000..156e772 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/list/_partial/_body.html.twig @@ -0,0 +1,7 @@ +
+ {% for terms in termsList %} + {% include '@RichIdTermsModule/admin/list/_partial/_terms-card.html.twig' with {'terms' : terms} %} + {% endfor %} +
+ +{% include '@RichIdTermsModule/_load-picto.html.twig' %} diff --git a/src/Infrastructure/Resources/views/admin/list/_partial/_content.html.twig b/src/Infrastructure/Resources/views/admin/list/_partial/_content.html.twig new file mode 100644 index 0000000..ba2aec2 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/list/_partial/_content.html.twig @@ -0,0 +1,10 @@ +{% include '@RichIdTermsModule/_styles.html.twig' %} +{% include '@RichIdTermsModule/admin/list/_partial/_styles.html.twig' %} + +
+ {% include '@RichIdTermsModule/admin/list/_partial/_header.html.twig' %} + +
+ {% include '@RichIdTermsModule/admin/list/_partial/_body.html.twig' %} +
+
diff --git a/src/Infrastructure/Resources/views/admin/list/_partial/_header.html.twig b/src/Infrastructure/Resources/views/admin/list/_partial/_header.html.twig new file mode 100644 index 0000000..282367a --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/list/_partial/_header.html.twig @@ -0,0 +1,3 @@ +
+ {{ 'terms_module.admin.list.title'|trans({}, 'terms_module') }} +
diff --git a/src/Infrastructure/Resources/views/admin/list/_partial/_styles.html.twig b/src/Infrastructure/Resources/views/admin/list/_partial/_styles.html.twig new file mode 100644 index 0000000..79db3aa --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/list/_partial/_styles.html.twig @@ -0,0 +1,41 @@ + diff --git a/src/Infrastructure/Resources/views/admin/list/_partial/_terms-card.html.twig b/src/Infrastructure/Resources/views/admin/list/_partial/_terms-card.html.twig new file mode 100644 index 0000000..2941fa1 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/list/_partial/_terms-card.html.twig @@ -0,0 +1,12 @@ +{% if terms is defined %} + +
{{ terms.name }}
+
+ {% if terms.isPublished %} + + {% else %} + + {% endif %} +
+
+{% endif %} diff --git a/src/Infrastructure/Resources/views/admin/list/main.html.twig b/src/Infrastructure/Resources/views/admin/list/main.html.twig new file mode 100644 index 0000000..518f8e1 --- /dev/null +++ b/src/Infrastructure/Resources/views/admin/list/main.html.twig @@ -0,0 +1,14 @@ + + + + {% block terms_module_title %}{% endblock %} + + + + + + + + {% include '@RichIdTermsModule/admin/list/_partial/_content.html.twig' %} + + diff --git a/src/Infrastructure/Resources/views/sign/_partial/_body.html.twig b/src/Infrastructure/Resources/views/sign/_partial/_body.html.twig new file mode 100644 index 0000000..1156051 --- /dev/null +++ b/src/Infrastructure/Resources/views/sign/_partial/_body.html.twig @@ -0,0 +1,39 @@ +
+ {% if hasSignedTerms(terms.slug, subject.termsSubjectType, subject.termsSubjectIdentifier) == constant('RichId\\TermsModuleBundle\\Domain\\UseCase\\HasSignedTerms::HAS_SIGNED_OLD_VERSION') %} +
{{ 'terms_module.sign.new_version'|trans({}, 'terms_module') }}
+ {% endif %} + +
{{ lastTermsVersion.title }}
+
{{ lastTermsVersion.content|raw }}
+ +
+ + + + + {{ 'terms_module.sign.prefer_answer_later'|trans({}, 'terms_module') }} +
+
+ + diff --git a/src/Infrastructure/Resources/views/sign/_partial/_content.html.twig b/src/Infrastructure/Resources/views/sign/_partial/_content.html.twig new file mode 100644 index 0000000..ccc30fb --- /dev/null +++ b/src/Infrastructure/Resources/views/sign/_partial/_content.html.twig @@ -0,0 +1,13 @@ +{% include '@RichIdTermsModule/_styles.html.twig' %} +{% include '@RichIdTermsModule/sign/_partial/_styles.html.twig' %} +{% include '@RichIdTermsModule/_loader.html.twig' %} + +
+ {% include '@RichIdTermsModule/sign/_partial/_header.html.twig' %} + +
+
+ {% include '@RichIdTermsModule/sign/_partial/_body.html.twig' %} +
+
+
diff --git a/src/Infrastructure/Resources/views/sign/_partial/_header.html.twig b/src/Infrastructure/Resources/views/sign/_partial/_header.html.twig new file mode 100644 index 0000000..4fef5f7 --- /dev/null +++ b/src/Infrastructure/Resources/views/sign/_partial/_header.html.twig @@ -0,0 +1,5 @@ +
+
+
{{ terms.name }}
+
+
diff --git a/src/Infrastructure/Resources/views/sign/_partial/_styles.html.twig b/src/Infrastructure/Resources/views/sign/_partial/_styles.html.twig new file mode 100644 index 0000000..cb5798c --- /dev/null +++ b/src/Infrastructure/Resources/views/sign/_partial/_styles.html.twig @@ -0,0 +1,87 @@ + diff --git a/src/Infrastructure/Resources/views/sign/main.html.twig b/src/Infrastructure/Resources/views/sign/main.html.twig new file mode 100644 index 0000000..aedf998 --- /dev/null +++ b/src/Infrastructure/Resources/views/sign/main.html.twig @@ -0,0 +1,14 @@ + + + + {% block terms_module_title %}{% endblock %} + + + + + + + + {% include '@RichIdTermsModule/sign/_partial/_content.html.twig' %} + + diff --git a/src/Infrastructure/RichIdTermsModuleBundle.php b/src/Infrastructure/RichIdTermsModuleBundle.php new file mode 100644 index 0000000..409c020 --- /dev/null +++ b/src/Infrastructure/RichIdTermsModuleBundle.php @@ -0,0 +1,36 @@ +addDoctrineOrmMappingsPass($container); + } + + private function addDoctrineOrmMappingsPass(ContainerBuilder $container): void + { + if (!\class_exists(DoctrineOrmMappingsPass::class)) { + return; + } + + $container->addCompilerPass( + DoctrineOrmMappingsPass::createAnnotationMappingDriver( + ['RichId\TermsModuleBundle\Domain\Entity'], + [__DIR__ . '/../Domain/Entity'] + ) + ); + } +} diff --git a/src/Infrastructure/SecurityVoter/TermsGuardVoter.php b/src/Infrastructure/SecurityVoter/TermsGuardVoter.php new file mode 100644 index 0000000..07bb216 --- /dev/null +++ b/src/Infrastructure/SecurityVoter/TermsGuardVoter.php @@ -0,0 +1,51 @@ + */ + protected $guards; + + /** @param array $guards */ + public function setGuards(array $guards): void + { + $this->guards = $guards; + } + + protected function supports($attribute, $subject): bool + { + return $subject instanceof TermsGuardValidationInterface && $attribute === self::MODULE_TERMS_GUARD_VALID; + } + + protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool + { + $guard = $this->findGuard($subject); + + if ($guard === null) { + return true; + } + + return $guard->check($subject->getTermsSlug(), $subject->getTermsSubjectType(), $subject->getTermsSubjectIdentifier()); + } + + protected function findGuard(TermsGuardValidationInterface $subject): ?TermsGuardInterface + { + foreach ($this->guards as $guard) { + if ($guard->supports($subject->getTermsSlug(), $subject->getTermsSubjectType(), $subject->getTermsSubjectIdentifier())) { + return $guard; + } + } + + return null; + } +} diff --git a/src/Infrastructure/SecurityVoter/UserVoter.php b/src/Infrastructure/SecurityVoter/UserVoter.php new file mode 100644 index 0000000..0dc4579 --- /dev/null +++ b/src/Infrastructure/SecurityVoter/UserVoter.php @@ -0,0 +1,52 @@ +authorizationChecker = $authorizationChecker; + $this->parameterBag = $parameterBag; + } + + protected function supports($attribute, $subject): bool + { + return $attribute === self::MODULE_TERMS_ADMIN; + } + + protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool + { + $user = $token->getUser(); + + if (!$user instanceof UserInterface) { + return false; + } + + $moduleAdminRoles = $this->parameterBag->get('rich_id_terms_module.admin_roles'); + + foreach ($moduleAdminRoles as $adminRole) { + if ($this->authorizationChecker->isGranted($adminRole, $user)) { + return true; + } + } + + return false; + } +} diff --git a/src/Infrastructure/TwigExtension/TermsExtension.php b/src/Infrastructure/TwigExtension/TermsExtension.php new file mode 100644 index 0000000..766ef50 --- /dev/null +++ b/src/Infrastructure/TwigExtension/TermsExtension.php @@ -0,0 +1,33 @@ +hasSignedTerms = $hasSignedTerms; + } + + public function getFunctions(): array + { + return [ + new TwigFunction('hasSignedTerms', [$this, 'hasSignedTerms']), + ]; + } + + public function hasSignedTerms(string $termsSlug, string $subjectType, string $subjectIdentifier): int + { + return ($this->hasSignedTerms)($termsSlug, DummySubject::create($subjectType, $subjectIdentifier)); + } +} diff --git a/src/Infrastructure/ValidatorConstraints/CantContentChangeIfTermsPublished.php b/src/Infrastructure/ValidatorConstraints/CantContentChangeIfTermsPublished.php new file mode 100644 index 0000000..dbf8c66 --- /dev/null +++ b/src/Infrastructure/ValidatorConstraints/CantContentChangeIfTermsPublished.php @@ -0,0 +1,50 @@ +context = $context; + } + + public function getTargets() + { + return self::CLASS_CONSTRAINT; + } + + public function validate($value, Constraint $constraint): void + { + if (!$value instanceof TermsEdition || !$value->getEntity()->isEnabled()) { + return; + } + + $originalTermsVersion = $value->getEntity(); + + if ($value->getContent() !== $originalTermsVersion->getContent()) { + $this->context->buildViolation(self::MESSAGE) + ->atPath('content') + ->setTranslationDomain('terms_module_validation') + ->addViolation(); + } + } + + public function validatedBy(): string + { + return self::class; + } +} diff --git a/src/Infrastructure/ValidatorConstraints/CantEnableVersionIfAlreadyEnabled.php b/src/Infrastructure/ValidatorConstraints/CantEnableVersionIfAlreadyEnabled.php new file mode 100644 index 0000000..26a1e8e --- /dev/null +++ b/src/Infrastructure/ValidatorConstraints/CantEnableVersionIfAlreadyEnabled.php @@ -0,0 +1,50 @@ +context = $context; + } + + public function getTargets() + { + return self::CLASS_CONSTRAINT; + } + + public function validate($value, Constraint $constraint): void + { + if (!$value instanceof TermsEdition) { + return; + } + + $originalTermsVersion = $value->getEntity(); + + if ($originalTermsVersion->isEnabled() && $value->needVersionActivation()) { + $this->context->buildViolation(self::MESSAGE) + ->atPath('needVersionActivation') + ->setTranslationDomain('terms_module_validation') + ->addViolation(); + } + } + + public function validatedBy(): string + { + return self::class; + } +} diff --git a/src/Infrastructure/ValidatorConstraints/CantPublicationDateChangeIfTermsPublished.php b/src/Infrastructure/ValidatorConstraints/CantPublicationDateChangeIfTermsPublished.php new file mode 100644 index 0000000..a5700eb --- /dev/null +++ b/src/Infrastructure/ValidatorConstraints/CantPublicationDateChangeIfTermsPublished.php @@ -0,0 +1,50 @@ +context = $context; + } + + public function getTargets() + { + return self::CLASS_CONSTRAINT; + } + + public function validate($value, Constraint $constraint): void + { + if (!$value instanceof TermsEdition || !$value->getEntity()->isEnabled()) { + return; + } + + $originalTermsVersion = $value->getEntity(); + + if ($value->getPublicationDate() !== $originalTermsVersion->getPublicationDate()) { + $this->context->buildViolation(self::MESSAGE) + ->atPath('publicationDate') + ->setTranslationDomain('terms_module_validation') + ->addViolation(); + } + } + + public function validatedBy(): string + { + return self::class; + } +} diff --git a/src/Infrastructure/ValidatorConstraints/CantTitleChangeIfTermsPublished.php b/src/Infrastructure/ValidatorConstraints/CantTitleChangeIfTermsPublished.php new file mode 100644 index 0000000..f809699 --- /dev/null +++ b/src/Infrastructure/ValidatorConstraints/CantTitleChangeIfTermsPublished.php @@ -0,0 +1,50 @@ +context = $context; + } + + public function getTargets() + { + return self::CLASS_CONSTRAINT; + } + + public function validate($value, Constraint $constraint): void + { + if (!$value instanceof TermsEdition || !$value->getEntity()->isEnabled()) { + return; + } + + $originalTermsVersion = $value->getEntity(); + + if ($value->getTitle() !== $originalTermsVersion->getTitle()) { + $this->context->buildViolation(self::MESSAGE) + ->atPath('title') + ->setTranslationDomain('terms_module_validation') + ->addViolation(); + } + } + + public function validatedBy(): string + { + return self::class; + } +} diff --git a/src/Infrastructure/ValidatorConstraints/CantUnpublishLockedPublishedTerms.php b/src/Infrastructure/ValidatorConstraints/CantUnpublishLockedPublishedTerms.php new file mode 100644 index 0000000..17971dd --- /dev/null +++ b/src/Infrastructure/ValidatorConstraints/CantUnpublishLockedPublishedTerms.php @@ -0,0 +1,51 @@ +context = $context; + } + + public function getTargets() + { + return self::CLASS_CONSTRAINT; + } + + public function validate($value, Constraint $constraint): void + { + if (!$value instanceof TermsEdition || $value->isTermsPublished()) { + return; + } + + $originalTermsVersion = $value->getEntity(); + $originalTerms = $originalTermsVersion->getTerms(); + + if ($originalTerms->isPublished() && $originalTerms->isDepublicationLocked()) { + $this->context->buildViolation(self::MESSAGE) + ->atPath('isTermsPublished') + ->setTranslationDomain('terms_module_validation') + ->addViolation(); + } + } + + public function validatedBy(): string + { + return self::class; + } +} diff --git a/src/Resources/services.xml b/src/Resources/services.xml deleted file mode 100644 index 644158b..0000000 --- a/src/Resources/services.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/src/RichIdTermsModuleBundle.php b/src/RichIdTermsModuleBundle.php deleted file mode 100644 index ce0558f..0000000 --- a/src/RichIdTermsModuleBundle.php +++ /dev/null @@ -1,12 +0,0 @@ -createTermsVersion = $createTermsVersion; + $this->termsVersionRepository = $termsVersionRepository; + $this->requestStack = $requestStack; + $this->parameterBag = $parameterBag; + } + + /** @return string[] */ + protected function getAdminRoles(): array + { + return $this->parameterBag->get('rich_id_terms_module.admin_roles'); + } + + public function __invoke(Terms $terms): Response + { + if (!$this->isGranted(UserVoter::MODULE_TERMS_ADMIN)) { + throw $this->buildAccessDeniedException(); + } + + $currentVersion = $this->getTermsVersion($terms); + + if ($currentVersion === null) { + return JsonResponse::create('The terms has no version.', Response::HTTP_UNAUTHORIZED); + } + + try { + ($this->createTermsVersion)($currentVersion); + + return JsonResponse::create(null, Response::HTTP_CREATED); + } catch (CannotAddVersionToTermsException $e) { + return JsonResponse::create($e->getMessage(), Response::HTTP_UNAUTHORIZED); + } + } + + private function getTermsVersion(Terms $terms): ?TermsVersion + { + $request = $this->requestStack->getCurrentRequest() ?? new Request(); + $version = $request->query->get('version'); + + if ($version !== null && $version !== '') { + $termsVersion = $this->termsVersionRepository->findOneByTermsAndVersion( + $terms->getSlug() ?? '', + (int) $version + ); + + if ($termsVersion !== null) { + return $termsVersion; + } + + throw new NotFoundHttpException(\sprintf('No terms version found with version %s', $version)); + } + + return $terms->getLatestVersion(); + } +} diff --git a/src/UserInterface/Controller/AdminRouteTrait.php b/src/UserInterface/Controller/AdminRouteTrait.php new file mode 100644 index 0000000..00d3dd8 --- /dev/null +++ b/src/UserInterface/Controller/AdminRouteTrait.php @@ -0,0 +1,38 @@ +getAdminRoles(); + + if (empty($roles)) { + return new AccessDeniedException('You must define one or more roles in the configuration.'); + } + + if (\count($roles) === 1) { + return new AccessDeniedException( + \sprintf( + 'Only the "%s" role is allowed to access the back office.', + $roles[0] + ) + ); + } + + return new AccessDeniedException( + \sprintf( + 'Only the "%s" roles are allowed to access the back office.', + \implode(', ', $roles) + ) + ); + } +} diff --git a/src/UserInterface/Controller/EditAdminRoute.php b/src/UserInterface/Controller/EditAdminRoute.php new file mode 100644 index 0000000..595210d --- /dev/null +++ b/src/UserInterface/Controller/EditAdminRoute.php @@ -0,0 +1,142 @@ +editTerms = $editTerms; + $this->defaultTermsVersionFactory = $defaultTermsVersionFactory; + $this->termsVersionRepository = $termsVersionRepository; + $this->entityManager = $entityManager; + $this->requestStack = $requestStack; + $this->parameterBag = $parameterBag; + } + + /** @return string[] */ + protected function getAdminRoles(): array + { + return $this->parameterBag->get('rich_id_terms_module.admin_roles'); + } + + public function __invoke(Terms $terms): Response + { + if (!$this->isGranted(UserVoter::MODULE_TERMS_ADMIN)) { + throw $this->buildAccessDeniedException(); + } + + $request = $this->requestStack->getCurrentRequest() ?? new Request(); + $currentTermsVersion = $this->getTermsVersion($terms); + + $model = new TermsEdition($currentTermsVersion); + + $form = $this->createForm( + TermsVersionFormType::class, + $model, + [TermsVersionFormType::TERMS_VERSION_ENTITY => $currentTermsVersion] + )->handleRequest($request); + + if ($request->getMethod() === Request::METHOD_POST && $form->isSubmitted() && $form->isValid()) { + ($this->editTerms)($form->getData()); + $this->entityManager->flush(); + + return $this->getSubmissionRedirection($terms, $currentTermsVersion); + } + + $lastTermsVersion = $terms->getLatestVersion() ?? ($this->defaultTermsVersionFactory)($terms); + + return $this->render( + '@RichIdTermsModule/admin/edit/main.html.twig', + [ + 'terms' => $terms, + 'currentTermsVersion' => $currentTermsVersion, + 'lastTermsVersion' => $lastTermsVersion, + 'form' => $form->createView(), + ] + ); + } + + private function getTermsVersion(Terms $terms): TermsVersion + { + $request = $this->requestStack->getCurrentRequest() ?? new Request(); + $version = $request->query->get('version'); + + if ($version !== null && $version !== '') { + $termsVersion = $this->termsVersionRepository->findOneByTermsAndVersion( + $terms->getSlug() ?? '', + (int) $version + ); + + if ($termsVersion !== null) { + return $termsVersion; + } + + throw new NotFoundHttpException(\sprintf('No terms version found with version %s', $version)); + } + + return $terms->getLatestVersion() ?? ($this->defaultTermsVersionFactory)($terms); + } + + private function getSubmissionRedirection(Terms $terms, TermsVersion $termsVersion): RedirectResponse + { + $request = $this->requestStack->getCurrentRequest() ?? new Request(); + $exit = $request->query->has('exit'); + $hasSpecificVersion = $request->query->has('version'); + + if ($exit) { + return $this->redirectToRoute('module_terms_admin_list'); + } + + if ($hasSpecificVersion) { + return $this->redirectToRoute('module_terms_admin_edition', ['terms' => $terms->getId(), 'version' => $termsVersion->getVersion()]); + } + + return $this->redirectToRoute('module_terms_admin_edition', ['terms' => $terms->getId()]); + } +} diff --git a/src/UserInterface/Controller/ListAdminRoute.php b/src/UserInterface/Controller/ListAdminRoute.php new file mode 100644 index 0000000..fc9ef40 --- /dev/null +++ b/src/UserInterface/Controller/ListAdminRoute.php @@ -0,0 +1,48 @@ +termsRepository = $termsRepository; + $this->parameterBag = $parameterBag; + } + + /** @return string[] */ + protected function getAdminRoles(): array + { + return $this->parameterBag->get('rich_id_terms_module.admin_roles'); + } + + public function __invoke(): Response + { + if (!$this->isGranted(UserVoter::MODULE_TERMS_ADMIN)) { + throw $this->buildAccessDeniedException(); + } + + return $this->render( + '@RichIdTermsModule/admin/list/main.html.twig', + [ + 'termsList' => $this->termsRepository->findAllOrderedByName(), + ] + ); + } +} diff --git a/src/UserInterface/Controller/RemoveTermsVersionRoute.php b/src/UserInterface/Controller/RemoveTermsVersionRoute.php new file mode 100644 index 0000000..a69368d --- /dev/null +++ b/src/UserInterface/Controller/RemoveTermsVersionRoute.php @@ -0,0 +1,53 @@ +removeTermsVersion = $removeTermsVersion; + $this->parameterBag = $parameterBag; + } + + /** @return string[] */ + protected function getAdminRoles(): array + { + return $this->parameterBag->get('rich_id_terms_module.admin_roles'); + } + + public function __invoke(TermsVersion $termsVersion): Response + { + if (!$this->isGranted(UserVoter::MODULE_TERMS_ADMIN)) { + throw $this->buildAccessDeniedException(); + } + + try { + ($this->removeTermsVersion)($termsVersion); + + return JsonResponse::create(null, Response::HTTP_OK); + } catch (EnabledVersionCannotBeDeletedException | FirstVersionCannotBeDeletedException $e) { + return JsonResponse::create($e->getMessage(), Response::HTTP_UNAUTHORIZED); + } + } +} diff --git a/src/UserInterface/Controller/SignRoute.php b/src/UserInterface/Controller/SignRoute.php new file mode 100644 index 0000000..d085378 --- /dev/null +++ b/src/UserInterface/Controller/SignRoute.php @@ -0,0 +1,103 @@ +getTermsVersionToSign = $getTermsVersionToSign; + $this->signTerms = $signTerms; + $this->requestStack = $requestStack; + } + + public function __invoke(string $termsSlug): Response + { + $request = $this->requestStack->getCurrentRequest() ?? new Request(); + $subject = $this->getSubject($request); + $termsGuardValidation = DummyTermsGuardValidation::create($termsSlug, $subject->getTermsSubjectType(), $subject->getTermsSubjectIdentifier()); + + if (!$this->isGranted(TermsGuardVoter::MODULE_TERMS_GUARD_VALID, $termsGuardValidation)) { + throw new AccessDeniedException(); + } + + try { + $lastVersion = ($this->getTermsVersionToSign)($termsSlug, $subject); + $terms = $lastVersion->getTerms(); + + if ($request->getMethod() === Request::METHOD_POST) { + $accepted = $this->getIsAcceptedFromRequest($request); + + return ($this->signTerms)($termsSlug, $subject, $accepted); + } + + return $this->render( + '@RichIdTermsModule/sign/main.html.twig', + [ + 'terms' => $terms, + 'lastTermsVersion' => $lastVersion, + 'subject' => $subject, + ] + ); + } catch (NotFoundTermsException | NotPublishedTermsException | TermsHasNoPublishedVersionException $e) { + throw new NotFoundHttpException($e->getMessage()); + } catch (AlreadySignLastTermsVersionException $e) { + throw new AccessDeniedException('You have already signed this terms.'); + } + } + + protected function getSubject(Request $request): TermsSubjectInterface + { + $subjectType = $request->query->get('type', null); + $subjectIdentifier = $request->query->get('identifier', null); + + if ($subjectType === null || $subjectType === '') { + throw new BadRequestHttpException('Query parameter type is missing.'); + } + + if ($subjectIdentifier === null || $subjectIdentifier === '') { + throw new BadRequestHttpException('Query parameter identifier is missing.'); + } + + return DummySubject::create($subjectType, $subjectIdentifier); + } + + protected function getIsAcceptedFromRequest(Request $request): ?bool + { + $accepted = $request->request->get('accepted'); + + return $accepted !== '' ? (bool) $accepted : null; + } +} diff --git a/tests/Domain/Entity/TermsTest.php b/tests/Domain/Entity/TermsTest.php new file mode 100644 index 0000000..a5a8e49 --- /dev/null +++ b/tests/Domain/Entity/TermsTest.php @@ -0,0 +1,206 @@ +assertFalse($entity->isPublished()); + $this->assertFalse($entity->isDepublicationLocked()); + + $this->assertInstanceOf(ArrayCollection::class, $entity->getVersions()); + $this->assertEmpty($entity->getVersions()); + } + + public function testSlugUnique(): void + { + $entity1 = new Terms(); + $entity1->setSlug('slug'); + $entity1->setName('My Terms'); + + $this->getManager()->persist($entity1); + $this->getManager()->flush(); + + $this->expectException(UniqueConstraintViolationException::class); + + $entity2 = new Terms(); + $entity2->setSlug('slug'); + $entity2->setName('My other Terms'); + + $this->getManager()->persist($entity2); + $this->getManager()->flush(); + } + + public function testNameUnique(): void + { + $entity1 = new Terms(); + $entity1->setSlug('slug1'); + $entity1->setName('My Terms'); + + $this->getManager()->persist($entity1); + $this->getManager()->flush(); + + $this->expectException(UniqueConstraintViolationException::class); + + $entity2 = new Terms(); + $entity2->setSlug('slug2'); + $entity2->setName('My Terms'); + + $this->getManager()->persist($entity2); + $this->getManager()->flush(); + } + + public function testEntity(): void + { + $entity = new Terms(); + $termVersion = new TermsVersion(); + + $entity->setSlug('terms-slug'); + $entity->setName('My Terms'); + $entity->setIsPublished(true); + $entity->setIsDepublicationLocked(true); + $entity->addVersion($termVersion); + + $this->assertNull($entity->getId()); + $this->assertSame('terms-slug', $entity->getSlug()); + $this->assertSame('My Terms', $entity->getName()); + $this->assertTrue($entity->isPublished()); + $this->assertTrue($entity->isDepublicationLocked()); + + $this->assertCount(1, $entity->getVersions()); + $this->assertSame($termVersion, $entity->getVersions()->first()); + + $entity->removeVersion($termVersion); + $this->assertEmpty($entity->getVersions()); + } + + public function testGetLatestVersionWithoutVersion(): void + { + $entity = new Terms(); + $this->assertNull($entity->getLatestVersion()); + } + + public function testGetLatestVersion(): void + { + $entity = new Terms(); + $termVersion1 = new TermsVersion(); + $termVersion2 = new TermsVersion(); + + $entity->addVersion($termVersion2); + $termVersion1->enable(); + $entity->addVersion($termVersion1); + + $termVersion1->setVersion(1); + $termVersion2->setVersion(2); + + $this->assertSame($termVersion2, $entity->getLatestVersion()); + } + + public function testGetLatestPublishedVersionWithoutVersion(): void + { + $entity = new Terms(); + $this->assertNull($entity->getLatestPublishedVersion()); + } + + public function testGetLatestPublishedVersionAllVersionDisabled(): void + { + $entity = new Terms(); + $termVersion1 = new TermsVersion(); + $termVersion2 = new TermsVersion(); + + $entity->addVersion($termVersion2); + $entity->addVersion($termVersion1); + + $termVersion1->setVersion(1); + $termVersion2->setVersion(2); + + $this->assertNull($entity->getLatestPublishedVersion()); + } + + public function testGetLatestPublishedVersionOneVersionEnabled(): void + { + $entity = new Terms(); + $termVersion1 = new TermsVersion(); + $termVersion2 = new TermsVersion(); + + $entity->addVersion($termVersion2); + $entity->addVersion($termVersion1); + + $termVersion1->setVersion(1); + $termVersion2->setVersion(2); + + $termVersion1->enable(); + + $this->assertSame($termVersion1, $entity->getLatestPublishedVersion()); + } + + public function testGetLatestPublishedVersionOneVersionEnabledButNotPublished(): void + { + $entity = new Terms(); + $termVersion1 = new TermsVersion(); + $termVersion2 = new TermsVersion(); + + $entity->addVersion($termVersion2); + $entity->addVersion($termVersion1); + + $termVersion1->setVersion(1); + $termVersion2->setVersion(2); + + $termVersion1->enable(); + $termVersion1->setPublicationDate(new \DateTime('today midnight + 1 day')); + + $this->assertNull($entity->getLatestPublishedVersion()); + } + + public function testGetLatestPublishedVersionOneVersionEnabledAndPublished(): void + { + $entity = new Terms(); + $termVersion1 = new TermsVersion(); + $termVersion2 = new TermsVersion(); + + $entity->addVersion($termVersion2); + $entity->addVersion($termVersion1); + + $termVersion1->setVersion(1); + $termVersion2->setVersion(2); + + $termVersion1->enable(); + $termVersion1->setPublicationDate(new \DateTime('today midnight')); + + $this->assertSame($termVersion1, $entity->getLatestPublishedVersion()); + } + + public function testGetLatestPublishedVersionOrderedByVersion(): void + { + $entity = new Terms(); + $termVersion1 = new TermsVersion(); + $termVersion2 = new TermsVersion(); + + $entity->addVersion($termVersion2); + $entity->addVersion($termVersion1); + + $termVersion1->setVersion(1); + $termVersion1->enable(); + + $termVersion2->setVersion(2); + $termVersion2->enable(); + + $this->assertSame($termVersion2, $entity->getLatestPublishedVersion()); + } +} diff --git a/tests/Domain/Entity/TermsVersionSignatureTest.php b/tests/Domain/Entity/TermsVersionSignatureTest.php new file mode 100644 index 0000000..289d770 --- /dev/null +++ b/tests/Domain/Entity/TermsVersionSignatureTest.php @@ -0,0 +1,76 @@ +setVersion($termsVersion); + $entity->setSubjectType('user'); + $entity->setSubjectIdentifier('42'); + $entity->setDate($date); + + $this->assertNull($entity->getId()); + $this->assertSame($termsVersion, $entity->getVersion()); + $this->assertSame('user', $entity->getSubjectType()); + $this->assertSame('42', $entity->getSubjectIdentifier()); + $this->assertSame($date, $entity->getDate()); + } + + public function testSignatureUniqueForTermsVersionAndSubject(): void + { + $terms = new Terms(); + $terms->setSlug('slug'); + $terms->setName('My Terms'); + + $this->getManager()->persist($terms); + $this->getManager()->flush(); + + $termsVersion = new TermsVersion(); + $termsVersion->setVersion(1); + $termsVersion->setTerms($terms); + $termsVersion->setTitle('title'); + $termsVersion->setContent('content'); + + $this->getManager()->persist($termsVersion); + $this->getManager()->flush(); + + $entity1 = new TermsVersionSignature(); + $entity1->setVersion($termsVersion); + $entity1->setSubjectType('user'); + $entity1->setSubjectIdentifier('42'); + $entity1->setDate(new \DateTime()); + + $this->getManager()->persist($entity1); + $this->getManager()->flush(); + + $this->expectException(UniqueConstraintViolationException::class); + + $entity2 = new TermsVersionSignature(); + $entity2->setVersion($termsVersion); + $entity2->setSubjectType('user'); + $entity2->setSubjectIdentifier('42'); + $entity2->setDate(new \DateTime()); + + $this->getManager()->persist($entity2); + $this->getManager()->flush(); + } +} diff --git a/tests/Domain/Entity/TermsVersionTest.php b/tests/Domain/Entity/TermsVersionTest.php new file mode 100644 index 0000000..70d38e1 --- /dev/null +++ b/tests/Domain/Entity/TermsVersionTest.php @@ -0,0 +1,90 @@ +assertFalse($entity->isEnabled()); + + $this->assertInstanceOf(ArrayCollection::class, $entity->getSignatures()); + $this->assertEmpty($entity->getSignatures()); + } + + public function testVersionUniqueForTerms(): void + { + $terms = new Terms(); + $terms->setSlug('slug'); + $terms->setName('My Terms'); + + $this->getManager()->persist($terms); + $this->getManager()->flush(); + + $entity1 = new TermsVersion(); + $entity1->setVersion(1); + $entity1->setTerms($terms); + $entity1->setTitle('title'); + $entity1->setContent('content'); + + $this->getManager()->persist($entity1); + $this->getManager()->flush(); + + $this->expectException(UniqueConstraintViolationException::class); + + $entity2 = new TermsVersion(); + $entity2->setVersion(1); + $entity2->setTerms($terms); + $entity2->setTitle('title'); + $entity2->setContent('content'); + + $this->getManager()->persist($entity2); + $this->getManager()->flush(); + } + + public function testEntity(): void + { + $entity = new TermsVersion(); + $terms = new Terms(); + $signature = new TermsVersionSignature(); + $date = new \DateTime(); + + $entity->setVersion(1); + $entity->enable(); + $entity->setTitle('title'); + $entity->setContent('content'); + $entity->setPublicationDate($date); + $entity->setTerms($terms); + $entity->addSignature($signature); + + $this->assertNull($entity->getId()); + $this->assertSame(1, $entity->getVersion()); + $this->assertTrue($entity->isEnabled()); + $this->assertSame('title', $entity->getTitle()); + $this->assertSame('content', $entity->getContent()); + $this->assertSame($date, $entity->getPublicationDate()); + $this->assertSame($terms, $entity->getTerms()); + + $this->assertCount(1, $entity->getSignatures()); + $this->assertSame($signature, $entity->getSignatures()->first()); + + $entity->removeSignature($signature); + $this->assertEmpty($entity->getSignatures()); + } +} diff --git a/tests/Domain/Event/TermsSignedEventTest.php b/tests/Domain/Event/TermsSignedEventTest.php new file mode 100644 index 0000000..4e0a45c --- /dev/null +++ b/tests/Domain/Event/TermsSignedEventTest.php @@ -0,0 +1,37 @@ +assertSame($termsVersion, $event->getTermsVersion()); + $this->assertSame($subject, $event->getSubject()); + $this->assertTrue($event->isAccepted()); + $this->assertSame($response, $event->getResponse()); + + $otherResponse = new Response(); + $event->setResponse($otherResponse); + $this->assertSame($otherResponse, $event->getResponse()); + } +} diff --git a/tests/Domain/Event/TermsVersionCreatedEventTest.php b/tests/Domain/Event/TermsVersionCreatedEventTest.php new file mode 100644 index 0000000..d27fc39 --- /dev/null +++ b/tests/Domain/Event/TermsVersionCreatedEventTest.php @@ -0,0 +1,25 @@ +assertSame($termsVersion, $event->getTermsVersion()); + } +} diff --git a/tests/Domain/Event/TermsVersionDeletedEventTest.php b/tests/Domain/Event/TermsVersionDeletedEventTest.php new file mode 100644 index 0000000..0dcfffc --- /dev/null +++ b/tests/Domain/Event/TermsVersionDeletedEventTest.php @@ -0,0 +1,25 @@ +assertSame($termsVersion, $event->getTermsVersion()); + } +} diff --git a/tests/Domain/Event/TermsVersionEnabledEventTest.php b/tests/Domain/Event/TermsVersionEnabledEventTest.php new file mode 100644 index 0000000..df60eff --- /dev/null +++ b/tests/Domain/Event/TermsVersionEnabledEventTest.php @@ -0,0 +1,25 @@ +assertSame($termsVersion, $event->getTermsVersion()); + } +} diff --git a/tests/Domain/Event/TermsVersionUpdatedEventTest.php b/tests/Domain/Event/TermsVersionUpdatedEventTest.php new file mode 100644 index 0000000..70b65e7 --- /dev/null +++ b/tests/Domain/Event/TermsVersionUpdatedEventTest.php @@ -0,0 +1,25 @@ +assertSame($termsVersion, $event->getTermsVersion()); + } +} diff --git a/tests/Domain/EventListener/AutopublishFirstTermsVersionEventListenerTest.php b/tests/Domain/EventListener/AutopublishFirstTermsVersionEventListenerTest.php new file mode 100644 index 0000000..c8b0c26 --- /dev/null +++ b/tests/Domain/EventListener/AutopublishFirstTermsVersionEventListenerTest.php @@ -0,0 +1,110 @@ +setName('Terms'); + $terms->setSlug('my_terms'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $terms->addVersion($termsVersion); + + $event = new TermsVersionUpdatedEvent($termsVersion); + + ($this->listener)($event); + + $this->assertFalse($termsVersion->isEnabled()); + $this->assertNull($termsVersion->getPublicationDate()); + $this->assertEmpty($this->entityManagerStub->getPersistedEntities()); + } + + public function testListenerWithMultipleVersion(): void + { + $terms = new Terms(); + $terms->setName('Terms'); + $terms->setSlug('my_terms'); + $terms->setIsPublished(true); + + $termsVersion1 = new TermsVersion(); + $termsVersion1->setTerms($terms); + $terms->addVersion($termsVersion1); + + $termsVersion2 = new TermsVersion(); + $termsVersion2->setTerms($terms); + $terms->addVersion($termsVersion2); + + $event = new TermsVersionUpdatedEvent($termsVersion2); + + ($this->listener)($event); + + $this->assertFalse($termsVersion2->isEnabled()); + $this->assertNull($termsVersion2->getPublicationDate()); + $this->assertEmpty($this->entityManagerStub->getPersistedEntities()); + } + + public function testListenerAlreadyEnabledVersion(): void + { + $terms = new Terms(); + $terms->setName('Terms'); + $terms->setSlug('my_terms'); + $terms->setIsPublished(true); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->enable(); + $terms->addVersion($termsVersion); + + $event = new TermsVersionUpdatedEvent($termsVersion); + + ($this->listener)($event); + + $this->assertTrue($termsVersion->isEnabled()); + $this->assertNull($termsVersion->getPublicationDate()); + $this->assertEmpty($this->entityManagerStub->getPersistedEntities()); + } + + public function testListenerActivateVersion(): void + { + $terms = $this->getReference(Terms::class, '3'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(1); + $termsVersion->setTitle('Title'); + $termsVersion->setContent('Content'); + $terms->addVersion($termsVersion); + + $event = new TermsVersionUpdatedEvent($termsVersion); + + ($this->listener)($event); + + $this->assertTrue($termsVersion->isEnabled()); + $this->assertInstanceOf(\DateTime::class, $termsVersion->getPublicationDate()); + $this->assertCount(2, $this->entityManagerStub->getPersistedEntities()); + } +} diff --git a/tests/Domain/EventListener/LogSignedTermsEventListenerTest.php b/tests/Domain/EventListener/LogSignedTermsEventListenerTest.php new file mode 100644 index 0000000..5d2de9e --- /dev/null +++ b/tests/Domain/EventListener/LogSignedTermsEventListenerTest.php @@ -0,0 +1,53 @@ +getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + $response = new Response(); + $subject = DummySubject::create('user', '42'); + + $event = new TermsSignedEvent($termsVersion, $subject, true, $response); + + ($this->listener)($event); + + $this->assertSame($response, $event->getResponse()); + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I agree.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + } +} diff --git a/tests/Domain/EventListener/SetTermsVersionPublicationMetadataEventListenerTest.php b/tests/Domain/EventListener/SetTermsVersionPublicationMetadataEventListenerTest.php new file mode 100644 index 0000000..08be18d --- /dev/null +++ b/tests/Domain/EventListener/SetTermsVersionPublicationMetadataEventListenerTest.php @@ -0,0 +1,59 @@ +setPublicationDate($date); + + $event = new TermsVersionEnabledEvent($termsVersion); + + ($this->listener)($event); + + $this->assertSame($date, $termsVersion->getPublicationDate()); + $this->assertEmpty($this->entityManagerStub->getPersistedEntities()); + } + + public function testListenerWithoutExistingPublicationDate(): void + { + $terms = $this->getReference(Terms::class, '1'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(42); + $termsVersion->setTitle('Title'); + $termsVersion->setContent('Content'); + + $event = new TermsVersionEnabledEvent($termsVersion); + + ($this->listener)($event); + + $this->assertInstanceOf(\DateTime::class, $termsVersion->getPublicationDate()); + $this->assertCount(1, $this->entityManagerStub->getPersistedEntities()); + } +} diff --git a/tests/Domain/Exception/AlreadyEnabledTermsVersionExceptionTest.php b/tests/Domain/Exception/AlreadyEnabledTermsVersionExceptionTest.php new file mode 100644 index 0000000..53fa941 --- /dev/null +++ b/tests/Domain/Exception/AlreadyEnabledTermsVersionExceptionTest.php @@ -0,0 +1,28 @@ +getReference(TermsVersion::class, 'v1-terms-1'); + $exception = new AlreadyEnabledTermsVersionException($termsVersion); + + $this->assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame($termsVersion, $exception->getTermsVersion()); + $this->assertSame('Version 1 of terms terms-1 is already enabled.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Exception/AlreadySignLastTermsVersionExceptionTest.php b/tests/Domain/Exception/AlreadySignLastTermsVersionExceptionTest.php new file mode 100644 index 0000000..038e3d1 --- /dev/null +++ b/tests/Domain/Exception/AlreadySignLastTermsVersionExceptionTest.php @@ -0,0 +1,27 @@ +assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame('terms-1', $exception->getTermsSlug()); + $this->assertSame($subject, $exception->getSubject()); + $this->assertSame('Terms terms-1 is already sign by this subject.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Exception/CannotAddVersionToTermsExceptionTest.php b/tests/Domain/Exception/CannotAddVersionToTermsExceptionTest.php new file mode 100644 index 0000000..a13305f --- /dev/null +++ b/tests/Domain/Exception/CannotAddVersionToTermsExceptionTest.php @@ -0,0 +1,28 @@ +getReference(Terms::class, '1'); + $exception = new CannotAddVersionToTermsException($terms); + + $this->assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame($terms, $exception->getTerms()); + $this->assertSame('Cannot add new version to the terms terms-1.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Exception/EnabledVersionCannotBeDeletedExceptionTest.php b/tests/Domain/Exception/EnabledVersionCannotBeDeletedExceptionTest.php new file mode 100644 index 0000000..d8d852d --- /dev/null +++ b/tests/Domain/Exception/EnabledVersionCannotBeDeletedExceptionTest.php @@ -0,0 +1,28 @@ +getReference(TermsVersion::class, 'v1-terms-1'); + $exception = new EnabledVersionCannotBeDeletedException($termsVersion); + + $this->assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame($termsVersion, $exception->getTermsVersion()); + $this->assertSame('Version 1 of terms terms-1 cannot be deleted.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Exception/FirstVersionCannotBeDeletedExceptionTest.php b/tests/Domain/Exception/FirstVersionCannotBeDeletedExceptionTest.php new file mode 100644 index 0000000..d122426 --- /dev/null +++ b/tests/Domain/Exception/FirstVersionCannotBeDeletedExceptionTest.php @@ -0,0 +1,28 @@ +getReference(TermsVersion::class, 'v1-terms-1'); + $exception = new FirstVersionCannotBeDeletedException($termsVersion); + + $this->assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame($termsVersion, $exception->getTermsVersion()); + $this->assertSame('First version of terms terms-1 cannot be deleted.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Exception/InvalidTermsEditionExceptionTest.php b/tests/Domain/Exception/InvalidTermsEditionExceptionTest.php new file mode 100644 index 0000000..b3b1f80 --- /dev/null +++ b/tests/Domain/Exception/InvalidTermsEditionExceptionTest.php @@ -0,0 +1,28 @@ +assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame($violations, $exception->getViolations()); + $this->assertSame('Invalid model TermsEdition.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Exception/InvalidValueExceptionTest.php b/tests/Domain/Exception/InvalidValueExceptionTest.php new file mode 100644 index 0000000..f931b95 --- /dev/null +++ b/tests/Domain/Exception/InvalidValueExceptionTest.php @@ -0,0 +1,24 @@ +assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame('title', $exception->getPropertyPath()); + $this->assertSame('invalid', $exception->getValue()); + } +} diff --git a/tests/Domain/Exception/NotFoundTermsExceptionTest.php b/tests/Domain/Exception/NotFoundTermsExceptionTest.php new file mode 100644 index 0000000..bf68ff2 --- /dev/null +++ b/tests/Domain/Exception/NotFoundTermsExceptionTest.php @@ -0,0 +1,24 @@ +assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame('terms-1', $exception->getTermsSlug()); + $this->assertSame('Not found terms terms-1.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Exception/NotPublishedTermsExceptionTest.php b/tests/Domain/Exception/NotPublishedTermsExceptionTest.php new file mode 100644 index 0000000..e8b8a15 --- /dev/null +++ b/tests/Domain/Exception/NotPublishedTermsExceptionTest.php @@ -0,0 +1,24 @@ +assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame('terms-1', $exception->getTermsSlug()); + $this->assertSame('Terms terms-1 is not published.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Exception/SubjectNeedToSignTermsExceptionTest.php b/tests/Domain/Exception/SubjectNeedToSignTermsExceptionTest.php new file mode 100644 index 0000000..36205fb --- /dev/null +++ b/tests/Domain/Exception/SubjectNeedToSignTermsExceptionTest.php @@ -0,0 +1,26 @@ +assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame('terms-1', $exception->getTermsSlug()); + $this->assertSame($subject, $exception->getSubject()); + } +} diff --git a/tests/Domain/Exception/TermsHasNoPublishedVersionExceptionTest.php b/tests/Domain/Exception/TermsHasNoPublishedVersionExceptionTest.php new file mode 100644 index 0000000..c6b740e --- /dev/null +++ b/tests/Domain/Exception/TermsHasNoPublishedVersionExceptionTest.php @@ -0,0 +1,28 @@ +getReference(Terms::class, '1'); + $exception = new TermsHasNoPublishedVersionException($terms); + + $this->assertInstanceOf(TermsModuleException::class, $exception); + $this->assertSame($terms, $exception->getTerms()); + $this->assertSame('Terms terms-1 hasn\'t published version.', $exception->getMessage()); + } +} diff --git a/tests/Domain/Factory/DefaultTermsVersionFactoryTest.php b/tests/Domain/Factory/DefaultTermsVersionFactoryTest.php new file mode 100644 index 0000000..c640725 --- /dev/null +++ b/tests/Domain/Factory/DefaultTermsVersionFactoryTest.php @@ -0,0 +1,36 @@ +factory)($terms); + + $this->assertNull($entity->getId()); + $this->assertSame($terms, $entity->getTerms()); + $this->assertSame(1, $entity->getVersion()); + $this->assertFalse($entity->isEnabled()); + $this->assertNull($entity->getTitle()); + $this->assertNull($entity->getContent()); + $this->assertNull($entity->getPublicationDate()); + $this->assertEmpty($entity->getSignatures()); + } +} diff --git a/tests/Domain/Factory/DuplicateTermsVersionFactoryTest.php b/tests/Domain/Factory/DuplicateTermsVersionFactoryTest.php new file mode 100644 index 0000000..0f32485 --- /dev/null +++ b/tests/Domain/Factory/DuplicateTermsVersionFactoryTest.php @@ -0,0 +1,59 @@ +expectException(InvalidValueException::class); + + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + $termsVersion->setTitle(''); + + ($this->factory)($termsVersion); + } + + public function testFactoryWithBadContent(): void + { + $this->expectException(InvalidValueException::class); + + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + $termsVersion->setContent(''); + + ($this->factory)($termsVersion); + } + + public function testFactory(): void + { + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + $this->assertSame(3, $termsVersion->getVersion()); + + $entity = ($this->factory)($termsVersion); + + $this->assertNull($entity->getId()); + $this->assertNull($entity->getPublicationDate()); + $this->assertFalse($entity->isEnabled()); + $this->assertEmpty($entity->getSignatures()); + + $this->assertSame($termsVersion->getTerms(), $entity->getTerms()); + $this->assertSame(5, $entity->getVersion()); + $this->assertSame('Title Version 3', $entity->getTitle()); + $this->assertSame('Content Version 3', $entity->getContent()); + } +} diff --git a/tests/Domain/Factory/TermsVersionSignatureFactoryTest.php b/tests/Domain/Factory/TermsVersionSignatureFactoryTest.php new file mode 100644 index 0000000..8de5ec5 --- /dev/null +++ b/tests/Domain/Factory/TermsVersionSignatureFactoryTest.php @@ -0,0 +1,65 @@ +factory)($termsVersion, DummySubject::create('user', '42')); + + $this->assertNull($entity->getId()); + $this->assertInstanceOf(\DateTime::class, $entity->getDate()); + $this->assertSame('user', $entity->getSubjectType()); + $this->assertSame('42', $entity->getSubjectIdentifier()); + $this->assertSame($termsVersion, $entity->getVersion()); + } + + public function testSignUniqueForTermsVersionAndSubject(): void + { + $terms = new Terms(); + $terms->setSlug('slug'); + $terms->setName('My Terms'); + + $this->getManager()->persist($terms); + $this->getManager()->flush(); + + $termsVersion = new TermsVersion(); + $termsVersion->setVersion(1); + $termsVersion->setTerms($terms); + $termsVersion->setTitle('title'); + $termsVersion->setContent('content'); + + $this->getManager()->persist($termsVersion); + $this->getManager()->flush(); + + $entity1 = ($this->factory)($termsVersion, DummySubject::create('user', '42')); + $this->getManager()->persist($entity1); + $this->getManager()->flush(); + + $this->expectException(UniqueConstraintViolationException::class); + + $entity2 = ($this->factory)($termsVersion, DummySubject::create('user', '42')); + $this->getManager()->persist($entity2); + $this->getManager()->flush(); + } +} diff --git a/tests/Domain/Fetcher/GetTermsVersionToSignTest.php b/tests/Domain/Fetcher/GetTermsVersionToSignTest.php new file mode 100644 index 0000000..fed6027 --- /dev/null +++ b/tests/Domain/Fetcher/GetTermsVersionToSignTest.php @@ -0,0 +1,76 @@ +expectException(NotFoundTermsException::class); + $this->expectExceptionMessage('Not found terms terms-999.'); + + $subject = DummySubject::create('user', '42'); + + ($this->fetcher)('terms-999', $subject); + } + + public function testFetcherTermsNotPublished(): void + { + $this->expectException(NotPublishedTermsException::class); + $this->expectExceptionMessage('Terms terms-2 is not published.'); + + $subject = DummySubject::create('user', '42'); + + ($this->fetcher)('terms-2', $subject); + } + + public function testFetcherTermsWithoutLastVersion(): void + { + $this->expectException(TermsHasNoPublishedVersionException::class); + $this->expectExceptionMessage('Terms terms-3 hasn\'t published version.'); + + $subject = DummySubject::create('user', '42'); + + ($this->fetcher)('terms-3', $subject); + } + + public function testFetcherSubjectHasALreadySignLastVersion(): void + { + $this->expectException(AlreadySignLastTermsVersionException::class); + $this->expectExceptionMessage('Terms terms-1 is already sign by this subject.'); + + $subject = DummySubject::create('user', '43'); + + ($this->fetcher)('terms-1', $subject); + } + + public function testFetcher(): void + { + $subject = DummySubject::create('user', '42'); + + $termsVersion = ($this->fetcher)('terms-1', $subject); + + $this->assertInstanceOf(TermsVersion::class, $termsVersion); + $this->assertSame(3, $termsVersion->getVersion()); + $this->assertSame('terms-1', $termsVersion->getTerms()->getSlug()); + } +} diff --git a/tests/Domain/Model/DummySubjectTest.php b/tests/Domain/Model/DummySubjectTest.php new file mode 100644 index 0000000..7e62e2d --- /dev/null +++ b/tests/Domain/Model/DummySubjectTest.php @@ -0,0 +1,22 @@ +assertInstanceOf(TermsSubjectInterface::class, $model); + $this->assertSame('subject_type', $model->getTermsSubjectType()); + $this->assertSame('subject_identifier', $model->getTermsSubjectIdentifier()); + } +} diff --git a/tests/Domain/Model/DummyTermsGuardValidationTest.php b/tests/Domain/Model/DummyTermsGuardValidationTest.php new file mode 100644 index 0000000..97f894d --- /dev/null +++ b/tests/Domain/Model/DummyTermsGuardValidationTest.php @@ -0,0 +1,23 @@ +assertInstanceOf(TermsGuardValidationInterface::class, $model); + $this->assertSame('terms_slug', $model->getTermsSlug()); + $this->assertSame('subject_type', $model->getTermsSubjectType()); + $this->assertSame('subject_identifier', $model->getTermsSubjectIdentifier()); + } +} diff --git a/tests/Domain/Model/TermsEditionTest.php b/tests/Domain/Model/TermsEditionTest.php new file mode 100644 index 0000000..d7ab0ea --- /dev/null +++ b/tests/Domain/Model/TermsEditionTest.php @@ -0,0 +1,59 @@ +setIsPublished(true); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setTitle('My title'); + $termsVersion->setContent('My content'); + $termsVersion->setPublicationDate($date); + + $model = new TermsEdition($termsVersion); + + $this->assertTrue($model->isTermsPublished()); + $this->assertSame('My title', $model->getTitle()); + $this->assertSame('My content', $model->getContent()); + $this->assertSame($date, $model->getPublicationDate()); + $this->assertSame($termsVersion, $model->getEntity()); + $this->assertNull($model->needVersionActivation()); + } + + public function testModel(): void + { + $date = new \DateTime(); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms(new Terms()); + + $model = new TermsEdition($termsVersion); + $model->setIsTermsPublished(true); + $model->setTitle('My title'); + $model->setContent('My content'); + $model->setPublicationDate($date); + $model->setNeedVersionActivation(true); + + $this->assertTrue($model->isTermsPublished()); + $this->assertSame('My title', $model->getTitle()); + $this->assertSame('My content', $model->getContent()); + $this->assertSame($date, $model->getPublicationDate()); + $this->assertSame($termsVersion, $model->getEntity()); + $this->assertTrue($model->needVersionActivation()); + } +} diff --git a/tests/Domain/Updater/TermsUpdaterTest.php b/tests/Domain/Updater/TermsUpdaterTest.php new file mode 100644 index 0000000..37f9e0a --- /dev/null +++ b/tests/Domain/Updater/TermsUpdaterTest.php @@ -0,0 +1,39 @@ +getReference(TermsVersion::class, 'v3-terms-1'); + + $entity = new Terms(); + $model = new TermsEdition($termsVersion); + + ($this->updater)($entity, $model); + + $this->assertNull($entity->getId()); + $this->assertNull($entity->getSlug()); + $this->assertNull($entity->getName()); + $this->assertFalse($entity->isDepublicationLocked()); + $this->assertEmpty($entity->getVersions()); + $this->assertTrue($entity->isPublished()); + } +} diff --git a/tests/Domain/Updater/TermsVersionUpdaterTest.php b/tests/Domain/Updater/TermsVersionUpdaterTest.php new file mode 100644 index 0000000..1590036 --- /dev/null +++ b/tests/Domain/Updater/TermsVersionUpdaterTest.php @@ -0,0 +1,79 @@ +expectException(InvalidValueException::class); + + $date = new \DateTime(); + $entity = new TermsVersion(); + $entity->setTerms(new Terms()); + + $model = new TermsEdition($entity); + + $model->setContent('My content'); + $model->setPublicationDate($date); + + ($this->updater)($entity, $model); + } + + public function testUpdateWithInvalidContent(): void + { + $this->expectException(InvalidValueException::class); + + $date = new \DateTime(); + $entity = new TermsVersion(); + $entity->setTerms(new Terms()); + + $model = new TermsEdition($entity); + + $model->setTitle('My Title'); + $model->setPublicationDate($date); + + ($this->updater)($entity, $model); + } + + public function testUpdate(): void + { + $date = new \DateTime(); + $entity = new TermsVersion(); + $entity->setTerms(new Terms()); + + $model = new TermsEdition($entity); + + $model->setTitle('My Title'); + $model->setContent('My content'); + $model->setPublicationDate($date); + + ($this->updater)($entity, $model); + + $this->assertNull($entity->getId()); + $this->assertNull($entity->getVersion()); + $this->assertFalse($entity->isEnabled()); + $this->assertEmpty($entity->getSignatures()); + + $this->assertSame('My Title', $entity->getTitle()); + $this->assertSame('My content', $entity->getContent()); + $this->assertSame($date, $entity->getPublicationDate()); + } +} diff --git a/tests/Domain/UseCase/ActivateTermsVersionTest.php b/tests/Domain/UseCase/ActivateTermsVersionTest.php new file mode 100644 index 0000000..757b5a6 --- /dev/null +++ b/tests/Domain/UseCase/ActivateTermsVersionTest.php @@ -0,0 +1,71 @@ +expectException(AlreadyEnabledTermsVersionException::class); + $this->expectExceptionMessage('Version 42 of terms my_terms is already enabled.'); + + $terms = new Terms(); + $terms->setSlug('my_terms'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(42); + $termsVersion->enable(); + + ($this->useCase)($termsVersion); + } + + public function testUseCase(): void + { + $terms = $this->getReference(Terms::class, '1'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(42); + $termsVersion->setTitle('Title'); + $termsVersion->setContent('Content'); + + ($this->useCase)($termsVersion); + + $this->assertTrue($termsVersion->isEnabled()); + $this->assertNotNull($termsVersion->getPublicationDate()); + + $this->assertCount(2, $this->entityManagerStub->getPersistedEntities()); + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + + $this->assertInstanceOf(TermsVersionEnabledEvent::class, $event); + $this->assertSame($termsVersion, $event->getTermsVersion()); + } +} diff --git a/tests/Domain/UseCase/CreateTermsVersionTest.php b/tests/Domain/UseCase/CreateTermsVersionTest.php new file mode 100644 index 0000000..f1a97df --- /dev/null +++ b/tests/Domain/UseCase/CreateTermsVersionTest.php @@ -0,0 +1,108 @@ +expectException(CannotAddVersionToTermsException::class); + $this->expectExceptionMessage('Cannot add new version to the terms my_terms.'); + + $terms = new Terms(); + $terms->setSlug('my_terms'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(42); + + ($this->useCase)($termsVersion); + } + + public function testUseCaseLastVersionNotPublished(): void + { + $this->expectException(CannotAddVersionToTermsException::class); + $this->expectExceptionMessage('Cannot add new version to the terms my_terms.'); + + $terms = new Terms(); + $terms->setSlug('my_terms'); + + $termsVersion = new TermsVersion(); + $termsVersion->setVersion(42); + $termsVersion->setTerms($terms); + $terms->addVersion($termsVersion); + + ($this->useCase)($termsVersion); + } + + public function testUseCase(): void + { + $terms = $this->getReference(Terms::class, '2'); + + $termsVersion1 = new TermsVersion(); + $termsVersion1->setTitle('Title 1'); + $termsVersion1->setContent('Content 1'); + $termsVersion1->setPublicationDate(new \DateTime('today - 2 days')); + $termsVersion1->setVersion(42); + $termsVersion1->enable(); + $termsVersion1->setTerms($terms); + $terms->addVersion($termsVersion1); + + $termsVersion2 = new TermsVersion(); + $termsVersion2->setTitle('Title 2'); + $termsVersion2->setContent('Content 2'); + $termsVersion2->setPublicationDate(new \DateTime('today - 1 days')); + $termsVersion2->setVersion(43); + $termsVersion2->enable(); + $termsVersion2->setTerms($terms); + $terms->addVersion($termsVersion2); + + $this->getManager()->persist($termsVersion1); + $this->getManager()->persist($termsVersion2); + + ($this->useCase)($termsVersion1); + + $this->assertCount(1, $this->entityManagerStub->getPersistedEntities()); + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + + $this->assertInstanceOf(TermsVersionCreatedEvent::class, $event); + + $newTermsVersion = $event->getTermsVersion(); + + $this->assertInstanceOf(TermsVersion::class, $event->getTermsVersion()); + $this->assertNotNull($newTermsVersion->getId()); + $this->assertSame('Title 1', $newTermsVersion->getTitle()); + $this->assertSame('Content 1', $newTermsVersion->getCOntent()); + $this->assertSame(44, $newTermsVersion->getVersion()); + $this->assertSame($terms, $newTermsVersion->getTerms()); + $this->assertNull($newTermsVersion->getPublicationDate()); + $this->assertFalse($newTermsVersion->isEnabled()); + } +} diff --git a/tests/Domain/UseCase/EditTermsTest.php b/tests/Domain/UseCase/EditTermsTest.php new file mode 100644 index 0000000..610b896 --- /dev/null +++ b/tests/Domain/UseCase/EditTermsTest.php @@ -0,0 +1,156 @@ +expectException(InvalidTermsEditionException::class); + $this->expectExceptionMessage('Invalid model TermsEdition.'); + + $termsVersion = $this->getReference(TermsVersion::class, 'v4-terms-1'); + + $model = new TermsEdition($termsVersion); + $model->setContent(null); + + ($this->useCase)($model); + } + + public function testUseCaseNoChanges(): void + { + $termsVersion = $this->getReference(TermsVersion::class, 'v4-terms-1'); + $oldTermsVersion = clone $termsVersion; + + $model = new TermsEdition($termsVersion); + + ($this->useCase)($model); + + $this->assertSame($oldTermsVersion->getId(), $termsVersion->getId()); + $this->assertSame($oldTermsVersion->getTitle(), $termsVersion->getTitle()); + $this->assertSame($oldTermsVersion->getContent(), $termsVersion->getContent()); + $this->assertSame($oldTermsVersion->getPublicationDate(), $termsVersion->getPublicationDate()); + $this->assertSame($oldTermsVersion->isEnabled(), $termsVersion->isEnabled()); + $this->assertSame($oldTermsVersion->getTerms()->isPublished(), $termsVersion->getTerms()->isPublished()); + + $this->assertCount(2, $this->entityManagerStub->getPersistedEntities()); + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsVersionUpdatedEvent::class, $event); + } + + public function testUseCaseWithChanges(): void + { + $date = new \DateTime(); + + $termsVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + + $model = new TermsEdition($termsVersion); + $model->setTitle('New title'); + $model->setContent('New content'); + $model->setPublicationDate($date); + $model->setIsTermsPublished(false); + + ($this->useCase)($model); + + $this->assertSame('New title', $termsVersion->getTitle()); + $this->assertSame('New content', $termsVersion->getContent()); + $this->assertSame($date, $termsVersion->getPublicationDate()); + $this->assertFalse($termsVersion->isEnabled()); + $this->assertFalse($termsVersion->getTerms()->isPublished()); + + $this->assertCount(2, $this->entityManagerStub->getPersistedEntities()); + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsVersionUpdatedEvent::class, $event); + } + + public function testUseCaseWithChangesAndActivation(): void + { + $termsVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + + $model = new TermsEdition($termsVersion); + $model->setTitle('New title'); + $model->setContent('New content'); + $model->setIsTermsPublished(false); + $model->setNeedVersionActivation(true); + + ($this->useCase)($model); + + $this->assertSame('New title', $termsVersion->getTitle()); + $this->assertSame('New content', $termsVersion->getContent()); + $this->assertNotNull($termsVersion->getPublicationDate()); + $this->assertTrue($termsVersion->isEnabled()); + $this->assertFalse($termsVersion->getTerms()->isPublished()); + + $this->assertCount(4, $this->entityManagerStub->getPersistedEntities()); + $this->assertCount(2, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsVersionEnabledEvent::class, $event); + + $event = $this->eventDispatcherStub->getEvents()[1]; + $this->assertInstanceOf(TermsVersionUpdatedEvent::class, $event); + } + + public function testUseCaseFirstTermsVersionAndTermsPublished(): void + { + $terms = $this->getReference(Terms::class, '2'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(1); + $terms->addVersion($termsVersion); + + $model = new TermsEdition($termsVersion); + $model->setTitle('New title'); + $model->setContent('New content'); + $model->setIsTermsPublished(true); + + ($this->useCase)($model); + + $this->assertSame('New title', $termsVersion->getTitle()); + $this->assertSame('New content', $termsVersion->getContent()); + $this->assertNotNull($termsVersion->getPublicationDate()); + $this->assertTrue($termsVersion->isEnabled()); + $this->assertTrue($termsVersion->getTerms()->isPublished()); + + $this->assertCount(4, $this->entityManagerStub->getPersistedEntities()); + $this->assertCount(2, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsVersionUpdatedEvent::class, $event); + + $event = $this->eventDispatcherStub->getEvents()[1]; + $this->assertInstanceOf(TermsVersionEnabledEvent::class, $event); + } +} diff --git a/tests/Domain/UseCase/HasSignedLastTermsVersionTest.php b/tests/Domain/UseCase/HasSignedLastTermsVersionTest.php new file mode 100644 index 0000000..54f098d --- /dev/null +++ b/tests/Domain/UseCase/HasSignedLastTermsVersionTest.php @@ -0,0 +1,62 @@ +expectException(NotFoundTermsException::class); + $this->expectDeprecationMessage('Not found terms terms-999.'); + + $subject = DummySubject::create('user', '42'); + ($this->useCase)('terms-999', $subject); + } + + public function testUseCaseTermsNotPublished(): void + { + $subject = DummySubject::create('user', '42'); + $hasSign = ($this->useCase)('terms-2', $subject); + + $this->assertFalse($hasSign); + } + + public function testUseCaseSubjectNotExist(): void + { + $subject = DummySubject::create('user', '999'); + $hasSign = ($this->useCase)('terms-1', $subject); + + $this->assertFalse($hasSign); + } + + public function testUseCaseHasSignOldVersion(): void + { + $subject = DummySubject::create('user', '42'); + $hasSign = ($this->useCase)('terms-1', $subject); + + $this->assertFalse($hasSign); + } + + public function testUseCaseHasSignLatestVersion(): void + { + $subject = DummySubject::create('user', '43'); + $hasSign = ($this->useCase)('terms-1', $subject); + + $this->assertTrue($hasSign); + } +} diff --git a/tests/Domain/UseCase/HasSignedTermsTest.php b/tests/Domain/UseCase/HasSignedTermsTest.php new file mode 100644 index 0000000..61ca814 --- /dev/null +++ b/tests/Domain/UseCase/HasSignedTermsTest.php @@ -0,0 +1,62 @@ +expectException(NotFoundTermsException::class); + $this->expectDeprecationMessage('Not found terms terms-999.'); + + $subject = DummySubject::create('user', '42'); + ($this->useCase)('terms-999', $subject); + } + + public function testUseCaseTermsNotPublished(): void + { + $subject = DummySubject::create('user', '42'); + $code = ($this->useCase)('terms-2', $subject); + + $this->assertSame(HasSignedTerms::HAS_NOT_SIGNED, $code); + } + + public function testUseCaseSubjectNotExist(): void + { + $subject = DummySubject::create('user', '999'); + $code = ($this->useCase)('terms-1', $subject); + + $this->assertSame(HasSignedTerms::HAS_NOT_SIGNED, $code); + } + + public function testUseCaseHasSignOldVersion(): void + { + $subject = DummySubject::create('user', '42'); + $code = ($this->useCase)('terms-1', $subject); + + $this->assertSame(HasSignedTerms::HAS_SIGNED_OLD_VERSION, $code); + } + + public function testUseCaseHasSignLatestVersion(): void + { + $subject = DummySubject::create('user', '43'); + $code = ($this->useCase)('terms-1', $subject); + + $this->assertSame(HasSignedTerms::HAS_SIGNED_LATEST_VERSION, $code); + } +} diff --git a/tests/Domain/UseCase/RemoveTermsVersionTest.php b/tests/Domain/UseCase/RemoveTermsVersionTest.php new file mode 100644 index 0000000..b4c41e4 --- /dev/null +++ b/tests/Domain/UseCase/RemoveTermsVersionTest.php @@ -0,0 +1,78 @@ +expectException(EnabledVersionCannotBeDeletedException::class); + $this->expectExceptionMessage('Version 42 of terms my_terms cannot be deleted.'); + + $terms = new Terms(); + $terms->setSlug('my_terms'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(42); + $termsVersion->enable(); + + ($this->useCase)($termsVersion); + } + + public function testUseCaseFirstVersion(): void + { + $this->expectException(FirstVersionCannotBeDeletedException::class); + $this->expectExceptionMessage('First version of terms my_terms cannot be deleted.'); + + $terms = new Terms(); + $terms->setSlug('my_terms'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(42); + + ($this->useCase)($termsVersion); + } + + public function testUseCase(): void + { + $termsVersion = $this->getReference(TermsVersion::class, 'v4-terms-1'); + + ($this->useCase)($termsVersion); + + $this->assertCount(1, $this->entityManagerStub->getRemovedEntities()); + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + + $this->assertInstanceOf(TermsVersionDeletedEvent::class, $event); + $this->assertSame($termsVersion, $event->getTermsVersion()); + } +} diff --git a/tests/Domain/UseCase/SignTermsTest.php b/tests/Domain/UseCase/SignTermsTest.php new file mode 100644 index 0000000..f5f7f72 --- /dev/null +++ b/tests/Domain/UseCase/SignTermsTest.php @@ -0,0 +1,284 @@ +expectException(NotFoundTermsException::class); + $this->expectExceptionMessage('Not found terms terms-999.'); + + $subject = DummySubject::create('user', '42'); + + ($this->useCase)('terms-999', $subject, null); + } + + public function testUseCaseTermsNotPublished(): void + { + $this->expectException(NotPublishedTermsException::class); + $this->expectExceptionMessage('Terms terms-2 is not published.'); + + $subject = DummySubject::create('user', '42'); + + ($this->useCase)('terms-2', $subject, null); + } + + public function testUseCaseTermsWithoutLastVersion(): void + { + $this->expectException(TermsHasNoPublishedVersionException::class); + $this->expectExceptionMessage('Terms terms-3 hasn\'t published version.'); + + $subject = DummySubject::create('user', '42'); + + ($this->useCase)('terms-3', $subject, null); + } + + public function testUseCaseSubjectHasALreadySignLastVersion(): void + { + $this->expectException(AlreadySignLastTermsVersionException::class); + $this->expectExceptionMessage('Terms terms-1 is already sign by this subject.'); + + $subject = DummySubject::create('user', '43'); + + ($this->useCase)('terms-1', $subject, null); + } + + public function testUseCasePreferAnswerLater(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $subject = DummySubject::create('user', '42'); + + $response = ($this->useCase)('terms-1', $subject, null); + $this->getManager()->flush(); + + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('/ignore', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I prefer to answer later.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(3, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertNull($event->isAccepted()); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + } + + public function testUseCaseRefuse(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $subject = DummySubject::create('user', '42'); + + $response = ($this->useCase)('terms-1', $subject, false); + $this->getManager()->flush(); + + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('/refusal', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I refuse.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(3, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertFalse($event->isAccepted()); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + } + + public function testUseCaseAcceptation(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $subject = DummySubject::create('user', '42'); + + $response = ($this->useCase)('terms-1', $subject, true); + $this->getManager()->flush(); + + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('/acceptation', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I agree.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(3, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertTrue($event->isAccepted()); + + $this->assertCount(6, $this->termsVersionSignatureRepository->findAll()); + } + + public function testUseCasePreferAnswerLaterWithCustomRedirection(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $subject = DummySubject::create('user', '42'); + + $response = ($this->useCase)('terms-4', $subject, null); + $this->getManager()->flush(); + + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('/other', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-4.', $log[1]); + $this->assertStringContainsString('Decision: I prefer to answer later.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(1, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertNull($event->isAccepted()); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + } + + public function testUseCaseRefuseWithCustomRedirection(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $subject = DummySubject::create('user', '42'); + + $response = ($this->useCase)('terms-4', $subject, false); + $this->getManager()->flush(); + + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('/other', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-4.', $log[1]); + $this->assertStringContainsString('Decision: I refuse.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(1, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertFalse($event->isAccepted()); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + } + + public function testUseCaseAcceptationWithCustomRedirection(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $subject = DummySubject::create('user', '42'); + + $response = ($this->useCase)('terms-4', $subject, true); + $this->getManager()->flush(); + + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('/other', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-4.', $log[1]); + $this->assertStringContainsString('Decision: I agree.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(1, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertTrue($event->isAccepted()); + + $this->assertCount(6, $this->termsVersionSignatureRepository->findAll()); + } +} diff --git a/tests/DummyTest.php b/tests/DummyTest.php index f712133..f110828 100644 --- a/tests/DummyTest.php +++ b/tests/DummyTest.php @@ -2,20 +2,13 @@ declare(strict_types=1); -namespace RichId\TermsModuleBundle\tests; +namespace RichId\TermsModuleBundle\Tests; use RichCongress\TestTools\TestCase\TestCase; -use RichId\TermsModuleBundle\RichIdTermsModuleBundle; +use RichId\TermsModuleBundle\Infrastructure\RichIdTermsModuleBundle; -/** - * Class DummyTest. - * - * @author Nicolas Guilloux - * @copyright 2014 - 2020 RichId (https://www.rich-id.com) - * - * @covers \RichId\TermsModuleBundle\RichIdTermsModuleBundle - */ -class DummyTest extends TestCase +/** @covers \RichId\TermsModuleBundle\Infrastructure\RichIdTermsModuleBundle */ +final class DummyTest extends TestCase { public function testInstanciateBundle(): void { diff --git a/tests/Infrastructure/Adapter/EntityRecorderTest.php b/tests/Infrastructure/Adapter/EntityRecorderTest.php new file mode 100644 index 0000000..0c4d033 --- /dev/null +++ b/tests/Infrastructure/Adapter/EntityRecorderTest.php @@ -0,0 +1,79 @@ +assertCount(5, $this->termsVersionSignatureRepository->findAll()); + $version = $this->getReference(TermsVersion::class, 'v3-terms-1'); + + $signature = new TermsVersionSignature(); + $signature->setVersion($version); + $signature->setSubjectType('user'); + $signature->setSubjectIdentifier('42'); + $signature->setDate(new \DateTime()); + + $this->adapter->saveSignature($signature); + + $this->assertCount(6, $this->termsVersionSignatureRepository->findAll()); + } + + public function testSaveTerms(): void + { + $this->assertCount(5, $this->termsRepository->findAll()); + + $terms = new Terms(); + $terms->setSlug('my_terms'); + $terms->setName('My terms'); + + $this->adapter->saveTerms($terms); + + $this->assertCount(6, $this->termsRepository->findAll()); + } + + public function testSaveTermsVersion(): void + { + $this->assertCount(7, $this->termsVersionRepository->findAll()); + $terms = $this->getReference(Terms::class, '1'); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setVersion(15); + $termsVersion->setTitle('Title'); + $termsVersion->setContent('Content'); + + $this->adapter->saveTermsVersion($termsVersion); + + $this->assertCount(8, $this->termsVersionRepository->findAll()); + } +} diff --git a/tests/Infrastructure/Adapter/EntityRemoverTest.php b/tests/Infrastructure/Adapter/EntityRemoverTest.php new file mode 100644 index 0000000..23de465 --- /dev/null +++ b/tests/Infrastructure/Adapter/EntityRemoverTest.php @@ -0,0 +1,42 @@ +assertCount(7, $this->termsVersionRepository->findAll()); + + $termsVersion = $this->getReference(TermsVersion::class, 'v4-terms-1'); + + $this->adapter->removeTermsVersion($termsVersion); + + $this->assertCount(1, $this->entityManagerStub->getRemovedEntities()); + + // Skipped, waiting a correction in the test-framework + //$this->assertCount(6, $this->termsVersionRepository->findAll()); + } +} diff --git a/tests/Infrastructure/Adapter/EventDispatcherTest.php b/tests/Infrastructure/Adapter/EventDispatcherTest.php new file mode 100644 index 0000000..9868773 --- /dev/null +++ b/tests/Infrastructure/Adapter/EventDispatcherTest.php @@ -0,0 +1,89 @@ +getReference(TermsVersion::class, 'v3-terms-1'); + $response = new Response(); + $subject = DummySubject::create('user', '42'); + + $event = new TermsSignedEvent($termsVersion, $subject, true, $response); + + $this->adapter->dispatchTermsEvent($event); + + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + $this->assertSame($event, $this->eventDispatcherStub->getEvents()[0]); + } + + public function testDispatchWithTermsVersionCreatedEvent(): void + { + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + $event = new TermsVersionCreatedEvent($termsVersion); + + $this->adapter->dispatchTermsEvent($event); + + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + $this->assertSame($event, $this->eventDispatcherStub->getEvents()[0]); + } + + public function testDispatchWithTermsVersionDeletedEvent(): void + { + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + $event = new TermsVersionDeletedEvent($termsVersion); + + $this->adapter->dispatchTermsEvent($event); + + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + $this->assertSame($event, $this->eventDispatcherStub->getEvents()[0]); + } + + public function testDispatchWithTermsVersionEnabledEvent(): void + { + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + $event = new TermsVersionEnabledEvent($termsVersion); + + $this->adapter->dispatchTermsEvent($event); + + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + $this->assertSame($event, $this->eventDispatcherStub->getEvents()[0]); + } + + public function testDispatchWithTermsVersionUpdatedEvent(): void + { + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + $event = new TermsVersionUpdatedEvent($termsVersion); + + $this->adapter->dispatchTermsEvent($event); + + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + $this->assertSame($event, $this->eventDispatcherStub->getEvents()[0]); + } +} diff --git a/tests/Infrastructure/Adapter/LoggerTest.php b/tests/Infrastructure/Adapter/LoggerTest.php new file mode 100644 index 0000000..3b71609 --- /dev/null +++ b/tests/Infrastructure/Adapter/LoggerTest.php @@ -0,0 +1,119 @@ +getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $subject = DummySubject::create('user', '42'); + + $this->adapter->logTermsSigned('terms-1', $subject, null); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I prefer to answer later.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $this->assertSame( + [ + 'extra' => [ + '_event' => 'terms_module.terms_signed', + '_terms' => 'terms-1', + '_choice' => 'I prefer to answer later', + '_user' => 'my_user_1', + ], + ], + $log[2] + ); + } + + public function testLogTermsRefuse(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $subject = DummySubject::create('user', '42'); + + $this->adapter->logTermsSigned('terms-1', $subject, false); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I refuse.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $this->assertSame( + [ + 'extra' => [ + '_event' => 'terms_module.terms_signed', + '_terms' => 'terms-1', + '_choice' => 'I refuse', + '_user' => 'my_user_1', + ], + ], + $log[2] + ); + } + + public function testLogTermsSignedAcceptation(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $subject = DummySubject::create('user', '42'); + + $this->adapter->logTermsSigned('terms-1', $subject, true); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I agree.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $this->assertSame( + [ + 'extra' => [ + '_event' => 'terms_module.terms_signed', + '_terms' => 'terms-1', + '_choice' => 'I agree', + '_user' => 'my_user_1', + ], + ], + $log[2] + ); + } +} diff --git a/tests/Infrastructure/Adapter/ResponseBuilderTest.php b/tests/Infrastructure/Adapter/ResponseBuilderTest.php new file mode 100644 index 0000000..9d88e86 --- /dev/null +++ b/tests/Infrastructure/Adapter/ResponseBuilderTest.php @@ -0,0 +1,47 @@ +adapter->buildDefaultTermsSignedResponse(null); + + $this->assertInstanceOf(RedirectResponse::class, $response); + $this->assertSame('/ignore', $response->getTargetUrl()); + } + + public function testBuildDefaultTermsSignedResponseRefuse(): void + { + /** @var RedirectResponse $response */ + $response = $this->adapter->buildDefaultTermsSignedResponse(false); + + $this->assertInstanceOf(RedirectResponse::class, $response); + $this->assertSame('/refusal', $response->getTargetUrl()); + } + + public function testBuildDefaultTermsSignedResponseAcceptation(): void + { + /** @var RedirectResponse $response */ + $response = $this->adapter->buildDefaultTermsSignedResponse(true); + + $this->assertInstanceOf(RedirectResponse::class, $response); + $this->assertSame('/acceptation', $response->getTargetUrl()); + } +} diff --git a/tests/Infrastructure/Adapter/TermsRepositoryTest.php b/tests/Infrastructure/Adapter/TermsRepositoryTest.php new file mode 100644 index 0000000..7096cbf --- /dev/null +++ b/tests/Infrastructure/Adapter/TermsRepositoryTest.php @@ -0,0 +1,37 @@ +adapter->findOneBySlug('terms-999'); + + $this->assertNull($terms); + } + + public function testFindOneBySlug(): void + { + $terms = $this->adapter->findOneBySlug('terms-1'); + + $this->assertInstanceOf(Terms::class, $terms); + + $slug = $terms ? $terms->getSlug() : ''; + $this->assertSame('terms-1', $slug); + } +} diff --git a/tests/Infrastructure/Adapter/TermsVersionRepositoryTest.php b/tests/Infrastructure/Adapter/TermsVersionRepositoryTest.php new file mode 100644 index 0000000..277c0b5 --- /dev/null +++ b/tests/Infrastructure/Adapter/TermsVersionRepositoryTest.php @@ -0,0 +1,51 @@ +adapter->findLastSignedVersionForTermsSubject( + 'terms-1', + DummySubject::create('user', '42') + ); + + /* @phpstan-ignore-next-line */ + $this->assertSame(2, $lastVersionSigned->getVersion()); + } + + public function testFindLastSignedVersionForTermsSubjectNotExistingSubject(): void + { + $lastVersionSigned = $this->adapter->findLastSignedVersionForTermsSubject( + 'terms-1', + DummySubject::create('user', '999') + ); + + $this->assertNull($lastVersionSigned); + } + + public function testFindLastSignedVersionForTermsSubjectNotExistingTerms(): void + { + $lastVersionSigned = $this->adapter->findLastSignedVersionForTermsSubject( + 'terms-99999', + DummySubject::create('user', '42') + ); + + $this->assertNull($lastVersionSigned); + } +} diff --git a/tests/Infrastructure/Adapter/ValidatorTest.php b/tests/Infrastructure/Adapter/ValidatorTest.php new file mode 100644 index 0000000..0648be3 --- /dev/null +++ b/tests/Infrastructure/Adapter/ValidatorTest.php @@ -0,0 +1,45 @@ +getReference(TermsVersion::class, 'v3-terms-1'); + $model = new TermsEdition($termsVersion); + + $this->adapter->validateTermsEdition($model); + $this->assertTrue(true); + } + + public function testValidateTermsEditionWithError(): void + { + $this->expectException(InvalidTermsEditionException::class); + $this->expectExceptionMessage('Invalid model TermsEdition.'); + + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + + $model = new TermsEdition($termsVersion); + $model->setTitle(''); + $model->setContent(''); + + $this->adapter->validateTermsEdition($model); + } +} diff --git a/tests/Infrastructure/FormType/TermsVersionFormTypeTest.php b/tests/Infrastructure/FormType/TermsVersionFormTypeTest.php new file mode 100644 index 0000000..13b1e64 --- /dev/null +++ b/tests/Infrastructure/FormType/TermsVersionFormTypeTest.php @@ -0,0 +1,112 @@ +setTerms($terms); + + $model = new TermsEdition($termsVersion); + $form = $this->formFactory->create(TermsVersionFormType::class, $model); + + $form->submit( + [ + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ] + ); + + $this->assertTrue($form->isSynchronized()); + $this->assertFalse($form->isValid()); + + $output = $form->getData(); + $this->assertNull($output->getTitle()); + $this->assertNull($output->getContent()); + $this->assertNull($output->getPublicationDate()); + $this->assertNull($output->isTermsPublished()); + $this->assertNull($output->needVersionActivation()); + $this->assertSame($termsVersion, $output->getEntity()); + } + + public function testSubmitValidDataMinimum(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + + $model = new TermsEdition($termsVersion); + $form = $this->formFactory->create(TermsVersionFormType::class, $model); + + $form->submit( + [ + 'title' => 'My title', + 'content' => 'My content', + 'isTermsPublished' => '0', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ] + ); + + $this->assertTrue($form->isSynchronized()); + $this->assertTrue($form->isValid()); + + $output = $form->getData(); + $this->assertSame('My title', $output->getTitle()); + $this->assertSame('My content', $output->getContent()); + $this->assertFalse($output->isTermsPublished()); + $this->assertNull($output->getPublicationDate()); + $this->assertNull($output->needVersionActivation()); + $this->assertSame($termsVersion, $output->getEntity()); + } + + public function testSubmitValidDataFull(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + + $model = new TermsEdition($termsVersion); + $form = $this->formFactory->create(TermsVersionFormType::class, $model); + + $form->submit( + [ + 'title' => 'My title', + 'content' => 'My content', + 'publicationDate' => '2021-01-01', + 'isTermsPublished' => '0', + 'needVersionActivation' => 'true', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ] + ); + + $this->assertTrue($form->isSynchronized()); + $this->assertTrue($form->isValid()); + + $output = $form->getData(); + $this->assertSame('My title', $output->getTitle()); + $this->assertSame('My content', $output->getContent()); + $this->assertSame('2021-01-01', $output->getPublicationDate()->format('Y-m-d')); + $this->assertFalse($output->isTermsPublished()); + $this->assertTrue($output->needVersionActivation()); + $this->assertSame($termsVersion, $output->getEntity()); + } +} diff --git a/tests/Infrastructure/Listener/RedirectToSigningPageOnAccessDeniedListenerTest.php b/tests/Infrastructure/Listener/RedirectToSigningPageOnAccessDeniedListenerTest.php new file mode 100644 index 0000000..944e9b7 --- /dev/null +++ b/tests/Infrastructure/Listener/RedirectToSigningPageOnAccessDeniedListenerTest.php @@ -0,0 +1,31 @@ +getClient()->get('/with-access'); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/terms/terms-1/sign?type=user&identifier=42', $response->headers->get('location')); + } + + public function testControllerThrowOtherException(): void + { + $response = $this->getClient()->get('/with-exception'); + + $this->assertSame(Response::HTTP_INTERNAL_SERVER_ERROR, $response->getStatusCode()); + } +} diff --git a/tests/Infrastructure/Repository/TermsRepositoryTest.php b/tests/Infrastructure/Repository/TermsRepositoryTest.php new file mode 100644 index 0000000..a1315c7 --- /dev/null +++ b/tests/Infrastructure/Repository/TermsRepositoryTest.php @@ -0,0 +1,32 @@ +repository->findAllOrderedByName(); + + $this->assertCount(5, $terms); + + $this->assertSame('Terms 1', $terms[0]->getName()); + $this->assertSame('Terms 2', $terms[1]->getName()); + $this->assertSame('Terms 3', $terms[2]->getName()); + $this->assertSame('Terms 4', $terms[3]->getName()); + $this->assertSame('Terms 5', $terms[4]->getName()); + } +} diff --git a/tests/Infrastructure/Repository/TermsVersionRepositoryTest.php b/tests/Infrastructure/Repository/TermsVersionRepositoryTest.php new file mode 100644 index 0000000..ebe40b1 --- /dev/null +++ b/tests/Infrastructure/Repository/TermsVersionRepositoryTest.php @@ -0,0 +1,57 @@ +repository->findLastSignedVersionForTermsSubject( + 'terms-1', + DummySubject::create('user', '42') + ); + + $this->assertInstanceOf(TermsVersion::class, $lastVersionSigned); + $this->assertSame(2, $lastVersionSigned->getVersion()); /* @phpstan-ignore-line */ + } + + public function testFindLastSignedVersionForTermsSubjectNotExistingSubject(): void + { + $lastVersionSigned = $this->repository->findLastSignedVersionForTermsSubject( + 'terms-1', + DummySubject::create('user', '999') + ); + + $this->assertNull($lastVersionSigned); + } + + public function testFindOneByTermsAndVersionNotFound(): void + { + $termsVersion = $this->repository->findOneByTermsAndVersion('terms-1', 50); + + $this->assertNull($termsVersion); + } + + public function testFindOneByTermsAndVersion(): void + { + $termsVersion = $this->repository->findOneByTermsAndVersion('terms-1', 2); + + $this->assertInstanceOf(TermsVersion::class, $termsVersion); + $this->assertSame(2, $termsVersion->getVersion()); /* @phpstan-ignore-line */ + } +} diff --git a/tests/Infrastructure/SecurityVoter/TermsGuardVoterTest.php b/tests/Infrastructure/SecurityVoter/TermsGuardVoterTest.php new file mode 100644 index 0000000..fdd7d37 --- /dev/null +++ b/tests/Infrastructure/SecurityVoter/TermsGuardVoterTest.php @@ -0,0 +1,101 @@ +vote( + $subject, + TermsGuardVoter::MODULE_TERMS_GUARD_VALID + ); + + $this->assertSame(Voter::ACCESS_ABSTAIN, $result); + } + + public function testVoterWithNotSupportedAttribute(): void + { + $subject = DummyTermsGuardValidation::create('', '', ''); + + $result = $this->vote( + $subject, + 'other' + ); + + $this->assertSame(Voter::ACCESS_ABSTAIN, $result); + } + + public function testVoterWithoutFoundedGuard(): void + { + $subject = DummyTermsGuardValidation::create('other', 'user', '42'); + + $result = $this->vote( + $subject, + TermsGuardVoter::MODULE_TERMS_GUARD_VALID + ); + + $this->assertSame(Voter::ACCESS_GRANTED, $result); + } + + public function testVoterCheckNotLoggedUser(): void + { + $subject = DummyTermsGuardValidation::create('terms-5', 'user', '42'); + + $result = $this->vote( + $subject, + TermsGuardVoter::MODULE_TERMS_GUARD_VALID + ); + + $this->assertSame(Voter::ACCESS_DENIED, $result); + } + + public function testVoterCheckUnautorized(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $subject = DummyTermsGuardValidation::create('terms-5', 'user', '42'); + + $result = $this->vote( + $subject, + TermsGuardVoter::MODULE_TERMS_GUARD_VALID + ); + + $this->assertSame(Voter::ACCESS_DENIED, $result); + } + + public function testVoterCheckAutorized(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $subject = DummyTermsGuardValidation::create('terms-5', 'user', 'my_user_1'); + + $result = $this->vote( + $subject, + TermsGuardVoter::MODULE_TERMS_GUARD_VALID + ); + + $this->assertSame(Voter::ACCESS_GRANTED, $result); + } +} diff --git a/tests/Infrastructure/SecurityVoter/UserVoterTest.php b/tests/Infrastructure/SecurityVoter/UserVoterTest.php new file mode 100644 index 0000000..591f3eb --- /dev/null +++ b/tests/Infrastructure/SecurityVoter/UserVoterTest.php @@ -0,0 +1,70 @@ +vote( + null, + 'other' + ); + + $this->assertSame(Voter::ACCESS_ABSTAIN, $result); + } + + public function testVoterNotLogged(): void + { + $result = $this->vote( + null, + UserVoter::MODULE_TERMS_ADMIN + ); + + $this->assertSame(Voter::ACCESS_DENIED, $result); + } + + public function testVoterLoggedByBadRole(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $result = $this->vote( + null, + UserVoter::MODULE_TERMS_ADMIN, + $user + ); + + $this->assertSame(Voter::ACCESS_DENIED, $result); + } + + public function testVoterLoggedAndGoodRole(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $result = $this->vote( + null, + UserVoter::MODULE_TERMS_ADMIN, + $user + ); + + $this->assertSame(Voter::ACCESS_GRANTED, $result); + } +} diff --git a/tests/Infrastructure/TwigExtension/TermsExtensionTest.php b/tests/Infrastructure/TwigExtension/TermsExtensionTest.php new file mode 100644 index 0000000..59940a4 --- /dev/null +++ b/tests/Infrastructure/TwigExtension/TermsExtensionTest.php @@ -0,0 +1,58 @@ +assertEmpty($this->extension->getFilters()); + + $this->assertCount(1, $this->extension->getFunctions()); + $this->assertInstanceOf(TwigFunction::class, $this->extension->getFunctions()[0]); + } + + public function testHasSignedTermsTermsNotExist(): void + { + $this->expectException(NotFoundTermsException::class); + $this->expectDeprecationMessage('Not found terms terms-999.'); + + $this->extension->hasSignedTerms('terms-999', 'user', '42'); + } + + public function testHasSignedTermsSubjectNotExist(): void + { + $code = $this->extension->hasSignedTerms('terms-1', 'user', '999'); + + $this->assertSame(2, $code); + } + + public function testHasSignedTermsHasSignOldVersion(): void + { + $code = $this->extension->hasSignedTerms('terms-1', 'user', '42'); + + $this->assertSame(1, $code); + } + + public function testHasSignedTermsHasSignLatestVersion(): void + { + $code = $this->extension->hasSignedTerms('terms-1', 'user', '43'); + + $this->assertSame(0, $code); + } +} diff --git a/tests/Infrastructure/ValidatorConstraints/CantContentChangeIfTermsPublishedTest.php b/tests/Infrastructure/ValidatorConstraints/CantContentChangeIfTermsPublishedTest.php new file mode 100644 index 0000000..2f87cf7 --- /dev/null +++ b/tests/Infrastructure/ValidatorConstraints/CantContentChangeIfTermsPublishedTest.php @@ -0,0 +1,86 @@ +assertSame('class', $this->validator->getTargets()); + } + + public function testValidatedBy(): void + { + $this->assertSame(CantContentChangeIfTermsPublished::class, $this->validator->validatedBy()); + } + + public function testValidatorWithBadClass(): void + { + $violations = $this->validate(new DummyUser()); + $this->assertEmpty($violations); + } + + public function testValidatorNotEnabledTermsVersion(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setContent('Old content'); + + $model = new TermsEdition($termsVersion); + $model->setContent('New Content'); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorEnabledTermsVersionContentNotChange(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setContent('Old content'); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setContent('Old content'); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorEnabledTermsVersionContentChange(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setContent('Old content'); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setContent('New content'); + + $violations = $this->validate($model); + + $this->assertCount(1, $violations); + $this->assertSame('The content cannot be changed when the version is published.', $violations[0]->getMessage()); + $this->assertSame('content', $violations[0]->getPropertyPath()); + } +} diff --git a/tests/Infrastructure/ValidatorConstraints/CantEnableVersionIfAlreadyEnabledTest.php b/tests/Infrastructure/ValidatorConstraints/CantEnableVersionIfAlreadyEnabledTest.php new file mode 100644 index 0000000..fd2ac38 --- /dev/null +++ b/tests/Infrastructure/ValidatorConstraints/CantEnableVersionIfAlreadyEnabledTest.php @@ -0,0 +1,82 @@ +assertSame('class', $this->validator->getTargets()); + } + + public function testValidatedBy(): void + { + $this->assertSame(CantEnableVersionIfAlreadyEnabled::class, $this->validator->validatedBy()); + } + + public function testValidatorWithBadClass(): void + { + $violations = $this->validate(new DummyUser()); + $this->assertEmpty($violations); + } + + public function testValidatorWithoutActivation(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorNeedVersionActivationNotEnabled(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + + $model = new TermsEdition($termsVersion); + $model->setNeedVersionActivation(true); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorNeedVersionActivationAlreadyEnabled(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setNeedVersionActivation(true); + + $violations = $this->validate($model); + + $this->assertCount(1, $violations); + $this->assertSame('The version is already activated.', $violations[0]->getMessage()); + $this->assertSame('needVersionActivation', $violations[0]->getPropertyPath()); + } +} diff --git a/tests/Infrastructure/ValidatorConstraints/CantPublicationDateChangeIfTermsPublishedTest.php b/tests/Infrastructure/ValidatorConstraints/CantPublicationDateChangeIfTermsPublishedTest.php new file mode 100644 index 0000000..b90083e --- /dev/null +++ b/tests/Infrastructure/ValidatorConstraints/CantPublicationDateChangeIfTermsPublishedTest.php @@ -0,0 +1,133 @@ +assertSame('class', $this->validator->getTargets()); + } + + public function testValidatedBy(): void + { + $this->assertSame(CantPublicationDateChangeIfTermsPublished::class, $this->validator->validatedBy()); + } + + public function testValidatorWithBadClass(): void + { + $violations = $this->validate(new DummyUser()); + $this->assertEmpty($violations); + } + + public function testValidatorNotEnabledTermsVersion(): void + { + $date1 = new \DateTime(); + $date2 = new \DateTime('- 1 day'); + + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setPublicationDate($date1); + + $model = new TermsEdition($termsVersion); + $model->setPublicationDate($date2); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorEnabledTermsVersionPublicationDateNotChange(): void + { + $date = new \DateTime(); + + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setPublicationDate($date); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setPublicationDate($date); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorEnabledTermsVersionPublicationDateChange(): void + { + $date1 = new \DateTime(); + $date2 = new \DateTime('- 1 day'); + + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setPublicationDate($date1); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setPublicationDate($date2); + + $violations = $this->validate($model); + + $this->assertCount(1, $violations); + $this->assertSame('The publication date cannot be changed when the version is published.', $violations[0]->getMessage()); + $this->assertSame('publicationDate', $violations[0]->getPropertyPath()); + } + + public function testValidatorEnabledTermsVersionPublicationDateChangeToNull(): void + { + $date = new \DateTime(); + + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setPublicationDate($date); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setPublicationDate(null); + + $violations = $this->validate($model); + + $this->assertCount(1, $violations); + $this->assertSame('The publication date cannot be changed when the version is published.', $violations[0]->getMessage()); + $this->assertSame('publicationDate', $violations[0]->getPropertyPath()); + } + + public function testValidatorEnabledTermsVersionPublicationDateChangeFromNull(): void + { + $date = new \DateTime(); + + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setPublicationDate($date); + + $violations = $this->validate($model); + + $this->assertCount(1, $violations); + $this->assertSame('The publication date cannot be changed when the version is published.', $violations[0]->getMessage()); + $this->assertSame('publicationDate', $violations[0]->getPropertyPath()); + } +} diff --git a/tests/Infrastructure/ValidatorConstraints/CantTitleChangeIfTermsPublishedTest.php b/tests/Infrastructure/ValidatorConstraints/CantTitleChangeIfTermsPublishedTest.php new file mode 100644 index 0000000..ef77840 --- /dev/null +++ b/tests/Infrastructure/ValidatorConstraints/CantTitleChangeIfTermsPublishedTest.php @@ -0,0 +1,86 @@ +assertSame('class', $this->validator->getTargets()); + } + + public function testValidatedBy(): void + { + $this->assertSame(CantTitleChangeIfTermsPublished::class, $this->validator->validatedBy()); + } + + public function testValidatorWithBadClass(): void + { + $violations = $this->validate(new DummyUser()); + $this->assertEmpty($violations); + } + + public function testValidatorNotEnabledTermsVersion(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setTitle('Old title'); + + $model = new TermsEdition($termsVersion); + $model->setTitle('New title'); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorEnabledTermsVersionTitleNotChange(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setTitle('Old title'); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setTitle('Old title'); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorEnabledTermsVersionTitleChange(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + $termsVersion->setTitle('Old title'); + $termsVersion->enable(); + + $model = new TermsEdition($termsVersion); + $model->setTitle('New title'); + + $violations = $this->validate($model); + + $this->assertCount(1, $violations); + $this->assertSame('The title cannot be changed when the version is published.', $violations[0]->getMessage()); + $this->assertSame('title', $violations[0]->getPropertyPath()); + } +} diff --git a/tests/Infrastructure/ValidatorConstraints/CantUnpublishLockedPublishedTermsTest.php b/tests/Infrastructure/ValidatorConstraints/CantUnpublishLockedPublishedTermsTest.php new file mode 100644 index 0000000..5b6a079 --- /dev/null +++ b/tests/Infrastructure/ValidatorConstraints/CantUnpublishLockedPublishedTermsTest.php @@ -0,0 +1,114 @@ +assertSame('class', $this->validator->getTargets()); + } + + public function testValidatedBy(): void + { + $this->assertSame(CantUnpublishLockedPublishedTerms::class, $this->validator->validatedBy()); + } + + public function testValidatorWithBadClass(): void + { + $violations = $this->validate(new DummyUser()); + $this->assertEmpty($violations); + } + + public function testValidatorTermsAlwaysPublished(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + + $model = new TermsEdition($termsVersion); + $model->setIsTermsPublished(true); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorUnpublishedUnpublishedVersion(): void + { + $terms = new Terms(); + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + + $model = new TermsEdition($termsVersion); + $model->setIsTermsPublished(false); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorUnpublishedUnpublishedVersionLocked(): void + { + $terms = new Terms(); + $terms->setIsDepublicationLocked(true); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + + $model = new TermsEdition($termsVersion); + $model->setIsTermsPublished(false); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorUnpublishedPublishedVersion(): void + { + $terms = new Terms(); + $terms->setIsPublished(true); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + + $model = new TermsEdition($termsVersion); + $model->setIsTermsPublished(false); + + $violations = $this->validate($model); + $this->assertEmpty($violations); + } + + public function testValidatorUnpublishedPublishedVersionLocked(): void + { + $terms = new Terms(); + $terms->setIsPublished(true); + $terms->setIsDepublicationLocked(true); + + $termsVersion = new TermsVersion(); + $termsVersion->setTerms($terms); + + $model = new TermsEdition($termsVersion); + $model->setIsTermsPublished(false); + + $violations = $this->validate($model); + + $this->assertCount(1, $violations); + $this->assertSame('It is not possible to unpublish a locked terms.', $violations[0]->getMessage()); + $this->assertSame('isTermsPublished', $violations[0]->getPropertyPath()); + } +} diff --git a/tests/Resources/Controller/DummyAdminRoute.php b/tests/Resources/Controller/DummyAdminRoute.php new file mode 100644 index 0000000..bc39b31 --- /dev/null +++ b/tests/Resources/Controller/DummyAdminRoute.php @@ -0,0 +1,35 @@ + */ + protected $roles = []; + + /** @return array */ + protected function getAdminRoles(): array + { + return $this->roles; + } + + /** @param array $roles */ + public function setAdminRoles(array $roles): self + { + $this->roles = $roles; + + return $this; + } + + public function __invoke(): AccessDeniedException + { + return $this->buildAccessDeniedException(); + } +} diff --git a/tests/Resources/Controller/FrontRoute.php b/tests/Resources/Controller/FrontRoute.php new file mode 100644 index 0000000..220079f --- /dev/null +++ b/tests/Resources/Controller/FrontRoute.php @@ -0,0 +1,16 @@ +app_front'); + } +} diff --git a/tests/Resources/Controller/OtherFrontRoute.php b/tests/Resources/Controller/OtherFrontRoute.php new file mode 100644 index 0000000..930a64c --- /dev/null +++ b/tests/Resources/Controller/OtherFrontRoute.php @@ -0,0 +1,16 @@ +app_other_front'); + } +} diff --git a/tests/Resources/Controller/WithAccessRoute.php b/tests/Resources/Controller/WithAccessRoute.php new file mode 100644 index 0000000..815e7c6 --- /dev/null +++ b/tests/Resources/Controller/WithAccessRoute.php @@ -0,0 +1,19 @@ + + * + * @ORM\Column(type="array", nullable=false, name="roles") + */ + private $roles = []; + + public function getId(): ?int + { + return $this->id; + } + + public function getUsername(): string + { + return $this->username; + } + + /** @return array */ + public function getRoles(): array + { + return $this->roles; + } + + public function getPassword(): string + { + return ''; + } + + public function getSalt(): ?string + { + return null; + } + + public function eraseCredentials(): void + { + } +} diff --git a/tests/Resources/EventListener/Terms4SignedEventListener.php b/tests/Resources/EventListener/Terms4SignedEventListener.php new file mode 100644 index 0000000..c81c39e --- /dev/null +++ b/tests/Resources/EventListener/Terms4SignedEventListener.php @@ -0,0 +1,36 @@ +router = $router; + } + + public function __invoke(TermsSignedEvent $event): void + { + $tersmVersion = $event->getTermsVersion(); + $terms = $tersmVersion->getTerms(); + + if ($terms->getSlug() !== 'terms-4') { + return; + } + + $event->setResponse( + new RedirectResponse( + $this->router->generate('app_other_front') + ) + ); + } +} diff --git a/tests/Resources/Fixtures/DummyUserFixtures.php b/tests/Resources/Fixtures/DummyUserFixtures.php new file mode 100644 index 0000000..c3930c9 --- /dev/null +++ b/tests/Resources/Fixtures/DummyUserFixtures.php @@ -0,0 +1,35 @@ +createObject( + DummyUser::class, + self::USER, + [ + 'username' => 'my_user_1', + 'roles' => ['ROLE_USER'], + ] + ); + + $this->createObject( + DummyUser::class, + self::USER_ADMIN, + [ + 'username' => 'my_user_2', + 'roles' => ['ROLE_USER', 'ROLE_ADMIN'], + ] + ); + } +} diff --git a/tests/Resources/Fixtures/TermsFixtures.php b/tests/Resources/Fixtures/TermsFixtures.php new file mode 100644 index 0000000..e59f1e3 --- /dev/null +++ b/tests/Resources/Fixtures/TermsFixtures.php @@ -0,0 +1,69 @@ +createObject( + Terms::class, + '1', + [ + 'slug' => 'terms-1', + 'name' => 'Terms 1', + 'isPublished' => true, + 'isDepublicationLocked' => true, + ] + ); + + $this->createObject( + Terms::class, + '2', + [ + 'slug' => 'terms-2', + 'name' => 'Terms 2', + 'isPublished' => false, + 'isDepublicationLocked' => false, + ] + ); + + $this->createObject( + Terms::class, + '3', + [ + 'slug' => 'terms-3', + 'name' => 'Terms 3', + 'isPublished' => true, + 'isDepublicationLocked' => false, + ] + ); + + $this->createObject( + Terms::class, + '4', + [ + 'slug' => 'terms-4', + 'name' => 'Terms 4', + 'isPublished' => true, + 'isDepublicationLocked' => false, + ] + ); + + $this->createObject( + Terms::class, + '5', + [ + 'slug' => 'terms-5', + 'name' => 'Terms 5', + 'isPublished' => true, + 'isDepublicationLocked' => false, + ] + ); + } +} diff --git a/tests/Resources/Fixtures/TermsVersionFixtures.php b/tests/Resources/Fixtures/TermsVersionFixtures.php new file mode 100644 index 0000000..c4840e4 --- /dev/null +++ b/tests/Resources/Fixtures/TermsVersionFixtures.php @@ -0,0 +1,111 @@ +getReference(Terms::class, '1'); + $terms4 = $this->getReference(Terms::class, '4'); + $terms5 = $this->getReference(Terms::class, '5'); + + $this->createObject( + TermsVersion::class, + 'v1-terms-1', + [ + 'version' => 1, + 'isEnabled' => true, + 'title' => 'Title Version 1', + 'content' => 'Content Version 1', + 'terms' => $terms1, + ] + ); + + $this->createObject( + TermsVersion::class, + 'v2-terms-1', + [ + 'version' => 2, + 'isEnabled' => true, + 'title' => 'Title Version 2', + 'content' => 'Content Version 2', + 'terms' => $terms1, + ] + ); + + $this->createObject( + TermsVersion::class, + 'v3-terms-1', + [ + 'version' => 3, + 'isEnabled' => true, + 'title' => 'Title Version 3', + 'content' => 'Content Version 3', + 'terms' => $terms1, + ] + ); + + $this->createObject( + TermsVersion::class, + 'v4-terms-1', + [ + 'version' => 4, + 'isEnabled' => false, + 'title' => 'Title Version 4', + 'content' => 'Content Version 4', + 'terms' => $terms1, + ] + ); + + $this->createObject( + TermsVersion::class, + 'v1-terms-4', + [ + 'version' => 1, + 'isEnabled' => true, + 'title' => 'Title Version 1', + 'content' => 'Content Version 1', + 'terms' => $terms4, + ] + ); + + $this->createObject( + TermsVersion::class, + 'v1-terms-5', + [ + 'version' => 1, + 'isEnabled' => true, + 'title' => 'Title Version 1', + 'content' => 'Content Version 1', + 'terms' => $terms5, + ] + ); + + $this->createObject( + TermsVersion::class, + 'v2-terms-5', + [ + 'version' => 2, + 'isEnabled' => false, + 'title' => 'Title Version 2', + 'content' => 'Content Version 2', + 'terms' => $terms5, + ] + ); + } + + public function getDependencies(): array + { + return [ + TermsFixtures::class, + ]; + } +} diff --git a/tests/Resources/Fixtures/TermsVersionSignatureFixtures.php b/tests/Resources/Fixtures/TermsVersionSignatureFixtures.php new file mode 100644 index 0000000..4bc04ab --- /dev/null +++ b/tests/Resources/Fixtures/TermsVersionSignatureFixtures.php @@ -0,0 +1,82 @@ +getReference(TermsVersion::class, 'v1-terms-1'); + $termsVersion2 = $this->getReference(TermsVersion::class, 'v2-terms-1'); + $termsVersion3 = $this->getReference(TermsVersion::class, 'v3-terms-1'); + + $this->createObject( + TermsVersionSignature::class, + 'u42-signature-v1-terms-1', + [ + 'date' => new \DateTime(), + 'subjectType' => 'user', + 'subjectIdentifier' => '42', + 'version' => $termsVersion1, + ] + ); + + $this->createObject( + TermsVersionSignature::class, + 'u42-signature-v2-terms-1', + [ + 'date' => new \DateTime(), + 'subjectType' => 'user', + 'subjectIdentifier' => '42', + 'version' => $termsVersion2, + ] + ); + + $this->createObject( + TermsVersionSignature::class, + 'u43-signature-v1-terms-1', + [ + 'date' => new \DateTime(), + 'subjectType' => 'user', + 'subjectIdentifier' => '43', + 'version' => $termsVersion1, + ] + ); + + $this->createObject( + TermsVersionSignature::class, + 'u43-signature-v2-terms-1', + [ + 'date' => new \DateTime(), + 'subjectType' => 'user', + 'subjectIdentifier' => '43', + 'version' => $termsVersion2, + ] + ); + + $this->createObject( + TermsVersionSignature::class, + 'u43-signature-v3-terms-1', + [ + 'date' => new \DateTime(), + 'subjectType' => 'user', + 'subjectIdentifier' => '43', + 'version' => $termsVersion3, + ] + ); + } + + public function getDependencies(): array + { + return [ + TermsVersionFixtures::class, + ]; + } +} diff --git a/tests/Resources/Guard/Terms5Guard.php b/tests/Resources/Guard/Terms5Guard.php new file mode 100644 index 0000000..4555681 --- /dev/null +++ b/tests/Resources/Guard/Terms5Guard.php @@ -0,0 +1,35 @@ +security = $security; + } + + public function supports(string $slug, string $subjectType, string $subjectIdentifier): bool + { + return $slug === 'terms-5'; + } + + public function check(string $slug, string $subjectType, string $subjectIdentifier): bool + { + $user = $this->security->getUser(); + + if ($user === null || $subjectType !== 'user') { + return false; + } + + return $subjectIdentifier === (string) $user->getUsername(); + } +} diff --git a/tests/Resources/Kernel/TestKernel.php b/tests/Resources/Kernel/TestKernel.php index 5596203..9d7eb89 100755 --- a/tests/Resources/Kernel/TestKernel.php +++ b/tests/Resources/Kernel/TestKernel.php @@ -2,21 +2,15 @@ declare(strict_types=1); -namespace RichId\TermsModuleBundle\tests\Resources\Kernel; +namespace RichId\TermsModuleBundle\Tests\Resources\Kernel; use RichCongress\WebTestBundle\Kernel\DefaultTestKernel; -/** - * Class TestKernel. - * - * @author Nicolas Guilloux - * @copyright 2014 - 2021 RichID (https://www.rich-id.fr) - */ -class TestKernel extends DefaultTestKernel +final class TestKernel extends DefaultTestKernel { public function __construct() { - parent::__construct('test', false); + parent::__construct('test', true); } public function getConfigurationDir(): ?string diff --git a/tests/Resources/Kernel/bin/console b/tests/Resources/Kernel/bin/console index 5d7eca8..371d6b9 100755 --- a/tests/Resources/Kernel/bin/console +++ b/tests/Resources/Kernel/bin/console @@ -1,10 +1,9 @@ #!/usr/bin/env php ['all' => true], + Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], + RichCongress\RecurrentFixturesTestBundle\RichCongressRecurrentFixturesTestBundle::class => ['all' => true], + RichId\TermsModuleBundle\Infrastructure\RichIdTermsModuleBundle::class => ['all' => true], + FOS\CKEditorBundle\FOSCKEditorBundle::class => ['all' => true], ]; diff --git a/tests/Resources/Kernel/config/packages/doctrine.yaml b/tests/Resources/Kernel/config/packages/doctrine.yaml index a79f4d3..16be7d0 100644 --- a/tests/Resources/Kernel/config/packages/doctrine.yaml +++ b/tests/Resources/Kernel/config/packages/doctrine.yaml @@ -1,7 +1,54 @@ doctrine: dbal: - driver: pdo_sqlite - user: test - path: '%kernel.cache_dir%/__DBNAME__.db' - url: null - memory: true + default_connection: default + connections: + default: + driver: pdo_sqlite + user: test + path: '%kernel.cache_dir%/__DBNAME__.db' + url: null + memory: true + empty_database: + driver: pdo_sqlite + user: test + path: '%kernel.cache_dir%/__DBNAME___empty.db' + url: null + memory: true + orm: + auto_generate_proxy_classes: '%kernel.debug%' + default_entity_manager: default + entity_managers: + default: + naming_strategy: doctrine.orm.naming_strategy.underscore + auto_mapping: true + connection: default + mappings: + App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Domain/Entity' + prefix: 'RichId\TermsModuleBundle\Domain\Entity' + alias: App + Test: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/tests/Resources/Entity' + prefix: 'RichId\TermsModuleBundle\Tests\Resources\Entity' + alias: Test + empty_database: + connection: empty_database + naming_strategy: doctrine.orm.naming_strategy.underscore + auto_mapping: false + mappings: + App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Domain/Entity' + prefix: 'RichId\TermsModuleBundle\Domain\Entity' + alias: App + Test: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/tests/Resources/Entity' + prefix: 'RichId\TermsModuleBundle\Tests\Resources\Entity' + alias: Test diff --git a/tests/Resources/Kernel/config/packages/framework.yaml b/tests/Resources/Kernel/config/packages/framework.yaml index f76cc2e..82e2e6e 100644 --- a/tests/Resources/Kernel/config/packages/framework.yaml +++ b/tests/Resources/Kernel/config/packages/framework.yaml @@ -1,2 +1,6 @@ framework: test: true + session: + handler_id: session.handler.native_file + storage_id: session.storage.mock_file + save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%' diff --git a/tests/Resources/Kernel/config/packages/rich_id_terms_module.yaml b/tests/Resources/Kernel/config/packages/rich_id_terms_module.yaml new file mode 100644 index 0000000..6520404 --- /dev/null +++ b/tests/Resources/Kernel/config/packages/rich_id_terms_module.yaml @@ -0,0 +1,6 @@ +rich_id_terms_module: + admin_roles: [ ROLE_ADMIN ] + default_redirection_routes: + acceptation: app_acceptation_front + refusal: app_refusal_front + ignore: app_ignore_front diff --git a/tests/Resources/Kernel/config/packages/security.yaml b/tests/Resources/Kernel/config/packages/security.yaml new file mode 100644 index 0000000..579dd9e --- /dev/null +++ b/tests/Resources/Kernel/config/packages/security.yaml @@ -0,0 +1,16 @@ +security: + providers: + database: + entity: + class: RichId\TermsModuleBundle\Tests\Resources\Entity\DummyUser + property: username + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + main: + anonymous: ~ + http_basic: ~ + pattern: ^/ + provider: database + stateless: false diff --git a/tests/Resources/Kernel/config/routes.yaml b/tests/Resources/Kernel/config/routes.yaml new file mode 100644 index 0000000..6156d25 --- /dev/null +++ b/tests/Resources/Kernel/config/routes.yaml @@ -0,0 +1,35 @@ +app_front: + controller: RichId\TermsModuleBundle\Tests\Resources\Controller\FrontRoute + methods: GET + path: / + +app_acceptation_front: + controller: RichId\TermsModuleBundle\Tests\Resources\Controller\FrontRoute + methods: GET + path: /acceptation + +app_refusal_front: + controller: RichId\TermsModuleBundle\Tests\Resources\Controller\FrontRoute + methods: GET + path: /refusal + +app_ignore_front: + controller: RichId\TermsModuleBundle\Tests\Resources\Controller\FrontRoute + methods: GET + path: /ignore + +app_other_front: + controller: RichId\TermsModuleBundle\Tests\Resources\Controller\OtherFrontRoute + methods: GET + path: /other + +app_with_access_front: + controller: RichId\TermsModuleBundle\Tests\Resources\Controller\WithAccessRoute + methods: GET + path: /with-access + + +app_with_exception_front: + controller: RichId\TermsModuleBundle\Tests\Resources\Controller\WithExceptionRoute + methods: GET + path: /with-exception diff --git a/tests/Resources/Kernel/config/routes/rich_id_terms_module.yaml b/tests/Resources/Kernel/config/routes/rich_id_terms_module.yaml new file mode 100644 index 0000000..f8f1605 --- /dev/null +++ b/tests/Resources/Kernel/config/routes/rich_id_terms_module.yaml @@ -0,0 +1,2 @@ +rich_id_terms_module: + resource: "@RichIdTermsModuleBundle/Resources/config/routing/routing.xml" diff --git a/tests/Resources/Kernel/config/services.yaml b/tests/Resources/Kernel/config/services.yaml index 3263c28..4440336 100755 --- a/tests/Resources/Kernel/config/services.yaml +++ b/tests/Resources/Kernel/config/services.yaml @@ -3,3 +3,35 @@ services: autoconfigure: true autowire: true public: true + + RichId\TermsModuleBundle\Domain\UseCase\HasSignedLastTermsVersion: ~ + RichId\TermsModuleBundle\Domain\UseCase\HasSignedTerms: ~ + + RichId\TermsModuleBundle\Infrastructure\Adapter\EntityRemover: ~ + RichId\TermsModuleBundle\Infrastructure\Adapter\TermsVersionRepository: ~ + RichId\TermsModuleBundle\Infrastructure\FormType\TermsVersionFormType: ~ + RichId\TermsModuleBundle\Infrastructure\TwigExtension\TermsExtension: ~ + + RichId\TermsModuleBundle\Tests\Resources\Controller\FrontRoute: ~ + RichId\TermsModuleBundle\Tests\Resources\Controller\OtherFrontRoute: ~ + RichId\TermsModuleBundle\Tests\Resources\Controller\WithAccessRoute: ~ + RichId\TermsModuleBundle\Tests\Resources\Controller\WithExceptionRoute: ~ + + RichId\TermsModuleBundle\Tests\Resources\Stubs\EntityManagerStub: ~ + RichId\TermsModuleBundle\Tests\Resources\Stubs\EventDispatcherStub: ~ + RichId\TermsModuleBundle\Tests\Resources\Stubs\LoggerStub: ~ + RichId\TermsModuleBundle\Tests\Resources\Stubs\ValidationContextStub: ~ + + RichId\TermsModuleBundle\Tests\Resources\EventListener\Terms4SignedEventListener: + tags: + - { name: 'kernel.event_listener', event: RichId\TermsModuleBundle\Domain\Event\TermsSignedEvent } + + RichId\TermsModuleBundle\Tests\Resources\Fixtures\DummyUserFixtures: ~ + RichId\TermsModuleBundle\Tests\Resources\Fixtures\TermsFixtures: ~ + RichId\TermsModuleBundle\Tests\Resources\Fixtures\TermsVersionFixtures: ~ + RichId\TermsModuleBundle\Tests\Resources\Fixtures\TermsVersionSignatureFixtures: ~ + + RichId\TermsModuleBundle\Infrastructure\SecurityVoter\TermsGuardVoter: ~ + RichId\TermsModuleBundle\Infrastructure\SecurityVoter\UserVoter: ~ + + RichId\TermsModuleBundle\Tests\Resources\Guard\Terms5Guard: ~ diff --git a/tests/Resources/Stubs/EntityManagerStub.php b/tests/Resources/Stubs/EntityManagerStub.php new file mode 100644 index 0000000..1998336 --- /dev/null +++ b/tests/Resources/Stubs/EntityManagerStub.php @@ -0,0 +1,240 @@ + */ + public static $overridenServices = EntityManagerInterface::class; + + /** @var array */ + protected $persistedEntities = []; + + /** @var array */ + protected $removedEntities = []; + + /** @var EntityManagerInterface */ + protected $innerService; + + public function getRepository($className) + { + return $this->innerService->getRepository($className); + } + + public function getCache() + { + return $this->innerService->getCache(); + } + + public function getConnection() + { + return $this->innerService->getConnection(); + } + + public function getExpressionBuilder() + { + return $this->innerService->getExpressionBuilder(); + } + + public function beginTransaction(): void + { + $this->innerService->beginTransaction(); + } + + public function transactional($func) + { + return $this->innerService->transactional($func); + } + + public function commit(): void + { + $this->innerService->commit(); + } + + public function rollback(): void + { + $this->innerService->rollback(); + } + + public function createQuery($dql = '') + { + return $this->innerService->createQuery($dql); + } + + public function createNamedQuery($name) + { + return $this->innerService->createNamedQuery($name); + } + + public function createNativeQuery($sql, ResultSetMapping $rsm) + { + return $this->innerService->createNativeQuery($sql, $rsm); + } + + public function createNamedNativeQuery($name) + { + return $this->innerService->createNamedNativeQuery($name); + } + + public function createQueryBuilder() + { + return $this->innerService->createQueryBuilder(); + } + + public function getReference($entityName, $id) + { + return $this->innerService->getReference($entityName, $id); + } + + public function getPartialReference($entityName, $identifier) + { + return $this->innerService->getPartialReference($entityName, $identifier); + } + + public function close(): void + { + $this->innerService->close(); + } + + public function copy($entity, $deep = false) + { + return $this->innerService->copy($entity, $deep); + } + + public function lock($entity, $lockMode, $lockVersion = null): void + { + $this->innerService->lock($entity, $lockMode, $lockVersion); + } + + public function getEventManager() + { + return $this->innerService->getEventManager(); + } + + public function getConfiguration() + { + return $this->innerService->getConfiguration(); + } + + public function isOpen() + { + return $this->innerService->isOpen(); + } + + public function getUnitOfWork() + { + return $this->innerService->getUnitOfWork(); + } + + public function getHydrator($hydrationMode) + { + return $this->innerService->getHydrator($hydrationMode); + } + + public function newHydrator($hydrationMode) + { + return $this->innerService->newHydrator($hydrationMode); + } + + public function getProxyFactory() + { + return $this->innerService->getProxyFactory(); + } + + public function getFilters() + { + return $this->innerService->getFilters(); + } + + public function isFiltersStateClean() + { + return $this->innerService->isFiltersStateClean(); + } + + public function hasFilters() + { + return $this->innerService->hasFilters(); + } + + public function getClassMetadata($className) + { + /* @phpstan-ignore-next-line */ + return $this->innerService->getClassMetadata($className); + } + + public function find($className, $id) + { + return $this->innerService->find($className, $id); + } + + public function persist($object): void + { + $this->persistedEntities[] = $object; + $this->innerService->persist($object); + } + + public function remove($object): void + { + $this->removedEntities[] = $object; + $this->innerService->remove($object); + } + + public function merge($object) + { + return $this->innerService->merge($object); + } + + public function clear($objectName = null): void + { + $this->innerService->clear($objectName); + } + + public function detach($object): void + { + $this->innerService->detach($object); + } + + public function refresh($object): void + { + $this->innerService->refresh($object); + } + + public function flush(): void + { + $this->innerService->flush(); + } + + public function initializeObject($obj): void + { + $this->innerService->initializeObject($obj); + } + + public function contains($object) + { + return $this->innerService->contains($object); + } + + public function getMetadataFactory() + { + /* @phpstan-ignore-next-line */ + return $this->innerService->getMetadataFactory(); + } + + /** @return array */ + public function getPersistedEntities(): array + { + return $this->persistedEntities; + } + + /** @return array */ + public function getRemovedEntities(): array + { + return $this->removedEntities; + } +} diff --git a/tests/Resources/Stubs/EventDispatcherStub.php b/tests/Resources/Stubs/EventDispatcherStub.php new file mode 100644 index 0000000..1589a94 --- /dev/null +++ b/tests/Resources/Stubs/EventDispatcherStub.php @@ -0,0 +1,31 @@ + */ + public static $overridenServices = EventDispatcherInterface::class; + + /** @var array */ + protected $events = []; + + public function dispatch($event, string $eventName = null): object + { + $this->events[] = $event; + + /* @phpstan-ignore-next-line */ + return $this->innerService->dispatch($event, $eventName); + } + + /** @return array */ + public function getEvents(): array + { + return $this->events; + } +} diff --git a/tests/Resources/Stubs/LoggerStub.php b/tests/Resources/Stubs/LoggerStub.php new file mode 100644 index 0000000..1a2de3c --- /dev/null +++ b/tests/Resources/Stubs/LoggerStub.php @@ -0,0 +1,71 @@ + */ + public static $overridenServices = LoggerInterface::class; + + /** @var array */ + protected $logs = []; + + public function emergency($message, array $context = []): void + { + $this->log('emergency', $message, $context); + } + + public function alert($message, array $context = []): void + { + $this->log('alert', $message, $context); + } + + public function critical($message, array $context = []): void + { + $this->log('critical', $message, $context); + } + + public function error($message, array $context = []): void + { + $this->log('error', $message, $context); + } + + public function warning($message, array $context = []): void + { + $this->log('warning', $message, $context); + } + + public function notice($message, array $context = []): void + { + $this->log('notice', $message, $context); + } + + public function info($message, array $context = []): void + { + $this->log('info', $message, $context); + } + + public function debug($message, array $context = []): void + { + $this->log('debug', $message, $context); + } + + public function log($level, $message, array $context = []): void + { + $this->logs[] = [$level, $message, $context]; + + /* @phpstan-ignore-next-line */ + $this->innerService->log($level, $message, $context); + } + + /** @return array */ + public function getLogs(): array + { + return $this->logs; + } +} diff --git a/tests/Resources/Stubs/ValidationContextStub.php b/tests/Resources/Stubs/ValidationContextStub.php new file mode 100644 index 0000000..9538e53 --- /dev/null +++ b/tests/Resources/Stubs/ValidationContextStub.php @@ -0,0 +1,25 @@ +getValidator(); + + parent::__construct($validator, '', $translator); + } + + public function countViolations(): int + { + return $this->getViolations()->count(); + } +} diff --git a/tests/Resources/TestCase/ConstraintTestCase.php b/tests/Resources/TestCase/ConstraintTestCase.php new file mode 100644 index 0000000..6a91b5a --- /dev/null +++ b/tests/Resources/TestCase/ConstraintTestCase.php @@ -0,0 +1,41 @@ +context->setConstraint($this->validator); /* @phpstan-ignore-line */ + $this->validator->initialize($this->context); /* @phpstan-ignore-line */ + } + + /** + * @param mixed $value + * @param mixed|null $object + * + * @return ConstraintViolationListInterface + */ + public function validate($value, $object = null): ConstraintViolationListInterface + { + $this->context->setNode($value, $object, null, ''); + $violations = $this->validator->validate($value, $this->validator); /* @phpstan-ignore-line */ + + return $violations ?? $this->context->getViolations(); + } +} diff --git a/tests/UserInterface/Controller/AddTermsVersionRouteTest.php b/tests/UserInterface/Controller/AddTermsVersionRouteTest.php new file mode 100644 index 0000000..eca9a75 --- /dev/null +++ b/tests/UserInterface/Controller/AddTermsVersionRouteTest.php @@ -0,0 +1,211 @@ +getReference(Terms::class, '4'); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d/new-version', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + } + + public function testRouteBadRole(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '4'); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d/new-version', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_FORBIDDEN, $response->getStatusCode()); + } + + public function testRouteWithoutVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '2'); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d/new-version', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + $this->assertStringContainsString('The terms has no version.', $content); + } + + public function testRouteSpecificVersionNotFound(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '4'); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d/new-version?version=42', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + $this->assertStringContainsString('No terms version found with version 42', $content); + } + + public function testRouteLastVersionIsNotActive(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '5'); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d/new-version', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + $this->assertStringContainsString('Cannot add new version to the terms terms-5.', $content); + } + + public function testRouteSuccess(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '5'); + $termsVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + + $termsVersion->enable(); + $this->getManager()->persist($termsVersion); + $this->getManager()->flush(); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d/new-version', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_CREATED, $response->getStatusCode()); + + $this->assertCount(1, $this->entityManagerStub->getPersistedEntities()); + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + + $this->assertInstanceOf(TermsVersionCreatedEvent::class, $event); + + $newTermsVersion = $event->getTermsVersion(); + + $this->assertInstanceOf(TermsVersion::class, $event->getTermsVersion()); + $this->assertNotNull($newTermsVersion->getId()); + $this->assertSame('Title Version 2', $newTermsVersion->getTitle()); + $this->assertSame('Content Version 2', $newTermsVersion->getCOntent()); + $this->assertSame(3, $newTermsVersion->getVersion()); + $this->assertSame('terms-5', $newTermsVersion->getTerms()->getSlug()); + $this->assertNull($newTermsVersion->getPublicationDate()); + $this->assertFalse($newTermsVersion->isEnabled()); + } + + public function testRouteSuccessWithSpecificVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '5'); + $termsVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + + $termsVersion->enable(); + $this->getManager()->persist($termsVersion); + $this->getManager()->flush(); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d/new-version?version=1', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_CREATED, $response->getStatusCode()); + + $this->assertCount(1, $this->entityManagerStub->getPersistedEntities()); + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + + $this->assertInstanceOf(TermsVersionCreatedEvent::class, $event); + + $newTermsVersion = $event->getTermsVersion(); + + $this->assertInstanceOf(TermsVersion::class, $event->getTermsVersion()); + $this->assertNotNull($newTermsVersion->getId()); + $this->assertSame('Title Version 1', $newTermsVersion->getTitle()); + $this->assertSame('Content Version 1', $newTermsVersion->getCOntent()); + $this->assertSame(3, $newTermsVersion->getVersion()); + $this->assertSame('terms-5', $newTermsVersion->getTerms()->getSlug()); + $this->assertNull($newTermsVersion->getPublicationDate()); + $this->assertFalse($newTermsVersion->isEnabled()); + } +} diff --git a/tests/UserInterface/Controller/AdminRouteTraitTest.php b/tests/UserInterface/Controller/AdminRouteTraitTest.php new file mode 100644 index 0000000..1542148 --- /dev/null +++ b/tests/UserInterface/Controller/AdminRouteTraitTest.php @@ -0,0 +1,53 @@ +route = new DummyAdminRoute(); + } + + public function testBuildAccessDeniedExceptionWithoutRoles(): void + { + $exception = ($this->route)(); + + $this->assertInstanceOf(AccessDeniedException::class, $exception); + $this->assertSame('You must define one or more roles in the configuration.', $exception->getMessage()); + } + + public function testBuildAccessDeniedExceptionWithOneRole(): void + { + $this->route->setAdminRoles(['ROLE_ADMIN']); + + $exception = ($this->route)(); + + $this->assertInstanceOf(AccessDeniedException::class, $exception); + $this->assertSame('Only the "ROLE_ADMIN" role is allowed to access the back office.', $exception->getMessage()); + } + + public function testBuildAccessDeniedExceptionWithMultipleRole(): void + { + $this->route->setAdminRoles(['ROLE_ADMIN', 'ROLE_SUPER_ADMIN']); + + $exception = ($this->route)(); + + $this->assertInstanceOf(AccessDeniedException::class, $exception); + $this->assertSame('Only the "ROLE_ADMIN, ROLE_SUPER_ADMIN" roles are allowed to access the back office.', $exception->getMessage()); + } +} diff --git a/tests/UserInterface/Controller/EditAdminRouteTest.php b/tests/UserInterface/Controller/EditAdminRouteTest.php new file mode 100644 index 0000000..17ac656 --- /dev/null +++ b/tests/UserInterface/Controller/EditAdminRouteTest.php @@ -0,0 +1,497 @@ +getReference(Terms::class, '1'); + + $response = $this->getClient() + ->get( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + } + + public function testRouteBadRole(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '1'); + + $response = $this->getClient() + ->get( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_FORBIDDEN, $response->getStatusCode()); + } + + public function testRouteSpecificVersionNotFound(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '1'); + + $response = $this->getClient() + ->get( + \sprintf( + '/administration/terms/%d?version=999', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + $this->assertStringContainsString('No terms version found with version 999', $content); + } + + public function testRouteTermsWithoutVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '2'); + + $response = $this->getClient() + ->get( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms management', $content); + $this->assertStringContainsString('Terms 2', $content); + $this->assertStringContainsString('V. 1', $content); + + $this->assertStringNotContainsString('V. 2', $content); + $this->assertStringNotContainsString('Duplicate', $content); + $this->assertStringNotContainsString('New version', $content); + $this->assertStringNotContainsString('icon-trash', $content); + $this->assertStringNotContainsString('Active', $content); + } + + public function testRouteTermsWithMultipleVersionLastVersionNotActive(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '1'); + + $response = $this->getClient() + ->get( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms management', $content); + $this->assertStringContainsString('Terms 1', $content); + $this->assertStringContainsString('V. 1', $content); + $this->assertStringContainsString('V. 2', $content); + $this->assertStringContainsString('V. 3', $content); + $this->assertStringContainsString('V. 4', $content); + $this->assertStringContainsString('icon-trash', $content); + $this->assertStringContainsString('Active', $content); + + $this->assertStringContainsString('Title Version 4', $content); + $this->assertStringContainsString('Content Version 4', $content); + + $this->assertStringNotContainsString('V. 5', $content); + $this->assertStringNotContainsString('Duplicate', $content); + $this->assertStringNotContainsString('New version', $content); + } + + public function testRouteTermsLastVersionActive(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $termVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + $termVersion->enable(); + + $this->getManager()->persist($termVersion); + $this->getManager()->flush(); + + $terms = $this->getReference(Terms::class, '5'); + + $response = $this->getClient() + ->get( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms management', $content); + $this->assertStringContainsString('Terms 5', $content); + $this->assertStringContainsString('V. 1', $content); + $this->assertStringContainsString('V. 2', $content); + $this->assertStringContainsString('New version', $content); + + $this->assertStringContainsString('Title Version 2', $content); + $this->assertStringContainsString('Content Version 2', $content); + + $this->assertStringNotContainsString('V. 3', $content); + $this->assertStringNotContainsString('Duplicate', $content); + $this->assertStringNotContainsString('icon-trash', $content); + $this->assertStringNotContainsString('Active', $content); + } + + public function testRouteTermsLastVersionActiveAndSpecificVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $termVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + $termVersion->enable(); + + $this->getManager()->persist($termVersion); + $this->getManager()->flush(); + + $terms = $this->getReference(Terms::class, '5'); + + $response = $this->getClient() + ->get( + \sprintf( + '/administration/terms/%d?version=1', + $terms->getId() + ) + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms management', $content); + $this->assertStringContainsString('Terms 5', $content); + $this->assertStringContainsString('V. 1', $content); + $this->assertStringContainsString('V. 2', $content); + $this->assertStringContainsString('Duplicate', $content); + + $this->assertStringContainsString('Title Version 1', $content); + $this->assertStringContainsString('Content Version 1', $content); + + $this->assertStringNotContainsString('V. 3', $content); + $this->assertStringNotContainsString('New version', $content); + $this->assertStringNotContainsString('icon-trash', $content); + $this->assertStringNotContainsString('Active', $content); + } + + public function testRoutePostTermsWithoutVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '2'); + $this->assertEmpty($terms->getVersions()); + $this->assertFalse($terms->isPublished()); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ), + [], + [ + 'terms_version_form' => [ + 'title' => 'New title', + 'content' => 'New content', + 'isTermsPublished' => '0', + 'publicationDate' => '', + 'needVersionActivation' => '', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ], + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/administration/terms/2', $response->headers->get('location')); + $this->assertFalse($terms->isPublished()); + $this->assertCount(1, $terms->getVersions()); + + $termsVersion = $terms->getVersions()->first(); + + $this->assertSame('New title', $termsVersion->getTitle()); + $this->assertSame('New content', $termsVersion->getContent()); + $this->assertSame(1, $termsVersion->getVersion()); + $this->assertNull($termsVersion->getPublicationDate()); + $this->assertFalse($termsVersion->isEnabled()); + } + + public function testRoutePostTermsWithoutVersionPublishTerms(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '2'); + $this->assertEmpty($terms->getVersions()); + $this->assertFalse($terms->isPublished()); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ), + [], + [ + 'terms_version_form' => [ + 'title' => 'New title', + 'content' => 'New content', + 'isTermsPublished' => '1', + 'publicationDate' => '', + 'needVersionActivation' => '', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ], + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/administration/terms/2', $response->headers->get('location')); + $this->assertTrue($terms->isPublished()); + $this->assertCount(1, $terms->getVersions()); + + $termsVersion = $terms->getVersions()->first(); + + $this->assertSame('New title', $termsVersion->getTitle()); + $this->assertSame('New content', $termsVersion->getContent()); + $this->assertSame(1, $termsVersion->getVersion()); + $this->assertNotNull($termsVersion->getPublicationDate()); + $this->assertTrue($termsVersion->isEnabled()); + } + + public function testRoutePostWithExit(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '2'); + $this->assertEmpty($terms->getVersions()); + $this->assertFalse($terms->isPublished()); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d?exit=1', + $terms->getId() + ), + [], + [ + 'terms_version_form' => [ + 'title' => 'New title', + 'content' => 'New content', + 'isTermsPublished' => '0', + 'publicationDate' => '', + 'needVersionActivation' => '', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ], + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/administration/terms', $response->headers->get('location')); + } + + public function testRoutePostChangeTitleContentPublicationDateOfEnabledVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '5'); + $termVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + $termVersion->enable(); + + $this->getManager()->persist($termVersion); + $this->getManager()->flush(); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ), + [], + [ + 'terms_version_form' => [ + 'title' => 'New title', + 'content' => 'New content', + 'isTermsPublished' => '1', + 'publicationDate' => '2020-01-01', + 'needVersionActivation' => '', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ], + ] + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('The title cannot be changed when the version is published.', $content); + $this->assertStringContainsString('The publication date cannot be changed when the version is published.', $content); + } + + public function testRoutePostUnpublishTermsLocked(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '1'); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ), + [], + [ + 'terms_version_form' => [ + 'title' => 'New title', + 'content' => 'New content', + 'isTermsPublished' => '0', + 'publicationDate' => '', + 'needVersionActivation' => '', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ], + ] + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('It is not possible to unpublish a locked terms.', $content); + } + + public function testRoutePostWithSpecificVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '1'); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d?version=1', + $terms->getId() + ), + [], + [ + 'terms_version_form' => [ + 'title' => 'Title Version 1', + 'content' => 'Content Version 1', + 'isTermsPublished' => '1', + 'publicationDate' => '', + 'needVersionActivation' => '', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ], + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/administration/terms/1?version=1', $response->headers->get('location')); + } + + public function testRoutePostActivateVersionAlreadyActivated(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '5'); + $termVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + $termVersion->enable(); + + $this->getManager()->persist($termVersion); + $this->getManager()->flush(); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ), + [], + [ + 'terms_version_form' => [ + 'title' => $termVersion->getTitle(), + 'content' => $termVersion->getContent(), + 'isTermsPublished' => '1', + 'publicationDate' => '', + 'needVersionActivation' => '1', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ], + ] + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + } + + public function testRoutePostActivateVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '5'); + $termVersion = $this->getReference(TermsVersion::class, 'v2-terms-5'); + + $response = $this->getClient() + ->post( + \sprintf( + '/administration/terms/%d', + $terms->getId() + ), + [], + [ + 'terms_version_form' => [ + 'title' => $termVersion->getTitle(), + 'content' => $termVersion->getContent(), + 'isTermsPublished' => '1', + 'publicationDate' => '', + 'needVersionActivation' => '1', + '_token' => $this->getCsrfToken(TermsVersionFormType::class), + ], + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + } +} diff --git a/tests/UserInterface/Controller/ListAdminRouteTest.php b/tests/UserInterface/Controller/ListAdminRouteTest.php new file mode 100644 index 0000000..803e8d7 --- /dev/null +++ b/tests/UserInterface/Controller/ListAdminRouteTest.php @@ -0,0 +1,49 @@ +getClient()->get('/administration/terms'); + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + } + + public function testRouteBadRole(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $response = $this->getClient()->get('/administration/terms'); + $this->assertSame(Response::HTTP_FORBIDDEN, $response->getStatusCode()); + } + + public function testRouteAsAdmin(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $response = $this->getClient()->get('/administration/terms'); + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms management', $content); + $this->assertStringContainsString('Terms 1', $content); + $this->assertStringContainsString('Terms 2', $content); + $this->assertStringContainsString('Terms 2', $content); + } +} diff --git a/tests/UserInterface/Controller/RemoveTermsVersionRouteTest.php b/tests/UserInterface/Controller/RemoveTermsVersionRouteTest.php new file mode 100644 index 0000000..67ae6a6 --- /dev/null +++ b/tests/UserInterface/Controller/RemoveTermsVersionRouteTest.php @@ -0,0 +1,136 @@ +getReference(TermsVersion::class, 'v4-terms-1'); + + $response = $this->getClient() + ->delete( + \sprintf( + '/administration/terms-version/%d', + $termsVersion->getId() + ) + ); + + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + } + + public function testRouteBadRole(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $termsVersion = $this->getReference(TermsVersion::class, 'v4-terms-1'); + + $response = $this->getClient() + ->delete( + \sprintf( + '/administration/terms-version/%d', + $termsVersion->getId() + ) + ); + + $this->assertSame(Response::HTTP_FORBIDDEN, $response->getStatusCode()); + } + + public function testRouteWithEnabledVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $termsVersion = $this->getReference(TermsVersion::class, 'v3-terms-1'); + + $response = $this->getClient() + ->delete( + \sprintf( + '/administration/terms-version/%d', + $termsVersion->getId() + ) + ); + + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + $this->assertStringContainsString('Version 3 of terms terms-1 cannot be deleted.', $content); + } + + public function testRouteRemoveFirstVersion(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $terms = $this->getReference(Terms::class, '2'); + + $termsVersion = new TermsVersion(); + $termsVersion->setVersion(1); + $termsVersion->setTerms($terms); + $termsVersion->setTitle('My title'); + $termsVersion->setContent('My content'); + + $this->getManager()->persist($termsVersion); + $this->getManager()->flush(); + + $response = $this->getClient() + ->delete( + \sprintf( + '/administration/terms-version/%d', + $termsVersion->getId() + ) + ); + + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + $this->assertStringContainsString('First version of terms terms-2 cannot be deleted.', $content); + } + + public function testRouteSuccess(): void + { + $this->assertCount(7, $this->termsVersionRepository->findAll()); + + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER_ADMIN); + $this->authenticateUser($user); + + $termsVersion = $this->getReference(TermsVersion::class, 'v4-terms-1'); + + $response = $this->getClient() + ->delete( + \sprintf( + '/administration/terms-version/%d', + $termsVersion->getId() + ) + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $this->assertCount(1, $this->entityManagerStub->getRemovedEntities()); + + // Skipped, waiting a correction in the test-framework + //$this->assertCount(6, $this->termsVersionRepository->findAll()); + } +} diff --git a/tests/UserInterface/Controller/SignRouteTest.php b/tests/UserInterface/Controller/SignRouteTest.php new file mode 100644 index 0000000..a3d2d52 --- /dev/null +++ b/tests/UserInterface/Controller/SignRouteTest.php @@ -0,0 +1,566 @@ +getClient() + ->get( + '/terms/terms-3/sign', + [ + 'identifier' => '42', + ] + ); + + $this->assertSame(Response::HTTP_BAD_REQUEST, $response->getStatusCode()); + $this->assertEmpty($this->loggerStub->getLogs()); + $this->assertEmpty($this->eventDispatcherStub->getEvents()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Query parameter type is missing.', $content); + } + + public function testRouteWithoutIdentifierParameter(): void + { + $response = $this->getClient() + ->get( + '/terms/terms-1/sign', + [ + 'type' => 'user', + ] + ); + + $this->assertSame(Response::HTTP_BAD_REQUEST, $response->getStatusCode()); + $this->assertEmpty($this->loggerStub->getLogs()); + $this->assertEmpty($this->eventDispatcherStub->getEvents()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Query parameter identifier is missing.', $content); + } + + public function testRouteWithTermsNotFound(): void + { + $response = $this->getClient() + ->get( + '/terms/terms-999/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ] + ); + + $this->assertSame(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + $this->assertEmpty($this->loggerStub->getLogs()); + $this->assertEmpty($this->eventDispatcherStub->getEvents()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Not found terms terms-999.', $content); + } + + public function testRouteWithTermsNotPublished(): void + { + $response = $this->getClient() + ->get( + '/terms/terms-2/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ] + ); + + $this->assertSame(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + $this->assertEmpty($this->loggerStub->getLogs()); + $this->assertEmpty($this->eventDispatcherStub->getEvents()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms terms-2 is not published.', $content); + } + + public function testRouteWithTermsWithoutPublishedVersion(): void + { + $response = $this->getClient() + ->get( + '/terms/terms-3/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ] + ); + + $this->assertSame(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + $this->assertEmpty($this->loggerStub->getLogs()); + $this->assertEmpty($this->eventDispatcherStub->getEvents()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms terms-3 hasn\'t published version.', $content); + } + + public function testRouteSubjectHasAlreadySignThisTerms(): void + { + $response = $this->getClient() + ->get( + '/terms/terms-1/sign', + [ + 'type' => 'user', + 'identifier' => '43', + ] + ); + + $this->assertSame(Response::HTTP_UNAUTHORIZED, $response->getStatusCode()); + $this->assertEmpty($this->loggerStub->getLogs()); + $this->assertEmpty($this->eventDispatcherStub->getEvents()); + } + + public function testRouteGuardInvalidNotAllowedSubjectType(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $response = $this->getClient() + ->get( + '/terms/terms-5/sign', + [ + 'type' => 'other', + 'identifier' => 'my_user_1', + ] + ); + + $this->assertSame(Response::HTTP_FORBIDDEN, $response->getStatusCode()); + } + + public function testRouteGuardInvalidNotAllowedSubjectIdentifier(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $response = $this->getClient() + ->get( + '/terms/terms-5/sign', + [ + 'type' => 'user', + 'identifier' => 'my_user_2', + ] + ); + + $this->assertSame(Response::HTTP_FORBIDDEN, $response->getStatusCode()); + } + + public function testRouteGuardValid(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $response = $this->getClient() + ->get( + '/terms/terms-5/sign', + [ + 'type' => 'user', + 'identifier' => 'my_user_1', + ] + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + } + + public function testRouteSubjectHasSignOldVersion(): void + { + $response = $this->getClient() + ->get( + '/terms/terms-1/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ] + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $this->assertEmpty($this->loggerStub->getLogs()); + $this->assertEmpty($this->eventDispatcherStub->getEvents()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms 1', $content); + $this->assertStringContainsString('Title Version 3', $content); + $this->assertStringContainsString('Content Version 3', $content); + $this->assertStringContainsString('I refuse', $content); + $this->assertStringContainsString('I agree', $content); + $this->assertStringContainsString('I prefer to answer later', $content); + $this->assertStringContainsString('New version!', $content); + } + + public function testRouteSubjectHasNotSignOldVersion(): void + { + $response = $this->getClient() + ->get( + '/terms/terms-1/sign', + [ + 'type' => 'user', + 'identifier' => '44', + ] + ); + + $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); + $this->assertEmpty($this->loggerStub->getLogs()); + $this->assertEmpty($this->eventDispatcherStub->getEvents()); + + $content = $response->getContent() !== false ? $response->getContent() : ''; + + $this->assertStringContainsString('Terms 1', $content); + $this->assertStringContainsString('Title Version 3', $content); + $this->assertStringContainsString('Content Version 3', $content); + $this->assertStringContainsString('I refuse', $content); + $this->assertStringContainsString('I agree', $content); + $this->assertStringContainsString('I prefer to answer later', $content); + $this->assertStringNotContainsString('New version !', $content); + } + + public function testRoutePostPreferAnswerLater(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $response = $this->getClient() + ->post( + '/terms/terms-1/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ], + [ + 'accepted' => '', + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/ignore', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I prefer to answer later.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(3, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertNull($event->isAccepted()); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + } + + public function testRoutePostRefuse(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $response = $this->getClient() + ->post( + '/terms/terms-1/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ], + [ + 'accepted' => 0, + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/refusal', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I refuse.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(3, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertFalse($event->isAccepted()); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + } + + public function testRoutePostAcceptation(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $response = $this->getClient() + ->post( + '/terms/terms-1/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ], + [ + 'accepted' => 1, + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/acceptation', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-1.', $log[1]); + $this->assertStringContainsString('Decision: I agree.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $event = $this->eventDispatcherStub->getEvents()[0]; + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(3, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertTrue($event->isAccepted()); + + $this->assertCount(6, $this->termsVersionSignatureRepository->findAll()); + } + + public function testRoutePostPreferAnswerLaterWithCustomRedirection(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $response = $this->getClient() + ->post( + '/terms/terms-4/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ], + [ + 'accepted' => '', + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/other', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-4.', $log[1]); + $this->assertStringContainsString('Decision: I prefer to answer later.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(1, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertNull($event->isAccepted()); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + } + + public function testRoutePostRefuseWithCustomRedirection(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $response = $this->getClient() + ->post( + '/terms/terms-4/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ], + [ + 'accepted' => 0, + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/other', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-4.', $log[1]); + $this->assertStringContainsString('Decision: I refuse.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(1, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertFalse($event->isAccepted()); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + } + + public function testRoutePostAcceptationWithCustomRedirection(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $this->assertCount(5, $this->termsVersionSignatureRepository->findAll()); + + $response = $this->getClient() + ->post( + '/terms/terms-4/sign', + [ + 'type' => 'user', + 'identifier' => '42', + ], + [ + 'accepted' => 1, + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + $this->assertSame('/other', $response->headers->get('location')); + + $this->assertCount(1, $this->loggerStub->getLogs()); + + $log = $this->loggerStub->getLogs()[0]; + $this->assertSame('info', $log[0]); + $this->assertStringContainsString('A decision has been made for the terms terms-4.', $log[1]); + $this->assertStringContainsString('Decision: I agree.', $log[1]); + $this->assertStringContainsString('Date: ', $log[1]); + $this->assertStringContainsString('User: my_user_1.', $log[1]); + + $this->assertCount(1, $this->eventDispatcherStub->getEvents()); + + $event = $this->eventDispatcherStub->getEvents()[0]; + + $this->assertInstanceOf(TermsSignedEvent::class, $event); + $this->assertSame(1, $event->getTermsVersion()->getVersion()); + $this->assertSame('user', $event->getSubject()->getTermsSubjectType()); + $this->assertSame('42', $event->getSubject()->getTermsSubjectIdentifier()); + $this->assertTrue($event->isAccepted()); + + $this->assertCount(6, $this->termsVersionSignatureRepository->findAll()); + } + + public function testRoutePostGuardNotAllowedSubjectType(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $response = $this->getClient() + ->post( + '/terms/terms-5/sign', + [ + 'type' => 'other', + 'identifier' => 'my_user_1', + ], + [ + 'accepted' => 1, + ] + ); + + $this->assertSame(Response::HTTP_FORBIDDEN, $response->getStatusCode()); + } + + public function testRoutePostGuardNotAllowedSubjectIdentifier(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $response = $this->getClient() + ->post( + '/terms/terms-5/sign', + [ + 'type' => 'user', + 'identifier' => 'my_user_2', + ], + [ + 'accepted' => 1, + ] + ); + + $this->assertSame(Response::HTTP_FORBIDDEN, $response->getStatusCode()); + } + + public function testRoutePostGuardValid(): void + { + $user = $this->getReference(DummyUser::class, DummyUserFixtures::USER); + $this->authenticateUser($user); + + $response = $this->getClient() + ->post( + '/terms/terms-5/sign', + [ + 'type' => 'user', + 'identifier' => 'my_user_1', + ], + [ + 'accepted' => 1, + ] + ); + + $this->assertSame(Response::HTTP_FOUND, $response->getStatusCode()); + } +}