From a35d7502cab96f48ce1733503797ecf23ae02b55 Mon Sep 17 00:00:00 2001 From: Daniel Siepmann Date: Thu, 16 Feb 2023 09:57:36 +0100 Subject: [PATCH] Add basic set of tests and cgl --- .php-cs-fixer.dist.php | 13 + composer.json | 8 +- composer.lock | 1970 ++++++++++++++++- phpunit.xml.dist | 27 + shell.nix | 14 + src/Wrapper/GitHubTypo3.php | 17 +- src/WrapperRegistry.php | 2 +- .../Unit/Wrapper/Assertions/GitHubTypo3.atom | 274 +++ tests/Unit/Wrapper/Fixtures/GitHubTypo3.atom | 690 ++++++ tests/Unit/Wrapper/GitHubTypo3Test.php | 75 + tests/Unit/WrapperRegistryTest.php | 77 + 11 files changed, 3158 insertions(+), 9 deletions(-) create mode 100644 .php-cs-fixer.dist.php create mode 100644 phpunit.xml.dist create mode 100644 tests/Unit/Wrapper/Assertions/GitHubTypo3.atom create mode 100644 tests/Unit/Wrapper/Fixtures/GitHubTypo3.atom create mode 100644 tests/Unit/Wrapper/GitHubTypo3Test.php create mode 100644 tests/Unit/WrapperRegistryTest.php diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 0000000..eded4d8 --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,13 @@ +in('src', 'tests'); + +$config = new PhpCsFixer\Config(); +return $config->setRules([ + '@PSR12' => true, + 'strict_param' => true, + 'array_syntax' => ['syntax' => 'short'], + ]) + ->setFinder($finder) +; + diff --git a/composer.json b/composer.json index abccbf1..b776f16 100644 --- a/composer.json +++ b/composer.json @@ -14,10 +14,16 @@ "DanielSiepmann\\FediverseFeedWrappers\\": "src/" } }, + "autoload-dev": { + "psr-4": { + "DanielSiepmann\\FediverseFeedWrappers\\Tests\\": "tests/" + } + }, "require": { "php": "8.2.*" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^10.0", + "friendsofphp/php-cs-fixer": "^3.14" } } diff --git a/composer.lock b/composer.lock index 65556a1..bfeecb2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,9 +4,470 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2aef4d3236548a7a62aa5313786cf46a", + "content-hash": "83517a77e0f61abacc8332b1d9565a72", "packages": [], "packages-dev": [ + { + "name": "composer/pcre", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.0" + }, + "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": "2022-11-17T09:50:14+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "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": "2022-02-25T21:32:43+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.1" + }, + "time": "2023-02-02T22:02:53+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "84a527db05647743d50373e0ec53a152f2cde568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-15T16:57:16+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.14.4", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/1b3d9dba63d93b8a202c31e824748218781eae6b", + "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "composer/xdebug-handler": "^3.0.3", + "doctrine/annotations": "^2", + "doctrine/lexer": "^2 || ^3", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0 || ^5.0", + "symfony/console": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/options-resolver": "^5.4 || ^6.0", + "symfony/polyfill-mbstring": "^1.27", + "symfony/polyfill-php80": "^1.27", + "symfony/polyfill-php81": "^1.27", + "symfony/process": "^5.4 || ^6.0", + "symfony/stopwatch": "^5.4 || ^6.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.0", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.5.3", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy": "^1.16", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "phpunitgoodpractices/polyfill": "^1.6", + "phpunitgoodpractices/traits": "^1.9.2", + "symfony/phpunit-bridge": "^6.2.3", + "symfony/yaml": "^5.4 || ^6.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.4" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2023-02-09T21:49:13+00:00" + }, { "name": "myclabs/deep-copy", "version": "1.11.0", @@ -651,6 +1112,208 @@ ], "time": "2023-02-08T15:16:31+00:00" }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "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/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, { "name": "sebastian/cli-parser", "version": "2.0.0", @@ -1559,6 +2222,1311 @@ ], "time": "2023-02-07T11:34:05+00:00" }, + { + "name": "symfony/console", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "3e294254f2191762c1d137aed4b94e966965e985" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/3e294254f2191762c1d137aed4b94e966965e985", + "reference": "3e294254f2191762c1d137aed4b94e966965e985", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.2.5" + }, + "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": "2023-01-01T08:38:09+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.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": "2022-11-25T10:21:52+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", + "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.5" + }, + "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": "2023-01-01T08:38:09+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.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": "2022-11-25T10:21:52+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e59e8a4006afd7f5654786a83b4fcb8da98f4593", + "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.2.5" + }, + "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": "2023-01-20T17:45:48+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/c90dc446976a612e3312a97a6ec0069ab0c2099c", + "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.2.5" + }, + "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": "2023-01-20T17:45:48+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "e8324d44f5af99ec2ccec849934a242f64458f86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/e8324d44f5af99ec2ccec849934a242f64458f86", + "reference": "e8324d44f5af99ec2ccec849934a242f64458f86", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.2.5" + }, + "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": "2023-01-01T08:38:09+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/9ead139f63dfa38c4e4a9049cc64a8b2748c83b7", + "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.2.5" + }, + "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": "2023-01-01T08:38:09+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.2.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": "2022-11-25T10:21:52+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/00b6ac156aacffc53487c930e0ab14587a6607f6", + "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.2.5" + }, + "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": "2023-01-01T08:36:55+00:00" + }, + { + "name": "symfony/string", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", + "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.2.5" + }, + "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": "2023-01-01T08:38:09+00:00" + }, { "name": "theseer/tokenizer", "version": "1.2.1", diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..bd04f6a --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,27 @@ + + + + + + tests/Unit/ + + + + + + src + + + diff --git a/shell.nix b/shell.nix index ff3f756..76b890d 100644 --- a/shell.nix +++ b/shell.nix @@ -6,9 +6,21 @@ let runtimeInputs = [ pkgs.php82 pkgs.php82Packages.composer + projectTest ]; text = '' composer install --working-dir="$PROJECT_ROOT" + project-test + ''; + }; + projectTest = pkgs.writeShellApplication { + name = "project-test"; + runtimeInputs = [ + pkgs.php82 + ]; + text = '' + ./vendor/bin/phpunit + ./vendor/bin/php-cs-fixer fix --dry-run --allow-risky=yes ''; }; projectDeploy = pkgs.writeShellApplication { @@ -53,11 +65,13 @@ in pkgs.mkShell { pkgs.php82 pkgs.php82Packages.composer projectInstall + projectTest projectDeploy ]; shellHook = '' export PROJECT_ROOT="$(pwd)" export PATH="$(pwd)/:$PATH" + export PHP_CS_FIXER_IGNORE_ENV=1 ''; } diff --git a/src/Wrapper/GitHubTypo3.php b/src/Wrapper/GitHubTypo3.php index 6aabd9b..240c6dd 100644 --- a/src/Wrapper/GitHubTypo3.php +++ b/src/Wrapper/GitHubTypo3.php @@ -28,6 +28,14 @@ use DanielSiepmann\FediverseFeedWrappers\WrapperInterface; class GitHubTypo3 implements WrapperInterface { + private string $url; + + public function __construct( + string $url = 'https://github.com/TYPO3/typo3/commits.atom' + ) { + $this->url = $url; + } + /** * We don't want the full commit messag within each feed item. * @@ -37,13 +45,10 @@ class GitHubTypo3 implements WrapperInterface public function handle(): string { $content = new DOMDocument(); - $content->loadXML(file_get_contents('https://github.com/TYPO3/typo3/commits.atom')); + $content->loadXML(file_get_contents($this->url)); - $itemContentElements = $content->getElementsByTagName('content'); - foreach ($itemContentElements as $itemContent) { - $itemContent->nodeValue = strip_tags( - strtok($itemContent->textContent, "\n") ?: '' - ); + foreach ($content->getElementsByTagName('entry') as $entry) { + $entry->getElementsByTagName('content')[0]->nodeValue = trim($entry->getElementsByTagName('title')[0]->textContent); } return $content->saveXML(); diff --git a/src/WrapperRegistry.php b/src/WrapperRegistry.php index 9f0f2e4..984e905 100644 --- a/src/WrapperRegistry.php +++ b/src/WrapperRegistry.php @@ -49,7 +49,7 @@ class WrapperRegistry sprintf( 'No wrapper found for "%s", only available: %s.', $identifier, - implode(array_keys($this->wrappers)) + implode(', ', array_keys($this->wrappers)) ), 1676531371 ); diff --git a/tests/Unit/Wrapper/Assertions/GitHubTypo3.atom b/tests/Unit/Wrapper/Assertions/GitHubTypo3.atom new file mode 100644 index 0000000..8c5f65e --- /dev/null +++ b/tests/Unit/Wrapper/Assertions/GitHubTypo3.atom @@ -0,0 +1,274 @@ + + + tag:github.com,2008:/TYPO3/typo3/commits/main + + + Recent Commits to typo3:main + 2023-02-15T21:00:05Z + + tag:github.com,2008:Grit::Commit/da1469bbba1213494661dd166591f81d2bfbd7b7 + + + [BUGFIX] Fix capitalization in recordlist heading + + 2023-02-15T21:00:05Z + + + josefglatz + https://github.com/josefglatz + + [BUGFIX] Fix capitalization in recordlist heading + + + tag:github.com,2008:Grit::Commit/4936022b6a37dd9daa6f9fffd596caa40b16944b + + + [BUGFIX] Fix typo for a fe_users language key + + 2023-02-15T16:25:02Z + + + nhovratov + https://github.com/nhovratov + + [BUGFIX] Fix typo for a fe_users language key + + + tag:github.com,2008:Grit::Commit/6797361e3272171f38afdcc6ef9f3bfc393a02d9 + + + [BUGFIX] Add type cast for potential mountpoint information + + 2023-02-15T15:59:05Z + + + georgringer + https://github.com/georgringer + + [BUGFIX] Add type cast for potential mountpoint information + + + tag:github.com,2008:Grit::Commit/2115fe399dea3e8f8d134dcd02f854a5147d9de1 + + + [BUGFIX] Get the correct next stage for moved elements in workspace + + 2023-02-15T15:58:23Z + + + + typo3@timhorstmann.de + + [BUGFIX] Get the correct next stage for moved elements in workspace + + + tag:github.com,2008:Grit::Commit/953b80055f67d5753d7ef142ace3c49f042209f4 + + + [BUGFIX] Position sidebar in image cropping correctly on the right + + 2023-02-15T15:41:03Z + + + ochorocho + https://github.com/ochorocho + + [BUGFIX] Position sidebar in image cropping correctly on the right + + + tag:github.com,2008:Grit::Commit/3b1089c8594d4d1638939b0bb7bb5e67c37e8795 + + + [TASK] Refine LiveSearch form behavior + + 2023-02-15T15:09:45Z + + + andreasfernandez + https://github.com/andreasfernandez + + [TASK] Refine LiveSearch form behavior + + + tag:github.com,2008:Grit::Commit/ec8d82c39732903e07677755116ef70e1c670d6c + + + [TASK] Move PageTsBackendLayoutDataProvider namespace + + 2023-02-15T12:31:49Z + + + lolli42 + https://github.com/lolli42 + + [TASK] Move PageTsBackendLayoutDataProvider namespace + + + tag:github.com,2008:Grit::Commit/e0ba68e2629383b3174c02d4f246cd675d1af3cf + + + [BUGFIX] Handle FormData passed to AjaxRequest API properly + + 2023-02-15T12:06:58Z + + + andreasfernandez + https://github.com/andreasfernandez + + [BUGFIX] Handle FormData passed to AjaxRequest API properly + + + tag:github.com,2008:Grit::Commit/7e57642c91aacbb1a1ad16895caf1cad1f504156 + + + [TASK] Avoid GU::_GP() in DataHandler + + 2023-02-15T12:05:11Z + + + lolli42 + https://github.com/lolli42 + + [TASK] Avoid GU::_GP() in DataHandler + + + tag:github.com,2008:Grit::Commit/51bef53fe5775b0708155921080ccbe66952cc3e + + + [TASK] Avoid GU::_GP() in PageTsBackendLayoutDataProvider + + 2023-02-15T11:29:02Z + + + lolli42 + https://github.com/lolli42 + + [TASK] Avoid GU::_GP() in PageTsBackendLayoutDataProvider + + + tag:github.com,2008:Grit::Commit/773c4f581b17a96e9cc17436d546385100c72f81 + + + [TASK] Add delete action for usergroup list + + 2023-02-15T10:17:08Z + + + ochorocho + https://github.com/ochorocho + + [TASK] Add delete action for usergroup list + + + tag:github.com,2008:Grit::Commit/32dc37fe7d61990fb74cc3d559089576439e4c7f + + + [BUGFIX] Guard ConstantEditor with copy operator in constants + + 2023-02-14T12:13:44Z + + + sbuerk + https://github.com/sbuerk + + [BUGFIX] Guard ConstantEditor with copy operator in constants + + + tag:github.com,2008:Grit::Commit/c3c61edff0983a99d30d6cbc32ef0b2cb29661cb + + + [TASK] Deprecate PageRenderer->enableDebugMode() + + 2023-02-14T11:25:55Z + + + maddy2101 + https://github.com/maddy2101 + + [TASK] Deprecate PageRenderer->enableDebugMode() + + + tag:github.com,2008:Grit::Commit/68d67171c1d9a61e0d056ae849aa0c1db4ba6eda + + + [TASK] Deprecate the limit parameter for GU::intExplode + + 2023-02-14T10:09:09Z + + + oliverklee + https://github.com/oliverklee + + [TASK] Deprecate the limit parameter for GU::intExplode + + + tag:github.com,2008:Grit::Commit/0a9b218aadbb772e1c37f9ca0b446bd6c1648542 + + + [TASK] Refine LiveSearch search demand + + 2023-02-14T08:46:18Z + + + andreasfernandez + https://github.com/andreasfernandez + + [TASK] Refine LiveSearch search demand + + + tag:github.com,2008:Grit::Commit/26ca6872684ccc469a9e2981cb8cf3bb83134d12 + + + [BUGFIX] Toolbar link to environment opens in iframe + + 2023-02-13T18:28:45Z + + + lolli42 + https://github.com/lolli42 + + [BUGFIX] Toolbar link to environment opens in iframe + + + tag:github.com,2008:Grit::Commit/614e15d76087e775b965c4fb6e5e4ae59692c128 + + + [TASK] Make extbase repository generic (phpstan-wise) + + 2023-02-13T18:27:52Z + + + alexanderschnitzler + https://github.com/alexanderschnitzler + + [TASK] Make extbase repository generic (phpstan-wise) + + + tag:github.com,2008:Grit::Commit/f54531dad88addc4639f09b4cc37228524156d0c + + + [TASK] Eliminate double serialization in ApcuBackend + + 2023-02-13T18:15:26Z + + + MaxKellermann + https://github.com/MaxKellermann + + [TASK] Eliminate double serialization in ApcuBackend + + + tag:github.com,2008:Grit::Commit/66d3625281f47ef788f8663c0dbd050081d3fe74 + + + [BUGFIX] Handle array access in LocalImageProcessor + + 2023-02-13T18:04:14Z + + + sypets + https://github.com/sypets + + [BUGFIX] Handle array access in LocalImageProcessor + + diff --git a/tests/Unit/Wrapper/Fixtures/GitHubTypo3.atom b/tests/Unit/Wrapper/Fixtures/GitHubTypo3.atom new file mode 100644 index 0000000..539bc50 --- /dev/null +++ b/tests/Unit/Wrapper/Fixtures/GitHubTypo3.atom @@ -0,0 +1,690 @@ + + + tag:github.com,2008:/TYPO3/typo3/commits/main + + + Recent Commits to typo3:main + 2023-02-15T21:00:05Z + + tag:github.com,2008:Grit::Commit/da1469bbba1213494661dd166591f81d2bfbd7b7 + + + [BUGFIX] Fix capitalization in recordlist heading + + 2023-02-15T21:00:05Z + + + josefglatz + https://github.com/josefglatz + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Fix capitalization in recordlist heading + +Resolves: #99968 +Releases: main +Change-Id: Ie54a76fadf1000e8506ad512e14caa165c41ca86 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77876 +Reviewed-by: Björn Jacob &lt;bjoern.jacob@tritum.de&gt; +Tested-by: Björn Jacob &lt;bjoern.jacob@tritum.de&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Reviewed-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Reviewed-by: Oliver Klee &lt;typo3-coding@oliverklee.de&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/4936022b6a37dd9daa6f9fffd596caa40b16944b + + + [BUGFIX] Fix typo for a fe_users language key + + 2023-02-15T16:25:02Z + + + nhovratov + https://github.com/nhovratov + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Fix typo for a fe_users language key + +personelData -&gt; personalData + +Resolves: #99964 +Releases: main +Change-Id: If59a501b2faef95c4800995fc8ba985bba343134 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77873 +Tested-by: core-ci &lt;typo3@b13.com&gt; +Reviewed-by: Oliver Klee &lt;typo3-coding@oliverklee.de&gt; +Reviewed-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Tested-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Tested-by: Josef Glatz &lt;typo3@josefglatz.at&gt; +Reviewed-by: Josef Glatz &lt;typo3@josefglatz.at&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/6797361e3272171f38afdcc6ef9f3bfc393a02d9 + + + [BUGFIX] Add type cast for potential mountpoint information + + 2023-02-15T15:59:05Z + + + georgringer + https://github.com/georgringer + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Add type cast for potential mountpoint information + +Avoid exceptions by adding a type cast to string for the mount point +information. An additional early return avoids additional calls to +`\TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode()`. + +Resolves: #99946 +Releases: main, 11.5 +Change-Id: I18ea15c0f3e2c884e3333e55877e0f6dbe56c859 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77860 +Tested-by: core-ci &lt;typo3@b13.com&gt; +Reviewed-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Tested-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Reviewed-by: Jochen &lt;rothjochen@gmail.com&gt; +Tested-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Reviewed-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Tested-by: Jochen &lt;rothjochen@gmail.com&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/2115fe399dea3e8f8d134dcd02f854a5147d9de1 + + + [BUGFIX] Get the correct next stage for moved elements in workspace + + 2023-02-15T15:58:23Z + + + + typo3@timhorstmann.de + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Get the correct next stage for moved elements in workspace + +The method TYPO3\CMS\Workspaces\Service\StageService-&gt;getNextStageForElementCollection relies on the field t3ver_stage to calculate the next stage for changed elements in a workspace. Without it, it falls back to 0 (zero), meaning the current stage is &quot;Editing&quot;. This fix provides the neccessary field so the next stage can be calculated correct. + +Resolves: #98916 +Releases: main, 11.5 +Change-Id: I3b87c54b24c3cfe5eb2417fc582f3c4a3fb18ffc +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/76525 +Tested-by: Josua Vogel &lt;j.vogel97@web.de&gt; +Reviewed-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Tested-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Benni Mack &lt;benni@typo3.org&gt; +Reviewed-by: Benni Mack &lt;benni@typo3.org&gt; +Reviewed-by: Josua Vogel &lt;j.vogel97@web.de&gt; +Reviewed-by: Georg Ringer &lt;georg.ringer@gmail.com&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/953b80055f67d5753d7ef142ace3c49f042209f4 + + + [BUGFIX] Position sidebar in image cropping correctly on the right + + 2023-02-15T15:41:03Z + + + ochorocho + https://github.com/ochorocho + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Position sidebar in image cropping correctly on the right + +Currently, the sidebar containing the cropVariants +is always positioned below. + +This has been fixed by adding a missing display flex +to the modal on sm-viewport and up. + +On top of that the undefined this.cropBox error +on modal load was fixed by adding a empty JQuery object +on initialization. + +Resolves: #99953 +Releases: main +Change-Id: I679b188e38add5e06ad8e6334ddc15de01a42e60 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77865 +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Reviewed-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Reviewed-by: Oliver Bartsch &lt;bo@cedev.de&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/3b1089c8594d4d1638939b0bb7bb5e67c37e8795 + + + [TASK] Refine LiveSearch form behavior + + 2023-02-15T15:09:45Z + + + andreasfernandez + https://github.com/andreasfernandez + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Refine LiveSearch form behavior + +The behavior of the LiveSearch form used in the modal window is refined +in several ways. + +The most important change is the usage of `SearchDemand` to pre-fill the +search form. This required to add a `form` tag and to rename the +`searchField` field to `query` to align with the `SearchDemand` +requirements. Also, the `q` argument is renamed to `query` as well. + +Instead of directly triggering the search at several locations, a form +submit is request. This allows to call `search()` only once and to +provide a `FormData` object, containing all fields and values for the +underlying AJAX request. With this, there is no need to store the values +in properties anymore (`this.searchTerm` and `this.searchProperties`), +which are dropped now. + +Resolves: #99954 +Releases: main +Change-Id: Ibeb8c45048f8cc6c4801df648a19c0ecf7afb883 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77853 +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Frank Nägler &lt;frank.naegler@typo3.com&gt; +Tested-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Reviewed-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Reviewed-by: Frank Nägler &lt;frank.naegler@typo3.com&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/ec8d82c39732903e07677755116ef70e1c670d6c + + + [TASK] Move PageTsBackendLayoutDataProvider namespace + + 2023-02-15T12:31:49Z + + + lolli42 + https://github.com/lolli42 + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Move PageTsBackendLayoutDataProvider namespace + +Class +\TYPO3\CMS\Backend\Provider\PageTsBackendLayoutDataProvider +is moved to more appropriate +\TYPO3\CMS\Backend\View\BackendLayout\PageTsBackendLayoutDataProvider + +Resolves: #99958 +Releases: main +Change-Id: I57e329ead23deff4bd3a8c7c68b25c8b6ad79799 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77862 +Reviewed-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Reviewed-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/e0ba68e2629383b3174c02d4f246cd675d1af3cf + + + [BUGFIX] Handle FormData passed to AjaxRequest API properly + + 2023-02-15T12:06:58Z + + + andreasfernandez + https://github.com/andreasfernandez + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Handle FormData passed to AjaxRequest API properly + +The AjaxRequest API is now able to cope with `FormData` objects passed +as first argument in either `post()`, `put()` or `delete()`. +Previously, a workaround was necessary that submitted +`{body: formData}` as `RequestInit` to fulfill this task. Since this +workaround is not required anymore, usages are adapted accordingly. + +Resolves: #99955 +Releases: main +Change-Id: I8e04040d262c874e9d51bff58eb1f7c378b05a18 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77861 +Reviewed-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/7e57642c91aacbb1a1ad16895caf1cad1f504156 + + + [TASK] Avoid GU::_GP() in DataHandler + + 2023-02-15T12:05:11Z + + + lolli42 + https://github.com/lolli42 + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Avoid GU::_GP() in DataHandler + +DataHandler should of course *not* have a dependency +to _GET or _POST: All data should be hand over as +&quot;command&quot; and &quot;data&quot; array. + +Flex form handling violates this for section container +deletion and sorting by using GeneralUtility::_GP(). + +The patch changes the logic to carry the &quot;_ACTION&quot; +information within the flex data array. This simplifies +the flex form handling logic a bit, we can get rid +of a recursion along the way. + +Resolves: #99952 +Releases: main +Change-Id: Ifaa15162d018725fe3ba8ae7b1a05655a0cffb36 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77856 +Tested-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Reviewed-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Reviewed-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/51bef53fe5775b0708155921080ccbe66952cc3e + + + [TASK] Avoid GU::_GP() in PageTsBackendLayoutDataProvider + + 2023-02-15T11:29:02Z + + + lolli42 + https://github.com/lolli42 + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Avoid GU::_GP() in PageTsBackendLayoutDataProvider + +The method using GU::_GP() can get more data +hand over to always have the pageId available +already. Do this and avoid another call to +GeneralUtility::_GP(). + +Note the entire backend layout handling carries +far too much state, is complex in general and +hard to follow. It should be streamlined and +simplified. + +Resolves: #99948 +Releases: main +Change-Id: I13a70a234dae0a20256e4a932de891a49531c9af +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77852 +Reviewed-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Reviewed-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Tested-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Tested-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/773c4f581b17a96e9cc17436d546385100c72f81 + + + [TASK] Add delete action for usergroup list + + 2023-02-15T10:17:08Z + + + ochorocho + https://github.com/ochorocho + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Add delete action for usergroup list + +Currently, the list of usergroups does not +contain a delete button but the user list does. + +A delete button was added to have a consistent +ui for user and group listing. + +Resolves: #99867 +Releases: main +Change-Id: I7e5de8091fb053a182d6c45c73ccb7af69485221 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77772 +Reviewed-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/32dc37fe7d61990fb74cc3d559089576439e4c7f + + + [BUGFIX] Guard ConstantEditor with copy operator in constants + + 2023-02-14T12:13:44Z + + + sbuerk + https://github.com/sbuerk + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Guard ConstantEditor with copy operator in constants + +If copy operator &#39;&lt;&#39; is used in TypoScript constants for a +constant with a constant editor configuration comment, the +&quot;Call to member function getType() on null&quot; exception is +emitted. + +Example TypoScript constants: + +&gt; # cat=custom/a; type=color; label=Primary Color +&gt; plugin.tx_example.primaryColor = #282E31 +&gt; +&gt; # cat=custom/a; type=color; label=Other Color +&gt; plugin.tx_example.otherColor &lt; plugin.tx_example.primaryColor + +This may happen when a comment token stream is +handled multiple times without being reset properly. + +Resolves: #99906 +Related: #97816 +Releases: main +Change-Id: I5c15a9bf194f8c24e7306213218e1b801fe7cb72 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77808 +Reviewed-by: Oliver Bartsch &lt;bo@cedev.de&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: Oliver Bartsch &lt;bo@cedev.de&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/c3c61edff0983a99d30d6cbc32ef0b2cb29661cb + + + [TASK] Deprecate PageRenderer->enableDebugMode() + + 2023-02-14T11:25:55Z + + + maddy2101 + https://github.com/maddy2101 + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Deprecate PageRenderer-&gt;enableDebugMode() + +PageRenderer-&gt;enableDebugMode() is only called in +backend by the core. The properties set by the +method do not have any effect in BE during further +processing. + +The method is typically not called in Frontend, +any calls can be moved to the single setters +instead. + +The patch deprecates PageRenderer-&gt;enableDebugMode(). + +Resolves: #99932 +Releases: main +Change-Id: Iddef89c9e97f721a7b33ccc838d20f17b03471f4 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77831 +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: Anja Leichsenring &lt;aleichsenring@ab-softlab.de&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Georg Ringer &lt;georg.ringer@gmail.com&gt; +Reviewed-by: Anja Leichsenring &lt;aleichsenring@ab-softlab.de&gt; +Reviewed-by: Georg Ringer &lt;georg.ringer@gmail.com&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/68d67171c1d9a61e0d056ae849aa0c1db4ba6eda + + + [TASK] Deprecate the limit parameter for GU::intExplode + + 2023-02-14T10:09:09Z + + + oliverklee + https://github.com/oliverklee + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Deprecate the limit parameter for GU::intExplode + +Passing a limit to `GU::intExplode` will cause the method to +potentially return a string as the last array element, which +is not documented and directly contradicts the method contract +(which states that an array of integers will be returned). + +The deprecated parameter is not used in the Core at all. + +Resolves: #99900 +Releases: main +Change-Id: Ic175fcef56f78c9bc237850fc7c7b1d31701d6f8 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77806 +Tested-by: Nikita Hovratov &lt;nikita.h@live.de&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Reviewed-by: Nikita Hovratov &lt;nikita.h@live.de&gt; +Reviewed-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/0a9b218aadbb772e1c37f9ca0b446bd6c1648542 + + + [TASK] Refine LiveSearch search demand + + 2023-02-14T08:46:18Z + + + andreasfernandez + https://github.com/andreasfernandez + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Refine LiveSearch search demand + +The search demand implementation used by the LiveSearch is refined to be +more flexible. Instead of a hard-coded list of properties, the +constructor now receives a list of `DemandProperty` instances that +accept everything that is backed by the `DemandPropertyName` enum, +allowing to pass only the required properties. + +The `SearchDemand` class is immutable by design, it&#39;s API must not +allow modification by 3rd parties. However, there is an internal +`MutableSearchDemand` acting as a helper that allows to add / override +properties. A `SearchDemand` object may be constructed from a request +object, where it&#39;s payload must contain properties from the +aforementioned `DemandPropertyName` enum. + +Resolves: #99941 +Releases: main +Change-Id: I880855943a67237fa765cd3da94333e8aaa3a2a2 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77842 +Reviewed-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Georg Ringer &lt;georg.ringer@gmail.com&gt; +Reviewed-by: Anja Leichsenring &lt;aleichsenring@ab-softlab.de&gt; +Reviewed-by: Georg Ringer &lt;georg.ringer@gmail.com&gt; +Tested-by: Andreas Fernandez &lt;a.fernandez@scripting-base.de&gt; +Tested-by: Anja Leichsenring &lt;aleichsenring@ab-softlab.de&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/26ca6872684ccc469a9e2981cb8cf3bb83134d12 + + + [BUGFIX] Toolbar link to environment opens in iframe + + 2023-02-13T18:28:45Z + + + lolli42 + https://github.com/lolli42 + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Toolbar link to environment opens in iframe + +Toolbar &gt; SystemInformation has a link to +Environment module that opens without module +menu and toolbar, just the main iframe. + +Links from within the top iframe are managed +by JS and need some magic to trigger this +properly. + +Resolves: #99854 +Releases: main +Change-Id: Ic824e3dc3e409b8f86108654af6b540061de05f0 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77838 +Tested-by: Jasmina Ließmann &lt;minapokhalo+typo3@gmail.com&gt; +Reviewed-by: Jasmina Ließmann &lt;minapokhalo+typo3@gmail.com&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Reviewed-by: Stefan Bürk &lt;stefan@buerk.tech&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/614e15d76087e775b965c4fb6e5e4ae59692c128 + + + [TASK] Make extbase repository generic (phpstan-wise) + + 2023-02-13T18:27:52Z + + + alexanderschnitzler + https://github.com/alexanderschnitzler + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Make extbase repository generic (phpstan-wise) + +This patch introduces template tags on the extbase repository +interface, the extbase repository class and the abstract resource +repository class (File, ProcessedFile etc.) to let static code +analyzers and modern IDE&#39;s know what that those repositories are +generic. + +This patch also introduces extends tags on actual reposities to +let static code analysis know what kind of object the repository +deals with. + +As a byproduct, a few phpdoc params and return types have been +fixed or specified. + +Releases: main +Resolves: #99931 +Change-Id: I0056e420406fa84693d4104db9d7a9ec362c33d7 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77825 +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Reviewed-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Tested-by: Stefan Bürk &lt;stefan@buerk.tech&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/f54531dad88addc4639f09b4cc37228524156d0c + + + [TASK] Eliminate double serialization in ApcuBackend + + 2023-02-13T18:15:26Z + + + MaxKellermann + https://github.com/MaxKellermann + + + <pre style='white-space:pre-wrap;width:81ex'>[TASK] Eliminate double serialization in ApcuBackend + +APCu can store arbitrary PHP data; it serializes all +values when they are stored, and it has a pluggable +serializer interface which can use serializers that +are better than serialize(), such as &quot;igbinary&quot;, +see [1] and [2]. + +By not implementing TransientBackendInterface, the +ApcuBackend forces class VariableFrontend to serialize +all values into a string, but APCu serializes the +string again. + +This adds TransientBackendInterface and removes the +is_string() check. Double serialization is eliminated +by this change. + +Additionally, the unit tests are turned into +functionals, the backend is declared final, gets +some more type hints and uses the quicker xxh3 hash. + +[1] https://www.php.net/manual/en/book.igbinary.php +[2] https://pecl.php.net/package/igbinary + +Releases: main +Resolves: #99851 +Change-Id: I8663deefd1ffeb249376119287191bcec9ef2420 +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77717 +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Reviewed-by: Stefan Bürk &lt;stefan@buerk.tech&gt;</pre> + + + + tag:github.com,2008:Grit::Commit/66d3625281f47ef788f8663c0dbd050081d3fe74 + + + [BUGFIX] Handle array access in LocalImageProcessor + + 2023-02-13T18:04:14Z + + + sypets + https://github.com/sypets + + + <pre style='white-space:pre-wrap;width:81ex'>[BUGFIX] Handle array access in LocalImageProcessor + +Handle missing image dimensions (width, height) +without throwing an exception. + +In same cases, image dimension may not be able to be +set properly. + +Resolves: #99406 +Releases: main, 11.5 +Change-Id: I81124dcaf29932448a87b69ab5bf6445eeb7469c +Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77844 +Reviewed-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Reviewed-by: Oliver Klee &lt;typo3-coding@oliverklee.de&gt; +Tested-by: core-ci &lt;typo3@b13.com&gt; +Reviewed-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt; +Tested-by: Stefan Bürk &lt;stefan@buerk.tech&gt; +Tested-by: Christian Kuhn &lt;lolli@schwarzbu.ch&gt;</pre> + + + diff --git a/tests/Unit/Wrapper/GitHubTypo3Test.php b/tests/Unit/Wrapper/GitHubTypo3Test.php new file mode 100644 index 0000000..c5bdf77 --- /dev/null +++ b/tests/Unit/Wrapper/GitHubTypo3Test.php @@ -0,0 +1,75 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +namespace DanielSiepmann\FediverseFeedWrappers\Tests\Unit\Wrapper; + +use DanielSiepmann\FediverseFeedWrappers\WrapperInterface; +use DanielSiepmann\FediverseFeedWrappers\Wrapper\GitHubTypo3; +use PHPUnit\Framework\TestCase; + +/** + * @covers \DanielSiepmann\FediverseFeedWrappers\Wrapper\GitHubTypo3 + */ +class GitHubTypo3Test extends TestCase +{ + /** + * @test + */ + public function canBeCreated(): void + { + $subject = new GitHubTypo3(); + + self::assertInstanceOf( + GitHubTypo3::class, + $subject + ); + } + + /** + * @test + */ + public function isInstanceOfWrapperInterface(): void + { + $subject = new GitHubTypo3(); + + self::assertInstanceOf( + WrapperInterface::class, + $subject + ); + } + + /** + * @test + */ + public function returnsAdjustedFeed(): void + { + $subject = new GitHubTypo3( + __DIR__ . '/Fixtures/GitHubTypo3.atom' + ); + + self::assertStringEqualsFile( + __DIR__ . '/Assertions/GitHubTypo3.atom', + $subject->handle() + ); + } +} diff --git a/tests/Unit/WrapperRegistryTest.php b/tests/Unit/WrapperRegistryTest.php new file mode 100644 index 0000000..481965b --- /dev/null +++ b/tests/Unit/WrapperRegistryTest.php @@ -0,0 +1,77 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +namespace DanielSiepmann\FediverseFeedWrappers\Tests\Unit; + +use DanielSiepmann\FediverseFeedWrappers\WrapperRegistry; +use InvalidArgumentException; +use PHPUnit\Framework\TestCase; + +/** + * @covers \DanielSiepmann\FediverseFeedWrappers\WrapperRegistry + */ +class WrapperRegistryTest extends TestCase +{ + /** + * @test + */ + public function canBeCreated(): void + { + $subject = new WrapperRegistry([]); + + self::assertInstanceOf( + WrapperRegistry::class, + $subject + ); + } + + /** + * @test + */ + public function throwsExceptionIfRequestedIdentifierIsNotConfigured(): void + { + $subject = new WrapperRegistry([]); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionCode(1676531371); + $this->expectExceptionMessage('No wrapper found for "Identifier", only available: .'); + + $subject->get('Identifier'); + } + + /** + * @test + */ + public function throwsExceptionIfRequestedIdentifierIsNotOfExpectedInterface(): void + { + $subject = new WrapperRegistry([ + 'Identifier' => 'wrong type', + ]); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionCode(1676531371); + $this->expectExceptionMessage('No wrapper found for "Identifier", only available: Identifier.'); + + $subject->get('Identifier'); + } +}