├── .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 | [![Latest Version on Packagist](https://img.shields.io/packagist/v/TBPixel/xml-streamer.svg?style=flat-square)](https://packagist.org/packages/tbpixel/type-adapter) 4 | [![Build Status](https://img.shields.io/travis/TBPixel/xml-streamer/master.svg?style=flat-square)](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 | --------------------------------------------------------------------------------