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 <bjoern.jacob@tritum.de>
+Tested-by: Björn Jacob <bjoern.jacob@tritum.de>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Oliver Bartsch <bo@cedev.de>
+Reviewed-by: Oliver Bartsch <bo@cedev.de>
+Reviewed-by: Oliver Klee <typo3-coding@oliverklee.de></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 -> personalData
+
+Resolves: #99964
+Releases: main
+Change-Id: If59a501b2faef95c4800995fc8ba985bba343134
+Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77873
+Tested-by: core-ci <typo3@b13.com>
+Reviewed-by: Oliver Klee <typo3-coding@oliverklee.de>
+Reviewed-by: Oliver Bartsch <bo@cedev.de>
+Tested-by: Oliver Bartsch <bo@cedev.de>
+Tested-by: Josef Glatz <typo3@josefglatz.at>
+Reviewed-by: Josef Glatz <typo3@josefglatz.at></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 <typo3@b13.com>
+Reviewed-by: Oliver Bartsch <bo@cedev.de>
+Tested-by: Stefan Bürk <stefan@buerk.tech>
+Reviewed-by: Jochen <rothjochen@gmail.com>
+Tested-by: Oliver Bartsch <bo@cedev.de>
+Reviewed-by: Stefan Bürk <stefan@buerk.tech>
+Tested-by: Jochen <rothjochen@gmail.com></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->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 "Editing". 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 <j.vogel97@web.de>
+Reviewed-by: Oliver Bartsch <bo@cedev.de>
+Tested-by: Oliver Bartsch <bo@cedev.de>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Benni Mack <benni@typo3.org>
+Reviewed-by: Benni Mack <benni@typo3.org>
+Reviewed-by: Josua Vogel <j.vogel97@web.de>
+Reviewed-by: Georg Ringer <georg.ringer@gmail.com></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 <typo3@b13.com>
+Tested-by: Oliver Bartsch <bo@cedev.de>
+Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Reviewed-by: Oliver Bartsch <bo@cedev.de></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 <typo3@b13.com>
+Tested-by: Frank Nägler <frank.naegler@typo3.com>
+Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Reviewed-by: Frank Nägler <frank.naegler@typo3.com></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 <a.fernandez@scripting-base.de>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Tested-by: Stefan Bürk <stefan@buerk.tech>
+Reviewed-by: Stefan Bürk <stefan@buerk.tech>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch></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 <a.fernandez@scripting-base.de>
+Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch></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
+"command" and "data" array.
+
+Flex form handling violates this for section container
+deletion and sorting by using GeneralUtility::_GP().
+
+The patch changes the logic to carry the "_ACTION"
+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 <a.fernandez@scripting-base.de>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
+Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Stefan Bürk <stefan@buerk.tech>
+Reviewed-by: Stefan Bürk <stefan@buerk.tech>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch></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 <a.fernandez@scripting-base.de>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: core-ci <typo3@b13.com>
+Reviewed-by: Stefan Bürk <stefan@buerk.tech>
+Tested-by: Stefan Bürk <stefan@buerk.tech>
+Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch></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 <bo@cedev.de>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: Oliver Bartsch <bo@cedev.de>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch></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 '<' is used in TypoScript constants for a
+constant with a constant editor configuration comment, the
+"Call to member function getType() on null" exception is
+emitted.
+
+Example TypoScript constants:
+
+> # cat=custom/a; type=color; label=Primary Color
+> plugin.tx_example.primaryColor = #282E31
+>
+> # cat=custom/a; type=color; label=Other Color
+> plugin.tx_example.otherColor < 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 <bo@cedev.de>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: core-ci <typo3@b13.com>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: Oliver Bartsch <bo@cedev.de></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->enableDebugMode()
+
+PageRenderer->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->enableDebugMode().
+
+Resolves: #99932
+Releases: main
+Change-Id: Iddef89c9e97f721a7b33ccc838d20f17b03471f4
+Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77831
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Georg Ringer <georg.ringer@gmail.com>
+Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
+Reviewed-by: Georg Ringer <georg.ringer@gmail.com></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 <nikita.h@live.de>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: core-ci <typo3@b13.com>
+Reviewed-by: Nikita Hovratov <nikita.h@live.de>
+Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch></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'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'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 <a.fernandez@scripting-base.de>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Georg Ringer <georg.ringer@gmail.com>
+Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
+Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
+Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
+Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de></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 > 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 <minapokhalo+typo3@gmail.com>
+Reviewed-by: Jasmina Ließmann <minapokhalo+typo3@gmail.com>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Stefan Bürk <stefan@buerk.tech>
+Reviewed-by: Stefan Bürk <stefan@buerk.tech></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'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 <lolli@schwarzbu.ch>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
+Reviewed-by: Stefan Bürk <stefan@buerk.tech>
+Tested-by: core-ci <typo3@b13.com>
+Tested-by: Stefan Bürk <stefan@buerk.tech></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 "igbinary",
+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 <lolli@schwarzbu.ch>
+Tested-by: Stefan Bürk <stefan@buerk.tech>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: core-ci <typo3@b13.com>
+Reviewed-by: Stefan Bürk <stefan@buerk.tech></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 <stefan@buerk.tech>
+Reviewed-by: Oliver Klee <typo3-coding@oliverklee.de>
+Tested-by: core-ci <typo3@b13.com>
+Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
+Tested-by: Stefan Bürk <stefan@buerk.tech>
+Tested-by: Christian Kuhn <lolli@schwarzbu.ch></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');
+ }
+}