├── .github ├── CODE_OF_CONDUCT.md └── CONTRIBUTING.md ├── .gitignore ├── .styleci.yml ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── composer.json ├── composer.lock ├── phpunit.xml ├── src ├── ContainerMetrics.php ├── DockerApiRequest.php ├── DockerEngineApiPollerServiceProvider.php ├── DockerServer.php ├── Enums │ └── ResourceMethods.php ├── Exceptions │ ├── ContainerNotDefinedException.php │ ├── DockerApiUnreachableException.php │ ├── ImageNotDefinedException.php │ ├── MethodNotDefinedException.php │ ├── NetworkNotDefinedException.php │ └── VolumeNotDefinedException.php ├── Interfaces │ └── ApiResourceInterface.php └── Resources │ ├── Containers.php │ ├── Images.php │ ├── Networks.php │ ├── System.php │ └── Volumes.php └── tests ├── .gitkeep ├── DockerServerTest.php └── TestCase.php /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers 6 | pledge to making participation in our project, and our community a harassment-free experience for 7 | everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity 8 | and expression, level of experience, education, socioeconomic status, nationality, personal 9 | appearance, race, religion, or sexual identity and orientation. 10 | 11 | ## Our Standards 12 | 13 | Examples of behavior that contributes to creating a positive environment 14 | include: 15 | 16 | * Using welcoming and inclusive language 17 | * Being respectful of differing viewpoints and experiences 18 | * Gracefully accepting constructive criticism 19 | * Focusing on what is best for the community 20 | * Showing empathy towards other community members 21 | 22 | Examples of unacceptable behavior by participants include: 23 | 24 | * The use of sexualized language or imagery and unwelcome sexual attention or advances. 25 | * Trolling, insulting/derogatory comments, and personal or political attacks. 26 | * Public or private harassment. 27 | * Publishing others' private information, such as a physical or electronic address, 28 | without explicit permission. 29 | * Other conduct which could reasonably be considered inappropriate in a professional setting. 30 | 31 | ## Our Responsibilities 32 | 33 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are 34 | expected to take appropriate and fair corrective action in response to any instances of 35 | unacceptable behavior. 36 | 37 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, 38 | code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or 39 | to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, 40 | threatening, offensive, or harmful. 41 | 42 | ## Scope 43 | 44 | This Code of Conduct applies both within project spaces and in public spaces when an individual is 45 | representing the project or its community. Examples of representing a project or community include 46 | using an official project e-mail address, posting via an official social media account, or acting 47 | as an appointed representative at an online or offline event. Representation of a project may be 48 | further defined and clarified by project maintainers. 49 | 50 | ## Enforcement 51 | 52 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting 53 | the project team at angel.campos.m@outlook.com. All complaints will be reviewed and investigated 54 | and will result in a response that is deemed necessary and appropriate to the circumstances. The 55 | project team is obligated to maintain confidentiality with regard to the reporter of an incident. 56 | Further details of specific enforcement policies may be posted separately. 57 | 58 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face 59 | temporary or permanent repercussions as determined by other members of the project's leadership. 60 | 61 | ## Attribution 62 | 63 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 64 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 65 | 66 | [homepage]: https://www.contributor-covenant.org 67 | 68 | For answers to common questions about this code of conduct, see 69 | https://www.contributor-covenant.org/faq -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Contributions are **welcome** and will be fully **credited**. 4 | 5 | Please read and understand the contribution guide before creating an issue or pull request. 6 | 7 | ## Etiquette 8 | 9 | This project is open source, and as such, the maintainers give their free time to build and maintain the source code 10 | held within. They make the code freely available in the hope that it will be of use to other developers. It would be 11 | extremely unfair for them to suffer abuse or anger for their hard work. 12 | 13 | Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the 14 | world that developers are civilized and selfless people. 15 | 16 | It's the duty of the maintainer to ensure that all submissions to the project are of sufficient 17 | quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used. 18 | 19 | ## Viability 20 | 21 | When requesting or submitting new features, first consider whether it might be useful to others. Open 22 | source projects are used by many developers, who may have entirely different needs to your own. Think about 23 | whether or not your feature is likely to be used by other users of the project. 24 | 25 | ## Procedure 26 | 27 | Before filing an issue: 28 | 29 | - Attempt to replicate the problem, to ensure that it wasn't a coincidental incident. 30 | - Check to make sure your feature suggestion isn't already present within the project. 31 | - Check the pull requests tab to ensure that the bug doesn't have a fix in progress. 32 | - Check the pull requests tab to ensure that the feature isn't already in progress. 33 | 34 | Before submitting a pull request: 35 | 36 | - Check the codebase to ensure that your feature doesn't already exist. 37 | - Check the pull requests to ensure that another person hasn't already submitted the feature or fix. 38 | 39 | ## Requirements 40 | 41 | If the project maintainer has any additional requirements, you will find them listed here. 42 | 43 | - **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](https://pear.php.net/package/PHP_CodeSniffer). 44 | 45 | - **Add tests!** - Your patch won't be accepted if it doesn't have tests. 46 | 47 | - **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. 48 | 49 | - **Consider our release cycle** - We try to follow [SemVer v2.0.0](https://semver.org/). Randomly breaking public APIs is not an option. 50 | 51 | - **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. 52 | 53 | - **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. 54 | 55 | **Happy coding**! -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | /node_modules 3 | /vendor/ 4 | -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | version: 8 2 | 3 | preset: recommended 4 | 5 | tab-width: 4 6 | use-tabs: false 7 | 8 | finder: 9 | exclude: 10 | - "modules" 11 | - "node_modules" 12 | - "storage" 13 | - "vendor" 14 | name: "*.php" 15 | not-name: "*.blade.php" 16 | 17 | enabled: 18 | - const_visibility_required 19 | - no_break_comment 20 | - psr12_braces 21 | disabled: 22 | - symfony_braces -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelcamposm/docker-engine-api-poller/05882359c800561fce08c226ea8088ceee1c9735/CHANGELOG.md -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Angel Campos 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 6 | associated documentation files (the "Software"), to deal in the Software without restriction, 7 | including without limitation the rights to use, copy, modify, merge, publish, distribute, 8 | sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or 12 | substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 15 | BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON 16 | INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 17 | OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 18 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![License](https://poser.pugx.org/acamposm/docker-engine-api-poller/license)](https://packagist.org/packages/acamposm/docker-engine-api-poller) 2 | [![Latest Stable Version](https://poser.pugx.org/acamposm/docker-engine-api-poller/v)](https://packagist.org/packages/acamposm/docker-engine-api-poller) 3 | [![Latest Unstable Version](https://poser.pugx.org/acamposm/docker-engine-api-poller/v/unstable)](https://packagist.org/packages/acamposm/docker-engine-api-poller) 4 | [![CodeFactor](https://www.codefactor.io/repository/github/angelcamposm/docker-engine-api-poller/badge)](https://www.codefactor.io/repository/github/angelcamposm/docker-engine-api-poller) 5 | [![StyleCI](https://github.styleci.io/repos/297182405/shield?branch=master&style=flat)](https://github.styleci.io/repos/297182405) 6 | [![Total Downloads](https://poser.pugx.org/acamposm/docker-engine-api-poller/downloads)](https://packagist.org/packages/acamposm/docker-engine-api-poller) 7 | 8 | # Docker Poller for Laravel 9 | --- 10 | 11 | This package allows Laravel applications to interact with the Docker Engine API. 12 | 13 | The Docker Engine API is an HTTP API served by Docker Engine. It is the API the Docker client uses 14 | to communicate with the Engine, so everything the Docker client can do can be done with the API. 15 | 16 | - [Installation](#installation) 17 | - [Requirements](#requirements) 18 | - [Usage](#usage) 19 | - [Basic Initialization](#basic-initialization) 20 | - [API Resources](#api-resources) 21 | - [Containers](#containers) 22 | - [Images](#images) 23 | - [Networks](#networks) 24 | - [Volumes](#volumes) 25 | - [Testing](#testing) 26 | 27 | ## Installation 28 | 29 | You can install the package via [composer](https://getcomposer.org/) and then publish the assets: 30 | 31 | ```bash 32 | 33 | composer require acamposm/docker-poller 34 | 35 | php artisan vendor:publish --provider="Acamposm\DockerEngineApiPoller\DockerPollerServiceProvider" 36 | 37 | ``` 38 | 39 | ***Note:*** We try to follow [SemVer v2.0.0](https://semver.org/). 40 | 41 | ## Requirements 42 | 43 | To use this packet, you must enable first the Docker Engine API, normally the Engine API listens on 44 | port 2375, but it is configurable. 45 | 46 | ***Note:*** In production environments, you must always secure the API with SSL encryption and 47 | control who can perform request to this API. 48 | 49 | ## Usage 50 | 51 | ### Basic Initialization 52 | 53 | First, create a DockerServer instance with the details of the docker server hosts. 54 | 55 | ***Note:*** By default, the DockerServer class uses the default port (2375) and the protocol (http) of the Docker Engine API. 56 | 57 | #### Docker Engine API over HTTP 58 | 59 | ```php 60 | use Acamposm\DockerEngineApiPoller\DockerServer; 61 | 62 | $server = (new DockerServer())->server('localhost'); 63 | ``` 64 | 65 | or 66 | 67 | ```php 68 | use Acamposm\DockerEngineApiPoller\DockerServer; 69 | 70 | $server = (new DockerServer())->insecure()->port(12375)->server('localhost'); 71 | ``` 72 | 73 | #### Docker Engine API over HTTPS 74 | ```php 75 | use Acamposm\DockerEngineApiPoller\DockerServer; 76 | 77 | $server = (new DockerServer())->secure()->server('localhost'); 78 | ``` 79 | 80 | or 81 | 82 | ```php 83 | use Acamposm\DockerEngineApiPoller\DockerServer; 84 | 85 | $server = (new DockerServer())->secure()->port(12375)->server('localhost'); 86 | ``` 87 | 88 | ### API Resources 89 | 90 | #### Containers 91 | 92 | ##### Get Containers List 93 | 94 | Get a list of the running containers in the docker host. 95 | 96 | ```php 97 | use Acamposm\DockerEngineApiPoller\DockerServer; 98 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 99 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 100 | 101 | $server = (new DockerServer())->server('192.168.10.101'); 102 | 103 | $containers_list = (new DockerApiRequest($server)) 104 | ->containers(ResourceMethods::CONTAINERS_LIST) 105 | ->get(); 106 | ``` 107 | 108 | ##### Get Container Details 109 | 110 | To get the full details of a container... 111 | 112 | ```php 113 | use Acamposm\DockerEngineApiPoller\DockerServer; 114 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 115 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 116 | 117 | $server = (new DockerServer())->server('192.168.10.101'); 118 | 119 | $container_details = (new DockerApiRequest($server)) 120 | ->containers(ResourceMethods::CONTAINERS_INSPECT, 'container_name') 121 | ->get(); 122 | ``` 123 | 124 | ##### Get Container Stats 125 | 126 | Get the resources used by a single container, then use the class ContainerMetrics to get the usage of a container. 127 | 128 | ```php 129 | use Acamposm\DockerEngineApiPoller\ContainerMetrics; 130 | use Acamposm\DockerEngineApiPoller\DockerServer; 131 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 132 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 133 | $server = (new DockerServer())->server('192.168.10.101'); 134 | 135 | $container_stats = (new DockerApiRequest($server)) 136 | ->containers(ResourceMethods::CONTAINERS_STATS, 'container_name') 137 | ->get(); 138 | 139 | $metrics = (new ContainerMetrics($container_stats))->metrics(); 140 | 141 | var_dump($metrics); 142 | ``` 143 | 144 | The result will be a json object with the container statistics, ready to save to a database. 145 | 146 | ```json 147 | { 148 | "timestamp": "2020-09-20T19:00:05.491127778Z", 149 | "id": "2206b35c6fecc6ce320effb68492d8a79fd5f2e5f230dda9371fca8c822428df", 150 | "name": "/nextcloud", 151 | "cpu": { 152 | "count": 2, 153 | "percent_free": 99.9960912, 154 | "percent_used": 0.0039088 155 | }, 156 | "memory": { 157 | "free": 8236134400, 158 | "used": 105889792, 159 | "total": 8342024192, 160 | "percent_free": 98.730646308823, 161 | "percent_used": 1.2693536911766 162 | }, 163 | "network": [ 164 | { 165 | "eth0": { 166 | "rx_bytes": 3337270, 167 | "rx_packets": 3306, 168 | "rx_errors": 0, 169 | "rx_dropped": 0, 170 | "tx_bytes": 1002431, 171 | "tx_packets": 2090, 172 | "tx_errors": 0, 173 | "tx_dropped": 0 174 | } 175 | } 176 | ] 177 | } 178 | ``` 179 | 180 | 181 | #### Images 182 | 183 | ##### Get Images List 184 | 185 | To get a list with all images on the docker host. 186 | 187 | ```php 188 | use Acamposm\DockerEngineApiPoller\DockerServer; 189 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 190 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 191 | 192 | $server = (new DockerServer())->server('192.168.10.101'); 193 | 194 | $images = (new DockerApiRequest($server)) 195 | ->images(ResourceMethods::IMAGES_LIST) 196 | ->get(); 197 | ``` 198 | 199 | ##### Get Image Details 200 | 201 | To get the full details of an image. 202 | 203 | ```php 204 | use Acamposm\DockerEngineApiPoller\DockerServer; 205 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 206 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 207 | 208 | $server = (new DockerServer())->server('192.168.10.101'); 209 | 210 | $image_details = (new DockerApiRequest($server)) 211 | ->images(ResourceMethods::IMAGES_INSPECT, 'image_name') 212 | ->get(); 213 | ``` 214 | 215 | #### Networks 216 | 217 | ##### Get Networks List 218 | 219 | ```php 220 | use Acamposm\DockerEngineApiPoller\DockerServer; 221 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 222 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 223 | 224 | $server = (new DockerServer())->server('192.168.10.101'); 225 | 226 | $networks = (new DockerApiRequest($server)) 227 | ->networks(ResourceMethods::NETWORKS_LIST) 228 | ->get(); 229 | ``` 230 | ##### Get Network Details 231 | 232 | To get the full details of a network in the docker host. 233 | 234 | ```php 235 | use Acamposm\DockerEngineApiPoller\DockerServer; 236 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 237 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 238 | 239 | $server = (new DockerServer())->server('192.168.10.101'); 240 | 241 | $network_details = (new DockerApiRequest($server)) 242 | ->networks(ResourceMethods::NETWORKS_INSPECT, 'network_name') 243 | ->get(); 244 | ``` 245 | 246 | #### Volumes 247 | 248 | ##### Get Volumes List 249 | 250 | Get a list of volumes in the docker host. 251 | 252 | ```php 253 | use Acamposm\DockerEngineApiPoller\DockerServer; 254 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 255 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 256 | 257 | $server = (new DockerServer())->server('192.168.10.101'); 258 | 259 | $volumes = (new DockerApiRequest($server)) 260 | ->volumes(ResourceMethods::VOLUMES_LIST) 261 | ->get(); 262 | ``` 263 | 264 | ##### Get Volume Details 265 | 266 | Get a list of volumes in the docker host. 267 | 268 | ```php 269 | use Acamposm\DockerEngineApiPoller\DockerServer; 270 | use Acamposm\DockerEngineApiPoller\DockerApiRequest; 271 | use Acamposm\DockerEngineApiPoller\Enums\ResourceMethods; 272 | 273 | $server = (new DockerServer())->server('192.168.10.101'); 274 | 275 | $volume_details = (new DockerApiRequest($server)) 276 | ->volumes(ResourceMethods::VOLUMES_INSPECT, 'volume_name') 277 | ->get(); 278 | ``` 279 | 280 | ## Testing 281 | 282 | ``` bash 283 | 284 | composer test 285 | 286 | ``` 287 | 288 | ## Changelog 289 | 290 | Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. 291 | 292 | ## Contributing 293 | 294 | Thank you for considering contributing to the improvement of the package. Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details. 295 | 296 | ## Security Vulnerabilities 297 | 298 | If you discover any security related issues, please send an e-mail to Angel Campos via angel.campos.m@outlook.com instead of using the issue tracker. All security vulnerabilities will be promptly addressed. 299 | 300 | ## Credits 301 | 302 | - [Angel Campos](https://github.com/angelcamposm) 303 | 304 | ## License 305 | 306 | The package Ping is open-source package and is licensed under The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 307 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "acamposm/docker-engine-api-poller", 3 | "description": "A Laravel package to allow laravel applications to query the Docker Engine API.", 4 | "keywords": [ 5 | "docker", 6 | "api", 7 | "metrics", 8 | "laravel", 9 | "php", 10 | "package" 11 | ], 12 | "homepage": "https://github.com/angelcamposm/docker-engine-api-poller", 13 | "readme": "https://github.com/angelcamposm/docker-engine-api-poller/blob/master/README.MD", 14 | "license": "MIT", 15 | "type": "library", 16 | "authors": [ 17 | { 18 | "name": "Angel Campos Muñoz", 19 | "email": "angel.campos.m@outlook.com", 20 | "role": "Developer" 21 | } 22 | ], 23 | "minimum-stability": "dev", 24 | "require": { 25 | "php": ">=7.4", 26 | "ext-json": "*" 27 | }, 28 | "require-dev": { 29 | "phpunit/phpunit": "^9.0", 30 | "orchestra/testbench": "^6.0" 31 | }, 32 | "autoload": { 33 | "psr-4": { 34 | "Acamposm\\DockerEngineApiPoller\\": "src" 35 | } 36 | }, 37 | "autoload-dev": { 38 | "psr-4": { 39 | "Acamposm\\DockerEngineApiPoller\\Tests\\": "tests" 40 | } 41 | }, 42 | "config": { 43 | "sort-packages": true 44 | }, 45 | "extra": { 46 | "laravel": { 47 | "providers": [ 48 | "Acamposm\\DockerEngineApiPoller\\DockerEngineApiPollerServiceProvider" 49 | ], 50 | "aliases": { 51 | } 52 | } 53 | }, 54 | "scripts": { 55 | "test": "phpunit --colors=always --testdox" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "c881cc57228352b1df4dd2096ac6122d", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/instantiator", 12 | "version": "dev-master", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/instantiator.git", 16 | "reference": "3e7a22aed197e9333cc929e7f6b4300bdae91fcc" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/3e7a22aed197e9333cc929e7f6b4300bdae91fcc", 21 | "reference": "3e7a22aed197e9333cc929e7f6b4300bdae91fcc", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^7.1 || ^8.0" 26 | }, 27 | "require-dev": { 28 | "doctrine/coding-standard": "^6.0", 29 | "ext-pdo": "*", 30 | "ext-phar": "*", 31 | "phpbench/phpbench": "^0.13", 32 | "phpstan/phpstan-phpunit": "^0.11", 33 | "phpstan/phpstan-shim": "^0.11", 34 | "phpunit/phpunit": "^7.0" 35 | }, 36 | "type": "library", 37 | "extra": { 38 | "branch-alias": { 39 | "dev-master": "1.4.x-dev" 40 | } 41 | }, 42 | "autoload": { 43 | "psr-4": { 44 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 45 | } 46 | }, 47 | "notification-url": "https://packagist.org/downloads/", 48 | "license": [ 49 | "MIT" 50 | ], 51 | "authors": [ 52 | { 53 | "name": "Marco Pivetta", 54 | "email": "ocramius@gmail.com", 55 | "homepage": "http://ocramius.github.com/" 56 | } 57 | ], 58 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 59 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 60 | "keywords": [ 61 | "constructor", 62 | "instantiate" 63 | ], 64 | "funding": [ 65 | { 66 | "url": "https://www.doctrine-project.org/sponsorship.html", 67 | "type": "custom" 68 | }, 69 | { 70 | "url": "https://www.patreon.com/phpdoctrine", 71 | "type": "patreon" 72 | }, 73 | { 74 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 75 | "type": "tidelift" 76 | } 77 | ], 78 | "time": "2020-06-15T18:51:04+00:00" 79 | }, 80 | { 81 | "name": "facade/ignition-contracts", 82 | "version": "1.0.1", 83 | "source": { 84 | "type": "git", 85 | "url": "https://github.com/facade/ignition-contracts.git", 86 | "reference": "aeab1ce8b68b188a43e81758e750151ad7da796b" 87 | }, 88 | "dist": { 89 | "type": "zip", 90 | "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/aeab1ce8b68b188a43e81758e750151ad7da796b", 91 | "reference": "aeab1ce8b68b188a43e81758e750151ad7da796b", 92 | "shasum": "" 93 | }, 94 | "require": { 95 | "php": "^7.1" 96 | }, 97 | "require-dev": { 98 | "friendsofphp/php-cs-fixer": "^2.14", 99 | "phpunit/phpunit": "^7.5|^8.0", 100 | "vimeo/psalm": "^3.12" 101 | }, 102 | "type": "library", 103 | "autoload": { 104 | "psr-4": { 105 | "Facade\\IgnitionContracts\\": "src" 106 | } 107 | }, 108 | "notification-url": "https://packagist.org/downloads/", 109 | "license": [ 110 | "MIT" 111 | ], 112 | "authors": [ 113 | { 114 | "name": "Freek Van der Herten", 115 | "email": "freek@spatie.be", 116 | "homepage": "https://flareapp.io", 117 | "role": "Developer" 118 | } 119 | ], 120 | "description": "Solution contracts for Ignition", 121 | "homepage": "https://github.com/facade/ignition-contracts", 122 | "keywords": [ 123 | "contracts", 124 | "flare", 125 | "ignition" 126 | ], 127 | "time": "2020-07-14T10:10:28+00:00" 128 | }, 129 | { 130 | "name": "filp/whoops", 131 | "version": "2.7.3", 132 | "source": { 133 | "type": "git", 134 | "url": "https://github.com/filp/whoops.git", 135 | "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d" 136 | }, 137 | "dist": { 138 | "type": "zip", 139 | "url": "https://api.github.com/repos/filp/whoops/zipball/5d5fe9bb3d656b514d455645b3addc5f7ba7714d", 140 | "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d", 141 | "shasum": "" 142 | }, 143 | "require": { 144 | "php": "^5.5.9 || ^7.0", 145 | "psr/log": "^1.0.1" 146 | }, 147 | "require-dev": { 148 | "mockery/mockery": "^0.9 || ^1.0", 149 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0", 150 | "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" 151 | }, 152 | "suggest": { 153 | "symfony/var-dumper": "Pretty print complex values better with var-dumper available", 154 | "whoops/soap": "Formats errors as SOAP responses" 155 | }, 156 | "type": "library", 157 | "extra": { 158 | "branch-alias": { 159 | "dev-master": "2.6-dev" 160 | } 161 | }, 162 | "autoload": { 163 | "psr-4": { 164 | "Whoops\\": "src/Whoops/" 165 | } 166 | }, 167 | "notification-url": "https://packagist.org/downloads/", 168 | "license": [ 169 | "MIT" 170 | ], 171 | "authors": [ 172 | { 173 | "name": "Filipe Dobreira", 174 | "homepage": "https://github.com/filp", 175 | "role": "Developer" 176 | } 177 | ], 178 | "description": "php error handling for cool kids", 179 | "homepage": "https://filp.github.io/whoops/", 180 | "keywords": [ 181 | "error", 182 | "exception", 183 | "handling", 184 | "library", 185 | "throwable", 186 | "whoops" 187 | ], 188 | "time": "2020-06-14T09:00:00+00:00" 189 | }, 190 | { 191 | "name": "myclabs/deep-copy", 192 | "version": "1.x-dev", 193 | "source": { 194 | "type": "git", 195 | "url": "https://github.com/myclabs/DeepCopy.git", 196 | "reference": "a3409d10079990eeb489c3fead0ac070b5b38895" 197 | }, 198 | "dist": { 199 | "type": "zip", 200 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/a3409d10079990eeb489c3fead0ac070b5b38895", 201 | "reference": "a3409d10079990eeb489c3fead0ac070b5b38895", 202 | "shasum": "" 203 | }, 204 | "require": { 205 | "php": "^7.1 || ^8.0" 206 | }, 207 | "replace": { 208 | "myclabs/deep-copy": "self.version" 209 | }, 210 | "require-dev": { 211 | "doctrine/collections": "^1.0", 212 | "doctrine/common": "^2.6", 213 | "phpunit/phpunit": "^7.1" 214 | }, 215 | "type": "library", 216 | "autoload": { 217 | "psr-4": { 218 | "DeepCopy\\": "src/DeepCopy/" 219 | }, 220 | "files": [ 221 | "src/DeepCopy/deep_copy.php" 222 | ] 223 | }, 224 | "notification-url": "https://packagist.org/downloads/", 225 | "license": [ 226 | "MIT" 227 | ], 228 | "description": "Create deep copies (clones) of your objects", 229 | "keywords": [ 230 | "clone", 231 | "copy", 232 | "duplicate", 233 | "object", 234 | "object graph" 235 | ], 236 | "funding": [ 237 | { 238 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 239 | "type": "tidelift" 240 | } 241 | ], 242 | "time": "2020-08-28T16:31:07+00:00" 243 | }, 244 | { 245 | "name": "nikic/php-parser", 246 | "version": "dev-master", 247 | "source": { 248 | "type": "git", 249 | "url": "https://github.com/nikic/PHP-Parser.git", 250 | "reference": "f66a32e2df7866d593fa7a1bb582348f772511b0" 251 | }, 252 | "dist": { 253 | "type": "zip", 254 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f66a32e2df7866d593fa7a1bb582348f772511b0", 255 | "reference": "f66a32e2df7866d593fa7a1bb582348f772511b0", 256 | "shasum": "" 257 | }, 258 | "require": { 259 | "ext-tokenizer": "*", 260 | "php": ">=7.0" 261 | }, 262 | "require-dev": { 263 | "ircmaxell/php-yacc": "^0.0.7", 264 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 265 | }, 266 | "bin": [ 267 | "bin/php-parse" 268 | ], 269 | "type": "library", 270 | "extra": { 271 | "branch-alias": { 272 | "dev-master": "4.9-dev" 273 | } 274 | }, 275 | "autoload": { 276 | "psr-4": { 277 | "PhpParser\\": "lib/PhpParser" 278 | } 279 | }, 280 | "notification-url": "https://packagist.org/downloads/", 281 | "license": [ 282 | "BSD-3-Clause" 283 | ], 284 | "authors": [ 285 | { 286 | "name": "Nikita Popov" 287 | } 288 | ], 289 | "description": "A PHP parser written in PHP", 290 | "keywords": [ 291 | "parser", 292 | "php" 293 | ], 294 | "time": "2020-09-06T15:42:38+00:00" 295 | }, 296 | { 297 | "name": "nunomaduro/collision", 298 | "version": "v5.0.2", 299 | "source": { 300 | "type": "git", 301 | "url": "https://github.com/nunomaduro/collision.git", 302 | "reference": "4a343299054e9368d0db4a982a780cc4ffa12707" 303 | }, 304 | "dist": { 305 | "type": "zip", 306 | "url": "https://api.github.com/repos/nunomaduro/collision/zipball/4a343299054e9368d0db4a982a780cc4ffa12707", 307 | "reference": "4a343299054e9368d0db4a982a780cc4ffa12707", 308 | "shasum": "" 309 | }, 310 | "require": { 311 | "facade/ignition-contracts": "^1.0", 312 | "filp/whoops": "^2.7.2", 313 | "php": "^7.3", 314 | "symfony/console": "^5.0" 315 | }, 316 | "require-dev": { 317 | "fideloper/proxy": "^4.4.0", 318 | "friendsofphp/php-cs-fixer": "^2.16.4", 319 | "fruitcake/laravel-cors": "^2.0.1", 320 | "laravel/framework": "^8.0", 321 | "laravel/tinker": "^2.4.1", 322 | "nunomaduro/larastan": "^0.6.2", 323 | "nunomaduro/mock-final-classes": "^1.0", 324 | "orchestra/testbench": "^6.0", 325 | "phpstan/phpstan": "^0.12.36", 326 | "phpunit/phpunit": "^9.3.3" 327 | }, 328 | "type": "library", 329 | "extra": { 330 | "laravel": { 331 | "providers": [ 332 | "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" 333 | ] 334 | } 335 | }, 336 | "autoload": { 337 | "psr-4": { 338 | "NunoMaduro\\Collision\\": "src/" 339 | } 340 | }, 341 | "notification-url": "https://packagist.org/downloads/", 342 | "license": [ 343 | "MIT" 344 | ], 345 | "authors": [ 346 | { 347 | "name": "Nuno Maduro", 348 | "email": "enunomaduro@gmail.com" 349 | } 350 | ], 351 | "description": "Cli error handling for console/command-line PHP applications.", 352 | "keywords": [ 353 | "artisan", 354 | "cli", 355 | "command-line", 356 | "console", 357 | "error", 358 | "handling", 359 | "laravel", 360 | "laravel-zero", 361 | "php", 362 | "symfony" 363 | ], 364 | "funding": [ 365 | { 366 | "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", 367 | "type": "custom" 368 | }, 369 | { 370 | "url": "https://github.com/nunomaduro", 371 | "type": "github" 372 | }, 373 | { 374 | "url": "https://www.patreon.com/nunomaduro", 375 | "type": "patreon" 376 | } 377 | ], 378 | "time": "2020-08-27T18:58:22+00:00" 379 | }, 380 | { 381 | "name": "pestphp/pest", 382 | "version": "dev-master", 383 | "source": { 384 | "type": "git", 385 | "url": "https://github.com/pestphp/pest.git", 386 | "reference": "dfc2470764fbf4ad860133ef7f69a63fe77b28b5" 387 | }, 388 | "dist": { 389 | "type": "zip", 390 | "url": "https://api.github.com/repos/pestphp/pest/zipball/dfc2470764fbf4ad860133ef7f69a63fe77b28b5", 391 | "reference": "dfc2470764fbf4ad860133ef7f69a63fe77b28b5", 392 | "shasum": "" 393 | }, 394 | "require": { 395 | "nunomaduro/collision": "^5.0", 396 | "pestphp/pest-plugin": "^0.3", 397 | "pestphp/pest-plugin-coverage": "^0.3", 398 | "pestphp/pest-plugin-init": "^0.3", 399 | "php": "^7.3 || ^8.0", 400 | "phpunit/phpunit": "9.3.7 || 9.3.8" 401 | }, 402 | "require-dev": { 403 | "illuminate/console": "^7.16.1", 404 | "illuminate/support": "^7.16.1", 405 | "mockery/mockery": "^1.4.1", 406 | "pestphp/pest-dev-tools": "dev-master" 407 | }, 408 | "bin": [ 409 | "bin/pest" 410 | ], 411 | "type": "library", 412 | "extra": { 413 | "branch-alias": { 414 | "dev-master": "0.4.x-dev" 415 | }, 416 | "pest": { 417 | "plugins": [ 418 | "Pest\\Plugins\\Version" 419 | ] 420 | }, 421 | "laravel": { 422 | "providers": [ 423 | "Pest\\Laravel\\PestServiceProvider" 424 | ] 425 | } 426 | }, 427 | "autoload": { 428 | "psr-4": { 429 | "Pest\\": "src/" 430 | }, 431 | "files": [ 432 | "src/globals.php", 433 | "src/Pest.php" 434 | ] 435 | }, 436 | "notification-url": "https://packagist.org/downloads/", 437 | "license": [ 438 | "MIT" 439 | ], 440 | "authors": [ 441 | { 442 | "name": "Nuno Maduro", 443 | "email": "enunomaduro@gmail.com" 444 | } 445 | ], 446 | "description": "An elegant PHP Testing Framework.", 447 | "keywords": [ 448 | "framework", 449 | "pest", 450 | "php", 451 | "test", 452 | "testing", 453 | "unit" 454 | ], 455 | "funding": [ 456 | { 457 | "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", 458 | "type": "custom" 459 | }, 460 | { 461 | "url": "https://github.com/nunomaduro", 462 | "type": "github" 463 | }, 464 | { 465 | "url": "https://www.patreon.com/nunomaduro", 466 | "type": "patreon" 467 | } 468 | ], 469 | "time": "2020-09-07T10:15:42+00:00" 470 | }, 471 | { 472 | "name": "pestphp/pest-plugin", 473 | "version": "v0.3.0", 474 | "source": { 475 | "type": "git", 476 | "url": "https://github.com/pestphp/pest-plugin.git", 477 | "reference": "635f8c33a3eed910ac3cd5cb02a7163c5c70c033" 478 | }, 479 | "dist": { 480 | "type": "zip", 481 | "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/635f8c33a3eed910ac3cd5cb02a7163c5c70c033", 482 | "reference": "635f8c33a3eed910ac3cd5cb02a7163c5c70c033", 483 | "shasum": "" 484 | }, 485 | "require": { 486 | "composer-plugin-api": "^1.1 || ^2.0", 487 | "php": "^7.3 || ^8.0" 488 | }, 489 | "conflict": { 490 | "pestphp/pest": "<0.3" 491 | }, 492 | "require-dev": { 493 | "composer/composer": "^1.10", 494 | "pestphp/pest": "^0.3", 495 | "pestphp/pest-dev-tools": "dev-master" 496 | }, 497 | "type": "composer-plugin", 498 | "extra": { 499 | "branch-alias": { 500 | "dev-master": "0.4.x-dev" 501 | }, 502 | "class": "Pest\\Plugin\\Manager" 503 | }, 504 | "autoload": { 505 | "psr-4": { 506 | "Pest\\Plugin\\": "src/" 507 | } 508 | }, 509 | "notification-url": "https://packagist.org/downloads/", 510 | "license": [ 511 | "MIT" 512 | ], 513 | "description": "The Pest plugin manager", 514 | "keywords": [ 515 | "framework", 516 | "manager", 517 | "pest", 518 | "php", 519 | "plugin", 520 | "test", 521 | "testing", 522 | "unit" 523 | ], 524 | "funding": [ 525 | { 526 | "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", 527 | "type": "custom" 528 | }, 529 | { 530 | "url": "https://github.com/nunomaduro", 531 | "type": "github" 532 | }, 533 | { 534 | "url": "https://www.patreon.com/nunomaduro", 535 | "type": "patreon" 536 | } 537 | ], 538 | "time": "2020-08-25T20:53:40+00:00" 539 | }, 540 | { 541 | "name": "pestphp/pest-plugin-coverage", 542 | "version": "v0.3.0", 543 | "source": { 544 | "type": "git", 545 | "url": "https://github.com/pestphp/pest-plugin-coverage.git", 546 | "reference": "f209bb62728841f21f267759a374d66172a162ea" 547 | }, 548 | "dist": { 549 | "type": "zip", 550 | "url": "https://api.github.com/repos/pestphp/pest-plugin-coverage/zipball/f209bb62728841f21f267759a374d66172a162ea", 551 | "reference": "f209bb62728841f21f267759a374d66172a162ea", 552 | "shasum": "" 553 | }, 554 | "require": { 555 | "pestphp/pest-plugin": "^0.3", 556 | "php": "^7.3 || ^8.0", 557 | "sebastian/environment": "^5.1.2" 558 | }, 559 | "conflict": { 560 | "pestphp/pest": "<0.3" 561 | }, 562 | "require-dev": { 563 | "pestphp/pest": "^0.3", 564 | "pestphp/pest-dev-tools": "dev-master" 565 | }, 566 | "type": "library", 567 | "extra": { 568 | "branch-alias": { 569 | "dev-master": "0.3.x-dev" 570 | }, 571 | "pest": { 572 | "plugins": [ 573 | "Pest\\PluginCoverage\\Plugin" 574 | ] 575 | } 576 | }, 577 | "autoload": { 578 | "psr-4": { 579 | "Pest\\PluginCoverage\\": "src/" 580 | } 581 | }, 582 | "notification-url": "https://packagist.org/downloads/", 583 | "license": [ 584 | "MIT" 585 | ], 586 | "description": "The Pest Coverage Plugin", 587 | "keywords": [ 588 | "coverage", 589 | "framework", 590 | "pest", 591 | "php", 592 | "plugin", 593 | "test", 594 | "testing", 595 | "unit" 596 | ], 597 | "funding": [ 598 | { 599 | "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", 600 | "type": "custom" 601 | }, 602 | { 603 | "url": "https://github.com/nunomaduro", 604 | "type": "github" 605 | }, 606 | { 607 | "url": "https://www.patreon.com/nunomaduro", 608 | "type": "patreon" 609 | } 610 | ], 611 | "time": "2020-08-25T20:42:46+00:00" 612 | }, 613 | { 614 | "name": "pestphp/pest-plugin-init", 615 | "version": "v0.3.0", 616 | "source": { 617 | "type": "git", 618 | "url": "https://github.com/pestphp/pest-plugin-init.git", 619 | "reference": "06482f1c7ccf92c9ed855efcb7e594399628710a" 620 | }, 621 | "dist": { 622 | "type": "zip", 623 | "url": "https://api.github.com/repos/pestphp/pest-plugin-init/zipball/06482f1c7ccf92c9ed855efcb7e594399628710a", 624 | "reference": "06482f1c7ccf92c9ed855efcb7e594399628710a", 625 | "shasum": "" 626 | }, 627 | "require": { 628 | "pestphp/pest-plugin": "^0.3", 629 | "php": "^7.3 || ^8.0" 630 | }, 631 | "conflict": { 632 | "pestphp/pest": "<0.3" 633 | }, 634 | "require-dev": { 635 | "pestphp/pest": "^0.3", 636 | "pestphp/pest-dev-tools": "dev-master" 637 | }, 638 | "type": "library", 639 | "extra": { 640 | "branch-alias": { 641 | "dev-master": "0.4.x-dev" 642 | }, 643 | "pest": { 644 | "plugins": [ 645 | "Pest\\Init\\Plugin" 646 | ] 647 | } 648 | }, 649 | "autoload": { 650 | "psr-4": { 651 | "Pest\\Init\\": "src/" 652 | } 653 | }, 654 | "notification-url": "https://packagist.org/downloads/", 655 | "license": [ 656 | "MIT" 657 | ], 658 | "description": "The Pest Init plugin", 659 | "keywords": [ 660 | "framework", 661 | "init", 662 | "pest", 663 | "php", 664 | "plugin", 665 | "test", 666 | "testing", 667 | "unit" 668 | ], 669 | "funding": [ 670 | { 671 | "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", 672 | "type": "custom" 673 | }, 674 | { 675 | "url": "https://github.com/nunomaduro", 676 | "type": "github" 677 | }, 678 | { 679 | "url": "https://www.patreon.com/nunomaduro", 680 | "type": "patreon" 681 | } 682 | ], 683 | "time": "2020-08-27T20:08:38+00:00" 684 | }, 685 | { 686 | "name": "phar-io/manifest", 687 | "version": "dev-master", 688 | "source": { 689 | "type": "git", 690 | "url": "https://github.com/phar-io/manifest.git", 691 | "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" 692 | }, 693 | "dist": { 694 | "type": "zip", 695 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", 696 | "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", 697 | "shasum": "" 698 | }, 699 | "require": { 700 | "ext-dom": "*", 701 | "ext-phar": "*", 702 | "ext-xmlwriter": "*", 703 | "phar-io/version": "^3.0.1", 704 | "php": "^7.2 || ^8.0" 705 | }, 706 | "type": "library", 707 | "extra": { 708 | "branch-alias": { 709 | "dev-master": "2.0.x-dev" 710 | } 711 | }, 712 | "autoload": { 713 | "classmap": [ 714 | "src/" 715 | ] 716 | }, 717 | "notification-url": "https://packagist.org/downloads/", 718 | "license": [ 719 | "BSD-3-Clause" 720 | ], 721 | "authors": [ 722 | { 723 | "name": "Arne Blankerts", 724 | "email": "arne@blankerts.de", 725 | "role": "Developer" 726 | }, 727 | { 728 | "name": "Sebastian Heuer", 729 | "email": "sebastian@phpeople.de", 730 | "role": "Developer" 731 | }, 732 | { 733 | "name": "Sebastian Bergmann", 734 | "email": "sebastian@phpunit.de", 735 | "role": "Developer" 736 | } 737 | ], 738 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 739 | "time": "2020-06-27T14:33:11+00:00" 740 | }, 741 | { 742 | "name": "phar-io/version", 743 | "version": "3.0.2", 744 | "source": { 745 | "type": "git", 746 | "url": "https://github.com/phar-io/version.git", 747 | "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0" 748 | }, 749 | "dist": { 750 | "type": "zip", 751 | "url": "https://api.github.com/repos/phar-io/version/zipball/c6bb6825def89e0a32220f88337f8ceaf1975fa0", 752 | "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0", 753 | "shasum": "" 754 | }, 755 | "require": { 756 | "php": "^7.2 || ^8.0" 757 | }, 758 | "type": "library", 759 | "autoload": { 760 | "classmap": [ 761 | "src/" 762 | ] 763 | }, 764 | "notification-url": "https://packagist.org/downloads/", 765 | "license": [ 766 | "BSD-3-Clause" 767 | ], 768 | "authors": [ 769 | { 770 | "name": "Arne Blankerts", 771 | "email": "arne@blankerts.de", 772 | "role": "Developer" 773 | }, 774 | { 775 | "name": "Sebastian Heuer", 776 | "email": "sebastian@phpeople.de", 777 | "role": "Developer" 778 | }, 779 | { 780 | "name": "Sebastian Bergmann", 781 | "email": "sebastian@phpunit.de", 782 | "role": "Developer" 783 | } 784 | ], 785 | "description": "Library for handling version information and constraints", 786 | "time": "2020-06-27T14:39:04+00:00" 787 | }, 788 | { 789 | "name": "phpdocumentor/reflection-common", 790 | "version": "dev-master", 791 | "source": { 792 | "type": "git", 793 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 794 | "reference": "cf8df60735d98fd18070b7cab0019ba0831e219c" 795 | }, 796 | "dist": { 797 | "type": "zip", 798 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/cf8df60735d98fd18070b7cab0019ba0831e219c", 799 | "reference": "cf8df60735d98fd18070b7cab0019ba0831e219c", 800 | "shasum": "" 801 | }, 802 | "require": { 803 | "php": ">=7.1" 804 | }, 805 | "type": "library", 806 | "extra": { 807 | "branch-alias": { 808 | "dev-master": "2.x-dev" 809 | } 810 | }, 811 | "autoload": { 812 | "psr-4": { 813 | "phpDocumentor\\Reflection\\": "src/" 814 | } 815 | }, 816 | "notification-url": "https://packagist.org/downloads/", 817 | "license": [ 818 | "MIT" 819 | ], 820 | "authors": [ 821 | { 822 | "name": "Jaap van Otterdijk", 823 | "email": "opensource@ijaap.nl" 824 | } 825 | ], 826 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 827 | "homepage": "http://www.phpdoc.org", 828 | "keywords": [ 829 | "FQSEN", 830 | "phpDocumentor", 831 | "phpdoc", 832 | "reflection", 833 | "static analysis" 834 | ], 835 | "time": "2020-06-19T17:42:03+00:00" 836 | }, 837 | { 838 | "name": "phpdocumentor/reflection-docblock", 839 | "version": "dev-master", 840 | "source": { 841 | "type": "git", 842 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 843 | "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" 844 | }, 845 | "dist": { 846 | "type": "zip", 847 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", 848 | "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", 849 | "shasum": "" 850 | }, 851 | "require": { 852 | "ext-filter": "*", 853 | "php": "^7.2 || ^8.0", 854 | "phpdocumentor/reflection-common": "^2.2", 855 | "phpdocumentor/type-resolver": "^1.3", 856 | "webmozart/assert": "^1.9.1" 857 | }, 858 | "require-dev": { 859 | "mockery/mockery": "~1.3.2" 860 | }, 861 | "type": "library", 862 | "extra": { 863 | "branch-alias": { 864 | "dev-master": "5.x-dev" 865 | } 866 | }, 867 | "autoload": { 868 | "psr-4": { 869 | "phpDocumentor\\Reflection\\": "src" 870 | } 871 | }, 872 | "notification-url": "https://packagist.org/downloads/", 873 | "license": [ 874 | "MIT" 875 | ], 876 | "authors": [ 877 | { 878 | "name": "Mike van Riel", 879 | "email": "me@mikevanriel.com" 880 | }, 881 | { 882 | "name": "Jaap van Otterdijk", 883 | "email": "account@ijaap.nl" 884 | } 885 | ], 886 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 887 | "time": "2020-09-03T19:13:55+00:00" 888 | }, 889 | { 890 | "name": "phpdocumentor/type-resolver", 891 | "version": "1.x-dev", 892 | "source": { 893 | "type": "git", 894 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 895 | "reference": "e21c0bd532911ec05ebc258e4086ea61c86e0750" 896 | }, 897 | "dist": { 898 | "type": "zip", 899 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e21c0bd532911ec05ebc258e4086ea61c86e0750", 900 | "reference": "e21c0bd532911ec05ebc258e4086ea61c86e0750", 901 | "shasum": "" 902 | }, 903 | "require": { 904 | "php": "^7.2 || ^8.0", 905 | "phpdocumentor/reflection-common": "^2.0" 906 | }, 907 | "require-dev": { 908 | "ext-tokenizer": "*" 909 | }, 910 | "type": "library", 911 | "extra": { 912 | "branch-alias": { 913 | "dev-1.x": "1.x-dev" 914 | } 915 | }, 916 | "autoload": { 917 | "psr-4": { 918 | "phpDocumentor\\Reflection\\": "src" 919 | } 920 | }, 921 | "notification-url": "https://packagist.org/downloads/", 922 | "license": [ 923 | "MIT" 924 | ], 925 | "authors": [ 926 | { 927 | "name": "Mike van Riel", 928 | "email": "me@mikevanriel.com" 929 | } 930 | ], 931 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 932 | "time": "2020-09-02T21:29:45+00:00" 933 | }, 934 | { 935 | "name": "phpspec/prophecy", 936 | "version": "dev-master", 937 | "source": { 938 | "type": "git", 939 | "url": "https://github.com/phpspec/prophecy.git", 940 | "reference": "c99da517f9e7b6e6c4067611d804808c34d8cec3" 941 | }, 942 | "dist": { 943 | "type": "zip", 944 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c99da517f9e7b6e6c4067611d804808c34d8cec3", 945 | "reference": "c99da517f9e7b6e6c4067611d804808c34d8cec3", 946 | "shasum": "" 947 | }, 948 | "require": { 949 | "doctrine/instantiator": "^1.2", 950 | "php": "^7.2", 951 | "phpdocumentor/reflection-docblock": "^5.2", 952 | "sebastian/comparator": "^3.0 || ^4.0", 953 | "sebastian/recursion-context": "^3.0 || ^4.0" 954 | }, 955 | "require-dev": { 956 | "phpspec/phpspec": "^6.0", 957 | "phpunit/phpunit": "^8.0" 958 | }, 959 | "type": "library", 960 | "extra": { 961 | "branch-alias": { 962 | "dev-master": "1.11.x-dev" 963 | } 964 | }, 965 | "autoload": { 966 | "psr-4": { 967 | "Prophecy\\": "src/Prophecy" 968 | } 969 | }, 970 | "notification-url": "https://packagist.org/downloads/", 971 | "license": [ 972 | "MIT" 973 | ], 974 | "authors": [ 975 | { 976 | "name": "Konstantin Kudryashov", 977 | "email": "ever.zet@gmail.com", 978 | "homepage": "http://everzet.com" 979 | }, 980 | { 981 | "name": "Marcello Duarte", 982 | "email": "marcello.duarte@gmail.com" 983 | } 984 | ], 985 | "description": "Highly opinionated mocking framework for PHP 5.3+", 986 | "homepage": "https://github.com/phpspec/prophecy", 987 | "keywords": [ 988 | "Double", 989 | "Dummy", 990 | "fake", 991 | "mock", 992 | "spy", 993 | "stub" 994 | ], 995 | "time": "2020-07-21T10:09:02+00:00" 996 | }, 997 | { 998 | "name": "phpunit/php-code-coverage", 999 | "version": "dev-master", 1000 | "source": { 1001 | "type": "git", 1002 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1003 | "reference": "059a59653741f8964d067bd27d39fe796704d9e0" 1004 | }, 1005 | "dist": { 1006 | "type": "zip", 1007 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/059a59653741f8964d067bd27d39fe796704d9e0", 1008 | "reference": "059a59653741f8964d067bd27d39fe796704d9e0", 1009 | "shasum": "" 1010 | }, 1011 | "require": { 1012 | "ext-dom": "*", 1013 | "ext-libxml": "*", 1014 | "ext-xmlwriter": "*", 1015 | "nikic/php-parser": "^4.8", 1016 | "php": ">=7.3", 1017 | "phpunit/php-file-iterator": "^3.0.3", 1018 | "phpunit/php-text-template": "^2.0.2", 1019 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 1020 | "sebastian/complexity": "^2.0", 1021 | "sebastian/environment": "^5.1.2", 1022 | "sebastian/lines-of-code": "^1.0", 1023 | "sebastian/version": "^3.0.1", 1024 | "theseer/tokenizer": "^1.2.0" 1025 | }, 1026 | "require-dev": { 1027 | "phpunit/phpunit": "^9.3" 1028 | }, 1029 | "suggest": { 1030 | "ext-pcov": "*", 1031 | "ext-xdebug": "*" 1032 | }, 1033 | "type": "library", 1034 | "extra": { 1035 | "branch-alias": { 1036 | "dev-master": "9.1-dev" 1037 | } 1038 | }, 1039 | "autoload": { 1040 | "classmap": [ 1041 | "src/" 1042 | ] 1043 | }, 1044 | "notification-url": "https://packagist.org/downloads/", 1045 | "license": [ 1046 | "BSD-3-Clause" 1047 | ], 1048 | "authors": [ 1049 | { 1050 | "name": "Sebastian Bergmann", 1051 | "email": "sebastian@phpunit.de", 1052 | "role": "lead" 1053 | } 1054 | ], 1055 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1056 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1057 | "keywords": [ 1058 | "coverage", 1059 | "testing", 1060 | "xunit" 1061 | ], 1062 | "funding": [ 1063 | { 1064 | "url": "https://github.com/sebastianbergmann", 1065 | "type": "github" 1066 | } 1067 | ], 1068 | "time": "2020-09-08T10:33:41+00:00" 1069 | }, 1070 | { 1071 | "name": "phpunit/php-file-iterator", 1072 | "version": "dev-master", 1073 | "source": { 1074 | "type": "git", 1075 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1076 | "reference": "6ce5fe4344ec39c80235c3170435fc6e0a7d6ec7" 1077 | }, 1078 | "dist": { 1079 | "type": "zip", 1080 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6ce5fe4344ec39c80235c3170435fc6e0a7d6ec7", 1081 | "reference": "6ce5fe4344ec39c80235c3170435fc6e0a7d6ec7", 1082 | "shasum": "" 1083 | }, 1084 | "require": { 1085 | "php": ">=7.3" 1086 | }, 1087 | "require-dev": { 1088 | "phpunit/phpunit": "^9.3" 1089 | }, 1090 | "type": "library", 1091 | "extra": { 1092 | "branch-alias": { 1093 | "dev-master": "3.0-dev" 1094 | } 1095 | }, 1096 | "autoload": { 1097 | "classmap": [ 1098 | "src/" 1099 | ] 1100 | }, 1101 | "notification-url": "https://packagist.org/downloads/", 1102 | "license": [ 1103 | "BSD-3-Clause" 1104 | ], 1105 | "authors": [ 1106 | { 1107 | "name": "Sebastian Bergmann", 1108 | "email": "sebastian@phpunit.de", 1109 | "role": "lead" 1110 | } 1111 | ], 1112 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1113 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1114 | "keywords": [ 1115 | "filesystem", 1116 | "iterator" 1117 | ], 1118 | "funding": [ 1119 | { 1120 | "url": "https://github.com/sebastianbergmann", 1121 | "type": "github" 1122 | } 1123 | ], 1124 | "time": "2020-09-08T10:33:57+00:00" 1125 | }, 1126 | { 1127 | "name": "phpunit/php-invoker", 1128 | "version": "dev-master", 1129 | "source": { 1130 | "type": "git", 1131 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 1132 | "reference": "621e2166fa3c89c7b29f5cf50760b84b714d8d8a" 1133 | }, 1134 | "dist": { 1135 | "type": "zip", 1136 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/621e2166fa3c89c7b29f5cf50760b84b714d8d8a", 1137 | "reference": "621e2166fa3c89c7b29f5cf50760b84b714d8d8a", 1138 | "shasum": "" 1139 | }, 1140 | "require": { 1141 | "php": ">=7.3" 1142 | }, 1143 | "require-dev": { 1144 | "ext-pcntl": "*", 1145 | "phpunit/phpunit": "^9.3" 1146 | }, 1147 | "suggest": { 1148 | "ext-pcntl": "*" 1149 | }, 1150 | "type": "library", 1151 | "extra": { 1152 | "branch-alias": { 1153 | "dev-master": "3.1-dev" 1154 | } 1155 | }, 1156 | "autoload": { 1157 | "classmap": [ 1158 | "src/" 1159 | ] 1160 | }, 1161 | "notification-url": "https://packagist.org/downloads/", 1162 | "license": [ 1163 | "BSD-3-Clause" 1164 | ], 1165 | "authors": [ 1166 | { 1167 | "name": "Sebastian Bergmann", 1168 | "email": "sebastian@phpunit.de", 1169 | "role": "lead" 1170 | } 1171 | ], 1172 | "description": "Invoke callables with a timeout", 1173 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 1174 | "keywords": [ 1175 | "process" 1176 | ], 1177 | "funding": [ 1178 | { 1179 | "url": "https://github.com/sebastianbergmann", 1180 | "type": "github" 1181 | } 1182 | ], 1183 | "time": "2020-09-08T10:34:07+00:00" 1184 | }, 1185 | { 1186 | "name": "phpunit/php-text-template", 1187 | "version": "dev-master", 1188 | "source": { 1189 | "type": "git", 1190 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1191 | "reference": "a9c128730ef007a58c5146f30112ac4c66479f54" 1192 | }, 1193 | "dist": { 1194 | "type": "zip", 1195 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a9c128730ef007a58c5146f30112ac4c66479f54", 1196 | "reference": "a9c128730ef007a58c5146f30112ac4c66479f54", 1197 | "shasum": "" 1198 | }, 1199 | "require": { 1200 | "php": ">=7.3" 1201 | }, 1202 | "require-dev": { 1203 | "phpunit/phpunit": "^9.3" 1204 | }, 1205 | "type": "library", 1206 | "extra": { 1207 | "branch-alias": { 1208 | "dev-master": "2.0-dev" 1209 | } 1210 | }, 1211 | "autoload": { 1212 | "classmap": [ 1213 | "src/" 1214 | ] 1215 | }, 1216 | "notification-url": "https://packagist.org/downloads/", 1217 | "license": [ 1218 | "BSD-3-Clause" 1219 | ], 1220 | "authors": [ 1221 | { 1222 | "name": "Sebastian Bergmann", 1223 | "email": "sebastian@phpunit.de", 1224 | "role": "lead" 1225 | } 1226 | ], 1227 | "description": "Simple template engine.", 1228 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1229 | "keywords": [ 1230 | "template" 1231 | ], 1232 | "funding": [ 1233 | { 1234 | "url": "https://github.com/sebastianbergmann", 1235 | "type": "github" 1236 | } 1237 | ], 1238 | "time": "2020-09-08T10:34:21+00:00" 1239 | }, 1240 | { 1241 | "name": "phpunit/php-timer", 1242 | "version": "dev-master", 1243 | "source": { 1244 | "type": "git", 1245 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1246 | "reference": "08214dbe4ffb2f45a1d4d77212b169405ca328ea" 1247 | }, 1248 | "dist": { 1249 | "type": "zip", 1250 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/08214dbe4ffb2f45a1d4d77212b169405ca328ea", 1251 | "reference": "08214dbe4ffb2f45a1d4d77212b169405ca328ea", 1252 | "shasum": "" 1253 | }, 1254 | "require": { 1255 | "php": ">=7.3" 1256 | }, 1257 | "require-dev": { 1258 | "phpunit/phpunit": "^9.3" 1259 | }, 1260 | "type": "library", 1261 | "extra": { 1262 | "branch-alias": { 1263 | "dev-master": "5.0-dev" 1264 | } 1265 | }, 1266 | "autoload": { 1267 | "classmap": [ 1268 | "src/" 1269 | ] 1270 | }, 1271 | "notification-url": "https://packagist.org/downloads/", 1272 | "license": [ 1273 | "BSD-3-Clause" 1274 | ], 1275 | "authors": [ 1276 | { 1277 | "name": "Sebastian Bergmann", 1278 | "email": "sebastian@phpunit.de", 1279 | "role": "lead" 1280 | } 1281 | ], 1282 | "description": "Utility class for timing", 1283 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1284 | "keywords": [ 1285 | "timer" 1286 | ], 1287 | "funding": [ 1288 | { 1289 | "url": "https://github.com/sebastianbergmann", 1290 | "type": "github" 1291 | } 1292 | ], 1293 | "time": "2020-09-08T10:34:30+00:00" 1294 | }, 1295 | { 1296 | "name": "phpunit/phpunit", 1297 | "version": "9.3.8", 1298 | "source": { 1299 | "type": "git", 1300 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1301 | "reference": "93d78d8e2a06393a0d0c1ead6fe9984f1af1f88c" 1302 | }, 1303 | "dist": { 1304 | "type": "zip", 1305 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/93d78d8e2a06393a0d0c1ead6fe9984f1af1f88c", 1306 | "reference": "93d78d8e2a06393a0d0c1ead6fe9984f1af1f88c", 1307 | "shasum": "" 1308 | }, 1309 | "require": { 1310 | "doctrine/instantiator": "^1.3.1", 1311 | "ext-dom": "*", 1312 | "ext-json": "*", 1313 | "ext-libxml": "*", 1314 | "ext-mbstring": "*", 1315 | "ext-xml": "*", 1316 | "ext-xmlwriter": "*", 1317 | "myclabs/deep-copy": "^1.10.1", 1318 | "phar-io/manifest": "^2.0.1", 1319 | "phar-io/version": "^3.0.2", 1320 | "php": "^7.3 || ^8.0", 1321 | "phpspec/prophecy": "^1.11.1", 1322 | "phpunit/php-code-coverage": "^9.1.5", 1323 | "phpunit/php-file-iterator": "^3.0.4", 1324 | "phpunit/php-invoker": "^3.1", 1325 | "phpunit/php-text-template": "^2.0.2", 1326 | "phpunit/php-timer": "^5.0.1", 1327 | "sebastian/cli-parser": "^1.0", 1328 | "sebastian/code-unit": "^1.0.5", 1329 | "sebastian/comparator": "^4.0.3", 1330 | "sebastian/diff": "^4.0.2", 1331 | "sebastian/environment": "^5.1.2", 1332 | "sebastian/exporter": "^4.0.2", 1333 | "sebastian/global-state": "^5.0", 1334 | "sebastian/object-enumerator": "^4.0.2", 1335 | "sebastian/resource-operations": "^3.0.2", 1336 | "sebastian/type": "^2.2.1", 1337 | "sebastian/version": "^3.0.1" 1338 | }, 1339 | "require-dev": { 1340 | "ext-pdo": "*", 1341 | "phpspec/prophecy-phpunit": "^2.0.1" 1342 | }, 1343 | "suggest": { 1344 | "ext-soap": "*", 1345 | "ext-xdebug": "*" 1346 | }, 1347 | "bin": [ 1348 | "phpunit" 1349 | ], 1350 | "type": "library", 1351 | "extra": { 1352 | "branch-alias": { 1353 | "dev-master": "9.3-dev" 1354 | } 1355 | }, 1356 | "autoload": { 1357 | "classmap": [ 1358 | "src/" 1359 | ], 1360 | "files": [ 1361 | "src/Framework/Assert/Functions.php" 1362 | ] 1363 | }, 1364 | "notification-url": "https://packagist.org/downloads/", 1365 | "license": [ 1366 | "BSD-3-Clause" 1367 | ], 1368 | "authors": [ 1369 | { 1370 | "name": "Sebastian Bergmann", 1371 | "email": "sebastian@phpunit.de", 1372 | "role": "lead" 1373 | } 1374 | ], 1375 | "description": "The PHP Unit Testing framework.", 1376 | "homepage": "https://phpunit.de/", 1377 | "keywords": [ 1378 | "phpunit", 1379 | "testing", 1380 | "xunit" 1381 | ], 1382 | "funding": [ 1383 | { 1384 | "url": "https://phpunit.de/donate.html", 1385 | "type": "custom" 1386 | }, 1387 | { 1388 | "url": "https://github.com/sebastianbergmann", 1389 | "type": "github" 1390 | } 1391 | ], 1392 | "time": "2020-08-27T06:30:58+00:00" 1393 | }, 1394 | { 1395 | "name": "psr/container", 1396 | "version": "dev-master", 1397 | "source": { 1398 | "type": "git", 1399 | "url": "https://github.com/php-fig/container.git", 1400 | "reference": "fc1bc363ecf887921e3897c7b1dad3587ae154eb" 1401 | }, 1402 | "dist": { 1403 | "type": "zip", 1404 | "url": "https://api.github.com/repos/php-fig/container/zipball/fc1bc363ecf887921e3897c7b1dad3587ae154eb", 1405 | "reference": "fc1bc363ecf887921e3897c7b1dad3587ae154eb", 1406 | "shasum": "" 1407 | }, 1408 | "require": { 1409 | "php": ">=5.3.0" 1410 | }, 1411 | "type": "library", 1412 | "extra": { 1413 | "branch-alias": { 1414 | "dev-master": "1.0.x-dev" 1415 | } 1416 | }, 1417 | "autoload": { 1418 | "psr-4": { 1419 | "Psr\\Container\\": "src/" 1420 | } 1421 | }, 1422 | "notification-url": "https://packagist.org/downloads/", 1423 | "license": [ 1424 | "MIT" 1425 | ], 1426 | "authors": [ 1427 | { 1428 | "name": "PHP-FIG", 1429 | "homepage": "http://www.php-fig.org/" 1430 | } 1431 | ], 1432 | "description": "Common Container Interface (PHP FIG PSR-11)", 1433 | "homepage": "https://github.com/php-fig/container", 1434 | "keywords": [ 1435 | "PSR-11", 1436 | "container", 1437 | "container-interface", 1438 | "container-interop", 1439 | "psr" 1440 | ], 1441 | "time": "2019-10-04T14:07:35+00:00" 1442 | }, 1443 | { 1444 | "name": "psr/log", 1445 | "version": "dev-master", 1446 | "source": { 1447 | "type": "git", 1448 | "url": "https://github.com/php-fig/log.git", 1449 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" 1450 | }, 1451 | "dist": { 1452 | "type": "zip", 1453 | "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", 1454 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", 1455 | "shasum": "" 1456 | }, 1457 | "require": { 1458 | "php": ">=5.3.0" 1459 | }, 1460 | "type": "library", 1461 | "extra": { 1462 | "branch-alias": { 1463 | "dev-master": "1.1.x-dev" 1464 | } 1465 | }, 1466 | "autoload": { 1467 | "psr-4": { 1468 | "Psr\\Log\\": "Psr/Log/" 1469 | } 1470 | }, 1471 | "notification-url": "https://packagist.org/downloads/", 1472 | "license": [ 1473 | "MIT" 1474 | ], 1475 | "authors": [ 1476 | { 1477 | "name": "PHP-FIG", 1478 | "homepage": "http://www.php-fig.org/" 1479 | } 1480 | ], 1481 | "description": "Common interface for logging libraries", 1482 | "homepage": "https://github.com/php-fig/log", 1483 | "keywords": [ 1484 | "log", 1485 | "psr", 1486 | "psr-3" 1487 | ], 1488 | "time": "2020-03-23T09:12:05+00:00" 1489 | }, 1490 | { 1491 | "name": "sebastian/cli-parser", 1492 | "version": "dev-master", 1493 | "source": { 1494 | "type": "git", 1495 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1496 | "reference": "c1e8aabbd13897c73f71d14e1d79f025fb9271c9" 1497 | }, 1498 | "dist": { 1499 | "type": "zip", 1500 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c1e8aabbd13897c73f71d14e1d79f025fb9271c9", 1501 | "reference": "c1e8aabbd13897c73f71d14e1d79f025fb9271c9", 1502 | "shasum": "" 1503 | }, 1504 | "require": { 1505 | "php": ">=7.3" 1506 | }, 1507 | "require-dev": { 1508 | "phpunit/phpunit": "^9.3" 1509 | }, 1510 | "type": "library", 1511 | "extra": { 1512 | "branch-alias": { 1513 | "dev-master": "1.0-dev" 1514 | } 1515 | }, 1516 | "autoload": { 1517 | "classmap": [ 1518 | "src/" 1519 | ] 1520 | }, 1521 | "notification-url": "https://packagist.org/downloads/", 1522 | "license": [ 1523 | "BSD-3-Clause" 1524 | ], 1525 | "authors": [ 1526 | { 1527 | "name": "Sebastian Bergmann", 1528 | "email": "sebastian@phpunit.de", 1529 | "role": "lead" 1530 | } 1531 | ], 1532 | "description": "Library for parsing CLI options", 1533 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1534 | "funding": [ 1535 | { 1536 | "url": "https://github.com/sebastianbergmann", 1537 | "type": "github" 1538 | } 1539 | ], 1540 | "time": "2020-09-08T10:34:39+00:00" 1541 | }, 1542 | { 1543 | "name": "sebastian/code-unit", 1544 | "version": "dev-master", 1545 | "source": { 1546 | "type": "git", 1547 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1548 | "reference": "736eb4d68e588d7ea0527ea52fe83b82221b8d40" 1549 | }, 1550 | "dist": { 1551 | "type": "zip", 1552 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/736eb4d68e588d7ea0527ea52fe83b82221b8d40", 1553 | "reference": "736eb4d68e588d7ea0527ea52fe83b82221b8d40", 1554 | "shasum": "" 1555 | }, 1556 | "require": { 1557 | "php": ">=7.3" 1558 | }, 1559 | "require-dev": { 1560 | "phpunit/phpunit": "^9.3" 1561 | }, 1562 | "type": "library", 1563 | "extra": { 1564 | "branch-alias": { 1565 | "dev-master": "1.0-dev" 1566 | } 1567 | }, 1568 | "autoload": { 1569 | "classmap": [ 1570 | "src/" 1571 | ] 1572 | }, 1573 | "notification-url": "https://packagist.org/downloads/", 1574 | "license": [ 1575 | "BSD-3-Clause" 1576 | ], 1577 | "authors": [ 1578 | { 1579 | "name": "Sebastian Bergmann", 1580 | "email": "sebastian@phpunit.de", 1581 | "role": "lead" 1582 | } 1583 | ], 1584 | "description": "Collection of value objects that represent the PHP code units", 1585 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1586 | "funding": [ 1587 | { 1588 | "url": "https://github.com/sebastianbergmann", 1589 | "type": "github" 1590 | } 1591 | ], 1592 | "time": "2020-09-08T10:34:57+00:00" 1593 | }, 1594 | { 1595 | "name": "sebastian/code-unit-reverse-lookup", 1596 | "version": "dev-master", 1597 | "source": { 1598 | "type": "git", 1599 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1600 | "reference": "469e84d8bca12b6fc9ac949ee28f95ea45274beb" 1601 | }, 1602 | "dist": { 1603 | "type": "zip", 1604 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/469e84d8bca12b6fc9ac949ee28f95ea45274beb", 1605 | "reference": "469e84d8bca12b6fc9ac949ee28f95ea45274beb", 1606 | "shasum": "" 1607 | }, 1608 | "require": { 1609 | "php": ">=7.3" 1610 | }, 1611 | "require-dev": { 1612 | "phpunit/phpunit": "^9.3" 1613 | }, 1614 | "type": "library", 1615 | "extra": { 1616 | "branch-alias": { 1617 | "dev-master": "2.0-dev" 1618 | } 1619 | }, 1620 | "autoload": { 1621 | "classmap": [ 1622 | "src/" 1623 | ] 1624 | }, 1625 | "notification-url": "https://packagist.org/downloads/", 1626 | "license": [ 1627 | "BSD-3-Clause" 1628 | ], 1629 | "authors": [ 1630 | { 1631 | "name": "Sebastian Bergmann", 1632 | "email": "sebastian@phpunit.de" 1633 | } 1634 | ], 1635 | "description": "Looks up which function or method a line of code belongs to", 1636 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1637 | "funding": [ 1638 | { 1639 | "url": "https://github.com/sebastianbergmann", 1640 | "type": "github" 1641 | } 1642 | ], 1643 | "time": "2020-09-08T10:35:05+00:00" 1644 | }, 1645 | { 1646 | "name": "sebastian/comparator", 1647 | "version": "dev-master", 1648 | "source": { 1649 | "type": "git", 1650 | "url": "https://github.com/sebastianbergmann/comparator.git", 1651 | "reference": "1dc027e97579a63681fb718c8fb1fe129b8ac09d" 1652 | }, 1653 | "dist": { 1654 | "type": "zip", 1655 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc027e97579a63681fb718c8fb1fe129b8ac09d", 1656 | "reference": "1dc027e97579a63681fb718c8fb1fe129b8ac09d", 1657 | "shasum": "" 1658 | }, 1659 | "require": { 1660 | "php": ">=7.3", 1661 | "sebastian/diff": "^4.0", 1662 | "sebastian/exporter": "^4.0" 1663 | }, 1664 | "require-dev": { 1665 | "phpunit/phpunit": "^9.3" 1666 | }, 1667 | "type": "library", 1668 | "extra": { 1669 | "branch-alias": { 1670 | "dev-master": "4.0-dev" 1671 | } 1672 | }, 1673 | "autoload": { 1674 | "classmap": [ 1675 | "src/" 1676 | ] 1677 | }, 1678 | "notification-url": "https://packagist.org/downloads/", 1679 | "license": [ 1680 | "BSD-3-Clause" 1681 | ], 1682 | "authors": [ 1683 | { 1684 | "name": "Sebastian Bergmann", 1685 | "email": "sebastian@phpunit.de" 1686 | }, 1687 | { 1688 | "name": "Jeff Welch", 1689 | "email": "whatthejeff@gmail.com" 1690 | }, 1691 | { 1692 | "name": "Volker Dusch", 1693 | "email": "github@wallbash.com" 1694 | }, 1695 | { 1696 | "name": "Bernhard Schussek", 1697 | "email": "bschussek@2bepublished.at" 1698 | } 1699 | ], 1700 | "description": "Provides the functionality to compare PHP values for equality", 1701 | "homepage": "https://github.com/sebastianbergmann/comparator", 1702 | "keywords": [ 1703 | "comparator", 1704 | "compare", 1705 | "equality" 1706 | ], 1707 | "funding": [ 1708 | { 1709 | "url": "https://github.com/sebastianbergmann", 1710 | "type": "github" 1711 | } 1712 | ], 1713 | "time": "2020-09-08T10:35:19+00:00" 1714 | }, 1715 | { 1716 | "name": "sebastian/complexity", 1717 | "version": "dev-master", 1718 | "source": { 1719 | "type": "git", 1720 | "url": "https://github.com/sebastianbergmann/complexity.git", 1721 | "reference": "38c8229c5372b2958f978924c465f38193b69968" 1722 | }, 1723 | "dist": { 1724 | "type": "zip", 1725 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/38c8229c5372b2958f978924c465f38193b69968", 1726 | "reference": "38c8229c5372b2958f978924c465f38193b69968", 1727 | "shasum": "" 1728 | }, 1729 | "require": { 1730 | "nikic/php-parser": "^4.7", 1731 | "php": ">=7.3" 1732 | }, 1733 | "require-dev": { 1734 | "phpunit/phpunit": "^9.3" 1735 | }, 1736 | "type": "library", 1737 | "extra": { 1738 | "branch-alias": { 1739 | "dev-master": "2.0-dev" 1740 | } 1741 | }, 1742 | "autoload": { 1743 | "classmap": [ 1744 | "src/" 1745 | ] 1746 | }, 1747 | "notification-url": "https://packagist.org/downloads/", 1748 | "license": [ 1749 | "BSD-3-Clause" 1750 | ], 1751 | "authors": [ 1752 | { 1753 | "name": "Sebastian Bergmann", 1754 | "email": "sebastian@phpunit.de", 1755 | "role": "lead" 1756 | } 1757 | ], 1758 | "description": "Library for calculating the complexity of PHP code units", 1759 | "homepage": "https://github.com/sebastianbergmann/complexity", 1760 | "funding": [ 1761 | { 1762 | "url": "https://github.com/sebastianbergmann", 1763 | "type": "github" 1764 | } 1765 | ], 1766 | "time": "2020-09-08T10:35:28+00:00" 1767 | }, 1768 | { 1769 | "name": "sebastian/diff", 1770 | "version": "dev-master", 1771 | "source": { 1772 | "type": "git", 1773 | "url": "https://github.com/sebastianbergmann/diff.git", 1774 | "reference": "cdb74179a0e4cd93e5f54920a699a665b773b9f7" 1775 | }, 1776 | "dist": { 1777 | "type": "zip", 1778 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/cdb74179a0e4cd93e5f54920a699a665b773b9f7", 1779 | "reference": "cdb74179a0e4cd93e5f54920a699a665b773b9f7", 1780 | "shasum": "" 1781 | }, 1782 | "require": { 1783 | "php": ">=7.3" 1784 | }, 1785 | "require-dev": { 1786 | "phpunit/phpunit": "^9.3", 1787 | "symfony/process": "^4.2 || ^5" 1788 | }, 1789 | "type": "library", 1790 | "extra": { 1791 | "branch-alias": { 1792 | "dev-master": "4.0-dev" 1793 | } 1794 | }, 1795 | "autoload": { 1796 | "classmap": [ 1797 | "src/" 1798 | ] 1799 | }, 1800 | "notification-url": "https://packagist.org/downloads/", 1801 | "license": [ 1802 | "BSD-3-Clause" 1803 | ], 1804 | "authors": [ 1805 | { 1806 | "name": "Sebastian Bergmann", 1807 | "email": "sebastian@phpunit.de" 1808 | }, 1809 | { 1810 | "name": "Kore Nordmann", 1811 | "email": "mail@kore-nordmann.de" 1812 | } 1813 | ], 1814 | "description": "Diff implementation", 1815 | "homepage": "https://github.com/sebastianbergmann/diff", 1816 | "keywords": [ 1817 | "diff", 1818 | "udiff", 1819 | "unidiff", 1820 | "unified diff" 1821 | ], 1822 | "funding": [ 1823 | { 1824 | "url": "https://github.com/sebastianbergmann", 1825 | "type": "github" 1826 | } 1827 | ], 1828 | "time": "2020-09-08T10:35:37+00:00" 1829 | }, 1830 | { 1831 | "name": "sebastian/environment", 1832 | "version": "dev-master", 1833 | "source": { 1834 | "type": "git", 1835 | "url": "https://github.com/sebastianbergmann/environment.git", 1836 | "reference": "679d03d58d68d4db9ccd601bc6592c634cb02fb5" 1837 | }, 1838 | "dist": { 1839 | "type": "zip", 1840 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/679d03d58d68d4db9ccd601bc6592c634cb02fb5", 1841 | "reference": "679d03d58d68d4db9ccd601bc6592c634cb02fb5", 1842 | "shasum": "" 1843 | }, 1844 | "require": { 1845 | "php": ">=7.3" 1846 | }, 1847 | "require-dev": { 1848 | "phpunit/phpunit": "^9.3" 1849 | }, 1850 | "suggest": { 1851 | "ext-posix": "*" 1852 | }, 1853 | "type": "library", 1854 | "extra": { 1855 | "branch-alias": { 1856 | "dev-master": "5.1-dev" 1857 | } 1858 | }, 1859 | "autoload": { 1860 | "classmap": [ 1861 | "src/" 1862 | ] 1863 | }, 1864 | "notification-url": "https://packagist.org/downloads/", 1865 | "license": [ 1866 | "BSD-3-Clause" 1867 | ], 1868 | "authors": [ 1869 | { 1870 | "name": "Sebastian Bergmann", 1871 | "email": "sebastian@phpunit.de" 1872 | } 1873 | ], 1874 | "description": "Provides functionality to handle HHVM/PHP environments", 1875 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1876 | "keywords": [ 1877 | "Xdebug", 1878 | "environment", 1879 | "hhvm" 1880 | ], 1881 | "funding": [ 1882 | { 1883 | "url": "https://github.com/sebastianbergmann", 1884 | "type": "github" 1885 | } 1886 | ], 1887 | "time": "2020-09-08T10:35:45+00:00" 1888 | }, 1889 | { 1890 | "name": "sebastian/exporter", 1891 | "version": "dev-master", 1892 | "source": { 1893 | "type": "git", 1894 | "url": "https://github.com/sebastianbergmann/exporter.git", 1895 | "reference": "7a84be032df6d439461724e9c7d92781fb6e295e" 1896 | }, 1897 | "dist": { 1898 | "type": "zip", 1899 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7a84be032df6d439461724e9c7d92781fb6e295e", 1900 | "reference": "7a84be032df6d439461724e9c7d92781fb6e295e", 1901 | "shasum": "" 1902 | }, 1903 | "require": { 1904 | "php": ">=7.3", 1905 | "sebastian/recursion-context": "^4.0" 1906 | }, 1907 | "require-dev": { 1908 | "ext-mbstring": "*", 1909 | "phpunit/phpunit": "^9.3" 1910 | }, 1911 | "type": "library", 1912 | "extra": { 1913 | "branch-alias": { 1914 | "dev-master": "4.0-dev" 1915 | } 1916 | }, 1917 | "autoload": { 1918 | "classmap": [ 1919 | "src/" 1920 | ] 1921 | }, 1922 | "notification-url": "https://packagist.org/downloads/", 1923 | "license": [ 1924 | "BSD-3-Clause" 1925 | ], 1926 | "authors": [ 1927 | { 1928 | "name": "Sebastian Bergmann", 1929 | "email": "sebastian@phpunit.de" 1930 | }, 1931 | { 1932 | "name": "Jeff Welch", 1933 | "email": "whatthejeff@gmail.com" 1934 | }, 1935 | { 1936 | "name": "Volker Dusch", 1937 | "email": "github@wallbash.com" 1938 | }, 1939 | { 1940 | "name": "Adam Harvey", 1941 | "email": "aharvey@php.net" 1942 | }, 1943 | { 1944 | "name": "Bernhard Schussek", 1945 | "email": "bschussek@gmail.com" 1946 | } 1947 | ], 1948 | "description": "Provides the functionality to export PHP variables for visualization", 1949 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1950 | "keywords": [ 1951 | "export", 1952 | "exporter" 1953 | ], 1954 | "funding": [ 1955 | { 1956 | "url": "https://github.com/sebastianbergmann", 1957 | "type": "github" 1958 | } 1959 | ], 1960 | "time": "2020-09-08T10:35:58+00:00" 1961 | }, 1962 | { 1963 | "name": "sebastian/global-state", 1964 | "version": "dev-master", 1965 | "source": { 1966 | "type": "git", 1967 | "url": "https://github.com/sebastianbergmann/global-state.git", 1968 | "reference": "29fcd1e8113ded315108092d80b0c206885d7e64" 1969 | }, 1970 | "dist": { 1971 | "type": "zip", 1972 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/29fcd1e8113ded315108092d80b0c206885d7e64", 1973 | "reference": "29fcd1e8113ded315108092d80b0c206885d7e64", 1974 | "shasum": "" 1975 | }, 1976 | "require": { 1977 | "php": ">=7.3", 1978 | "sebastian/object-reflector": "^2.0", 1979 | "sebastian/recursion-context": "^4.0" 1980 | }, 1981 | "require-dev": { 1982 | "ext-dom": "*", 1983 | "phpunit/phpunit": "^9.3" 1984 | }, 1985 | "suggest": { 1986 | "ext-uopz": "*" 1987 | }, 1988 | "type": "library", 1989 | "extra": { 1990 | "branch-alias": { 1991 | "dev-master": "5.0-dev" 1992 | } 1993 | }, 1994 | "autoload": { 1995 | "classmap": [ 1996 | "src/" 1997 | ] 1998 | }, 1999 | "notification-url": "https://packagist.org/downloads/", 2000 | "license": [ 2001 | "BSD-3-Clause" 2002 | ], 2003 | "authors": [ 2004 | { 2005 | "name": "Sebastian Bergmann", 2006 | "email": "sebastian@phpunit.de" 2007 | } 2008 | ], 2009 | "description": "Snapshotting of global state", 2010 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2011 | "keywords": [ 2012 | "global state" 2013 | ], 2014 | "funding": [ 2015 | { 2016 | "url": "https://github.com/sebastianbergmann", 2017 | "type": "github" 2018 | } 2019 | ], 2020 | "time": "2020-09-08T10:36:07+00:00" 2021 | }, 2022 | { 2023 | "name": "sebastian/lines-of-code", 2024 | "version": "dev-master", 2025 | "source": { 2026 | "type": "git", 2027 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 2028 | "reference": "4926d96f5c83ab4503bf84d42c7bd635341e7825" 2029 | }, 2030 | "dist": { 2031 | "type": "zip", 2032 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/4926d96f5c83ab4503bf84d42c7bd635341e7825", 2033 | "reference": "4926d96f5c83ab4503bf84d42c7bd635341e7825", 2034 | "shasum": "" 2035 | }, 2036 | "require": { 2037 | "nikic/php-parser": "^4.6", 2038 | "php": ">=7.3" 2039 | }, 2040 | "require-dev": { 2041 | "phpunit/phpunit": "^9.3" 2042 | }, 2043 | "type": "library", 2044 | "extra": { 2045 | "branch-alias": { 2046 | "dev-master": "1.0-dev" 2047 | } 2048 | }, 2049 | "autoload": { 2050 | "classmap": [ 2051 | "src/" 2052 | ] 2053 | }, 2054 | "notification-url": "https://packagist.org/downloads/", 2055 | "license": [ 2056 | "BSD-3-Clause" 2057 | ], 2058 | "authors": [ 2059 | { 2060 | "name": "Sebastian Bergmann", 2061 | "email": "sebastian@phpunit.de", 2062 | "role": "lead" 2063 | } 2064 | ], 2065 | "description": "Library for counting the lines of code in PHP source code", 2066 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 2067 | "funding": [ 2068 | { 2069 | "url": "https://github.com/sebastianbergmann", 2070 | "type": "github" 2071 | } 2072 | ], 2073 | "time": "2020-09-08T10:36:16+00:00" 2074 | }, 2075 | { 2076 | "name": "sebastian/object-enumerator", 2077 | "version": "dev-master", 2078 | "source": { 2079 | "type": "git", 2080 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2081 | "reference": "1e3411c7811a22c59b60b76ae9a5919640eb364f" 2082 | }, 2083 | "dist": { 2084 | "type": "zip", 2085 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1e3411c7811a22c59b60b76ae9a5919640eb364f", 2086 | "reference": "1e3411c7811a22c59b60b76ae9a5919640eb364f", 2087 | "shasum": "" 2088 | }, 2089 | "require": { 2090 | "php": ">=7.3", 2091 | "sebastian/object-reflector": "^2.0", 2092 | "sebastian/recursion-context": "^4.0" 2093 | }, 2094 | "require-dev": { 2095 | "phpunit/phpunit": "^9.3" 2096 | }, 2097 | "type": "library", 2098 | "extra": { 2099 | "branch-alias": { 2100 | "dev-master": "4.0-dev" 2101 | } 2102 | }, 2103 | "autoload": { 2104 | "classmap": [ 2105 | "src/" 2106 | ] 2107 | }, 2108 | "notification-url": "https://packagist.org/downloads/", 2109 | "license": [ 2110 | "BSD-3-Clause" 2111 | ], 2112 | "authors": [ 2113 | { 2114 | "name": "Sebastian Bergmann", 2115 | "email": "sebastian@phpunit.de" 2116 | } 2117 | ], 2118 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2119 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2120 | "funding": [ 2121 | { 2122 | "url": "https://github.com/sebastianbergmann", 2123 | "type": "github" 2124 | } 2125 | ], 2126 | "time": "2020-09-08T10:36:24+00:00" 2127 | }, 2128 | { 2129 | "name": "sebastian/object-reflector", 2130 | "version": "dev-master", 2131 | "source": { 2132 | "type": "git", 2133 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2134 | "reference": "b2d914504c2e2227dc73dfb4b8094f7b25673b50" 2135 | }, 2136 | "dist": { 2137 | "type": "zip", 2138 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b2d914504c2e2227dc73dfb4b8094f7b25673b50", 2139 | "reference": "b2d914504c2e2227dc73dfb4b8094f7b25673b50", 2140 | "shasum": "" 2141 | }, 2142 | "require": { 2143 | "php": ">=7.3" 2144 | }, 2145 | "require-dev": { 2146 | "phpunit/phpunit": "^9.3" 2147 | }, 2148 | "type": "library", 2149 | "extra": { 2150 | "branch-alias": { 2151 | "dev-master": "2.0-dev" 2152 | } 2153 | }, 2154 | "autoload": { 2155 | "classmap": [ 2156 | "src/" 2157 | ] 2158 | }, 2159 | "notification-url": "https://packagist.org/downloads/", 2160 | "license": [ 2161 | "BSD-3-Clause" 2162 | ], 2163 | "authors": [ 2164 | { 2165 | "name": "Sebastian Bergmann", 2166 | "email": "sebastian@phpunit.de" 2167 | } 2168 | ], 2169 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2170 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2171 | "funding": [ 2172 | { 2173 | "url": "https://github.com/sebastianbergmann", 2174 | "type": "github" 2175 | } 2176 | ], 2177 | "time": "2020-09-08T10:36:32+00:00" 2178 | }, 2179 | { 2180 | "name": "sebastian/recursion-context", 2181 | "version": "dev-master", 2182 | "source": { 2183 | "type": "git", 2184 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2185 | "reference": "0cdd3a64f378684f67817c32c9b3beb1ee5762d2" 2186 | }, 2187 | "dist": { 2188 | "type": "zip", 2189 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0cdd3a64f378684f67817c32c9b3beb1ee5762d2", 2190 | "reference": "0cdd3a64f378684f67817c32c9b3beb1ee5762d2", 2191 | "shasum": "" 2192 | }, 2193 | "require": { 2194 | "php": ">=7.3" 2195 | }, 2196 | "require-dev": { 2197 | "phpunit/phpunit": "^9.3" 2198 | }, 2199 | "type": "library", 2200 | "extra": { 2201 | "branch-alias": { 2202 | "dev-master": "4.0-dev" 2203 | } 2204 | }, 2205 | "autoload": { 2206 | "classmap": [ 2207 | "src/" 2208 | ] 2209 | }, 2210 | "notification-url": "https://packagist.org/downloads/", 2211 | "license": [ 2212 | "BSD-3-Clause" 2213 | ], 2214 | "authors": [ 2215 | { 2216 | "name": "Sebastian Bergmann", 2217 | "email": "sebastian@phpunit.de" 2218 | }, 2219 | { 2220 | "name": "Jeff Welch", 2221 | "email": "whatthejeff@gmail.com" 2222 | }, 2223 | { 2224 | "name": "Adam Harvey", 2225 | "email": "aharvey@php.net" 2226 | } 2227 | ], 2228 | "description": "Provides functionality to recursively process PHP variables", 2229 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2230 | "funding": [ 2231 | { 2232 | "url": "https://github.com/sebastianbergmann", 2233 | "type": "github" 2234 | } 2235 | ], 2236 | "time": "2020-09-08T10:36:41+00:00" 2237 | }, 2238 | { 2239 | "name": "sebastian/resource-operations", 2240 | "version": "dev-master", 2241 | "source": { 2242 | "type": "git", 2243 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2244 | "reference": "a90e85be593e87a3a7097db7e6b65bcdddc51ff6" 2245 | }, 2246 | "dist": { 2247 | "type": "zip", 2248 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/a90e85be593e87a3a7097db7e6b65bcdddc51ff6", 2249 | "reference": "a90e85be593e87a3a7097db7e6b65bcdddc51ff6", 2250 | "shasum": "" 2251 | }, 2252 | "require": { 2253 | "php": ">=7.3" 2254 | }, 2255 | "require-dev": { 2256 | "phpunit/phpunit": "^9.0" 2257 | }, 2258 | "type": "library", 2259 | "extra": { 2260 | "branch-alias": { 2261 | "dev-master": "3.0-dev" 2262 | } 2263 | }, 2264 | "autoload": { 2265 | "classmap": [ 2266 | "src/" 2267 | ] 2268 | }, 2269 | "notification-url": "https://packagist.org/downloads/", 2270 | "license": [ 2271 | "BSD-3-Clause" 2272 | ], 2273 | "authors": [ 2274 | { 2275 | "name": "Sebastian Bergmann", 2276 | "email": "sebastian@phpunit.de" 2277 | } 2278 | ], 2279 | "description": "Provides a list of PHP built-in functions that operate on resources", 2280 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2281 | "funding": [ 2282 | { 2283 | "url": "https://github.com/sebastianbergmann", 2284 | "type": "github" 2285 | } 2286 | ], 2287 | "time": "2020-09-08T10:36:49+00:00" 2288 | }, 2289 | { 2290 | "name": "sebastian/type", 2291 | "version": "dev-master", 2292 | "source": { 2293 | "type": "git", 2294 | "url": "https://github.com/sebastianbergmann/type.git", 2295 | "reference": "bfc277ce6f3804df8c165e4d602853eda8219e0c" 2296 | }, 2297 | "dist": { 2298 | "type": "zip", 2299 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/bfc277ce6f3804df8c165e4d602853eda8219e0c", 2300 | "reference": "bfc277ce6f3804df8c165e4d602853eda8219e0c", 2301 | "shasum": "" 2302 | }, 2303 | "require": { 2304 | "php": ">=7.3" 2305 | }, 2306 | "require-dev": { 2307 | "phpunit/phpunit": "^9.3" 2308 | }, 2309 | "type": "library", 2310 | "extra": { 2311 | "branch-alias": { 2312 | "dev-master": "2.2-dev" 2313 | } 2314 | }, 2315 | "autoload": { 2316 | "classmap": [ 2317 | "src/" 2318 | ] 2319 | }, 2320 | "notification-url": "https://packagist.org/downloads/", 2321 | "license": [ 2322 | "BSD-3-Clause" 2323 | ], 2324 | "authors": [ 2325 | { 2326 | "name": "Sebastian Bergmann", 2327 | "email": "sebastian@phpunit.de", 2328 | "role": "lead" 2329 | } 2330 | ], 2331 | "description": "Collection of value objects that represent the types of the PHP type system", 2332 | "homepage": "https://github.com/sebastianbergmann/type", 2333 | "funding": [ 2334 | { 2335 | "url": "https://github.com/sebastianbergmann", 2336 | "type": "github" 2337 | } 2338 | ], 2339 | "time": "2020-09-08T10:36:57+00:00" 2340 | }, 2341 | { 2342 | "name": "sebastian/version", 2343 | "version": "dev-master", 2344 | "source": { 2345 | "type": "git", 2346 | "url": "https://github.com/sebastianbergmann/version.git", 2347 | "reference": "c56083d3d8b0994a9211898caf489770a849386c" 2348 | }, 2349 | "dist": { 2350 | "type": "zip", 2351 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c56083d3d8b0994a9211898caf489770a849386c", 2352 | "reference": "c56083d3d8b0994a9211898caf489770a849386c", 2353 | "shasum": "" 2354 | }, 2355 | "require": { 2356 | "php": ">=7.3" 2357 | }, 2358 | "type": "library", 2359 | "extra": { 2360 | "branch-alias": { 2361 | "dev-master": "3.0-dev" 2362 | } 2363 | }, 2364 | "autoload": { 2365 | "classmap": [ 2366 | "src/" 2367 | ] 2368 | }, 2369 | "notification-url": "https://packagist.org/downloads/", 2370 | "license": [ 2371 | "BSD-3-Clause" 2372 | ], 2373 | "authors": [ 2374 | { 2375 | "name": "Sebastian Bergmann", 2376 | "email": "sebastian@phpunit.de", 2377 | "role": "lead" 2378 | } 2379 | ], 2380 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2381 | "homepage": "https://github.com/sebastianbergmann/version", 2382 | "funding": [ 2383 | { 2384 | "url": "https://github.com/sebastianbergmann", 2385 | "type": "github" 2386 | } 2387 | ], 2388 | "time": "2020-09-08T10:37:06+00:00" 2389 | }, 2390 | { 2391 | "name": "symfony/console", 2392 | "version": "dev-master", 2393 | "source": { 2394 | "type": "git", 2395 | "url": "https://github.com/symfony/console.git", 2396 | "reference": "2e1940babbdc437add69a14225e30f25cfa0e9ca" 2397 | }, 2398 | "dist": { 2399 | "type": "zip", 2400 | "url": "https://api.github.com/repos/symfony/console/zipball/2e1940babbdc437add69a14225e30f25cfa0e9ca", 2401 | "reference": "2e1940babbdc437add69a14225e30f25cfa0e9ca", 2402 | "shasum": "" 2403 | }, 2404 | "require": { 2405 | "php": ">=7.2.5", 2406 | "symfony/polyfill-mbstring": "~1.0", 2407 | "symfony/polyfill-php73": "^1.8", 2408 | "symfony/polyfill-php80": "^1.15", 2409 | "symfony/service-contracts": "^1.1|^2", 2410 | "symfony/string": "^5.1" 2411 | }, 2412 | "conflict": { 2413 | "symfony/dependency-injection": "<4.4", 2414 | "symfony/dotenv": "<5.1", 2415 | "symfony/event-dispatcher": "<4.4", 2416 | "symfony/lock": "<4.4", 2417 | "symfony/process": "<4.4" 2418 | }, 2419 | "provide": { 2420 | "psr/log-implementation": "1.0" 2421 | }, 2422 | "require-dev": { 2423 | "psr/log": "~1.0", 2424 | "symfony/config": "^4.4|^5.0", 2425 | "symfony/dependency-injection": "^4.4|^5.0", 2426 | "symfony/event-dispatcher": "^4.4|^5.0", 2427 | "symfony/lock": "^4.4|^5.0", 2428 | "symfony/process": "^4.4|^5.0", 2429 | "symfony/var-dumper": "^4.4|^5.0" 2430 | }, 2431 | "suggest": { 2432 | "psr/log": "For using the console logger", 2433 | "symfony/event-dispatcher": "", 2434 | "symfony/lock": "", 2435 | "symfony/process": "" 2436 | }, 2437 | "type": "library", 2438 | "extra": { 2439 | "branch-alias": { 2440 | "dev-master": "5.2-dev" 2441 | } 2442 | }, 2443 | "autoload": { 2444 | "psr-4": { 2445 | "Symfony\\Component\\Console\\": "" 2446 | }, 2447 | "exclude-from-classmap": [ 2448 | "/Tests/" 2449 | ] 2450 | }, 2451 | "notification-url": "https://packagist.org/downloads/", 2452 | "license": [ 2453 | "MIT" 2454 | ], 2455 | "authors": [ 2456 | { 2457 | "name": "Fabien Potencier", 2458 | "email": "fabien@symfony.com" 2459 | }, 2460 | { 2461 | "name": "Symfony Community", 2462 | "homepage": "https://symfony.com/contributors" 2463 | } 2464 | ], 2465 | "description": "Symfony Console Component", 2466 | "homepage": "https://symfony.com", 2467 | "keywords": [ 2468 | "cli", 2469 | "command line", 2470 | "console", 2471 | "terminal" 2472 | ], 2473 | "funding": [ 2474 | { 2475 | "url": "https://symfony.com/sponsor", 2476 | "type": "custom" 2477 | }, 2478 | { 2479 | "url": "https://github.com/fabpot", 2480 | "type": "github" 2481 | }, 2482 | { 2483 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2484 | "type": "tidelift" 2485 | } 2486 | ], 2487 | "time": "2020-09-08T14:20:09+00:00" 2488 | }, 2489 | { 2490 | "name": "symfony/polyfill-ctype", 2491 | "version": "dev-master", 2492 | "source": { 2493 | "type": "git", 2494 | "url": "https://github.com/symfony/polyfill-ctype.git", 2495 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" 2496 | }, 2497 | "dist": { 2498 | "type": "zip", 2499 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", 2500 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", 2501 | "shasum": "" 2502 | }, 2503 | "require": { 2504 | "php": ">=5.3.3" 2505 | }, 2506 | "suggest": { 2507 | "ext-ctype": "For best performance" 2508 | }, 2509 | "type": "library", 2510 | "extra": { 2511 | "branch-alias": { 2512 | "dev-master": "1.18-dev" 2513 | }, 2514 | "thanks": { 2515 | "name": "symfony/polyfill", 2516 | "url": "https://github.com/symfony/polyfill" 2517 | } 2518 | }, 2519 | "autoload": { 2520 | "psr-4": { 2521 | "Symfony\\Polyfill\\Ctype\\": "" 2522 | }, 2523 | "files": [ 2524 | "bootstrap.php" 2525 | ] 2526 | }, 2527 | "notification-url": "https://packagist.org/downloads/", 2528 | "license": [ 2529 | "MIT" 2530 | ], 2531 | "authors": [ 2532 | { 2533 | "name": "Gert de Pagter", 2534 | "email": "BackEndTea@gmail.com" 2535 | }, 2536 | { 2537 | "name": "Symfony Community", 2538 | "homepage": "https://symfony.com/contributors" 2539 | } 2540 | ], 2541 | "description": "Symfony polyfill for ctype functions", 2542 | "homepage": "https://symfony.com", 2543 | "keywords": [ 2544 | "compatibility", 2545 | "ctype", 2546 | "polyfill", 2547 | "portable" 2548 | ], 2549 | "funding": [ 2550 | { 2551 | "url": "https://symfony.com/sponsor", 2552 | "type": "custom" 2553 | }, 2554 | { 2555 | "url": "https://github.com/fabpot", 2556 | "type": "github" 2557 | }, 2558 | { 2559 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2560 | "type": "tidelift" 2561 | } 2562 | ], 2563 | "time": "2020-07-14T12:35:20+00:00" 2564 | }, 2565 | { 2566 | "name": "symfony/polyfill-intl-grapheme", 2567 | "version": "dev-master", 2568 | "source": { 2569 | "type": "git", 2570 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 2571 | "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5" 2572 | }, 2573 | "dist": { 2574 | "type": "zip", 2575 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b740103edbdcc39602239ee8860f0f45a8eb9aa5", 2576 | "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5", 2577 | "shasum": "" 2578 | }, 2579 | "require": { 2580 | "php": ">=5.3.3" 2581 | }, 2582 | "suggest": { 2583 | "ext-intl": "For best performance" 2584 | }, 2585 | "type": "library", 2586 | "extra": { 2587 | "branch-alias": { 2588 | "dev-master": "1.18-dev" 2589 | }, 2590 | "thanks": { 2591 | "name": "symfony/polyfill", 2592 | "url": "https://github.com/symfony/polyfill" 2593 | } 2594 | }, 2595 | "autoload": { 2596 | "psr-4": { 2597 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 2598 | }, 2599 | "files": [ 2600 | "bootstrap.php" 2601 | ] 2602 | }, 2603 | "notification-url": "https://packagist.org/downloads/", 2604 | "license": [ 2605 | "MIT" 2606 | ], 2607 | "authors": [ 2608 | { 2609 | "name": "Nicolas Grekas", 2610 | "email": "p@tchwork.com" 2611 | }, 2612 | { 2613 | "name": "Symfony Community", 2614 | "homepage": "https://symfony.com/contributors" 2615 | } 2616 | ], 2617 | "description": "Symfony polyfill for intl's grapheme_* functions", 2618 | "homepage": "https://symfony.com", 2619 | "keywords": [ 2620 | "compatibility", 2621 | "grapheme", 2622 | "intl", 2623 | "polyfill", 2624 | "portable", 2625 | "shim" 2626 | ], 2627 | "funding": [ 2628 | { 2629 | "url": "https://symfony.com/sponsor", 2630 | "type": "custom" 2631 | }, 2632 | { 2633 | "url": "https://github.com/fabpot", 2634 | "type": "github" 2635 | }, 2636 | { 2637 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2638 | "type": "tidelift" 2639 | } 2640 | ], 2641 | "time": "2020-07-14T12:35:20+00:00" 2642 | }, 2643 | { 2644 | "name": "symfony/polyfill-intl-normalizer", 2645 | "version": "dev-master", 2646 | "source": { 2647 | "type": "git", 2648 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 2649 | "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" 2650 | }, 2651 | "dist": { 2652 | "type": "zip", 2653 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", 2654 | "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", 2655 | "shasum": "" 2656 | }, 2657 | "require": { 2658 | "php": ">=5.3.3" 2659 | }, 2660 | "suggest": { 2661 | "ext-intl": "For best performance" 2662 | }, 2663 | "type": "library", 2664 | "extra": { 2665 | "branch-alias": { 2666 | "dev-master": "1.18-dev" 2667 | }, 2668 | "thanks": { 2669 | "name": "symfony/polyfill", 2670 | "url": "https://github.com/symfony/polyfill" 2671 | } 2672 | }, 2673 | "autoload": { 2674 | "psr-4": { 2675 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 2676 | }, 2677 | "files": [ 2678 | "bootstrap.php" 2679 | ], 2680 | "classmap": [ 2681 | "Resources/stubs" 2682 | ] 2683 | }, 2684 | "notification-url": "https://packagist.org/downloads/", 2685 | "license": [ 2686 | "MIT" 2687 | ], 2688 | "authors": [ 2689 | { 2690 | "name": "Nicolas Grekas", 2691 | "email": "p@tchwork.com" 2692 | }, 2693 | { 2694 | "name": "Symfony Community", 2695 | "homepage": "https://symfony.com/contributors" 2696 | } 2697 | ], 2698 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 2699 | "homepage": "https://symfony.com", 2700 | "keywords": [ 2701 | "compatibility", 2702 | "intl", 2703 | "normalizer", 2704 | "polyfill", 2705 | "portable", 2706 | "shim" 2707 | ], 2708 | "funding": [ 2709 | { 2710 | "url": "https://symfony.com/sponsor", 2711 | "type": "custom" 2712 | }, 2713 | { 2714 | "url": "https://github.com/fabpot", 2715 | "type": "github" 2716 | }, 2717 | { 2718 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2719 | "type": "tidelift" 2720 | } 2721 | ], 2722 | "time": "2020-07-14T12:35:20+00:00" 2723 | }, 2724 | { 2725 | "name": "symfony/polyfill-mbstring", 2726 | "version": "dev-master", 2727 | "source": { 2728 | "type": "git", 2729 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2730 | "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" 2731 | }, 2732 | "dist": { 2733 | "type": "zip", 2734 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", 2735 | "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", 2736 | "shasum": "" 2737 | }, 2738 | "require": { 2739 | "php": ">=5.3.3" 2740 | }, 2741 | "suggest": { 2742 | "ext-mbstring": "For best performance" 2743 | }, 2744 | "type": "library", 2745 | "extra": { 2746 | "branch-alias": { 2747 | "dev-master": "1.18-dev" 2748 | }, 2749 | "thanks": { 2750 | "name": "symfony/polyfill", 2751 | "url": "https://github.com/symfony/polyfill" 2752 | } 2753 | }, 2754 | "autoload": { 2755 | "psr-4": { 2756 | "Symfony\\Polyfill\\Mbstring\\": "" 2757 | }, 2758 | "files": [ 2759 | "bootstrap.php" 2760 | ] 2761 | }, 2762 | "notification-url": "https://packagist.org/downloads/", 2763 | "license": [ 2764 | "MIT" 2765 | ], 2766 | "authors": [ 2767 | { 2768 | "name": "Nicolas Grekas", 2769 | "email": "p@tchwork.com" 2770 | }, 2771 | { 2772 | "name": "Symfony Community", 2773 | "homepage": "https://symfony.com/contributors" 2774 | } 2775 | ], 2776 | "description": "Symfony polyfill for the Mbstring extension", 2777 | "homepage": "https://symfony.com", 2778 | "keywords": [ 2779 | "compatibility", 2780 | "mbstring", 2781 | "polyfill", 2782 | "portable", 2783 | "shim" 2784 | ], 2785 | "funding": [ 2786 | { 2787 | "url": "https://symfony.com/sponsor", 2788 | "type": "custom" 2789 | }, 2790 | { 2791 | "url": "https://github.com/fabpot", 2792 | "type": "github" 2793 | }, 2794 | { 2795 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2796 | "type": "tidelift" 2797 | } 2798 | ], 2799 | "time": "2020-07-14T12:35:20+00:00" 2800 | }, 2801 | { 2802 | "name": "symfony/polyfill-php73", 2803 | "version": "dev-master", 2804 | "source": { 2805 | "type": "git", 2806 | "url": "https://github.com/symfony/polyfill-php73.git", 2807 | "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" 2808 | }, 2809 | "dist": { 2810 | "type": "zip", 2811 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", 2812 | "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", 2813 | "shasum": "" 2814 | }, 2815 | "require": { 2816 | "php": ">=5.3.3" 2817 | }, 2818 | "type": "library", 2819 | "extra": { 2820 | "branch-alias": { 2821 | "dev-master": "1.18-dev" 2822 | }, 2823 | "thanks": { 2824 | "name": "symfony/polyfill", 2825 | "url": "https://github.com/symfony/polyfill" 2826 | } 2827 | }, 2828 | "autoload": { 2829 | "psr-4": { 2830 | "Symfony\\Polyfill\\Php73\\": "" 2831 | }, 2832 | "files": [ 2833 | "bootstrap.php" 2834 | ], 2835 | "classmap": [ 2836 | "Resources/stubs" 2837 | ] 2838 | }, 2839 | "notification-url": "https://packagist.org/downloads/", 2840 | "license": [ 2841 | "MIT" 2842 | ], 2843 | "authors": [ 2844 | { 2845 | "name": "Nicolas Grekas", 2846 | "email": "p@tchwork.com" 2847 | }, 2848 | { 2849 | "name": "Symfony Community", 2850 | "homepage": "https://symfony.com/contributors" 2851 | } 2852 | ], 2853 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 2854 | "homepage": "https://symfony.com", 2855 | "keywords": [ 2856 | "compatibility", 2857 | "polyfill", 2858 | "portable", 2859 | "shim" 2860 | ], 2861 | "funding": [ 2862 | { 2863 | "url": "https://symfony.com/sponsor", 2864 | "type": "custom" 2865 | }, 2866 | { 2867 | "url": "https://github.com/fabpot", 2868 | "type": "github" 2869 | }, 2870 | { 2871 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2872 | "type": "tidelift" 2873 | } 2874 | ], 2875 | "time": "2020-07-14T12:35:20+00:00" 2876 | }, 2877 | { 2878 | "name": "symfony/polyfill-php80", 2879 | "version": "dev-master", 2880 | "source": { 2881 | "type": "git", 2882 | "url": "https://github.com/symfony/polyfill-php80.git", 2883 | "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" 2884 | }, 2885 | "dist": { 2886 | "type": "zip", 2887 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", 2888 | "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", 2889 | "shasum": "" 2890 | }, 2891 | "require": { 2892 | "php": ">=7.0.8" 2893 | }, 2894 | "type": "library", 2895 | "extra": { 2896 | "branch-alias": { 2897 | "dev-master": "1.18-dev" 2898 | }, 2899 | "thanks": { 2900 | "name": "symfony/polyfill", 2901 | "url": "https://github.com/symfony/polyfill" 2902 | } 2903 | }, 2904 | "autoload": { 2905 | "psr-4": { 2906 | "Symfony\\Polyfill\\Php80\\": "" 2907 | }, 2908 | "files": [ 2909 | "bootstrap.php" 2910 | ], 2911 | "classmap": [ 2912 | "Resources/stubs" 2913 | ] 2914 | }, 2915 | "notification-url": "https://packagist.org/downloads/", 2916 | "license": [ 2917 | "MIT" 2918 | ], 2919 | "authors": [ 2920 | { 2921 | "name": "Ion Bazan", 2922 | "email": "ion.bazan@gmail.com" 2923 | }, 2924 | { 2925 | "name": "Nicolas Grekas", 2926 | "email": "p@tchwork.com" 2927 | }, 2928 | { 2929 | "name": "Symfony Community", 2930 | "homepage": "https://symfony.com/contributors" 2931 | } 2932 | ], 2933 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 2934 | "homepage": "https://symfony.com", 2935 | "keywords": [ 2936 | "compatibility", 2937 | "polyfill", 2938 | "portable", 2939 | "shim" 2940 | ], 2941 | "funding": [ 2942 | { 2943 | "url": "https://symfony.com/sponsor", 2944 | "type": "custom" 2945 | }, 2946 | { 2947 | "url": "https://github.com/fabpot", 2948 | "type": "github" 2949 | }, 2950 | { 2951 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2952 | "type": "tidelift" 2953 | } 2954 | ], 2955 | "time": "2020-07-14T12:35:20+00:00" 2956 | }, 2957 | { 2958 | "name": "symfony/service-contracts", 2959 | "version": "dev-master", 2960 | "source": { 2961 | "type": "git", 2962 | "url": "https://github.com/symfony/service-contracts.git", 2963 | "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" 2964 | }, 2965 | "dist": { 2966 | "type": "zip", 2967 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", 2968 | "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", 2969 | "shasum": "" 2970 | }, 2971 | "require": { 2972 | "php": ">=7.2.5", 2973 | "psr/container": "^1.0" 2974 | }, 2975 | "suggest": { 2976 | "symfony/service-implementation": "" 2977 | }, 2978 | "type": "library", 2979 | "extra": { 2980 | "branch-alias": { 2981 | "dev-master": "2.2-dev" 2982 | }, 2983 | "thanks": { 2984 | "name": "symfony/contracts", 2985 | "url": "https://github.com/symfony/contracts" 2986 | } 2987 | }, 2988 | "autoload": { 2989 | "psr-4": { 2990 | "Symfony\\Contracts\\Service\\": "" 2991 | } 2992 | }, 2993 | "notification-url": "https://packagist.org/downloads/", 2994 | "license": [ 2995 | "MIT" 2996 | ], 2997 | "authors": [ 2998 | { 2999 | "name": "Nicolas Grekas", 3000 | "email": "p@tchwork.com" 3001 | }, 3002 | { 3003 | "name": "Symfony Community", 3004 | "homepage": "https://symfony.com/contributors" 3005 | } 3006 | ], 3007 | "description": "Generic abstractions related to writing services", 3008 | "homepage": "https://symfony.com", 3009 | "keywords": [ 3010 | "abstractions", 3011 | "contracts", 3012 | "decoupling", 3013 | "interfaces", 3014 | "interoperability", 3015 | "standards" 3016 | ], 3017 | "funding": [ 3018 | { 3019 | "url": "https://symfony.com/sponsor", 3020 | "type": "custom" 3021 | }, 3022 | { 3023 | "url": "https://github.com/fabpot", 3024 | "type": "github" 3025 | }, 3026 | { 3027 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3028 | "type": "tidelift" 3029 | } 3030 | ], 3031 | "time": "2020-09-07T11:33:47+00:00" 3032 | }, 3033 | { 3034 | "name": "symfony/string", 3035 | "version": "dev-master", 3036 | "source": { 3037 | "type": "git", 3038 | "url": "https://github.com/symfony/string.git", 3039 | "reference": "fa00ee8312a56d7deb933b013c52f25d36b1b5a1" 3040 | }, 3041 | "dist": { 3042 | "type": "zip", 3043 | "url": "https://api.github.com/repos/symfony/string/zipball/fa00ee8312a56d7deb933b013c52f25d36b1b5a1", 3044 | "reference": "fa00ee8312a56d7deb933b013c52f25d36b1b5a1", 3045 | "shasum": "" 3046 | }, 3047 | "require": { 3048 | "php": ">=7.2.5", 3049 | "symfony/polyfill-ctype": "~1.8", 3050 | "symfony/polyfill-intl-grapheme": "~1.0", 3051 | "symfony/polyfill-intl-normalizer": "~1.0", 3052 | "symfony/polyfill-mbstring": "~1.0", 3053 | "symfony/polyfill-php80": "~1.15" 3054 | }, 3055 | "require-dev": { 3056 | "symfony/error-handler": "^4.4|^5.0", 3057 | "symfony/http-client": "^4.4|^5.0", 3058 | "symfony/translation-contracts": "^1.1|^2", 3059 | "symfony/var-exporter": "^4.4|^5.0" 3060 | }, 3061 | "type": "library", 3062 | "extra": { 3063 | "branch-alias": { 3064 | "dev-master": "5.2-dev" 3065 | } 3066 | }, 3067 | "autoload": { 3068 | "psr-4": { 3069 | "Symfony\\Component\\String\\": "" 3070 | }, 3071 | "files": [ 3072 | "Resources/functions.php" 3073 | ], 3074 | "exclude-from-classmap": [ 3075 | "/Tests/" 3076 | ] 3077 | }, 3078 | "notification-url": "https://packagist.org/downloads/", 3079 | "license": [ 3080 | "MIT" 3081 | ], 3082 | "authors": [ 3083 | { 3084 | "name": "Nicolas Grekas", 3085 | "email": "p@tchwork.com" 3086 | }, 3087 | { 3088 | "name": "Symfony Community", 3089 | "homepage": "https://symfony.com/contributors" 3090 | } 3091 | ], 3092 | "description": "Symfony String component", 3093 | "homepage": "https://symfony.com", 3094 | "keywords": [ 3095 | "grapheme", 3096 | "i18n", 3097 | "string", 3098 | "unicode", 3099 | "utf-8", 3100 | "utf8" 3101 | ], 3102 | "funding": [ 3103 | { 3104 | "url": "https://symfony.com/sponsor", 3105 | "type": "custom" 3106 | }, 3107 | { 3108 | "url": "https://github.com/fabpot", 3109 | "type": "github" 3110 | }, 3111 | { 3112 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3113 | "type": "tidelift" 3114 | } 3115 | ], 3116 | "time": "2020-09-02T16:27:44+00:00" 3117 | }, 3118 | { 3119 | "name": "theseer/tokenizer", 3120 | "version": "1.2.0", 3121 | "source": { 3122 | "type": "git", 3123 | "url": "https://github.com/theseer/tokenizer.git", 3124 | "reference": "75a63c33a8577608444246075ea0af0d052e452a" 3125 | }, 3126 | "dist": { 3127 | "type": "zip", 3128 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", 3129 | "reference": "75a63c33a8577608444246075ea0af0d052e452a", 3130 | "shasum": "" 3131 | }, 3132 | "require": { 3133 | "ext-dom": "*", 3134 | "ext-tokenizer": "*", 3135 | "ext-xmlwriter": "*", 3136 | "php": "^7.2 || ^8.0" 3137 | }, 3138 | "type": "library", 3139 | "autoload": { 3140 | "classmap": [ 3141 | "src/" 3142 | ] 3143 | }, 3144 | "notification-url": "https://packagist.org/downloads/", 3145 | "license": [ 3146 | "BSD-3-Clause" 3147 | ], 3148 | "authors": [ 3149 | { 3150 | "name": "Arne Blankerts", 3151 | "email": "arne@blankerts.de", 3152 | "role": "Developer" 3153 | } 3154 | ], 3155 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3156 | "funding": [ 3157 | { 3158 | "url": "https://github.com/theseer", 3159 | "type": "github" 3160 | } 3161 | ], 3162 | "time": "2020-07-12T23:59:07+00:00" 3163 | }, 3164 | { 3165 | "name": "webmozart/assert", 3166 | "version": "1.9.1", 3167 | "source": { 3168 | "type": "git", 3169 | "url": "https://github.com/webmozart/assert.git", 3170 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" 3171 | }, 3172 | "dist": { 3173 | "type": "zip", 3174 | "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", 3175 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", 3176 | "shasum": "" 3177 | }, 3178 | "require": { 3179 | "php": "^5.3.3 || ^7.0 || ^8.0", 3180 | "symfony/polyfill-ctype": "^1.8" 3181 | }, 3182 | "conflict": { 3183 | "phpstan/phpstan": "<0.12.20", 3184 | "vimeo/psalm": "<3.9.1" 3185 | }, 3186 | "require-dev": { 3187 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 3188 | }, 3189 | "type": "library", 3190 | "autoload": { 3191 | "psr-4": { 3192 | "Webmozart\\Assert\\": "src/" 3193 | } 3194 | }, 3195 | "notification-url": "https://packagist.org/downloads/", 3196 | "license": [ 3197 | "MIT" 3198 | ], 3199 | "authors": [ 3200 | { 3201 | "name": "Bernhard Schussek", 3202 | "email": "bschussek@gmail.com" 3203 | } 3204 | ], 3205 | "description": "Assertions to validate method input/output with nice error messages.", 3206 | "keywords": [ 3207 | "assert", 3208 | "check", 3209 | "validate" 3210 | ], 3211 | "time": "2020-07-08T17:02:28+00:00" 3212 | } 3213 | ], 3214 | "aliases": [], 3215 | "minimum-stability": "dev", 3216 | "stability-flags": { 3217 | "pestphp/pest": 20 3218 | }, 3219 | "prefer-stable": false, 3220 | "prefer-lowest": false, 3221 | "platform": { 3222 | "php": ">=7.4" 3223 | }, 3224 | "platform-dev": [], 3225 | "plugin-api-version": "1.1.0" 3226 | } 3227 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | src/ 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | tests 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/ContainerMetrics.php: -------------------------------------------------------------------------------- 1 | metrics = $container_stats; 17 | } 18 | 19 | /** 20 | * Returns the available memory. 21 | * 22 | * @return int 23 | */ 24 | private function getMemoryAvailable(): int 25 | { 26 | return property_exists($this->metrics->memory_stats, 'limit') 27 | ? $this->metrics->memory_stats->limit 28 | : 0; 29 | } 30 | 31 | /** 32 | * Returns the free memory available. 33 | * 34 | * @return int 35 | */ 36 | private function getMemoryFree(): int 37 | { 38 | return self::getMemoryAvailable() - self::getMemoryUsed(); 39 | } 40 | 41 | /** 42 | * Returns the used memory. 43 | * 44 | * @return int 45 | */ 46 | private function getMemoryUsed(): int 47 | { 48 | $usage = property_exists($this->metrics->memory_stats, 'usage') 49 | ? $this->metrics->memory_stats->usage 50 | : 0; 51 | 52 | $cache = property_exists($this->metrics->memory_stats, 'stats') 53 | ? $this->metrics->memory_stats->stats->cache 54 | : 0; 55 | 56 | return $usage - $cache; 57 | } 58 | 59 | /** 60 | * Returns the percent memory available. 61 | * 62 | * @return float 63 | */ 64 | private function getMemoryPercentFree(): float 65 | { 66 | return 100 - self::getMemoryPercentUsage(); 67 | } 68 | 69 | /** 70 | * Returns the percent Memory used by the container. 71 | * 72 | * @return float 73 | */ 74 | private function getMemoryPercentUsage(): float 75 | { 76 | if (self::getMemoryUsed() == 0 || self::getMemoryAvailable() == 0) { 77 | return 0; 78 | } 79 | 80 | return (self::getMemoryUsed() / self::getMemoryAvailable()) * 100.0; 81 | } 82 | 83 | private function getSystemCpuDelta(): float 84 | { 85 | $system_cpu_usage = property_exists($this->metrics->cpu_stats, 'system_cpu_usage') 86 | ? $this->metrics->cpu_stats->system_cpu_usage 87 | : 0; 88 | 89 | $precpu_system_cpu_usage = property_exists($this->metrics->precpu_stats, 'system_cpu_usage') 90 | ? $this->metrics->precpu_stats->system_cpu_usage 91 | : 0; 92 | 93 | return $system_cpu_usage - $precpu_system_cpu_usage; 94 | } 95 | 96 | /** 97 | * Return the number of cpus. 98 | * 99 | * @return int 100 | */ 101 | private function getOnlineCpus(): int 102 | { 103 | return property_exists($this->metrics->cpu_stats, 'online_cpus') 104 | ? $this->metrics->cpu_stats->online_cpus 105 | : 0; 106 | } 107 | 108 | /** 109 | * @return float 110 | */ 111 | private function getCpuDelta(): float 112 | { 113 | $cpu_total_usage = $this->metrics->cpu_stats->cpu_usage->total_usage; 114 | $precpu_total_usage = $this->metrics->precpu_stats->cpu_usage->total_usage; 115 | 116 | return $cpu_total_usage - $precpu_total_usage; 117 | } 118 | 119 | /** 120 | * Returns the CPU percent free. 121 | * 122 | * @return float 123 | */ 124 | private function getCpuPercentFree(): float 125 | { 126 | return 100 - self::getCpuPercentUsage(); 127 | } 128 | 129 | /** 130 | * Returns the percent CPU used by the container. 131 | * 132 | * @return float 133 | */ 134 | private function getCpuPercentUsage(): float 135 | { 136 | if (self::getCpuDelta() === 0 || self::getSystemCpuDelta() === 0) { 137 | return 0; 138 | } 139 | 140 | return (self::getCpuDelta() / self::getSystemCpuDelta()) * self::getOnlineCpus() * 100.0; 141 | } 142 | 143 | /** 144 | * Returns an object with the basic metrics information. 145 | * 146 | * @return object 147 | */ 148 | public function metrics(): object 149 | { 150 | if ($this->metrics->read === '0001-01-01T00:00:00Z') { 151 | return (object) []; 152 | } 153 | 154 | return (object) [ 155 | 'timestamp' => $this->metrics->read, 156 | 'id' => $this->metrics->id, 157 | 'name' => $this->metrics->name, 158 | 'cpu' => (object) [ 159 | 'count' => self::getOnlineCpus(), 160 | 'percent_free' => self::getCpuPercentFree(), 161 | 'percent_used' => self::getCpuPercentUsage(), 162 | ], 163 | 'memory' => (object) [ 164 | 'free' => self::getMemoryFree(), 165 | 'used' => self::getMemoryUsed(), 166 | 'total' => self::getMemoryAvailable(), 167 | 'percent_free' => self::getMemoryPercentFree(), 168 | 'percent_used' => self::getMemoryPercentUsage(), 169 | ], 170 | 'network' => [ 171 | property_exists($this->metrics, 'networks') 172 | ? $this->metrics->networks 173 | : [], 174 | ], 175 | ]; 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /src/DockerApiRequest.php: -------------------------------------------------------------------------------- 1 | fields = []; 32 | $this->server = $server; 33 | } 34 | 35 | /** 36 | * Set the resource to query. 37 | * 38 | * @param string $method 39 | * @param string $id 40 | * 41 | * @throws ContainerNotDefinedException|MethodNotDefinedException 42 | * 43 | * @return DockerApiRequest 44 | */ 45 | public function containers( 46 | string $method = ResourceMethods::CONTAINERS_LIST, 47 | string $id = '' 48 | ): DockerApiRequest { 49 | switch ($method) { 50 | case ResourceMethods::CONTAINERS_INSPECT: 51 | $this->resource = (new Containers($this->server))->inspect($id); 52 | break; 53 | case ResourceMethods::CONTAINERS_LIST: 54 | $this->resource = (new Containers($this->server))->list(); 55 | break; 56 | case ResourceMethods::CONTAINERS_STATS: 57 | $this->resource = (new Containers($this->server))->stats($id); 58 | break; 59 | default: 60 | throw new MethodNotDefinedException(); 61 | } 62 | 63 | return $this; 64 | } 65 | 66 | /** 67 | * Set the resource to query. 68 | * 69 | * @param string $method 70 | * @param string $id 71 | * 72 | * @throws ImageNotDefinedException|MethodNotDefinedException 73 | * 74 | * @return DockerApiRequest 75 | */ 76 | public function images( 77 | string $method = ResourceMethods::IMAGES_LIST, 78 | string $id = '' 79 | ): DockerApiRequest { 80 | switch ($method) { 81 | case ResourceMethods::IMAGES_INSPECT: 82 | $this->resource = (new Images($this->server))->inspect($id); 83 | break; 84 | case ResourceMethods::IMAGES_LIST: 85 | $this->resource = (new Images($this->server))->list(); 86 | break; 87 | default: 88 | throw new MethodNotDefinedException(); 89 | } 90 | 91 | return $this; 92 | } 93 | 94 | /** 95 | * Set the resource to query. 96 | * 97 | * @param string $method 98 | * @param string $id 99 | * 100 | * @throws NetworkNotDefinedException|MethodNotDefinedException 101 | * 102 | * @return DockerApiRequest 103 | */ 104 | public function networks( 105 | string $method = ResourceMethods::NETWORKS_LIST, 106 | string $id = '' 107 | ): DockerApiRequest { 108 | switch ($method) { 109 | case ResourceMethods::NETWORKS_INSPECT: 110 | $this->resource = (new Networks($this->server))->inspect($id); 111 | break; 112 | case ResourceMethods::NETWORKS_LIST: 113 | $this->resource = (new Networks($this->server))->list(); 114 | break; 115 | default: 116 | throw new MethodNotDefinedException(); 117 | } 118 | 119 | return $this; 120 | } 121 | 122 | /** 123 | * Set the resource to query. 124 | * 125 | * @param string $method 126 | * 127 | * @throws MethodNotDefinedException 128 | * 129 | * @return $this 130 | */ 131 | public function system(string $method = ResourceMethods::SYSTEM_VERSION) 132 | { 133 | switch ($method) { 134 | case ResourceMethods::SYSTEM_DATA_USAGE: 135 | $this->resource = (new System($this->server))->data_usage(); 136 | break; 137 | case ResourceMethods::SYSTEM_INFO: 138 | $this->resource = (new System($this->server))->info(); 139 | break; 140 | case ResourceMethods::SYSTEM_PING: 141 | $this->resource = (new System($this->server))->ping(); 142 | break; 143 | case ResourceMethods::SYSTEM_VERSION: 144 | $this->resource = (new System($this->server))->version(); 145 | break; 146 | default: 147 | throw new MethodNotDefinedException(); 148 | } 149 | 150 | return $this; 151 | } 152 | 153 | /** 154 | * Set the resource to query. 155 | * 156 | * @param string $method 157 | * @param string $id 158 | * 159 | * @throws VolumeNotDefinedException|MethodNotDefinedException 160 | * 161 | * @return DockerApiRequest 162 | */ 163 | public function volumes( 164 | string $method = ResourceMethods::VOLUMES_LIST, 165 | string $id = '' 166 | ): DockerApiRequest { 167 | switch ($method) { 168 | case ResourceMethods::VOLUMES_INSPECT: 169 | $this->resource = (new Volumes($this->server))->inspect($id); 170 | break; 171 | case ResourceMethods::VOLUMES_LIST: 172 | $this->resource = (new Volumes($this->server))->list(); 173 | break; 174 | default: 175 | throw new MethodNotDefinedException(); 176 | } 177 | 178 | return $this; 179 | } 180 | 181 | /** 182 | * Set the fields of results that must be returned. 183 | * 184 | * @param array $fields 185 | * 186 | * @return $this 187 | */ 188 | public function fields(array $fields): DockerApiRequest 189 | { 190 | $this->fields = $fields; 191 | 192 | return $this; 193 | } 194 | 195 | /** 196 | * Filters the results with the specified fields in $fields property. 197 | * 198 | * @param array $api_data 199 | * 200 | * @return array 201 | */ 202 | private function filter(array $api_data): array 203 | { 204 | $keys = $this->fields; 205 | 206 | array_walk($api_data, function (&$value) use ($keys) { 207 | $value = array_change_key_case( 208 | array_intersect_key($value, array_flip((array) $keys)), 209 | CASE_LOWER 210 | ); 211 | }); 212 | 213 | return $api_data; 214 | } 215 | 216 | /** 217 | * Check if the Docker API is enabled. 218 | * 219 | * @return bool 220 | */ 221 | private function checkConnectivity(): bool 222 | { 223 | return 'OK' === file_get_contents((new System($this->server))->ping()); 224 | } 225 | 226 | /** 227 | * Convert an array to an object. 228 | * 229 | * @param array $array 230 | * 231 | * @return object 232 | */ 233 | private function toObject(array $array): object 234 | { 235 | return json_decode(json_encode($array, JSON_FORCE_OBJECT)); 236 | } 237 | 238 | /** 239 | * Get specified resource from the Docker API. 240 | * 241 | * @throws DockerApiUnreachableException 242 | * 243 | * @return object 244 | */ 245 | public function get(): object 246 | { 247 | if (!$this->checkConnectivity()) { 248 | throw new DockerApiUnreachableException(); 249 | } 250 | 251 | $docker_response = json_decode( 252 | file_get_contents($this->resource), 253 | true 254 | ); 255 | 256 | if (count($this->fields)) { 257 | $docker_response = $this->filter($docker_response); 258 | } 259 | 260 | return self::toObject($docker_response); 261 | } 262 | } 263 | -------------------------------------------------------------------------------- /src/DockerEngineApiPollerServiceProvider.php: -------------------------------------------------------------------------------- 1 | protocol = 'http'; 17 | $this->server = '127.0.0.1'; 18 | $this->port = 2375; 19 | } 20 | 21 | /** 22 | * Set HTTP as protocol. 23 | * 24 | * @return DockerServer 25 | */ 26 | public function insecure(): DockerServer 27 | { 28 | $this->protocol = 'http'; 29 | 30 | return $this; 31 | } 32 | 33 | /** 34 | * Set HTTPS as protocol. 35 | * 36 | * @return DockerServer 37 | */ 38 | public function secure(): DockerServer 39 | { 40 | $this->protocol = 'https'; 41 | 42 | return $this; 43 | } 44 | 45 | /** 46 | * Set server to query. 47 | * 48 | * @param string $server 49 | * 50 | * @return DockerServer 51 | */ 52 | public function server(string $server): DockerServer 53 | { 54 | $this->server = $server; 55 | 56 | return $this; 57 | } 58 | 59 | /** 60 | * Set port where API listen for queries. 61 | * 62 | * @param int $port 63 | * 64 | * @return DockerServer 65 | */ 66 | public function port(int $port): DockerServer 67 | { 68 | $this->port = $port; 69 | 70 | return $this; 71 | } 72 | 73 | /** 74 | * Returns the server address. 75 | * 76 | * @return string 77 | */ 78 | public function getServer(): string 79 | { 80 | return $this->server; 81 | } 82 | 83 | /** 84 | * Returns the server port. 85 | * 86 | * @return string 87 | */ 88 | public function getPort(): int 89 | { 90 | return $this->port; 91 | } 92 | 93 | /** 94 | * Returns the server protocol. 95 | * 96 | * @return string 97 | */ 98 | public function getProtocol(): string 99 | { 100 | return $this->protocol; 101 | } 102 | 103 | /** 104 | * Returns the server URL. 105 | * 106 | * @return string 107 | */ 108 | public function getUrl(): string 109 | { 110 | return "{$this->protocol}://{$this->server}:{$this->port}"; 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/Enums/ResourceMethods.php: -------------------------------------------------------------------------------- 1 | server = $server; 23 | } 24 | 25 | /** 26 | * Returns a list of containers. 27 | * 28 | * @param bool $all 29 | * 30 | * @return string 31 | */ 32 | public function list(bool $all = false): string 33 | { 34 | if ($all) { 35 | return $this->server->getUrl().self::PATH.'/json?all=true'; 36 | } 37 | 38 | return $this->server->getUrl().self::PATH.'/json'; 39 | } 40 | 41 | /** 42 | * Return low-level information about a container. 43 | * 44 | * @param string|null $id 45 | * 46 | * @throws ContainerNotDefinedException 47 | * 48 | * @return string 49 | */ 50 | public function inspect(string $id = ''): string 51 | { 52 | if ($id === '') { 53 | throw new ContainerNotDefinedException(); 54 | } 55 | 56 | return $this->server->getUrl().self::PATH."/{$id}/json"; 57 | } 58 | 59 | /** 60 | * Get container stats based on resource usage. 61 | * 62 | * @param string $id 63 | * 64 | * @throws ContainerNotDefinedException 65 | * 66 | * @return string 67 | */ 68 | public function stats(string $id = ''): string 69 | { 70 | if ($id === '') { 71 | throw new ContainerNotDefinedException(); 72 | } 73 | 74 | return $this->server->getUrl().self::PATH."/{$id}/stats?stream=false"; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/Resources/Images.php: -------------------------------------------------------------------------------- 1 | server = $server; 23 | } 24 | 25 | /** 26 | * Returns a list of images on the server. 27 | * 28 | * @return string 29 | */ 30 | public function list(): string 31 | { 32 | return $this->server->getUrl().self::PATH.'/json'; 33 | } 34 | 35 | /** 36 | * Return low-level information about an image. 37 | * 38 | * @param string $id 39 | * 40 | * @throws ImageNotDefinedException 41 | * 42 | * @return string 43 | */ 44 | public function inspect(string $id = ''): string 45 | { 46 | if ($id === '') { 47 | throw new ImageNotDefinedException(); 48 | } 49 | 50 | return $this->server->getUrl().self::PATH."/{$id}/json"; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/Resources/Networks.php: -------------------------------------------------------------------------------- 1 | server = $server; 23 | } 24 | 25 | /** 26 | * Returns a list of networks. 27 | * 28 | * @return string 29 | */ 30 | public function list(): string 31 | { 32 | return $this->server->getUrl().self::PATH; 33 | } 34 | 35 | /** 36 | * Return low-level information about a network. 37 | * 38 | * @param string|null $id 39 | * 40 | * @throws NetworkNotDefinedException 41 | * 42 | * @return string 43 | */ 44 | public function inspect(?string $id = null): string 45 | { 46 | if (null === $id) { 47 | throw new NetworkNotDefinedException(); 48 | } 49 | 50 | return $this->server->getUrl().self::PATH."/{$id}"; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/Resources/System.php: -------------------------------------------------------------------------------- 1 | server = $server; 19 | } 20 | 21 | /** 22 | * Get data usage information. 23 | * 24 | * @return string 25 | */ 26 | public function data_usage(): string 27 | { 28 | return $this->server->getUrl().'/system/df'; 29 | } 30 | 31 | /** 32 | * Returns Docker system information. 33 | * 34 | * @return string 35 | */ 36 | public function info(): string 37 | { 38 | return $this->server->getUrl().'/info'; 39 | } 40 | 41 | /** 42 | * This is a dummy endpoint you can use to test if the server is accessible. 43 | * 44 | * @return string 45 | */ 46 | public function ping(): string 47 | { 48 | return $this->server->getUrl().'/_ping'; 49 | } 50 | 51 | /** 52 | * Returns the version of Docker that is running and various information 53 | * about the system that Docker is running on. 54 | * 55 | * @return string 56 | */ 57 | public function version(): string 58 | { 59 | return $this->server->getUrl().'/version'; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/Resources/Volumes.php: -------------------------------------------------------------------------------- 1 | server = $server; 23 | } 24 | 25 | /** 26 | * Returns a list of volumes. 27 | * 28 | * @return string 29 | */ 30 | public function list(): string 31 | { 32 | return $this->server->getUrl().self::PATH; 33 | } 34 | 35 | /** 36 | * Return low-level information about a network. 37 | * 38 | * @param string $id 39 | * 40 | * @throws VolumeNotDefinedException 41 | * 42 | * @return string 43 | */ 44 | public function inspect(string $id = ''): string 45 | { 46 | if ($id === '') { 47 | throw new VolumeNotDefinedException(); 48 | } 49 | 50 | return $this->server->getUrl().self::PATH."/{$id}"; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /tests/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angelcamposm/docker-engine-api-poller/05882359c800561fce08c226ea8088ceee1c9735/tests/.gitkeep -------------------------------------------------------------------------------- /tests/DockerServerTest.php: -------------------------------------------------------------------------------- 1 | server = (new DockerServer())->insecure() 22 | ->server(self::DOCKER_ADDRESS) 23 | ->port(self::DOCKER_PORT); 24 | } 25 | 26 | /** 27 | * @test 28 | */ 29 | public function canChangeTheProtocol() 30 | { 31 | $server = $this->server; 32 | 33 | $this->assertNotEquals( 34 | $server->secure()->getProtocol(), 35 | self::DOCKER_PROTOCOL 36 | ); 37 | } 38 | 39 | /** 40 | * @test 41 | */ 42 | public function canChangeTheAddress() 43 | { 44 | $server = $this->server; 45 | 46 | $this->assertNotEquals( 47 | $server->server(self::DOCKER_CUSTOM_ADDRESS)->getServer(), 48 | self::DOCKER_ADDRESS 49 | ); 50 | } 51 | 52 | /** 53 | * @test 54 | */ 55 | public function canChangeThePort() 56 | { 57 | $server = $this->server; 58 | 59 | $this->assertNotEquals( 60 | $server->port(self::DOCKER_CUSTOM_PORT)->getPort(), 61 | self::DOCKER_PORT 62 | ); 63 | } 64 | 65 | /** 66 | * @test 67 | */ 68 | public function canReturnAnUrl() 69 | { 70 | $url = self::DOCKER_PROTOCOL.'://'.self::DOCKER_ADDRESS.':'.self::DOCKER_PORT; 71 | 72 | $this->assertTrue($url === $this->server->getUrl()); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | set('ping', [ 25 | // 'count' => 5, 26 | //]); 27 | } 28 | } 29 | --------------------------------------------------------------------------------