From d69b82a840b22fddf55929ce285e7d24ae292610 Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 18:33:38 -0400 Subject: [PATCH 01/10] added documentation files --- CHANGELOG.md | 0 CODE_OF_CONDUCT.md | 25 +++++++++++++++++++++++++ CODE_OWNERS.TXT | 24 ++++++++++++++++++++++++ CONTRIBUTING.md | 5 +++++ README.md | 2 +- 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CODE_OWNERS.TXT create mode 100644 CONTRIBUTING.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..634f5e9 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,25 @@ +# Contributor Covenant Code of Conduct + +## TL;DR + +Common sense rules. Treat people the same way you want to be treated. + +## Detail + +This is an open source project. Everyone and anyone is welcome to contribute +to it as much or as little as they want to. + +Personal views of contributors have no effect on the project and should be +kept in the personal realm not this project. + +It is a requirement to treat other contributors as well as maintainers with +respect, when communicating in the realm of this project. It is OK to agree to +disagree. + +## Conflict + +If ever conflict arises, please bring it to the attention of the maintainers +privately. You can always find us on our [Discord](https://phalcon.io/discord) +server or you can send us an email at [team@phalcon.io](mailto:team@phalcon.io) + +The core team maintains the final decision on any conflict that may arise. diff --git a/CODE_OWNERS.TXT b/CODE_OWNERS.TXT new file mode 100644 index 0000000..a307b41 --- /dev/null +++ b/CODE_OWNERS.TXT @@ -0,0 +1,24 @@ +This file is a list of the people responsible for ensuring that patches for a +particular part of Phalcon are reviewed, either by themselves or by someone +else. They are also the gatekeepers for their part of Phalcon, with the final +word on what goes in or not. + +The list is sorted by last name and formatted to allow easy grepping and +beautification by scripts. The fields are: name (N), email (E), web-address +(W), PGP key ID and fingerprint (P), description (D), and snail-mail address +(S). + +The sample of querying command to search PECL keyword: + awk -v RS='' -v ORS='\n\n' '/\nD: .*PECL/' CODE_OWNERS.TXT + +N: Anton Vasiliev +E: anton@phalcon.io +W: +P: +D: Maintenance and design + +N: Nikolaos Dimopoulos +E: niden@phalcon.io +W: https://niden.net +P: 0x93F8CA07B9C8C41D +D: Maintenance and design diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4970bea --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,5 @@ +# Contributing to PSR Proxy + +WIP + +Phalcon Team diff --git a/README.md b/README.md index 4f0d28c..00e3f28 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# psr-proxy +# proxy-psr3 Package to offer PSR compatibility with Phalcon classes from the PHP userland From 15f71eaa8ea07c80f582fbb7417c26f7b29a819b Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 18:34:08 -0400 Subject: [PATCH 02/10] added pds skeleton --- bin/.gitkeep | 0 config/.gitkeep | 0 docs/.gitkeep | 0 public/.gitkeep | 0 resources/.gitkeep | 0 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bin/.gitkeep create mode 100644 config/.gitkeep create mode 100644 docs/.gitkeep create mode 100644 public/.gitkeep create mode 100644 resources/.gitkeep diff --git a/bin/.gitkeep b/bin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/config/.gitkeep b/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docs/.gitkeep b/docs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/resources/.gitkeep b/resources/.gitkeep new file mode 100644 index 0000000..e69de29 From f72606f627194ed513be18bafdb00594e4520204 Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 18:34:22 -0400 Subject: [PATCH 03/10] adjusting .gitignore --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6ffe3aa..49ce3c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -/cache/ -/config/development/ +/vendor \ No newline at end of file From 3f37bfa9924dd230488843b310f70b6bb7729a18 Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 18:34:34 -0400 Subject: [PATCH 04/10] added docker environments --- docker-compose.yml | 21 +++++++++++++ docker/7.4/.bashrc | 72 +++++++++++++++++++++++++++++++++++++++++++ docker/7.4/Dockerfile | 49 +++++++++++++++++++++++++++++ docker/7.4/extra.ini | 4 +++ docker/8.0/.bashrc | 72 +++++++++++++++++++++++++++++++++++++++++++ docker/8.0/Dockerfile | 49 +++++++++++++++++++++++++++++ docker/8.0/extra.ini | 4 +++ 7 files changed, 271 insertions(+) create mode 100644 docker-compose.yml create mode 100644 docker/7.4/.bashrc create mode 100644 docker/7.4/Dockerfile create mode 100644 docker/7.4/extra.ini create mode 100644 docker/8.0/.bashrc create mode 100644 docker/8.0/Dockerfile create mode 100644 docker/8.0/extra.ini diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4100943 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +# For local development only. + +version: '3' + +services: + phalcon-7.4: + container_name: proxy-psr3-7.4 + hostname: proxy-psr3-74 + build: docker/7.4 + working_dir: /srv + volumes: + - .:/srv + + proxy-psr3-8.0: + container_name: proxy-psr3-8.0 + hostname: proxy-psr3-80 + build: docker/8.0 + working_dir: /srv + volumes: + - .:/srv + diff --git a/docker/7.4/.bashrc b/docker/7.4/.bashrc new file mode 100644 index 0000000..78889d1 --- /dev/null +++ b/docker/7.4/.bashrc @@ -0,0 +1,72 @@ +#!/bin/bash + +# Easier navigation: .., ..., ...., ....., ~ and - +alias ..="cd .." +alias ...="cd ../.." +alias ....="cd ../../.." +alias .....="cd ../../../.." +alias ~="cd ~" # `cd` is probably faster to type though +alias -- -="cd -" + +# Shortcuts +alias g="git" +alias h="history" + +# Detect which `ls` flavor is in use +if ls --color > /dev/null 2>&1; then # GNU `ls` + colorflag="--color" +else # OS X `ls` + colorflag="-G" +fi + +# List all files colorized in long format +# shellcheck disable=SC2139 +alias l="ls -lF ${colorflag}" + +# List all files colorized in long format, including dot files +# shellcheck disable=SC2139 +alias la="ls -laF ${colorflag}" + +# List only directories +# shellcheck disable=SC2139 +alias lsd="ls -lF ${colorflag} | grep --color=never '^d'" + +# See: https://superuser.com/a/656746/280737 +alias ll='LC_ALL="C.UTF-8" ls -alF' + +# Always use color output for `ls` +# shellcheck disable=SC2139 +alias ls="command ls ${colorflag}" +export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:' + +# Always enable colored `grep` output +alias grep='grep --color=auto ' + +# Enable aliases to be sudo’ed +alias sudo='sudo ' + +# Get week number +alias week='date +%V' + +# Stopwatch +alias timer='echo "Timer started. Stop with Ctrl-D." && date && time cat && date' + +# Canonical hex dump; some systems have this symlinked +command -v hd > /dev/null || alias hd="hexdump -C" + +# vhosts +alias hosts='sudo nano /etc/hosts' + +# copy working directory +alias cwd='pwd | tr -d "\r\n" | xclip -selection clipboard' + +# copy file interactive +alias cp='cp -i' + +# move file interactive +alias mv='mv -i' + +# untar +alias untar='tar xvf' + +PATH=$PATH:./vendor/bin diff --git a/docker/7.4/Dockerfile b/docker/7.4/Dockerfile new file mode 100644 index 0000000..e6aa314 --- /dev/null +++ b/docker/7.4/Dockerfile @@ -0,0 +1,49 @@ +FROM composer:latest as composer +FROM php:7.4-fpm + +# Compilation parameters +RUN CPU_CORES="$(getconf _NPROCESSORS_ONLN)"; +ENV MAKEFLAGS="-j${CPU_CORES}" + +ADD ./extra.ini /usr/local/etc/php/conf.d/ + +# User/Group globals +ENV MY_USER="phalcon" \ + MY_GROUP="phalcon" \ + MY_UID="1000" \ + MY_GID="1000" \ + PHP_VERSION="7.4" + +# User and Group +RUN set -eux && \ + groupadd -g ${MY_GID} -r ${MY_GROUP} && \ + useradd -u ${MY_UID} -m -s /bin/bash -g ${MY_GROUP} ${MY_USER} + +# Update +RUN apt update -y && \ + apt install -y \ + apt-utils \ + git \ + libzip-dev \ + locales \ + nano \ + sudo \ + wget \ + zip + +# PECL Packages +RUN pecl install xdebug + +RUN docker-php-ext-install \ + zip + +# Install PHP extensions +RUN docker-php-ext-enable \ + xdebug + +# Composer +COPY --from=composer /usr/bin/composer /usr/local/bin/composer +# Bash script with helper aliases +COPY ./.bashrc /root/.bashrc + +CMD ["php-fpm"] diff --git a/docker/7.4/extra.ini b/docker/7.4/extra.ini new file mode 100644 index 0000000..dd4c161 --- /dev/null +++ b/docker/7.4/extra.ini @@ -0,0 +1,4 @@ +memory_limit=512M +apc.enable_cli="On" +session.save_path="/tmp" +xdebug.mode="coverage" diff --git a/docker/8.0/.bashrc b/docker/8.0/.bashrc new file mode 100644 index 0000000..78889d1 --- /dev/null +++ b/docker/8.0/.bashrc @@ -0,0 +1,72 @@ +#!/bin/bash + +# Easier navigation: .., ..., ...., ....., ~ and - +alias ..="cd .." +alias ...="cd ../.." +alias ....="cd ../../.." +alias .....="cd ../../../.." +alias ~="cd ~" # `cd` is probably faster to type though +alias -- -="cd -" + +# Shortcuts +alias g="git" +alias h="history" + +# Detect which `ls` flavor is in use +if ls --color > /dev/null 2>&1; then # GNU `ls` + colorflag="--color" +else # OS X `ls` + colorflag="-G" +fi + +# List all files colorized in long format +# shellcheck disable=SC2139 +alias l="ls -lF ${colorflag}" + +# List all files colorized in long format, including dot files +# shellcheck disable=SC2139 +alias la="ls -laF ${colorflag}" + +# List only directories +# shellcheck disable=SC2139 +alias lsd="ls -lF ${colorflag} | grep --color=never '^d'" + +# See: https://superuser.com/a/656746/280737 +alias ll='LC_ALL="C.UTF-8" ls -alF' + +# Always use color output for `ls` +# shellcheck disable=SC2139 +alias ls="command ls ${colorflag}" +export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:' + +# Always enable colored `grep` output +alias grep='grep --color=auto ' + +# Enable aliases to be sudo’ed +alias sudo='sudo ' + +# Get week number +alias week='date +%V' + +# Stopwatch +alias timer='echo "Timer started. Stop with Ctrl-D." && date && time cat && date' + +# Canonical hex dump; some systems have this symlinked +command -v hd > /dev/null || alias hd="hexdump -C" + +# vhosts +alias hosts='sudo nano /etc/hosts' + +# copy working directory +alias cwd='pwd | tr -d "\r\n" | xclip -selection clipboard' + +# copy file interactive +alias cp='cp -i' + +# move file interactive +alias mv='mv -i' + +# untar +alias untar='tar xvf' + +PATH=$PATH:./vendor/bin diff --git a/docker/8.0/Dockerfile b/docker/8.0/Dockerfile new file mode 100644 index 0000000..e527183 --- /dev/null +++ b/docker/8.0/Dockerfile @@ -0,0 +1,49 @@ +FROM composer:latest as composer +FROM php:8.0-fpm + +# Compilation parameters +RUN CPU_CORES="$(getconf _NPROCESSORS_ONLN)"; +ENV MAKEFLAGS="-j${CPU_CORES}" + +ADD ./extra.ini /usr/local/etc/php/conf.d/ + +# User/Group globals +ENV MY_USER="phalcon" \ + MY_GROUP="phalcon" \ + MY_UID="1000" \ + MY_GID="1000" \ + PHP_VERSION="8.0" + +# User and Group +RUN set -eux && \ + groupadd -g ${MY_GID} -r ${MY_GROUP} && \ + useradd -u ${MY_UID} -m -s /bin/bash -g ${MY_GROUP} ${MY_USER} + +# Update +RUN apt update -y && \ + apt install -y \ + apt-utils \ + git \ + libzip-dev \ + locales \ + nano \ + sudo \ + wget \ + zip + +# PECL Packages +RUN pecl install xdebug + +RUN docker-php-ext-install \ + zip + +# Install PHP extensions +RUN docker-php-ext-enable \ + xdebug + +# Composer +COPY --from=composer /usr/bin/composer /usr/local/bin/composer +# Bash script with helper aliases +COPY ./.bashrc /root/.bashrc + +CMD ["php-fpm"] diff --git a/docker/8.0/extra.ini b/docker/8.0/extra.ini new file mode 100644 index 0000000..dd4c161 --- /dev/null +++ b/docker/8.0/extra.ini @@ -0,0 +1,4 @@ +memory_limit=512M +apc.enable_cli="On" +session.save_path="/tmp" +xdebug.mode="coverage" From 00dbb5e131f356cf94a5c44d9e00bebfdca10909 Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 18:34:48 -0400 Subject: [PATCH 05/10] added testing suite --- codeception.yml | 36 ++++++++++++++++++++++++++++ tests/_bootstrap.php | 0 tests/_data/.gitkeep | 0 tests/_output/.gitignore | 2 ++ tests/_support/FunctionalTester.php | 26 ++++++++++++++++++++ tests/_support/Helper/Acceptance.php | 10 ++++++++ tests/_support/Helper/Functional.php | 10 ++++++++ tests/_support/Helper/Unit.php | 10 ++++++++ tests/_support/UnitTester.php | 26 ++++++++++++++++++++ tests/_support/_generated/.gitignore | 2 ++ tests/unit.suite.yml | 10 ++++++++ tests/unit/_bootstrap.php | 0 12 files changed, 132 insertions(+) create mode 100644 codeception.yml create mode 100644 tests/_bootstrap.php create mode 100644 tests/_data/.gitkeep create mode 100644 tests/_output/.gitignore create mode 100644 tests/_support/FunctionalTester.php create mode 100644 tests/_support/Helper/Acceptance.php create mode 100644 tests/_support/Helper/Functional.php create mode 100644 tests/_support/Helper/Unit.php create mode 100644 tests/_support/UnitTester.php create mode 100644 tests/_support/_generated/.gitignore create mode 100644 tests/unit.suite.yml create mode 100644 tests/unit/_bootstrap.php diff --git a/codeception.yml b/codeception.yml new file mode 100644 index 0000000..d64a3bb --- /dev/null +++ b/codeception.yml @@ -0,0 +1,36 @@ +actor_suffix: Tester + +paths: + # where the modules stored + tests: tests + log: tests/_output + # directory for fixture data + data: tests/_data + # directory for custom modules (helpers) + support: tests/_support + envs: tests/_envs + +settings: + colors: true + # Tests (especially functional) can take a lot of memory + # We set a high limit for them by default. + memory_limit: 1024M + lint: true + +# name of bootstrap that will be used +# each bootstrap file should be +# inside a suite directory. +bootstrap: _bootstrap.php + +coverage: + enabled: true + include: + - src/* + +extensions: + enabled: + - Codeception\Extension\RunFailed + +params: +# get params from environment vars +#- .env diff --git a/tests/_bootstrap.php b/tests/_bootstrap.php new file mode 100644 index 0000000..e69de29 diff --git a/tests/_data/.gitkeep b/tests/_data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/_output/.gitignore b/tests/_output/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/tests/_output/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/_support/FunctionalTester.php b/tests/_support/FunctionalTester.php new file mode 100644 index 0000000..f7bb0cd --- /dev/null +++ b/tests/_support/FunctionalTester.php @@ -0,0 +1,26 @@ + Date: Thu, 14 Apr 2022 18:35:13 -0400 Subject: [PATCH 06/10] added static code analyzer config files --- phpcs.xml | 13 +++++++++++++ psalm.xml | 16 ++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 phpcs.xml create mode 100644 psalm.xml diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 0000000..f6000b0 --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,13 @@ + + + Phalcon Coding Standards + + + + + + + src + tests/integration + tests/unit + diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..af6cc33 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,16 @@ + + + + + + + + + From 0b7a3a1589a2ec448fc0dc708aec6f8a89fe1115 Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 18:36:52 -0400 Subject: [PATCH 07/10] adjusting composer files --- composer.json | 35 + composer.lock | 5686 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 5721 insertions(+) create mode 100644 composer.json create mode 100644 composer.lock diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..7aa5c58 --- /dev/null +++ b/composer.json @@ -0,0 +1,35 @@ +{ + "name": "phalcon/proxy-psr3", + "description": "Phalcon Framework proxy classes for PSR-3", + "keywords": [ + "php", + "framework", + "phalcon", + "psr-3" + ], + "license": "MIT", + "require": { + "php": ">=7.4 <9.0" + }, + "autoload": { + "psr-4": { + "Phalcon\\Proxy\\Psr3\\": "src/", + "Phalcon\\Proxy\\Psr3\\Tests\\Fixtures\\": "tests/_data/fixtures/", + "Phalcon\\Proxy\\Psr3\\Tests\\Unit\\": "tests/unit/" + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true + }, + "require-dev": { + "codeception/codeception": "^4.1", + "codeception/module-asserts": "^2.0", + "friendsofphp/php-cs-fixer": "^3.7", + "pds/skeleton": "^1.0", + "phpstan/phpstan": "^1.4", + "squizlabs/php_codesniffer": "^3.6", + "vimeo/psalm": "^4.22" + } +} \ No newline at end of file diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..984f7ee --- /dev/null +++ b/composer.lock @@ -0,0 +1,5686 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "a2acbb8ee883efee336072ba603278d5", + "packages": [], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-03-30T17:13:30+00:00" + }, + { + "name": "behat/gherkin", + "version": "v4.9.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", + "shasum": "" + }, + "require": { + "php": "~7.2|~8.0" + }, + "require-dev": { + "cucumber/cucumber": "dev-gherkin-22.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/yaml": "~3|~4|~5" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + }, + "time": "2021-10-12T13:05:09+00:00" + }, + { + "name": "codeception/codeception", + "version": "4.1.31", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "15524571ae0686a7facc2eb1f40f600e5bbce9e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/15524571ae0686a7facc2eb1f40f600e5bbce9e5", + "reference": "15524571ae0686a7facc2eb1f40f600e5bbce9e5", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.4.0", + "codeception/lib-asserts": "^1.0 | 2.0.*@dev", + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1 | ^9.0", + "codeception/stub": "^2.0 | ^3.0 | ^4.0", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/psr7": "^1.4 | ^2.0", + "php": ">=5.6.0 <9.0", + "symfony/console": ">=2.7 <6.0", + "symfony/css-selector": ">=2.7 <6.0", + "symfony/event-dispatcher": ">=2.7 <6.0", + "symfony/finder": ">=2.7 <6.0", + "symfony/yaml": ">=2.7 <6.0" + }, + "require-dev": { + "codeception/module-asserts": "^1.0 | 2.0.*@dev", + "codeception/module-cli": "^1.0 | 2.0.*@dev", + "codeception/module-db": "^1.0 | 2.0.*@dev", + "codeception/module-filesystem": "^1.0 | 2.0.*@dev", + "codeception/module-phpbrowser": "^1.0 | 2.0.*@dev", + "codeception/specify": "~0.3", + "codeception/util-universalframework": "*@dev", + "monolog/monolog": "~1.8", + "squizlabs/php_codesniffer": "~2.0", + "symfony/process": ">=2.7 <6.0", + "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0 | ^5.0" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "hoa/console": "For interactive console functionality", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/phpunit-bridge": "For phpunit-bridge support" + }, + "bin": [ + "codecept" + ], + "type": "library", + "extra": { + "branch-alias": [] + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "http://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/4.1.31" + }, + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2022-03-13T17:07:08+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "df9c8346722ddde4a20e6372073c09c8df87c296" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/df9c8346722ddde4a20e6372073c09c8df87c296", + "reference": "df9c8346722ddde4a20e6372073c09c8df87c296", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": "^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": "^7.4 | ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/2.0.0" + }, + "time": "2021-12-03T12:40:37+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "313673c35de00ad337d3b5f895a1998695d3b537" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/313673c35de00ad337d3b5f895a1998695d3b537", + "reference": "313673c35de00ad337d3b5f895a1998695d3b537", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.1 | *@dev", + "codeception/lib-asserts": "^2.0", + "php": "^7.4 | ^8.0" + }, + "conflict": { + "codeception/codeception": "<4.1" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-asserts/issues", + "source": "https://github.com/Codeception/module-asserts/tree/2.0.1" + }, + "time": "2021-12-18T17:10:04+00:00" + }, + { + "name": "codeception/phpunit-wrapper", + "version": "9.0.7", + "source": { + "type": "git", + "url": "https://github.com/Codeception/phpunit-wrapper.git", + "reference": "7d6b1a5ea4ed28d010e5d36b993db813eb49710b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/7d6b1a5ea4ed28d010e5d36b993db813eb49710b", + "reference": "7d6b1a5ea4ed28d010e5d36b993db813eb49710b", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "phpunit/phpunit": "^9.0" + }, + "require-dev": { + "codeception/specify": "*", + "consolidation/robo": "^3.0.0-alpha3", + "vlucas/phpdotenv": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\PHPUnit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + }, + { + "name": "Naktibalda" + } + ], + "description": "PHPUnit classes used by Codeception", + "support": { + "issues": "https://github.com/Codeception/phpunit-wrapper/issues", + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.7" + }, + "time": "2022-01-26T14:43:10+00:00" + }, + { + "name": "codeception/stub", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/18a148dacd293fc7b044042f5aa63a82b08bff5d", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" + }, + "require-dev": { + "consolidation/robo": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/4.0.2" + }, + "time": "2022-01-31T19:25:15+00:00" + }, + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.5", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-01-17T14:14:24+00:00" + }, + { + "name": "composer/pcre", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "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.0.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-02-25T20:21:48+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": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.13.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" + }, + "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/1.13.2" + }, + "time": "2021-08-05T19:00:23+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-03-03T08:28:38+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.3" + }, + "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-02-28T11:07:21+00:00" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "cbad1115aac4b5c3c5540e7210d3c9fba2f81fa3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/cbad1115aac4b5c3c5540e7210d3c9fba2f81fa3", + "reference": "cbad1115aac4b5c3c5540e7210d3c9fba2f81fa3", + "shasum": "" + }, + "require": { + "composer/semver": "^3.2", + "composer/xdebug-handler": "^3.0.3", + "doctrine/annotations": "^1.13", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "php-cs-fixer/diff": "^2.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.23", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php81": "^1.25", + "symfony/process": "^5.4 || ^6.0", + "symfony/stopwatch": "^5.4 || ^6.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^1.5", + "mikey179/vfsstream": "^1.6.10", + "php-coveralls/php-coveralls": "^2.5.2", + "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.15", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "phpunitgoodpractices/polyfill": "^1.5", + "phpunitgoodpractices/traits": "^1.9.1", + "symfony/phpunit-bridge": "^6.0", + "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/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2022-03-18T17:20:59+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "c94a94f120803a18554c1805ef2e539f8285f9a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c94a94f120803a18554c1805ef2e539f8285f9a2", + "reference": "c94a94f120803a18554c1805ef2e539f8285f9a2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.2.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2022-03-20T21:55:58+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2022-03-03T13:19:32+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" + }, + "time": "2020-12-01T19:48:11+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.13.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + }, + "time": "2021-11-30T19:35:32+00:00" + }, + { + "name": "openlss/lib-array2xml", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "LSS": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Bryan Tong", + "email": "bryan@nullivex.com", + "homepage": "https://www.nullivex.com" + }, + { + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "https://www.nullivex.com" + } + ], + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "https://www.nullivex.com", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], + "support": { + "issues": "https://github.com/nullivex/lib-array2xml/issues", + "source": "https://github.com/nullivex/lib-array2xml/tree/master" + }, + "time": "2019-03-29T20:06:56+00:00" + }, + { + "name": "pds/skeleton", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-pds/skeleton.git", + "reference": "95e476e5d629eadacbd721c5a9553e537514a231" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-pds/skeleton/zipball/95e476e5d629eadacbd721c5a9553e537514a231", + "reference": "95e476e5d629eadacbd721c5a9553e537514a231", + "shasum": "" + }, + "bin": [ + "bin/pds-skeleton" + ], + "type": "standard", + "autoload": { + "psr-4": { + "Pds\\Skeleton\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC-BY-SA-4.0" + ], + "description": "Standard for PHP package skeletons.", + "homepage": "https://github.com/php-pds/skeleton", + "support": { + "issues": "https://github.com/php-pds/skeleton/issues", + "source": "https://github.com/php-pds/skeleton/tree/1.x" + }, + "time": "2017-01-25T23:30:41+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3", + "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "sebastian/diff v3 backport support for PHP 5.6+", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/diff/issues", + "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" + }, + "time": "2020-10-14T08:32:19+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "77a32518733312af16a44300404e945338981de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" + }, + "time": "2022-03-15T21:29:03+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.15.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.2", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0 || ^7.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" + }, + "time": "2021-12-08T12:19:24+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.5.5", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "d77a607667f29ae099c0686f99664bd451fd23df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d77a607667f29ae099c0686f99664bd451fd23df", + "reference": "d77a607667f29ae099c0686f99664bd451fd23df", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/1.5.5" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2022-04-14T12:20:26+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.15", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.13.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-03-07T09:28:20+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", + "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.0", + "sebastian/version": "^3.0.2" + }, + "require-dev": { + "ext-pdo": "*", + "phpspec/prophecy-phpunit": "^2.0.1" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-04-01T12:37:26+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.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": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+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/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "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/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:49:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-04-03T09:37:03+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-11-11T14:18:36+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-03-15T09:54:48+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.6.2", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2021-12-12T21:44:58+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/900275254f0a1a2afff1ab0e11abd5587a10e1d6", + "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^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/v5.4.7" + }, + "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-03-31T17:09:19+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "b0a190285cd95cb019237851205b8140ef6e368e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0a190285cd95cb019237851205b8140ef6e368e", + "reference": "b0a190285cd95cb019237851205b8140ef6e368e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-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/v2.5.1" + }, + "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-01-02T09:53:40+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dec8a9f58d20df252b9cd89f1c6c1530f747685d", + "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^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/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-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/v2.5.1" + }, + "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-01-02T09:53:40+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f", + "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "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/v5.4.7" + }, + "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-04-01T12:33:59+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d", + "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "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/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-26T16:34:36+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/cc1147cb11af1b43f503ac18f31aa3bec213aba8", + "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "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/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "30885182c981ab175d4d034db0f6f469898070ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", + "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-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.25.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", + "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "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.25.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T21:10:46+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "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.25.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-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.25.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-30T18:21:41+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T21:20:04+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", + "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-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.25.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-03-04T08:16:47+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-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.25.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-13T13:58:11+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/38a44b2517b470a436e1c944bf9b9ba3961137fb", + "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "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/v5.4.7" + }, + "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-03-18T16:18:52+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", + "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" + }, + "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-03-13T20:07:29+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", + "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "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/v5.4.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": "2022-02-18T16:06:09+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10", + "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^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/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", + "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-26T16:32:32+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "vimeo/psalm", + "version": "4.22.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/fc2c6ab4d5fa5d644d8617089f012f3bb84b8703", + "reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "php": "^7.1|^8", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ], + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/4.22.0" + }, + "time": "2022-02-24T20:34:05+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" + }, + { + "name": "webmozart/path-util", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/path-util.git", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "support": { + "issues": "https://github.com/webmozart/path-util/issues", + "source": "https://github.com/webmozart/path-util/tree/2.3.0" + }, + "abandoned": "symfony/filesystem", + "time": "2015-12-17T08:42:14+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.4 <9.0" + }, + "platform-dev": [], + "plugin-api-version": "2.2.0" +} From 2b2c28b9c309cde9396a975a38eb24ad4068d3c6 Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 20:19:16 -0400 Subject: [PATCH 08/10] updating composer with codeception modules --- composer.json | 8 ++- composer.lock | 157 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 111 insertions(+), 54 deletions(-) diff --git a/composer.json b/composer.json index 7aa5c58..1f699d8 100644 --- a/composer.json +++ b/composer.json @@ -9,10 +9,13 @@ ], "license": "MIT", "require": { - "php": ">=7.4 <9.0" + "php": ">=7.4 <9.0", + "psr/log": "^1.1" }, "autoload": { "psr-4": { + "Phalcon\\Logger\\": "fake/Logger/", + "Phalcon\\Traits\\": "fake/Traits/", "Phalcon\\Proxy\\Psr3\\": "src/", "Phalcon\\Proxy\\Psr3\\Tests\\Fixtures\\": "tests/_data/fixtures/", "Phalcon\\Proxy\\Psr3\\Tests\\Unit\\": "tests/unit/" @@ -26,10 +29,11 @@ "require-dev": { "codeception/codeception": "^4.1", "codeception/module-asserts": "^2.0", + "codeception/module-filesystem": "^2.0", "friendsofphp/php-cs-fixer": "^3.7", "pds/skeleton": "^1.0", "phpstan/phpstan": "^1.4", "squizlabs/php_codesniffer": "^3.6", "vimeo/psalm": "^4.22" } -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index 984f7ee..fa24c1f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,59 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a2acbb8ee883efee336072ba603278d5", - "packages": [], + "content-hash": "97a683b27ee265f4d46d09e854793ee5", + "packages": [ + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "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/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + } + ], "packages-dev": [ { "name": "amphp/amp", @@ -445,6 +496,58 @@ }, "time": "2021-12-18T17:10:04+00:00" }, + { + "name": "codeception/module-filesystem", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-filesystem.git", + "reference": "ae1fa5f13ba00bdb8a83d4258ef577c5114ddef9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-filesystem/zipball/ae1fa5f13ba00bdb8a83d4258ef577c5114ddef9", + "reference": "ae1fa5f13ba00bdb8a83d4258ef577c5114ddef9", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.1 | *@dev", + "php": "^7.4 | ^8.0", + "symfony/finder": "^4.4 | ^5.4 | ^6.0" + }, + "conflict": { + "codeception/codeception": "<4.1" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing local filesystem", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception", + "filesystem" + ], + "support": { + "issues": "https://github.com/Codeception/module-filesystem/issues", + "source": "https://github.com/Codeception/module-filesystem/tree/2.0.2" + }, + "time": "2021-12-18T14:11:30+00:00" + }, { "name": "codeception/phpunit-wrapper", "version": "9.0.7", @@ -2762,56 +2865,6 @@ }, "time": "2016-08-06T14:39:51+00:00" }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "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/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, { "name": "ralouphie/getallheaders", "version": "3.0.3", From 17bec87833ace7b3a81eb4904871dc80a5090bb9 Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 20:20:10 -0400 Subject: [PATCH 09/10] added test assets and helper methods --- tests/_bootstrap.php | 11 ++ tests/_config/functions.php | 76 ++++++++ tests/_data/assets/logger/logger.serialized | Bin 0 -> 174 bytes tests/_support/Helper/Unit.php | 66 ++++++- tests/unit.suite.yml | 1 + tests/unit/Logger/Adapter/Noop/AddCest.php | 74 ++++++++ tests/unit/Logger/Adapter/Noop/BeginCest.php | 51 ++++++ tests/unit/Logger/Adapter/Noop/CloseCest.php | 39 ++++ tests/unit/Logger/Adapter/Noop/CommitCest.php | 74 ++++++++ .../Adapter/Noop/GetSetFormatterCest.php | 41 +++++ .../Logger/Adapter/Noop/InTransactionCest.php | 47 +++++ .../unit/Logger/Adapter/Noop/ProcessCest.php | 55 ++++++ .../unit/Logger/Adapter/Noop/RollbackCest.php | 47 +++++ .../Adapter/Noop/SerializeUnserializeCest.php | 54 ++++++ tests/unit/Logger/Adapter/Stream/AddCest.php | 85 +++++++++ .../unit/Logger/Adapter/Stream/BeginCest.php | 45 +++++ .../unit/Logger/Adapter/Stream/CloseCest.php | 89 +++++++++ .../unit/Logger/Adapter/Stream/CommitCest.php | 76 ++++++++ .../Logger/Adapter/Stream/GetNameCest.php | 43 +++++ .../Adapter/Stream/GetSetFormatterCest.php | 43 +++++ .../Adapter/Stream/InTransactionCest.php | 49 +++++ .../Logger/Adapter/Stream/ProcessCest.php | 109 +++++++++++ .../Logger/Adapter/Stream/RollbackCest.php | 70 +++++++ .../Stream/SerializeUnserializeCest.php | 46 +++++ tests/unit/Logger/Adapter/Syslog/AddCest.php | 84 +++++++++ .../unit/Logger/Adapter/Syslog/BeginCest.php | 45 +++++ .../unit/Logger/Adapter/Syslog/CloseCest.php | 65 +++++++ .../unit/Logger/Adapter/Syslog/CommitCest.php | 78 ++++++++ .../Logger/Adapter/Syslog/ConstructCest.php | 76 ++++++++ .../Adapter/Syslog/GetSetFormatterCest.php | 40 ++++ .../Adapter/Syslog/InTransactionCest.php | 49 +++++ .../Logger/Adapter/Syslog/ProcessCest.php | 98 ++++++++++ .../Logger/Adapter/Syslog/RollbackCest.php | 49 +++++ .../Syslog/SerializeUnserializeCest.php | 45 +++++ .../Logger/AdapterFactory/NewInstanceCest.php | 66 +++++++ .../unit/Logger/Formatter/Json/FormatCest.php | 97 ++++++++++ .../Formatter/Json/GetSetDateFormatCest.php | 63 +++++++ .../unit/Logger/Formatter/Line/FormatCest.php | 130 +++++++++++++ .../Formatter/Line/GetSetDateFormatCest.php | 64 +++++++ .../Formatter/Line/GetSetFormatCest.php | 63 +++++++ tests/unit/Logger/Item/GetContextCest.php | 53 ++++++ tests/unit/Logger/Item/GetDateTimeCest.php | 53 ++++++ tests/unit/Logger/Item/GetLevelCest.php | 51 ++++++ tests/unit/Logger/Item/GetLevelNameCest.php | 49 +++++ tests/unit/Logger/Item/GetMessageCest.php | 51 ++++++ tests/unit/Logger/Logger/AddAdapterCest.php | 71 ++++++++ tests/unit/Logger/Logger/ConstructCest.php | 165 +++++++++++++++++ .../Logger/Logger/ExcludeAdaptersCest.php | 83 +++++++++ tests/unit/Logger/Logger/GetAdapterCest.php | 159 ++++++++++++++++ tests/unit/Logger/Logger/GetAdaptersCest.php | 58 ++++++ tests/unit/Logger/Logger/GetNameCest.php | 38 ++++ .../unit/Logger/Logger/GetSetLogLevelCest.php | 44 +++++ tests/unit/Logger/Logger/LevelsCest.php | 111 +++++++++++ tests/unit/Logger/Logger/LogCest.php | 172 ++++++++++++++++++ .../unit/Logger/Logger/RemoveAdapterCest.php | 100 ++++++++++ tests/unit/Logger/Logger/SetAdaptersCest.php | 100 ++++++++++ 56 files changed, 3760 insertions(+), 1 deletion(-) create mode 100644 tests/_config/functions.php create mode 100644 tests/_data/assets/logger/logger.serialized create mode 100644 tests/unit/Logger/Adapter/Noop/AddCest.php create mode 100644 tests/unit/Logger/Adapter/Noop/BeginCest.php create mode 100644 tests/unit/Logger/Adapter/Noop/CloseCest.php create mode 100644 tests/unit/Logger/Adapter/Noop/CommitCest.php create mode 100644 tests/unit/Logger/Adapter/Noop/GetSetFormatterCest.php create mode 100644 tests/unit/Logger/Adapter/Noop/InTransactionCest.php create mode 100644 tests/unit/Logger/Adapter/Noop/ProcessCest.php create mode 100644 tests/unit/Logger/Adapter/Noop/RollbackCest.php create mode 100644 tests/unit/Logger/Adapter/Noop/SerializeUnserializeCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/AddCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/BeginCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/CloseCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/CommitCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/GetNameCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/GetSetFormatterCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/InTransactionCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/ProcessCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/RollbackCest.php create mode 100644 tests/unit/Logger/Adapter/Stream/SerializeUnserializeCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/AddCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/BeginCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/CloseCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/CommitCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/ConstructCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/GetSetFormatterCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/InTransactionCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/ProcessCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/RollbackCest.php create mode 100644 tests/unit/Logger/Adapter/Syslog/SerializeUnserializeCest.php create mode 100644 tests/unit/Logger/AdapterFactory/NewInstanceCest.php create mode 100644 tests/unit/Logger/Formatter/Json/FormatCest.php create mode 100644 tests/unit/Logger/Formatter/Json/GetSetDateFormatCest.php create mode 100644 tests/unit/Logger/Formatter/Line/FormatCest.php create mode 100644 tests/unit/Logger/Formatter/Line/GetSetDateFormatCest.php create mode 100644 tests/unit/Logger/Formatter/Line/GetSetFormatCest.php create mode 100644 tests/unit/Logger/Item/GetContextCest.php create mode 100644 tests/unit/Logger/Item/GetDateTimeCest.php create mode 100644 tests/unit/Logger/Item/GetLevelCest.php create mode 100644 tests/unit/Logger/Item/GetLevelNameCest.php create mode 100644 tests/unit/Logger/Item/GetMessageCest.php create mode 100644 tests/unit/Logger/Logger/AddAdapterCest.php create mode 100644 tests/unit/Logger/Logger/ConstructCest.php create mode 100644 tests/unit/Logger/Logger/ExcludeAdaptersCest.php create mode 100644 tests/unit/Logger/Logger/GetAdapterCest.php create mode 100644 tests/unit/Logger/Logger/GetAdaptersCest.php create mode 100644 tests/unit/Logger/Logger/GetNameCest.php create mode 100644 tests/unit/Logger/Logger/GetSetLogLevelCest.php create mode 100644 tests/unit/Logger/Logger/LevelsCest.php create mode 100644 tests/unit/Logger/Logger/LogCest.php create mode 100644 tests/unit/Logger/Logger/RemoveAdapterCest.php create mode 100644 tests/unit/Logger/Logger/SetAdaptersCest.php diff --git a/tests/_bootstrap.php b/tests/_bootstrap.php index e69de29..f8ec41b 100644 --- a/tests/_bootstrap.php +++ b/tests/_bootstrap.php @@ -0,0 +1,11 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +use Codeception\Util\Autoload; + +/******************************************************************************* + * Load settings and setup + *******************************************************************************/ + +/** + * Ensures that certain folders are always ready for us. + */ +if (!function_exists('loadFolders')) { + function loadFolders() + { + $folders = [ + 'logs', + ]; + + foreach ($folders as $folder) { + $item = outputDir('tests' . DIRECTORY_SEPARATOR . $folder); + + if (true !== file_exists($item)) { + mkdir($item, 0777, true); + } + } + } +} + + +/******************************************************************************* + * Directories + *******************************************************************************/ +/** + * Returns the output folder + */ +if (!function_exists('dataDir')) { + function dataDir(string $fileName = ''): string + { + return codecept_data_dir() . $fileName; + } +} + +/** + * Returns the output folder + */ +if (!function_exists('logsDir')) { + function logsDir(string $fileName = ''): string + { + return codecept_output_dir() + . 'tests' . DIRECTORY_SEPARATOR + . 'logs' . DIRECTORY_SEPARATOR + . $fileName; + } +} + +/** + * Returns the output folder + */ +if (!function_exists('outputDir')) { + function outputDir(string $fileName = ''): string + { + return codecept_output_dir() . $fileName; + } +} + diff --git a/tests/_data/assets/logger/logger.serialized b/tests/_data/assets/logger/logger.serialized new file mode 100644 index 0000000000000000000000000000000000000000..2396349512ac0019452c3b95b290063dbdfbbc2a GIT binary patch literal 174 zcmeabGBUSP3dl&zNzTuU@ySn5Pc4dZOi3�n&c?`2|W=CRWwOR)&^VN(@>IDXD3R zr8y;T`9-;jB|s%g*2PvvKq)i>;PNp(nR%%oMTSOT{b>k|ejrgZuxMspNKs;5abj{w eW`3TMb&{0getProperty($prop); + + $property->setAccessible(true); + + return $property->getValue($obj); + } + + /** + * @param string $directory + */ + public function safeDeleteDirectory(string $directory) + { + $files = glob($directory . '*', GLOB_MARK); + foreach ($files as $file) { + if (substr($file, -1) == '/') { + $this->safeDeleteDirectory($file); + } else { + unlink($file); + } + } + + if (is_dir($directory)) { + rmdir($directory); + } + } + + /** + * @param string $filename + */ + public function safeDeleteFile(string $filename) + { + if (file_exists($filename) && is_file($filename)) { + gc_collect_cycles(); + unlink($filename); + } + } } diff --git a/tests/unit.suite.yml b/tests/unit.suite.yml index 00565f6..ec2f031 100644 --- a/tests/unit.suite.yml +++ b/tests/unit.suite.yml @@ -6,5 +6,6 @@ actor: UnitTester modules: enabled: - Asserts + - Filesystem - \Helper\Unit step_decorators: ~ \ No newline at end of file diff --git a/tests/unit/Logger/Adapter/Noop/AddCest.php b/tests/unit/Logger/Adapter/Noop/AddCest.php new file mode 100644 index 0000000..93b298e --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/AddCest.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Adapter\Noop; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class AddCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: add() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopAdd(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - add()'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $adapter = new Noop(); + + $adapter->begin(); + + $item1 = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + + $item2 = new Item( + 'Message 2', + 'debug', + Logger::DEBUG, + $datetime + ); + + $item3 = new Item( + 'Message 3', + 'debug', + Logger::DEBUG, + $datetime + ); + + $adapter + ->add($item1) + ->add($item2) + ->add($item3) + ; + + $adapter->commit(); + } +} diff --git a/tests/unit/Logger/Adapter/Noop/BeginCest.php b/tests/unit/Logger/Adapter/Noop/BeginCest.php new file mode 100644 index 0000000..f3bd625 --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/BeginCest.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use Phalcon\Logger\Adapter\Noop; +use UnitTester; + +class BeginCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: begin() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopBegin(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - begin()'); + + $adapter = new Noop(); + + $I->assertFalse( + $adapter->inTransaction() + ); + + $adapter->begin(); + + $I->assertTrue( + $adapter->inTransaction() + ); + + $adapter->commit(); + + $I->assertFalse( + $adapter->inTransaction() + ); + } +} diff --git a/tests/unit/Logger/Adapter/Noop/CloseCest.php b/tests/unit/Logger/Adapter/Noop/CloseCest.php new file mode 100644 index 0000000..6fd68ad --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/CloseCest.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use Phalcon\Logger\Adapter\Noop; +use UnitTester; + +class CloseCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: close() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopClose(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - close()'); + + $adapter = new Noop(); + + $I->assertTrue( + $adapter->close() + ); + } +} diff --git a/tests/unit/Logger/Adapter/Noop/CommitCest.php b/tests/unit/Logger/Adapter/Noop/CommitCest.php new file mode 100644 index 0000000..db1920e --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/CommitCest.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use Phalcon\Logger\Adapter\Noop; +use Phalcon\Logger\Exception; +use UnitTester; + +class CommitCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: commit() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopCommit(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - commit()'); + + $adapter = new Noop(); + + $adapter->begin(); + + $I->assertTrue( + $adapter->inTransaction() + ); + + $adapter->commit(); + + $I->assertFalse( + $adapter->inTransaction() + ); + } + + /** + * Tests Phalcon\Logger\Adapter\Noop :: commit() - no transaction + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopCommitNoTransaction(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - commit() - no transaction'); + + $adapter = new Noop(); + + $I->assertFalse( + $adapter->inTransaction() + ); + + $I->expectThrowable( + new Exception('There is no active transaction'), + function () use ($adapter) { + $adapter->commit(); + } + ); + } +} diff --git a/tests/unit/Logger/Adapter/Noop/GetSetFormatterCest.php b/tests/unit/Logger/Adapter/Noop/GetSetFormatterCest.php new file mode 100644 index 0000000..bfd4b86 --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/GetSetFormatterCest.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use Phalcon\Logger\Adapter\Noop; +use Phalcon\Logger\Formatter\FormatterInterface; +use Phalcon\Logger\Formatter\Line; +use UnitTester; + +class GetSetFormatterCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: getFormatter()/setFormatter() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopGetSetFormatter(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - getFormatter()/setFormatter()'); + + $adapter = new Noop(); + + $adapter->setFormatter(new Line()); + + $I->assertInstanceOf(FormatterInterface::class, $adapter->getFormatter()); + } +} diff --git a/tests/unit/Logger/Adapter/Noop/InTransactionCest.php b/tests/unit/Logger/Adapter/Noop/InTransactionCest.php new file mode 100644 index 0000000..631bd82 --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/InTransactionCest.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use Phalcon\Logger\Adapter\Noop; +use UnitTester; + +class InTransactionCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: inTransaction() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopInTransaction(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - inTransaction()'); + + $adapter = new Noop(); + + $adapter->begin(); + + $I->assertTrue( + $adapter->inTransaction() + ); + + $adapter->commit(); + + $I->assertFalse( + $adapter->inTransaction() + ); + } +} diff --git a/tests/unit/Logger/Adapter/Noop/ProcessCest.php b/tests/unit/Logger/Adapter/Noop/ProcessCest.php new file mode 100644 index 0000000..ad63a01 --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/ProcessCest.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Adapter\Noop; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class ProcessCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: process() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopProcess(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - process()'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $adapter = new Noop(); + + $item = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + + $adapter->process($item); + + $actual = $adapter->close(); + $I->assertTrue($actual); + } +} diff --git a/tests/unit/Logger/Adapter/Noop/RollbackCest.php b/tests/unit/Logger/Adapter/Noop/RollbackCest.php new file mode 100644 index 0000000..2e9ad22 --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/RollbackCest.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use Phalcon\Logger\Adapter\Noop; +use UnitTester; + +class RollbackCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: rollback() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterNoopRollback(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - rollback()'); + + $adapter = new Noop(); + + $adapter->begin(); + + $I->assertTrue( + $adapter->inTransaction() + ); + + $adapter->rollback(); + + $I->assertFalse( + $adapter->inTransaction() + ); + } +} diff --git a/tests/unit/Logger/Adapter/Noop/SerializeUnserializeCest.php b/tests/unit/Logger/Adapter/Noop/SerializeUnserializeCest.php new file mode 100644 index 0000000..affce44 --- /dev/null +++ b/tests/unit/Logger/Adapter/Noop/SerializeUnserializeCest.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Noop; + +use Phalcon\Logger\Adapter\Noop; +use Phalcon\Logger\Exception; +use UnitTester; + +use function dataDir; +use function file_get_contents; +use function serialize; + +class SerializeUnserializeCest +{ + /** + * Tests Phalcon\Logger\Adapter\Noop :: serialize()/unserialize + * + * @author Phalcon Team + * @since 2021-09-03 + * @issue 15638 + */ + public function loggerAdapterNoopSerializeUnserialize(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Noop - serialize()/unserialize()'); + + $I->expectThrowable( + new Exception("This object cannot be serialized"), + function () { + $adapter = new Noop(); + + $object = serialize($adapter); + } + ); + + $I->expectThrowable( + new \Exception("This object cannot be unserialized"), + function () { + $serialized = file_get_contents(dataDir('assets/logger/logger.serialized')); + $object = unserialize($serialized); + } + ); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/AddCest.php b/tests/unit/Logger/Adapter/Stream/AddCest.php new file mode 100644 index 0000000..c861aa0 --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/AddCest.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class AddCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: add() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterStreamAdd(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - add()'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $adapter = new Stream($outputPath . $fileName); + + $adapter->begin(); + $item1 = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + $item2 = new Item( + 'Message 2', + 'debug', + Logger::DEBUG, + $datetime + ); + $item3 = new Item( + 'Message 3', + 'debug', + Logger::DEBUG, + $datetime + ); + + $adapter + ->add($item1) + ->add($item2) + ->add($item3) + ; + + $I->amInPath($outputPath); + $I->dontSeeFileFound($fileName); + + $adapter->commit(); + + $I->amInPath($outputPath); + $I->seeFileFound($fileName); + $I->openFile($fileName); + $I->seeInThisFile('Message 1'); + $I->seeInThisFile('Message 2'); + $I->seeInThisFile('Message 3'); + + $adapter->close(); + $I->safeDeleteFile($outputPath . $fileName); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/BeginCest.php b/tests/unit/Logger/Adapter/Stream/BeginCest.php new file mode 100644 index 0000000..3d5bda7 --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/BeginCest.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use Phalcon\Logger\Adapter\Stream; +use UnitTester; + +class BeginCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: begin() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterStreamBegin(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - begin()'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $adapter->begin(); + + $actual = $adapter->inTransaction(); + $I->assertTrue($actual); + + $adapter->rollback(); + $adapter->close(); + $I->safeDeleteFile($outputPath . $fileName); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/CloseCest.php b/tests/unit/Logger/Adapter/Stream/CloseCest.php new file mode 100644 index 0000000..8b5080d --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/CloseCest.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Exception; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class CloseCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: close() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterStreamClose(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - close()'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $adapter = new Stream($outputPath . $fileName); + + $item = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + $adapter->process($item); + + $actual = $adapter->close(); + $I->assertTrue($actual); + + $I->amInPath($outputPath); + $I->seeFileFound($fileName); + $I->openFile($fileName); + $I->seeInThisFile('Message 1'); + + $I->safeDeleteFile($outputPath . $fileName); + } + + /** + * Tests Phalcon\Logger\Adapter\Stream :: close() - exception + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2021-09-03 + * @issue 15638 + */ + public function loggerAdapterStreamCloseException(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - close() - exception'); + + $I->expectThrowable( + new Exception('There is an active transaction'), + function () use ($I) { + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $adapter->begin(); + $adapter->close(); + } + ); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/CommitCest.php b/tests/unit/Logger/Adapter/Stream/CommitCest.php new file mode 100644 index 0000000..afbc1bf --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/CommitCest.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Exception; +use UnitTester; + +class CommitCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: commit() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterStreamCommit(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - commit()'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $adapter->begin(); + + $actual = $adapter->inTransaction(); + $I->assertTrue($actual); + + $adapter->commit(); + + $actual = $adapter->inTransaction(); + $I->assertFalse($actual); + + $adapter->close(); + $I->safeDeleteFile($outputPath . $fileName); + } + + /** + * Tests Phalcon\Logger\Adapter\Stream :: commit() - no transaction + */ + public function loggerAdapterStreamCommitNoTransaction(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - commit() - no transaction'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + + try { + $adapter = new Stream($outputPath . $fileName); + + $actual = $adapter->inTransaction(); + $I->assertFalse($actual); + + $adapter->commit(); + $adapter->close(); + } catch (Exception $ex) { + $expected = 'There is no active transaction'; + $actual = $ex->getMessage(); + $I->assertEquals($expected, $actual); + } + + $I->safeDeleteFile($outputPath . $fileName); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/GetNameCest.php b/tests/unit/Logger/Adapter/Stream/GetNameCest.php new file mode 100644 index 0000000..11cfa36 --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/GetNameCest.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use Phalcon\Logger\Adapter\Stream; +use UnitTester; + +class GetNameCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: getName() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterStreamGetName(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - getName()'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $expected = $outputPath . $fileName; + $actual = $adapter->getName(); + $I->assertEquals($expected, $actual); + + $adapter->close(); + $I->safeDeleteFile($outputPath . $fileName); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/GetSetFormatterCest.php b/tests/unit/Logger/Adapter/Stream/GetSetFormatterCest.php new file mode 100644 index 0000000..fb68d78 --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/GetSetFormatterCest.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Formatter\FormatterInterface; +use Phalcon\Logger\Formatter\Line; +use UnitTester; + +class GetSetFormatterCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: getFormatter()/setFormatter() + */ + public function loggerAdapterStreamGetSetFormatter(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - getFormatter()/setFormatter()'); + + $fileName = $I->getNewFileName('log', 'log'); + $fileName = logsDir($fileName); + + $adapter = new Stream($fileName); + + $adapter->setFormatter(new Line()); + $actual = $adapter->getFormatter(); + + $I->assertInstanceOf(FormatterInterface::class, $actual); + + $adapter->close(); + $I->safeDeleteFile($fileName); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/InTransactionCest.php b/tests/unit/Logger/Adapter/Stream/InTransactionCest.php new file mode 100644 index 0000000..7363fdf --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/InTransactionCest.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use Phalcon\Logger\Adapter\Stream; +use UnitTester; + +class InTransactionCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: inTransaction() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterStreamInTransaction(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - inTransaction()'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $adapter->begin(); + + $actual = $adapter->inTransaction(); + $I->assertTrue($actual); + + $adapter->commit(); + + $actual = $adapter->inTransaction(); + $I->assertFalse($actual); + + $adapter->close(); + $I->safeDeleteFile($outputPath . $fileName); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/ProcessCest.php b/tests/unit/Logger/Adapter/Stream/ProcessCest.php new file mode 100644 index 0000000..749ca9f --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/ProcessCest.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use Codeception\Stub; +use DateTimeImmutable; +use DateTimeZone; +use LogicException; +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; +use function logsDir; + +class ProcessCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: process() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterStreamProcess(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - process()'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $adapter = new Stream($outputPath . $fileName); + + $item = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + $adapter->process($item); + + $I->amInPath($outputPath); + $I->seeFileFound($fileName); + $I->openFile($fileName); + $I->seeInThisFile('Message 1'); + + $actual = $adapter->close(); + $I->assertTrue($actual); + $I->safeDeleteFile($outputPath . $fileName); + } + + /** + * Tests Phalcon\Logger\Adapter\Stream :: process() - exception + * + * @param UnitTester $I + */ + public function loggerAdapterStreamProcessException(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - process() - exception'); + + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + + $I->expectThrowable( + new LogicException( + "The file '" . + $outputPath . + $fileName . + "' cannot be opened with mode 'ab'" + ), + function () use ($outputPath, $fileName) { + $adapter = Stub::construct( + Stream::class, + [ + $outputPath . $fileName, + ], + [ + 'phpFopen' => false, + ] + ); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + $adapter->process($item); + } + ); + + $I->safeDeleteFile($outputPath . $fileName); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/RollbackCest.php b/tests/unit/Logger/Adapter/Stream/RollbackCest.php new file mode 100644 index 0000000..360bb47 --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/RollbackCest.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Stream; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Exception; +use UnitTester; + +class RollbackCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: rollback() + * + * @param UnitTester $I + * + * @throws Exception + * @since 2020-09-09 + * @author Phalcon Team + */ + public function loggerAdapterStreamRollback(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - rollback()'); + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $adapter->begin(); + + $actual = $adapter->inTransaction(); + $I->assertTrue($actual); + + $adapter->rollback(); + + $actual = $adapter->inTransaction(); + $I->assertFalse($actual); + + $adapter->close(); + $I->safeDeleteFile($outputPath . $fileName); + } + + /** + * Tests Phalcon\Logger\Adapter\Stream :: rollback() - exception + */ + public function loggerAdapterStreamRollbackException(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - rollback() - exception'); + $I->expectThrowable( + new Exception('There is no active transaction'), + function () use ($I) { + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $adapter->rollback(); + $adapter->close(); + } + ); + } +} diff --git a/tests/unit/Logger/Adapter/Stream/SerializeUnserializeCest.php b/tests/unit/Logger/Adapter/Stream/SerializeUnserializeCest.php new file mode 100644 index 0000000..a45e02b --- /dev/null +++ b/tests/unit/Logger/Adapter/Stream/SerializeUnserializeCest.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Test\Unit\Logger\Adapter\Stream; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Exception; +use UnitTester; + +use function serialize; + +class SerializeUnserializeCest +{ + /** + * Tests Phalcon\Logger\Adapter\Stream :: serialize()/unserialize + * + * @author Phalcon Team + * @since 2021-09-03 + * @issue 15638 + */ + public function loggerAdapterStreamSerializeUnserialize(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Stream - serialize()/unserialize()'); + + $I->expectThrowable( + new Exception("This object cannot be serialized"), + function () use ($I) { + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $object = serialize($adapter); + } + ); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/AddCest.php b/tests/unit/Logger/Adapter/Syslog/AddCest.php new file mode 100644 index 0000000..b057119 --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/AddCest.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * @todo Until I figure this approach, this stays here and can be used for other + * tests in this namespace + */ + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Adapter\Syslog; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class AddCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: add() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogAdd(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - add()'); + + $streamName = $I->getNewFileName('log', 'log'); + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $adapter = new Syslog($streamName); + + $adapter->begin(); + + $item1 = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + + $item2 = new Item( + 'Message 2', + 'debug', + Logger::DEBUG, + $datetime + ); + + $item3 = new Item( + 'Message 3', + 'debug', + Logger::DEBUG, + $datetime + ); + + $adapter + ->add($item1) + ->add($item2) + ->add($item3) + ; + + $adapter->commit(); + + $I->assertTrue( + $adapter->close() + ); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/BeginCest.php b/tests/unit/Logger/Adapter/Syslog/BeginCest.php new file mode 100644 index 0000000..0a38245 --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/BeginCest.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use Phalcon\Logger\Adapter\Syslog; +use UnitTester; + +class BeginCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: begin() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogBegin(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - begin()'); + + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName); + + $adapter->begin(); + + $actual = $adapter->inTransaction(); + $I->assertTrue($actual); + + $adapter->rollback(); + $adapter->close(); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/CloseCest.php b/tests/unit/Logger/Adapter/Syslog/CloseCest.php new file mode 100644 index 0000000..1bdcf64 --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/CloseCest.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use Phalcon\Logger\Adapter\Syslog; +use Phalcon\Logger\Exception; +use UnitTester; + +class CloseCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: close() + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogClose(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - close()'); + + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName); + + $actual = $adapter->close(); + $I->assertTrue($actual); + } + + /** + * Tests Phalcon\Logger\Adapter\Syslog :: close() - exception + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2021-09-03 + * @issue 15638 + */ + public function loggerAdapterSyslogCloseException(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - close() - exception'); + + $I->expectThrowable( + new Exception('There is an active transaction'), + function () use ($I) { + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName); + + $adapter->begin(); + $adapter->close(); + } + ); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/CommitCest.php b/tests/unit/Logger/Adapter/Syslog/CommitCest.php new file mode 100644 index 0000000..d973d41 --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/CommitCest.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use Phalcon\Logger\Adapter\Syslog; +use Phalcon\Logger\Exception; +use UnitTester; + +class CommitCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: commit() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogCommit(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - commit()'); + + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName); + + $adapter->begin(); + + $I->assertTrue( + $adapter->inTransaction() + ); + + $adapter->commit(); + + $I->assertFalse( + $adapter->inTransaction() + ); + } + + /** + * Tests Phalcon\Logger\Adapter\Syslog :: commit() - no transaction + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogCommitNoTransaction(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - commit() - no transaction'); + + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName); + + $I->assertFalse( + $adapter->inTransaction() + ); + + $I->expectThrowable( + new Exception('There is no active transaction'), + function () use ($adapter) { + $adapter->commit(); + } + ); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/ConstructCest.php b/tests/unit/Logger/Adapter/Syslog/ConstructCest.php new file mode 100644 index 0000000..0378094 --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/ConstructCest.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use Codeception\Example; +use Phalcon\Logger\Adapter\Syslog; +use UnitTester; + +class ConstructCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: __construct() + * + * @dataProvider getExamples + * + * @param UnitTester $I + * @param Example $example + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogConstructOptionsCast(UnitTester $I, Example $example) + { + $I->wantToTest('Logger\Adapter\Syslog - __construct() - options'); + + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName, $example['options']); + $property = $I->getProtectedProperty($adapter, $example['property']); + + $I->assertEquals( + $example['expected'], + $property + ); + } + + /** + * @return array[] + */ + private function getExamples(): array + { + return [ + [ + 'options' => [], + 'property' => 'option', + 'expected' => LOG_ODELAY, + ], + [ + 'options' => ['option' => LOG_ALERT | LOG_INFO], + 'property' => 'option', + 'expected' => LOG_ALERT | LOG_INFO, + ], + [ + 'options' => [], + 'property' => 'facility', + 'expected' => LOG_USER, + ], + [ + 'options' => ['facility' => LOG_DAEMON], + 'property' => 'facility', + 'expected' => LOG_DAEMON, + ], + ]; + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/GetSetFormatterCest.php b/tests/unit/Logger/Adapter/Syslog/GetSetFormatterCest.php new file mode 100644 index 0000000..d4b097a --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/GetSetFormatterCest.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use Phalcon\Logger\Adapter\Syslog; +use Phalcon\Logger\Formatter\FormatterInterface; +use Phalcon\Logger\Formatter\Line; +use UnitTester; + +class GetSetFormatterCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: getFormatter()/setFormatter() + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogGetSetFormatter(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - getFormatter()/setFormatter()'); + + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName); + $adapter->setFormatter(new Line()); + + $I->assertInstanceOf(FormatterInterface::class, $adapter->getFormatter()); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/InTransactionCest.php b/tests/unit/Logger/Adapter/Syslog/InTransactionCest.php new file mode 100644 index 0000000..af1b168 --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/InTransactionCest.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use Phalcon\Logger\Adapter\Syslog; +use UnitTester; + +class InTransactionCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: inTransaction() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogInTransaction(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - inTransaction()'); + + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName); + + $adapter->begin(); + + $I->assertTrue( + $adapter->inTransaction() + ); + + $adapter->commit(); + + $I->assertFalse( + $adapter->inTransaction() + ); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/ProcessCest.php b/tests/unit/Logger/Adapter/Syslog/ProcessCest.php new file mode 100644 index 0000000..2d215ac --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/ProcessCest.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use Codeception\Stub; +use DateTimeImmutable; +use DateTimeZone; +use LogicException; +use Phalcon\Logger\Adapter\Syslog; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class ProcessCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: process() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogProcess(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - process()'); + + $streamName = $I->getNewFileName('log', 'log'); + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $adapter = new Syslog($streamName); + + $item = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + + $adapter->process($item); + + $actual = $adapter->close(); + $I->assertTrue($actual); + } + + /** + * Tests Phalcon\Logger\Adapter\Syslog :: process() - exception + * + * @throws Exception + */ + public function loggerAdapterSyslogProcessException(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - process() - exception'); + + $fileName = $I->getNewFileName('log', 'log'); + + $I->expectThrowable( + new LogicException( + "Cannot open syslog for name [" . $fileName + . "] and facility [8]" + ), + function () use ($fileName) { + $adapter = Stub::construct( + Syslog::class, + [ + $fileName, + ], + [ + 'openlog' => false, + ] + ); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'Message 1', + 'debug', + Logger::DEBUG, + $datetime + ); + $adapter->process($item); + } + ); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/RollbackCest.php b/tests/unit/Logger/Adapter/Syslog/RollbackCest.php new file mode 100644 index 0000000..dd4d389 --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/RollbackCest.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Adapter\Syslog; + +use Phalcon\Logger\Adapter\Syslog; +use UnitTester; + +class RollbackCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: rollback() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAdapterSyslogRollback(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - rollback()'); + + $streamName = $I->getNewFileName('log', 'log'); + + $adapter = new Syslog($streamName); + + $adapter->begin(); + + $I->assertTrue( + $adapter->inTransaction() + ); + + $adapter->rollback(); + + $I->assertFalse( + $adapter->inTransaction() + ); + } +} diff --git a/tests/unit/Logger/Adapter/Syslog/SerializeUnserializeCest.php b/tests/unit/Logger/Adapter/Syslog/SerializeUnserializeCest.php new file mode 100644 index 0000000..0158676 --- /dev/null +++ b/tests/unit/Logger/Adapter/Syslog/SerializeUnserializeCest.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Test\Unit\Logger\Adapter\Syslog; + +use Phalcon\Logger\Adapter\Syslog; +use Phalcon\Logger\Exception; +use UnitTester; + +use function serialize; + +class SerializeUnserializeCest +{ + /** + * Tests Phalcon\Logger\Adapter\Syslog :: serialize()/unserialize + * + * @author Phalcon Team + * @since 2021-09-03 + * @issue 15638 + */ + public function loggerAdapterSyslogSerializeUnserialize(UnitTester $I) + { + $I->wantToTest('Logger\Adapter\Syslog - serialize()/unserialize()'); + + $I->expectThrowable( + new Exception("This object cannot be serialized"), + function () use ($I) { + $streamName = $I->getNewFileName('log', 'log'); + $adapter = new Syslog($streamName); + + $object = serialize($adapter); + } + ); + } +} diff --git a/tests/unit/Logger/AdapterFactory/NewInstanceCest.php b/tests/unit/Logger/AdapterFactory/NewInstanceCest.php new file mode 100644 index 0000000..3708320 --- /dev/null +++ b/tests/unit/Logger/AdapterFactory/NewInstanceCest.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\AdapterFactory; + +use Phalcon\Logger\Adapter\AdapterInterface; +use Phalcon\Logger\AdapterFactory; +use Phalcon\Logger\Exception; +use UnitTester; + +use function outputDir; + +class NewInstanceCest +{ + /** + * Tests Phalcon\Logger\AdapterFactory :: newInstance() + * + * @param UnitTester $I + * + * @throws Exception + * @since 2020-09-09 + * @author Phalcon Team + */ + public function loggerAdapterFactoryNewInstance(UnitTester $I) + { + $I->wantToTest('Logger\AdapterFactory - newInstance()'); + + $fileName = $I->getNewFileName(); + $fileName = outputDir('tests/logs/' . $fileName); + $factory = new AdapterFactory(); + + $logger = $factory->newInstance('stream', $fileName); + $I->assertInstanceOf(AdapterInterface::class, $logger); + } + + /** + * Tests Phalcon\Logger\AdapterFactory :: newInstance() - exception + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-06 + */ + public function loggerAdapterFactoryNewInstanceException(UnitTester $I) + { + $I->wantToTest('Logger\AdapterFactory - newInstance() - exception'); + + $factory = new AdapterFactory(); + $I->expectThrowable( + new Exception('Service unknown is not registered'), + function () use ($factory) { + $logger = $factory->newInstance('unknown', '123.log'); + } + ); + } +} diff --git a/tests/unit/Logger/Formatter/Json/FormatCest.php b/tests/unit/Logger/Formatter/Json/FormatCest.php new file mode 100644 index 0000000..98905f9 --- /dev/null +++ b/tests/unit/Logger/Formatter/Json/FormatCest.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Testss\Unit\Logger\Formatter\Json; + +use DateTimeImmutable; +use DateTimeZone; +use Exception; +use Phalcon\Logger\Formatter\Json; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class FormatCest +{ + /** + * Tests Phalcon\Logger\Formatter\Json :: format() + * + * @param UnitTester $I + * + * @throws Exception + * @since 2020-09-09 + * @author Phalcon Team + */ + public function loggerFormatterJsonFormat(UnitTester $I) + { + $I->wantToTest('Logger\Formatter\Json - format()'); + + $formatter = new Json(); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $expected = sprintf( + '{"level":"debug","message":"log message","timestamp":"%s"}', + $datetime->format('c') + ); + + $I->assertEquals( + $expected, + $formatter->format($item) + ); + } + + /** + * Tests Phalcon\Logger\Formatter\Json :: format() -custom + * + * @param UnitTester $I + * + * @throws Exception + * @since 2020-09-09 + * @author Phalcon Team + */ + public function loggerFormatterJsonFormatCustom(UnitTester $I) + { + $I->wantToTest('Logger\Formatter\Json - format() - custom'); + + $formatter = new Json('YmdHis'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $expected = sprintf( + '{"level":"debug","message":"log message","timestamp":"%s"}', + $datetime->format('YmdHis') + ); + + $I->assertEquals( + $expected, + $formatter->format($item) + ); + } +} diff --git a/tests/unit/Logger/Formatter/Json/GetSetDateFormatCest.php b/tests/unit/Logger/Formatter/Json/GetSetDateFormatCest.php new file mode 100644 index 0000000..9e349ee --- /dev/null +++ b/tests/unit/Logger/Formatter/Json/GetSetDateFormatCest.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Formatter\Json; + +use Phalcon\Logger\Formatter\Json; +use UnitTester; + +class GetSetDateFormatCest +{ + /** + * Tests Phalcon\Logger\Formatter\Json :: setDateFormat() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerFormatterJsonGetSetDateFormat(UnitTester $I) + { + $I->wantToTest('Logger\Formatter\Json - getDateFormat()/setDateFormat()'); + + $newFormat = 'YmdHis'; + + /** + * Default + */ + $formatter = new Json(); + + $expected = 'c'; + $actual = $formatter->getDateFormat(); + $I->assertEquals($expected, $actual); + + /** + * Set in constructor + */ + $formatter = new Json($newFormat); + + $expected = $newFormat; + $actual = $formatter->getDateFormat(); + $I->assertEquals($expected, $actual); + + /** + * Set in setDateFormat + */ + $formatter = new Json(); + $formatter->setDateFormat($newFormat); + + $expected = $newFormat; + $actual = $formatter->getDateFormat(); + $I->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/Logger/Formatter/Line/FormatCest.php b/tests/unit/Logger/Formatter/Line/FormatCest.php new file mode 100644 index 0000000..547ed36 --- /dev/null +++ b/tests/unit/Logger/Formatter/Line/FormatCest.php @@ -0,0 +1,130 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Formatter\Line; + +use DateTimeImmutable; +use DateTimeZone; +use Exception; +use Phalcon\Logger\Formatter\Line; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class FormatCest +{ + /** + * Tests Phalcon\Logger\Formatter\Line :: format() + * + * @param UnitTester $I + * + * @throws Exception + * @since 2020-09-09 + * @author Phalcon Team + */ + public function loggerFormatterLineFormat(UnitTester $I) + { + $I->wantToTest('Logger\Formatter\Line - format()'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $formatter = new Line(); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $expected = sprintf( + '[%s][debug] log message', + $datetime->format('c') + ); + + $I->assertEquals( + $expected, + $formatter->format($item) + ); + } + + /** + * Tests Phalcon\Logger\Formatter\Line :: format() -custom + * + * @param UnitTester $I + * + * @throws Exception + * @since 2020-09-09 + * @author Phalcon Team + */ + public function loggerFormatterLineFormatCustom(UnitTester $I) + { + $I->wantToTest('Logger\Formatter\Line - format() - custom'); + + $formatter = new Line('%message%-[%level%]-%date%'); + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $expected = sprintf( + 'log message-[debug]-%s', + $datetime->format('c') + ); + + $I->assertEquals( + $expected, + $formatter->format($item) + ); + } + + /** + * Tests Phalcon\Logger\Formatter\Line :: format() -custom with milliseconds + * + * @param UnitTester $I + * + * @throws Exception + * @since 2020-09-09 + * @author Phalcon Team + */ + public function loggerFormatterLineFormatCustomWithMilliseconds(UnitTester $I) + { + $I->wantToTest('Logger\Formatter\Line - format() - custom - with milliseconds'); + + $formatter = new Line( + '%message%-[%level%]-%date%', + 'U.u' + ); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $result = $formatter->format($item); + $parts = explode('-', $result); + $parts = explode('.', $parts[2]); + $I->assertCount(2, $parts); + $I->assertGreaterThan(0, (int) $parts[0]); + $I->assertGreaterThan(0, (int) $parts[1]); + } +} diff --git a/tests/unit/Logger/Formatter/Line/GetSetDateFormatCest.php b/tests/unit/Logger/Formatter/Line/GetSetDateFormatCest.php new file mode 100644 index 0000000..cee511a --- /dev/null +++ b/tests/unit/Logger/Formatter/Line/GetSetDateFormatCest.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Formatter\Line; + +use Phalcon\Logger\Formatter\Line; +use UnitTester; + +class GetSetDateFormatCest +{ + /** + * Tests Phalcon\Logger\Formatter\Line :: setDateFormat() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerFormatterLineGetSetDateFormat(UnitTester $I) + { + $I->wantToTest('Logger\Formatter\Line - getDateFormat()/setDateFormat()'); + + $format = '[%date%][%level%] %message%'; + $newFormat = 'YmdHis'; + + /** + * Default + */ + $formatter = new Line(); + + $expected = 'c'; + $actual = $formatter->getDateFormat(); + $I->assertEquals($expected, $actual); + + /** + * Set in constructor + */ + $formatter = new Line($format, $newFormat); + + $expected = $newFormat; + $actual = $formatter->getDateFormat(); + $I->assertEquals($expected, $actual); + + /** + * Set in setDateFormat + */ + $formatter = new Line(); + $formatter->setDateFormat($newFormat); + + $expected = $newFormat; + $actual = $formatter->getDateFormat(); + $I->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/Logger/Formatter/Line/GetSetFormatCest.php b/tests/unit/Logger/Formatter/Line/GetSetFormatCest.php new file mode 100644 index 0000000..7db045a --- /dev/null +++ b/tests/unit/Logger/Formatter/Line/GetSetFormatCest.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Formatter\Line; + +use Phalcon\Logger\Formatter\Line; +use UnitTester; + +class GetSetFormatCest +{ + /** + * Tests Phalcon\Logger\Formatter\Line :: getFormat()/setFormat() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerFormatterLineGetSetFormat(UnitTester $I) + { + $I->wantToTest('Logger\Formatter\Line - getFormat()/setFormat()'); + + $newFormat = '%message%-[%date%]-[%level%]'; + + /** + * Default + */ + $formatter = new Line(); + + $expected = '[%date%][%level%] %message%'; + $actual = $formatter->getFormat(); + $I->assertEquals($expected, $actual); + + /** + * Set with constructor + */ + $formatter = new Line($newFormat); + + $expected = $newFormat; + $actual = $formatter->getFormat(); + $I->assertEquals($expected, $actual); + + /** + * Set with setFormat() + */ + $formatter = new Line($newFormat); + $formatter->setFormat($newFormat); + + $expected = $newFormat; + $actual = $formatter->getFormat(); + $I->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/Logger/Item/GetContextCest.php b/tests/unit/Logger/Item/GetContextCest.php new file mode 100644 index 0000000..a015e09 --- /dev/null +++ b/tests/unit/Logger/Item/GetContextCest.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Item; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class GetContextCest +{ + /** + * Tests Phalcon\Logger\Item :: getContext() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerItemGetContext(UnitTester $I) + { + $I->wantToTest('Logger\Item - getContext()'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $context = ['context']; + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime, + $context + ); + + $expected = $context; + $actual = $item->getContext(); + $I->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/Logger/Item/GetDateTimeCest.php b/tests/unit/Logger/Item/GetDateTimeCest.php new file mode 100644 index 0000000..381c274 --- /dev/null +++ b/tests/unit/Logger/Item/GetDateTimeCest.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Item; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class GetDateTimeCest +{ + /** + * Tests Phalcon\Logger\Item :: getTime() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerItemGetTime(UnitTester $I) + { + $I->wantToTest('Logger\Item - getTime()'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $expected = $datetime; + $actual = $item->getDateTime(); + $I->assertEquals($expected, $actual); + $actual = $item->getDateTime(); + $I->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/Logger/Item/GetLevelCest.php b/tests/unit/Logger/Item/GetLevelCest.php new file mode 100644 index 0000000..2fcb31b --- /dev/null +++ b/tests/unit/Logger/Item/GetLevelCest.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Item; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class GetLevelCest +{ + /** + * Tests Phalcon\Logger\Item :: getLevel() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerItemGetLevel(UnitTester $I) + { + $I->wantToTest('Logger\Item - getLevel()'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $expected = Logger::DEBUG; + $actual = $item->getLevel(); + $I->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/Logger/Item/GetLevelNameCest.php b/tests/unit/Logger/Item/GetLevelNameCest.php new file mode 100644 index 0000000..3a2cbfd --- /dev/null +++ b/tests/unit/Logger/Item/GetLevelNameCest.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Item; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class GetLevelNameCest +{ + /** + * Tests Phalcon\Logger\Item :: getLevelName() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerItemGetLevelName(UnitTester $I) + { + $I->wantToTest('Logger\Item - getLevelName()'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $I->assertEquals('debug', $item->getLevelName()); + } +} diff --git a/tests/unit/Logger/Item/GetMessageCest.php b/tests/unit/Logger/Item/GetMessageCest.php new file mode 100644 index 0000000..a02fc96 --- /dev/null +++ b/tests/unit/Logger/Item/GetMessageCest.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Item; + +use DateTimeImmutable; +use DateTimeZone; +use Phalcon\Logger\Item; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date_default_timezone_get; + +class GetMessageCest +{ + /** + * Tests Phalcon\Logger\Item :: getMessage() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerItemGetMessage(UnitTester $I) + { + $I->wantToTest('Logger\Item - getMessage()'); + + $timezone = date_default_timezone_get(); + $datetime = new DateTimeImmutable('now', new DateTimeZone($timezone)); + $item = new Item( + 'log message', + 'debug', + Logger::DEBUG, + $datetime + ); + + $expected = 'log message'; + $actual = $item->getMessage(); + $I->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/Logger/Logger/AddAdapterCest.php b/tests/unit/Logger/Logger/AddAdapterCest.php new file mode 100644 index 0000000..14f7789 --- /dev/null +++ b/tests/unit/Logger/Logger/AddAdapterCest.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +class AddAdapterCest +{ + /** + * Tests Phalcon\Logger :: addAdapter() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAddAdapter(UnitTester $I) + { + $I->wantToTest('Logger - addAdapter()'); + + $fileName1 = $I->getNewFileName('log', 'log'); + $fileName2 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter1 = new Stream($outputPath . $fileName1); + $adapter2 = new Stream($outputPath . $fileName2); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter1, + ] + ); + + $expected = 1; + $actual = $logger->getAdapters(); + $I->assertCount($expected, $actual); + + $logger->addAdapter('two', $adapter2); + $expected = 2; + $actual = $logger->getAdapters(); + $I->assertCount($expected, $actual); + + $logger->debug('Hello'); + + $adapter1->close(); + $adapter2->close(); + + $I->amInPath($outputPath); + $I->openFile($fileName1); + $I->seeInThisFile('Hello'); + $I->safeDeleteFile($fileName1); + + $I->amInPath($outputPath); + $I->openFile($fileName2); + $I->seeInThisFile('Hello'); + $I->safeDeleteFile($fileName2); + } +} diff --git a/tests/unit/Logger/Logger/ConstructCest.php b/tests/unit/Logger/Logger/ConstructCest.php new file mode 100644 index 0000000..628fd47 --- /dev/null +++ b/tests/unit/Logger/Logger/ConstructCest.php @@ -0,0 +1,165 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Exception; +use Phalcon\Logger\Formatter\Json; +use Phalcon\Proxy\Psr3\Logger; +use Psr\Log\LoggerInterface; +use UnitTester; + +class ConstructCest +{ + /** + * Tests Phalcon\Logger :: __construct() - implement PSR + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerConstructImplementPsr(UnitTester $I) + { + $I->wantToTest('Logger - __construct() - implement PSR'); + + $logger = new Logger('my-logger'); + $I->assertInstanceOf(LoggerInterface::class, $logger); + } + + /** + * Tests Phalcon\Logger :: __construct() - constants + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerConstructConstants(UnitTester $I) + { + $I->wantToTest('Logger - __construct() - constants'); + + $I->assertEquals(2, Logger::ALERT); + $I->assertEquals(1, Logger::CRITICAL); + $I->assertEquals(7, Logger::DEBUG); + $I->assertEquals(0, Logger::EMERGENCY); + $I->assertEquals(3, Logger::ERROR); + $I->assertEquals(6, Logger::INFO); + $I->assertEquals(5, Logger::NOTICE); + $I->assertEquals(4, Logger::WARNING); + $I->assertEquals(8, Logger::CUSTOM); + } + + /** + * Tests Phalcon\Logger :: __construct() - file with json formatter + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerConstructStreamWithJsonConstants(UnitTester $I) + { + $I->wantToTest('Logger - __construct() - file with json formatter'); + + $fileName = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter = new Stream($outputPath . $fileName); + + $adapter->setFormatter(new Json()); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter, + ] + ); + + $time = time(); + + $logger->debug('This is a message'); + $logger->log(Logger::ERROR, 'This is an error'); + $logger->error('This is another error'); + + $I->amInPath($outputPath); + $I->openFile($fileName); + + $expected = sprintf( + '{"level":"DEBUG","message":"This is a message","timestamp":"%s"}' . PHP_EOL . + '{"level":"ERROR","message":"This is an error","timestamp":"%s"}' . PHP_EOL . + '{"level":"ERROR","message":"This is another error","timestamp":"%s"}', + date('c', $time), + date('c', $time), + date('c', $time) + ); + + $I->seeInThisFile($expected); + + $adapter->close(); + $I->safeDeleteFile($outputPath . $fileName); + } + + /** + * Tests Phalcon\Logger :: __construct() - read only mode exception + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerConstructStreamReadOnlyModeException(UnitTester $I) + { + $I->wantToTest('Logger - __construct() - read only mode exception'); + + $fileName = $I->getNewFileName('log', 'log'); + + $outputPath = logsDir(); + + $file = $outputPath . $fileName; + + $I->expectThrowable( + new Exception('Adapter cannot be opened in read mode'), + function () use ($file) { + $adapter = new Stream( + $file, + [ + 'mode' => 'r', + ] + ); + } + ); + } + + /** + * Tests Phalcon\Logger :: __construct() - no adapter exception + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerConstructNoAdapterException(UnitTester $I) + { + $I->wantToTest('Logger - __construct() - no adapter exception'); + + $I->expectThrowable( + new Exception('No adapters specified'), + function () { + $logger = new Logger('my-logger'); + + $logger->info('Some message'); + } + ); + } +} diff --git a/tests/unit/Logger/Logger/ExcludeAdaptersCest.php b/tests/unit/Logger/Logger/ExcludeAdaptersCest.php new file mode 100644 index 0000000..95a25ae --- /dev/null +++ b/tests/unit/Logger/Logger/ExcludeAdaptersCest.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +class ExcludeAdaptersCest +{ + /** + * Tests Phalcon\Logger :: excludeAdapters() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerExcludeAdapters(UnitTester $I) + { + $I->wantToTest('Logger - excludeAdapters()'); + + $fileName1 = $I->getNewFileName('log', 'log'); + $fileName2 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter1 = new Stream($outputPath . $fileName1); + $adapter2 = new Stream($outputPath . $fileName2); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter1, + 'two' => $adapter2, + ] + ); + + /** + * Log into both + */ + $logger->debug('Hello'); + + $I->amInPath($outputPath); + $I->openFile($fileName1); + $I->seeInThisFile('Hello'); + + $I->amInPath($outputPath); + $I->openFile($fileName2); + $I->seeInThisFile('Hello'); + + /** + * Exclude a logger + */ + $logger + ->excludeAdapters(['two']) + ->debug('Goodbye') + ; + + $I->amInPath($outputPath); + $I->openFile($fileName1); + $I->seeInThisFile('Goodbye'); + + $I->amInPath($outputPath); + $I->openFile($fileName2); + $I->dontSeeInThisFile('Goodbye'); + + $adapter1->close(); + $adapter2->close(); + + $I->safeDeleteFile($fileName1); + $I->safeDeleteFile($fileName2); + } +} diff --git a/tests/unit/Logger/Logger/GetAdapterCest.php b/tests/unit/Logger/Logger/GetAdapterCest.php new file mode 100644 index 0000000..09ab24c --- /dev/null +++ b/tests/unit/Logger/Logger/GetAdapterCest.php @@ -0,0 +1,159 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Exception; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function logsDir; + +class GetAdapterCest +{ + /** + * Tests Phalcon\Logger :: getAdapter() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerGetAdapter(UnitTester $I) + { + $I->wantToTest('Logger - getAdapter()'); + $fileName1 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter1 = new Stream($outputPath . $fileName1); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter1, + ] + ); + + + $class = Stream::class; + $actual = $logger->getAdapter('one'); + $I->assertInstanceOf($class, $actual); + + $adapter1->close(); + $I->safeDeleteFile($outputPath . $fileName1); + } + + /** + * Tests Phalcon\Logger :: getAdapter() - unknown + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerGetAdapterUnknown(UnitTester $I) + { + $I->wantToTest('Logger - getAdapter() - unknown'); + + $I->expectThrowable( + new Exception('Adapter does not exist for this logger'), + function () { + $logger = new Logger('my-logger'); + $logger->getAdapter('unknown'); + } + ); + } + + /** + * Tests Phalcon\Logger :: getAdapter() - for transaction + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerGetAdapterForTransaction(UnitTester $I) + { + $I->wantToTest('Logger - getAdapter() - for transaction'); + $fileName1 = $I->getNewFileName('log', 'log'); + $fileName2 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + + $adapter1 = new Stream($outputPath . $fileName1); + $adapter2 = new Stream($outputPath . $fileName2); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter1, + 'two' => $adapter2, + ] + ); + + $logger->info('Logging'); + + $logger->getAdapter('two') + ->begin() + ; + + $I->assertFalse( + $logger->getAdapter('one') + ->inTransaction() + ); + $I->assertTrue( + $logger->getAdapter('two') + ->inTransaction() + ); + + $logger->info('Thanks'); + $logger->info('for'); + $logger->info('Phlying'); + $logger->info('with'); + $logger->info('Phalcon'); + + $I->amInPath($outputPath); + $I->openFile($fileName1); + $I->seeInThisFile('Logging'); + $I->seeInThisFile('Thanks'); + $I->seeInThisFile('for'); + $I->seeInThisFile('Phlying'); + $I->seeInThisFile('with'); + $I->seeInThisFile('Phalcon'); + + $I->amInPath($outputPath); + $I->openFile($fileName2); + $I->dontSeeInThisFile('Thanks'); + $I->dontSeeInThisFile('for'); + $I->dontSeeInThisFile('Phlying'); + $I->dontSeeInThisFile('with'); + $I->dontSeeInThisFile('Phalcon'); + + $logger->getAdapter('two') + ->commit() + ; + + $I->amInPath($outputPath); + $I->openFile($fileName2); + $I->seeInThisFile('Thanks'); + $I->seeInThisFile('for'); + $I->seeInThisFile('Phlying'); + $I->seeInThisFile('with'); + $I->seeInThisFile('Phalcon'); + + $adapter1->close(); + $adapter2->close(); + + $I->safeDeleteFile($outputPath . $fileName1); + $I->safeDeleteFile($outputPath . $fileName2); + } +} diff --git a/tests/unit/Logger/Logger/GetAdaptersCest.php b/tests/unit/Logger/Logger/GetAdaptersCest.php new file mode 100644 index 0000000..eb1122b --- /dev/null +++ b/tests/unit/Logger/Logger/GetAdaptersCest.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +class GetAdaptersCest +{ + /** + * Tests Phalcon\Logger :: getAdapters() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerGetAdapters(UnitTester $I) + { + $I->wantToTest('Logger - getAdapters()'); + $fileName1 = $I->getNewFileName('log', 'log'); + $fileName2 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter1 = new Stream($outputPath . $fileName1); + $adapter2 = new Stream($outputPath . $fileName2); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter1, + 'two' => $adapter2, + ] + ); + + $expected = 2; + $adapters = $logger->getAdapters(); + $I->assertCount($expected, $adapters); + + $class = Stream::class; + $I->assertInstanceOf($class, $adapters['one']); + $I->assertInstanceOf($class, $adapters['two']); + + $I->safeDeleteFile($outputPath . $fileName1); + $I->safeDeleteFile($outputPath . $fileName2); + } +} diff --git a/tests/unit/Logger/Logger/GetNameCest.php b/tests/unit/Logger/Logger/GetNameCest.php new file mode 100644 index 0000000..dc72b50 --- /dev/null +++ b/tests/unit/Logger/Logger/GetNameCest.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +class GetNameCest +{ + /** + * Tests Phalcon\Logger :: getName() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerGetName(UnitTester $I) + { + $I->wantToTest('Logger - getName()'); + $logger = new Logger('my-name'); + + $expected = 'my-name'; + $actual = $logger->getName(); + $I->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/Logger/Logger/GetSetLogLevelCest.php b/tests/unit/Logger/Logger/GetSetLogLevelCest.php new file mode 100644 index 0000000..8a9ff19 --- /dev/null +++ b/tests/unit/Logger/Logger/GetSetLogLevelCest.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +class GetSetLogLevelCest +{ + /** + * Tests Phalcon\Logger :: getLogLevel()/setLogLevel() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerGetSetLogLevel(UnitTester $I) + { + $I->wantToTest('Logger - getLogLevel()/setLogLevel()'); + $logger = new Logger('my-name'); + + $I->assertEquals(Logger::CUSTOM, $logger->getLogLevel()); + + $object = $logger->setLogLevel(Logger::INFO); + $I->assertInstanceOf(Logger::class, $object); + + $I->assertEquals(Logger::INFO, $logger->getLogLevel()); + + $logger->setLogLevel(99); + $I->assertEquals(Logger::CUSTOM, $logger->getLogLevel()); + } +} diff --git a/tests/unit/Logger/Logger/LevelsCest.php b/tests/unit/Logger/Logger/LevelsCest.php new file mode 100644 index 0000000..1294f45 --- /dev/null +++ b/tests/unit/Logger/Logger/LevelsCest.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Codeception\Example; +use DateTime; +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function date; +use function end; +use function file_get_contents; +use function logsDir; +use function preg_match; +use function strtoupper; + +class LevelsCest +{ + /** + * Tests Phalcon\Logger :: alert() + * + * @dataProvider getExamples + * + * @param UnitTester $I + * @param Example $example + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerAlert(UnitTester $I, Example $example) + { + $I->wantToTest('Logger - ' . $example[0] . '()'); + + $level = $example[0]; + $fileName = $I->getNewFileName('log', 'log'); + $fileName = logsDir($fileName); + $adapter = new Stream($fileName); + $logger = new Logger('my-logger', ['one' => $adapter]); + + $logString = 'Hello'; + $logTime = date('c'); + + $logger->{$level}($logString); + + $logger->getAdapter('one') + ->close() + ; + + $I->amInPath(logsDir()); + $I->openFile($fileName); + + // Check if the $logString is in the log file + $I->seeInThisFile($logString); + + // Check if the level is in the log file + $I->seeInThisFile('[' . strtoupper($level) . ']'); + + // Check time content + $content = file_get_contents($fileName); + + // Get time part + $matches = []; + preg_match( + '/\[(.*)\]\[' . strtoupper($level) . '\]/', + $content, + $matches + ); + $I->assertEquals(count($matches), 2); + + // Get Extract time + $date = end($matches); + $logDateTime = new DateTime($date); + $dateTimeAfterLog = new DateTime($logTime); + $nInterval = $logDateTime->diff($dateTimeAfterLog) + ->format('%s'); + $nSecondThreshold = 60; + + $I->assertLessThan($nSecondThreshold, $nInterval); + + $I->safeDeleteFile($fileName); + } + + /** + * @return string[][] + */ + private function getExamples(): array + { + return [ + ['alert'], + ['critical'], + ['debug'], + ['emergency'], + ['error'], + ['info'], + ['notice'], + ['warning'], + ]; + } +} diff --git a/tests/unit/Logger/Logger/LogCest.php b/tests/unit/Logger/Logger/LogCest.php new file mode 100644 index 0000000..753397f --- /dev/null +++ b/tests/unit/Logger/Logger/LogCest.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +use function logsDir; +use function sprintf; +use function strtoupper; + +class LogCest +{ + /** + * Tests Phalcon\Logger :: log() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerLog(UnitTester $I) + { + $I->wantToTest('Logger - log()'); + + $logPath = logsDir(); + $fileName = $I->getNewFileName('log', 'log'); + $adapter = new Stream($logPath . $fileName); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter, + ] + ); + + $levels = [ + Logger::ALERT => 'alert', + Logger::CRITICAL => 'critical', + Logger::DEBUG => 'debug', + Logger::EMERGENCY => 'emergency', + Logger::ERROR => 'error', + Logger::INFO => 'info', + Logger::NOTICE => 'notice', + Logger::WARNING => 'warning', + Logger::CUSTOM => 'custom', + 'alert' => 'alert', + 'critical' => 'critical', + 'debug' => 'debug', + 'emergency' => 'emergency', + 'error' => 'error', + 'info' => 'info', + 'notice' => 'notice', + 'warning' => 'warning', + 'custom' => 'custom', + ]; + + foreach ($levels as $level => $levelName) { + $logger->log($level, 'Message ' . $levelName); + } + + $I->amInPath($logPath); + $I->openFile($fileName); + + foreach ($levels as $levelName) { + $expected = sprintf( + '[%s] Message %s', + strtoupper($levelName), + $levelName + ); + + $I->seeInThisFile($expected); + } + + $adapter->close(); + $I->safeDeleteFile($fileName); + } + + /** + * Tests Phalcon\Logger :: log() - logLevel + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerLogLogLevel(UnitTester $I) + { + $I->wantToTest('Logger - log() - logLevel'); + + $logPath = logsDir(); + $fileName = $I->getNewFileName('log', 'log'); + $adapter = new Stream($logPath . $fileName); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter, + ] + ); + + $logger->setLogLevel(Logger::ALERT); + + $levelsYes = [ + Logger::ALERT => 'alert', + Logger::CRITICAL => 'critical', + Logger::EMERGENCY => 'emergency', + 'alert' => 'alert', + 'critical' => 'critical', + 'emergency' => 'emergency', + ]; + + $levelsNo = [ + Logger::DEBUG => 'debug', + Logger::ERROR => 'error', + Logger::INFO => 'info', + Logger::NOTICE => 'notice', + Logger::WARNING => 'warning', + Logger::CUSTOM => 'custom', + 'debug' => 'debug', + 'error' => 'error', + 'info' => 'info', + 'notice' => 'notice', + 'warning' => 'warning', + 'custom' => 'custom', + ]; + + foreach ($levelsYes as $level => $levelName) { + $logger->log($level, 'Message ' . $levelName); + } + + foreach ($levelsNo as $level => $levelName) { + $logger->log($level, 'Message ' . $levelName); + } + + $I->amInPath($logPath); + $I->openFile($fileName); + + foreach ($levelsYes as $levelName) { + $expected = sprintf( + '[%s] Message %s', + strtoupper($levelName), + $levelName + ); + $I->seeInThisFile($expected); + } + + foreach ($levelsNo as $levelName) { + $expected = sprintf( + '[%s] Message %s', + strtoupper($levelName), + $levelName + ); + $I->dontSeeInThisFile($expected); + } + + $adapter->close(); + $I->safeDeleteFile($fileName); + } +} diff --git a/tests/unit/Logger/Logger/RemoveAdapterCest.php b/tests/unit/Logger/Logger/RemoveAdapterCest.php new file mode 100644 index 0000000..2f07bd3 --- /dev/null +++ b/tests/unit/Logger/Logger/RemoveAdapterCest.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Logger\Exception; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +class RemoveAdapterCest +{ + /** + * Tests Phalcon\Logger :: removeAdapter() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerRemoveAdapter(UnitTester $I) + { + $I->wantToTest('Logger - removeAdapter()'); + + $fileName1 = $I->getNewFileName('log', 'log'); + $fileName2 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter1 = new Stream($outputPath . $fileName1); + $adapter2 = new Stream($outputPath . $fileName2); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter1, + 'two' => $adapter2, + ] + ); + + $expected = 2; + $adapters = $logger->getAdapters(); + $I->assertCount($expected, $adapters); + + $logger->removeAdapter('one'); + $expected = 1; + $adapters = $logger->getAdapters(); + $I->assertCount($expected, $adapters); + + $I->safeDeleteFile($outputPath . $fileName1); + $I->safeDeleteFile($outputPath . $fileName2); + } + + /** + * Tests Phalcon\Logger :: removeAdapter() - unknown + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerRemoveAdapterUnknown(UnitTester $I) + { + $I->wantToTest('Logger - removeAdapter() - unknown'); + + $fileName1 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + + try { + $adapter1 = new Stream($outputPath . $fileName1); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter1, + ] + ); + + $expected = 1; + $adapters = $logger->getAdapters(); + $I->assertCount($expected, $adapters); + + $logger->removeAdapter('unknown'); + } catch (Exception $ex) { + $expected = 'Adapter does not exist for this logger'; + $actual = $ex->getMessage(); + $I->assertEquals($expected, $actual); + } + + $I->safeDeleteFile($outputPath . $fileName1); + } +} diff --git a/tests/unit/Logger/Logger/SetAdaptersCest.php b/tests/unit/Logger/Logger/SetAdaptersCest.php new file mode 100644 index 0000000..e3d3fa1 --- /dev/null +++ b/tests/unit/Logger/Logger/SetAdaptersCest.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3\Tests\Unit\Logger\Logger; + +use Phalcon\Logger\Adapter\Stream; +use Phalcon\Proxy\Psr3\Logger; +use UnitTester; + +class SetAdaptersCest +{ + /** + * Tests Phalcon\Logger :: setAdapters() + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerSetAdapters(UnitTester $I) + { + $I->wantToTest('Logger - setAdapters()'); + $fileName1 = $I->getNewFileName('log', 'log'); + $fileName2 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter1 = new Stream($outputPath . $fileName1); + $adapter2 = new Stream($outputPath . $fileName2); + + $logger = new Logger('my-logger'); + + $expected = 0; + $adapters = $logger->getAdapters(); + $I->assertCount($expected, $adapters); + + $logger->setAdapters( + [ + 'one' => $adapter1, + 'two' => $adapter2, + ] + ); + + $expected = 2; + $adapters = $logger->getAdapters(); + $I->assertCount($expected, $adapters); + + $class = Stream::class; + $I->assertInstanceOf($class, $adapters['one']); + $I->assertInstanceOf($class, $adapters['two']); + + $I->safeDeleteFile($outputPath . $fileName1); + $I->safeDeleteFile($outputPath . $fileName2); + } + + /** + * Tests Phalcon\Logger :: setAdapters() - constructor + * + * @param UnitTester $I + * + * @author Phalcon Team + * @since 2020-09-09 + */ + public function loggerSetAdaptersConstructor(UnitTester $I) + { + $I->wantToTest('Logger :: setAdapters() - constructor'); + $fileName1 = $I->getNewFileName('log', 'log'); + $fileName2 = $I->getNewFileName('log', 'log'); + $outputPath = logsDir(); + $adapter1 = new Stream($outputPath . $fileName1); + $adapter2 = new Stream($outputPath . $fileName2); + + $logger = new Logger( + 'my-logger', + [ + 'one' => $adapter1, + 'two' => $adapter2, + ] + ); + + $expected = 2; + $adapters = $logger->getAdapters(); + $I->assertCount($expected, $adapters); + + $class = Stream::class; + $I->assertInstanceOf($class, $adapters['one']); + $I->assertInstanceOf($class, $adapters['two']); + + $I->safeDeleteFile($outputPath . $fileName1); + $I->safeDeleteFile($outputPath . $fileName2); + } +} From 03e632a2fa61c09c57d572c2678d20ad048ff253 Mon Sep 17 00:00:00 2001 From: Nikolaos Dimopoulos Date: Thu, 14 Apr 2022 20:20:32 -0400 Subject: [PATCH 10/10] added logger class --- src/Logger.php | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/Logger.php diff --git a/src/Logger.php b/src/Logger.php new file mode 100644 index 0000000..b996923 --- /dev/null +++ b/src/Logger.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Proxy\Psr3; + +use Phalcon\Logger\AbstractLogger; +use Phalcon\Logger\Adapter\AdapterInterface; +use Phalcon\Logger\Exception as LoggerException; +use Psr\Log\LoggerInterface; +use Psr\Log\LoggerTrait; + +/** + * Phalcon Proxy PSR-3. + * + * A PSR compatible proxy class utilizing the Phalcon\Logger. + * + * @property AdapterInterface[] $adapters + * @property array $excluded + * @property int $logLevel + * @property string $name + * @property string $timezone + */ +class Logger extends AbstractLogger implements LoggerInterface +{ + use LoggerTrait; + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param mixed $message + * @param array $context + * + * @throws LoggerException + */ + public function log($level, $message, array $context = []): void + { + $intLevel = $this->getLevelNumber($level); + + $this->addMessage($intLevel, (string) $message, $context); + } +}