├── .gitignore ├── .travis.yml ├── phpunit.xml.dist ├── src └── Satisfaction │ ├── Tests │ ├── Fixtures │ │ ├── TrueSpecification.php │ │ └── FalseSpecification.php │ └── SpecificationTest.php │ ├── NotSpecification.php │ ├── CompositeSpecification.php │ ├── OrSpecification.php │ ├── AndSpecification.php │ └── SpecificationInterface.php ├── composer.json ├── LICENSE ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | vendor 2 | phpunit.xml 3 | /.phpunit.result.cache 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 7.2 5 | - 7.3 6 | - 7.4 7 | 8 | before_script: composer install --dev 9 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | ./src/Satisfaction/Tests 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/Satisfaction/Tests/Fixtures/TrueSpecification.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Satisfaction\Tests\Fixtures; 13 | 14 | use Satisfaction\CompositeSpecification; 15 | 16 | /** 17 | * True specification 18 | */ 19 | class TrueSpecification extends CompositeSpecification 20 | { 21 | /** 22 | * {@inheritdoc} 23 | */ 24 | public function isSatisfiedBy($object) 25 | { 26 | return true; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Satisfaction/Tests/Fixtures/FalseSpecification.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Satisfaction\Tests\Fixtures; 13 | 14 | use Satisfaction\CompositeSpecification; 15 | 16 | /** 17 | * False specification 18 | */ 19 | class FalseSpecification extends CompositeSpecification 20 | { 21 | /** 22 | * {@inheritdoc} 23 | */ 24 | public function isSatisfiedBy($object) 25 | { 26 | return false; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "maximecolin/satisfaction", 3 | "type": "library", 4 | "version": "2.0.0", 5 | "description": "A PHP implementation of the specification pattern for DDD", 6 | "keywords": ["ddd", "specification", "pattern"], 7 | "homepage": "http://www.maximecolin.fr", 8 | "license": "MIT", 9 | "authors": [ 10 | { 11 | "name": "Maxime Colin", 12 | "email": "contact@maximecolin.fr" 13 | } 14 | ], 15 | "require": { 16 | "php": ">=7.2.0" 17 | }, 18 | "require-dev": { 19 | "phpunit/phpunit": "^8.3" 20 | }, 21 | "autoload": { 22 | "psr-0": { "Satisfaction": "src/" } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Satisfaction/NotSpecification.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Satisfaction; 13 | 14 | /** 15 | * Not specification 16 | */ 17 | class NotSpecification extends CompositeSpecification 18 | { 19 | /** 20 | * @var \Satisfaction\SpecificationInterface 21 | */ 22 | private $specification; 23 | 24 | /** 25 | * Constructor 26 | * 27 | * @param \Satisfaction\SpecificationInterface $specification 28 | */ 29 | public function __construct(SpecificationInterface $specification) 30 | { 31 | $this->specification = $specification; 32 | } 33 | 34 | /** 35 | * {@inheritdoc} 36 | */ 37 | public function isSatisfiedBy($object) 38 | { 39 | return !$this->specification->isSatisfiedBy($object); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Satisfaction/CompositeSpecification.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Satisfaction; 13 | 14 | /** 15 | * Composite specification 16 | */ 17 | abstract class CompositeSpecification implements SpecificationInterface 18 | { 19 | /** 20 | * {@inheritdoc} 21 | */ 22 | public function andX(SpecificationInterface $specification) 23 | { 24 | return new AndSpecification($this, $specification); 25 | } 26 | 27 | /** 28 | * {@inheritdoc} 29 | */ 30 | public function orX(SpecificationInterface $specification) 31 | { 32 | return new OrSpecification($this, $specification); 33 | } 34 | 35 | /** 36 | * {@inheritdoc} 37 | */ 38 | public function not() 39 | { 40 | return new NotSpecification($this); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Maxime Colin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /src/Satisfaction/OrSpecification.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Satisfaction; 13 | 14 | /** 15 | * Or specification 16 | */ 17 | class OrSpecification extends CompositeSpecification 18 | { 19 | /** 20 | * @var \Satisfaction\SpecificationInterface One specification 21 | */ 22 | private $one; 23 | 24 | /** 25 | * @var \Satisfaction\SpecificationInterface Other specification 26 | */ 27 | private $other; 28 | 29 | /** 30 | * Constructor 31 | * 32 | * @param \Satisfaction\SpecificationInterface $one 33 | * @param \Satisfaction\SpecificationInterface $other 34 | */ 35 | public function __construct(SpecificationInterface $one, SpecificationInterface $other) 36 | { 37 | $this->one = $one; 38 | $this->other = $other; 39 | } 40 | 41 | /** 42 | * {@inheritdoc} 43 | */ 44 | public function isSatisfiedBy($object) 45 | { 46 | return $this->one->isSatisfiedBy($object) || $this->other->isSatisfiedBy($object); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/Satisfaction/AndSpecification.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Satisfaction; 13 | 14 | /** 15 | * And specification 16 | */ 17 | class AndSpecification extends CompositeSpecification 18 | { 19 | /** 20 | * @var \Satisfaction\SpecificationInterface One specification 21 | */ 22 | private $one; 23 | 24 | /** 25 | * @var \Satisfaction\SpecificationInterface Other specification 26 | */ 27 | private $other; 28 | 29 | /** 30 | * Constructor 31 | * 32 | * @param \Satisfaction\SpecificationInterface $one 33 | * @param \Satisfaction\SpecificationInterface $other 34 | */ 35 | public function __construct(SpecificationInterface $one, SpecificationInterface $other) 36 | { 37 | $this->one = $one; 38 | $this->other = $other; 39 | } 40 | 41 | /** 42 | * {@inheritdoc} 43 | */ 44 | public function isSatisfiedBy($object) 45 | { 46 | return $this->one->isSatisfiedBy($object) && $this->other->isSatisfiedBy($object); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/Satisfaction/SpecificationInterface.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Satisfaction; 13 | 14 | /** 15 | * Specification interface 16 | */ 17 | interface SpecificationInterface 18 | { 19 | /** 20 | * Process specification satisfaction 21 | * 22 | * @param object $object 23 | * @return boolean 24 | */ 25 | public function isSatisfiedBy($object); 26 | 27 | /** 28 | * And 29 | * 30 | * @param \Satisfaction\SpecificationInterface $specification 31 | * @return \Satisfaction\SpecificationInterface 32 | */ 33 | public function andX(SpecificationInterface $specification); 34 | 35 | /** 36 | * Or 37 | * 38 | * @param \Satisfaction\SpecificationInterface $specification 39 | * @return \Satisfaction\SpecificationInterface 40 | */ 41 | public function orX(SpecificationInterface $specification); 42 | 43 | /** 44 | * Not 45 | * 46 | * @param \Satisfaction\SpecificationInterface $specification 47 | * @return \Satisfaction\SpecificationInterface 48 | */ 49 | public function not(); 50 | } 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Satisfaction 2 | 3 | Satisfaction is a PHP implementation of the Specification pattern for DDD. 4 | 5 | [![Build Status](https://travis-ci.org/maximecolin/satisfaction.svg)](https://travis-ci.org/maximecolin/satisfaction) 6 | 7 | ## Purpose 8 | 9 | The aim of the specification pattern is to write domain specifications in reusable classes instead of dispatching domain rules conditons in all your project. 10 | 11 | ## Installation 12 | 13 | ``` 14 | composer require maximecolin/satisfaction 15 | ``` 16 | 17 | ## Usage 18 | 19 | ### Simple example 20 | 21 | My model : 22 | 23 | ```php 24 | class Article 25 | { 26 | public $published = false; 27 | public $publishedAt; 28 | } 29 | ``` 30 | 31 | My specification : 32 | 33 | ```php 34 | use Satisfaction\CompositeSpecification; 35 | 36 | class PublishedArticle extends CompositeSpecification 37 | { 38 | public function isSatisfiedBy($article) 39 | { 40 | return $article->published === true && $article->publishedAt <= new \DateTime(); 41 | } 42 | } 43 | ``` 44 | 45 | I want to know if an article is published : 46 | 47 | ```php 48 | $specicification = new PublishedArticle(); 49 | 50 | if ($specification->isSatisfiedBy($article)) { 51 | // Do something 52 | } 53 | ``` 54 | 55 | ### Or, And, Not 56 | 57 | You can chain specifications with "or", "and" or "not" condition. 58 | 59 | ```php 60 | // If both foo and bar are satified 61 | if ((new FooSpecification())->andX(new BarSpecification())->isSatifiedBy($object)) { 62 | // Do something 63 | } 64 | ``` 65 | 66 | ```php 67 | // If foo is satisfied or bar is not 68 | if ((new FooSpecification())->orX((new BarSpecification())->not())->isSatifiedBy($object)) { 69 | // Do something 70 | } 71 | ``` 72 | 73 | ## Author 74 | 75 | Maxime Colin 76 | 77 | ## Licence 78 | 79 | See the LICENCE file. 80 | 81 | ## Acknowledgements 82 | 83 | Thanks to Jean-François Lépine for his talk about DDD. 84 | -------------------------------------------------------------------------------- /src/Satisfaction/Tests/SpecificationTest.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Satisfaction\Tests; 13 | 14 | use PHPUnit\Framework\TestCase; 15 | use Satisfaction\Tests\Fixtures\TrueSpecification; 16 | use Satisfaction\Tests\Fixtures\FalseSpecification; 17 | 18 | /** 19 | * Specification test 20 | */ 21 | class SpecificationTest extends TestCase 22 | { 23 | /** 24 | * Data provider 25 | * 26 | * @return array 27 | */ 28 | public static function provider() 29 | { 30 | $true = new TrueSpecification(); 31 | $false = new FalseSpecification(); 32 | 33 | return array( 34 | array($true, true), 35 | array($false, false), 36 | array($true->not(), false), 37 | array($false->not(), true), 38 | array($true->orX($true), true), 39 | array($true->orX($false), true), 40 | array($false->orX($true), true), 41 | array($false->orX($false), false), 42 | array($true->andX($true), true), 43 | array($true->andX($false), false), 44 | array($false->andX($true), false), 45 | array($false->andX($false), false), 46 | array($false->orX($false->not()), true), 47 | array($false->orX($true->andX($true)), true), 48 | array($false->orX($false->andX($true)), false), 49 | array($true->andX($false->orX($true)), true) 50 | ); 51 | } 52 | 53 | /** 54 | * Test isStatifiedBy method 55 | * 56 | * @dataProvider provider 57 | */ 58 | public function testIsStatifiedBy($specification, $expected) 59 | { 60 | $object = new \stdClass(); 61 | 62 | $this->assertEquals($expected, $specification->isSatisfiedBy($object)); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /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": "af688d12785c0b59723aff0f127f99a9", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/instantiator", 12 | "version": "1.3.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/instantiator.git", 16 | "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", 21 | "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^7.1" 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.2.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 | "time": "2019-10-21T16:45:58+00:00" 65 | }, 66 | { 67 | "name": "myclabs/deep-copy", 68 | "version": "1.9.5", 69 | "source": { 70 | "type": "git", 71 | "url": "https://github.com/myclabs/DeepCopy.git", 72 | "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" 73 | }, 74 | "dist": { 75 | "type": "zip", 76 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", 77 | "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", 78 | "shasum": "" 79 | }, 80 | "require": { 81 | "php": "^7.1" 82 | }, 83 | "replace": { 84 | "myclabs/deep-copy": "self.version" 85 | }, 86 | "require-dev": { 87 | "doctrine/collections": "^1.0", 88 | "doctrine/common": "^2.6", 89 | "phpunit/phpunit": "^7.1" 90 | }, 91 | "type": "library", 92 | "autoload": { 93 | "psr-4": { 94 | "DeepCopy\\": "src/DeepCopy/" 95 | }, 96 | "files": [ 97 | "src/DeepCopy/deep_copy.php" 98 | ] 99 | }, 100 | "notification-url": "https://packagist.org/downloads/", 101 | "license": [ 102 | "MIT" 103 | ], 104 | "description": "Create deep copies (clones) of your objects", 105 | "keywords": [ 106 | "clone", 107 | "copy", 108 | "duplicate", 109 | "object", 110 | "object graph" 111 | ], 112 | "time": "2020-01-17T21:11:47+00:00" 113 | }, 114 | { 115 | "name": "phar-io/manifest", 116 | "version": "1.0.3", 117 | "source": { 118 | "type": "git", 119 | "url": "https://github.com/phar-io/manifest.git", 120 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 121 | }, 122 | "dist": { 123 | "type": "zip", 124 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 125 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 126 | "shasum": "" 127 | }, 128 | "require": { 129 | "ext-dom": "*", 130 | "ext-phar": "*", 131 | "phar-io/version": "^2.0", 132 | "php": "^5.6 || ^7.0" 133 | }, 134 | "type": "library", 135 | "extra": { 136 | "branch-alias": { 137 | "dev-master": "1.0.x-dev" 138 | } 139 | }, 140 | "autoload": { 141 | "classmap": [ 142 | "src/" 143 | ] 144 | }, 145 | "notification-url": "https://packagist.org/downloads/", 146 | "license": [ 147 | "BSD-3-Clause" 148 | ], 149 | "authors": [ 150 | { 151 | "name": "Arne Blankerts", 152 | "email": "arne@blankerts.de", 153 | "role": "Developer" 154 | }, 155 | { 156 | "name": "Sebastian Heuer", 157 | "email": "sebastian@phpeople.de", 158 | "role": "Developer" 159 | }, 160 | { 161 | "name": "Sebastian Bergmann", 162 | "email": "sebastian@phpunit.de", 163 | "role": "Developer" 164 | } 165 | ], 166 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 167 | "time": "2018-07-08T19:23:20+00:00" 168 | }, 169 | { 170 | "name": "phar-io/version", 171 | "version": "2.0.1", 172 | "source": { 173 | "type": "git", 174 | "url": "https://github.com/phar-io/version.git", 175 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 176 | }, 177 | "dist": { 178 | "type": "zip", 179 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 180 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 181 | "shasum": "" 182 | }, 183 | "require": { 184 | "php": "^5.6 || ^7.0" 185 | }, 186 | "type": "library", 187 | "autoload": { 188 | "classmap": [ 189 | "src/" 190 | ] 191 | }, 192 | "notification-url": "https://packagist.org/downloads/", 193 | "license": [ 194 | "BSD-3-Clause" 195 | ], 196 | "authors": [ 197 | { 198 | "name": "Arne Blankerts", 199 | "email": "arne@blankerts.de", 200 | "role": "Developer" 201 | }, 202 | { 203 | "name": "Sebastian Heuer", 204 | "email": "sebastian@phpeople.de", 205 | "role": "Developer" 206 | }, 207 | { 208 | "name": "Sebastian Bergmann", 209 | "email": "sebastian@phpunit.de", 210 | "role": "Developer" 211 | } 212 | ], 213 | "description": "Library for handling version information and constraints", 214 | "time": "2018-07-08T19:19:57+00:00" 215 | }, 216 | { 217 | "name": "phpdocumentor/reflection-common", 218 | "version": "2.0.0", 219 | "source": { 220 | "type": "git", 221 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 222 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" 223 | }, 224 | "dist": { 225 | "type": "zip", 226 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", 227 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", 228 | "shasum": "" 229 | }, 230 | "require": { 231 | "php": ">=7.1" 232 | }, 233 | "require-dev": { 234 | "phpunit/phpunit": "~6" 235 | }, 236 | "type": "library", 237 | "extra": { 238 | "branch-alias": { 239 | "dev-master": "2.x-dev" 240 | } 241 | }, 242 | "autoload": { 243 | "psr-4": { 244 | "phpDocumentor\\Reflection\\": "src/" 245 | } 246 | }, 247 | "notification-url": "https://packagist.org/downloads/", 248 | "license": [ 249 | "MIT" 250 | ], 251 | "authors": [ 252 | { 253 | "name": "Jaap van Otterdijk", 254 | "email": "opensource@ijaap.nl" 255 | } 256 | ], 257 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 258 | "homepage": "http://www.phpdoc.org", 259 | "keywords": [ 260 | "FQSEN", 261 | "phpDocumentor", 262 | "phpdoc", 263 | "reflection", 264 | "static analysis" 265 | ], 266 | "time": "2018-08-07T13:53:10+00:00" 267 | }, 268 | { 269 | "name": "phpdocumentor/reflection-docblock", 270 | "version": "5.1.0", 271 | "source": { 272 | "type": "git", 273 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 274 | "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" 275 | }, 276 | "dist": { 277 | "type": "zip", 278 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", 279 | "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", 280 | "shasum": "" 281 | }, 282 | "require": { 283 | "ext-filter": "^7.1", 284 | "php": "^7.2", 285 | "phpdocumentor/reflection-common": "^2.0", 286 | "phpdocumentor/type-resolver": "^1.0", 287 | "webmozart/assert": "^1" 288 | }, 289 | "require-dev": { 290 | "doctrine/instantiator": "^1", 291 | "mockery/mockery": "^1" 292 | }, 293 | "type": "library", 294 | "extra": { 295 | "branch-alias": { 296 | "dev-master": "5.x-dev" 297 | } 298 | }, 299 | "autoload": { 300 | "psr-4": { 301 | "phpDocumentor\\Reflection\\": "src" 302 | } 303 | }, 304 | "notification-url": "https://packagist.org/downloads/", 305 | "license": [ 306 | "MIT" 307 | ], 308 | "authors": [ 309 | { 310 | "name": "Mike van Riel", 311 | "email": "me@mikevanriel.com" 312 | }, 313 | { 314 | "name": "Jaap van Otterdijk", 315 | "email": "account@ijaap.nl" 316 | } 317 | ], 318 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 319 | "time": "2020-02-22T12:28:44+00:00" 320 | }, 321 | { 322 | "name": "phpdocumentor/type-resolver", 323 | "version": "1.1.0", 324 | "source": { 325 | "type": "git", 326 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 327 | "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" 328 | }, 329 | "dist": { 330 | "type": "zip", 331 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", 332 | "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", 333 | "shasum": "" 334 | }, 335 | "require": { 336 | "php": "^7.2", 337 | "phpdocumentor/reflection-common": "^2.0" 338 | }, 339 | "require-dev": { 340 | "ext-tokenizer": "^7.2", 341 | "mockery/mockery": "~1" 342 | }, 343 | "type": "library", 344 | "extra": { 345 | "branch-alias": { 346 | "dev-master": "1.x-dev" 347 | } 348 | }, 349 | "autoload": { 350 | "psr-4": { 351 | "phpDocumentor\\Reflection\\": "src" 352 | } 353 | }, 354 | "notification-url": "https://packagist.org/downloads/", 355 | "license": [ 356 | "MIT" 357 | ], 358 | "authors": [ 359 | { 360 | "name": "Mike van Riel", 361 | "email": "me@mikevanriel.com" 362 | } 363 | ], 364 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 365 | "time": "2020-02-18T18:59:58+00:00" 366 | }, 367 | { 368 | "name": "phpspec/prophecy", 369 | "version": "v1.10.3", 370 | "source": { 371 | "type": "git", 372 | "url": "https://github.com/phpspec/prophecy.git", 373 | "reference": "451c3cd1418cf640de218914901e51b064abb093" 374 | }, 375 | "dist": { 376 | "type": "zip", 377 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", 378 | "reference": "451c3cd1418cf640de218914901e51b064abb093", 379 | "shasum": "" 380 | }, 381 | "require": { 382 | "doctrine/instantiator": "^1.0.2", 383 | "php": "^5.3|^7.0", 384 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", 385 | "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", 386 | "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" 387 | }, 388 | "require-dev": { 389 | "phpspec/phpspec": "^2.5 || ^3.2", 390 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 391 | }, 392 | "type": "library", 393 | "extra": { 394 | "branch-alias": { 395 | "dev-master": "1.10.x-dev" 396 | } 397 | }, 398 | "autoload": { 399 | "psr-4": { 400 | "Prophecy\\": "src/Prophecy" 401 | } 402 | }, 403 | "notification-url": "https://packagist.org/downloads/", 404 | "license": [ 405 | "MIT" 406 | ], 407 | "authors": [ 408 | { 409 | "name": "Konstantin Kudryashov", 410 | "email": "ever.zet@gmail.com", 411 | "homepage": "http://everzet.com" 412 | }, 413 | { 414 | "name": "Marcello Duarte", 415 | "email": "marcello.duarte@gmail.com" 416 | } 417 | ], 418 | "description": "Highly opinionated mocking framework for PHP 5.3+", 419 | "homepage": "https://github.com/phpspec/prophecy", 420 | "keywords": [ 421 | "Double", 422 | "Dummy", 423 | "fake", 424 | "mock", 425 | "spy", 426 | "stub" 427 | ], 428 | "time": "2020-03-05T15:02:03+00:00" 429 | }, 430 | { 431 | "name": "phpunit/php-code-coverage", 432 | "version": "7.0.10", 433 | "source": { 434 | "type": "git", 435 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 436 | "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" 437 | }, 438 | "dist": { 439 | "type": "zip", 440 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", 441 | "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", 442 | "shasum": "" 443 | }, 444 | "require": { 445 | "ext-dom": "*", 446 | "ext-xmlwriter": "*", 447 | "php": "^7.2", 448 | "phpunit/php-file-iterator": "^2.0.2", 449 | "phpunit/php-text-template": "^1.2.1", 450 | "phpunit/php-token-stream": "^3.1.1", 451 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 452 | "sebastian/environment": "^4.2.2", 453 | "sebastian/version": "^2.0.1", 454 | "theseer/tokenizer": "^1.1.3" 455 | }, 456 | "require-dev": { 457 | "phpunit/phpunit": "^8.2.2" 458 | }, 459 | "suggest": { 460 | "ext-xdebug": "^2.7.2" 461 | }, 462 | "type": "library", 463 | "extra": { 464 | "branch-alias": { 465 | "dev-master": "7.0-dev" 466 | } 467 | }, 468 | "autoload": { 469 | "classmap": [ 470 | "src/" 471 | ] 472 | }, 473 | "notification-url": "https://packagist.org/downloads/", 474 | "license": [ 475 | "BSD-3-Clause" 476 | ], 477 | "authors": [ 478 | { 479 | "name": "Sebastian Bergmann", 480 | "email": "sebastian@phpunit.de", 481 | "role": "lead" 482 | } 483 | ], 484 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 485 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 486 | "keywords": [ 487 | "coverage", 488 | "testing", 489 | "xunit" 490 | ], 491 | "time": "2019-11-20T13:55:58+00:00" 492 | }, 493 | { 494 | "name": "phpunit/php-file-iterator", 495 | "version": "2.0.2", 496 | "source": { 497 | "type": "git", 498 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 499 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 500 | }, 501 | "dist": { 502 | "type": "zip", 503 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 504 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 505 | "shasum": "" 506 | }, 507 | "require": { 508 | "php": "^7.1" 509 | }, 510 | "require-dev": { 511 | "phpunit/phpunit": "^7.1" 512 | }, 513 | "type": "library", 514 | "extra": { 515 | "branch-alias": { 516 | "dev-master": "2.0.x-dev" 517 | } 518 | }, 519 | "autoload": { 520 | "classmap": [ 521 | "src/" 522 | ] 523 | }, 524 | "notification-url": "https://packagist.org/downloads/", 525 | "license": [ 526 | "BSD-3-Clause" 527 | ], 528 | "authors": [ 529 | { 530 | "name": "Sebastian Bergmann", 531 | "email": "sebastian@phpunit.de", 532 | "role": "lead" 533 | } 534 | ], 535 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 536 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 537 | "keywords": [ 538 | "filesystem", 539 | "iterator" 540 | ], 541 | "time": "2018-09-13T20:33:42+00:00" 542 | }, 543 | { 544 | "name": "phpunit/php-text-template", 545 | "version": "1.2.1", 546 | "source": { 547 | "type": "git", 548 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 549 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 550 | }, 551 | "dist": { 552 | "type": "zip", 553 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 554 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 555 | "shasum": "" 556 | }, 557 | "require": { 558 | "php": ">=5.3.3" 559 | }, 560 | "type": "library", 561 | "autoload": { 562 | "classmap": [ 563 | "src/" 564 | ] 565 | }, 566 | "notification-url": "https://packagist.org/downloads/", 567 | "license": [ 568 | "BSD-3-Clause" 569 | ], 570 | "authors": [ 571 | { 572 | "name": "Sebastian Bergmann", 573 | "email": "sebastian@phpunit.de", 574 | "role": "lead" 575 | } 576 | ], 577 | "description": "Simple template engine.", 578 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 579 | "keywords": [ 580 | "template" 581 | ], 582 | "time": "2015-06-21T13:50:34+00:00" 583 | }, 584 | { 585 | "name": "phpunit/php-timer", 586 | "version": "2.1.2", 587 | "source": { 588 | "type": "git", 589 | "url": "https://github.com/sebastianbergmann/php-timer.git", 590 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" 591 | }, 592 | "dist": { 593 | "type": "zip", 594 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", 595 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", 596 | "shasum": "" 597 | }, 598 | "require": { 599 | "php": "^7.1" 600 | }, 601 | "require-dev": { 602 | "phpunit/phpunit": "^7.0" 603 | }, 604 | "type": "library", 605 | "extra": { 606 | "branch-alias": { 607 | "dev-master": "2.1-dev" 608 | } 609 | }, 610 | "autoload": { 611 | "classmap": [ 612 | "src/" 613 | ] 614 | }, 615 | "notification-url": "https://packagist.org/downloads/", 616 | "license": [ 617 | "BSD-3-Clause" 618 | ], 619 | "authors": [ 620 | { 621 | "name": "Sebastian Bergmann", 622 | "email": "sebastian@phpunit.de", 623 | "role": "lead" 624 | } 625 | ], 626 | "description": "Utility class for timing", 627 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 628 | "keywords": [ 629 | "timer" 630 | ], 631 | "time": "2019-06-07T04:22:29+00:00" 632 | }, 633 | { 634 | "name": "phpunit/php-token-stream", 635 | "version": "3.1.1", 636 | "source": { 637 | "type": "git", 638 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 639 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" 640 | }, 641 | "dist": { 642 | "type": "zip", 643 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", 644 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", 645 | "shasum": "" 646 | }, 647 | "require": { 648 | "ext-tokenizer": "*", 649 | "php": "^7.1" 650 | }, 651 | "require-dev": { 652 | "phpunit/phpunit": "^7.0" 653 | }, 654 | "type": "library", 655 | "extra": { 656 | "branch-alias": { 657 | "dev-master": "3.1-dev" 658 | } 659 | }, 660 | "autoload": { 661 | "classmap": [ 662 | "src/" 663 | ] 664 | }, 665 | "notification-url": "https://packagist.org/downloads/", 666 | "license": [ 667 | "BSD-3-Clause" 668 | ], 669 | "authors": [ 670 | { 671 | "name": "Sebastian Bergmann", 672 | "email": "sebastian@phpunit.de" 673 | } 674 | ], 675 | "description": "Wrapper around PHP's tokenizer extension.", 676 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 677 | "keywords": [ 678 | "tokenizer" 679 | ], 680 | "time": "2019-09-17T06:23:10+00:00" 681 | }, 682 | { 683 | "name": "phpunit/phpunit", 684 | "version": "8.5.2", 685 | "source": { 686 | "type": "git", 687 | "url": "https://github.com/sebastianbergmann/phpunit.git", 688 | "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0" 689 | }, 690 | "dist": { 691 | "type": "zip", 692 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/018b6ac3c8ab20916db85fa91bf6465acb64d1e0", 693 | "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0", 694 | "shasum": "" 695 | }, 696 | "require": { 697 | "doctrine/instantiator": "^1.2.0", 698 | "ext-dom": "*", 699 | "ext-json": "*", 700 | "ext-libxml": "*", 701 | "ext-mbstring": "*", 702 | "ext-xml": "*", 703 | "ext-xmlwriter": "*", 704 | "myclabs/deep-copy": "^1.9.1", 705 | "phar-io/manifest": "^1.0.3", 706 | "phar-io/version": "^2.0.1", 707 | "php": "^7.2", 708 | "phpspec/prophecy": "^1.8.1", 709 | "phpunit/php-code-coverage": "^7.0.7", 710 | "phpunit/php-file-iterator": "^2.0.2", 711 | "phpunit/php-text-template": "^1.2.1", 712 | "phpunit/php-timer": "^2.1.2", 713 | "sebastian/comparator": "^3.0.2", 714 | "sebastian/diff": "^3.0.2", 715 | "sebastian/environment": "^4.2.2", 716 | "sebastian/exporter": "^3.1.1", 717 | "sebastian/global-state": "^3.0.0", 718 | "sebastian/object-enumerator": "^3.0.3", 719 | "sebastian/resource-operations": "^2.0.1", 720 | "sebastian/type": "^1.1.3", 721 | "sebastian/version": "^2.0.1" 722 | }, 723 | "require-dev": { 724 | "ext-pdo": "*" 725 | }, 726 | "suggest": { 727 | "ext-soap": "*", 728 | "ext-xdebug": "*", 729 | "phpunit/php-invoker": "^2.0.0" 730 | }, 731 | "bin": [ 732 | "phpunit" 733 | ], 734 | "type": "library", 735 | "extra": { 736 | "branch-alias": { 737 | "dev-master": "8.5-dev" 738 | } 739 | }, 740 | "autoload": { 741 | "classmap": [ 742 | "src/" 743 | ] 744 | }, 745 | "notification-url": "https://packagist.org/downloads/", 746 | "license": [ 747 | "BSD-3-Clause" 748 | ], 749 | "authors": [ 750 | { 751 | "name": "Sebastian Bergmann", 752 | "email": "sebastian@phpunit.de", 753 | "role": "lead" 754 | } 755 | ], 756 | "description": "The PHP Unit Testing framework.", 757 | "homepage": "https://phpunit.de/", 758 | "keywords": [ 759 | "phpunit", 760 | "testing", 761 | "xunit" 762 | ], 763 | "time": "2020-01-08T08:49:49+00:00" 764 | }, 765 | { 766 | "name": "sebastian/code-unit-reverse-lookup", 767 | "version": "1.0.1", 768 | "source": { 769 | "type": "git", 770 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 771 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 772 | }, 773 | "dist": { 774 | "type": "zip", 775 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 776 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 777 | "shasum": "" 778 | }, 779 | "require": { 780 | "php": "^5.6 || ^7.0" 781 | }, 782 | "require-dev": { 783 | "phpunit/phpunit": "^5.7 || ^6.0" 784 | }, 785 | "type": "library", 786 | "extra": { 787 | "branch-alias": { 788 | "dev-master": "1.0.x-dev" 789 | } 790 | }, 791 | "autoload": { 792 | "classmap": [ 793 | "src/" 794 | ] 795 | }, 796 | "notification-url": "https://packagist.org/downloads/", 797 | "license": [ 798 | "BSD-3-Clause" 799 | ], 800 | "authors": [ 801 | { 802 | "name": "Sebastian Bergmann", 803 | "email": "sebastian@phpunit.de" 804 | } 805 | ], 806 | "description": "Looks up which function or method a line of code belongs to", 807 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 808 | "time": "2017-03-04T06:30:41+00:00" 809 | }, 810 | { 811 | "name": "sebastian/comparator", 812 | "version": "3.0.2", 813 | "source": { 814 | "type": "git", 815 | "url": "https://github.com/sebastianbergmann/comparator.git", 816 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 817 | }, 818 | "dist": { 819 | "type": "zip", 820 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 821 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 822 | "shasum": "" 823 | }, 824 | "require": { 825 | "php": "^7.1", 826 | "sebastian/diff": "^3.0", 827 | "sebastian/exporter": "^3.1" 828 | }, 829 | "require-dev": { 830 | "phpunit/phpunit": "^7.1" 831 | }, 832 | "type": "library", 833 | "extra": { 834 | "branch-alias": { 835 | "dev-master": "3.0-dev" 836 | } 837 | }, 838 | "autoload": { 839 | "classmap": [ 840 | "src/" 841 | ] 842 | }, 843 | "notification-url": "https://packagist.org/downloads/", 844 | "license": [ 845 | "BSD-3-Clause" 846 | ], 847 | "authors": [ 848 | { 849 | "name": "Jeff Welch", 850 | "email": "whatthejeff@gmail.com" 851 | }, 852 | { 853 | "name": "Volker Dusch", 854 | "email": "github@wallbash.com" 855 | }, 856 | { 857 | "name": "Bernhard Schussek", 858 | "email": "bschussek@2bepublished.at" 859 | }, 860 | { 861 | "name": "Sebastian Bergmann", 862 | "email": "sebastian@phpunit.de" 863 | } 864 | ], 865 | "description": "Provides the functionality to compare PHP values for equality", 866 | "homepage": "https://github.com/sebastianbergmann/comparator", 867 | "keywords": [ 868 | "comparator", 869 | "compare", 870 | "equality" 871 | ], 872 | "time": "2018-07-12T15:12:46+00:00" 873 | }, 874 | { 875 | "name": "sebastian/diff", 876 | "version": "3.0.2", 877 | "source": { 878 | "type": "git", 879 | "url": "https://github.com/sebastianbergmann/diff.git", 880 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" 881 | }, 882 | "dist": { 883 | "type": "zip", 884 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 885 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 886 | "shasum": "" 887 | }, 888 | "require": { 889 | "php": "^7.1" 890 | }, 891 | "require-dev": { 892 | "phpunit/phpunit": "^7.5 || ^8.0", 893 | "symfony/process": "^2 || ^3.3 || ^4" 894 | }, 895 | "type": "library", 896 | "extra": { 897 | "branch-alias": { 898 | "dev-master": "3.0-dev" 899 | } 900 | }, 901 | "autoload": { 902 | "classmap": [ 903 | "src/" 904 | ] 905 | }, 906 | "notification-url": "https://packagist.org/downloads/", 907 | "license": [ 908 | "BSD-3-Clause" 909 | ], 910 | "authors": [ 911 | { 912 | "name": "Kore Nordmann", 913 | "email": "mail@kore-nordmann.de" 914 | }, 915 | { 916 | "name": "Sebastian Bergmann", 917 | "email": "sebastian@phpunit.de" 918 | } 919 | ], 920 | "description": "Diff implementation", 921 | "homepage": "https://github.com/sebastianbergmann/diff", 922 | "keywords": [ 923 | "diff", 924 | "udiff", 925 | "unidiff", 926 | "unified diff" 927 | ], 928 | "time": "2019-02-04T06:01:07+00:00" 929 | }, 930 | { 931 | "name": "sebastian/environment", 932 | "version": "4.2.3", 933 | "source": { 934 | "type": "git", 935 | "url": "https://github.com/sebastianbergmann/environment.git", 936 | "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" 937 | }, 938 | "dist": { 939 | "type": "zip", 940 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", 941 | "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", 942 | "shasum": "" 943 | }, 944 | "require": { 945 | "php": "^7.1" 946 | }, 947 | "require-dev": { 948 | "phpunit/phpunit": "^7.5" 949 | }, 950 | "suggest": { 951 | "ext-posix": "*" 952 | }, 953 | "type": "library", 954 | "extra": { 955 | "branch-alias": { 956 | "dev-master": "4.2-dev" 957 | } 958 | }, 959 | "autoload": { 960 | "classmap": [ 961 | "src/" 962 | ] 963 | }, 964 | "notification-url": "https://packagist.org/downloads/", 965 | "license": [ 966 | "BSD-3-Clause" 967 | ], 968 | "authors": [ 969 | { 970 | "name": "Sebastian Bergmann", 971 | "email": "sebastian@phpunit.de" 972 | } 973 | ], 974 | "description": "Provides functionality to handle HHVM/PHP environments", 975 | "homepage": "http://www.github.com/sebastianbergmann/environment", 976 | "keywords": [ 977 | "Xdebug", 978 | "environment", 979 | "hhvm" 980 | ], 981 | "time": "2019-11-20T08:46:58+00:00" 982 | }, 983 | { 984 | "name": "sebastian/exporter", 985 | "version": "3.1.2", 986 | "source": { 987 | "type": "git", 988 | "url": "https://github.com/sebastianbergmann/exporter.git", 989 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" 990 | }, 991 | "dist": { 992 | "type": "zip", 993 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", 994 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", 995 | "shasum": "" 996 | }, 997 | "require": { 998 | "php": "^7.0", 999 | "sebastian/recursion-context": "^3.0" 1000 | }, 1001 | "require-dev": { 1002 | "ext-mbstring": "*", 1003 | "phpunit/phpunit": "^6.0" 1004 | }, 1005 | "type": "library", 1006 | "extra": { 1007 | "branch-alias": { 1008 | "dev-master": "3.1.x-dev" 1009 | } 1010 | }, 1011 | "autoload": { 1012 | "classmap": [ 1013 | "src/" 1014 | ] 1015 | }, 1016 | "notification-url": "https://packagist.org/downloads/", 1017 | "license": [ 1018 | "BSD-3-Clause" 1019 | ], 1020 | "authors": [ 1021 | { 1022 | "name": "Sebastian Bergmann", 1023 | "email": "sebastian@phpunit.de" 1024 | }, 1025 | { 1026 | "name": "Jeff Welch", 1027 | "email": "whatthejeff@gmail.com" 1028 | }, 1029 | { 1030 | "name": "Volker Dusch", 1031 | "email": "github@wallbash.com" 1032 | }, 1033 | { 1034 | "name": "Adam Harvey", 1035 | "email": "aharvey@php.net" 1036 | }, 1037 | { 1038 | "name": "Bernhard Schussek", 1039 | "email": "bschussek@gmail.com" 1040 | } 1041 | ], 1042 | "description": "Provides the functionality to export PHP variables for visualization", 1043 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1044 | "keywords": [ 1045 | "export", 1046 | "exporter" 1047 | ], 1048 | "time": "2019-09-14T09:02:43+00:00" 1049 | }, 1050 | { 1051 | "name": "sebastian/global-state", 1052 | "version": "3.0.0", 1053 | "source": { 1054 | "type": "git", 1055 | "url": "https://github.com/sebastianbergmann/global-state.git", 1056 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" 1057 | }, 1058 | "dist": { 1059 | "type": "zip", 1060 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 1061 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 1062 | "shasum": "" 1063 | }, 1064 | "require": { 1065 | "php": "^7.2", 1066 | "sebastian/object-reflector": "^1.1.1", 1067 | "sebastian/recursion-context": "^3.0" 1068 | }, 1069 | "require-dev": { 1070 | "ext-dom": "*", 1071 | "phpunit/phpunit": "^8.0" 1072 | }, 1073 | "suggest": { 1074 | "ext-uopz": "*" 1075 | }, 1076 | "type": "library", 1077 | "extra": { 1078 | "branch-alias": { 1079 | "dev-master": "3.0-dev" 1080 | } 1081 | }, 1082 | "autoload": { 1083 | "classmap": [ 1084 | "src/" 1085 | ] 1086 | }, 1087 | "notification-url": "https://packagist.org/downloads/", 1088 | "license": [ 1089 | "BSD-3-Clause" 1090 | ], 1091 | "authors": [ 1092 | { 1093 | "name": "Sebastian Bergmann", 1094 | "email": "sebastian@phpunit.de" 1095 | } 1096 | ], 1097 | "description": "Snapshotting of global state", 1098 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1099 | "keywords": [ 1100 | "global state" 1101 | ], 1102 | "time": "2019-02-01T05:30:01+00:00" 1103 | }, 1104 | { 1105 | "name": "sebastian/object-enumerator", 1106 | "version": "3.0.3", 1107 | "source": { 1108 | "type": "git", 1109 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1110 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 1111 | }, 1112 | "dist": { 1113 | "type": "zip", 1114 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1115 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1116 | "shasum": "" 1117 | }, 1118 | "require": { 1119 | "php": "^7.0", 1120 | "sebastian/object-reflector": "^1.1.1", 1121 | "sebastian/recursion-context": "^3.0" 1122 | }, 1123 | "require-dev": { 1124 | "phpunit/phpunit": "^6.0" 1125 | }, 1126 | "type": "library", 1127 | "extra": { 1128 | "branch-alias": { 1129 | "dev-master": "3.0.x-dev" 1130 | } 1131 | }, 1132 | "autoload": { 1133 | "classmap": [ 1134 | "src/" 1135 | ] 1136 | }, 1137 | "notification-url": "https://packagist.org/downloads/", 1138 | "license": [ 1139 | "BSD-3-Clause" 1140 | ], 1141 | "authors": [ 1142 | { 1143 | "name": "Sebastian Bergmann", 1144 | "email": "sebastian@phpunit.de" 1145 | } 1146 | ], 1147 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1148 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1149 | "time": "2017-08-03T12:35:26+00:00" 1150 | }, 1151 | { 1152 | "name": "sebastian/object-reflector", 1153 | "version": "1.1.1", 1154 | "source": { 1155 | "type": "git", 1156 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1157 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 1158 | }, 1159 | "dist": { 1160 | "type": "zip", 1161 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 1162 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 1163 | "shasum": "" 1164 | }, 1165 | "require": { 1166 | "php": "^7.0" 1167 | }, 1168 | "require-dev": { 1169 | "phpunit/phpunit": "^6.0" 1170 | }, 1171 | "type": "library", 1172 | "extra": { 1173 | "branch-alias": { 1174 | "dev-master": "1.1-dev" 1175 | } 1176 | }, 1177 | "autoload": { 1178 | "classmap": [ 1179 | "src/" 1180 | ] 1181 | }, 1182 | "notification-url": "https://packagist.org/downloads/", 1183 | "license": [ 1184 | "BSD-3-Clause" 1185 | ], 1186 | "authors": [ 1187 | { 1188 | "name": "Sebastian Bergmann", 1189 | "email": "sebastian@phpunit.de" 1190 | } 1191 | ], 1192 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1193 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1194 | "time": "2017-03-29T09:07:27+00:00" 1195 | }, 1196 | { 1197 | "name": "sebastian/recursion-context", 1198 | "version": "3.0.0", 1199 | "source": { 1200 | "type": "git", 1201 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1202 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 1203 | }, 1204 | "dist": { 1205 | "type": "zip", 1206 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1207 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1208 | "shasum": "" 1209 | }, 1210 | "require": { 1211 | "php": "^7.0" 1212 | }, 1213 | "require-dev": { 1214 | "phpunit/phpunit": "^6.0" 1215 | }, 1216 | "type": "library", 1217 | "extra": { 1218 | "branch-alias": { 1219 | "dev-master": "3.0.x-dev" 1220 | } 1221 | }, 1222 | "autoload": { 1223 | "classmap": [ 1224 | "src/" 1225 | ] 1226 | }, 1227 | "notification-url": "https://packagist.org/downloads/", 1228 | "license": [ 1229 | "BSD-3-Clause" 1230 | ], 1231 | "authors": [ 1232 | { 1233 | "name": "Jeff Welch", 1234 | "email": "whatthejeff@gmail.com" 1235 | }, 1236 | { 1237 | "name": "Sebastian Bergmann", 1238 | "email": "sebastian@phpunit.de" 1239 | }, 1240 | { 1241 | "name": "Adam Harvey", 1242 | "email": "aharvey@php.net" 1243 | } 1244 | ], 1245 | "description": "Provides functionality to recursively process PHP variables", 1246 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1247 | "time": "2017-03-03T06:23:57+00:00" 1248 | }, 1249 | { 1250 | "name": "sebastian/resource-operations", 1251 | "version": "2.0.1", 1252 | "source": { 1253 | "type": "git", 1254 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1255 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 1256 | }, 1257 | "dist": { 1258 | "type": "zip", 1259 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1260 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1261 | "shasum": "" 1262 | }, 1263 | "require": { 1264 | "php": "^7.1" 1265 | }, 1266 | "type": "library", 1267 | "extra": { 1268 | "branch-alias": { 1269 | "dev-master": "2.0-dev" 1270 | } 1271 | }, 1272 | "autoload": { 1273 | "classmap": [ 1274 | "src/" 1275 | ] 1276 | }, 1277 | "notification-url": "https://packagist.org/downloads/", 1278 | "license": [ 1279 | "BSD-3-Clause" 1280 | ], 1281 | "authors": [ 1282 | { 1283 | "name": "Sebastian Bergmann", 1284 | "email": "sebastian@phpunit.de" 1285 | } 1286 | ], 1287 | "description": "Provides a list of PHP built-in functions that operate on resources", 1288 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1289 | "time": "2018-10-04T04:07:39+00:00" 1290 | }, 1291 | { 1292 | "name": "sebastian/type", 1293 | "version": "1.1.3", 1294 | "source": { 1295 | "type": "git", 1296 | "url": "https://github.com/sebastianbergmann/type.git", 1297 | "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" 1298 | }, 1299 | "dist": { 1300 | "type": "zip", 1301 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", 1302 | "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", 1303 | "shasum": "" 1304 | }, 1305 | "require": { 1306 | "php": "^7.2" 1307 | }, 1308 | "require-dev": { 1309 | "phpunit/phpunit": "^8.2" 1310 | }, 1311 | "type": "library", 1312 | "extra": { 1313 | "branch-alias": { 1314 | "dev-master": "1.1-dev" 1315 | } 1316 | }, 1317 | "autoload": { 1318 | "classmap": [ 1319 | "src/" 1320 | ] 1321 | }, 1322 | "notification-url": "https://packagist.org/downloads/", 1323 | "license": [ 1324 | "BSD-3-Clause" 1325 | ], 1326 | "authors": [ 1327 | { 1328 | "name": "Sebastian Bergmann", 1329 | "email": "sebastian@phpunit.de", 1330 | "role": "lead" 1331 | } 1332 | ], 1333 | "description": "Collection of value objects that represent the types of the PHP type system", 1334 | "homepage": "https://github.com/sebastianbergmann/type", 1335 | "time": "2019-07-02T08:10:15+00:00" 1336 | }, 1337 | { 1338 | "name": "sebastian/version", 1339 | "version": "2.0.1", 1340 | "source": { 1341 | "type": "git", 1342 | "url": "https://github.com/sebastianbergmann/version.git", 1343 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1344 | }, 1345 | "dist": { 1346 | "type": "zip", 1347 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1348 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1349 | "shasum": "" 1350 | }, 1351 | "require": { 1352 | "php": ">=5.6" 1353 | }, 1354 | "type": "library", 1355 | "extra": { 1356 | "branch-alias": { 1357 | "dev-master": "2.0.x-dev" 1358 | } 1359 | }, 1360 | "autoload": { 1361 | "classmap": [ 1362 | "src/" 1363 | ] 1364 | }, 1365 | "notification-url": "https://packagist.org/downloads/", 1366 | "license": [ 1367 | "BSD-3-Clause" 1368 | ], 1369 | "authors": [ 1370 | { 1371 | "name": "Sebastian Bergmann", 1372 | "email": "sebastian@phpunit.de", 1373 | "role": "lead" 1374 | } 1375 | ], 1376 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1377 | "homepage": "https://github.com/sebastianbergmann/version", 1378 | "time": "2016-10-03T07:35:21+00:00" 1379 | }, 1380 | { 1381 | "name": "symfony/polyfill-ctype", 1382 | "version": "v1.15.0", 1383 | "source": { 1384 | "type": "git", 1385 | "url": "https://github.com/symfony/polyfill-ctype.git", 1386 | "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14" 1387 | }, 1388 | "dist": { 1389 | "type": "zip", 1390 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14", 1391 | "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14", 1392 | "shasum": "" 1393 | }, 1394 | "require": { 1395 | "php": ">=5.3.3" 1396 | }, 1397 | "suggest": { 1398 | "ext-ctype": "For best performance" 1399 | }, 1400 | "type": "library", 1401 | "extra": { 1402 | "branch-alias": { 1403 | "dev-master": "1.15-dev" 1404 | } 1405 | }, 1406 | "autoload": { 1407 | "psr-4": { 1408 | "Symfony\\Polyfill\\Ctype\\": "" 1409 | }, 1410 | "files": [ 1411 | "bootstrap.php" 1412 | ] 1413 | }, 1414 | "notification-url": "https://packagist.org/downloads/", 1415 | "license": [ 1416 | "MIT" 1417 | ], 1418 | "authors": [ 1419 | { 1420 | "name": "Gert de Pagter", 1421 | "email": "BackEndTea@gmail.com" 1422 | }, 1423 | { 1424 | "name": "Symfony Community", 1425 | "homepage": "https://symfony.com/contributors" 1426 | } 1427 | ], 1428 | "description": "Symfony polyfill for ctype functions", 1429 | "homepage": "https://symfony.com", 1430 | "keywords": [ 1431 | "compatibility", 1432 | "ctype", 1433 | "polyfill", 1434 | "portable" 1435 | ], 1436 | "time": "2020-02-27T09:26:54+00:00" 1437 | }, 1438 | { 1439 | "name": "theseer/tokenizer", 1440 | "version": "1.1.3", 1441 | "source": { 1442 | "type": "git", 1443 | "url": "https://github.com/theseer/tokenizer.git", 1444 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" 1445 | }, 1446 | "dist": { 1447 | "type": "zip", 1448 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 1449 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 1450 | "shasum": "" 1451 | }, 1452 | "require": { 1453 | "ext-dom": "*", 1454 | "ext-tokenizer": "*", 1455 | "ext-xmlwriter": "*", 1456 | "php": "^7.0" 1457 | }, 1458 | "type": "library", 1459 | "autoload": { 1460 | "classmap": [ 1461 | "src/" 1462 | ] 1463 | }, 1464 | "notification-url": "https://packagist.org/downloads/", 1465 | "license": [ 1466 | "BSD-3-Clause" 1467 | ], 1468 | "authors": [ 1469 | { 1470 | "name": "Arne Blankerts", 1471 | "email": "arne@blankerts.de", 1472 | "role": "Developer" 1473 | } 1474 | ], 1475 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1476 | "time": "2019-06-13T22:48:21+00:00" 1477 | }, 1478 | { 1479 | "name": "webmozart/assert", 1480 | "version": "1.7.0", 1481 | "source": { 1482 | "type": "git", 1483 | "url": "https://github.com/webmozart/assert.git", 1484 | "reference": "aed98a490f9a8f78468232db345ab9cf606cf598" 1485 | }, 1486 | "dist": { 1487 | "type": "zip", 1488 | "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598", 1489 | "reference": "aed98a490f9a8f78468232db345ab9cf606cf598", 1490 | "shasum": "" 1491 | }, 1492 | "require": { 1493 | "php": "^5.3.3 || ^7.0", 1494 | "symfony/polyfill-ctype": "^1.8" 1495 | }, 1496 | "conflict": { 1497 | "vimeo/psalm": "<3.6.0" 1498 | }, 1499 | "require-dev": { 1500 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 1501 | }, 1502 | "type": "library", 1503 | "autoload": { 1504 | "psr-4": { 1505 | "Webmozart\\Assert\\": "src/" 1506 | } 1507 | }, 1508 | "notification-url": "https://packagist.org/downloads/", 1509 | "license": [ 1510 | "MIT" 1511 | ], 1512 | "authors": [ 1513 | { 1514 | "name": "Bernhard Schussek", 1515 | "email": "bschussek@gmail.com" 1516 | } 1517 | ], 1518 | "description": "Assertions to validate method input/output with nice error messages.", 1519 | "keywords": [ 1520 | "assert", 1521 | "check", 1522 | "validate" 1523 | ], 1524 | "time": "2020-02-14T12:15:55+00:00" 1525 | } 1526 | ], 1527 | "aliases": [], 1528 | "minimum-stability": "stable", 1529 | "stability-flags": [], 1530 | "prefer-stable": false, 1531 | "prefer-lowest": false, 1532 | "platform": { 1533 | "php": ">=7.2.0" 1534 | }, 1535 | "platform-dev": [] 1536 | } 1537 | --------------------------------------------------------------------------------