├── .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 | [](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 |
--------------------------------------------------------------------------------