├── .gitignore
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── composer.json
├── composer.lock
├── infection.json.dist
├── phpunit.xml
├── src
├── Client.php
├── CreateFromSimpleXML.php
├── Cursor.php
└── Streams
│ ├── FileReaderStream.php
│ ├── ReaderStream.php
│ └── StringReaderStream.php
└── tests
├── ClientTest.php
├── CursorTest.php
├── FileReaderStreamTest.php
├── MemoryUsageTest.php
├── NamedFileReaderStreamTest.php
├── ReaderStreamTest.php
├── StringReaderStreamTest.php
├── TagDepthTest.php
├── TestClasses
├── TestRecord.php
└── TestTrack.php
└── assets
├── 3MB-test-data.xml
└── test-data.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | composer.phar
2 | /vendor/
3 |
4 | # PHP Dev cache files
5 | .php*
6 |
7 | # Infection mutation testing
8 | infection.log
9 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: php
2 |
3 | php:
4 | - 7.2
5 | - 7.3
6 |
7 | env:
8 | matrix:
9 | - COMPOSER_FLAGS="--prefer-lowest"
10 | - COMPOSER_FLAGS=""
11 |
12 | before_script:
13 | - travis_retry composer self-update
14 | - travis_retry composer update ${COMPOSER_FLAGS} --no-interaction --prefer-source
15 | - wget https://github.com/infection/infection/releases/download/0.12.0/infection.phar
16 | - wget https://github.com/infection/infection/releases/download/0.12.0/infection.phar.asc
17 | - gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 493B4AA0
18 | - gpg --with-fingerprint --verify infection.phar.asc infection.phar
19 | - chmod +x infection.phar
20 |
21 | script:
22 | - vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
23 | - ./infection.phar --min-msi=60 --threads=4
24 |
25 | after_script:
26 | - php vendor/bin/ocular code-coverage:upload --format=php-clover coverage.clover
27 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to `tbpixel/xml-streamer` will be documented in this file.
4 |
5 | ## 1.5.3 - 2019-03-14
6 |
7 | - Provided Client always rewinds stream at end of iteration; resolves #20.
8 |
9 | ## 1.5.2 - 2019-03-12
10 |
11 | - Re-addresses issue #21, resolving it properly this time.
12 |
13 | ## 1.5.1 - 2019-03-11
14 |
15 | - Resolves an issue where ReaderStream did not iterate every record correctly; fixes #21.
16 |
17 | ## 1.5.0 - 2019-03-11
18 |
19 | - Allows the client to return an array of items, resolving #17.
20 |
21 | ## 1.4.0 - 2019-03-11
22 |
23 | - Allows the client to be countable, resolving #16.
24 |
25 | ## 1.3.0 - 2019-03-11
26 |
27 | - Implements mutation testing library `infection`.
28 | - Fixes an issue where the cursor was not wrapping correctly and adds tests.
29 | - Fixes an issue where the `XMLReader` based streams did not properly rewind.
30 | - Fixes an issue where `__toString` may throw an exception.
31 | - Fixes an issue where iterating by tag name only returned the first result.
32 |
33 | ## 1.2.0 - 2019-03-05
34 |
35 | - Resolve issue #12, implementing IteratorAggregate onto the client to allow for convenient looping.
36 |
37 | ## 1.1.2 - 2019-02-14
38 |
39 | - Resolves issue #8, fixing stream size calculation and adjusting tests accordingly.
40 |
41 | ## 1.1.1 - 2019-02-13
42 |
43 | - Resolves issue #6, adding `__destruct` magic method to ReaderStream to close stream on object destruct.
44 |
45 | ## 1.1.0 - 2019-02-12
46 |
47 | - Resolves issue #3, adding the ability to pass a tag name to a reader stream and get it to iterate manually.
48 |
49 | ## 1.0.1 - 2019-02-07
50 |
51 | - Resolves issue #1, a bug in which stream iteration depth was not equal to required set depth.
52 |
53 | ## 1.0.0 - 2019-02-06
54 |
55 | - Initial release
56 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Contributions are **welcome** and will be fully **credited**.
4 |
5 | Please read and understand the contribution guide before creating an issue or pull request.
6 |
7 | ## Etiquette
8 |
9 | This project is open source, and as such, the maintainers give their free time to build and maintain the source code
10 | held within. They make the code freely available in the hope that it will be of use to other developers. It would be
11 | extremely unfair for them to suffer abuse or anger for their hard work.
12 |
13 | Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the
14 | world that developers are civilized and selfless people.
15 |
16 | It's the duty of the maintainer to ensure that all submissions to the project are of sufficient
17 | quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used.
18 |
19 | ## Viability
20 |
21 | When requesting or submitting new features, first consider whether it might be useful to others. Open
22 | source projects are used by many developers, who may have entirely different needs to your own. Think about
23 | whether or not your feature is likely to be used by other users of the project.
24 |
25 | ## Procedure
26 |
27 | Before filing an issue:
28 |
29 | - Attempt to replicate the problem, to ensure that it wasn't a coincidental incident.
30 | - Check to make sure your feature suggestion isn't already present within the project.
31 | - Check the pull requests tab to ensure that the bug doesn't have a fix in progress.
32 | - Check the pull requests tab to ensure that the feature isn't already in progress.
33 |
34 | Before submitting a pull request:
35 |
36 | - Check the codebase to ensure that your feature doesn't already exist.
37 | - Check the pull requests to ensure that another person hasn't already submitted the feature or fix.
38 |
39 | ## Requirements
40 |
41 | If the project maintainer has any additional requirements, you will find them listed here.
42 |
43 | - **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](https://pear.php.net/package/PHP_CodeSniffer).
44 |
45 | - **Add tests!** - Your patch won't be accepted if it doesn't have tests.
46 |
47 | - **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date.
48 |
49 | - **Consider our release cycle** - We try to follow [SemVer v2.0.0](https://semver.org/). Randomly breaking public APIs is not an option.
50 |
51 | - **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
52 |
53 | - **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting.
54 |
55 | **Happy coding**!
56 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Tony Barry
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 all
13 | 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 THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | optimize:
2 | composer dump-autoload -o
3 |
4 | test:
5 | ./vendor/bin/phpunit
6 |
7 | test-mutations:
8 | ./vendor/bin/infection
9 |
10 | cs-fixer:
11 | ./vendor/bin/php-cs-fixer fix ./src
12 | ./vendor/bin/php-cs-fixer fix ./tests
13 |
14 | analyse:
15 | ./vendor/bin/phpstan analyse --level=max ./src
16 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TBPixel/XMLStreamer
2 |
3 | [](https://packagist.org/packages/tbpixel/type-adapter)
4 | [](https://travis-ci.org/TBPixel/type-adapter)
5 |
6 | #### Content
7 |
8 | - [Installation](#installation)
9 | - [Purpose](#purpose)
10 | - [Examples](#examples)
11 | - [Automatic Casting](#automatic-casting)
12 | - [Extending](#extending)
13 | - [Contributing](#contributing)
14 | - [Changelog](#changelog)
15 | - [Support Me](#support-me)
16 | - [License](#license)
17 |
18 | ## Installation
19 |
20 | You can install this package via composer:
21 |
22 | ```bash
23 | composer require tbpixel/xml-streamer
24 | ```
25 |
26 | ## Purpose
27 |
28 | I found myself in need of a way to work with large XML data efficiently. The built in `XMLReader` PHP provides is fast and efficient, but can be a pain to work with at times. I wanted a dependency-free way to stream XML data and work with it using my provided classmap.
29 |
30 | This package attempts to alleviate some of the headache of working with XMLReader, while also providing a collection of PSR-7 compatible XML streams. It offers a convenient way to iterate large XML data sets for reduced memory usage.
31 |
32 | The optional client is also provided to allow for casting XML Strings to classmap objects.
33 |
34 | ### Examples
35 |
36 | Say we had an XML file called `users.xml` with the following data:
37 |
38 | ```xml
39 |
40 |
41 |
42 | 1
43 | John Doe
44 |
45 |
46 | 2
47 | Theodor
48 |
49 |
50 | ```
51 |
52 | With this package, we can simply create a new _Client_, pass it a PSR-7 compatible stream, and work with our data using our types.
53 |
54 | ```php
55 | $stream = new \TBPixel\XMLStreamer\Streams\FileReaderStream('users.xml', 1);
56 | $client = new \TBPixel\XMLStreamer\Client($stream);
57 |
58 | foreach ($client->iterate() as $simpleXMLElement) {
59 | // Do something with the SimpleXMLElement
60 | }
61 |
62 | $client->close(); // Closes the client's provided stream
63 | ```
64 |
65 | We can also loop the client directly, as it implements the `IteratorAggregate` interface.
66 |
67 | ```php
68 | // Same as above loop
69 | foreach ($client as $simpleXMLElement) {
70 | // Do something with the SimpleXMLElement
71 | }
72 | ```
73 |
74 | #### Iteration Depth
75 |
76 | ReaderStream, the underlying XMLReader wrapper for the stream implementations found in this package, contains a final constructor argument called `$depth`. This is an integer (default to 0) or string which represents a depth to start iterating records found in an XML document.
77 |
78 | The string can be the name of an XML tag, allowing the stream to iterate until it finds the tag rather than having to know the depth in advance.
79 |
80 | Given the same data as above, we could rewrite our code snippet as follows:
81 |
82 | ```php
83 | $stream = new \TBPixel\XMLStreamer\Streams\FileReaderStream('users.xml', 'users');
84 | $client = new \TBPixel\XMLStreamer\Client($stream);
85 |
86 | foreach ($client->iterate() as $simpleXMLElement) {
87 | // Do something with the SimpleXMLElement
88 | }
89 |
90 | $client->close(); // Closes the client's provided stream
91 | ```
92 |
93 | The previous value of 1 was acceptable for iterating this result set, but if the data was wrapped an arbitrary number of levels deep then this tag-name approach becomes convenient.
94 |
95 | ### Automatic Casting
96 |
97 | If we had a user which implemented the required `CreateFromSimpleXML` interface, we could also cast the `SimpleXMLElement` as we iterate for easier access.
98 |
99 | ```php
100 | use TBPixel\XMLStreamer\CreateFromSimpleXML;
101 |
102 | class User implements CreateFromSimpleXML
103 | {
104 | /** @var int */
105 | public $id;
106 |
107 | /** @var string */
108 | public $name;
109 |
110 | public function __construct(int $id, string $name)
111 | {
112 | $this->id = $id;
113 | $this->name = $name;
114 | }
115 |
116 | /**
117 | * Create a new instance from a Simple XML Element.
118 | *
119 | * @return static
120 | */
121 | public static function fromSimpleXML(\SimpleXMLElement $element)
122 | {
123 | return new static(
124 | (int) $element->id,
125 | (string) $element->name
126 | );
127 | }
128 | }
129 | ```
130 |
131 | Now when we create our client, lets just pass the FQCN to the clients classmap and casting will be automated.
132 |
133 | ```php
134 | $stream = new \TBPixel\XMLStreamer\Streams\FileReaderStream('users.xml');
135 | $client = new \TBPixel\XMLStreamer\Client($stream, [
136 | 'user' => User::class,
137 | ]);
138 |
139 | foreach ($client->iterate() as $user) {
140 | // Work with the User object.
141 | }
142 |
143 | $client->close();
144 | ```
145 |
146 | The clients second argument is an array of key value pairs mapping the XML element names to the FQCN.
147 |
148 | ## Extending
149 |
150 | Both the client and the streams are built ontop of PSR-7's `Psr\Http\Message\StreamInterface`, meaning it should be possible for you to swap out the stream with your own implementation. If you plan to use `XMLReader` but want a different resource handler, the `TBPixel\XMLStreamer\ReaderStream` is an abstract implementation which expects to process XML streams via XMLReader and handles most functionality well.
151 |
152 | ## Contributing
153 |
154 | Please see [CONTRIBUTING](CONTRIBUTING.md) for details.
155 |
156 | ### Changelog
157 |
158 | Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.
159 |
160 | ### Support Me
161 |
162 | Hi! I'm a developer living in Vancouver, BC and boy is the housing market tough. If you wanna support me, consider following me on [Twitter @TBPixel](https://twitter.com/TBPixel), or consider [buying me a coffee](https://ko-fi.com/tbpixel).
163 |
164 | ## License
165 |
166 | The MIT License (MIT). Please see [License File](LICENSE) for more information.
167 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tbpixel/xml-streamer",
3 | "description": "Stream XML data and cast types to a provided classmap.",
4 | "type": "library",
5 | "license": "MIT",
6 | "authors": [
7 | {
8 | "name": "Tony Barry",
9 | "email": "tonympbarry@gmail.com"
10 | }
11 | ],
12 | "autoload": {
13 | "psr-4": {
14 | "TBPixel\\XMLStreamer\\": "src/"
15 | }
16 | },
17 | "autoload-dev": {
18 | "psr-4": {
19 | "TBPixel\\XMLStreamer\\Tests\\": "tests/"
20 | }
21 | },
22 | "require": {
23 | "php": "^7.2",
24 | "psr/http-message": "^1.0"
25 | },
26 | "require-dev": {
27 | "phpunit/phpunit": "^8.0",
28 | "friendsofphp/php-cs-fixer": "^2.14",
29 | "phpstan/phpstan": "^0.11.1",
30 | "symfony/var-dumper": "^4.2",
31 | "infection/infection": "^0.12.2"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/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": "af825d0d591f127949d3fe09b06b43e8",
8 | "packages": [
9 | {
10 | "name": "psr/http-message",
11 | "version": "1.0.1",
12 | "source": {
13 | "type": "git",
14 | "url": "https://github.com/php-fig/http-message.git",
15 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
16 | },
17 | "dist": {
18 | "type": "zip",
19 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
20 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
21 | "shasum": ""
22 | },
23 | "require": {
24 | "php": ">=5.3.0"
25 | },
26 | "type": "library",
27 | "extra": {
28 | "branch-alias": {
29 | "dev-master": "1.0.x-dev"
30 | }
31 | },
32 | "autoload": {
33 | "psr-4": {
34 | "Psr\\Http\\Message\\": "src/"
35 | }
36 | },
37 | "notification-url": "https://packagist.org/downloads/",
38 | "license": [
39 | "MIT"
40 | ],
41 | "authors": [
42 | {
43 | "name": "PHP-FIG",
44 | "homepage": "http://www.php-fig.org/"
45 | }
46 | ],
47 | "description": "Common interface for HTTP messages",
48 | "homepage": "https://github.com/php-fig/http-message",
49 | "keywords": [
50 | "http",
51 | "http-message",
52 | "psr",
53 | "psr-7",
54 | "request",
55 | "response"
56 | ],
57 | "time": "2016-08-06T14:39:51+00:00"
58 | }
59 | ],
60 | "packages-dev": [
61 | {
62 | "name": "composer/ca-bundle",
63 | "version": "1.1.4",
64 | "source": {
65 | "type": "git",
66 | "url": "https://github.com/composer/ca-bundle.git",
67 | "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d"
68 | },
69 | "dist": {
70 | "type": "zip",
71 | "url": "https://api.github.com/repos/composer/ca-bundle/zipball/558f321c52faeb4828c03e7dc0cfe39a09e09a2d",
72 | "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d",
73 | "shasum": ""
74 | },
75 | "require": {
76 | "ext-openssl": "*",
77 | "ext-pcre": "*",
78 | "php": "^5.3.2 || ^7.0"
79 | },
80 | "require-dev": {
81 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
82 | "psr/log": "^1.0",
83 | "symfony/process": "^2.5 || ^3.0 || ^4.0"
84 | },
85 | "type": "library",
86 | "extra": {
87 | "branch-alias": {
88 | "dev-master": "1.x-dev"
89 | }
90 | },
91 | "autoload": {
92 | "psr-4": {
93 | "Composer\\CaBundle\\": "src"
94 | }
95 | },
96 | "notification-url": "https://packagist.org/downloads/",
97 | "license": [
98 | "MIT"
99 | ],
100 | "authors": [
101 | {
102 | "name": "Jordi Boggiano",
103 | "email": "j.boggiano@seld.be",
104 | "homepage": "http://seld.be"
105 | }
106 | ],
107 | "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
108 | "keywords": [
109 | "cabundle",
110 | "cacert",
111 | "certificate",
112 | "ssl",
113 | "tls"
114 | ],
115 | "time": "2019-01-28T09:30:10+00:00"
116 | },
117 | {
118 | "name": "composer/semver",
119 | "version": "1.4.2",
120 | "source": {
121 | "type": "git",
122 | "url": "https://github.com/composer/semver.git",
123 | "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573"
124 | },
125 | "dist": {
126 | "type": "zip",
127 | "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573",
128 | "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573",
129 | "shasum": ""
130 | },
131 | "require": {
132 | "php": "^5.3.2 || ^7.0"
133 | },
134 | "require-dev": {
135 | "phpunit/phpunit": "^4.5 || ^5.0.5",
136 | "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
137 | },
138 | "type": "library",
139 | "extra": {
140 | "branch-alias": {
141 | "dev-master": "1.x-dev"
142 | }
143 | },
144 | "autoload": {
145 | "psr-4": {
146 | "Composer\\Semver\\": "src"
147 | }
148 | },
149 | "notification-url": "https://packagist.org/downloads/",
150 | "license": [
151 | "MIT"
152 | ],
153 | "authors": [
154 | {
155 | "name": "Nils Adermann",
156 | "email": "naderman@naderman.de",
157 | "homepage": "http://www.naderman.de"
158 | },
159 | {
160 | "name": "Jordi Boggiano",
161 | "email": "j.boggiano@seld.be",
162 | "homepage": "http://seld.be"
163 | },
164 | {
165 | "name": "Rob Bast",
166 | "email": "rob.bast@gmail.com",
167 | "homepage": "http://robbast.nl"
168 | }
169 | ],
170 | "description": "Semver library that offers utilities, version constraint parsing and validation.",
171 | "keywords": [
172 | "semantic",
173 | "semver",
174 | "validation",
175 | "versioning"
176 | ],
177 | "time": "2016-08-30T16:08:34+00:00"
178 | },
179 | {
180 | "name": "composer/xdebug-handler",
181 | "version": "1.3.2",
182 | "source": {
183 | "type": "git",
184 | "url": "https://github.com/composer/xdebug-handler.git",
185 | "reference": "d17708133b6c276d6e42ef887a877866b909d892"
186 | },
187 | "dist": {
188 | "type": "zip",
189 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/d17708133b6c276d6e42ef887a877866b909d892",
190 | "reference": "d17708133b6c276d6e42ef887a877866b909d892",
191 | "shasum": ""
192 | },
193 | "require": {
194 | "php": "^5.3.2 || ^7.0",
195 | "psr/log": "^1.0"
196 | },
197 | "require-dev": {
198 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
199 | },
200 | "type": "library",
201 | "autoload": {
202 | "psr-4": {
203 | "Composer\\XdebugHandler\\": "src"
204 | }
205 | },
206 | "notification-url": "https://packagist.org/downloads/",
207 | "license": [
208 | "MIT"
209 | ],
210 | "authors": [
211 | {
212 | "name": "John Stevenson",
213 | "email": "john-stevenson@blueyonder.co.uk"
214 | }
215 | ],
216 | "description": "Restarts a process without xdebug.",
217 | "keywords": [
218 | "Xdebug",
219 | "performance"
220 | ],
221 | "time": "2019-01-28T20:25:53+00:00"
222 | },
223 | {
224 | "name": "doctrine/annotations",
225 | "version": "v1.6.0",
226 | "source": {
227 | "type": "git",
228 | "url": "https://github.com/doctrine/annotations.git",
229 | "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5"
230 | },
231 | "dist": {
232 | "type": "zip",
233 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5",
234 | "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5",
235 | "shasum": ""
236 | },
237 | "require": {
238 | "doctrine/lexer": "1.*",
239 | "php": "^7.1"
240 | },
241 | "require-dev": {
242 | "doctrine/cache": "1.*",
243 | "phpunit/phpunit": "^6.4"
244 | },
245 | "type": "library",
246 | "extra": {
247 | "branch-alias": {
248 | "dev-master": "1.6.x-dev"
249 | }
250 | },
251 | "autoload": {
252 | "psr-4": {
253 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
254 | }
255 | },
256 | "notification-url": "https://packagist.org/downloads/",
257 | "license": [
258 | "MIT"
259 | ],
260 | "authors": [
261 | {
262 | "name": "Roman Borschel",
263 | "email": "roman@code-factory.org"
264 | },
265 | {
266 | "name": "Benjamin Eberlei",
267 | "email": "kontakt@beberlei.de"
268 | },
269 | {
270 | "name": "Guilherme Blanco",
271 | "email": "guilhermeblanco@gmail.com"
272 | },
273 | {
274 | "name": "Jonathan Wage",
275 | "email": "jonwage@gmail.com"
276 | },
277 | {
278 | "name": "Johannes Schmitt",
279 | "email": "schmittjoh@gmail.com"
280 | }
281 | ],
282 | "description": "Docblock Annotations Parser",
283 | "homepage": "http://www.doctrine-project.org",
284 | "keywords": [
285 | "annotations",
286 | "docblock",
287 | "parser"
288 | ],
289 | "time": "2017-12-06T07:11:42+00:00"
290 | },
291 | {
292 | "name": "doctrine/instantiator",
293 | "version": "1.1.0",
294 | "source": {
295 | "type": "git",
296 | "url": "https://github.com/doctrine/instantiator.git",
297 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"
298 | },
299 | "dist": {
300 | "type": "zip",
301 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
302 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
303 | "shasum": ""
304 | },
305 | "require": {
306 | "php": "^7.1"
307 | },
308 | "require-dev": {
309 | "athletic/athletic": "~0.1.8",
310 | "ext-pdo": "*",
311 | "ext-phar": "*",
312 | "phpunit/phpunit": "^6.2.3",
313 | "squizlabs/php_codesniffer": "^3.0.2"
314 | },
315 | "type": "library",
316 | "extra": {
317 | "branch-alias": {
318 | "dev-master": "1.2.x-dev"
319 | }
320 | },
321 | "autoload": {
322 | "psr-4": {
323 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
324 | }
325 | },
326 | "notification-url": "https://packagist.org/downloads/",
327 | "license": [
328 | "MIT"
329 | ],
330 | "authors": [
331 | {
332 | "name": "Marco Pivetta",
333 | "email": "ocramius@gmail.com",
334 | "homepage": "http://ocramius.github.com/"
335 | }
336 | ],
337 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
338 | "homepage": "https://github.com/doctrine/instantiator",
339 | "keywords": [
340 | "constructor",
341 | "instantiate"
342 | ],
343 | "time": "2017-07-22T11:58:36+00:00"
344 | },
345 | {
346 | "name": "doctrine/lexer",
347 | "version": "v1.0.1",
348 | "source": {
349 | "type": "git",
350 | "url": "https://github.com/doctrine/lexer.git",
351 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c"
352 | },
353 | "dist": {
354 | "type": "zip",
355 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c",
356 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c",
357 | "shasum": ""
358 | },
359 | "require": {
360 | "php": ">=5.3.2"
361 | },
362 | "type": "library",
363 | "extra": {
364 | "branch-alias": {
365 | "dev-master": "1.0.x-dev"
366 | }
367 | },
368 | "autoload": {
369 | "psr-0": {
370 | "Doctrine\\Common\\Lexer\\": "lib/"
371 | }
372 | },
373 | "notification-url": "https://packagist.org/downloads/",
374 | "license": [
375 | "MIT"
376 | ],
377 | "authors": [
378 | {
379 | "name": "Roman Borschel",
380 | "email": "roman@code-factory.org"
381 | },
382 | {
383 | "name": "Guilherme Blanco",
384 | "email": "guilhermeblanco@gmail.com"
385 | },
386 | {
387 | "name": "Johannes Schmitt",
388 | "email": "schmittjoh@gmail.com"
389 | }
390 | ],
391 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
392 | "homepage": "http://www.doctrine-project.org",
393 | "keywords": [
394 | "lexer",
395 | "parser"
396 | ],
397 | "time": "2014-09-09T13:34:57+00:00"
398 | },
399 | {
400 | "name": "friendsofphp/php-cs-fixer",
401 | "version": "v2.14.0",
402 | "source": {
403 | "type": "git",
404 | "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
405 | "reference": "b788ea0af899cedc8114dca7db119c93b6685da2"
406 | },
407 | "dist": {
408 | "type": "zip",
409 | "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/b788ea0af899cedc8114dca7db119c93b6685da2",
410 | "reference": "b788ea0af899cedc8114dca7db119c93b6685da2",
411 | "shasum": ""
412 | },
413 | "require": {
414 | "composer/semver": "^1.4",
415 | "composer/xdebug-handler": "^1.2",
416 | "doctrine/annotations": "^1.2",
417 | "ext-json": "*",
418 | "ext-tokenizer": "*",
419 | "php": "^5.6 || ^7.0",
420 | "php-cs-fixer/diff": "^1.3",
421 | "symfony/console": "^3.4.17 || ^4.1.6",
422 | "symfony/event-dispatcher": "^3.0 || ^4.0",
423 | "symfony/filesystem": "^3.0 || ^4.0",
424 | "symfony/finder": "^3.0 || ^4.0",
425 | "symfony/options-resolver": "^3.0 || ^4.0",
426 | "symfony/polyfill-php70": "^1.0",
427 | "symfony/polyfill-php72": "^1.4",
428 | "symfony/process": "^3.0 || ^4.0",
429 | "symfony/stopwatch": "^3.0 || ^4.0"
430 | },
431 | "conflict": {
432 | "hhvm": "*"
433 | },
434 | "require-dev": {
435 | "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0",
436 | "justinrainbow/json-schema": "^5.0",
437 | "keradus/cli-executor": "^1.2",
438 | "mikey179/vfsstream": "^1.6",
439 | "php-coveralls/php-coveralls": "^2.1",
440 | "php-cs-fixer/accessible-object": "^1.0",
441 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.0.1",
442 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.0.1",
443 | "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1",
444 | "phpunitgoodpractices/traits": "^1.5.1",
445 | "symfony/phpunit-bridge": "^4.0"
446 | },
447 | "suggest": {
448 | "ext-mbstring": "For handling non-UTF8 characters in cache signature.",
449 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.",
450 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.",
451 | "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible."
452 | },
453 | "bin": [
454 | "php-cs-fixer"
455 | ],
456 | "type": "application",
457 | "extra": {
458 | "branch-alias": {
459 | "dev-master": "2.14-dev"
460 | }
461 | },
462 | "autoload": {
463 | "psr-4": {
464 | "PhpCsFixer\\": "src/"
465 | },
466 | "classmap": [
467 | "tests/Test/AbstractFixerTestCase.php",
468 | "tests/Test/AbstractIntegrationCaseFactory.php",
469 | "tests/Test/AbstractIntegrationTestCase.php",
470 | "tests/Test/Assert/AssertTokensTrait.php",
471 | "tests/Test/IntegrationCase.php",
472 | "tests/Test/IntegrationCaseFactory.php",
473 | "tests/Test/IntegrationCaseFactoryInterface.php",
474 | "tests/Test/InternalIntegrationCaseFactory.php",
475 | "tests/TestCase.php"
476 | ]
477 | },
478 | "notification-url": "https://packagist.org/downloads/",
479 | "license": [
480 | "MIT"
481 | ],
482 | "authors": [
483 | {
484 | "name": "Dariusz Rumiński",
485 | "email": "dariusz.ruminski@gmail.com"
486 | },
487 | {
488 | "name": "Fabien Potencier",
489 | "email": "fabien@symfony.com"
490 | }
491 | ],
492 | "description": "A tool to automatically fix PHP code style",
493 | "time": "2019-01-04T18:29:47+00:00"
494 | },
495 | {
496 | "name": "infection/infection",
497 | "version": "0.12.2",
498 | "source": {
499 | "type": "git",
500 | "url": "https://github.com/infection/infection.git",
501 | "reference": "0c028b4b69bbead4b9d6702b36c0d25b9e016785"
502 | },
503 | "dist": {
504 | "type": "zip",
505 | "url": "https://api.github.com/repos/infection/infection/zipball/0c028b4b69bbead4b9d6702b36c0d25b9e016785",
506 | "reference": "0c028b4b69bbead4b9d6702b36c0d25b9e016785",
507 | "shasum": ""
508 | },
509 | "require": {
510 | "composer/xdebug-handler": "^1.3",
511 | "ext-dom": "*",
512 | "ext-json": "*",
513 | "ext-libxml": "*",
514 | "justinrainbow/json-schema": "^5.2",
515 | "nikic/php-parser": "^4.1",
516 | "ocramius/package-versions": "^1.2",
517 | "padraic/phar-updater": "^1.0.4",
518 | "php": "^7.1.3",
519 | "pimple/pimple": "^3.2",
520 | "sebastian/diff": "^1.4 || ^2.0 || ^3.0",
521 | "symfony/console": "^3.4 || ^4.0",
522 | "symfony/filesystem": "^3.4 || ^4.0",
523 | "symfony/finder": "^3.4 || ^4.0",
524 | "symfony/process": "^3.4|| ^4.0",
525 | "symfony/yaml": "^3.4 || ^4.0",
526 | "webmozart/assert": "^1.3"
527 | },
528 | "conflict": {
529 | "symfony/console": "=3.4.16 || =4.1.5",
530 | "symfony/process": "3.4.2"
531 | },
532 | "require-dev": {
533 | "phpunit/phpunit": "^6.2"
534 | },
535 | "bin": [
536 | "bin/infection"
537 | ],
538 | "type": "library",
539 | "autoload": {
540 | "psr-4": {
541 | "Infection\\": "src/"
542 | }
543 | },
544 | "notification-url": "https://packagist.org/downloads/",
545 | "license": [
546 | "BSD-3-Clause"
547 | ],
548 | "authors": [
549 | {
550 | "name": "Maks Rafalko",
551 | "email": "maks.rafalko@gmail.com",
552 | "homepage": "https://twitter.com/maks_rafalko"
553 | },
554 | {
555 | "name": "Gert de Pagter",
556 | "homepage": "https://github.com/BackEndTea"
557 | },
558 | {
559 | "name": "Théo FIDRY",
560 | "email": "theo.fidry@gmail.com",
561 | "homepage": "https://twitter.com/tfidry"
562 | },
563 | {
564 | "name": "Oleg Zhulnev",
565 | "homepage": "https://github.com/sidz"
566 | },
567 | {
568 | "name": "Alexey Kopytko",
569 | "email": "alexey@kopytko.com",
570 | "homepage": "https://www.alexeykopytko.com"
571 | }
572 | ],
573 | "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.",
574 | "keywords": [
575 | "coverage",
576 | "mutant",
577 | "mutation framework",
578 | "mutation testing",
579 | "testing",
580 | "unit testing"
581 | ],
582 | "time": "2019-02-10T18:24:30+00:00"
583 | },
584 | {
585 | "name": "jean85/pretty-package-versions",
586 | "version": "1.2",
587 | "source": {
588 | "type": "git",
589 | "url": "https://github.com/Jean85/pretty-package-versions.git",
590 | "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48"
591 | },
592 | "dist": {
593 | "type": "zip",
594 | "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/75c7effcf3f77501d0e0caa75111aff4daa0dd48",
595 | "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48",
596 | "shasum": ""
597 | },
598 | "require": {
599 | "ocramius/package-versions": "^1.2.0",
600 | "php": "^7.0"
601 | },
602 | "require-dev": {
603 | "phpunit/phpunit": "^6.0"
604 | },
605 | "type": "library",
606 | "extra": {
607 | "branch-alias": {
608 | "dev-master": "1.x-dev"
609 | }
610 | },
611 | "autoload": {
612 | "psr-4": {
613 | "Jean85\\": "src/"
614 | }
615 | },
616 | "notification-url": "https://packagist.org/downloads/",
617 | "license": [
618 | "MIT"
619 | ],
620 | "authors": [
621 | {
622 | "name": "Alessandro Lai",
623 | "email": "alessandro.lai85@gmail.com"
624 | }
625 | ],
626 | "description": "A wrapper for ocramius/package-versions to get pretty versions strings",
627 | "keywords": [
628 | "composer",
629 | "package",
630 | "release",
631 | "versions"
632 | ],
633 | "time": "2018-06-13T13:22:40+00:00"
634 | },
635 | {
636 | "name": "justinrainbow/json-schema",
637 | "version": "5.2.8",
638 | "source": {
639 | "type": "git",
640 | "url": "https://github.com/justinrainbow/json-schema.git",
641 | "reference": "dcb6e1006bb5fd1e392b4daa68932880f37550d4"
642 | },
643 | "dist": {
644 | "type": "zip",
645 | "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/dcb6e1006bb5fd1e392b4daa68932880f37550d4",
646 | "reference": "dcb6e1006bb5fd1e392b4daa68932880f37550d4",
647 | "shasum": ""
648 | },
649 | "require": {
650 | "php": ">=5.3.3"
651 | },
652 | "require-dev": {
653 | "friendsofphp/php-cs-fixer": "~2.2.20",
654 | "json-schema/json-schema-test-suite": "1.2.0",
655 | "phpunit/phpunit": "^4.8.35"
656 | },
657 | "bin": [
658 | "bin/validate-json"
659 | ],
660 | "type": "library",
661 | "extra": {
662 | "branch-alias": {
663 | "dev-master": "5.0.x-dev"
664 | }
665 | },
666 | "autoload": {
667 | "psr-4": {
668 | "JsonSchema\\": "src/JsonSchema/"
669 | }
670 | },
671 | "notification-url": "https://packagist.org/downloads/",
672 | "license": [
673 | "MIT"
674 | ],
675 | "authors": [
676 | {
677 | "name": "Bruno Prieto Reis",
678 | "email": "bruno.p.reis@gmail.com"
679 | },
680 | {
681 | "name": "Justin Rainbow",
682 | "email": "justin.rainbow@gmail.com"
683 | },
684 | {
685 | "name": "Igor Wiedler",
686 | "email": "igor@wiedler.ch"
687 | },
688 | {
689 | "name": "Robert Schönthal",
690 | "email": "seroscho@googlemail.com"
691 | }
692 | ],
693 | "description": "A library to validate a json schema.",
694 | "homepage": "https://github.com/justinrainbow/json-schema",
695 | "keywords": [
696 | "json",
697 | "schema"
698 | ],
699 | "time": "2019-01-14T23:55:14+00:00"
700 | },
701 | {
702 | "name": "myclabs/deep-copy",
703 | "version": "1.8.1",
704 | "source": {
705 | "type": "git",
706 | "url": "https://github.com/myclabs/DeepCopy.git",
707 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8"
708 | },
709 | "dist": {
710 | "type": "zip",
711 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8",
712 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8",
713 | "shasum": ""
714 | },
715 | "require": {
716 | "php": "^7.1"
717 | },
718 | "replace": {
719 | "myclabs/deep-copy": "self.version"
720 | },
721 | "require-dev": {
722 | "doctrine/collections": "^1.0",
723 | "doctrine/common": "^2.6",
724 | "phpunit/phpunit": "^7.1"
725 | },
726 | "type": "library",
727 | "autoload": {
728 | "psr-4": {
729 | "DeepCopy\\": "src/DeepCopy/"
730 | },
731 | "files": [
732 | "src/DeepCopy/deep_copy.php"
733 | ]
734 | },
735 | "notification-url": "https://packagist.org/downloads/",
736 | "license": [
737 | "MIT"
738 | ],
739 | "description": "Create deep copies (clones) of your objects",
740 | "keywords": [
741 | "clone",
742 | "copy",
743 | "duplicate",
744 | "object",
745 | "object graph"
746 | ],
747 | "time": "2018-06-11T23:09:50+00:00"
748 | },
749 | {
750 | "name": "nette/bootstrap",
751 | "version": "v2.4.6",
752 | "source": {
753 | "type": "git",
754 | "url": "https://github.com/nette/bootstrap.git",
755 | "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543"
756 | },
757 | "dist": {
758 | "type": "zip",
759 | "url": "https://api.github.com/repos/nette/bootstrap/zipball/268816e3f1bb7426c3a4ceec2bd38a036b532543",
760 | "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543",
761 | "shasum": ""
762 | },
763 | "require": {
764 | "nette/di": "~2.4.7",
765 | "nette/utils": "~2.4",
766 | "php": ">=5.6.0"
767 | },
768 | "conflict": {
769 | "nette/nette": "<2.2"
770 | },
771 | "require-dev": {
772 | "latte/latte": "~2.2",
773 | "nette/application": "~2.3",
774 | "nette/caching": "~2.3",
775 | "nette/database": "~2.3",
776 | "nette/forms": "~2.3",
777 | "nette/http": "~2.4.0",
778 | "nette/mail": "~2.3",
779 | "nette/robot-loader": "^2.4.2 || ^3.0",
780 | "nette/safe-stream": "~2.2",
781 | "nette/security": "~2.3",
782 | "nette/tester": "~2.0",
783 | "tracy/tracy": "^2.4.1"
784 | },
785 | "suggest": {
786 | "nette/robot-loader": "to use Configurator::createRobotLoader()",
787 | "tracy/tracy": "to use Configurator::enableTracy()"
788 | },
789 | "type": "library",
790 | "extra": {
791 | "branch-alias": {
792 | "dev-master": "2.4-dev"
793 | }
794 | },
795 | "autoload": {
796 | "classmap": [
797 | "src/"
798 | ]
799 | },
800 | "notification-url": "https://packagist.org/downloads/",
801 | "license": [
802 | "BSD-3-Clause",
803 | "GPL-2.0",
804 | "GPL-3.0"
805 | ],
806 | "authors": [
807 | {
808 | "name": "David Grudl",
809 | "homepage": "https://davidgrudl.com"
810 | },
811 | {
812 | "name": "Nette Community",
813 | "homepage": "https://nette.org/contributors"
814 | }
815 | ],
816 | "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.",
817 | "homepage": "https://nette.org",
818 | "keywords": [
819 | "bootstrapping",
820 | "configurator",
821 | "nette"
822 | ],
823 | "time": "2018-05-17T12:52:20+00:00"
824 | },
825 | {
826 | "name": "nette/di",
827 | "version": "v2.4.15",
828 | "source": {
829 | "type": "git",
830 | "url": "https://github.com/nette/di.git",
831 | "reference": "d0561b8f77e8ef2ed6d83328860e16c81a5a8649"
832 | },
833 | "dist": {
834 | "type": "zip",
835 | "url": "https://api.github.com/repos/nette/di/zipball/d0561b8f77e8ef2ed6d83328860e16c81a5a8649",
836 | "reference": "d0561b8f77e8ef2ed6d83328860e16c81a5a8649",
837 | "shasum": ""
838 | },
839 | "require": {
840 | "ext-tokenizer": "*",
841 | "nette/neon": "^2.3.3 || ~3.0.0",
842 | "nette/php-generator": "^2.6.1 || ^3.0.0",
843 | "nette/utils": "^2.5.0 || ~3.0.0",
844 | "php": ">=5.6.0"
845 | },
846 | "conflict": {
847 | "nette/bootstrap": "<2.4",
848 | "nette/nette": "<2.2"
849 | },
850 | "require-dev": {
851 | "nette/tester": "^2.0",
852 | "tracy/tracy": "^2.3"
853 | },
854 | "type": "library",
855 | "extra": {
856 | "branch-alias": {
857 | "dev-master": "2.4-dev"
858 | }
859 | },
860 | "autoload": {
861 | "classmap": [
862 | "src/"
863 | ]
864 | },
865 | "notification-url": "https://packagist.org/downloads/",
866 | "license": [
867 | "BSD-3-Clause",
868 | "GPL-2.0",
869 | "GPL-3.0"
870 | ],
871 | "authors": [
872 | {
873 | "name": "David Grudl",
874 | "homepage": "https://davidgrudl.com"
875 | },
876 | {
877 | "name": "Nette Community",
878 | "homepage": "https://nette.org/contributors"
879 | }
880 | ],
881 | "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.",
882 | "homepage": "https://nette.org",
883 | "keywords": [
884 | "compiled",
885 | "di",
886 | "dic",
887 | "factory",
888 | "ioc",
889 | "nette",
890 | "static"
891 | ],
892 | "time": "2019-01-30T13:26:05+00:00"
893 | },
894 | {
895 | "name": "nette/finder",
896 | "version": "v2.4.2",
897 | "source": {
898 | "type": "git",
899 | "url": "https://github.com/nette/finder.git",
900 | "reference": "ee951a656cb8ac622e5dd33474a01fd2470505a0"
901 | },
902 | "dist": {
903 | "type": "zip",
904 | "url": "https://api.github.com/repos/nette/finder/zipball/ee951a656cb8ac622e5dd33474a01fd2470505a0",
905 | "reference": "ee951a656cb8ac622e5dd33474a01fd2470505a0",
906 | "shasum": ""
907 | },
908 | "require": {
909 | "nette/utils": "~2.4",
910 | "php": ">=5.6.0"
911 | },
912 | "conflict": {
913 | "nette/nette": "<2.2"
914 | },
915 | "require-dev": {
916 | "nette/tester": "~2.0",
917 | "tracy/tracy": "^2.3"
918 | },
919 | "type": "library",
920 | "extra": {
921 | "branch-alias": {
922 | "dev-master": "2.4-dev"
923 | }
924 | },
925 | "autoload": {
926 | "classmap": [
927 | "src/"
928 | ]
929 | },
930 | "notification-url": "https://packagist.org/downloads/",
931 | "license": [
932 | "BSD-3-Clause",
933 | "GPL-2.0",
934 | "GPL-3.0"
935 | ],
936 | "authors": [
937 | {
938 | "name": "David Grudl",
939 | "homepage": "https://davidgrudl.com"
940 | },
941 | {
942 | "name": "Nette Community",
943 | "homepage": "https://nette.org/contributors"
944 | }
945 | ],
946 | "description": "🔍 Nette Finder: find files and directories with an intuitive API.",
947 | "homepage": "https://nette.org",
948 | "keywords": [
949 | "filesystem",
950 | "glob",
951 | "iterator",
952 | "nette"
953 | ],
954 | "time": "2018-06-28T11:49:23+00:00"
955 | },
956 | {
957 | "name": "nette/neon",
958 | "version": "v2.4.3",
959 | "source": {
960 | "type": "git",
961 | "url": "https://github.com/nette/neon.git",
962 | "reference": "5e72b1dd3e2d34f0863c5561139a19df6a1ef398"
963 | },
964 | "dist": {
965 | "type": "zip",
966 | "url": "https://api.github.com/repos/nette/neon/zipball/5e72b1dd3e2d34f0863c5561139a19df6a1ef398",
967 | "reference": "5e72b1dd3e2d34f0863c5561139a19df6a1ef398",
968 | "shasum": ""
969 | },
970 | "require": {
971 | "ext-iconv": "*",
972 | "ext-json": "*",
973 | "php": ">=5.6.0"
974 | },
975 | "require-dev": {
976 | "nette/tester": "~2.0",
977 | "tracy/tracy": "^2.3"
978 | },
979 | "type": "library",
980 | "extra": {
981 | "branch-alias": {
982 | "dev-master": "2.4-dev"
983 | }
984 | },
985 | "autoload": {
986 | "classmap": [
987 | "src/"
988 | ]
989 | },
990 | "notification-url": "https://packagist.org/downloads/",
991 | "license": [
992 | "BSD-3-Clause",
993 | "GPL-2.0",
994 | "GPL-3.0"
995 | ],
996 | "authors": [
997 | {
998 | "name": "David Grudl",
999 | "homepage": "https://davidgrudl.com"
1000 | },
1001 | {
1002 | "name": "Nette Community",
1003 | "homepage": "https://nette.org/contributors"
1004 | }
1005 | ],
1006 | "description": "🍸 Nette NEON: encodes and decodes NEON file format.",
1007 | "homepage": "http://ne-on.org",
1008 | "keywords": [
1009 | "export",
1010 | "import",
1011 | "neon",
1012 | "nette",
1013 | "yaml"
1014 | ],
1015 | "time": "2018-03-21T12:12:21+00:00"
1016 | },
1017 | {
1018 | "name": "nette/php-generator",
1019 | "version": "v3.2.1",
1020 | "source": {
1021 | "type": "git",
1022 | "url": "https://github.com/nette/php-generator.git",
1023 | "reference": "9de4e093a130f7a1bd175198799ebc0efbac6924"
1024 | },
1025 | "dist": {
1026 | "type": "zip",
1027 | "url": "https://api.github.com/repos/nette/php-generator/zipball/9de4e093a130f7a1bd175198799ebc0efbac6924",
1028 | "reference": "9de4e093a130f7a1bd175198799ebc0efbac6924",
1029 | "shasum": ""
1030 | },
1031 | "require": {
1032 | "nette/utils": "^2.4.2 || ~3.0.0",
1033 | "php": ">=7.1"
1034 | },
1035 | "conflict": {
1036 | "nette/nette": "<2.2"
1037 | },
1038 | "require-dev": {
1039 | "nette/tester": "^2.0",
1040 | "tracy/tracy": "^2.3"
1041 | },
1042 | "type": "library",
1043 | "extra": {
1044 | "branch-alias": {
1045 | "dev-master": "3.2-dev"
1046 | }
1047 | },
1048 | "autoload": {
1049 | "classmap": [
1050 | "src/"
1051 | ]
1052 | },
1053 | "notification-url": "https://packagist.org/downloads/",
1054 | "license": [
1055 | "BSD-3-Clause",
1056 | "GPL-2.0",
1057 | "GPL-3.0"
1058 | ],
1059 | "authors": [
1060 | {
1061 | "name": "David Grudl",
1062 | "homepage": "https://davidgrudl.com"
1063 | },
1064 | {
1065 | "name": "Nette Community",
1066 | "homepage": "https://nette.org/contributors"
1067 | }
1068 | ],
1069 | "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.3 features.",
1070 | "homepage": "https://nette.org",
1071 | "keywords": [
1072 | "code",
1073 | "nette",
1074 | "php",
1075 | "scaffolding"
1076 | ],
1077 | "time": "2018-11-27T19:00:14+00:00"
1078 | },
1079 | {
1080 | "name": "nette/robot-loader",
1081 | "version": "v3.1.0",
1082 | "source": {
1083 | "type": "git",
1084 | "url": "https://github.com/nette/robot-loader.git",
1085 | "reference": "fc76c70e740b10f091e502b2e393d0be912f38d4"
1086 | },
1087 | "dist": {
1088 | "type": "zip",
1089 | "url": "https://api.github.com/repos/nette/robot-loader/zipball/fc76c70e740b10f091e502b2e393d0be912f38d4",
1090 | "reference": "fc76c70e740b10f091e502b2e393d0be912f38d4",
1091 | "shasum": ""
1092 | },
1093 | "require": {
1094 | "ext-tokenizer": "*",
1095 | "nette/finder": "^2.3 || ^3.0",
1096 | "nette/utils": "^2.4 || ^3.0",
1097 | "php": ">=5.6.0"
1098 | },
1099 | "conflict": {
1100 | "nette/nette": "<2.2"
1101 | },
1102 | "require-dev": {
1103 | "nette/tester": "^2.0",
1104 | "tracy/tracy": "^2.3"
1105 | },
1106 | "type": "library",
1107 | "extra": {
1108 | "branch-alias": {
1109 | "dev-master": "3.1-dev"
1110 | }
1111 | },
1112 | "autoload": {
1113 | "classmap": [
1114 | "src/"
1115 | ]
1116 | },
1117 | "notification-url": "https://packagist.org/downloads/",
1118 | "license": [
1119 | "BSD-3-Clause",
1120 | "GPL-2.0",
1121 | "GPL-3.0"
1122 | ],
1123 | "authors": [
1124 | {
1125 | "name": "David Grudl",
1126 | "homepage": "https://davidgrudl.com"
1127 | },
1128 | {
1129 | "name": "Nette Community",
1130 | "homepage": "https://nette.org/contributors"
1131 | }
1132 | ],
1133 | "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.",
1134 | "homepage": "https://nette.org",
1135 | "keywords": [
1136 | "autoload",
1137 | "class",
1138 | "interface",
1139 | "nette",
1140 | "trait"
1141 | ],
1142 | "time": "2018-08-13T14:19:06+00:00"
1143 | },
1144 | {
1145 | "name": "nette/utils",
1146 | "version": "v2.5.3",
1147 | "source": {
1148 | "type": "git",
1149 | "url": "https://github.com/nette/utils.git",
1150 | "reference": "17b9f76f2abd0c943adfb556e56f2165460b15ce"
1151 | },
1152 | "dist": {
1153 | "type": "zip",
1154 | "url": "https://api.github.com/repos/nette/utils/zipball/17b9f76f2abd0c943adfb556e56f2165460b15ce",
1155 | "reference": "17b9f76f2abd0c943adfb556e56f2165460b15ce",
1156 | "shasum": ""
1157 | },
1158 | "require": {
1159 | "php": ">=5.6.0"
1160 | },
1161 | "conflict": {
1162 | "nette/nette": "<2.2"
1163 | },
1164 | "require-dev": {
1165 | "nette/tester": "~2.0",
1166 | "tracy/tracy": "^2.3"
1167 | },
1168 | "suggest": {
1169 | "ext-gd": "to use Image",
1170 | "ext-iconv": "to use Strings::webalize() and toAscii()",
1171 | "ext-intl": "for script transliteration in Strings::webalize() and toAscii()",
1172 | "ext-json": "to use Nette\\Utils\\Json",
1173 | "ext-mbstring": "to use Strings::lower() etc...",
1174 | "ext-xml": "to use Strings::length() etc. when mbstring is not available"
1175 | },
1176 | "type": "library",
1177 | "extra": {
1178 | "branch-alias": {
1179 | "dev-master": "2.5-dev"
1180 | }
1181 | },
1182 | "autoload": {
1183 | "classmap": [
1184 | "src/"
1185 | ],
1186 | "files": [
1187 | "src/loader.php"
1188 | ]
1189 | },
1190 | "notification-url": "https://packagist.org/downloads/",
1191 | "license": [
1192 | "BSD-3-Clause",
1193 | "GPL-2.0",
1194 | "GPL-3.0"
1195 | ],
1196 | "authors": [
1197 | {
1198 | "name": "David Grudl",
1199 | "homepage": "https://davidgrudl.com"
1200 | },
1201 | {
1202 | "name": "Nette Community",
1203 | "homepage": "https://nette.org/contributors"
1204 | }
1205 | ],
1206 | "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
1207 | "homepage": "https://nette.org",
1208 | "keywords": [
1209 | "array",
1210 | "core",
1211 | "datetime",
1212 | "images",
1213 | "json",
1214 | "nette",
1215 | "paginator",
1216 | "password",
1217 | "slugify",
1218 | "string",
1219 | "unicode",
1220 | "utf-8",
1221 | "utility",
1222 | "validation"
1223 | ],
1224 | "time": "2018-09-18T10:22:16+00:00"
1225 | },
1226 | {
1227 | "name": "nikic/php-parser",
1228 | "version": "v4.2.0",
1229 | "source": {
1230 | "type": "git",
1231 | "url": "https://github.com/nikic/PHP-Parser.git",
1232 | "reference": "594bcae1fc0bccd3993d2f0d61a018e26ac2865a"
1233 | },
1234 | "dist": {
1235 | "type": "zip",
1236 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/594bcae1fc0bccd3993d2f0d61a018e26ac2865a",
1237 | "reference": "594bcae1fc0bccd3993d2f0d61a018e26ac2865a",
1238 | "shasum": ""
1239 | },
1240 | "require": {
1241 | "ext-tokenizer": "*",
1242 | "php": ">=7.0"
1243 | },
1244 | "require-dev": {
1245 | "phpunit/phpunit": "^6.5 || ^7.0"
1246 | },
1247 | "bin": [
1248 | "bin/php-parse"
1249 | ],
1250 | "type": "library",
1251 | "extra": {
1252 | "branch-alias": {
1253 | "dev-master": "4.2-dev"
1254 | }
1255 | },
1256 | "autoload": {
1257 | "psr-4": {
1258 | "PhpParser\\": "lib/PhpParser"
1259 | }
1260 | },
1261 | "notification-url": "https://packagist.org/downloads/",
1262 | "license": [
1263 | "BSD-3-Clause"
1264 | ],
1265 | "authors": [
1266 | {
1267 | "name": "Nikita Popov"
1268 | }
1269 | ],
1270 | "description": "A PHP parser written in PHP",
1271 | "keywords": [
1272 | "parser",
1273 | "php"
1274 | ],
1275 | "time": "2019-01-12T16:31:37+00:00"
1276 | },
1277 | {
1278 | "name": "ocramius/package-versions",
1279 | "version": "1.3.0",
1280 | "source": {
1281 | "type": "git",
1282 | "url": "https://github.com/Ocramius/PackageVersions.git",
1283 | "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f"
1284 | },
1285 | "dist": {
1286 | "type": "zip",
1287 | "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f",
1288 | "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f",
1289 | "shasum": ""
1290 | },
1291 | "require": {
1292 | "composer-plugin-api": "^1.0.0",
1293 | "php": "^7.1.0"
1294 | },
1295 | "require-dev": {
1296 | "composer/composer": "^1.6.3",
1297 | "ext-zip": "*",
1298 | "infection/infection": "^0.7.1",
1299 | "phpunit/phpunit": "^7.0.0"
1300 | },
1301 | "type": "composer-plugin",
1302 | "extra": {
1303 | "class": "PackageVersions\\Installer",
1304 | "branch-alias": {
1305 | "dev-master": "2.0.x-dev"
1306 | }
1307 | },
1308 | "autoload": {
1309 | "psr-4": {
1310 | "PackageVersions\\": "src/PackageVersions"
1311 | }
1312 | },
1313 | "notification-url": "https://packagist.org/downloads/",
1314 | "license": [
1315 | "MIT"
1316 | ],
1317 | "authors": [
1318 | {
1319 | "name": "Marco Pivetta",
1320 | "email": "ocramius@gmail.com"
1321 | }
1322 | ],
1323 | "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
1324 | "time": "2018-02-05T13:05:30+00:00"
1325 | },
1326 | {
1327 | "name": "padraic/humbug_get_contents",
1328 | "version": "1.1.2",
1329 | "source": {
1330 | "type": "git",
1331 | "url": "https://github.com/humbug/file_get_contents.git",
1332 | "reference": "dcb086060c9dd6b2f51d8f7a895500307110b7a7"
1333 | },
1334 | "dist": {
1335 | "type": "zip",
1336 | "url": "https://api.github.com/repos/humbug/file_get_contents/zipball/dcb086060c9dd6b2f51d8f7a895500307110b7a7",
1337 | "reference": "dcb086060c9dd6b2f51d8f7a895500307110b7a7",
1338 | "shasum": ""
1339 | },
1340 | "require": {
1341 | "composer/ca-bundle": "^1.0",
1342 | "ext-openssl": "*",
1343 | "php": "^5.3 || ^7.0 || ^7.1 || ^7.2"
1344 | },
1345 | "require-dev": {
1346 | "bamarni/composer-bin-plugin": "^1.1",
1347 | "mikey179/vfsstream": "^1.6",
1348 | "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5"
1349 | },
1350 | "type": "library",
1351 | "extra": {
1352 | "bamarni-bin": {
1353 | "bin-links": false
1354 | },
1355 | "branch-alias": {
1356 | "dev-master": "2.0-dev"
1357 | }
1358 | },
1359 | "autoload": {
1360 | "psr-4": {
1361 | "Humbug\\": "src/"
1362 | },
1363 | "files": [
1364 | "src/function.php",
1365 | "src/functions.php"
1366 | ]
1367 | },
1368 | "notification-url": "https://packagist.org/downloads/",
1369 | "license": [
1370 | "BSD-3-Clause"
1371 | ],
1372 | "authors": [
1373 | {
1374 | "name": "Pádraic Brady",
1375 | "email": "padraic.brady@gmail.com",
1376 | "homepage": "http://blog.astrumfutura.com"
1377 | },
1378 | {
1379 | "name": "Théo FIDRY",
1380 | "email": "theo.fidry@gmail.com"
1381 | }
1382 | ],
1383 | "description": "Secure wrapper for accessing HTTPS resources with file_get_contents for PHP 5.3+",
1384 | "homepage": "https://github.com/padraic/file_get_contents",
1385 | "keywords": [
1386 | "download",
1387 | "file_get_contents",
1388 | "http",
1389 | "https",
1390 | "ssl",
1391 | "tls"
1392 | ],
1393 | "time": "2018-02-12T18:47:17+00:00"
1394 | },
1395 | {
1396 | "name": "padraic/phar-updater",
1397 | "version": "v1.0.6",
1398 | "source": {
1399 | "type": "git",
1400 | "url": "https://github.com/humbug/phar-updater.git",
1401 | "reference": "d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1"
1402 | },
1403 | "dist": {
1404 | "type": "zip",
1405 | "url": "https://api.github.com/repos/humbug/phar-updater/zipball/d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1",
1406 | "reference": "d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1",
1407 | "shasum": ""
1408 | },
1409 | "require": {
1410 | "padraic/humbug_get_contents": "^1.0",
1411 | "php": ">=5.3.3"
1412 | },
1413 | "require-dev": {
1414 | "phpunit/phpunit": "~4.0"
1415 | },
1416 | "type": "library",
1417 | "extra": {
1418 | "branch-alias": {
1419 | "dev-master": "1.0-dev"
1420 | }
1421 | },
1422 | "autoload": {
1423 | "psr-4": {
1424 | "Humbug\\SelfUpdate\\": "src/"
1425 | }
1426 | },
1427 | "notification-url": "https://packagist.org/downloads/",
1428 | "license": [
1429 | "BSD-3-Clause"
1430 | ],
1431 | "authors": [
1432 | {
1433 | "name": "Pádraic Brady",
1434 | "email": "padraic.brady@gmail.com",
1435 | "homepage": "http://blog.astrumfutura.com"
1436 | }
1437 | ],
1438 | "description": "A thing to make PHAR self-updating easy and secure.",
1439 | "keywords": [
1440 | "humbug",
1441 | "phar",
1442 | "self-update",
1443 | "update"
1444 | ],
1445 | "time": "2018-03-30T12:52:15+00:00"
1446 | },
1447 | {
1448 | "name": "paragonie/random_compat",
1449 | "version": "v9.99.99",
1450 | "source": {
1451 | "type": "git",
1452 | "url": "https://github.com/paragonie/random_compat.git",
1453 | "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
1454 | },
1455 | "dist": {
1456 | "type": "zip",
1457 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
1458 | "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
1459 | "shasum": ""
1460 | },
1461 | "require": {
1462 | "php": "^7"
1463 | },
1464 | "require-dev": {
1465 | "phpunit/phpunit": "4.*|5.*",
1466 | "vimeo/psalm": "^1"
1467 | },
1468 | "suggest": {
1469 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
1470 | },
1471 | "type": "library",
1472 | "notification-url": "https://packagist.org/downloads/",
1473 | "license": [
1474 | "MIT"
1475 | ],
1476 | "authors": [
1477 | {
1478 | "name": "Paragon Initiative Enterprises",
1479 | "email": "security@paragonie.com",
1480 | "homepage": "https://paragonie.com"
1481 | }
1482 | ],
1483 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
1484 | "keywords": [
1485 | "csprng",
1486 | "polyfill",
1487 | "pseudorandom",
1488 | "random"
1489 | ],
1490 | "time": "2018-07-02T15:55:56+00:00"
1491 | },
1492 | {
1493 | "name": "phar-io/manifest",
1494 | "version": "1.0.3",
1495 | "source": {
1496 | "type": "git",
1497 | "url": "https://github.com/phar-io/manifest.git",
1498 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
1499 | },
1500 | "dist": {
1501 | "type": "zip",
1502 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
1503 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
1504 | "shasum": ""
1505 | },
1506 | "require": {
1507 | "ext-dom": "*",
1508 | "ext-phar": "*",
1509 | "phar-io/version": "^2.0",
1510 | "php": "^5.6 || ^7.0"
1511 | },
1512 | "type": "library",
1513 | "extra": {
1514 | "branch-alias": {
1515 | "dev-master": "1.0.x-dev"
1516 | }
1517 | },
1518 | "autoload": {
1519 | "classmap": [
1520 | "src/"
1521 | ]
1522 | },
1523 | "notification-url": "https://packagist.org/downloads/",
1524 | "license": [
1525 | "BSD-3-Clause"
1526 | ],
1527 | "authors": [
1528 | {
1529 | "name": "Arne Blankerts",
1530 | "email": "arne@blankerts.de",
1531 | "role": "Developer"
1532 | },
1533 | {
1534 | "name": "Sebastian Heuer",
1535 | "email": "sebastian@phpeople.de",
1536 | "role": "Developer"
1537 | },
1538 | {
1539 | "name": "Sebastian Bergmann",
1540 | "email": "sebastian@phpunit.de",
1541 | "role": "Developer"
1542 | }
1543 | ],
1544 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
1545 | "time": "2018-07-08T19:23:20+00:00"
1546 | },
1547 | {
1548 | "name": "phar-io/version",
1549 | "version": "2.0.1",
1550 | "source": {
1551 | "type": "git",
1552 | "url": "https://github.com/phar-io/version.git",
1553 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
1554 | },
1555 | "dist": {
1556 | "type": "zip",
1557 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
1558 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
1559 | "shasum": ""
1560 | },
1561 | "require": {
1562 | "php": "^5.6 || ^7.0"
1563 | },
1564 | "type": "library",
1565 | "autoload": {
1566 | "classmap": [
1567 | "src/"
1568 | ]
1569 | },
1570 | "notification-url": "https://packagist.org/downloads/",
1571 | "license": [
1572 | "BSD-3-Clause"
1573 | ],
1574 | "authors": [
1575 | {
1576 | "name": "Arne Blankerts",
1577 | "email": "arne@blankerts.de",
1578 | "role": "Developer"
1579 | },
1580 | {
1581 | "name": "Sebastian Heuer",
1582 | "email": "sebastian@phpeople.de",
1583 | "role": "Developer"
1584 | },
1585 | {
1586 | "name": "Sebastian Bergmann",
1587 | "email": "sebastian@phpunit.de",
1588 | "role": "Developer"
1589 | }
1590 | ],
1591 | "description": "Library for handling version information and constraints",
1592 | "time": "2018-07-08T19:19:57+00:00"
1593 | },
1594 | {
1595 | "name": "php-cs-fixer/diff",
1596 | "version": "v1.3.0",
1597 | "source": {
1598 | "type": "git",
1599 | "url": "https://github.com/PHP-CS-Fixer/diff.git",
1600 | "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756"
1601 | },
1602 | "dist": {
1603 | "type": "zip",
1604 | "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756",
1605 | "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756",
1606 | "shasum": ""
1607 | },
1608 | "require": {
1609 | "php": "^5.6 || ^7.0"
1610 | },
1611 | "require-dev": {
1612 | "phpunit/phpunit": "^5.7.23 || ^6.4.3",
1613 | "symfony/process": "^3.3"
1614 | },
1615 | "type": "library",
1616 | "autoload": {
1617 | "classmap": [
1618 | "src/"
1619 | ]
1620 | },
1621 | "notification-url": "https://packagist.org/downloads/",
1622 | "license": [
1623 | "BSD-3-Clause"
1624 | ],
1625 | "authors": [
1626 | {
1627 | "name": "Kore Nordmann",
1628 | "email": "mail@kore-nordmann.de"
1629 | },
1630 | {
1631 | "name": "Sebastian Bergmann",
1632 | "email": "sebastian@phpunit.de"
1633 | },
1634 | {
1635 | "name": "SpacePossum"
1636 | }
1637 | ],
1638 | "description": "sebastian/diff v2 backport support for PHP5.6",
1639 | "homepage": "https://github.com/PHP-CS-Fixer",
1640 | "keywords": [
1641 | "diff"
1642 | ],
1643 | "time": "2018-02-15T16:58:55+00:00"
1644 | },
1645 | {
1646 | "name": "phpdocumentor/reflection-common",
1647 | "version": "1.0.1",
1648 | "source": {
1649 | "type": "git",
1650 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
1651 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
1652 | },
1653 | "dist": {
1654 | "type": "zip",
1655 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
1656 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
1657 | "shasum": ""
1658 | },
1659 | "require": {
1660 | "php": ">=5.5"
1661 | },
1662 | "require-dev": {
1663 | "phpunit/phpunit": "^4.6"
1664 | },
1665 | "type": "library",
1666 | "extra": {
1667 | "branch-alias": {
1668 | "dev-master": "1.0.x-dev"
1669 | }
1670 | },
1671 | "autoload": {
1672 | "psr-4": {
1673 | "phpDocumentor\\Reflection\\": [
1674 | "src"
1675 | ]
1676 | }
1677 | },
1678 | "notification-url": "https://packagist.org/downloads/",
1679 | "license": [
1680 | "MIT"
1681 | ],
1682 | "authors": [
1683 | {
1684 | "name": "Jaap van Otterdijk",
1685 | "email": "opensource@ijaap.nl"
1686 | }
1687 | ],
1688 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
1689 | "homepage": "http://www.phpdoc.org",
1690 | "keywords": [
1691 | "FQSEN",
1692 | "phpDocumentor",
1693 | "phpdoc",
1694 | "reflection",
1695 | "static analysis"
1696 | ],
1697 | "time": "2017-09-11T18:02:19+00:00"
1698 | },
1699 | {
1700 | "name": "phpdocumentor/reflection-docblock",
1701 | "version": "4.3.0",
1702 | "source": {
1703 | "type": "git",
1704 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
1705 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08"
1706 | },
1707 | "dist": {
1708 | "type": "zip",
1709 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08",
1710 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08",
1711 | "shasum": ""
1712 | },
1713 | "require": {
1714 | "php": "^7.0",
1715 | "phpdocumentor/reflection-common": "^1.0.0",
1716 | "phpdocumentor/type-resolver": "^0.4.0",
1717 | "webmozart/assert": "^1.0"
1718 | },
1719 | "require-dev": {
1720 | "doctrine/instantiator": "~1.0.5",
1721 | "mockery/mockery": "^1.0",
1722 | "phpunit/phpunit": "^6.4"
1723 | },
1724 | "type": "library",
1725 | "extra": {
1726 | "branch-alias": {
1727 | "dev-master": "4.x-dev"
1728 | }
1729 | },
1730 | "autoload": {
1731 | "psr-4": {
1732 | "phpDocumentor\\Reflection\\": [
1733 | "src/"
1734 | ]
1735 | }
1736 | },
1737 | "notification-url": "https://packagist.org/downloads/",
1738 | "license": [
1739 | "MIT"
1740 | ],
1741 | "authors": [
1742 | {
1743 | "name": "Mike van Riel",
1744 | "email": "me@mikevanriel.com"
1745 | }
1746 | ],
1747 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
1748 | "time": "2017-11-30T07:14:17+00:00"
1749 | },
1750 | {
1751 | "name": "phpdocumentor/type-resolver",
1752 | "version": "0.4.0",
1753 | "source": {
1754 | "type": "git",
1755 | "url": "https://github.com/phpDocumentor/TypeResolver.git",
1756 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
1757 | },
1758 | "dist": {
1759 | "type": "zip",
1760 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
1761 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
1762 | "shasum": ""
1763 | },
1764 | "require": {
1765 | "php": "^5.5 || ^7.0",
1766 | "phpdocumentor/reflection-common": "^1.0"
1767 | },
1768 | "require-dev": {
1769 | "mockery/mockery": "^0.9.4",
1770 | "phpunit/phpunit": "^5.2||^4.8.24"
1771 | },
1772 | "type": "library",
1773 | "extra": {
1774 | "branch-alias": {
1775 | "dev-master": "1.0.x-dev"
1776 | }
1777 | },
1778 | "autoload": {
1779 | "psr-4": {
1780 | "phpDocumentor\\Reflection\\": [
1781 | "src/"
1782 | ]
1783 | }
1784 | },
1785 | "notification-url": "https://packagist.org/downloads/",
1786 | "license": [
1787 | "MIT"
1788 | ],
1789 | "authors": [
1790 | {
1791 | "name": "Mike van Riel",
1792 | "email": "me@mikevanriel.com"
1793 | }
1794 | ],
1795 | "time": "2017-07-14T14:27:02+00:00"
1796 | },
1797 | {
1798 | "name": "phpspec/prophecy",
1799 | "version": "1.8.0",
1800 | "source": {
1801 | "type": "git",
1802 | "url": "https://github.com/phpspec/prophecy.git",
1803 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06"
1804 | },
1805 | "dist": {
1806 | "type": "zip",
1807 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
1808 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
1809 | "shasum": ""
1810 | },
1811 | "require": {
1812 | "doctrine/instantiator": "^1.0.2",
1813 | "php": "^5.3|^7.0",
1814 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
1815 | "sebastian/comparator": "^1.1|^2.0|^3.0",
1816 | "sebastian/recursion-context": "^1.0|^2.0|^3.0"
1817 | },
1818 | "require-dev": {
1819 | "phpspec/phpspec": "^2.5|^3.2",
1820 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
1821 | },
1822 | "type": "library",
1823 | "extra": {
1824 | "branch-alias": {
1825 | "dev-master": "1.8.x-dev"
1826 | }
1827 | },
1828 | "autoload": {
1829 | "psr-0": {
1830 | "Prophecy\\": "src/"
1831 | }
1832 | },
1833 | "notification-url": "https://packagist.org/downloads/",
1834 | "license": [
1835 | "MIT"
1836 | ],
1837 | "authors": [
1838 | {
1839 | "name": "Konstantin Kudryashov",
1840 | "email": "ever.zet@gmail.com",
1841 | "homepage": "http://everzet.com"
1842 | },
1843 | {
1844 | "name": "Marcello Duarte",
1845 | "email": "marcello.duarte@gmail.com"
1846 | }
1847 | ],
1848 | "description": "Highly opinionated mocking framework for PHP 5.3+",
1849 | "homepage": "https://github.com/phpspec/prophecy",
1850 | "keywords": [
1851 | "Double",
1852 | "Dummy",
1853 | "fake",
1854 | "mock",
1855 | "spy",
1856 | "stub"
1857 | ],
1858 | "time": "2018-08-05T17:53:17+00:00"
1859 | },
1860 | {
1861 | "name": "phpstan/phpdoc-parser",
1862 | "version": "0.3.1",
1863 | "source": {
1864 | "type": "git",
1865 | "url": "https://github.com/phpstan/phpdoc-parser.git",
1866 | "reference": "2cc49f47c69b023eaf05b48e6529389893b13d74"
1867 | },
1868 | "dist": {
1869 | "type": "zip",
1870 | "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/2cc49f47c69b023eaf05b48e6529389893b13d74",
1871 | "reference": "2cc49f47c69b023eaf05b48e6529389893b13d74",
1872 | "shasum": ""
1873 | },
1874 | "require": {
1875 | "php": "~7.1"
1876 | },
1877 | "require-dev": {
1878 | "consistence/coding-standard": "^2.0.0",
1879 | "jakub-onderka/php-parallel-lint": "^0.9.2",
1880 | "phing/phing": "^2.16.0",
1881 | "phpstan/phpstan": "^0.10",
1882 | "phpunit/phpunit": "^6.3",
1883 | "slevomat/coding-standard": "^3.3.0",
1884 | "symfony/process": "^3.4 || ^4.0"
1885 | },
1886 | "type": "library",
1887 | "extra": {
1888 | "branch-alias": {
1889 | "dev-master": "0.3-dev"
1890 | }
1891 | },
1892 | "autoload": {
1893 | "psr-4": {
1894 | "PHPStan\\PhpDocParser\\": [
1895 | "src/"
1896 | ]
1897 | }
1898 | },
1899 | "notification-url": "https://packagist.org/downloads/",
1900 | "license": [
1901 | "MIT"
1902 | ],
1903 | "description": "PHPDoc parser with support for nullable, intersection and generic types",
1904 | "time": "2019-01-14T12:26:23+00:00"
1905 | },
1906 | {
1907 | "name": "phpstan/phpstan",
1908 | "version": "0.11.1",
1909 | "source": {
1910 | "type": "git",
1911 | "url": "https://github.com/phpstan/phpstan.git",
1912 | "reference": "a138b8a2731b2c19f1dffa2f1411984a638fe977"
1913 | },
1914 | "dist": {
1915 | "type": "zip",
1916 | "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a138b8a2731b2c19f1dffa2f1411984a638fe977",
1917 | "reference": "a138b8a2731b2c19f1dffa2f1411984a638fe977",
1918 | "shasum": ""
1919 | },
1920 | "require": {
1921 | "composer/xdebug-handler": "^1.3.0",
1922 | "jean85/pretty-package-versions": "^1.0.3",
1923 | "nette/bootstrap": "^2.4 || ^3.0",
1924 | "nette/di": "^2.4.7 || ^3.0",
1925 | "nette/robot-loader": "^3.0.1",
1926 | "nette/utils": "^2.4.5 || ^3.0",
1927 | "nikic/php-parser": "^4.0.2",
1928 | "php": "~7.1",
1929 | "phpstan/phpdoc-parser": "^0.3",
1930 | "symfony/console": "~3.2 || ~4.0",
1931 | "symfony/finder": "~3.2 || ~4.0"
1932 | },
1933 | "conflict": {
1934 | "symfony/console": "3.4.16 || 4.1.5"
1935 | },
1936 | "require-dev": {
1937 | "brianium/paratest": "^2.0",
1938 | "consistence/coding-standard": "^3.5",
1939 | "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
1940 | "ext-intl": "*",
1941 | "ext-mysqli": "*",
1942 | "ext-soap": "*",
1943 | "ext-zip": "*",
1944 | "jakub-onderka/php-parallel-lint": "^1.0",
1945 | "localheinz/composer-normalize": "^1.1.0",
1946 | "phing/phing": "^2.16.0",
1947 | "phpstan/phpstan-deprecation-rules": "^0.11",
1948 | "phpstan/phpstan-php-parser": "^0.11",
1949 | "phpstan/phpstan-phpunit": "^0.11",
1950 | "phpstan/phpstan-strict-rules": "^0.11",
1951 | "phpunit/phpunit": "^7.0",
1952 | "slevomat/coding-standard": "^4.7.2",
1953 | "squizlabs/php_codesniffer": "^3.3.2"
1954 | },
1955 | "bin": [
1956 | "bin/phpstan"
1957 | ],
1958 | "type": "library",
1959 | "extra": {
1960 | "branch-alias": {
1961 | "dev-master": "0.11-dev"
1962 | }
1963 | },
1964 | "autoload": {
1965 | "psr-4": {
1966 | "PHPStan\\": [
1967 | "src/",
1968 | "build/PHPStan"
1969 | ]
1970 | }
1971 | },
1972 | "notification-url": "https://packagist.org/downloads/",
1973 | "license": [
1974 | "MIT"
1975 | ],
1976 | "description": "PHPStan - PHP Static Analysis Tool",
1977 | "time": "2019-01-19T20:23:08+00:00"
1978 | },
1979 | {
1980 | "name": "phpunit/php-code-coverage",
1981 | "version": "7.0.1",
1982 | "source": {
1983 | "type": "git",
1984 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
1985 | "reference": "4832739a02c418397e404da6c3e4fe680b7a4de7"
1986 | },
1987 | "dist": {
1988 | "type": "zip",
1989 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4832739a02c418397e404da6c3e4fe680b7a4de7",
1990 | "reference": "4832739a02c418397e404da6c3e4fe680b7a4de7",
1991 | "shasum": ""
1992 | },
1993 | "require": {
1994 | "ext-dom": "*",
1995 | "ext-xmlwriter": "*",
1996 | "php": "^7.2",
1997 | "phpunit/php-file-iterator": "^2.0.2",
1998 | "phpunit/php-text-template": "^1.2.1",
1999 | "phpunit/php-token-stream": "^3.0.1",
2000 | "sebastian/code-unit-reverse-lookup": "^1.0.1",
2001 | "sebastian/environment": "^4.1",
2002 | "sebastian/version": "^2.0.1",
2003 | "theseer/tokenizer": "^1.1"
2004 | },
2005 | "require-dev": {
2006 | "phpunit/phpunit": "^8.0"
2007 | },
2008 | "suggest": {
2009 | "ext-xdebug": "^2.6.1"
2010 | },
2011 | "type": "library",
2012 | "extra": {
2013 | "branch-alias": {
2014 | "dev-master": "7.0-dev"
2015 | }
2016 | },
2017 | "autoload": {
2018 | "classmap": [
2019 | "src/"
2020 | ]
2021 | },
2022 | "notification-url": "https://packagist.org/downloads/",
2023 | "license": [
2024 | "BSD-3-Clause"
2025 | ],
2026 | "authors": [
2027 | {
2028 | "name": "Sebastian Bergmann",
2029 | "email": "sebastian@phpunit.de",
2030 | "role": "lead"
2031 | }
2032 | ],
2033 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
2034 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
2035 | "keywords": [
2036 | "coverage",
2037 | "testing",
2038 | "xunit"
2039 | ],
2040 | "time": "2019-02-01T07:29:14+00:00"
2041 | },
2042 | {
2043 | "name": "phpunit/php-file-iterator",
2044 | "version": "2.0.2",
2045 | "source": {
2046 | "type": "git",
2047 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
2048 | "reference": "050bedf145a257b1ff02746c31894800e5122946"
2049 | },
2050 | "dist": {
2051 | "type": "zip",
2052 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
2053 | "reference": "050bedf145a257b1ff02746c31894800e5122946",
2054 | "shasum": ""
2055 | },
2056 | "require": {
2057 | "php": "^7.1"
2058 | },
2059 | "require-dev": {
2060 | "phpunit/phpunit": "^7.1"
2061 | },
2062 | "type": "library",
2063 | "extra": {
2064 | "branch-alias": {
2065 | "dev-master": "2.0.x-dev"
2066 | }
2067 | },
2068 | "autoload": {
2069 | "classmap": [
2070 | "src/"
2071 | ]
2072 | },
2073 | "notification-url": "https://packagist.org/downloads/",
2074 | "license": [
2075 | "BSD-3-Clause"
2076 | ],
2077 | "authors": [
2078 | {
2079 | "name": "Sebastian Bergmann",
2080 | "email": "sebastian@phpunit.de",
2081 | "role": "lead"
2082 | }
2083 | ],
2084 | "description": "FilterIterator implementation that filters files based on a list of suffixes.",
2085 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
2086 | "keywords": [
2087 | "filesystem",
2088 | "iterator"
2089 | ],
2090 | "time": "2018-09-13T20:33:42+00:00"
2091 | },
2092 | {
2093 | "name": "phpunit/php-text-template",
2094 | "version": "1.2.1",
2095 | "source": {
2096 | "type": "git",
2097 | "url": "https://github.com/sebastianbergmann/php-text-template.git",
2098 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
2099 | },
2100 | "dist": {
2101 | "type": "zip",
2102 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
2103 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
2104 | "shasum": ""
2105 | },
2106 | "require": {
2107 | "php": ">=5.3.3"
2108 | },
2109 | "type": "library",
2110 | "autoload": {
2111 | "classmap": [
2112 | "src/"
2113 | ]
2114 | },
2115 | "notification-url": "https://packagist.org/downloads/",
2116 | "license": [
2117 | "BSD-3-Clause"
2118 | ],
2119 | "authors": [
2120 | {
2121 | "name": "Sebastian Bergmann",
2122 | "email": "sebastian@phpunit.de",
2123 | "role": "lead"
2124 | }
2125 | ],
2126 | "description": "Simple template engine.",
2127 | "homepage": "https://github.com/sebastianbergmann/php-text-template/",
2128 | "keywords": [
2129 | "template"
2130 | ],
2131 | "time": "2015-06-21T13:50:34+00:00"
2132 | },
2133 | {
2134 | "name": "phpunit/php-timer",
2135 | "version": "2.0.0",
2136 | "source": {
2137 | "type": "git",
2138 | "url": "https://github.com/sebastianbergmann/php-timer.git",
2139 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f"
2140 | },
2141 | "dist": {
2142 | "type": "zip",
2143 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f",
2144 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f",
2145 | "shasum": ""
2146 | },
2147 | "require": {
2148 | "php": "^7.1"
2149 | },
2150 | "require-dev": {
2151 | "phpunit/phpunit": "^7.0"
2152 | },
2153 | "type": "library",
2154 | "extra": {
2155 | "branch-alias": {
2156 | "dev-master": "2.0-dev"
2157 | }
2158 | },
2159 | "autoload": {
2160 | "classmap": [
2161 | "src/"
2162 | ]
2163 | },
2164 | "notification-url": "https://packagist.org/downloads/",
2165 | "license": [
2166 | "BSD-3-Clause"
2167 | ],
2168 | "authors": [
2169 | {
2170 | "name": "Sebastian Bergmann",
2171 | "email": "sebastian@phpunit.de",
2172 | "role": "lead"
2173 | }
2174 | ],
2175 | "description": "Utility class for timing",
2176 | "homepage": "https://github.com/sebastianbergmann/php-timer/",
2177 | "keywords": [
2178 | "timer"
2179 | ],
2180 | "time": "2018-02-01T13:07:23+00:00"
2181 | },
2182 | {
2183 | "name": "phpunit/php-token-stream",
2184 | "version": "3.0.1",
2185 | "source": {
2186 | "type": "git",
2187 | "url": "https://github.com/sebastianbergmann/php-token-stream.git",
2188 | "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18"
2189 | },
2190 | "dist": {
2191 | "type": "zip",
2192 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c99e3be9d3e85f60646f152f9002d46ed7770d18",
2193 | "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18",
2194 | "shasum": ""
2195 | },
2196 | "require": {
2197 | "ext-tokenizer": "*",
2198 | "php": "^7.1"
2199 | },
2200 | "require-dev": {
2201 | "phpunit/phpunit": "^7.0"
2202 | },
2203 | "type": "library",
2204 | "extra": {
2205 | "branch-alias": {
2206 | "dev-master": "3.0-dev"
2207 | }
2208 | },
2209 | "autoload": {
2210 | "classmap": [
2211 | "src/"
2212 | ]
2213 | },
2214 | "notification-url": "https://packagist.org/downloads/",
2215 | "license": [
2216 | "BSD-3-Clause"
2217 | ],
2218 | "authors": [
2219 | {
2220 | "name": "Sebastian Bergmann",
2221 | "email": "sebastian@phpunit.de"
2222 | }
2223 | ],
2224 | "description": "Wrapper around PHP's tokenizer extension.",
2225 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
2226 | "keywords": [
2227 | "tokenizer"
2228 | ],
2229 | "time": "2018-10-30T05:52:18+00:00"
2230 | },
2231 | {
2232 | "name": "phpunit/phpunit",
2233 | "version": "8.0.1",
2234 | "source": {
2235 | "type": "git",
2236 | "url": "https://github.com/sebastianbergmann/phpunit.git",
2237 | "reference": "753a192050133fc649234de34d1993d87785b134"
2238 | },
2239 | "dist": {
2240 | "type": "zip",
2241 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/753a192050133fc649234de34d1993d87785b134",
2242 | "reference": "753a192050133fc649234de34d1993d87785b134",
2243 | "shasum": ""
2244 | },
2245 | "require": {
2246 | "doctrine/instantiator": "^1.1",
2247 | "ext-dom": "*",
2248 | "ext-json": "*",
2249 | "ext-libxml": "*",
2250 | "ext-mbstring": "*",
2251 | "ext-xml": "*",
2252 | "ext-xmlwriter": "*",
2253 | "myclabs/deep-copy": "^1.7",
2254 | "phar-io/manifest": "^1.0.2",
2255 | "phar-io/version": "^2.0",
2256 | "php": "^7.2",
2257 | "phpspec/prophecy": "^1.7",
2258 | "phpunit/php-code-coverage": "^7.0",
2259 | "phpunit/php-file-iterator": "^2.0.1",
2260 | "phpunit/php-text-template": "^1.2.1",
2261 | "phpunit/php-timer": "^2.0",
2262 | "sebastian/comparator": "^3.0",
2263 | "sebastian/diff": "^3.0",
2264 | "sebastian/environment": "^4.1",
2265 | "sebastian/exporter": "^3.1",
2266 | "sebastian/global-state": "^3.0",
2267 | "sebastian/object-enumerator": "^3.0.3",
2268 | "sebastian/resource-operations": "^2.0",
2269 | "sebastian/version": "^2.0.1"
2270 | },
2271 | "require-dev": {
2272 | "ext-pdo": "*"
2273 | },
2274 | "suggest": {
2275 | "ext-soap": "*",
2276 | "ext-xdebug": "*",
2277 | "phpunit/php-invoker": "^2.0"
2278 | },
2279 | "bin": [
2280 | "phpunit"
2281 | ],
2282 | "type": "library",
2283 | "extra": {
2284 | "branch-alias": {
2285 | "dev-master": "8.0-dev"
2286 | }
2287 | },
2288 | "autoload": {
2289 | "classmap": [
2290 | "src/"
2291 | ]
2292 | },
2293 | "notification-url": "https://packagist.org/downloads/",
2294 | "license": [
2295 | "BSD-3-Clause"
2296 | ],
2297 | "authors": [
2298 | {
2299 | "name": "Sebastian Bergmann",
2300 | "email": "sebastian@phpunit.de",
2301 | "role": "lead"
2302 | }
2303 | ],
2304 | "description": "The PHP Unit Testing framework.",
2305 | "homepage": "https://phpunit.de/",
2306 | "keywords": [
2307 | "phpunit",
2308 | "testing",
2309 | "xunit"
2310 | ],
2311 | "time": "2019-02-03T17:34:56+00:00"
2312 | },
2313 | {
2314 | "name": "pimple/pimple",
2315 | "version": "v3.2.3",
2316 | "source": {
2317 | "type": "git",
2318 | "url": "https://github.com/silexphp/Pimple.git",
2319 | "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
2320 | },
2321 | "dist": {
2322 | "type": "zip",
2323 | "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
2324 | "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
2325 | "shasum": ""
2326 | },
2327 | "require": {
2328 | "php": ">=5.3.0",
2329 | "psr/container": "^1.0"
2330 | },
2331 | "require-dev": {
2332 | "symfony/phpunit-bridge": "^3.2"
2333 | },
2334 | "type": "library",
2335 | "extra": {
2336 | "branch-alias": {
2337 | "dev-master": "3.2.x-dev"
2338 | }
2339 | },
2340 | "autoload": {
2341 | "psr-0": {
2342 | "Pimple": "src/"
2343 | }
2344 | },
2345 | "notification-url": "https://packagist.org/downloads/",
2346 | "license": [
2347 | "MIT"
2348 | ],
2349 | "authors": [
2350 | {
2351 | "name": "Fabien Potencier",
2352 | "email": "fabien@symfony.com"
2353 | }
2354 | ],
2355 | "description": "Pimple, a simple Dependency Injection Container",
2356 | "homepage": "http://pimple.sensiolabs.org",
2357 | "keywords": [
2358 | "container",
2359 | "dependency injection"
2360 | ],
2361 | "time": "2018-01-21T07:42:36+00:00"
2362 | },
2363 | {
2364 | "name": "psr/container",
2365 | "version": "1.0.0",
2366 | "source": {
2367 | "type": "git",
2368 | "url": "https://github.com/php-fig/container.git",
2369 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
2370 | },
2371 | "dist": {
2372 | "type": "zip",
2373 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
2374 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
2375 | "shasum": ""
2376 | },
2377 | "require": {
2378 | "php": ">=5.3.0"
2379 | },
2380 | "type": "library",
2381 | "extra": {
2382 | "branch-alias": {
2383 | "dev-master": "1.0.x-dev"
2384 | }
2385 | },
2386 | "autoload": {
2387 | "psr-4": {
2388 | "Psr\\Container\\": "src/"
2389 | }
2390 | },
2391 | "notification-url": "https://packagist.org/downloads/",
2392 | "license": [
2393 | "MIT"
2394 | ],
2395 | "authors": [
2396 | {
2397 | "name": "PHP-FIG",
2398 | "homepage": "http://www.php-fig.org/"
2399 | }
2400 | ],
2401 | "description": "Common Container Interface (PHP FIG PSR-11)",
2402 | "homepage": "https://github.com/php-fig/container",
2403 | "keywords": [
2404 | "PSR-11",
2405 | "container",
2406 | "container-interface",
2407 | "container-interop",
2408 | "psr"
2409 | ],
2410 | "time": "2017-02-14T16:28:37+00:00"
2411 | },
2412 | {
2413 | "name": "psr/log",
2414 | "version": "1.1.0",
2415 | "source": {
2416 | "type": "git",
2417 | "url": "https://github.com/php-fig/log.git",
2418 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
2419 | },
2420 | "dist": {
2421 | "type": "zip",
2422 | "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
2423 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
2424 | "shasum": ""
2425 | },
2426 | "require": {
2427 | "php": ">=5.3.0"
2428 | },
2429 | "type": "library",
2430 | "extra": {
2431 | "branch-alias": {
2432 | "dev-master": "1.0.x-dev"
2433 | }
2434 | },
2435 | "autoload": {
2436 | "psr-4": {
2437 | "Psr\\Log\\": "Psr/Log/"
2438 | }
2439 | },
2440 | "notification-url": "https://packagist.org/downloads/",
2441 | "license": [
2442 | "MIT"
2443 | ],
2444 | "authors": [
2445 | {
2446 | "name": "PHP-FIG",
2447 | "homepage": "http://www.php-fig.org/"
2448 | }
2449 | ],
2450 | "description": "Common interface for logging libraries",
2451 | "homepage": "https://github.com/php-fig/log",
2452 | "keywords": [
2453 | "log",
2454 | "psr",
2455 | "psr-3"
2456 | ],
2457 | "time": "2018-11-20T15:27:04+00:00"
2458 | },
2459 | {
2460 | "name": "sebastian/code-unit-reverse-lookup",
2461 | "version": "1.0.1",
2462 | "source": {
2463 | "type": "git",
2464 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
2465 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
2466 | },
2467 | "dist": {
2468 | "type": "zip",
2469 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
2470 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
2471 | "shasum": ""
2472 | },
2473 | "require": {
2474 | "php": "^5.6 || ^7.0"
2475 | },
2476 | "require-dev": {
2477 | "phpunit/phpunit": "^5.7 || ^6.0"
2478 | },
2479 | "type": "library",
2480 | "extra": {
2481 | "branch-alias": {
2482 | "dev-master": "1.0.x-dev"
2483 | }
2484 | },
2485 | "autoload": {
2486 | "classmap": [
2487 | "src/"
2488 | ]
2489 | },
2490 | "notification-url": "https://packagist.org/downloads/",
2491 | "license": [
2492 | "BSD-3-Clause"
2493 | ],
2494 | "authors": [
2495 | {
2496 | "name": "Sebastian Bergmann",
2497 | "email": "sebastian@phpunit.de"
2498 | }
2499 | ],
2500 | "description": "Looks up which function or method a line of code belongs to",
2501 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
2502 | "time": "2017-03-04T06:30:41+00:00"
2503 | },
2504 | {
2505 | "name": "sebastian/comparator",
2506 | "version": "3.0.2",
2507 | "source": {
2508 | "type": "git",
2509 | "url": "https://github.com/sebastianbergmann/comparator.git",
2510 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
2511 | },
2512 | "dist": {
2513 | "type": "zip",
2514 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
2515 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
2516 | "shasum": ""
2517 | },
2518 | "require": {
2519 | "php": "^7.1",
2520 | "sebastian/diff": "^3.0",
2521 | "sebastian/exporter": "^3.1"
2522 | },
2523 | "require-dev": {
2524 | "phpunit/phpunit": "^7.1"
2525 | },
2526 | "type": "library",
2527 | "extra": {
2528 | "branch-alias": {
2529 | "dev-master": "3.0-dev"
2530 | }
2531 | },
2532 | "autoload": {
2533 | "classmap": [
2534 | "src/"
2535 | ]
2536 | },
2537 | "notification-url": "https://packagist.org/downloads/",
2538 | "license": [
2539 | "BSD-3-Clause"
2540 | ],
2541 | "authors": [
2542 | {
2543 | "name": "Jeff Welch",
2544 | "email": "whatthejeff@gmail.com"
2545 | },
2546 | {
2547 | "name": "Volker Dusch",
2548 | "email": "github@wallbash.com"
2549 | },
2550 | {
2551 | "name": "Bernhard Schussek",
2552 | "email": "bschussek@2bepublished.at"
2553 | },
2554 | {
2555 | "name": "Sebastian Bergmann",
2556 | "email": "sebastian@phpunit.de"
2557 | }
2558 | ],
2559 | "description": "Provides the functionality to compare PHP values for equality",
2560 | "homepage": "https://github.com/sebastianbergmann/comparator",
2561 | "keywords": [
2562 | "comparator",
2563 | "compare",
2564 | "equality"
2565 | ],
2566 | "time": "2018-07-12T15:12:46+00:00"
2567 | },
2568 | {
2569 | "name": "sebastian/diff",
2570 | "version": "3.0.2",
2571 | "source": {
2572 | "type": "git",
2573 | "url": "https://github.com/sebastianbergmann/diff.git",
2574 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
2575 | },
2576 | "dist": {
2577 | "type": "zip",
2578 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
2579 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
2580 | "shasum": ""
2581 | },
2582 | "require": {
2583 | "php": "^7.1"
2584 | },
2585 | "require-dev": {
2586 | "phpunit/phpunit": "^7.5 || ^8.0",
2587 | "symfony/process": "^2 || ^3.3 || ^4"
2588 | },
2589 | "type": "library",
2590 | "extra": {
2591 | "branch-alias": {
2592 | "dev-master": "3.0-dev"
2593 | }
2594 | },
2595 | "autoload": {
2596 | "classmap": [
2597 | "src/"
2598 | ]
2599 | },
2600 | "notification-url": "https://packagist.org/downloads/",
2601 | "license": [
2602 | "BSD-3-Clause"
2603 | ],
2604 | "authors": [
2605 | {
2606 | "name": "Kore Nordmann",
2607 | "email": "mail@kore-nordmann.de"
2608 | },
2609 | {
2610 | "name": "Sebastian Bergmann",
2611 | "email": "sebastian@phpunit.de"
2612 | }
2613 | ],
2614 | "description": "Diff implementation",
2615 | "homepage": "https://github.com/sebastianbergmann/diff",
2616 | "keywords": [
2617 | "diff",
2618 | "udiff",
2619 | "unidiff",
2620 | "unified diff"
2621 | ],
2622 | "time": "2019-02-04T06:01:07+00:00"
2623 | },
2624 | {
2625 | "name": "sebastian/environment",
2626 | "version": "4.1.0",
2627 | "source": {
2628 | "type": "git",
2629 | "url": "https://github.com/sebastianbergmann/environment.git",
2630 | "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656"
2631 | },
2632 | "dist": {
2633 | "type": "zip",
2634 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6fda8ce1974b62b14935adc02a9ed38252eca656",
2635 | "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656",
2636 | "shasum": ""
2637 | },
2638 | "require": {
2639 | "php": "^7.1"
2640 | },
2641 | "require-dev": {
2642 | "phpunit/phpunit": "^7.5"
2643 | },
2644 | "suggest": {
2645 | "ext-posix": "*"
2646 | },
2647 | "type": "library",
2648 | "extra": {
2649 | "branch-alias": {
2650 | "dev-master": "4.1-dev"
2651 | }
2652 | },
2653 | "autoload": {
2654 | "classmap": [
2655 | "src/"
2656 | ]
2657 | },
2658 | "notification-url": "https://packagist.org/downloads/",
2659 | "license": [
2660 | "BSD-3-Clause"
2661 | ],
2662 | "authors": [
2663 | {
2664 | "name": "Sebastian Bergmann",
2665 | "email": "sebastian@phpunit.de"
2666 | }
2667 | ],
2668 | "description": "Provides functionality to handle HHVM/PHP environments",
2669 | "homepage": "http://www.github.com/sebastianbergmann/environment",
2670 | "keywords": [
2671 | "Xdebug",
2672 | "environment",
2673 | "hhvm"
2674 | ],
2675 | "time": "2019-02-01T05:27:49+00:00"
2676 | },
2677 | {
2678 | "name": "sebastian/exporter",
2679 | "version": "3.1.0",
2680 | "source": {
2681 | "type": "git",
2682 | "url": "https://github.com/sebastianbergmann/exporter.git",
2683 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937"
2684 | },
2685 | "dist": {
2686 | "type": "zip",
2687 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937",
2688 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937",
2689 | "shasum": ""
2690 | },
2691 | "require": {
2692 | "php": "^7.0",
2693 | "sebastian/recursion-context": "^3.0"
2694 | },
2695 | "require-dev": {
2696 | "ext-mbstring": "*",
2697 | "phpunit/phpunit": "^6.0"
2698 | },
2699 | "type": "library",
2700 | "extra": {
2701 | "branch-alias": {
2702 | "dev-master": "3.1.x-dev"
2703 | }
2704 | },
2705 | "autoload": {
2706 | "classmap": [
2707 | "src/"
2708 | ]
2709 | },
2710 | "notification-url": "https://packagist.org/downloads/",
2711 | "license": [
2712 | "BSD-3-Clause"
2713 | ],
2714 | "authors": [
2715 | {
2716 | "name": "Jeff Welch",
2717 | "email": "whatthejeff@gmail.com"
2718 | },
2719 | {
2720 | "name": "Volker Dusch",
2721 | "email": "github@wallbash.com"
2722 | },
2723 | {
2724 | "name": "Bernhard Schussek",
2725 | "email": "bschussek@2bepublished.at"
2726 | },
2727 | {
2728 | "name": "Sebastian Bergmann",
2729 | "email": "sebastian@phpunit.de"
2730 | },
2731 | {
2732 | "name": "Adam Harvey",
2733 | "email": "aharvey@php.net"
2734 | }
2735 | ],
2736 | "description": "Provides the functionality to export PHP variables for visualization",
2737 | "homepage": "http://www.github.com/sebastianbergmann/exporter",
2738 | "keywords": [
2739 | "export",
2740 | "exporter"
2741 | ],
2742 | "time": "2017-04-03T13:19:02+00:00"
2743 | },
2744 | {
2745 | "name": "sebastian/global-state",
2746 | "version": "3.0.0",
2747 | "source": {
2748 | "type": "git",
2749 | "url": "https://github.com/sebastianbergmann/global-state.git",
2750 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
2751 | },
2752 | "dist": {
2753 | "type": "zip",
2754 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
2755 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
2756 | "shasum": ""
2757 | },
2758 | "require": {
2759 | "php": "^7.2",
2760 | "sebastian/object-reflector": "^1.1.1",
2761 | "sebastian/recursion-context": "^3.0"
2762 | },
2763 | "require-dev": {
2764 | "ext-dom": "*",
2765 | "phpunit/phpunit": "^8.0"
2766 | },
2767 | "suggest": {
2768 | "ext-uopz": "*"
2769 | },
2770 | "type": "library",
2771 | "extra": {
2772 | "branch-alias": {
2773 | "dev-master": "3.0-dev"
2774 | }
2775 | },
2776 | "autoload": {
2777 | "classmap": [
2778 | "src/"
2779 | ]
2780 | },
2781 | "notification-url": "https://packagist.org/downloads/",
2782 | "license": [
2783 | "BSD-3-Clause"
2784 | ],
2785 | "authors": [
2786 | {
2787 | "name": "Sebastian Bergmann",
2788 | "email": "sebastian@phpunit.de"
2789 | }
2790 | ],
2791 | "description": "Snapshotting of global state",
2792 | "homepage": "http://www.github.com/sebastianbergmann/global-state",
2793 | "keywords": [
2794 | "global state"
2795 | ],
2796 | "time": "2019-02-01T05:30:01+00:00"
2797 | },
2798 | {
2799 | "name": "sebastian/object-enumerator",
2800 | "version": "3.0.3",
2801 | "source": {
2802 | "type": "git",
2803 | "url": "https://github.com/sebastianbergmann/object-enumerator.git",
2804 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
2805 | },
2806 | "dist": {
2807 | "type": "zip",
2808 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
2809 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
2810 | "shasum": ""
2811 | },
2812 | "require": {
2813 | "php": "^7.0",
2814 | "sebastian/object-reflector": "^1.1.1",
2815 | "sebastian/recursion-context": "^3.0"
2816 | },
2817 | "require-dev": {
2818 | "phpunit/phpunit": "^6.0"
2819 | },
2820 | "type": "library",
2821 | "extra": {
2822 | "branch-alias": {
2823 | "dev-master": "3.0.x-dev"
2824 | }
2825 | },
2826 | "autoload": {
2827 | "classmap": [
2828 | "src/"
2829 | ]
2830 | },
2831 | "notification-url": "https://packagist.org/downloads/",
2832 | "license": [
2833 | "BSD-3-Clause"
2834 | ],
2835 | "authors": [
2836 | {
2837 | "name": "Sebastian Bergmann",
2838 | "email": "sebastian@phpunit.de"
2839 | }
2840 | ],
2841 | "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2842 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
2843 | "time": "2017-08-03T12:35:26+00:00"
2844 | },
2845 | {
2846 | "name": "sebastian/object-reflector",
2847 | "version": "1.1.1",
2848 | "source": {
2849 | "type": "git",
2850 | "url": "https://github.com/sebastianbergmann/object-reflector.git",
2851 | "reference": "773f97c67f28de00d397be301821b06708fca0be"
2852 | },
2853 | "dist": {
2854 | "type": "zip",
2855 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
2856 | "reference": "773f97c67f28de00d397be301821b06708fca0be",
2857 | "shasum": ""
2858 | },
2859 | "require": {
2860 | "php": "^7.0"
2861 | },
2862 | "require-dev": {
2863 | "phpunit/phpunit": "^6.0"
2864 | },
2865 | "type": "library",
2866 | "extra": {
2867 | "branch-alias": {
2868 | "dev-master": "1.1-dev"
2869 | }
2870 | },
2871 | "autoload": {
2872 | "classmap": [
2873 | "src/"
2874 | ]
2875 | },
2876 | "notification-url": "https://packagist.org/downloads/",
2877 | "license": [
2878 | "BSD-3-Clause"
2879 | ],
2880 | "authors": [
2881 | {
2882 | "name": "Sebastian Bergmann",
2883 | "email": "sebastian@phpunit.de"
2884 | }
2885 | ],
2886 | "description": "Allows reflection of object attributes, including inherited and non-public ones",
2887 | "homepage": "https://github.com/sebastianbergmann/object-reflector/",
2888 | "time": "2017-03-29T09:07:27+00:00"
2889 | },
2890 | {
2891 | "name": "sebastian/recursion-context",
2892 | "version": "3.0.0",
2893 | "source": {
2894 | "type": "git",
2895 | "url": "https://github.com/sebastianbergmann/recursion-context.git",
2896 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
2897 | },
2898 | "dist": {
2899 | "type": "zip",
2900 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
2901 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
2902 | "shasum": ""
2903 | },
2904 | "require": {
2905 | "php": "^7.0"
2906 | },
2907 | "require-dev": {
2908 | "phpunit/phpunit": "^6.0"
2909 | },
2910 | "type": "library",
2911 | "extra": {
2912 | "branch-alias": {
2913 | "dev-master": "3.0.x-dev"
2914 | }
2915 | },
2916 | "autoload": {
2917 | "classmap": [
2918 | "src/"
2919 | ]
2920 | },
2921 | "notification-url": "https://packagist.org/downloads/",
2922 | "license": [
2923 | "BSD-3-Clause"
2924 | ],
2925 | "authors": [
2926 | {
2927 | "name": "Jeff Welch",
2928 | "email": "whatthejeff@gmail.com"
2929 | },
2930 | {
2931 | "name": "Sebastian Bergmann",
2932 | "email": "sebastian@phpunit.de"
2933 | },
2934 | {
2935 | "name": "Adam Harvey",
2936 | "email": "aharvey@php.net"
2937 | }
2938 | ],
2939 | "description": "Provides functionality to recursively process PHP variables",
2940 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2941 | "time": "2017-03-03T06:23:57+00:00"
2942 | },
2943 | {
2944 | "name": "sebastian/resource-operations",
2945 | "version": "2.0.1",
2946 | "source": {
2947 | "type": "git",
2948 | "url": "https://github.com/sebastianbergmann/resource-operations.git",
2949 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
2950 | },
2951 | "dist": {
2952 | "type": "zip",
2953 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
2954 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
2955 | "shasum": ""
2956 | },
2957 | "require": {
2958 | "php": "^7.1"
2959 | },
2960 | "type": "library",
2961 | "extra": {
2962 | "branch-alias": {
2963 | "dev-master": "2.0-dev"
2964 | }
2965 | },
2966 | "autoload": {
2967 | "classmap": [
2968 | "src/"
2969 | ]
2970 | },
2971 | "notification-url": "https://packagist.org/downloads/",
2972 | "license": [
2973 | "BSD-3-Clause"
2974 | ],
2975 | "authors": [
2976 | {
2977 | "name": "Sebastian Bergmann",
2978 | "email": "sebastian@phpunit.de"
2979 | }
2980 | ],
2981 | "description": "Provides a list of PHP built-in functions that operate on resources",
2982 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2983 | "time": "2018-10-04T04:07:39+00:00"
2984 | },
2985 | {
2986 | "name": "sebastian/version",
2987 | "version": "2.0.1",
2988 | "source": {
2989 | "type": "git",
2990 | "url": "https://github.com/sebastianbergmann/version.git",
2991 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
2992 | },
2993 | "dist": {
2994 | "type": "zip",
2995 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
2996 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
2997 | "shasum": ""
2998 | },
2999 | "require": {
3000 | "php": ">=5.6"
3001 | },
3002 | "type": "library",
3003 | "extra": {
3004 | "branch-alias": {
3005 | "dev-master": "2.0.x-dev"
3006 | }
3007 | },
3008 | "autoload": {
3009 | "classmap": [
3010 | "src/"
3011 | ]
3012 | },
3013 | "notification-url": "https://packagist.org/downloads/",
3014 | "license": [
3015 | "BSD-3-Clause"
3016 | ],
3017 | "authors": [
3018 | {
3019 | "name": "Sebastian Bergmann",
3020 | "email": "sebastian@phpunit.de",
3021 | "role": "lead"
3022 | }
3023 | ],
3024 | "description": "Library that helps with managing the version number of Git-hosted PHP projects",
3025 | "homepage": "https://github.com/sebastianbergmann/version",
3026 | "time": "2016-10-03T07:35:21+00:00"
3027 | },
3028 | {
3029 | "name": "symfony/console",
3030 | "version": "v4.2.3",
3031 | "source": {
3032 | "type": "git",
3033 | "url": "https://github.com/symfony/console.git",
3034 | "reference": "1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4"
3035 | },
3036 | "dist": {
3037 | "type": "zip",
3038 | "url": "https://api.github.com/repos/symfony/console/zipball/1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4",
3039 | "reference": "1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4",
3040 | "shasum": ""
3041 | },
3042 | "require": {
3043 | "php": "^7.1.3",
3044 | "symfony/contracts": "^1.0",
3045 | "symfony/polyfill-mbstring": "~1.0"
3046 | },
3047 | "conflict": {
3048 | "symfony/dependency-injection": "<3.4",
3049 | "symfony/process": "<3.3"
3050 | },
3051 | "provide": {
3052 | "psr/log-implementation": "1.0"
3053 | },
3054 | "require-dev": {
3055 | "psr/log": "~1.0",
3056 | "symfony/config": "~3.4|~4.0",
3057 | "symfony/dependency-injection": "~3.4|~4.0",
3058 | "symfony/event-dispatcher": "~3.4|~4.0",
3059 | "symfony/lock": "~3.4|~4.0",
3060 | "symfony/process": "~3.4|~4.0"
3061 | },
3062 | "suggest": {
3063 | "psr/log": "For using the console logger",
3064 | "symfony/event-dispatcher": "",
3065 | "symfony/lock": "",
3066 | "symfony/process": ""
3067 | },
3068 | "type": "library",
3069 | "extra": {
3070 | "branch-alias": {
3071 | "dev-master": "4.2-dev"
3072 | }
3073 | },
3074 | "autoload": {
3075 | "psr-4": {
3076 | "Symfony\\Component\\Console\\": ""
3077 | },
3078 | "exclude-from-classmap": [
3079 | "/Tests/"
3080 | ]
3081 | },
3082 | "notification-url": "https://packagist.org/downloads/",
3083 | "license": [
3084 | "MIT"
3085 | ],
3086 | "authors": [
3087 | {
3088 | "name": "Fabien Potencier",
3089 | "email": "fabien@symfony.com"
3090 | },
3091 | {
3092 | "name": "Symfony Community",
3093 | "homepage": "https://symfony.com/contributors"
3094 | }
3095 | ],
3096 | "description": "Symfony Console Component",
3097 | "homepage": "https://symfony.com",
3098 | "time": "2019-01-25T14:35:16+00:00"
3099 | },
3100 | {
3101 | "name": "symfony/contracts",
3102 | "version": "v1.0.2",
3103 | "source": {
3104 | "type": "git",
3105 | "url": "https://github.com/symfony/contracts.git",
3106 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf"
3107 | },
3108 | "dist": {
3109 | "type": "zip",
3110 | "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf",
3111 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf",
3112 | "shasum": ""
3113 | },
3114 | "require": {
3115 | "php": "^7.1.3"
3116 | },
3117 | "require-dev": {
3118 | "psr/cache": "^1.0",
3119 | "psr/container": "^1.0"
3120 | },
3121 | "suggest": {
3122 | "psr/cache": "When using the Cache contracts",
3123 | "psr/container": "When using the Service contracts",
3124 | "symfony/cache-contracts-implementation": "",
3125 | "symfony/service-contracts-implementation": "",
3126 | "symfony/translation-contracts-implementation": ""
3127 | },
3128 | "type": "library",
3129 | "extra": {
3130 | "branch-alias": {
3131 | "dev-master": "1.0-dev"
3132 | }
3133 | },
3134 | "autoload": {
3135 | "psr-4": {
3136 | "Symfony\\Contracts\\": ""
3137 | },
3138 | "exclude-from-classmap": [
3139 | "**/Tests/"
3140 | ]
3141 | },
3142 | "notification-url": "https://packagist.org/downloads/",
3143 | "license": [
3144 | "MIT"
3145 | ],
3146 | "authors": [
3147 | {
3148 | "name": "Nicolas Grekas",
3149 | "email": "p@tchwork.com"
3150 | },
3151 | {
3152 | "name": "Symfony Community",
3153 | "homepage": "https://symfony.com/contributors"
3154 | }
3155 | ],
3156 | "description": "A set of abstractions extracted out of the Symfony components",
3157 | "homepage": "https://symfony.com",
3158 | "keywords": [
3159 | "abstractions",
3160 | "contracts",
3161 | "decoupling",
3162 | "interfaces",
3163 | "interoperability",
3164 | "standards"
3165 | ],
3166 | "time": "2018-12-05T08:06:11+00:00"
3167 | },
3168 | {
3169 | "name": "symfony/event-dispatcher",
3170 | "version": "v4.2.3",
3171 | "source": {
3172 | "type": "git",
3173 | "url": "https://github.com/symfony/event-dispatcher.git",
3174 | "reference": "bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1"
3175 | },
3176 | "dist": {
3177 | "type": "zip",
3178 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1",
3179 | "reference": "bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1",
3180 | "shasum": ""
3181 | },
3182 | "require": {
3183 | "php": "^7.1.3",
3184 | "symfony/contracts": "^1.0"
3185 | },
3186 | "conflict": {
3187 | "symfony/dependency-injection": "<3.4"
3188 | },
3189 | "require-dev": {
3190 | "psr/log": "~1.0",
3191 | "symfony/config": "~3.4|~4.0",
3192 | "symfony/dependency-injection": "~3.4|~4.0",
3193 | "symfony/expression-language": "~3.4|~4.0",
3194 | "symfony/stopwatch": "~3.4|~4.0"
3195 | },
3196 | "suggest": {
3197 | "symfony/dependency-injection": "",
3198 | "symfony/http-kernel": ""
3199 | },
3200 | "type": "library",
3201 | "extra": {
3202 | "branch-alias": {
3203 | "dev-master": "4.2-dev"
3204 | }
3205 | },
3206 | "autoload": {
3207 | "psr-4": {
3208 | "Symfony\\Component\\EventDispatcher\\": ""
3209 | },
3210 | "exclude-from-classmap": [
3211 | "/Tests/"
3212 | ]
3213 | },
3214 | "notification-url": "https://packagist.org/downloads/",
3215 | "license": [
3216 | "MIT"
3217 | ],
3218 | "authors": [
3219 | {
3220 | "name": "Fabien Potencier",
3221 | "email": "fabien@symfony.com"
3222 | },
3223 | {
3224 | "name": "Symfony Community",
3225 | "homepage": "https://symfony.com/contributors"
3226 | }
3227 | ],
3228 | "description": "Symfony EventDispatcher Component",
3229 | "homepage": "https://symfony.com",
3230 | "time": "2019-01-16T20:35:37+00:00"
3231 | },
3232 | {
3233 | "name": "symfony/filesystem",
3234 | "version": "v4.2.3",
3235 | "source": {
3236 | "type": "git",
3237 | "url": "https://github.com/symfony/filesystem.git",
3238 | "reference": "7c16ebc2629827d4ec915a52ac809768d060a4ee"
3239 | },
3240 | "dist": {
3241 | "type": "zip",
3242 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/7c16ebc2629827d4ec915a52ac809768d060a4ee",
3243 | "reference": "7c16ebc2629827d4ec915a52ac809768d060a4ee",
3244 | "shasum": ""
3245 | },
3246 | "require": {
3247 | "php": "^7.1.3",
3248 | "symfony/polyfill-ctype": "~1.8"
3249 | },
3250 | "type": "library",
3251 | "extra": {
3252 | "branch-alias": {
3253 | "dev-master": "4.2-dev"
3254 | }
3255 | },
3256 | "autoload": {
3257 | "psr-4": {
3258 | "Symfony\\Component\\Filesystem\\": ""
3259 | },
3260 | "exclude-from-classmap": [
3261 | "/Tests/"
3262 | ]
3263 | },
3264 | "notification-url": "https://packagist.org/downloads/",
3265 | "license": [
3266 | "MIT"
3267 | ],
3268 | "authors": [
3269 | {
3270 | "name": "Fabien Potencier",
3271 | "email": "fabien@symfony.com"
3272 | },
3273 | {
3274 | "name": "Symfony Community",
3275 | "homepage": "https://symfony.com/contributors"
3276 | }
3277 | ],
3278 | "description": "Symfony Filesystem Component",
3279 | "homepage": "https://symfony.com",
3280 | "time": "2019-01-16T20:35:37+00:00"
3281 | },
3282 | {
3283 | "name": "symfony/finder",
3284 | "version": "v4.2.3",
3285 | "source": {
3286 | "type": "git",
3287 | "url": "https://github.com/symfony/finder.git",
3288 | "reference": "ef71816cbb264988bb57fe6a73f610888b9aa70c"
3289 | },
3290 | "dist": {
3291 | "type": "zip",
3292 | "url": "https://api.github.com/repos/symfony/finder/zipball/ef71816cbb264988bb57fe6a73f610888b9aa70c",
3293 | "reference": "ef71816cbb264988bb57fe6a73f610888b9aa70c",
3294 | "shasum": ""
3295 | },
3296 | "require": {
3297 | "php": "^7.1.3"
3298 | },
3299 | "type": "library",
3300 | "extra": {
3301 | "branch-alias": {
3302 | "dev-master": "4.2-dev"
3303 | }
3304 | },
3305 | "autoload": {
3306 | "psr-4": {
3307 | "Symfony\\Component\\Finder\\": ""
3308 | },
3309 | "exclude-from-classmap": [
3310 | "/Tests/"
3311 | ]
3312 | },
3313 | "notification-url": "https://packagist.org/downloads/",
3314 | "license": [
3315 | "MIT"
3316 | ],
3317 | "authors": [
3318 | {
3319 | "name": "Fabien Potencier",
3320 | "email": "fabien@symfony.com"
3321 | },
3322 | {
3323 | "name": "Symfony Community",
3324 | "homepage": "https://symfony.com/contributors"
3325 | }
3326 | ],
3327 | "description": "Symfony Finder Component",
3328 | "homepage": "https://symfony.com",
3329 | "time": "2019-01-16T20:35:37+00:00"
3330 | },
3331 | {
3332 | "name": "symfony/options-resolver",
3333 | "version": "v4.2.3",
3334 | "source": {
3335 | "type": "git",
3336 | "url": "https://github.com/symfony/options-resolver.git",
3337 | "reference": "831b272963a8aa5a0613a1a7f013322d8161bbbb"
3338 | },
3339 | "dist": {
3340 | "type": "zip",
3341 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/831b272963a8aa5a0613a1a7f013322d8161bbbb",
3342 | "reference": "831b272963a8aa5a0613a1a7f013322d8161bbbb",
3343 | "shasum": ""
3344 | },
3345 | "require": {
3346 | "php": "^7.1.3"
3347 | },
3348 | "type": "library",
3349 | "extra": {
3350 | "branch-alias": {
3351 | "dev-master": "4.2-dev"
3352 | }
3353 | },
3354 | "autoload": {
3355 | "psr-4": {
3356 | "Symfony\\Component\\OptionsResolver\\": ""
3357 | },
3358 | "exclude-from-classmap": [
3359 | "/Tests/"
3360 | ]
3361 | },
3362 | "notification-url": "https://packagist.org/downloads/",
3363 | "license": [
3364 | "MIT"
3365 | ],
3366 | "authors": [
3367 | {
3368 | "name": "Fabien Potencier",
3369 | "email": "fabien@symfony.com"
3370 | },
3371 | {
3372 | "name": "Symfony Community",
3373 | "homepage": "https://symfony.com/contributors"
3374 | }
3375 | ],
3376 | "description": "Symfony OptionsResolver Component",
3377 | "homepage": "https://symfony.com",
3378 | "keywords": [
3379 | "config",
3380 | "configuration",
3381 | "options"
3382 | ],
3383 | "time": "2019-01-16T21:31:25+00:00"
3384 | },
3385 | {
3386 | "name": "symfony/polyfill-ctype",
3387 | "version": "v1.10.0",
3388 | "source": {
3389 | "type": "git",
3390 | "url": "https://github.com/symfony/polyfill-ctype.git",
3391 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
3392 | },
3393 | "dist": {
3394 | "type": "zip",
3395 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
3396 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
3397 | "shasum": ""
3398 | },
3399 | "require": {
3400 | "php": ">=5.3.3"
3401 | },
3402 | "suggest": {
3403 | "ext-ctype": "For best performance"
3404 | },
3405 | "type": "library",
3406 | "extra": {
3407 | "branch-alias": {
3408 | "dev-master": "1.9-dev"
3409 | }
3410 | },
3411 | "autoload": {
3412 | "psr-4": {
3413 | "Symfony\\Polyfill\\Ctype\\": ""
3414 | },
3415 | "files": [
3416 | "bootstrap.php"
3417 | ]
3418 | },
3419 | "notification-url": "https://packagist.org/downloads/",
3420 | "license": [
3421 | "MIT"
3422 | ],
3423 | "authors": [
3424 | {
3425 | "name": "Symfony Community",
3426 | "homepage": "https://symfony.com/contributors"
3427 | },
3428 | {
3429 | "name": "Gert de Pagter",
3430 | "email": "backendtea@gmail.com"
3431 | }
3432 | ],
3433 | "description": "Symfony polyfill for ctype functions",
3434 | "homepage": "https://symfony.com",
3435 | "keywords": [
3436 | "compatibility",
3437 | "ctype",
3438 | "polyfill",
3439 | "portable"
3440 | ],
3441 | "time": "2018-08-06T14:22:27+00:00"
3442 | },
3443 | {
3444 | "name": "symfony/polyfill-mbstring",
3445 | "version": "v1.10.0",
3446 | "source": {
3447 | "type": "git",
3448 | "url": "https://github.com/symfony/polyfill-mbstring.git",
3449 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494"
3450 | },
3451 | "dist": {
3452 | "type": "zip",
3453 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494",
3454 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494",
3455 | "shasum": ""
3456 | },
3457 | "require": {
3458 | "php": ">=5.3.3"
3459 | },
3460 | "suggest": {
3461 | "ext-mbstring": "For best performance"
3462 | },
3463 | "type": "library",
3464 | "extra": {
3465 | "branch-alias": {
3466 | "dev-master": "1.9-dev"
3467 | }
3468 | },
3469 | "autoload": {
3470 | "psr-4": {
3471 | "Symfony\\Polyfill\\Mbstring\\": ""
3472 | },
3473 | "files": [
3474 | "bootstrap.php"
3475 | ]
3476 | },
3477 | "notification-url": "https://packagist.org/downloads/",
3478 | "license": [
3479 | "MIT"
3480 | ],
3481 | "authors": [
3482 | {
3483 | "name": "Nicolas Grekas",
3484 | "email": "p@tchwork.com"
3485 | },
3486 | {
3487 | "name": "Symfony Community",
3488 | "homepage": "https://symfony.com/contributors"
3489 | }
3490 | ],
3491 | "description": "Symfony polyfill for the Mbstring extension",
3492 | "homepage": "https://symfony.com",
3493 | "keywords": [
3494 | "compatibility",
3495 | "mbstring",
3496 | "polyfill",
3497 | "portable",
3498 | "shim"
3499 | ],
3500 | "time": "2018-09-21T13:07:52+00:00"
3501 | },
3502 | {
3503 | "name": "symfony/polyfill-php70",
3504 | "version": "v1.10.0",
3505 | "source": {
3506 | "type": "git",
3507 | "url": "https://github.com/symfony/polyfill-php70.git",
3508 | "reference": "6b88000cdd431cd2e940caa2cb569201f3f84224"
3509 | },
3510 | "dist": {
3511 | "type": "zip",
3512 | "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224",
3513 | "reference": "6b88000cdd431cd2e940caa2cb569201f3f84224",
3514 | "shasum": ""
3515 | },
3516 | "require": {
3517 | "paragonie/random_compat": "~1.0|~2.0|~9.99",
3518 | "php": ">=5.3.3"
3519 | },
3520 | "type": "library",
3521 | "extra": {
3522 | "branch-alias": {
3523 | "dev-master": "1.9-dev"
3524 | }
3525 | },
3526 | "autoload": {
3527 | "psr-4": {
3528 | "Symfony\\Polyfill\\Php70\\": ""
3529 | },
3530 | "files": [
3531 | "bootstrap.php"
3532 | ],
3533 | "classmap": [
3534 | "Resources/stubs"
3535 | ]
3536 | },
3537 | "notification-url": "https://packagist.org/downloads/",
3538 | "license": [
3539 | "MIT"
3540 | ],
3541 | "authors": [
3542 | {
3543 | "name": "Nicolas Grekas",
3544 | "email": "p@tchwork.com"
3545 | },
3546 | {
3547 | "name": "Symfony Community",
3548 | "homepage": "https://symfony.com/contributors"
3549 | }
3550 | ],
3551 | "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
3552 | "homepage": "https://symfony.com",
3553 | "keywords": [
3554 | "compatibility",
3555 | "polyfill",
3556 | "portable",
3557 | "shim"
3558 | ],
3559 | "time": "2018-09-21T06:26:08+00:00"
3560 | },
3561 | {
3562 | "name": "symfony/polyfill-php72",
3563 | "version": "v1.10.0",
3564 | "source": {
3565 | "type": "git",
3566 | "url": "https://github.com/symfony/polyfill-php72.git",
3567 | "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631"
3568 | },
3569 | "dist": {
3570 | "type": "zip",
3571 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631",
3572 | "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631",
3573 | "shasum": ""
3574 | },
3575 | "require": {
3576 | "php": ">=5.3.3"
3577 | },
3578 | "type": "library",
3579 | "extra": {
3580 | "branch-alias": {
3581 | "dev-master": "1.9-dev"
3582 | }
3583 | },
3584 | "autoload": {
3585 | "psr-4": {
3586 | "Symfony\\Polyfill\\Php72\\": ""
3587 | },
3588 | "files": [
3589 | "bootstrap.php"
3590 | ]
3591 | },
3592 | "notification-url": "https://packagist.org/downloads/",
3593 | "license": [
3594 | "MIT"
3595 | ],
3596 | "authors": [
3597 | {
3598 | "name": "Nicolas Grekas",
3599 | "email": "p@tchwork.com"
3600 | },
3601 | {
3602 | "name": "Symfony Community",
3603 | "homepage": "https://symfony.com/contributors"
3604 | }
3605 | ],
3606 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
3607 | "homepage": "https://symfony.com",
3608 | "keywords": [
3609 | "compatibility",
3610 | "polyfill",
3611 | "portable",
3612 | "shim"
3613 | ],
3614 | "time": "2018-09-21T13:07:52+00:00"
3615 | },
3616 | {
3617 | "name": "symfony/process",
3618 | "version": "v4.2.3",
3619 | "source": {
3620 | "type": "git",
3621 | "url": "https://github.com/symfony/process.git",
3622 | "reference": "6c05edb11fbeff9e2b324b4270ecb17911a8b7ad"
3623 | },
3624 | "dist": {
3625 | "type": "zip",
3626 | "url": "https://api.github.com/repos/symfony/process/zipball/6c05edb11fbeff9e2b324b4270ecb17911a8b7ad",
3627 | "reference": "6c05edb11fbeff9e2b324b4270ecb17911a8b7ad",
3628 | "shasum": ""
3629 | },
3630 | "require": {
3631 | "php": "^7.1.3"
3632 | },
3633 | "type": "library",
3634 | "extra": {
3635 | "branch-alias": {
3636 | "dev-master": "4.2-dev"
3637 | }
3638 | },
3639 | "autoload": {
3640 | "psr-4": {
3641 | "Symfony\\Component\\Process\\": ""
3642 | },
3643 | "exclude-from-classmap": [
3644 | "/Tests/"
3645 | ]
3646 | },
3647 | "notification-url": "https://packagist.org/downloads/",
3648 | "license": [
3649 | "MIT"
3650 | ],
3651 | "authors": [
3652 | {
3653 | "name": "Fabien Potencier",
3654 | "email": "fabien@symfony.com"
3655 | },
3656 | {
3657 | "name": "Symfony Community",
3658 | "homepage": "https://symfony.com/contributors"
3659 | }
3660 | ],
3661 | "description": "Symfony Process Component",
3662 | "homepage": "https://symfony.com",
3663 | "time": "2019-01-24T22:05:03+00:00"
3664 | },
3665 | {
3666 | "name": "symfony/stopwatch",
3667 | "version": "v4.2.3",
3668 | "source": {
3669 | "type": "git",
3670 | "url": "https://github.com/symfony/stopwatch.git",
3671 | "reference": "b1a5f646d56a3290230dbc8edf2a0d62cda23f67"
3672 | },
3673 | "dist": {
3674 | "type": "zip",
3675 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b1a5f646d56a3290230dbc8edf2a0d62cda23f67",
3676 | "reference": "b1a5f646d56a3290230dbc8edf2a0d62cda23f67",
3677 | "shasum": ""
3678 | },
3679 | "require": {
3680 | "php": "^7.1.3",
3681 | "symfony/contracts": "^1.0"
3682 | },
3683 | "type": "library",
3684 | "extra": {
3685 | "branch-alias": {
3686 | "dev-master": "4.2-dev"
3687 | }
3688 | },
3689 | "autoload": {
3690 | "psr-4": {
3691 | "Symfony\\Component\\Stopwatch\\": ""
3692 | },
3693 | "exclude-from-classmap": [
3694 | "/Tests/"
3695 | ]
3696 | },
3697 | "notification-url": "https://packagist.org/downloads/",
3698 | "license": [
3699 | "MIT"
3700 | ],
3701 | "authors": [
3702 | {
3703 | "name": "Fabien Potencier",
3704 | "email": "fabien@symfony.com"
3705 | },
3706 | {
3707 | "name": "Symfony Community",
3708 | "homepage": "https://symfony.com/contributors"
3709 | }
3710 | ],
3711 | "description": "Symfony Stopwatch Component",
3712 | "homepage": "https://symfony.com",
3713 | "time": "2019-01-16T20:31:39+00:00"
3714 | },
3715 | {
3716 | "name": "symfony/var-dumper",
3717 | "version": "v4.2.3",
3718 | "source": {
3719 | "type": "git",
3720 | "url": "https://github.com/symfony/var-dumper.git",
3721 | "reference": "223bda89f9be41cf7033eeaf11bc61a280489c17"
3722 | },
3723 | "dist": {
3724 | "type": "zip",
3725 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/223bda89f9be41cf7033eeaf11bc61a280489c17",
3726 | "reference": "223bda89f9be41cf7033eeaf11bc61a280489c17",
3727 | "shasum": ""
3728 | },
3729 | "require": {
3730 | "php": "^7.1.3",
3731 | "symfony/polyfill-mbstring": "~1.0",
3732 | "symfony/polyfill-php72": "~1.5"
3733 | },
3734 | "conflict": {
3735 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
3736 | "symfony/console": "<3.4"
3737 | },
3738 | "require-dev": {
3739 | "ext-iconv": "*",
3740 | "symfony/console": "~3.4|~4.0",
3741 | "symfony/process": "~3.4|~4.0",
3742 | "twig/twig": "~1.34|~2.4"
3743 | },
3744 | "suggest": {
3745 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
3746 | "ext-intl": "To show region name in time zone dump",
3747 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
3748 | },
3749 | "bin": [
3750 | "Resources/bin/var-dump-server"
3751 | ],
3752 | "type": "library",
3753 | "extra": {
3754 | "branch-alias": {
3755 | "dev-master": "4.2-dev"
3756 | }
3757 | },
3758 | "autoload": {
3759 | "files": [
3760 | "Resources/functions/dump.php"
3761 | ],
3762 | "psr-4": {
3763 | "Symfony\\Component\\VarDumper\\": ""
3764 | },
3765 | "exclude-from-classmap": [
3766 | "/Tests/"
3767 | ]
3768 | },
3769 | "notification-url": "https://packagist.org/downloads/",
3770 | "license": [
3771 | "MIT"
3772 | ],
3773 | "authors": [
3774 | {
3775 | "name": "Nicolas Grekas",
3776 | "email": "p@tchwork.com"
3777 | },
3778 | {
3779 | "name": "Symfony Community",
3780 | "homepage": "https://symfony.com/contributors"
3781 | }
3782 | ],
3783 | "description": "Symfony mechanism for exploring and dumping PHP variables",
3784 | "homepage": "https://symfony.com",
3785 | "keywords": [
3786 | "debug",
3787 | "dump"
3788 | ],
3789 | "time": "2019-01-30T11:44:30+00:00"
3790 | },
3791 | {
3792 | "name": "symfony/yaml",
3793 | "version": "v4.2.4",
3794 | "source": {
3795 | "type": "git",
3796 | "url": "https://github.com/symfony/yaml.git",
3797 | "reference": "761fa560a937fd7686e5274ff89dcfa87a5047df"
3798 | },
3799 | "dist": {
3800 | "type": "zip",
3801 | "url": "https://api.github.com/repos/symfony/yaml/zipball/761fa560a937fd7686e5274ff89dcfa87a5047df",
3802 | "reference": "761fa560a937fd7686e5274ff89dcfa87a5047df",
3803 | "shasum": ""
3804 | },
3805 | "require": {
3806 | "php": "^7.1.3",
3807 | "symfony/polyfill-ctype": "~1.8"
3808 | },
3809 | "conflict": {
3810 | "symfony/console": "<3.4"
3811 | },
3812 | "require-dev": {
3813 | "symfony/console": "~3.4|~4.0"
3814 | },
3815 | "suggest": {
3816 | "symfony/console": "For validating YAML files using the lint command"
3817 | },
3818 | "type": "library",
3819 | "extra": {
3820 | "branch-alias": {
3821 | "dev-master": "4.2-dev"
3822 | }
3823 | },
3824 | "autoload": {
3825 | "psr-4": {
3826 | "Symfony\\Component\\Yaml\\": ""
3827 | },
3828 | "exclude-from-classmap": [
3829 | "/Tests/"
3830 | ]
3831 | },
3832 | "notification-url": "https://packagist.org/downloads/",
3833 | "license": [
3834 | "MIT"
3835 | ],
3836 | "authors": [
3837 | {
3838 | "name": "Fabien Potencier",
3839 | "email": "fabien@symfony.com"
3840 | },
3841 | {
3842 | "name": "Symfony Community",
3843 | "homepage": "https://symfony.com/contributors"
3844 | }
3845 | ],
3846 | "description": "Symfony Yaml Component",
3847 | "homepage": "https://symfony.com",
3848 | "time": "2019-02-23T15:17:42+00:00"
3849 | },
3850 | {
3851 | "name": "theseer/tokenizer",
3852 | "version": "1.1.0",
3853 | "source": {
3854 | "type": "git",
3855 | "url": "https://github.com/theseer/tokenizer.git",
3856 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b"
3857 | },
3858 | "dist": {
3859 | "type": "zip",
3860 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b",
3861 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b",
3862 | "shasum": ""
3863 | },
3864 | "require": {
3865 | "ext-dom": "*",
3866 | "ext-tokenizer": "*",
3867 | "ext-xmlwriter": "*",
3868 | "php": "^7.0"
3869 | },
3870 | "type": "library",
3871 | "autoload": {
3872 | "classmap": [
3873 | "src/"
3874 | ]
3875 | },
3876 | "notification-url": "https://packagist.org/downloads/",
3877 | "license": [
3878 | "BSD-3-Clause"
3879 | ],
3880 | "authors": [
3881 | {
3882 | "name": "Arne Blankerts",
3883 | "email": "arne@blankerts.de",
3884 | "role": "Developer"
3885 | }
3886 | ],
3887 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
3888 | "time": "2017-04-07T12:08:54+00:00"
3889 | },
3890 | {
3891 | "name": "webmozart/assert",
3892 | "version": "1.4.0",
3893 | "source": {
3894 | "type": "git",
3895 | "url": "https://github.com/webmozart/assert.git",
3896 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9"
3897 | },
3898 | "dist": {
3899 | "type": "zip",
3900 | "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9",
3901 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9",
3902 | "shasum": ""
3903 | },
3904 | "require": {
3905 | "php": "^5.3.3 || ^7.0",
3906 | "symfony/polyfill-ctype": "^1.8"
3907 | },
3908 | "require-dev": {
3909 | "phpunit/phpunit": "^4.6",
3910 | "sebastian/version": "^1.0.1"
3911 | },
3912 | "type": "library",
3913 | "extra": {
3914 | "branch-alias": {
3915 | "dev-master": "1.3-dev"
3916 | }
3917 | },
3918 | "autoload": {
3919 | "psr-4": {
3920 | "Webmozart\\Assert\\": "src/"
3921 | }
3922 | },
3923 | "notification-url": "https://packagist.org/downloads/",
3924 | "license": [
3925 | "MIT"
3926 | ],
3927 | "authors": [
3928 | {
3929 | "name": "Bernhard Schussek",
3930 | "email": "bschussek@gmail.com"
3931 | }
3932 | ],
3933 | "description": "Assertions to validate method input/output with nice error messages.",
3934 | "keywords": [
3935 | "assert",
3936 | "check",
3937 | "validate"
3938 | ],
3939 | "time": "2018-12-25T11:19:39+00:00"
3940 | }
3941 | ],
3942 | "aliases": [],
3943 | "minimum-stability": "stable",
3944 | "stability-flags": [],
3945 | "prefer-stable": false,
3946 | "prefer-lowest": false,
3947 | "platform": {
3948 | "php": "^7.2"
3949 | },
3950 | "platform-dev": []
3951 | }
3952 |
--------------------------------------------------------------------------------
/infection.json.dist:
--------------------------------------------------------------------------------
1 | {
2 | "timeout": 10,
3 | "source": {
4 | "directories": [
5 | "src"
6 | ]
7 | },
8 | "logs": {
9 | "text": "infection.log"
10 | },
11 | "mutators": {
12 | "@default": true
13 | }
14 | }
--------------------------------------------------------------------------------
/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | tests
6 |
7 |
8 |
9 |
10 |
11 | src
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/Client.php:
--------------------------------------------------------------------------------
1 | stream = $stream;
26 | $this->setClassmap($classmap);
27 | }
28 |
29 | /**
30 | * Iterates the stream data, mapping the retrieved data and yielding the result.
31 | *
32 | * @param int $length The maximum length in bytes to iterate. 0 or negative numbers will be interpretted as reading until the end of the stream.
33 | */
34 | public function iterate(int $length = 0): \Iterator
35 | {
36 | while (!empty($data = $this->stream->read($length))) {
37 | $xml = new \SimpleXMLElement($data);
38 |
39 | yield $this->cast($xml);
40 | }
41 |
42 | $this->stream->rewind();
43 | }
44 |
45 | /**
46 | * Collects all iterable items into an array.
47 | */
48 | public function collect(): array
49 | {
50 | $items = [];
51 |
52 | foreach ($this->iterate() as $v) {
53 | $items[] = $v;
54 | }
55 |
56 | return $items;
57 | }
58 |
59 | /**
60 | * Closes the stream from the client.
61 | *
62 | * @return void
63 | */
64 | public function close()
65 | {
66 | $this->stream->close();
67 | }
68 |
69 | public function getIterator()
70 | {
71 | foreach ($this->iterate() as $value) {
72 | yield $value;
73 | }
74 | }
75 |
76 | public function count()
77 | {
78 | $i = 0;
79 |
80 | foreach ($this->iterate() as $v) {
81 | $i += 1;
82 | }
83 |
84 | return $i;
85 | }
86 |
87 | /**
88 | * Casts a SimpleXMLElement to a given object by classname, or returns simple xml element if unavailable.
89 | */
90 | private function cast(\SimpleXMLElement $element): object
91 | {
92 | if (!isset($this->classmap[$element->getName()])) {
93 | return $element;
94 | }
95 |
96 | $class = $this->classmap[$element->getName()];
97 |
98 | return $class::fromSimpleXML($element);
99 | }
100 |
101 | /**
102 | * Validates and sets the classmap.
103 | *
104 | * @return void
105 | */
106 | private function setClassmap(array $classmap)
107 | {
108 | foreach ($classmap as $class) {
109 | if (!in_array($interface = CreateFromSimpleXML::class, class_implements($class))) {
110 | throw new \InvalidArgumentException("Class `{$class}` must implement `{$interface}`");
111 | }
112 | }
113 |
114 | $this->classmap = $classmap;
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/src/CreateFromSimpleXML.php:
--------------------------------------------------------------------------------
1 | position = 0;
24 | $this->max = $max;
25 | }
26 |
27 | /**
28 | * The current position of the cursor.
29 | */
30 | public function position(): int
31 | {
32 | return $this->position;
33 | }
34 |
35 | /**
36 | * The max position of the cursor.
37 | */
38 | public function max(): int
39 | {
40 | return $this->max;
41 | }
42 |
43 | /**
44 | * Reset the position of the cursor.
45 | */
46 | public function reset(): self
47 | {
48 | $this->position = 0;
49 |
50 | return $this;
51 | }
52 |
53 | /**
54 | * Sets the absolute position of the cursor.
55 | */
56 | public function set(int $position): self
57 | {
58 | $this->position = max(0, min($position, $this->max));
59 |
60 | return $this;
61 | }
62 |
63 | /**
64 | * Moves the cursor by the provided distance, relative to the current position. Negative numbers move backwards.
65 | */
66 | public function move(int $distance): self
67 | {
68 | $pos = $this->position + $distance;
69 | $range = $this->max + 1;
70 |
71 | if ($pos < 0) {
72 | $pos = -$pos % $range;
73 | $pos = $this->max - ($pos - 1);
74 | } elseif ($pos > $this->max) {
75 | $pos = $distance % $range;
76 | }
77 |
78 | return $this->set($pos);
79 | }
80 |
81 | /**
82 | * Move the cursor backwards relative to the current position.
83 | */
84 | public function backwards(int $distance = 1): self
85 | {
86 | return $this->move(-$distance);
87 | }
88 |
89 | /**
90 | * Move the cursor forwards relative to the current position.
91 | */
92 | public function forwards(int $distance = 1): self
93 | {
94 | return $this->move($distance);
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/src/Streams/FileReaderStream.php:
--------------------------------------------------------------------------------
1 | file = $file;
25 | parent::__construct($depth);
26 | }
27 |
28 | protected function newXMLReader(): \XMLReader
29 | {
30 | try {
31 | $reader = new \XMLReader;
32 |
33 | if (!$reader->open($this->file)) {
34 | throw new \RuntimeException("Failed to open file `{$this->file}`");
35 | }
36 |
37 | return $reader;
38 | } catch (\Throwable $err) {
39 | throw new \RuntimeException($err->getMessage(), $err->getCode(), $err);
40 | }
41 | }
42 |
43 | protected function sizeInBytes(): int
44 | {
45 | $size = filesize($this->file);
46 |
47 | if (!$size) {
48 | return 0;
49 | }
50 |
51 | return $size;
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/Streams/ReaderStream.php:
--------------------------------------------------------------------------------
1 | setDepth($depth);
62 | $this->reader = $this->newXMLReader();
63 | $this->readable = true;
64 | $this->seekable = true;
65 | $this->meta = [
66 | 'size' => $this->sizeInBytes(),
67 | ];
68 | $this->cursor = $this->newCursor();
69 | }
70 |
71 | /**
72 | * Create a new XMLReader.
73 | *
74 | * @throws \RuntimeException
75 | */
76 | abstract protected function newXMLReader(): \XMLReader;
77 |
78 | /**
79 | * Returns the size of the read stream.
80 | */
81 | abstract protected function sizeInBytes(): int;
82 |
83 | /**
84 | * Closes the stream when the destructed
85 | */
86 | public function __destruct()
87 | {
88 | $this->close();
89 | }
90 |
91 | /**
92 | * Reads all data from the stream into a string, from the beginning to end.
93 | *
94 | * This method MUST attempt to seek to the beginning of the stream before
95 | * reading data and read the stream until the end is reached.
96 | *
97 | * Warning: This could attempt to load a large amount of data into memory.
98 | *
99 | * This method MUST NOT raise an exception in order to conform with PHP's
100 | * string casting operations.
101 | *
102 | * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring
103 | * @return string
104 | */
105 | public function __toString()
106 | {
107 | try {
108 | $this->rewind();
109 |
110 | return $this->getContents();
111 | } catch (\RuntimeException $err) {
112 | return '';
113 | }
114 | }
115 |
116 | /**
117 | * Closes the stream and any underlying resources.
118 | *
119 | * @return void
120 | */
121 | public function close()
122 | {
123 | $this->reader->close();
124 | $this->readable = false;
125 | $this->seekable = false;
126 | }
127 |
128 | /**
129 | * Separates any underlying resources from the stream.
130 | *
131 | * After the stream has been detached, the stream is in an unusable state.
132 | *
133 | * @return resource|null Underlying PHP stream, if any
134 | */
135 | public function detach()
136 | {
137 | $this->reader->close();
138 | }
139 |
140 | /**
141 | * Get the size of the stream if known.
142 | *
143 | * @return int Returns the size in bytes.
144 | */
145 | public function getSize()
146 | {
147 | return $this->getMetadata('size');
148 | }
149 |
150 | /**
151 | * Returns the current position of the file read/write pointer
152 | *
153 | * @return int Position of the file pointer
154 | * @throws \RuntimeException on error.
155 | */
156 | public function tell()
157 | {
158 | return $this->cursor->position();
159 | }
160 |
161 | /**
162 | * Returns true if the stream is at the end of the stream.
163 | *
164 | * @return bool
165 | */
166 | public function eof()
167 | {
168 | return $this->cursor->position() >= $this->cursor->max();
169 | }
170 |
171 | /**
172 | * Returns whether or not the stream is seekable.
173 | *
174 | * @return bool
175 | */
176 | public function isSeekable()
177 | {
178 | return $this->seekable;
179 | }
180 |
181 | /**
182 | * Seek to a position in the stream.
183 | *
184 | * @link http://www.php.net/manual/en/function.fseek.php
185 | * @param int $offset Stream offset
186 | * @param int $whence Specifies how the cursor position will be calculated
187 | * based on the seek offset. Valid values are identical to the built-in
188 | * PHP $whence values for `fseek()`. SEEK_SET: Set position equal to
189 | * offset bytes SEEK_CUR: Set position to current location plus offset
190 | * SEEK_END: Set position to end-of-stream plus offset.
191 | * @throws \RuntimeException on failure.
192 | */
193 | public function seek($offset, $whence = SEEK_SET)
194 | {
195 | if (!$this->isSeekable()) {
196 | throw new \RuntimeException('stream is not seekable');
197 | }
198 |
199 | switch ($whence) {
200 | case SEEK_SET:
201 | $this->rewind();
202 | $this->cursor->set($offset);
203 | break;
204 | case SEEK_CUR:
205 | $this->reader = $this->newXMLReader();
206 | $this->cursor->move($offset);
207 | break;
208 | case SEEK_END:
209 | $this->rewind();
210 | $this->cursor->backwards()->move($offset);
211 | break;
212 | }
213 |
214 | // NOTE: This iterates by node tree count rather than bytes
215 | for ($i = 0; $i < $this->cursor->position(); $i++) {
216 | $this->reader->next();
217 | }
218 | }
219 |
220 | /**
221 | * Seek to the beginning of the stream.
222 | *
223 | * If the stream is not seekable, this method will raise an exception;
224 | * otherwise, it will perform a seek(0).
225 | *
226 | * @see seek()
227 | * @link http://www.php.net/manual/en/function.fseek.php
228 | * @throws \RuntimeException on failure.
229 | */
230 | public function rewind()
231 | {
232 | $this->cursor->reset();
233 | $this->reader->close();
234 | $this->reader = $this->newXMLReader();
235 | }
236 |
237 | /**
238 | * Returns whether or not the stream is writable.
239 | *
240 | * @return bool
241 | */
242 | public function isWritable()
243 | {
244 | return false;
245 | }
246 |
247 | /**
248 | * Write data to the stream.
249 | *
250 | * @param string $string The string that is to be written.
251 | * @return int Returns the number of bytes written to the stream.
252 | * @throws \RuntimeException on failure.
253 | */
254 | public function write($string)
255 | {
256 | throw new \RuntimeException("FileReaderStream cannot write.");
257 | }
258 |
259 | /**
260 | * Returns whether or not the stream is readable.
261 | *
262 | * @return bool
263 | */
264 | public function isReadable()
265 | {
266 | return $this->readable;
267 | }
268 |
269 | /**
270 | * Read data from the stream.
271 | *
272 | * @param int $length Read up to $length bytes from the object and return
273 | * them. Fewer than $length bytes may be returned if underlying stream
274 | * call returns fewer bytes.
275 | * @return string Returns the data read from the stream, or an empty string
276 | * if no bytes are available.
277 | * @throws \RuntimeException if an error occurs.
278 | */
279 | public function read($length)
280 | {
281 | if (!$this->isReadable()) {
282 | throw new \RuntimeException('stream is not readable');
283 | }
284 |
285 | try {
286 | while ($this->reader->read()) {
287 | if ($this->reader->nodeType !== \XMLReader::ELEMENT) {
288 | continue;
289 | }
290 |
291 | if (is_int($this->depth) && $this->reader->depth !== $this->depth) {
292 | continue;
293 | }
294 |
295 | if (is_string($this->depth) && $this->reader->name !== $this->depth) {
296 | continue;
297 | }
298 |
299 | $xml = $this->reader->readOuterXML();
300 |
301 | if (($length > 0) && strlen($xml) > $length) {
302 | return '';
303 | }
304 |
305 | $this->cursor->forwards();
306 |
307 | return $xml;
308 | }
309 | } catch (\Throwable $err) {
310 | throw new \RuntimeException($err->getMessage(), $err->getCode(), $err);
311 | }
312 |
313 | return '';
314 | }
315 |
316 | /**
317 | * Returns the remaining contents in a string
318 | *
319 | * @return string
320 | * @throws \RuntimeException if unable to read or an error occurs while
321 | * reading.
322 | */
323 | public function getContents()
324 | {
325 | $contents = '';
326 |
327 | while (!empty($data = $this->read(0))) {
328 | $contents .= $data;
329 | }
330 |
331 | return $contents;
332 | }
333 |
334 | /**
335 | * Get stream metadata as an associative array or retrieve a specific key.
336 | *
337 | * The keys returned are identical to the keys returned from PHP's
338 | * stream_get_meta_data() function.
339 | *
340 | * @link http://php.net/manual/en/function.stream-get-meta-data.php
341 | * @param string $key Specific metadata to retrieve.
342 | * @return array|mixed|null Returns an associative array if no key is
343 | * provided. Returns a specific key value if a key is provided and the
344 | * value is found, or null if the key is not found.
345 | */
346 | public function getMetadata($key = null)
347 | {
348 | if ($key) {
349 | return isset($this->meta[$key]) ? $this->meta[$key] : null;
350 | }
351 |
352 | return $this->meta;
353 | }
354 |
355 | /**
356 | * Sets the depth of the reader stream.
357 | *
358 | * @param int|string $depth
359 | *
360 | * @return void
361 | */
362 | private function setDepth($depth)
363 | {
364 | if (!is_int($depth) && !is_string($depth)) {
365 | throw new \InvalidArgumentException('Reader depth must be either an integer or a string tag name, ' . gettype($depth) . ' given.');
366 | }
367 |
368 | if (is_string($depth)) {
369 | if (empty($depth)) {
370 | throw new \InvalidArgumentException('Reader depth cannot be an empty string!');
371 | }
372 |
373 | if (is_numeric($depth)) {
374 | $depth = (int)$depth;
375 | $depth = ($depth > 0) ? $depth : 0;
376 | }
377 | }
378 |
379 | $this->depth = $depth;
380 | }
381 |
382 | /**
383 | * Create a new cursor.
384 | */
385 | private function newCursor(): Cursor
386 | {
387 | return new Cursor(
388 | $this->getSize()
389 | );
390 | }
391 | }
392 |
--------------------------------------------------------------------------------
/src/Streams/StringReaderStream.php:
--------------------------------------------------------------------------------
1 | body = $body;
29 | $this->encoding = $encoding;
30 | parent::__construct($depth);
31 | }
32 |
33 | protected function newXMLReader(): \XMLReader
34 | {
35 | try {
36 | $reader = new \XMLReader;
37 |
38 | if (!$reader->xml($this->body, $this->encoding)) {
39 | throw new \RuntimeException('Cannot read provided XML body.');
40 | }
41 |
42 | return $reader;
43 | } catch (\Throwable $err) {
44 | throw new \RuntimeException($err->getMessage(), $err->getCode(), $err);
45 | }
46 | }
47 |
48 | protected function sizeInBytes(): int
49 | {
50 | return strlen($this->body);
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/tests/ClientTest.php:
--------------------------------------------------------------------------------
1 | stream = new FileReaderStream(__DIR__ . '/assets/test-data.xml', 1);
22 | }
23 |
24 | protected function tearDown(): void
25 | {
26 | $this->stream->close();
27 | }
28 |
29 | /** @test */
30 | public function can_iterate_test_data()
31 | {
32 | $items = [];
33 | $client = new Client($this->stream);
34 |
35 | foreach ($client->iterate() as $type) {
36 | $this->assertInstanceOf(\SimpleXMLElement::class, $type);
37 |
38 | $items[] = $type;
39 | }
40 |
41 | $this->assertNotEmpty($items);
42 | $this->assertEquals(1, (int)$items[0]->id);
43 | }
44 |
45 | /** @test */
46 | public function rewinds_after_iteration()
47 | {
48 | $items = [];
49 | $client = new Client($this->stream);
50 |
51 | for ($i = 0; $i < 2; $i++) {
52 | foreach ($client->iterate() as $v) {
53 | $items[] = $v;
54 | }
55 | }
56 |
57 | $this->assertCount(4, $items);
58 | }
59 |
60 | /** @test */
61 | public function can_collect_test_data()
62 | {
63 | $client = new Client($this->stream);
64 | $items = $client->collect();
65 |
66 | $this->assertIsArray($items);
67 | $this->assertCount(2, $items);
68 | }
69 |
70 | /** @test */
71 | public function can_loop_test_data()
72 | {
73 | $items = [];
74 | $client = new Client($this->stream);
75 |
76 | foreach ($client as $type) {
77 | $this->assertInstanceOf(\SimpleXMLElement::class, $type);
78 |
79 | $items[] = $type;
80 | }
81 |
82 | $this->assertNotEmpty($items);
83 | $this->assertEquals(1, (int)$items[0]->id);
84 | }
85 |
86 | /** @test */
87 | public function can_count_test_data()
88 | {
89 | $client = new Client($this->stream);
90 | $this->assertCount(2, $client);
91 | }
92 |
93 | /** @test */
94 | public function can_map_records_to_test_data()
95 | {
96 | $items = [];
97 | $client = new Client($this->stream, [
98 | 'record' => TestRecord::class,
99 | ]);
100 |
101 | foreach ($client->iterate() as $record) {
102 | $this->assertInstanceOf(TestRecord::class, $record);
103 |
104 | $items[] = $record;
105 | }
106 |
107 | $this->assertNotEmpty($items);
108 | $this->assertEquals(1, $items[0]->id);
109 | $this->assertInstanceOf(TestRecord::class, $items[0]);
110 | }
111 |
112 | /** @test */
113 | public function classmapped_classes_must_impement_createfromsimplexml()
114 | {
115 | $this->expectException(\InvalidArgumentException::class);
116 |
117 | $client = new Client($this->stream, [
118 | 'record' => \stdClass::class,
119 | ]);
120 | }
121 |
122 | /** @test */
123 | public function stream_will_rewind_after_iteration()
124 | {
125 | for ($i = 0; $i < 2; $i++) {
126 | $this->can_loop_test_data();
127 | }
128 | }
129 |
130 | /** @test */
131 | public function can_close_stream()
132 | {
133 | $client = new Client($this->stream);
134 | $client->close();
135 |
136 | $this->assertFalse($this->stream->isReadable());
137 | $this->assertFalse($this->stream->isSeekable());
138 | $this->assertFalse($this->stream->isWritable());
139 | }
140 | }
141 |
--------------------------------------------------------------------------------
/tests/CursorTest.php:
--------------------------------------------------------------------------------
1 | max = 10;
23 | $this->cursor = new Cursor($this->max);
24 | }
25 |
26 | /** @test */
27 | public function can_get_max_position()
28 | {
29 | $this->assertEquals($this->max, $this->cursor->max());
30 | }
31 |
32 | /** @test */
33 | public function can_set_position()
34 | {
35 | $this->cursor->set(1);
36 | $this->assertEquals(1, $this->cursor->position());
37 | }
38 |
39 | /** @test */
40 | public function cannot_set_beyond_range()
41 | {
42 | $this->cursor->set(11);
43 | $this->assertEquals($this->max, $this->cursor->position());
44 |
45 | $this->cursor->set(-1);
46 | $this->assertEquals(0, $this->cursor->position());
47 | }
48 |
49 | /** @test */
50 | public function can_move_position_relatively()
51 | {
52 | $this->cursor->move(1);
53 | $this->assertEquals(1, $this->cursor->position());
54 |
55 | $this->cursor->move(-1);
56 | $this->assertEquals(0, $this->cursor->position());
57 | }
58 |
59 | /** @test */
60 | public function can_wrap_position()
61 | {
62 | $this->cursor->move(11);
63 | $this->assertEquals(0, $this->cursor->position());
64 |
65 | $this->cursor->move(-1);
66 | $this->assertEquals($this->max, $this->cursor->position());
67 | }
68 |
69 | /** @test */
70 | public function can_move_position_backwards()
71 | {
72 | $this->cursor->backwards();
73 | $this->assertEquals($this->max, $this->cursor->position());
74 |
75 | $this->cursor->reset();
76 | $this->cursor->backwards(2);
77 | $this->assertEquals(9, $this->cursor->position());
78 | }
79 |
80 | /** @test */
81 | public function can_move_position_forwards()
82 | {
83 | $this->cursor->forwards();
84 | $this->assertEquals(1, $this->cursor->position());
85 |
86 | $this->cursor->reset();
87 | $this->cursor->forwards(11);
88 | $this->assertEquals(0, $this->cursor->position());
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/tests/FileReaderStreamTest.php:
--------------------------------------------------------------------------------
1 | expectException(\RuntimeException::class);
18 |
19 | new FileReaderStream('foobar');
20 | }
21 |
22 | /** @test */
23 | public function will_return_zero_if_unknown_file_size()
24 | {
25 | $this->expectException(\RuntimeException::class);
26 |
27 | $stream = new FileReaderStream('foobar');
28 |
29 | $this->assertEquals(0, $stream->getSize());
30 | }
31 |
32 | /** @test */
33 | public function default_depth_starts_at_root()
34 | {
35 | $stream = new FileReaderStream(__DIR__ . '/assets/test-data.xml');
36 |
37 | $testDataString = '
38 |
39 |
40 | 1
41 | Celina
42 | Elgey
43 | celgey0@purevolume.com
44 | Female
45 | 26.110.129.53
46 |
47 |
48 | 2
49 | Theodor
50 | Blanch
51 | tblanch1@bloomberg.com
52 | Male
53 | 34.246.226.138
54 |
55 | ';
56 |
57 |
58 | $actual = str_replace(["\n", ' '], '', $stream->getContents());
59 | $expected = str_replace(["\n", ' '], '', $testDataString);
60 |
61 | $this->assertEquals($expected, $actual);
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/tests/MemoryUsageTest.php:
--------------------------------------------------------------------------------
1 | client = new Client($stream, [
24 | 'track' => TestTrack::class,
25 | ]);
26 | }
27 |
28 | protected function tearDown(): void
29 | {
30 | $this->client->close();
31 | }
32 |
33 | /** @test */
34 | public function ensure_low_memoy_usage()
35 | {
36 | $filesize = filesize(__DIR__ . '/assets/3MB-test-data.xml');
37 | $maxMemory = memory_get_usage() + $filesize;
38 | $peak = memory_get_peak_usage();
39 | $count = 0;
40 |
41 | foreach ($this->client->iterate() as $type) {
42 | // Allows us to check for totaly memory usage.
43 | $count += 1;
44 | }
45 |
46 | $this->assertLessThan($filesize, $maxMemory - $peak);
47 | $this->assertEquals(25000, $count);
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/tests/NamedFileReaderStreamTest.php:
--------------------------------------------------------------------------------
1 | stream = $this->newStream();
30 | $this->testDataString = '
31 |
32 | 1
33 | Celina
34 | Elgey
35 | celgey0@purevolume.com
36 | Female
37 | 26.110.129.53
38 |
39 |
40 | 2
41 | Theodor
42 | Blanch
43 | tblanch1@bloomberg.com
44 | Male
45 | 34.246.226.138
46 | ';
47 | }
48 |
49 | protected function tearDown(): void
50 | {
51 | $this->stream->close();
52 | }
53 |
54 | /** @test */
55 | public function can_read()
56 | {
57 | $this->assertTrue($this->stream->isReadable());
58 | $count = 0;
59 |
60 | while (!empty($data = $this->stream->read(0))) {
61 | $count += 1;
62 | $this->assertIsString($data);
63 | $this->assertNotEmpty($data);
64 | }
65 |
66 | $this->assertEquals(2, $count);
67 | }
68 |
69 | /** @test */
70 | public function cannot_write()
71 | {
72 | $this->expectException(\RuntimeException::class);
73 | $this->assertFalse($this->stream->isWritable());
74 | $this->stream->write('foo');
75 | }
76 |
77 | /** @test */
78 | public function can_check_position_of_cursor()
79 | {
80 | $this->assertEquals(0, $this->stream->tell());
81 | }
82 |
83 | /** @test */
84 | public function can_seek_position_of_cursor()
85 | {
86 | $this->assertTrue($this->stream->isSeekable());
87 |
88 | $this->stream->seek(1, SEEK_SET); // set to 1
89 | $this->assertEquals(1, $this->stream->tell());
90 |
91 | $this->stream->seek(1, SEEK_CUR); // add 1 to current
92 | $this->assertEquals(2, $this->stream->tell());
93 |
94 | $this->stream->seek(0, SEEK_END); // set to end
95 | $this->assertEquals($this->stream->getSize(), $this->stream->tell());
96 | }
97 |
98 | /** @test */
99 | public function can_rewind_position_of_cursor()
100 | {
101 | $this->stream->seek(1);
102 | $this->stream->rewind();
103 | $this->assertEquals(0, $this->stream->tell());
104 | }
105 |
106 | /** @test */
107 | public function can_get_contents()
108 | {
109 | $actual = str_replace(["\n", ' '], '', $this->stream->getContents());
110 |
111 | $expected = str_replace(["\n", ' '], '', $this->testDataString);
112 |
113 | $this->assertEquals($expected, $actual);
114 | }
115 |
116 | /** @test */
117 | public function can_convert_to_string()
118 | {
119 | $actual = str_replace(["\n", ' '], '', $this->stream->__toString());
120 |
121 | $expected = str_replace(["\n", ' '], '', $this->testDataString);
122 |
123 | $this->assertEquals($expected, $actual);
124 | }
125 |
126 | /** @test */
127 | public function must_rewind_before_converting_to_string()
128 | {
129 | $this->stream->seek(0, SEEK_END);
130 |
131 | $actual = str_replace(["\n", ' '], '', $this->stream->__toString());
132 |
133 | $expected = str_replace(["\n", ' '], '', $this->testDataString);
134 |
135 | $this->assertEquals($expected, $actual);
136 | }
137 |
138 | /** @test */
139 | public function can_get_meta()
140 | {
141 | $meta = $this->stream->getMetadata();
142 | $size = $this->stream->getMetadata('size');
143 | $fake = $this->stream->getMetadata('fake');
144 |
145 | $this->assertIsArray($meta);
146 | $this->assertNotEmpty($meta);
147 | $this->assertNotNull($size);
148 | $this->assertNull($fake);
149 | }
150 |
151 | /** @test */
152 | public function can_close_stream()
153 | {
154 | $this->stream->close();
155 |
156 | $this->assertFalse($this->stream->isReadable());
157 | $this->assertFalse($this->stream->isSeekable());
158 | $this->assertFalse($this->stream->isWritable());
159 | }
160 |
161 | /** @test */
162 | public function cannot_seek_when_closed()
163 | {
164 | $this->expectException(\RuntimeException::class);
165 | $this->stream->close();
166 | $this->stream->seek(0);
167 | }
168 |
169 | /** @test */
170 | public function cannot_read_when_closed()
171 | {
172 | $this->expectException(\RuntimeException::class);
173 | $this->stream->close();
174 | $this->stream->read(0);
175 | }
176 |
177 | /** @test */
178 | public function cannot_read_when_detatched()
179 | {
180 | $this->expectException(\RuntimeException::class);
181 | $this->stream->detach();
182 | $this->stream->read(0);
183 | }
184 |
185 | /** @test */
186 | public function stream_will_close_when_destructured()
187 | {
188 | $this->stream->__destruct();
189 |
190 | $this->assertFalse($this->stream->isReadable());
191 | $this->assertFalse($this->stream->isSeekable());
192 | $this->assertFalse($this->stream->isWritable());
193 | }
194 |
195 | /** @test */
196 | public function can_determine_if_eof()
197 | {
198 | $this->stream->seek(0, SEEK_END);
199 | $this->assertTrue($this->stream->eof());
200 |
201 | $this->stream->seek(-1, SEEK_END);
202 | $this->assertFalse($this->stream->eof());
203 | }
204 |
205 | /** @test */
206 | public function default_depth_starts_at_root()
207 | {
208 | $stream = new class extends ReaderStream {
209 | protected function newXMLReader(): \XMLReader
210 | {
211 | $reader = new \XMLReader();
212 |
213 | $reader->open(__DIR__ . '/assets/test-data.xml');
214 |
215 | return $reader;
216 | }
217 |
218 | protected function sizeInBytes(): int
219 | {
220 | return 0;
221 | }
222 | };
223 |
224 | $testDataString = '
225 |
226 |
227 | 1
228 | Celina
229 | Elgey
230 | celgey0@purevolume.com
231 | Female
232 | 26.110.129.53
233 |
234 |
235 | 2
236 | Theodor
237 | Blanch
238 | tblanch1@bloomberg.com
239 | Male
240 | 34.246.226.138
241 |
242 | ';
243 |
244 |
245 | $actual = str_replace(["\n", ' '], '', $stream->getContents());
246 | $expected = str_replace(["\n", ' '], '', $testDataString);
247 |
248 | $this->assertEquals($expected, $actual);
249 | }
250 | }
251 |
--------------------------------------------------------------------------------
/tests/StringReaderStreamTest.php:
--------------------------------------------------------------------------------
1 | body = $body;
24 |
25 | return new StringReaderStream($this->body, 'UTF-8', 1);
26 | }
27 |
28 | /** @test */
29 | public function default_depth_starts_at_root()
30 | {
31 | $stream = new StringReaderStream($this->body);
32 |
33 | $testDataString = '
34 |
35 |
36 | 1
37 | Celina
38 | Elgey
39 | celgey0@purevolume.com
40 | Female
41 | 26.110.129.53
42 |
43 |
44 | 2
45 | Theodor
46 | Blanch
47 | tblanch1@bloomberg.com
48 | Male
49 | 34.246.226.138
50 |
51 | ';
52 |
53 |
54 | $actual = str_replace(["\n", ' '], '', $stream->getContents());
55 | $expected = str_replace(["\n", ' '], '', $testDataString);
56 |
57 | $this->assertEquals($expected, $actual);
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/tests/TagDepthTest.php:
--------------------------------------------------------------------------------
1 | read(0);
19 |
20 | $this->assertIsString($empty);
21 | $this->assertEmpty($empty);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/tests/TestClasses/TestRecord.php:
--------------------------------------------------------------------------------
1 | id = $id;
30 | $this->firstName = $firstName;
31 | $this->lastName = $lastName;
32 | $this->email = $email;
33 | $this->gender = $gender;
34 | $this->ip = $ip;
35 | }
36 |
37 | public static function fromSimpleXML(\SimpleXMLElement $element)
38 | {
39 | return new static(
40 | (int) $element->id,
41 | (string) $element->first_name,
42 | (string) $element->last_name,
43 | (string) $element->email,
44 | (string) $element->gender,
45 | (string) $element->ip_address
46 | );
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/tests/TestClasses/TestTrack.php:
--------------------------------------------------------------------------------
1 | path = $path;
18 | $this->title = $title;
19 | }
20 |
21 | public static function fromSimpleXML(\SimpleXMLElement $element)
22 | {
23 | return new static(
24 | (string) $element->path,
25 | (string) $element->title
26 | );
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/tests/assets/test-data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 1
5 | Celina
6 | Elgey
7 | celgey0@purevolume.com
8 | Female
9 | 26.110.129.53
10 |
11 |
12 | 2
13 | Theodor
14 | Blanch
15 | tblanch1@bloomberg.com
16 | Male
17 | 34.246.226.138
18 |
19 |
--------------------------------------------------------------------------------