diff --git a/.gitattributes b/.gitattributes
index 9b058c0..86e122e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -11,10 +11,13 @@
*.webp binary
*.bmp binary
*.ttf binary
+*.blp binary
+*.db2 binary
# Ignoring files for distribution archieves
.github/ export-ignore
etc/ci/ export-ignore
+etc/dev-app/ export-ignore
etc/qa/ export-ignore
examples/ export-ignore
tests/ export-ignore
diff --git a/.github/renovate.json b/.github/renovate.json
index c3a6d94..1c478c4 100644
--- a/.github/renovate.json
+++ b/.github/renovate.json
@@ -1,6 +1,10 @@
{
- "$schema": "https://docs.renovatebot.com/renovate-schema.json",
- "extends": [
- "github>WyriHaximus/renovate-config:php-package"
- ]
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+ "extends": [
+ "github>WyriHaximus/renovate-config:php-package"
+ ],
+ "constraints": {
+ "php": "8.4.x",
+ "composer": "2.x"
+ }
}
diff --git a/Makefile b/Makefile
index 359e8e0..3934c48 100644
--- a/Makefile
+++ b/Makefile
@@ -5,12 +5,10 @@ SHELL=bash
DOCKER_AVAILABLE=$(shell ((command -v docker >/dev/null 2>&1) && echo 0 || echo 1))
CONTAINER_REGISTRY_REPO="ghcr.io/wyrihaximusnet/php"
-COMPOSER_SHOW_EXTENSION_LIST_PROD=$(shell (((command -v composer >/dev/null 2>&1) && composer show -t --no-plugins 2>/dev/null) || docker run --rm -v "`pwd`:`pwd`" -w `pwd` ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim-dev composer show -t --no-plugins) | grep -o "\-\-\(ext-\).\+" | sort | uniq | cut -d- -f4- | tr -d '\n' | grep . | sed '/^$$/d' | xargs | sed -e 's/ /, /g' | tr -cd '[:alnum:],' | sed 's/.$$//')
-COMPOSER_SHOW_EXTENSION_LIST_DEV=$(shell (((command -v composer >/dev/null 2>&1) && composer show -s --no-plugins 2>/dev/null) || docker run --rm -v "`pwd`:`pwd`" -w `pwd` ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim-dev composer show -s --no-plugins) | grep -o "\(ext-\).\+" | sort | uniq | cut -d- -f2- | cut -d" " -f1 | xargs | sed -e 's/ /, /g' | tr -cd '[:alnum:],')
-COMPOSER_SHOW_EXTENSION_LIST=$(shell echo "${COMPOSER_SHOW_EXTENSION_LIST_PROD},${COMPOSER_SHOW_EXTENSION_LIST_DEV}")
-SLIM_DOCKER_IMAGE=$(shell php -r 'echo count(array_intersect(["gd", "vips"], explode(",", "${COMPOSER_SHOW_EXTENSION_LIST}"))) > 0 ? "" : "-slim";')
-NTS_OR_ZTS_DOCKER_IMAGE=$(shell php -r 'echo count(array_intersect(["parallel"], explode(",", "${COMPOSER_SHOW_EXTENSION_LIST}"))) > 0 ? "zts" : "nts";')
-PHP_VERSION:=$(shell (((command -v docker >/dev/null 2>&1) && docker run --rm -v "`pwd`:`pwd`" ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim php -r "echo json_decode(file_get_contents('`pwd`/composer.json'), true)['config']['platform']['php'];") || echo "8.3") | php -r "echo str_replace('|', '.', explode('.', implode('|', explode('.', stream_get_contents(STDIN), 2)), 2)[0]);")
+SLIM_DOCKER_IMAGE="-slim"
+NTS_OR_ZTS_DOCKER_IMAGE="nts"
+NEEDS_DOCKER_SOCKET=FALSE
+PHP_VERSION="8.4"
CONTAINER_NAME=$(shell echo "${CONTAINER_REGISTRY_REPO}:${PHP_VERSION}-${NTS_OR_ZTS_DOCKER_IMAGE}-alpine${SLIM_DOCKER_IMAGE}-dev")
COMPOSER_CACHE_DIR=$(shell (command -v composer >/dev/null 2>&1) && composer config --global cache-dir -q 2>/dev/null || echo ${HOME}/.composer-php/cache)
COMPOSER_CONTAINER_CACHE_DIR=$(shell ((command -v docker >/dev/null 2>&1) && docker run --rm -it ${CONTAINER_NAME} composer config --global cache-dir -q) || echo ${HOME}/.composer-php/cache)
@@ -23,16 +21,30 @@ endif
ifeq ("$(IN_DOCKER)","TRUE")
DOCKER_RUN:=
+ DOCKER_RUN_WITH_SOCKET:=
+ DOCKER_SHELL:=
else
ifeq ($(DOCKER_AVAILABLE),0)
- DOCKER_RUN:=docker run --rm -it \
- -v "`pwd`:`pwd`" \
- -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" \
- -w "`pwd`" \
- -e OTEL_PHP_FIBERS_ENABLED="true" \
- "${CONTAINER_NAME}"
+ DOCKER_COMMON_OPS:=-v "`pwd`:`pwd`" -w "`pwd`" -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" -e OTEL_PHP_FIBERS_ENABLED="true" --ulimit nofile=1000000
+ ifeq ("$(NEEDS_DOCKER_SOCKET)","TRUE")
+ ifneq ("$(wildcard /var/run/docker.sock)","")
+ DOCKER_SOCKET_OPS:=-v "/var/run/docker.sock:/var/run/docker.sock"
+ DOCKER_SOCKET_CONTAINER_NAME_SUFFIX:=-root
+ else
+ DOCKER_SOCKET_OPS:=
+ DOCKER_SOCKET_CONTAINER_NAME_SUFFIX:=
+ endif
+ else
+ DOCKER_SOCKET_OPS:=
+ DOCKER_SOCKET_CONTAINER_NAME_SUFFIX:=
+ endif
+ DOCKER_RUN:=docker run --rm -i ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}"
+ DOCKER_RUN_WITH_SOCKET:=docker run --rm -i ${DOCKER_COMMON_OPS} ${DOCKER_SOCKET_OPS} "${CONTAINER_NAME}${DOCKER_SOCKET_CONTAINER_NAME_SUFFIX}"
+ DOCKER_SHELL:=docker run --rm -it ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}"
else
DOCKER_RUN:=
+ DOCKER_RUN_WITH_SOCKET:=
+ DOCKER_SHELL:=
endif
endif
@@ -44,14 +56,14 @@ endif
## Run everything extra point
all: ## Runs everything ####
- $(DOCKER_RUN) make all-raw
+ $(DOCKER_RUN_WITH_SOCKET) make all-raw
all-raw: ## The real runs everything, but due to sponge it has to be ran inside DOCKER_RUN ##U##
$(MAKE) syntax-php rector-upgrade cs-fix cs stan unit-testing mutation-testing composer-require-checker composer-unused backward-compatibility-check ## Count: 10
## Temporary set of migrations to get all my repos in shape
migrations-git-enforce-gitattributes-contents: #### Enforce .gitattributes contents ##*I*##
- ($(DOCKER_RUN) php -r 'file_put_contents(".gitattributes", base64_decode("IyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGluIGNhc2UgcGVvcGxlIGRvbid0IGhhdmUgY29yZS5hdXRvY3JsZiBzZXQuCiogdGV4dCBlb2w9bGYKCiMgVGhlc2UgZmlsZXMgYXJlIGJpbmFyeSBhbmQgc2hvdWxkIGJlIGxlZnQgdW50b3VjaGVkCiMgKGJpbmFyeSBpcyBhIG1hY3JvIGZvciAtdGV4dCAtZGlmZikKKi5wbmcgYmluYXJ5CiouanBnIGJpbmFyeQoqLmpwZWcgYmluYXJ5CiouZ2lmIGJpbmFyeQoqLmljbyBiaW5hcnkKKi53ZWJwIGJpbmFyeQoqLmJtcCBiaW5hcnkKKi50dGYgYmluYXJ5CgojIElnbm9yaW5nIGZpbGVzIGZvciBkaXN0cmlidXRpb24gYXJjaGlldmVzCi5naXRodWIvIGV4cG9ydC1pZ25vcmUKZXRjL2NpLyBleHBvcnQtaWdub3JlCmV0Yy9xYS8gZXhwb3J0LWlnbm9yZQpleGFtcGxlcy8gZXhwb3J0LWlnbm9yZQp0ZXN0cy8gZXhwb3J0LWlnbm9yZQp2YXIvIGV4cG9ydC1pZ25vcmUKLmRldmNvbnRhaW5lci5qc29uIGV4cG9ydC1pZ25vcmUKLmVkaXRvcmNvbmZpZyBleHBvcnQtaWdub3JlCi5naXRhdHRyaWJ1dGVzIGV4cG9ydC1pZ25vcmUKLmdpdGlnbm9yZSBleHBvcnQtaWdub3JlCkNPTlRSSUJVVElORy5tZCBleHBvcnQtaWdub3JlCmNvbXBvc2VyLmxvY2sgZXhwb3J0LWlnbm9yZQpNYWtlZmlsZSBleHBvcnQtaWdub3JlClJFQURNRS5tZCBleHBvcnQtaWdub3JlCgojIERpZmZpbmcKKi5waHAgZGlmZj1waHAK"));' || true)
+ ($(DOCKER_RUN) php -r 'file_put_contents(".gitattributes", base64_decode("IyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGluIGNhc2UgcGVvcGxlIGRvbid0IGhhdmUgY29yZS5hdXRvY3JsZiBzZXQuCiogdGV4dCBlb2w9bGYKCiMgVGhlc2UgZmlsZXMgYXJlIGJpbmFyeSBhbmQgc2hvdWxkIGJlIGxlZnQgdW50b3VjaGVkCiMgKGJpbmFyeSBpcyBhIG1hY3JvIGZvciAtdGV4dCAtZGlmZikKKi5wbmcgYmluYXJ5CiouanBnIGJpbmFyeQoqLmpwZWcgYmluYXJ5CiouZ2lmIGJpbmFyeQoqLmljbyBiaW5hcnkKKi53ZWJwIGJpbmFyeQoqLmJtcCBiaW5hcnkKKi50dGYgYmluYXJ5CiouYmxwIGJpbmFyeQoqLmRiMiBiaW5hcnkKCiMgSWdub3JpbmcgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbiBhcmNoaWV2ZXMKLmdpdGh1Yi8gZXhwb3J0LWlnbm9yZQpldGMvY2kvIGV4cG9ydC1pZ25vcmUKZXRjL2Rldi1hcHAvIGV4cG9ydC1pZ25vcmUKZXRjL3FhLyBleHBvcnQtaWdub3JlCmV4YW1wbGVzLyBleHBvcnQtaWdub3JlCnRlc3RzLyBleHBvcnQtaWdub3JlCnZhci8gZXhwb3J0LWlnbm9yZQouZGV2Y29udGFpbmVyLmpzb24gZXhwb3J0LWlnbm9yZQouZWRpdG9yY29uZmlnIGV4cG9ydC1pZ25vcmUKLmdpdGF0dHJpYnV0ZXMgZXhwb3J0LWlnbm9yZQouZ2l0aWdub3JlIGV4cG9ydC1pZ25vcmUKQ09OVFJJQlVUSU5HLm1kIGV4cG9ydC1pZ25vcmUKY29tcG9zZXIubG9jayBleHBvcnQtaWdub3JlCk1ha2VmaWxlIGV4cG9ydC1pZ25vcmUKUkVBRE1FLm1kIGV4cG9ydC1pZ25vcmUKCiMgRGlmZmluZwoqLnBocCBkaWZmPXBocAo="));' || true)
migrations-git-make-sure-gitignore-exists: #### Make sure .gitignore exists ##*I*##
($(DOCKER_RUN) touch .gitignore || true)
@@ -119,12 +131,18 @@ migrations-php-infection-ensure-log-per-mutator-has-the-correct-path: #### Ensur
migrations-php-add-github-true-to-for-infection: #### Ensure we configure infection to emit logs to GitHub in etc/qa/infection.json5 ##*I*##
($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) {exit;} if (array_key_exists("github", $$json["logs"])) {exit;} $$json["logs"]["github"] = true; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true)
+migrations-php-make-paths-compatible-with-infection-0-32: #### We update path to be relative to etc/qa/infection.json5 as of 0.32 ##*I*##
+ ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("source", $$json)) {exit;} if (!array_key_exists("directories", $$json["source"])) {exit;} foreach ($$json["source"]["directories"] as $$key => $$value) { if (!str_starts_with($$value, "../../")) {$$json["source"]["directories"][$$key] = "../../" . $$value;} } file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true)
+
migrations-php-set-phpunit-ensure-config-file-exists: #### Make sure we have a PHPUnit config file at etc/qa/phpunit.xml ##*I*##
- ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (file_exists($$phpUnitConfigFIle)) {exit;} file_put_contents($$phpUnitConfigFIle, base64_decode("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHBocHVuaXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgYm9vdHN0cmFwPSIuLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwIiBjb2xvcnM9InRydWUiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi92ZW5kb3IvcGhwdW5pdC9waHB1bml0L3BocHVuaXQueHNkIiBjYWNoZURpcmVjdG9yeT0iLi4vLi4vdmFyL3BocHVuaXQvY2FjaGUiPgogICAgPHRlc3RzdWl0ZXM+CiAgICAgICAgPHRlc3RzdWl0ZSBuYW1lPSJUZXN0IFN1aXRlIj4KICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi90ZXN0cy88L2RpcmVjdG9yeT4KICAgICAgICA8L3Rlc3RzdWl0ZT4KICAgIDwvdGVzdHN1aXRlcz4KICAgIDxzb3VyY2U+CiAgICAgICAgPGluY2x1ZGU+CiAgICAgICAgICAgIDxkaXJlY3Rvcnkgc3VmZml4PSIucGhwIj4uLi8uLi9zcmMvPC9kaXJlY3Rvcnk+CiAgICAgICAgPC9pbmNsdWRlPgogICAgPC9zb3VyY2U+CiAgICA8ZXh0ZW5zaW9ucz4KICAgICAgICA8Ym9vdHN0cmFwIGNsYXNzPSJFcmdlYm5pc1xQSFBVbml0XFNsb3dUZXN0RGV0ZWN0b3JcRXh0ZW5zaW9uIi8+CiAgICA8L2V4dGVuc2lvbnM+CjwvcGhwdW5pdD4K"));' || true)
+ ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (file_exists($$phpUnitConfigFIle)) {exit;} file_put_contents($$phpUnitConfigFIle, base64_decode("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4KICAgIDx0ZXN0c3VpdGVzPgogICAgICAgIDx0ZXN0c3VpdGUgbmFtZT0iVGVzdCBTdWl0ZSI+CiAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vdGVzdHMvPC9kaXJlY3Rvcnk+CiAgICAgICAgPC90ZXN0c3VpdGU+CiAgICA8L3Rlc3RzdWl0ZXM+CiAgICA8c291cmNlPgogICAgICAgIDxpbmNsdWRlPgogICAgICAgICAgICA8ZGlyZWN0b3J5IHN1ZmZpeD0iLnBocCI+Li4vLi4vc3JjLzwvZGlyZWN0b3J5PgogICAgICAgIDwvaW5jbHVkZT4KICAgIDwvc291cmNlPgogICAgPGV4dGVuc2lvbnM+CiAgICAgICAgPGJvb3RzdHJhcCBjbGFzcz0iRXJnZWJuaXNcUEhQVW5pdFxTbG93VGVzdERldGVjdG9yXEV4dGVuc2lvbiIvPgogICAgPC9leHRlbnNpb25zPgo8L3BocHVuaXQ+Cg=="));' || true)
migrations-php-set-phpunit-xsd-path-to-local: #### Ensure that the PHPUnit XDS referred in etc/qa/phpunit.xml points to vendor/phpunit/phpunit/phpunit.xsd so we don't go over the network ##*I*##
($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (!file_exists($$phpUnitConfigFIle)) {exit;} $$xml = file_get_contents($$phpUnitConfigFIle); if (!is_string($$xml)) {exit;} for ($$major = 0; $$major < 23; $$major++) { for ($$minor = 0; $$minor < 23; $$minor++) { $$xml = str_replace("https://schema.phpunit.de/" . $$major . "." . $$minor . "/phpunit.xsd", "../../vendor/phpunit/phpunit/phpunit.xsd", $$xml); } } file_put_contents($$phpUnitConfigFIle, $$xml);' || true)
+migrations-php-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit: #### Make sure we see all the warnings, deprecations, etc etc that will make PHPunit do a non-happy exit ##*I*##
+ ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (!file_exists($$phpUnitConfigFIle)) {exit;} $$xml = file_get_contents($$phpUnitConfigFIle); if (!is_string($$xml)) {exit;} $$xml = str_replace(base64_decode("PHBocHVuaXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgYm9vdHN0cmFwPSIuLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwIiBjb2xvcnM9InRydWUiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi92ZW5kb3IvcGhwdW5pdC9waHB1bml0L3BocHVuaXQueHNkIiBjYWNoZURpcmVjdG9yeT0iLi4vLi4vdmFyL3BocHVuaXQvY2FjaGUiPg=="), base64_decode("PHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4="), $$xml); file_put_contents($$phpUnitConfigFIle, $$xml);' || true)
+
migrations-php-move-phpstan: #### Move phpstan.neon to etc/qa/phpstan.neon ##*I*##
($(DOCKER_RUN) mv phpstan.neon etc/qa/phpstan.neon || true)
@@ -203,12 +221,27 @@ migrations-php-phpcs-make-sure-tests-has-no-trailing-slash: #### Make sure PHPCS
migrations-php-phpcs-make-sure-etc-is-ran-through: #### Make sure PHPCS runs through etc ##*I*##
($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} if (strpos($$xml, "../../etc") !== false) {exit;} $$xml = str_replace("../../src", "../../etc\n ../../src", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true)
+migrations-phpcs-include-examples-directory-when-present: #### Make sure PHPCS runs through examples when it exists ##*I*##
+ ($(DOCKER_RUN) php -r 'if (!file_exists("examples/")) {exit;} $$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} if (strpos($$xml, "../../examples") !== false) {exit;} $$xml = str_replace("../../etc", "../../etc\n ../../examples", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true)
+
migrations-php-move-composer-require-checker: #### Move composer-require-checker.json to etc/qa/composer-require-checker.json ##*I*##
($(DOCKER_RUN) mv composer-require-checker.json etc/qa/composer-require-checker.json || true)
migrations-php-composer-require-checker-create-config-if-not-exists: #### Create Composer Require Checker config file if it doesn't exists at etc/qa/composer-require-checker.json ##*I*##
($(DOCKER_RUN) php -r '$$composerRequireCheckerConfigFile = "etc/qa/composer-require-checker.json"; $$composerRequireCheckerConfig = base64_decode("ewogICJzeW1ib2wtd2hpdGVsaXN0IiA6IFsKICAgICJudWxsIiwgInRydWUiLCAiZmFsc2UiLAogICAgInN0YXRpYyIsICJzZWxmIiwgInBhcmVudCIsCiAgICAiYXJyYXkiLCAic3RyaW5nIiwgImludCIsICJmbG9hdCIsICJib29sIiwgIml0ZXJhYmxlIiwgImNhbGxhYmxlIiwgInZvaWQiLCAib2JqZWN0IgogIF0sCiAgInBocC1jb3JlLWV4dGVuc2lvbnMiIDogWwogICAgIkNvcmUiLAogICAgImRhdGUiLAogICAgInBjcmUiLAogICAgIlBoYXIiLAogICAgIlJlZmxlY3Rpb24iLAogICAgIlNQTCIsCiAgICAic3RhbmRhcmQiCiAgXSwKICAic2Nhbi1maWxlcyIgOiBbXQp9Cg=="); if (file_exists($$composerRequireCheckerConfigFile)) {exit;} file_put_contents($$composerRequireCheckerConfigFile, $$composerRequireCheckerConfig);' || true)
+migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line: #### Remove all lines that contains @phpstan-ignore-next-line ##*I*##
+ ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "@phpstan-ignore-next-line")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true)
+
+migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line: #### Remove rest of line for all lines that contain @phpstan-ignore-line ##*I*##
+ ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "/** @phpstan-ignore-line")) { [$$fileContents[$$lineNumber]] = explode("/** @phpstan-ignore-line", $$lineContent); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true)
+
+migrations-inline-code-psalm-remove-line-psalm-suppress: #### Remove all lines that contain @psalm-suppress ##*I*##
+ ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "@psalm-suppress")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true)
+
+migrations-inline-code-remove-line-internal: #### Remove all lines that contain @internal ##*I*##
+ ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "@internal")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true)
+
migrations-php-make-sure-github-exists: #### Make sure .github/ exists ##*I*##
($(DOCKER_RUN) mkdir .github || true)
@@ -261,18 +294,24 @@ migrations-renovate-create-config-if-not-exists: #### Create Renovate Config if
migrations-renovate-point-at-correct-config: #### Ensure .github/renovate.json points at github>WyriHaximus/renovate-config:php-package instead of local>WyriHaximus/renovate-config ##*I*##
($(DOCKER_RUN) php -r '$$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} file_put_contents($$renovateFIle, str_replace("local>WyriHaximus/renovate-config", "github>WyriHaximus/renovate-config:php-package", file_get_contents($$renovateFIle)));' || true)
+migration-renovate-set-php-constraint: #### Always keep renovate's constraints.php in sync with composer.json's config.platform.php ##*I*##
+ ($(DOCKER_RUN) php -r '$$composerFIle = "composer.json"; if (!file_exists($$composerFIle)) {exit;} $$json = json_decode(file_get_contents($$composerFIle), true); if (!array_key_exists("config", $$json)) {exit;} if (!array_key_exists("platform", $$json["config"])) {exit;} if (!array_key_exists("php", $$json["config"]["platform"])) {exit;} $$phpVersionConstraint = str_replace(".13", ".x", $$json["config"]["platform"]["php"]); $$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} $$json = json_decode(file_get_contents($$renovateFIle), true); if (!is_array($$json)) {exit;} if (!array_key_exists("constraints", $$json)) {$$json["constraints"] = [];} $$json["constraints"]["php"] = $$phpVersionConstraint; file_put_contents($$renovateFIle, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true)
+
+migration-renovate-set-composer-constraint: #### Always keep renovate's constraints.composer at 2.x ##*I*##
+ ($(DOCKER_RUN) php -r '$$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} $$json = json_decode(file_get_contents($$renovateFIle), true); if (!is_array($$json)) {exit;} if (!array_key_exists("constraints", $$json)) {$$json["constraints"] = [];} $$json["constraints"]["composer"] = "2.x"; file_put_contents($$renovateFIle, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true)
+
## Our default jobs
on-install-or-update: ## Tasks, like migrations, that specifically have be run after composer install or update. These will also run by self hosted Renovate ####
- $(MAKE) migrations-git-enforce-gitattributes-contents migrations-git-make-sure-gitignore-exists migrations-git-make-sure-gitignore-ignores-var migrations-git-make-sure-gitignore-excludes-var-gitkeep migrations-php-make-sure-var-exists migrations-php-make-sure-var-gitkeep-exists migrations-php-make-sure-etc-exists migrations-php-make-sure-etc-ci-exists migrations-php-make-sure-etc-qa-exists migrations-php-move-psalm-xml-config-to-etc migrations-php-remove-psalm-xml-config migrations-php-remove-old-phpunit-xml-dist-config migrations-php-remove-old-phpunit-xml-config migrations-php-ensure-etc-ci-markdown-link-checker-json-exists migrations-php-move-infection-config-to-etc migrations-php-infection-create-config-if-not-exists migrations-php-remove-phpunit-config-dir-from-infection migrations-php-fix-logs-relative-paths-for-infection migrations-php-infection-ensure-log-text-has-the-correct-path migrations-php-infection-ensure-log-summary-has-the-correct-path migrations-php-infection-ensure-log-json-has-the-correct-path migrations-php-infection-ensure-log-per-mutator-has-the-correct-path migrations-php-add-github-true-to-for-infection migrations-php-set-phpunit-ensure-config-file-exists migrations-php-set-phpunit-xsd-path-to-local migrations-php-move-phpstan migrations-php-set-phpstan-ensure-config-file-exists migrations-php-set-phpstan-uncomment-parameters migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file migrations-php-set-phpstan-paths-in-config migrations-php-set-phpstan-level-max-in-config migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list migrations-php-set-phpstan-drop-include-test-utilities-rules migrations-php-set-phpstan-drop-include-async-test-utilities-rules migrations-php-set-rector-create-config-if-not-exists migrations-php-composer-unused-create-config-if-not-exists migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos migrations-php-move-phpcs migrations-php-move-phpcs-not-dist migrations-php-set-phpcs-ensure-config-file-exists migrations-php-phpcs-make-basepath-is-correct-relatively migrations-php-phpcs-make-cache-is-correct-relatively migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc migrations-php-phpcs-make-sure-etc-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src migrations-php-phpcs-make-sure-src-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests migrations-php-phpcs-make-sure-tests-has-no-trailing-slash migrations-php-phpcs-make-sure-etc-is-ran-through migrations-php-move-composer-require-checker migrations-php-composer-require-checker-create-config-if-not-exists migrations-php-make-sure-github-exists migrations-github-codeowners migrations-php-make-sure-github-workflows-exists migrations-github-actions-remove-composer-diff migrations-github-actions-remove-markdown-check-links migrations-github-actions-remove-markdown-craft-release migrations-github-actions-remove-set-milestone-on-pr migrations-github-actions-move-ci migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow migrations-github-actions-create-ci-if-not-exists migrations-github-actions-move-release-management migrations-github-actions-fix-management-in-release-management-referenced-workflow-file migrations-github-actions-create-release-management-if-not-exists migrations-renovate-remove-dependabot-config migrations-renovate-move-config migrations-renovate-create-config-if-not-exists migrations-renovate-point-at-correct-config syntax-php composer-normalize rector-upgrade cs-fix ## Count: 74
+ $(DOCKER_RUN) $(MAKE) migrations-git-enforce-gitattributes-contents migrations-git-make-sure-gitignore-exists migrations-git-make-sure-gitignore-ignores-var migrations-git-make-sure-gitignore-excludes-var-gitkeep migrations-php-make-sure-var-exists migrations-php-make-sure-var-gitkeep-exists migrations-php-make-sure-etc-exists migrations-php-make-sure-etc-ci-exists migrations-php-make-sure-etc-qa-exists migrations-php-move-psalm-xml-config-to-etc migrations-php-remove-psalm-xml-config migrations-php-remove-old-phpunit-xml-dist-config migrations-php-remove-old-phpunit-xml-config migrations-php-ensure-etc-ci-markdown-link-checker-json-exists migrations-php-move-infection-config-to-etc migrations-php-infection-create-config-if-not-exists migrations-php-remove-phpunit-config-dir-from-infection migrations-php-fix-logs-relative-paths-for-infection migrations-php-infection-ensure-log-text-has-the-correct-path migrations-php-infection-ensure-log-summary-has-the-correct-path migrations-php-infection-ensure-log-json-has-the-correct-path migrations-php-infection-ensure-log-per-mutator-has-the-correct-path migrations-php-add-github-true-to-for-infection migrations-php-make-paths-compatible-with-infection-0-32 migrations-php-set-phpunit-ensure-config-file-exists migrations-php-set-phpunit-xsd-path-to-local migrations-php-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit migrations-php-move-phpstan migrations-php-set-phpstan-ensure-config-file-exists migrations-php-set-phpstan-uncomment-parameters migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file migrations-php-set-phpstan-paths-in-config migrations-php-set-phpstan-level-max-in-config migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list migrations-php-set-phpstan-drop-include-test-utilities-rules migrations-php-set-phpstan-drop-include-async-test-utilities-rules migrations-php-set-rector-create-config-if-not-exists migrations-php-composer-unused-create-config-if-not-exists migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos migrations-php-move-phpcs migrations-php-move-phpcs-not-dist migrations-php-set-phpcs-ensure-config-file-exists migrations-php-phpcs-make-basepath-is-correct-relatively migrations-php-phpcs-make-cache-is-correct-relatively migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc migrations-php-phpcs-make-sure-etc-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src migrations-php-phpcs-make-sure-src-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests migrations-php-phpcs-make-sure-tests-has-no-trailing-slash migrations-php-phpcs-make-sure-etc-is-ran-through migrations-phpcs-include-examples-directory-when-present migrations-php-move-composer-require-checker migrations-php-composer-require-checker-create-config-if-not-exists migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line migrations-inline-code-psalm-remove-line-psalm-suppress migrations-inline-code-remove-line-internal migrations-php-make-sure-github-exists migrations-github-codeowners migrations-php-make-sure-github-workflows-exists migrations-github-actions-remove-composer-diff migrations-github-actions-remove-markdown-check-links migrations-github-actions-remove-markdown-craft-release migrations-github-actions-remove-set-milestone-on-pr migrations-github-actions-move-ci migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow migrations-github-actions-create-ci-if-not-exists migrations-github-actions-move-release-management migrations-github-actions-fix-management-in-release-management-referenced-workflow-file migrations-github-actions-create-release-management-if-not-exists migrations-renovate-remove-dependabot-config migrations-renovate-move-config migrations-renovate-create-config-if-not-exists migrations-renovate-point-at-correct-config migration-renovate-set-php-constraint migration-renovate-set-composer-constraint syntax-php composer-normalize rector-upgrade cs-fix ## Count: 83
syntax-php: ## Lint PHP syntax ##*ILH*##
$(DOCKER_RUN) vendor/bin/parallel-lint --exclude vendor .
composer-normalize: #### Normalize composer.json ##*I*##
$(DOCKER_RUN) composer normalize
- $(DOCKER_RUN) COMPOSER_DISABLE_NETWORK=1 composer update --lock --no-scripts || $(DOCKER_RUN) composer update --lock --no-scripts
+ $(MAKE) update-lock
rector-upgrade: ## Upgrade any automatically upgradable old code ##*I*##
$(DOCKER_RUN) vendor/bin/rector -c ./etc/qa/rector.php
@@ -281,46 +320,58 @@ cs-fix: ## Fix any automatically fixable code style issues ##*I*##
$(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml -vvvv
cs: ## Check the code for code style issues ##*LCH*##
- $(DOCKER_RUN) vendor/bin/phpcs --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml
+ $(DOCKER_SHELL) vendor/bin/phpcs --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml
stan: ## Run static analysis (PHPStan) ##*LCH*##
- $(DOCKER_RUN) vendor/bin/phpstan analyse --ansi --configuration=./etc/qa/phpstan.neon
+ $(DOCKER_SHELL) vendor/bin/phpstan analyse --ansi --configuration=./etc/qa/phpstan.neon
unit-testing: ## Run tests ##*A*##
- $(DOCKER_RUN) vendor/bin/phpunit --colors=always -c ./etc/qa/phpunit.xml $(shell $(DOCKER_RUN) php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }')
+ $(DOCKER_RUN_WITH_SOCKET) vendor/bin/phpunit --colors=always -c ./etc/qa/phpunit.xml $(shell $(DOCKER_SHELL) php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }')
unit-testing-raw: ## Run tests ##*D*## ####
php vendor/phpunit/phpunit/phpunit --colors=always -c ./etc/qa/phpunit.xml $(shell php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }')
+unit-testing-filter: ## Run tests with specified filter ####
+ $(DOCKER_RUN_WITH_SOCKET) vendor/bin/phpunit --colors=always --filter=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) -c ./etc/qa/phpunit.xml $(shell $(DOCKER_SHELL) php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }')
+
mutation-testing: ## Run mutation testing ##*LCH*##
- $(DOCKER_RUN) vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(THREADS) || (cat ./var/infection.log && false)
+ $(DOCKER_RUN_WITH_SOCKET) vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(THREADS)
mutation-testing-raw: ## Run mutation testing ####
- vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(THREADS) || (cat ./var/infection.log && false)
+ vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(THREADS)
composer-require-checker: ## Ensure we require every package used in this package directly ##*C*##
- $(DOCKER_RUN) vendor/bin/composer-require-checker --ignore-parse-errors --ansi -vvv --config-file=./etc/qa/composer-require-checker.json
+ $(DOCKER_SHELL) vendor/bin/composer-require-checker --ignore-parse-errors --ansi -vvv --config-file=./etc/qa/composer-require-checker.json
composer-unused: ## Ensure we don't require any package we don't use in this package directly ##*C*##
- $(DOCKER_RUN) vendor/bin/composer-unused --ansi --configuration=./etc/qa/composer-unused.php
+ $(DOCKER_SHELL) vendor/bin/composer-unused --ansi --configuration=./etc/qa/composer-unused.php
backward-compatibility-check: ## Check code for backwards incompatible changes ##*C*##
$(MAKE) backward-compatibility-check-raw || true
backward-compatibility-check-raw: ## Check code for backwards incompatible changes, doesn't ignore the failure ###
- $(DOCKER_RUN) vendor/bin/roave-backward-compatibility-check
+ $(DOCKER_SHELL) vendor/bin/roave-backward-compatibility-check
install: ### Install dependencies ####
- $(DOCKER_RUN) composer install
+ $(DOCKER_SHELL) composer install
+
+composer-require: ### Require passed dependencies ####
+ $(DOCKER_SHELL) composer require -W $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
update: ### Update dependencies ####
- $(DOCKER_RUN) composer update -W
+ $(DOCKER_SHELL) composer update -W
+
+update-lock: ### Update lockfile ####
+ $(DOCKER_RUN) COMPOSER_DISABLE_NETWORK=1 composer update --lock --no-scripts || $(DOCKER_RUN) composer update --lock --no-scripts
outdated: ### Show outdated dependencies ####
- $(DOCKER_RUN) composer outdated
+ $(DOCKER_SHELL) composer outdated
+
+composer-show: ### Show dependencies ####
+ $(DOCKER_SHELL) composer show
shell: ## Provides Shell access in the expected environment ####
- $(DOCKER_RUN) bash
+ $(DOCKER_SHELL) bash
help: ## Show this help ####
@printf "\033[33mUsage:\033[0m\n make [target]\n\n\033[33mTargets:\033[0m\n"
diff --git a/composer.json b/composer.json
index 7217700..628392e 100644
--- a/composer.json
+++ b/composer.json
@@ -16,8 +16,8 @@
"react/promise": "^3.2"
},
"require-dev": {
- "wyrihaximus/async-test-utilities": "^12.0.0",
- "wyrihaximus/makefiles": "^0.7.15"
+ "wyrihaximus/async-test-utilities": "^12.2.0",
+ "wyrihaximus/makefiles": "^0.10.4"
},
"autoload": {
"psr-4": {
diff --git a/composer.lock b/composer.lock
index ea71e5b..796f6dd 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "f5105411dbc81d31df4e435779f0c849",
+ "content-hash": "3bb1c5e0398a90cc840cc0234db653a9",
"packages": [
{
"name": "clue/redis-protocol",
@@ -717,16 +717,16 @@
"packages-dev": [
{
"name": "azjezz/psl",
- "version": "4.2.0",
+ "version": "4.3.0",
"source": {
"type": "git",
- "url": "https://github.com/azjezz/psl.git",
- "reference": "15153a64c9824335ce11654522e7d88de762d39e"
+ "url": "https://github.com/php-standard-library/php-standard-library.git",
+ "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/azjezz/psl/zipball/15153a64c9824335ce11654522e7d88de762d39e",
- "reference": "15153a64c9824335ce11654522e7d88de762d39e",
+ "url": "https://api.github.com/repos/php-standard-library/php-standard-library/zipball/74c95be0214eb7ea39146ed00ac4eb71b45d787b",
+ "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b",
"shasum": ""
},
"require": {
@@ -739,7 +739,7 @@
"revolt/event-loop": "^1.0.7"
},
"require-dev": {
- "carthage-software/mago": "^1.0.0-beta.32",
+ "carthage-software/mago": "^1.6.0",
"infection/infection": "^0.31.2",
"php-coveralls/php-coveralls": "^2.7.0",
"phpbench/phpbench": "^1.4.0",
@@ -776,8 +776,8 @@
],
"description": "PHP Standard Library",
"support": {
- "issues": "https://github.com/azjezz/psl/issues",
- "source": "https://github.com/azjezz/psl/tree/4.2.0"
+ "issues": "https://github.com/php-standard-library/php-standard-library/issues",
+ "source": "https://github.com/php-standard-library/php-standard-library/tree/4.3.0"
},
"funding": [
{
@@ -789,7 +789,8 @@
"type": "github"
}
],
- "time": "2025-10-25T08:31:40+00:00"
+ "abandoned": "php-standard-library/php-standard-library",
+ "time": "2026-02-24T01:58:53+00:00"
},
{
"name": "beberlei/assert",
@@ -1207,16 +1208,16 @@
},
{
"name": "composer/composer",
- "version": "2.9.5",
+ "version": "2.9.7",
"source": {
"type": "git",
"url": "https://github.com/composer/composer.git",
- "reference": "72a8f8e653710e18d83e5dd531eb5a71fc3223e6"
+ "reference": "82a2fbd1372a98d7915cfb092acf05207d9b4113"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/composer/zipball/72a8f8e653710e18d83e5dd531eb5a71fc3223e6",
- "reference": "72a8f8e653710e18d83e5dd531eb5a71fc3223e6",
+ "url": "https://api.github.com/repos/composer/composer/zipball/82a2fbd1372a98d7915cfb092acf05207d9b4113",
+ "reference": "82a2fbd1372a98d7915cfb092acf05207d9b4113",
"shasum": ""
},
"require": {
@@ -1304,7 +1305,7 @@
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/composer/issues",
"security": "https://github.com/composer/composer/security/policy",
- "source": "https://github.com/composer/composer/tree/2.9.5"
+ "source": "https://github.com/composer/composer/tree/2.9.7"
},
"funding": [
{
@@ -1316,7 +1317,7 @@
"type": "github"
}
],
- "time": "2026-01-29T10:40:53+00:00"
+ "time": "2026-04-14T11:31:52+00:00"
},
{
"name": "composer/metadata-minifier",
@@ -1843,16 +1844,16 @@
},
{
"name": "ergebnis/composer-normalize",
- "version": "2.49.0",
+ "version": "2.51.0",
"source": {
"type": "git",
"url": "https://github.com/ergebnis/composer-normalize.git",
- "reference": "84f3b39dd5d5847a21ec7ca83fc80af97d3ab65c"
+ "reference": "36fb17dce18579ccab50f71b411a32ed55e6d4bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/84f3b39dd5d5847a21ec7ca83fc80af97d3ab65c",
- "reference": "84f3b39dd5d5847a21ec7ca83fc80af97d3ab65c",
+ "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/36fb17dce18579ccab50f71b411a32ed55e6d4bc",
+ "reference": "36fb17dce18579ccab50f71b411a32ed55e6d4bc",
"shasum": ""
},
"require": {
@@ -1868,25 +1869,25 @@
"require-dev": {
"composer/composer": "^2.9.4",
"ergebnis/license": "^2.7.0",
- "ergebnis/php-cs-fixer-config": "^6.58.2",
- "ergebnis/phpstan-rules": "^2.12.0",
- "ergebnis/phpunit-slow-test-detector": "^2.20.0",
- "ergebnis/rector-rules": "^1.9.0",
+ "ergebnis/php-cs-fixer-config": "^6.61.1",
+ "ergebnis/phpstan-rules": "^2.13.1",
+ "ergebnis/phpunit-slow-test-detector": "^2.24.0",
+ "ergebnis/rector-rules": "^1.18.1",
"fakerphp/faker": "^1.24.1",
"phpstan/extension-installer": "^1.4.3",
- "phpstan/phpstan": "^2.1.33",
- "phpstan/phpstan-deprecation-rules": "^2.0.3",
- "phpstan/phpstan-phpunit": "^2.0.12",
- "phpstan/phpstan-strict-rules": "^2.0.7",
- "phpunit/phpunit": "^9.6.20",
- "rector/rector": "^2.3.4",
+ "phpstan/phpstan": "^2.1.47",
+ "phpstan/phpstan-deprecation-rules": "^2.0.4",
+ "phpstan/phpstan-phpunit": "^2.0.16",
+ "phpstan/phpstan-strict-rules": "^2.0.10",
+ "phpunit/phpunit": "^9.6.33",
+ "rector/rector": "^2.4.1",
"symfony/filesystem": "^5.4.41"
},
"type": "composer-plugin",
"extra": {
"class": "Ergebnis\\Composer\\Normalize\\NormalizePlugin",
"branch-alias": {
- "dev-main": "2.49-dev"
+ "dev-main": "2.51-dev"
},
"plugin-optional": true,
"composer-normalize": {
@@ -1923,7 +1924,7 @@
"security": "https://github.com/ergebnis/composer-normalize/blob/main/.github/SECURITY.md",
"source": "https://github.com/ergebnis/composer-normalize"
},
- "time": "2026-01-26T17:38:13+00:00"
+ "time": "2026-04-14T11:17:04+00:00"
},
{
"name": "ergebnis/json",
@@ -2380,26 +2381,26 @@
},
{
"name": "ergebnis/phpunit-slow-test-detector",
- "version": "2.20.0",
+ "version": "2.24.0",
"source": {
"type": "git",
"url": "https://github.com/ergebnis/phpunit-slow-test-detector.git",
- "reference": "36225d36071cb0e7aae3e05a8baa82ace28e1094"
+ "reference": "e713c1397b09e07892657cdf909731d29481ff4c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/phpunit-slow-test-detector/zipball/36225d36071cb0e7aae3e05a8baa82ace28e1094",
- "reference": "36225d36071cb0e7aae3e05a8baa82ace28e1094",
+ "url": "https://api.github.com/repos/ergebnis/phpunit-slow-test-detector/zipball/e713c1397b09e07892657cdf909731d29481ff4c",
+ "reference": "e713c1397b09e07892657cdf909731d29481ff4c",
"shasum": ""
},
"require": {
"php": "~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0",
- "phpunit/phpunit": "^6.5.0 || ^7.5.0 || ^8.5.19 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0"
+ "phpunit/phpunit": "^6.5.0 || ^7.5.0 || ^8.5.19 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0"
},
"require-dev": {
- "ergebnis/composer-normalize": "^2.47.0",
- "ergebnis/license": "^2.6.0",
- "ergebnis/php-cs-fixer-config": "^6.52.0",
+ "ergebnis/composer-normalize": "^2.50.0",
+ "ergebnis/license": "^2.7.0",
+ "ergebnis/php-cs-fixer-config": "^6.60.1",
"fakerphp/faker": "~1.20.0",
"phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^1.12.11",
@@ -2449,7 +2450,7 @@
"security": "https://github.com/ergebnis/phpunit-slow-test-detector/blob/main/.github/SECURITY.md",
"source": "https://github.com/ergebnis/phpunit-slow-test-detector"
},
- "time": "2025-08-19T07:48:39+00:00"
+ "time": "2026-03-13T10:52:55+00:00"
},
{
"name": "fidry/cpu-core-counter",
@@ -2565,16 +2566,16 @@
},
{
"name": "icanhazstring/composer-unused",
- "version": "0.9.5",
+ "version": "0.9.6",
"source": {
"type": "git",
"url": "https://github.com/composer-unused/composer-unused.git",
- "reference": "13b1d32e35e7c6dc997c01342c4fe1b217b6d767"
+ "reference": "c60030af7954a528746dd2180c10b5e0871e84c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer-unused/composer-unused/zipball/13b1d32e35e7c6dc997c01342c4fe1b217b6d767",
- "reference": "13b1d32e35e7c6dc997c01342c4fe1b217b6d767",
+ "url": "https://api.github.com/repos/composer-unused/composer-unused/zipball/c60030af7954a528746dd2180c10b5e0871e84c7",
+ "reference": "c60030af7954a528746dd2180c10b5e0871e84c7",
"shasum": ""
},
"require": {
@@ -2589,19 +2590,19 @@
"phpstan/phpdoc-parser": "^1.25 || ^2",
"psr/container": "^1.0 || ^2.0",
"psr/log": "^1.1 || ^2 || ^3",
- "symfony/config": "^6.0 || ^7.0",
- "symfony/console": "^6.0 || ^7.0",
- "symfony/dependency-injection": "^6.0 || ^7.0",
- "symfony/property-access": "^6.0 || ^7.0",
- "symfony/serializer": "^6.0 || ^7.0",
- "webmozart/assert": "^1.10",
+ "symfony/config": "^6.0 || ^7.0 || ^8.0",
+ "symfony/console": "^6.0 || ^7.0 || ^8.0",
+ "symfony/dependency-injection": "^6.0 || ^7.0 || ^8.0",
+ "symfony/property-access": "^6.0 || ^7.0 || ^8.0",
+ "symfony/serializer": "^6.0 || ^7.0 || ^8.0",
+ "webmozart/assert": "^1.10 || ^2.0",
"webmozart/glob": "^4.4"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8",
"codeception/verify": "^3.1",
"dg/bypass-finals": "^1.6",
- "ergebnis/composer-normalize": "^2.42",
+ "ergebnis/composer-normalize": "^2.49",
"ext-ds": "*",
"ext-zend-opcache": "*",
"jangregor/phpstan-prophecy": "^2.1.1",
@@ -2609,11 +2610,11 @@
"php-ds/php-ds": "^1.5",
"phpspec/prophecy-phpunit": "^2.2.0",
"phpstan/extension-installer": "^1.3",
- "phpstan/phpstan": "^2.1.8",
- "phpstan/phpstan-phpunit": "^2.0.4",
- "phpunit/phpunit": "^9.6.13",
+ "phpstan/phpstan": "^2.1.37",
+ "phpstan/phpstan-phpunit": "^2.0.12",
+ "phpunit/phpunit": "^9.6.34",
"roave/security-advisories": "dev-master",
- "squizlabs/php_codesniffer": "^3.9"
+ "squizlabs/php_codesniffer": "^3.13"
},
"bin": [
"bin/composer-unused"
@@ -2662,7 +2663,7 @@
"type": "other"
}
],
- "time": "2025-09-22T07:07:50+00:00"
+ "time": "2026-01-30T05:52:24+00:00"
},
{
"name": "infection/abstract-testframework-adapter",
@@ -2843,16 +2844,16 @@
},
{
"name": "infection/infection",
- "version": "0.32.3",
+ "version": "0.32.6",
"source": {
"type": "git",
"url": "https://github.com/infection/infection.git",
- "reference": "3654db483619b63b9bcb04c24caeb03677c6d057"
+ "reference": "4ed769947eaf2ecf42203027301bad2bedf037e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/infection/infection/zipball/3654db483619b63b9bcb04c24caeb03677c6d057",
- "reference": "3654db483619b63b9bcb04c24caeb03677c6d057",
+ "url": "https://api.github.com/repos/infection/infection/zipball/4ed769947eaf2ecf42203027301bad2bedf037e5",
+ "reference": "4ed769947eaf2ecf42203027301bad2bedf037e5",
"shasum": ""
},
"require": {
@@ -2873,11 +2874,11 @@
"ondram/ci-detector": "^4.1.0",
"php": "^8.2",
"psr/log": "^2.0 || ^3.0",
- "sanmai/di-container": "^0.1.4",
+ "sanmai/di-container": "^0.1.12",
"sanmai/duoclock": "^0.1.0",
"sanmai/later": "^0.1.7",
- "sanmai/pipeline": "^7.0",
- "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0",
+ "sanmai/pipeline": "^7.2",
+ "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0",
"symfony/console": "^6.4 || ^7.0 || ^8.0",
"symfony/filesystem": "^6.4 || ^7.0 || ^8.0",
"symfony/finder": "^6.4 || ^7.0 || ^8.0",
@@ -2963,7 +2964,7 @@
],
"support": {
"issues": "https://github.com/infection/infection/issues",
- "source": "https://github.com/infection/infection/tree/0.32.3"
+ "source": "https://github.com/infection/infection/tree/0.32.6"
},
"funding": [
{
@@ -2975,7 +2976,7 @@
"type": "open_collective"
}
],
- "time": "2026-01-13T14:23:38+00:00"
+ "time": "2026-02-26T14:34:26+00:00"
},
{
"name": "infection/mutator",
@@ -3032,23 +3033,23 @@
},
{
"name": "jetbrains/phpstorm-stubs",
- "version": "v2024.3",
+ "version": "v2025.3",
"source": {
"type": "git",
- "url": "https://github.com/JetBrains/phpstorm-stubs.git",
- "reference": "0e82bdfe850c71857ee4ee3501ed82a9fc5d043c"
+ "url": "https://github.com/JetBrains/phpstorm-stubs",
+ "reference": "d1ee5e570343bd4276a3d5959e6e1c2530b006d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/0e82bdfe850c71857ee4ee3501ed82a9fc5d043c",
- "reference": "0e82bdfe850c71857ee4ee3501ed82a9fc5d043c",
+ "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/d1ee5e570343bd4276a3d5959e6e1c2530b006d0",
+ "reference": "d1ee5e570343bd4276a3d5959e6e1c2530b006d0",
"shasum": ""
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "v3.64.0",
- "nikic/php-parser": "v5.3.1",
- "phpdocumentor/reflection-docblock": "5.6.0",
- "phpunit/phpunit": "11.4.3"
+ "friendsofphp/php-cs-fixer": "^v3.86",
+ "nikic/php-parser": "^v5.6",
+ "phpdocumentor/reflection-docblock": "^5.6",
+ "phpunit/phpunit": "^12.3"
},
"type": "library",
"autoload": {
@@ -3072,10 +3073,7 @@
"stubs",
"type"
],
- "support": {
- "source": "https://github.com/JetBrains/phpstorm-stubs/tree/v2024.3"
- },
- "time": "2024-12-14T08:03:12+00:00"
+ "time": "2025-09-18T15:47:24+00:00"
},
{
"name": "justinrainbow/json-schema",
@@ -4235,11 +4233,11 @@
},
{
"name": "phpstan/phpstan",
- "version": "2.1.37",
+ "version": "2.1.50",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/28cd424c5ea984128c95cfa7ea658808e8954e49",
- "reference": "28cd424c5ea984128c95cfa7ea658808e8954e49",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d452086fb4cf648c6b2d8cf3b639351f79e4f3e2",
+ "reference": "d452086fb4cf648c6b2d8cf3b639351f79e4f3e2",
"shasum": ""
},
"require": {
@@ -4284,25 +4282,25 @@
"type": "github"
}
],
- "time": "2026-01-24T08:21:55+00:00"
+ "time": "2026-04-17T13:10:32+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
- "version": "2.0.3",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
- "reference": "468e02c9176891cc901143da118f09dc9505fc2f"
+ "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/468e02c9176891cc901143da118f09dc9505fc2f",
- "reference": "468e02c9176891cc901143da118f09dc9505fc2f",
+ "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/6b5571001a7f04fa0422254c30a0017ec2f2cacc",
+ "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.15"
+ "phpstan/phpstan": "^2.1.39"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
@@ -4327,11 +4325,14 @@
"MIT"
],
"description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
+ "keywords": [
+ "static analysis"
+ ],
"support": {
"issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
- "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.3"
+ "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.4"
},
- "time": "2025-05-14T10:56:57+00:00"
+ "time": "2026-02-09T13:21:14+00:00"
},
{
"name": "phpstan/phpstan-mockery",
@@ -4384,16 +4385,16 @@
},
{
"name": "phpstan/phpstan-phpunit",
- "version": "2.0.12",
+ "version": "2.0.16",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-phpunit.git",
- "reference": "e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4"
+ "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4",
- "reference": "e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4",
+ "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6ab598e1bc106e6827fd346ae4a12b4a5d634c32",
+ "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32",
"shasum": ""
},
"require": {
@@ -4429,29 +4430,32 @@
"MIT"
],
"description": "PHPUnit extensions and rules for PHPStan",
+ "keywords": [
+ "static analysis"
+ ],
"support": {
"issues": "https://github.com/phpstan/phpstan-phpunit/issues",
- "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.12"
+ "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.16"
},
- "time": "2026-01-22T13:40:00+00:00"
+ "time": "2026-02-14T09:05:21+00:00"
},
{
"name": "phpstan/phpstan-strict-rules",
- "version": "2.0.8",
+ "version": "2.0.10",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-strict-rules.git",
- "reference": "1ed9e626a37f7067b594422411539aa807190573"
+ "reference": "1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/1ed9e626a37f7067b594422411539aa807190573",
- "reference": "1ed9e626a37f7067b594422411539aa807190573",
+ "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f",
+ "reference": "1aba28b697c1e3b6bbec8a1725f8b11b6d3e5a5f",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.29"
+ "phpstan/phpstan": "^2.1.39"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
@@ -4477,24 +4481,27 @@
"MIT"
],
"description": "Extra strict and opinionated rules for PHPStan",
+ "keywords": [
+ "static analysis"
+ ],
"support": {
"issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
- "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.8"
+ "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.10"
},
- "time": "2026-01-27T08:10:25+00:00"
+ "time": "2026-02-11T14:17:32+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "12.5.2",
+ "version": "12.5.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b"
+ "reference": "876099a072646c7745f673d7aeab5382c4439691"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4a9739b51cbcb355f6e95659612f92e282a7077b",
- "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/876099a072646c7745f673d7aeab5382c4439691",
+ "reference": "876099a072646c7745f673d7aeab5382c4439691",
"shasum": ""
},
"require": {
@@ -4503,7 +4510,6 @@
"ext-xmlwriter": "*",
"nikic/php-parser": "^5.7.0",
"php": ">=8.3",
- "phpunit/php-file-iterator": "^6.0",
"phpunit/php-text-template": "^5.0",
"sebastian/complexity": "^5.0",
"sebastian/environment": "^8.0.3",
@@ -4550,7 +4556,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.2"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.6"
},
"funding": [
{
@@ -4570,20 +4576,20 @@
"type": "tidelift"
}
],
- "time": "2025-12-24T07:03:04+00:00"
+ "time": "2026-04-15T08:23:17+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "6.0.0",
+ "version": "6.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "961bc913d42fe24a257bfff826a5068079ac7782"
+ "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782",
- "reference": "961bc913d42fe24a257bfff826a5068079ac7782",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5",
+ "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5",
"shasum": ""
},
"require": {
@@ -4623,15 +4629,27 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0"
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator",
+ "type": "tidelift"
}
],
- "time": "2025-02-07T04:58:37+00:00"
+ "time": "2026-02-02T14:04:18+00:00"
},
{
"name": "phpunit/php-invoker",
@@ -4819,16 +4837,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "12.5.8",
+ "version": "12.5.23",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889"
+ "reference": "c54fcf3d6bcb6e96ac2f7e40097dc37b5f139969"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889",
- "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c54fcf3d6bcb6e96ac2f7e40097dc37b5f139969",
+ "reference": "c54fcf3d6bcb6e96ac2f7e40097dc37b5f139969",
"shasum": ""
},
"require": {
@@ -4842,18 +4860,19 @@
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.3",
- "phpunit/php-code-coverage": "^12.5.2",
- "phpunit/php-file-iterator": "^6.0.0",
+ "phpunit/php-code-coverage": "^12.5.6",
+ "phpunit/php-file-iterator": "^6.0.1",
"phpunit/php-invoker": "^6.0.0",
"phpunit/php-text-template": "^5.0.0",
"phpunit/php-timer": "^8.0.0",
"sebastian/cli-parser": "^4.2.0",
- "sebastian/comparator": "^7.1.4",
+ "sebastian/comparator": "^7.1.6",
"sebastian/diff": "^7.0.0",
- "sebastian/environment": "^8.0.3",
+ "sebastian/environment": "^8.1.0",
"sebastian/exporter": "^7.0.2",
"sebastian/global-state": "^8.0.2",
"sebastian/object-enumerator": "^7.0.0",
+ "sebastian/recursion-context": "^7.0.1",
"sebastian/type": "^6.0.3",
"sebastian/version": "^6.0.0",
"staabm/side-effects-detector": "^1.0.5"
@@ -4896,31 +4915,15 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.23"
},
"funding": [
{
- "url": "https://phpunit.de/sponsors.html",
- "type": "custom"
- },
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- },
- {
- "url": "https://liberapay.com/sebastianbergmann",
- "type": "liberapay"
- },
- {
- "url": "https://thanks.dev/u/gh/sebastianbergmann",
- "type": "thanks_dev"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
- "type": "tidelift"
+ "url": "https://phpunit.de/sponsoring.html",
+ "type": "other"
}
],
- "time": "2026-01-27T06:12:29+00:00"
+ "time": "2026-04-18T06:12:49+00:00"
},
{
"name": "psr/clock",
@@ -5150,21 +5153,21 @@
},
{
"name": "rector/rector",
- "version": "2.3.5",
+ "version": "2.4.2",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "9442f4037de6a5347ae157fe8e6c7cda9d909070"
+ "reference": "e645b6463c6a88ea5b44b17d3387d35a912c7946"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/9442f4037de6a5347ae157fe8e6c7cda9d909070",
- "reference": "9442f4037de6a5347ae157fe8e6c7cda9d909070",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/e645b6463c6a88ea5b44b17d3387d35a912c7946",
+ "reference": "e645b6463c6a88ea5b44b17d3387d35a912c7946",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0",
- "phpstan/phpstan": "^2.1.36"
+ "phpstan/phpstan": "^2.1.48"
},
"conflict": {
"rector/rector-doctrine": "*",
@@ -5198,7 +5201,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/2.3.5"
+ "source": "https://github.com/rectorphp/rector/tree/2.4.2"
},
"funding": [
{
@@ -5206,7 +5209,7 @@
"type": "github"
}
],
- "time": "2026-01-28T15:22:48+00:00"
+ "time": "2026-04-16T13:07:34+00:00"
},
{
"name": "revolt/event-loop",
@@ -5282,31 +5285,31 @@
},
{
"name": "roave/backward-compatibility-check",
- "version": "8.17.0",
+ "version": "8.19.0",
"source": {
"type": "git",
"url": "https://github.com/Roave/BackwardCompatibilityCheck.git",
- "reference": "b3aab0b917d127c3e048b4f96a7f588388e30ac9"
+ "reference": "810eb88eeff37ef300653bcfb77ca51a314777a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Roave/BackwardCompatibilityCheck/zipball/b3aab0b917d127c3e048b4f96a7f588388e30ac9",
- "reference": "b3aab0b917d127c3e048b4f96a7f588388e30ac9",
+ "url": "https://api.github.com/repos/Roave/BackwardCompatibilityCheck/zipball/810eb88eeff37ef300653bcfb77ca51a314777a2",
+ "reference": "810eb88eeff37ef300653bcfb77ca51a314777a2",
"shasum": ""
},
"require": {
- "azjezz/psl": "^4.2.0",
- "composer/composer": "^2.9.2",
+ "azjezz/psl": "^4.2.1",
+ "composer/composer": "^2.9.5",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-simplexml": "*",
- "nikic/php-parser": "^5.6.2",
+ "nikic/php-parser": "^5.7.0",
"nikolaposa/version": "^4.2.1",
"ocramius/package-versions": "^2.11.0",
"php": "~8.3.0 || ~8.4.0 || ~8.5.0",
- "roave/better-reflection": "^6.66.0",
- "symfony/console": "^7.4.0"
+ "roave/better-reflection": "^6.69.0",
+ "symfony/console": "^7.4.4"
},
"conflict": {
"marc-mabe/php-enum": "<4.7.2",
@@ -5315,14 +5318,14 @@
},
"require-dev": {
"doctrine/coding-standard": "^14.0.0",
- "justinrainbow/json-schema": "^6.6.2",
+ "justinrainbow/json-schema": "^6.6.4",
"php-standard-library/psalm-plugin": "^2.3.0",
- "phpunit/phpunit": "^12.4.4",
+ "phpunit/phpunit": "^12.5.11",
"psalm/plugin-phpunit": "^0.19.5",
- "roave/infection-static-analysis-plugin": "^1.41.0",
+ "roave/infection-static-analysis-plugin": "^1.43.0",
"roave/security-advisories": "dev-master",
"squizlabs/php_codesniffer": "^4.0.1",
- "vimeo/psalm": "^6.13.1"
+ "vimeo/psalm": "^6.15.1"
},
"bin": [
"bin/roave-backward-compatibility-check"
@@ -5350,36 +5353,36 @@
"description": "Tool to compare two revisions of a public API to check for BC breaks",
"support": {
"issues": "https://github.com/Roave/BackwardCompatibilityCheck/issues",
- "source": "https://github.com/Roave/BackwardCompatibilityCheck/tree/8.17.0"
+ "source": "https://github.com/Roave/BackwardCompatibilityCheck/tree/8.19.0"
},
- "time": "2025-11-29T01:02:22+00:00"
+ "time": "2026-02-13T19:14:25+00:00"
},
{
"name": "roave/better-reflection",
- "version": "6.66.0",
+ "version": "6.69.0",
"source": {
"type": "git",
"url": "https://github.com/Roave/BetterReflection.git",
- "reference": "e70a06dc5cd572e108448a431b6c2840ad16c1b2"
+ "reference": "dccbd10b5b3da8718f2945ad50faf90a1cb2db55"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Roave/BetterReflection/zipball/e70a06dc5cd572e108448a431b6c2840ad16c1b2",
- "reference": "e70a06dc5cd572e108448a431b6c2840ad16c1b2",
+ "url": "https://api.github.com/repos/Roave/BetterReflection/zipball/dccbd10b5b3da8718f2945ad50faf90a1cb2db55",
+ "reference": "dccbd10b5b3da8718f2945ad50faf90a1cb2db55",
"shasum": ""
},
"require": {
"ext-json": "*",
- "jetbrains/phpstorm-stubs": "2024.3",
- "nikic/php-parser": "^5.6.1",
- "php": "~8.2.0 || ~8.3.2 || ~8.4.1 || ~8.5.0"
+ "jetbrains/phpstorm-stubs": "2025.3",
+ "nikic/php-parser": "^5.7.0",
+ "php": "~8.3.2 || ~8.4.1 || ~8.5.0"
},
"conflict": {
"thecodingmachine/safe": "<1.1.3"
},
"require-dev": {
- "phpbench/phpbench": "^1.4.1",
- "phpunit/phpunit": "^11.5.42"
+ "phpbench/phpbench": "^1.4.3",
+ "phpunit/phpunit": "^12.5.8"
},
"suggest": {
"composer/composer": "Required to use the ComposerSourceLocator"
@@ -5419,22 +5422,22 @@
"description": "Better Reflection - an improved code reflection API",
"support": {
"issues": "https://github.com/Roave/BetterReflection/issues",
- "source": "https://github.com/Roave/BetterReflection/tree/6.66.0"
+ "source": "https://github.com/Roave/BetterReflection/tree/6.69.0"
},
- "time": "2025-11-04T20:38:27+00:00"
+ "time": "2026-02-01T13:20:30+00:00"
},
{
"name": "sanmai/di-container",
- "version": "0.1.5",
+ "version": "0.1.12",
"source": {
"type": "git",
"url": "https://github.com/sanmai/di-container.git",
- "reference": "355534ad7970fc7dab4211ecaf2da5c546855ee8"
+ "reference": "8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sanmai/di-container/zipball/355534ad7970fc7dab4211ecaf2da5c546855ee8",
- "reference": "355534ad7970fc7dab4211ecaf2da5c546855ee8",
+ "url": "https://api.github.com/repos/sanmai/di-container/zipball/8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b",
+ "reference": "8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b",
"shasum": ""
},
"require": {
@@ -5445,14 +5448,18 @@
"require-dev": {
"ergebnis/composer-normalize": "^2.8",
"friendsofphp/php-cs-fixer": "^3.17",
- "infection/infection": ">=0.29",
+ "infection/infection": ">=0.31",
"php-coveralls/php-coveralls": "^2.4.1",
+ "phpbench/phpbench": "^1.4",
"phpstan/extension-installer": "^1.4",
"phpunit/phpunit": "^11.5.25",
"sanmai/phpstan-rules": "^0.3.10"
},
"type": "library",
"extra": {
+ "branch-alias": {
+ "dev-main": "0.1.x-dev"
+ },
"preferred-install": "dist"
},
"autoload": {
@@ -5488,7 +5495,7 @@
],
"support": {
"issues": "https://github.com/sanmai/di-container/issues",
- "source": "https://github.com/sanmai/di-container/tree/0.1.5"
+ "source": "https://github.com/sanmai/di-container/tree/0.1.12"
},
"funding": [
{
@@ -5496,7 +5503,7 @@
"type": "github"
}
],
- "time": "2025-08-04T09:43:58+00:00"
+ "time": "2026-01-27T08:25:46+00:00"
},
{
"name": "sanmai/duoclock",
@@ -5765,16 +5772,16 @@
},
{
"name": "sebastian/comparator",
- "version": "7.1.4",
+ "version": "7.1.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6"
+ "reference": "c769009dee98f494e0edc3fd4f4087501688f11e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6",
- "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c769009dee98f494e0edc3fd4f4087501688f11e",
+ "reference": "c769009dee98f494e0edc3fd4f4087501688f11e",
"shasum": ""
},
"require": {
@@ -5833,7 +5840,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
- "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.6"
},
"funding": [
{
@@ -5853,7 +5860,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-24T09:28:48+00:00"
+ "time": "2026-04-14T08:23:15+00:00"
},
{
"name": "sebastian/complexity",
@@ -5982,16 +5989,16 @@
},
{
"name": "sebastian/environment",
- "version": "8.0.3",
+ "version": "8.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68"
+ "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68",
- "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b121608b28a13f721e76ffbbd386d08eff58f3f6",
+ "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6",
"shasum": ""
},
"require": {
@@ -6006,7 +6013,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "8.0-dev"
+ "dev-main": "8.1-dev"
}
},
"autoload": {
@@ -6034,7 +6041,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy",
- "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3"
+ "source": "https://github.com/sebastianbergmann/environment/tree/8.1.0"
},
"funding": [
{
@@ -6054,7 +6061,7 @@
"type": "tidelift"
}
],
- "time": "2025-08-12T14:11:56+00:00"
+ "time": "2026-04-15T12:13:01+00:00"
},
{
"name": "sebastian/exporter",
@@ -6845,16 +6852,16 @@
},
{
"name": "shipmonk/phpstan-rules",
- "version": "4.3.5",
+ "version": "4.3.7",
"source": {
"type": "git",
"url": "https://github.com/shipmonk-rnd/phpstan-rules.git",
- "reference": "80e53dca2cd5897de3bfcf57690d7c5ae7bb82e7"
+ "reference": "a46689f9179206f1edcfe078bcec6fc1ec5bf202"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/shipmonk-rnd/phpstan-rules/zipball/80e53dca2cd5897de3bfcf57690d7c5ae7bb82e7",
- "reference": "80e53dca2cd5897de3bfcf57690d7c5ae7bb82e7",
+ "url": "https://api.github.com/repos/shipmonk-rnd/phpstan-rules/zipball/a46689f9179206f1edcfe078bcec6fc1ec5bf202",
+ "reference": "a46689f9179206f1edcfe078bcec6fc1ec5bf202",
"shasum": ""
},
"require": {
@@ -6867,7 +6874,7 @@
"phpstan/phpstan-deprecation-rules": "^2.0.1",
"phpstan/phpstan-phpunit": "^2.0.4",
"phpstan/phpstan-strict-rules": "^2.0.3",
- "phpunit/phpunit": "^9.6.22",
+ "phpunit/phpunit": "^9.6.33",
"shipmonk/coding-standard": "^0.2.0",
"shipmonk/composer-dependency-analyser": "^1.8.1",
"shipmonk/coverage-guard": "^1.0.0",
@@ -6899,9 +6906,9 @@
],
"support": {
"issues": "https://github.com/shipmonk-rnd/phpstan-rules/issues",
- "source": "https://github.com/shipmonk-rnd/phpstan-rules/tree/4.3.5"
+ "source": "https://github.com/shipmonk-rnd/phpstan-rules/tree/4.3.7"
},
- "time": "2026-01-23T11:02:10+00:00"
+ "time": "2026-04-07T07:56:34+00:00"
},
{
"name": "slevomat/coding-standard",
@@ -7251,16 +7258,16 @@
},
{
"name": "symfony/console",
- "version": "v7.4.1",
+ "version": "v7.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e"
+ "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
- "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
+ "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707",
+ "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707",
"shasum": ""
},
"require": {
@@ -7325,7 +7332,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.4.1"
+ "source": "https://github.com/symfony/console/tree/v7.4.8"
},
"funding": [
{
@@ -7345,7 +7352,7 @@
"type": "tidelift"
}
],
- "time": "2025-12-05T15:23:39+00:00"
+ "time": "2026-03-30T13:54:39+00:00"
},
{
"name": "symfony/dependency-injection",
@@ -9461,34 +9468,34 @@
},
{
"name": "wyrihaximus/async-test-utilities",
- "version": "12.0.0",
+ "version": "12.2.0",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/php-async-test-utilities.git",
- "reference": "e454d9d5133046f65843884895ae8bde126974e6"
+ "reference": "cee055045085f13ccd63fbf7472947828b7c50cb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/php-async-test-utilities/zipball/e454d9d5133046f65843884895ae8bde126974e6",
- "reference": "e454d9d5133046f65843884895ae8bde126974e6",
+ "url": "https://api.github.com/repos/WyriHaximus/php-async-test-utilities/zipball/cee055045085f13ccd63fbf7472947828b7c50cb",
+ "reference": "cee055045085f13ccd63fbf7472947828b7c50cb",
"shasum": ""
},
"require": {
"php": "^8.4",
- "phpunit/phpunit": "^12.5.8",
+ "phpunit/phpunit": "^12.5.23",
"react/async": "^4.3.0",
"react/event-loop": "^1.6.0",
"react/promise": "^3.3.0",
"wyrihaximus/phpstan-react": "^2.0.0",
"wyrihaximus/react-phpunit-run-tests-in-fiber": "^3.0.0",
- "wyrihaximus/test-utilities": "^12.0.0"
+ "wyrihaximus/test-utilities": "^12.2.0"
},
"conflict": {
"composer/compoer": "<2.6.0"
},
"require-dev": {
"react/promise-timer": "^1.11.0",
- "wyrihaximus/makefiles": "^0.8.1"
+ "wyrihaximus/makefiles": "^0.10.4"
},
"type": "library",
"extra": {
@@ -9516,7 +9523,7 @@
"description": "Test utilities for api-clients packages",
"support": {
"issues": "https://github.com/WyriHaximus/php-async-test-utilities/issues",
- "source": "https://github.com/WyriHaximus/php-async-test-utilities/tree/12.0.0"
+ "source": "https://github.com/WyriHaximus/php-async-test-utilities/tree/12.2.0"
},
"funding": [
{
@@ -9524,7 +9531,7 @@
"type": "github"
}
],
- "time": "2026-01-29T21:03:55+00:00"
+ "time": "2026-04-19T20:08:46+00:00"
},
{
"name": "wyrihaximus/coding-standard",
@@ -9567,16 +9574,16 @@
},
{
"name": "wyrihaximus/makefiles",
- "version": "0.7.15",
+ "version": "0.10.4",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/Makefiles.git",
- "reference": "ff6af9e36ff4f5605523586f6964f13f9ea778de"
+ "reference": "1f78e24e998cdfd5557ce04125b9add6a26c05cb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/ff6af9e36ff4f5605523586f6964f13f9ea778de",
- "reference": "ff6af9e36ff4f5605523586f6964f13f9ea778de",
+ "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/1f78e24e998cdfd5557ce04125b9add6a26c05cb",
+ "reference": "1f78e24e998cdfd5557ce04125b9add6a26c05cb",
"shasum": ""
},
"require": {
@@ -9585,10 +9592,10 @@
"php": "^8.4"
},
"conflict": {
- "infection/infection": "<0.31.3"
+ "infection/infection": "<0.32.0"
},
"require-dev": {
- "wyrihaximus/test-utilities": "^8.8.0"
+ "wyrihaximus/test-utilities": "^12.1.0"
},
"type": "composer-plugin",
"extra": {
@@ -9612,7 +9619,7 @@
"description": "🧱 Makefile building blocks",
"support": {
"issues": "https://github.com/WyriHaximus/Makefiles/issues",
- "source": "https://github.com/WyriHaximus/Makefiles/tree/0.7.15"
+ "source": "https://github.com/WyriHaximus/Makefiles/tree/0.10.4"
},
"funding": [
{
@@ -9620,7 +9627,7 @@
"type": "github"
}
],
- "time": "2025-12-20T14:30:01+00:00"
+ "time": "2026-04-18T16:54:49+00:00"
},
{
"name": "wyrihaximus/phpstan-react",
@@ -9678,29 +9685,29 @@
},
{
"name": "wyrihaximus/phpstan-rules-wrapper",
- "version": "12.1.0",
+ "version": "12.2.0",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper.git",
- "reference": "7c41552259c9bb1a68970224204f12fe9abcd3d1"
+ "reference": "a3d005d1fc7861d282c4b8fd060fb13e79043a19"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/php-phpstan-rules-wrapper/zipball/7c41552259c9bb1a68970224204f12fe9abcd3d1",
- "reference": "7c41552259c9bb1a68970224204f12fe9abcd3d1",
+ "url": "https://api.github.com/repos/WyriHaximus/php-phpstan-rules-wrapper/zipball/a3d005d1fc7861d282c4b8fd060fb13e79043a19",
+ "reference": "a3d005d1fc7861d282c4b8fd060fb13e79043a19",
"shasum": ""
},
"require": {
"ergebnis/phpstan-rules": "^2.13.1",
"php": "^8.4",
"phpstan/extension-installer": "^1.4.3",
- "phpstan/phpstan": "^2.1.37",
- "phpstan/phpstan-deprecation-rules": "^2.0.3",
+ "phpstan/phpstan": "^2.1.40",
+ "phpstan/phpstan-deprecation-rules": "^2.0.4",
"phpstan/phpstan-mockery": "^2.0.0",
- "phpstan/phpstan-phpunit": "^2.0.12",
- "phpstan/phpstan-strict-rules": "^2.0.8",
+ "phpstan/phpstan-phpunit": "^2.0.16",
+ "phpstan/phpstan-strict-rules": "^2.0.10",
"shipmonk/dead-code-detector": "^0.14.1",
- "shipmonk/phpstan-rules": "^4.3.5",
+ "shipmonk/phpstan-rules": "^4.3.6",
"staabm/phpstan-psr3": "^1.0.3",
"symplify/phpstan-extensions": "^12.0.2",
"tomasvotruba/type-coverage": "^2.1.0",
@@ -9727,7 +9734,7 @@
"description": "🌯 PHPStan rules wrapper",
"support": {
"issues": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/issues",
- "source": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/tree/12.1.0"
+ "source": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/tree/12.2.0"
},
"funding": [
{
@@ -9735,7 +9742,7 @@
"type": "github"
}
],
- "time": "2026-01-29T18:58:51+00:00"
+ "time": "2026-02-26T23:44:30+00:00"
},
{
"name": "wyrihaximus/react-phpunit-run-tests-in-fiber",
@@ -9797,38 +9804,38 @@
},
{
"name": "wyrihaximus/test-utilities",
- "version": "12.0.0",
+ "version": "12.2.0",
"source": {
"type": "git",
"url": "https://github.com/WyriHaximus/php-test-utilities.git",
- "reference": "19f873e7d49179ff4e6a7630e8bd23d29add8356"
+ "reference": "d03332b087598b8207375a3eb872df22f64f8e40"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WyriHaximus/php-test-utilities/zipball/19f873e7d49179ff4e6a7630e8bd23d29add8356",
- "reference": "19f873e7d49179ff4e6a7630e8bd23d29add8356",
+ "url": "https://api.github.com/repos/WyriHaximus/php-test-utilities/zipball/d03332b087598b8207375a3eb872df22f64f8e40",
+ "reference": "d03332b087598b8207375a3eb872df22f64f8e40",
"shasum": ""
},
"require": {
"composer-plugin-api": "^2",
- "ergebnis/composer-normalize": "^2.49.0",
- "ergebnis/phpunit-slow-test-detector": "^2.20.0",
+ "ergebnis/composer-normalize": "^2.51.0",
+ "ergebnis/phpunit-slow-test-detector": "^2.24.0",
"ext-hash": "^8.4",
"ext-json": "^8.4",
- "icanhazstring/composer-unused": "^0.9.5",
- "infection/infection": "^0.32.3",
+ "icanhazstring/composer-unused": "^0.9.6",
+ "infection/infection": "^0.32.6",
"maglnet/composer-require-checker": "^4.20.0",
"mockery/mockery": "^1.6.12",
"php": "^8.4",
"php-parallel-lint/php-console-highlighter": "^1.0.0",
"php-parallel-lint/php-parallel-lint": "^1.4.0",
- "phpstan/phpstan": "^2.1.37",
- "phpunit/phpunit": "^12.5.8",
- "rector/rector": "^2.3.5",
- "roave/backward-compatibility-check": "^8.17.0",
+ "phpstan/phpstan": "^2.1.50",
+ "phpunit/phpunit": "^12.5.23",
+ "rector/rector": "^2.4.2",
+ "roave/backward-compatibility-check": "^8.19.0",
"squizlabs/php_codesniffer": "^4.0.1",
"wyrihaximus/coding-standard": "^4.0.0",
- "wyrihaximus/phpstan-rules-wrapper": "^12.1.0"
+ "wyrihaximus/phpstan-rules-wrapper": "^12.2.0"
},
"conflict": {
"composer-unused/symbol-parser": "<0.3.3",
@@ -9836,7 +9843,7 @@
"wyrihaximus/makefiles": "<0.5.0"
},
"require-dev": {
- "wyrihaximus/makefiles": "^0.8.1"
+ "wyrihaximus/makefiles": "^0.10.4"
},
"suggest": {
"wyrihaximus/async-test-utilities": "The recommended addition to this package when building ReactPHP packages and projects.",
@@ -9869,7 +9876,7 @@
"description": "🛠️ Test utilities for api-clients packages",
"support": {
"issues": "https://github.com/WyriHaximus/php-test-utilities/issues",
- "source": "https://github.com/WyriHaximus/php-test-utilities/tree/12.0.0"
+ "source": "https://github.com/WyriHaximus/php-test-utilities/tree/12.2.0"
},
"funding": [
{
@@ -9877,7 +9884,7 @@
"type": "github"
}
],
- "time": "2026-01-29T19:31:15+00:00"
+ "time": "2026-04-19T17:51:13+00:00"
},
{
"name": "yamadashy/phpstan-friendly-formatter",
diff --git a/etc/qa/infection.json5 b/etc/qa/infection.json5
index b6a04c5..4f591df 100644
--- a/etc/qa/infection.json5
+++ b/etc/qa/infection.json5
@@ -2,7 +2,7 @@
"timeout": 120,
"source": {
"directories": [
- "src"
+ "../../src"
]
},
"logs": {
diff --git a/src/Redis.php b/src/Redis.php
index d705733..263446a 100644
--- a/src/Redis.php
+++ b/src/Redis.php
@@ -24,15 +24,11 @@
private const string DEFAULT_PREFIX = 'react:cache:';
private const int DEFAULT_TTL = 0;
- /** @phpstan-ignore-next-line */
public function __construct(private Client $client, private string $prefix = self::DEFAULT_PREFIX, private int $ttl = self::DEFAULT_TTL)
{
}
- /**
- * @inheritDoc
- * @phpstan-ignore-next-line
- */
+ /** @inheritDoc */
public function get($key, $default = null): PromiseInterface
{
return $this->has($key)->then(function (mixed $result) use ($key): PromiseInterface {
@@ -40,53 +36,40 @@ public function get($key, $default = null): PromiseInterface
return resolve(null);
}
- /** @phpstan-ignore-next-line */
return $this->client->get($this->prefix . $key);
});
}
- /**
- * @inheritDoc
- * @phpstan-ignore-next-line
- */
+ /** @inheritDoc */
public function set($key, $value, $ttl = null): PromiseInterface
{
if ($this->ttl === 0 && $ttl === null) {
- /** @phpstan-ignore-next-line */
return $this->client->set($this->prefix . $key, (string) $value)->then(
static fn (): PromiseInterface => resolve(true),
static fn (): PromiseInterface => resolve(false),
);
}
- /** @phpstan-ignore-next-line */
return $this->client->psetex(
$this->prefix . $key,
(string) ((float) ($this->ttl > 0 ? $this->ttl : $ttl) * 1000),
- (string) $value, /** @phpstan-ignore-line */
+ (string) $value,
)->then(
static fn (): PromiseInterface => resolve(true),
static fn (): PromiseInterface => resolve(false),
);
}
- /**
- * @inheritDoc
- * @phpstan-ignore-next-line
- */
+ /** @inheritDoc */
public function delete($key): PromiseInterface
{
- /** @phpstan-ignore-next-line */
return $this->client->del($this->prefix . $key)->then(
static fn (): PromiseInterface => resolve(true),
static fn (): PromiseInterface => resolve(false),
);
}
- /**
- * @inheritDoc
- * @phpstan-ignore-next-line
- */
+ /** @inheritDoc */
public function getMultiple(array $keys, $default = null)
{
$promises = [];
@@ -97,10 +80,7 @@ public function getMultiple(array $keys, $default = null)
return all($promises);
}
- /**
- * @inheritDoc
- * @phpstan-ignore-next-line
- */
+ /** @inheritDoc */
public function setMultiple(array $values, $ttl = null)
{
$promises = [];
@@ -112,37 +92,27 @@ public function setMultiple(array $values, $ttl = null)
return all($promises)->then(static fn (array $bools): bool => array_all($bools, static fn (bool $bool): bool => $bool));
}
- /**
- * @inheritDoc
- * @phpstan-ignore-next-line
- */
+ /** @inheritDoc */
public function deleteMultiple(array $keys)
{
foreach ($keys as $index => $key) {
$keys[$index] = $this->prefix . $key;
}
- return $this->client->del(...$keys)->then( /** @phpstan-ignore-line */
+ return $this->client->del(...$keys)->then(
static fn (): PromiseInterface => resolve(true),
static fn (): PromiseInterface => resolve(false),
);
}
- /**
- * @inheritDoc
- * @phpstan-ignore-next-line
- */
+ /** @inheritDoc */
public function clear()
{
- return $this->client->keys($this->prefix . '*')->then( /** @phpstan-ignore-line */
+ return $this->client->keys($this->prefix . '*')->then(
function (array $keys): PromiseInterface {
- /**
- * @var array $matchedKeys
- * @phpstan-ignore-next-line
- */
+ /** @var array $matchedKeys */
$matchedKeys = preg_replace('|^' . preg_quote($this->prefix) . '|', '', $keys);
if (preg_last_error() !== PREG_NO_ERROR) {
- /** @phpstan-ignore-next-line */
throw new RuntimeException(preg_last_error_msg());
}
@@ -151,13 +121,9 @@ function (array $keys): PromiseInterface {
);
}
- /**
- * @inheritDoc
- * @phpstan-ignore-next-line
- */
+ /** @inheritDoc */
public function has($key)
{
- /** @phpstan-ignore-next-line */
return $this->client->exists($this->prefix . $key);
}
}
diff --git a/tests/ClientStub.php b/tests/ClientStub.php
index 8ec5cbc..ff33f44 100644
--- a/tests/ClientStub.php
+++ b/tests/ClientStub.php
@@ -10,12 +10,10 @@
use function React\Promise\resolve;
-/** @phpstan-ignore-next-line */
class ClientStub implements Client
{
use EventEmitterTrait;
- /** @phpstan-ignore-next-line */
public function __call($name, $args) //phpcs:disabled
{
return resolve(null);
@@ -80,7 +78,6 @@ public function keys(string $keys): PromiseInterface
}
/**
- * @phpstan-ignore-next-line
*/
public function isBusy(): bool //phpcs:disabled
{
diff --git a/tests/RedisTest.php b/tests/RedisTest.php
index 42703d5..99f8a78 100644
--- a/tests/RedisTest.php
+++ b/tests/RedisTest.php
@@ -169,7 +169,7 @@ public function setMultiple(): void
$value = 'value';
$ttl = 123;
$client->expects('psetex')->with($prefix . $key, $ttl * 1000, $value)->once()->andReturn(resolve(true));
- self::assertSame(true, await(new Redis($client, $prefix)->setMultiple([$key => $value], $ttl))); /** @phpstan-ignore-line */
+ self::assertSame(true, await(new Redis($client, $prefix)->setMultiple([$key => $value], $ttl)));
}
#[Test]