├── .gitignore ├── .travis.yml ├── tests ├── fixtures │ └── test-existing.json ├── bootstrap.php └── VcrHandlerTest.php ├── .scrutinizer.yml ├── composer.json ├── phpunit.xml.dist ├── LICENSE ├── src └── VcrHandler.php ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/ 2 | .idea/ 3 | build 4 | tests/fixtures/temp/ 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.5 5 | - 5.6 6 | - 7.0 7 | - hhvm 8 | 9 | sudo: false 10 | 11 | install: travis_retry composer install --no-interaction --prefer-source 12 | 13 | script: ./vendor/bin/phpunit 14 | 15 | after_script: wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover build/coverage/coverage.clover 16 | -------------------------------------------------------------------------------- /tests/fixtures/test-existing.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "status": 200, 4 | "headers": { 5 | "Date": [ 6 | "Fri, 21 Aug 2015 01:44:31 GMT" 7 | ], 8 | "Connection": [ 9 | "keep-alive" 10 | ], 11 | "Transfer-Encoding": [ 12 | "chunked" 13 | ], 14 | "X-VCR-Recording": [ 15 | "1440121471" 16 | ] 17 | }, 18 | "body": "SGVsbG8gV29ybGQ=", 19 | "version": "1.1", 20 | "reason": "OK" 21 | } 22 | ] 23 | -------------------------------------------------------------------------------- /.scrutinizer.yml: -------------------------------------------------------------------------------- 1 | filter: 2 | paths: [src/*] 3 | excluded_paths: [tests/*, vendor/*, build/*, tools/*, docs/*] 4 | checks: 5 | php: 6 | code_rating: true 7 | tools: 8 | php_analyzer: 9 | enabled: true 10 | extensions: 11 | - php 12 | external_code_coverage: 13 | timeout: 1200 14 | runs: 1 15 | php_code_coverage: false 16 | php_code_sniffer: 17 | config: 18 | standard: PSR2 19 | filter: 20 | paths: ['src'] 21 | php_loc: 22 | enabled: true 23 | excluded_dirs: [vendor, spec] 24 | sensiolabs_security_checker: 25 | enabled: true 26 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dshafik/guzzlehttp-vcr", 3 | "require": { 4 | "php": ">=5.5", 5 | "guzzlehttp/guzzle": "^6.0" 6 | }, 7 | "require-dev": { 8 | "phpunit/phpunit": "^4.8" 9 | }, 10 | "license": "MIT", 11 | "authors": [ 12 | { 13 | "name": "Davey Shafik", 14 | "email": "dshafik@akamai.com" 15 | } 16 | ], 17 | "autoload": { 18 | "psr-4": { 19 | "Dshafik\\GuzzleHttp\\": "src/" 20 | } 21 | }, 22 | "autoload-dev": { 23 | "psr-4": { 24 | "Dshafik\\GuzzleHttp\\Tests\\": "tests", 25 | "GuzzleHttp\\Tests\\": "vendor/guzzlehttp/guzzle/tests" 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ./tests 13 | 14 | 15 | 16 | 17 | ./src 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | 5 | * 6 | * For more information visit https://developer.akamai.com 7 | * 8 | * Copyright 2014 Akamai Technologies, Inc. All rights reserved. 9 | * 10 | * Licensed under the Apache License, Version 2.0 (the "License"); 11 | * you may not use this file except in compliance with the License. 12 | * You may obtain a copy of the License at 13 | * 14 | * http://www.apache.org/licenses/LICENSE-2.0 15 | * 16 | * Unless required by applicable law or agreed to in writing, software 17 | * distributed under the License is distributed on an "AS IS" BASIS, 18 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 | * See the License for the specific language governing permissions and 20 | * limitations under the License. 21 | */ 22 | require_once __DIR__ . '/../vendor/autoload.php'; 23 | 24 | \GuzzleHttp\Tests\Server::start(); 25 | register_shutdown_function(function () { \GuzzleHttp\Tests\Server::stop(); }); 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Davey Shafik 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 | -------------------------------------------------------------------------------- /src/VcrHandler.php: -------------------------------------------------------------------------------- 1 | after('allow_redirects', new static($cassette), 'vcr_recorder'); 28 | return $handler; 29 | } else { 30 | $responses = self::decodeResponses($cassette); 31 | 32 | $queue = []; 33 | $class = new \ReflectionClass(\GuzzleHttp\Psr7\Response::class); 34 | foreach ($responses as $response) { 35 | $queue[] = $class->newInstanceArgs($response); 36 | } 37 | 38 | return \GuzzleHttp\HandlerStack::create(new \GuzzleHttp\Handler\MockHandler($queue)); 39 | } 40 | } 41 | 42 | /** 43 | * Constructor 44 | * 45 | * @param string $cassette fixture path 46 | */ 47 | protected function __construct($cassette) 48 | { 49 | $this->cassette = $cassette; 50 | } 51 | 52 | /** 53 | * Decodes every responses body from base64 54 | * 55 | * @param $cassette 56 | * @return array 57 | */ 58 | protected static function decodeResponses($cassette) 59 | { 60 | $responses = json_decode(file_get_contents($cassette), true); 61 | 62 | array_walk($responses, function(&$response){ 63 | $response['body'] = base64_decode($response['body']); 64 | }); 65 | 66 | return $responses; 67 | } 68 | 69 | /** 70 | * Handle the request/response 71 | * 72 | * @param callable $handler 73 | * @return \Closure 74 | */ 75 | public function __invoke(callable $handler) 76 | { 77 | return function (\Psr\Http\Message\RequestInterface $request, array $config) use ($handler) { 78 | return $handler($request, $config)->then( 79 | function (\Psr\Http\Message\ResponseInterface $response) use ($request) { 80 | $responses = []; 81 | if (file_exists($this->cassette)) { 82 | //No need to base64 decode body of response here. 83 | $responses = json_decode(file_get_contents($this->cassette), true); 84 | } 85 | $cassette = $response->withAddedHeader('X-VCR-Recording', time()); 86 | $responses[] = [ 87 | 'status' => $cassette->getStatusCode(), 88 | 'headers' => $cassette->getHeaders(), 89 | 'body' => base64_encode((string) $cassette->getBody()), 90 | 'version' => $cassette->getProtocolVersion(), 91 | 'reason' => $cassette->getReasonPhrase() 92 | ]; 93 | 94 | file_put_contents($this->cassette, json_encode($responses, JSON_PRETTY_PRINT)); 95 | return $response; 96 | }, 97 | function (\Exception $reason) { 98 | return new \GuzzleHttp\Promise\RejectedPromise($reason); 99 | } 100 | ); 101 | }; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/dshafik/guzzlehttp-vcr)[![Travis CI Status](https://travis-ci.org/dshafik/guzzlehttp-vcr.svg?branch=master)](https://travis-ci.org/dshafik/guzzlehttp-vcr) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/dshafik/guzzlehttp-vcr/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/dshafik/guzzlehttp-vcr/?branch=master) 2 | 3 | # Guzzle VCR 4 | 5 | Based on the idea of [PHP•VCR](http://php-vcr.github.io), this Guzzle Middleware will record responses and replay them in response to subsequent requests. 6 | 7 | This middleware is simplistic in that it will simply replay the responses in order in response to _any_ requests. This is handy for testing clients that have time-based authentication and need to generate dynamic requests but still want predictable responses to test response handling. 8 | 9 | ## Installation 10 | 11 | To add to your project, use `composer`: 12 | 13 | ``` 14 | $ composer require dshafik/guzzlehttp-vcr 15 | ``` 16 | 17 | ## Usage 18 | 19 | It's use is _similar_ to Guzzles `\GuzzleHttp\Handler\MockHandler`, and in fact uses the `MockHandler` to replay the recorded requests. Calling the `Dshafik\GuzzleHttp\VcrHandler::turnOn()` method will return either an instance of the standard `GuzzleHttp\HandlerStack` with either the `VcrHandler` or `MockHandler` (with the requests loaded) added as middleware. 20 | 21 | You then pass the handler in as the `GuzzleHttp\Client` handler option, either in the constructor, or with the individual request. 22 | 23 | The recording is halted on script termination, or the next time `VcrHandler::turnOn()` is called _for that recording_. 24 | 25 | ```php 26 | $vcr]); 31 | 32 | $client->get('/test'); 33 | } 34 | } 35 | ?> 36 | ``` 37 | 38 | In this example, if the fixture exists, it will be used — using `MockHandler` — in response to _any_ requests made until it runs out of possible responses. Once it runs out of responses it will throw an `\OutOfBoundsException` exception on the next request. 39 | 40 | To update the fixture, just delete the file and re-run the test. 41 | 42 | ## Fixtures 43 | 44 | Fixtures are simple JSON files that you can edit or create by hand: 45 | 46 | ```json 47 | [ 48 | { 49 | "body": "Hello World", 50 | "headers": { 51 | "Connection": [ 52 | "keep-alive" 53 | ], 54 | "Date": [ 55 | "Fri, 21 Aug 2015 01:10:34 GMT" 56 | ], 57 | "Transfer-Encoding": [ 58 | "chunked" 59 | ], 60 | "X-VCR-Recording": [ 61 | "1440119434" 62 | ] 63 | }, 64 | "reason": "OK", 65 | "status": 200, 66 | "version": "1.1" 67 | } 68 | ] 69 | ``` 70 | 71 | The only difference between the recording and the original response is the addition of an `X-VCR-Recording` header that contains the UNIX timestamp of the time it was recorded. 72 | 73 | ## Running the Tests 74 | 75 | The unit tests for this library use Guzzles built-in Node.js server, this means that you _must_ install with the `--prefer-source` flag, otherwise test sources are not included. 76 | 77 | To run the unit tests simply run `phpunit` in the root of the repository: 78 | 79 | ```sh 80 | $ phpunit 81 | PHPUnit 4.8.5 by Sebastian Bergmann and contributors. 82 | 83 | Runtime: PHP 5.6.10 with Xdebug 2.3.3 84 | Configuration: /Users/dshafik/src/guzzlehttp-vcr/phpunit.xml.dist 85 | 86 | .... 87 | 88 | Time: 2.94 seconds, Memory: 9.00Mb 89 | 90 | OK (5 tests, 62 assertions) 91 | ``` 92 | -------------------------------------------------------------------------------- /tests/VcrHandlerTest.php: -------------------------------------------------------------------------------- 1 | setName($name); 18 | $this->assertGreaterThanOrEqual(sizeof($requests), sizeof($responses)); 19 | 20 | \GuzzleHttp\Tests\Server::enqueue($responses); 21 | $cassette = __DIR__ . '/fixtures/temp/' . str_replace([" with data set #", "test", " "], ["-", "", "-"], $this->getName()) . '.json'; 22 | 23 | $responses = []; 24 | $vcr = \Dshafik\GuzzleHttp\VcrHandler::turnOn($cassette); 25 | $this->assertInstanceOf(\GuzzleHttp\HandlerStack::class, $vcr); 26 | $client = new \GuzzleHttp\Client(['handler' => $vcr]); 27 | foreach ($requests as $key => $request) { 28 | try { 29 | $response = $client->send($request); 30 | } catch (\GuzzleHttp\Exception\ClientException $e) { 31 | $response = $e->getResponse(); 32 | } 33 | $this->assertEmpty($response->getHeader('X-VCR-Recording')); 34 | $responses[$key] = $response; 35 | } 36 | 37 | $vcr = \Dshafik\GuzzleHttp\VcrHandler::turnOn($cassette); 38 | $this->assertInstanceOf(\GuzzleHttp\HandlerStack::class, $vcr); 39 | $client = new \GuzzleHttp\Client(['handler' => $vcr]); 40 | foreach ($requests as $key => $request) { 41 | try { 42 | $recording = $client->send($request); 43 | } catch (\GuzzleHttp\Exception\ClientException $e) { 44 | $recording = $e->getResponse(); 45 | } 46 | 47 | $this->assertTrue(ctype_digit($recording->getHeader('X-VCR-Recording')[0])); 48 | 49 | $this->assertEquals($responses[$key]->getStatusCode(), $recording->getStatusCode()); 50 | foreach ($responses[$key]->getHeaders() as $header => $value) { 51 | $this->assertEquals($value, $recording->getHeader($header)); 52 | } 53 | 54 | $this->assertEquals((string) $responses[$key]->getBody(), (string) $recording->getBody()); 55 | } 56 | } 57 | 58 | public function recordingProvider() 59 | { 60 | return [ 61 | [ 62 | 'name' => 'Record single request', 63 | 'requests' => [new \GuzzleHttp\Psr7\Request('GET', \GuzzleHttp\Tests\Server::$url)], 64 | 'responses' => [new \GuzzleHttp\Psr7\Response(200, [], "Hello World")] 65 | ], 66 | [ 67 | 'name' => 'Record multiple requests', 68 | 'requests' => [ 69 | new \GuzzleHttp\Psr7\Request('GET', \GuzzleHttp\Tests\Server::$url), 70 | new \GuzzleHttp\Psr7\Request('POST', \GuzzleHttp\Tests\Server::$url) 71 | ], 72 | 'responses' => [ 73 | new \GuzzleHttp\Psr7\Response(200, [], "Hello World"), 74 | new \GuzzleHttp\Psr7\Response(301, ['Location' => '/test']), 75 | new \GuzzleHttp\Psr7\Response(404), 76 | ] 77 | ], 78 | [ 79 | 'name' => 'POST request', 80 | 'requests' => [ 81 | new \GuzzleHttp\Psr7\Request('POST', \GuzzleHttp\Tests\Server::$url, [], 'Hello World') 82 | ], 83 | 'responses' => [ 84 | new \GuzzleHttp\Psr7\Response(202), 85 | ] 86 | ], 87 | [ 88 | 'name' => 'Multiple Methods', 89 | 'requests' => [ 90 | new \GuzzleHttp\Psr7\Request('GET', \GuzzleHttp\Tests\Server::$url), 91 | new \GuzzleHttp\Psr7\Request('POST', \GuzzleHttp\Tests\Server::$url, [], 'Hello World') 92 | ], 93 | 'responses' => [ 94 | new \GuzzleHttp\Psr7\Response(200), 95 | new \GuzzleHttp\Psr7\Response(200, [], 'Goodbye Moon'), 96 | ] 97 | ], 98 | ]; 99 | } 100 | 101 | public function testExisting() 102 | { 103 | $vcr = \Dshafik\GuzzleHttp\VcrHandler::turnOn(__DIR__ . '/fixtures/test-existing.json'); 104 | 105 | $client = new \GuzzleHttp\Client(['handler' => $vcr]); 106 | $response = $client->get('/test'); 107 | 108 | $this->assertEquals(200, $response->getStatusCode()); 109 | $this->assertArrayHasKey('X-VCR-Recording', $response->getHeaders()); 110 | $this->assertEquals("1440121471", $response->getHeader('X-VCR-Recording')[0]); 111 | $this->assertEquals('Hello World', (string) $response->getBody()); 112 | } 113 | 114 | public static function setupBeforeClass() 115 | { 116 | if (!file_exists(__DIR__ . "/fixtures/temp")) { 117 | mkdir(__DIR__ . "/fixtures/temp", 0777, true); 118 | return; 119 | } 120 | 121 | foreach (glob(__DIR__ . "/fixtures/temp/*.json") as $file) { 122 | unlink($file); 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /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#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "1846b018ff1e26cfe0152259444bb686", 8 | "packages": [ 9 | { 10 | "name": "guzzlehttp/guzzle", 11 | "version": "6.2.3", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/guzzle/guzzle.git", 15 | "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006", 20 | "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "guzzlehttp/promises": "^1.0", 25 | "guzzlehttp/psr7": "^1.4", 26 | "php": ">=5.5" 27 | }, 28 | "require-dev": { 29 | "ext-curl": "*", 30 | "phpunit/phpunit": "^4.0", 31 | "psr/log": "^1.0" 32 | }, 33 | "type": "library", 34 | "extra": { 35 | "branch-alias": { 36 | "dev-master": "6.2-dev" 37 | } 38 | }, 39 | "autoload": { 40 | "files": [ 41 | "src/functions_include.php" 42 | ], 43 | "psr-4": { 44 | "GuzzleHttp\\": "src/" 45 | } 46 | }, 47 | "notification-url": "https://packagist.org/downloads/", 48 | "license": [ 49 | "MIT" 50 | ], 51 | "authors": [ 52 | { 53 | "name": "Michael Dowling", 54 | "email": "mtdowling@gmail.com", 55 | "homepage": "https://github.com/mtdowling" 56 | } 57 | ], 58 | "description": "Guzzle is a PHP HTTP client library", 59 | "homepage": "http://guzzlephp.org/", 60 | "keywords": [ 61 | "client", 62 | "curl", 63 | "framework", 64 | "http", 65 | "http client", 66 | "rest", 67 | "web service" 68 | ], 69 | "time": "2017-02-28T22:50:30+00:00" 70 | }, 71 | { 72 | "name": "guzzlehttp/promises", 73 | "version": "v1.3.1", 74 | "source": { 75 | "type": "git", 76 | "url": "https://github.com/guzzle/promises.git", 77 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 78 | }, 79 | "dist": { 80 | "type": "zip", 81 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 82 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 83 | "shasum": "" 84 | }, 85 | "require": { 86 | "php": ">=5.5.0" 87 | }, 88 | "require-dev": { 89 | "phpunit/phpunit": "^4.0" 90 | }, 91 | "type": "library", 92 | "extra": { 93 | "branch-alias": { 94 | "dev-master": "1.4-dev" 95 | } 96 | }, 97 | "autoload": { 98 | "psr-4": { 99 | "GuzzleHttp\\Promise\\": "src/" 100 | }, 101 | "files": [ 102 | "src/functions_include.php" 103 | ] 104 | }, 105 | "notification-url": "https://packagist.org/downloads/", 106 | "license": [ 107 | "MIT" 108 | ], 109 | "authors": [ 110 | { 111 | "name": "Michael Dowling", 112 | "email": "mtdowling@gmail.com", 113 | "homepage": "https://github.com/mtdowling" 114 | } 115 | ], 116 | "description": "Guzzle promises library", 117 | "keywords": [ 118 | "promise" 119 | ], 120 | "time": "2016-12-20T10:07:11+00:00" 121 | }, 122 | { 123 | "name": "guzzlehttp/psr7", 124 | "version": "1.4.2", 125 | "source": { 126 | "type": "git", 127 | "url": "https://github.com/guzzle/psr7.git", 128 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" 129 | }, 130 | "dist": { 131 | "type": "zip", 132 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 133 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 134 | "shasum": "" 135 | }, 136 | "require": { 137 | "php": ">=5.4.0", 138 | "psr/http-message": "~1.0" 139 | }, 140 | "provide": { 141 | "psr/http-message-implementation": "1.0" 142 | }, 143 | "require-dev": { 144 | "phpunit/phpunit": "~4.0" 145 | }, 146 | "type": "library", 147 | "extra": { 148 | "branch-alias": { 149 | "dev-master": "1.4-dev" 150 | } 151 | }, 152 | "autoload": { 153 | "psr-4": { 154 | "GuzzleHttp\\Psr7\\": "src/" 155 | }, 156 | "files": [ 157 | "src/functions_include.php" 158 | ] 159 | }, 160 | "notification-url": "https://packagist.org/downloads/", 161 | "license": [ 162 | "MIT" 163 | ], 164 | "authors": [ 165 | { 166 | "name": "Michael Dowling", 167 | "email": "mtdowling@gmail.com", 168 | "homepage": "https://github.com/mtdowling" 169 | }, 170 | { 171 | "name": "Tobias Schultze", 172 | "homepage": "https://github.com/Tobion" 173 | } 174 | ], 175 | "description": "PSR-7 message implementation that also provides common utility methods", 176 | "keywords": [ 177 | "http", 178 | "message", 179 | "request", 180 | "response", 181 | "stream", 182 | "uri", 183 | "url" 184 | ], 185 | "time": "2017-03-20T17:10:46+00:00" 186 | }, 187 | { 188 | "name": "psr/http-message", 189 | "version": "1.0.1", 190 | "source": { 191 | "type": "git", 192 | "url": "https://github.com/php-fig/http-message.git", 193 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 194 | }, 195 | "dist": { 196 | "type": "zip", 197 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 198 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 199 | "shasum": "" 200 | }, 201 | "require": { 202 | "php": ">=5.3.0" 203 | }, 204 | "type": "library", 205 | "extra": { 206 | "branch-alias": { 207 | "dev-master": "1.0.x-dev" 208 | } 209 | }, 210 | "autoload": { 211 | "psr-4": { 212 | "Psr\\Http\\Message\\": "src/" 213 | } 214 | }, 215 | "notification-url": "https://packagist.org/downloads/", 216 | "license": [ 217 | "MIT" 218 | ], 219 | "authors": [ 220 | { 221 | "name": "PHP-FIG", 222 | "homepage": "http://www.php-fig.org/" 223 | } 224 | ], 225 | "description": "Common interface for HTTP messages", 226 | "homepage": "https://github.com/php-fig/http-message", 227 | "keywords": [ 228 | "http", 229 | "http-message", 230 | "psr", 231 | "psr-7", 232 | "request", 233 | "response" 234 | ], 235 | "time": "2016-08-06T14:39:51+00:00" 236 | } 237 | ], 238 | "packages-dev": [ 239 | { 240 | "name": "doctrine/instantiator", 241 | "version": "1.0.5", 242 | "source": { 243 | "type": "git", 244 | "url": "https://github.com/doctrine/instantiator.git", 245 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 246 | }, 247 | "dist": { 248 | "type": "zip", 249 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 250 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 251 | "shasum": "" 252 | }, 253 | "require": { 254 | "php": ">=5.3,<8.0-DEV" 255 | }, 256 | "require-dev": { 257 | "athletic/athletic": "~0.1.8", 258 | "ext-pdo": "*", 259 | "ext-phar": "*", 260 | "phpunit/phpunit": "~4.0", 261 | "squizlabs/php_codesniffer": "~2.0" 262 | }, 263 | "type": "library", 264 | "extra": { 265 | "branch-alias": { 266 | "dev-master": "1.0.x-dev" 267 | } 268 | }, 269 | "autoload": { 270 | "psr-4": { 271 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 272 | } 273 | }, 274 | "notification-url": "https://packagist.org/downloads/", 275 | "license": [ 276 | "MIT" 277 | ], 278 | "authors": [ 279 | { 280 | "name": "Marco Pivetta", 281 | "email": "ocramius@gmail.com", 282 | "homepage": "http://ocramius.github.com/" 283 | } 284 | ], 285 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 286 | "homepage": "https://github.com/doctrine/instantiator", 287 | "keywords": [ 288 | "constructor", 289 | "instantiate" 290 | ], 291 | "time": "2015-06-14T21:17:01+00:00" 292 | }, 293 | { 294 | "name": "phpdocumentor/reflection-common", 295 | "version": "1.0", 296 | "source": { 297 | "type": "git", 298 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 299 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" 300 | }, 301 | "dist": { 302 | "type": "zip", 303 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 304 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 305 | "shasum": "" 306 | }, 307 | "require": { 308 | "php": ">=5.5" 309 | }, 310 | "require-dev": { 311 | "phpunit/phpunit": "^4.6" 312 | }, 313 | "type": "library", 314 | "extra": { 315 | "branch-alias": { 316 | "dev-master": "1.0.x-dev" 317 | } 318 | }, 319 | "autoload": { 320 | "psr-4": { 321 | "phpDocumentor\\Reflection\\": [ 322 | "src" 323 | ] 324 | } 325 | }, 326 | "notification-url": "https://packagist.org/downloads/", 327 | "license": [ 328 | "MIT" 329 | ], 330 | "authors": [ 331 | { 332 | "name": "Jaap van Otterdijk", 333 | "email": "opensource@ijaap.nl" 334 | } 335 | ], 336 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 337 | "homepage": "http://www.phpdoc.org", 338 | "keywords": [ 339 | "FQSEN", 340 | "phpDocumentor", 341 | "phpdoc", 342 | "reflection", 343 | "static analysis" 344 | ], 345 | "time": "2015-12-27T11:43:31+00:00" 346 | }, 347 | { 348 | "name": "phpdocumentor/reflection-docblock", 349 | "version": "3.1.1", 350 | "source": { 351 | "type": "git", 352 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 353 | "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" 354 | }, 355 | "dist": { 356 | "type": "zip", 357 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", 358 | "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", 359 | "shasum": "" 360 | }, 361 | "require": { 362 | "php": ">=5.5", 363 | "phpdocumentor/reflection-common": "^1.0@dev", 364 | "phpdocumentor/type-resolver": "^0.2.0", 365 | "webmozart/assert": "^1.0" 366 | }, 367 | "require-dev": { 368 | "mockery/mockery": "^0.9.4", 369 | "phpunit/phpunit": "^4.4" 370 | }, 371 | "type": "library", 372 | "autoload": { 373 | "psr-4": { 374 | "phpDocumentor\\Reflection\\": [ 375 | "src/" 376 | ] 377 | } 378 | }, 379 | "notification-url": "https://packagist.org/downloads/", 380 | "license": [ 381 | "MIT" 382 | ], 383 | "authors": [ 384 | { 385 | "name": "Mike van Riel", 386 | "email": "me@mikevanriel.com" 387 | } 388 | ], 389 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 390 | "time": "2016-09-30T07:12:33+00:00" 391 | }, 392 | { 393 | "name": "phpdocumentor/type-resolver", 394 | "version": "0.2.1", 395 | "source": { 396 | "type": "git", 397 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 398 | "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" 399 | }, 400 | "dist": { 401 | "type": "zip", 402 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", 403 | "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", 404 | "shasum": "" 405 | }, 406 | "require": { 407 | "php": ">=5.5", 408 | "phpdocumentor/reflection-common": "^1.0" 409 | }, 410 | "require-dev": { 411 | "mockery/mockery": "^0.9.4", 412 | "phpunit/phpunit": "^5.2||^4.8.24" 413 | }, 414 | "type": "library", 415 | "extra": { 416 | "branch-alias": { 417 | "dev-master": "1.0.x-dev" 418 | } 419 | }, 420 | "autoload": { 421 | "psr-4": { 422 | "phpDocumentor\\Reflection\\": [ 423 | "src/" 424 | ] 425 | } 426 | }, 427 | "notification-url": "https://packagist.org/downloads/", 428 | "license": [ 429 | "MIT" 430 | ], 431 | "authors": [ 432 | { 433 | "name": "Mike van Riel", 434 | "email": "me@mikevanriel.com" 435 | } 436 | ], 437 | "time": "2016-11-25T06:54:22+00:00" 438 | }, 439 | { 440 | "name": "phpspec/prophecy", 441 | "version": "v1.7.0", 442 | "source": { 443 | "type": "git", 444 | "url": "https://github.com/phpspec/prophecy.git", 445 | "reference": "93d39f1f7f9326d746203c7c056f300f7f126073" 446 | }, 447 | "dist": { 448 | "type": "zip", 449 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073", 450 | "reference": "93d39f1f7f9326d746203c7c056f300f7f126073", 451 | "shasum": "" 452 | }, 453 | "require": { 454 | "doctrine/instantiator": "^1.0.2", 455 | "php": "^5.3|^7.0", 456 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", 457 | "sebastian/comparator": "^1.1|^2.0", 458 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 459 | }, 460 | "require-dev": { 461 | "phpspec/phpspec": "^2.5|^3.2", 462 | "phpunit/phpunit": "^4.8 || ^5.6.5" 463 | }, 464 | "type": "library", 465 | "extra": { 466 | "branch-alias": { 467 | "dev-master": "1.6.x-dev" 468 | } 469 | }, 470 | "autoload": { 471 | "psr-0": { 472 | "Prophecy\\": "src/" 473 | } 474 | }, 475 | "notification-url": "https://packagist.org/downloads/", 476 | "license": [ 477 | "MIT" 478 | ], 479 | "authors": [ 480 | { 481 | "name": "Konstantin Kudryashov", 482 | "email": "ever.zet@gmail.com", 483 | "homepage": "http://everzet.com" 484 | }, 485 | { 486 | "name": "Marcello Duarte", 487 | "email": "marcello.duarte@gmail.com" 488 | } 489 | ], 490 | "description": "Highly opinionated mocking framework for PHP 5.3+", 491 | "homepage": "https://github.com/phpspec/prophecy", 492 | "keywords": [ 493 | "Double", 494 | "Dummy", 495 | "fake", 496 | "mock", 497 | "spy", 498 | "stub" 499 | ], 500 | "time": "2017-03-02T20:05:34+00:00" 501 | }, 502 | { 503 | "name": "phpunit/php-code-coverage", 504 | "version": "2.2.4", 505 | "source": { 506 | "type": "git", 507 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 508 | "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" 509 | }, 510 | "dist": { 511 | "type": "zip", 512 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", 513 | "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", 514 | "shasum": "" 515 | }, 516 | "require": { 517 | "php": ">=5.3.3", 518 | "phpunit/php-file-iterator": "~1.3", 519 | "phpunit/php-text-template": "~1.2", 520 | "phpunit/php-token-stream": "~1.3", 521 | "sebastian/environment": "^1.3.2", 522 | "sebastian/version": "~1.0" 523 | }, 524 | "require-dev": { 525 | "ext-xdebug": ">=2.1.4", 526 | "phpunit/phpunit": "~4" 527 | }, 528 | "suggest": { 529 | "ext-dom": "*", 530 | "ext-xdebug": ">=2.2.1", 531 | "ext-xmlwriter": "*" 532 | }, 533 | "type": "library", 534 | "extra": { 535 | "branch-alias": { 536 | "dev-master": "2.2.x-dev" 537 | } 538 | }, 539 | "autoload": { 540 | "classmap": [ 541 | "src/" 542 | ] 543 | }, 544 | "notification-url": "https://packagist.org/downloads/", 545 | "license": [ 546 | "BSD-3-Clause" 547 | ], 548 | "authors": [ 549 | { 550 | "name": "Sebastian Bergmann", 551 | "email": "sb@sebastian-bergmann.de", 552 | "role": "lead" 553 | } 554 | ], 555 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 556 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 557 | "keywords": [ 558 | "coverage", 559 | "testing", 560 | "xunit" 561 | ], 562 | "time": "2015-10-06T15:47:00+00:00" 563 | }, 564 | { 565 | "name": "phpunit/php-file-iterator", 566 | "version": "1.4.2", 567 | "source": { 568 | "type": "git", 569 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 570 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" 571 | }, 572 | "dist": { 573 | "type": "zip", 574 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 575 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 576 | "shasum": "" 577 | }, 578 | "require": { 579 | "php": ">=5.3.3" 580 | }, 581 | "type": "library", 582 | "extra": { 583 | "branch-alias": { 584 | "dev-master": "1.4.x-dev" 585 | } 586 | }, 587 | "autoload": { 588 | "classmap": [ 589 | "src/" 590 | ] 591 | }, 592 | "notification-url": "https://packagist.org/downloads/", 593 | "license": [ 594 | "BSD-3-Clause" 595 | ], 596 | "authors": [ 597 | { 598 | "name": "Sebastian Bergmann", 599 | "email": "sb@sebastian-bergmann.de", 600 | "role": "lead" 601 | } 602 | ], 603 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 604 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 605 | "keywords": [ 606 | "filesystem", 607 | "iterator" 608 | ], 609 | "time": "2016-10-03T07:40:28+00:00" 610 | }, 611 | { 612 | "name": "phpunit/php-text-template", 613 | "version": "1.2.1", 614 | "source": { 615 | "type": "git", 616 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 617 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 618 | }, 619 | "dist": { 620 | "type": "zip", 621 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 622 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 623 | "shasum": "" 624 | }, 625 | "require": { 626 | "php": ">=5.3.3" 627 | }, 628 | "type": "library", 629 | "autoload": { 630 | "classmap": [ 631 | "src/" 632 | ] 633 | }, 634 | "notification-url": "https://packagist.org/downloads/", 635 | "license": [ 636 | "BSD-3-Clause" 637 | ], 638 | "authors": [ 639 | { 640 | "name": "Sebastian Bergmann", 641 | "email": "sebastian@phpunit.de", 642 | "role": "lead" 643 | } 644 | ], 645 | "description": "Simple template engine.", 646 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 647 | "keywords": [ 648 | "template" 649 | ], 650 | "time": "2015-06-21T13:50:34+00:00" 651 | }, 652 | { 653 | "name": "phpunit/php-timer", 654 | "version": "1.0.9", 655 | "source": { 656 | "type": "git", 657 | "url": "https://github.com/sebastianbergmann/php-timer.git", 658 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" 659 | }, 660 | "dist": { 661 | "type": "zip", 662 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 663 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 664 | "shasum": "" 665 | }, 666 | "require": { 667 | "php": "^5.3.3 || ^7.0" 668 | }, 669 | "require-dev": { 670 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 671 | }, 672 | "type": "library", 673 | "extra": { 674 | "branch-alias": { 675 | "dev-master": "1.0-dev" 676 | } 677 | }, 678 | "autoload": { 679 | "classmap": [ 680 | "src/" 681 | ] 682 | }, 683 | "notification-url": "https://packagist.org/downloads/", 684 | "license": [ 685 | "BSD-3-Clause" 686 | ], 687 | "authors": [ 688 | { 689 | "name": "Sebastian Bergmann", 690 | "email": "sb@sebastian-bergmann.de", 691 | "role": "lead" 692 | } 693 | ], 694 | "description": "Utility class for timing", 695 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 696 | "keywords": [ 697 | "timer" 698 | ], 699 | "time": "2017-02-26T11:10:40+00:00" 700 | }, 701 | { 702 | "name": "phpunit/php-token-stream", 703 | "version": "1.4.11", 704 | "source": { 705 | "type": "git", 706 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 707 | "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" 708 | }, 709 | "dist": { 710 | "type": "zip", 711 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", 712 | "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", 713 | "shasum": "" 714 | }, 715 | "require": { 716 | "ext-tokenizer": "*", 717 | "php": ">=5.3.3" 718 | }, 719 | "require-dev": { 720 | "phpunit/phpunit": "~4.2" 721 | }, 722 | "type": "library", 723 | "extra": { 724 | "branch-alias": { 725 | "dev-master": "1.4-dev" 726 | } 727 | }, 728 | "autoload": { 729 | "classmap": [ 730 | "src/" 731 | ] 732 | }, 733 | "notification-url": "https://packagist.org/downloads/", 734 | "license": [ 735 | "BSD-3-Clause" 736 | ], 737 | "authors": [ 738 | { 739 | "name": "Sebastian Bergmann", 740 | "email": "sebastian@phpunit.de" 741 | } 742 | ], 743 | "description": "Wrapper around PHP's tokenizer extension.", 744 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 745 | "keywords": [ 746 | "tokenizer" 747 | ], 748 | "time": "2017-02-27T10:12:30+00:00" 749 | }, 750 | { 751 | "name": "phpunit/phpunit", 752 | "version": "4.8.35", 753 | "source": { 754 | "type": "git", 755 | "url": "https://github.com/sebastianbergmann/phpunit.git", 756 | "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87" 757 | }, 758 | "dist": { 759 | "type": "zip", 760 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87", 761 | "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87", 762 | "shasum": "" 763 | }, 764 | "require": { 765 | "ext-dom": "*", 766 | "ext-json": "*", 767 | "ext-pcre": "*", 768 | "ext-reflection": "*", 769 | "ext-spl": "*", 770 | "php": ">=5.3.3", 771 | "phpspec/prophecy": "^1.3.1", 772 | "phpunit/php-code-coverage": "~2.1", 773 | "phpunit/php-file-iterator": "~1.4", 774 | "phpunit/php-text-template": "~1.2", 775 | "phpunit/php-timer": "^1.0.6", 776 | "phpunit/phpunit-mock-objects": "~2.3", 777 | "sebastian/comparator": "~1.2.2", 778 | "sebastian/diff": "~1.2", 779 | "sebastian/environment": "~1.3", 780 | "sebastian/exporter": "~1.2", 781 | "sebastian/global-state": "~1.0", 782 | "sebastian/version": "~1.0", 783 | "symfony/yaml": "~2.1|~3.0" 784 | }, 785 | "suggest": { 786 | "phpunit/php-invoker": "~1.1" 787 | }, 788 | "bin": [ 789 | "phpunit" 790 | ], 791 | "type": "library", 792 | "extra": { 793 | "branch-alias": { 794 | "dev-master": "4.8.x-dev" 795 | } 796 | }, 797 | "autoload": { 798 | "classmap": [ 799 | "src/" 800 | ] 801 | }, 802 | "notification-url": "https://packagist.org/downloads/", 803 | "license": [ 804 | "BSD-3-Clause" 805 | ], 806 | "authors": [ 807 | { 808 | "name": "Sebastian Bergmann", 809 | "email": "sebastian@phpunit.de", 810 | "role": "lead" 811 | } 812 | ], 813 | "description": "The PHP Unit Testing framework.", 814 | "homepage": "https://phpunit.de/", 815 | "keywords": [ 816 | "phpunit", 817 | "testing", 818 | "xunit" 819 | ], 820 | "time": "2017-02-06T05:18:07+00:00" 821 | }, 822 | { 823 | "name": "phpunit/phpunit-mock-objects", 824 | "version": "2.3.8", 825 | "source": { 826 | "type": "git", 827 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 828 | "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" 829 | }, 830 | "dist": { 831 | "type": "zip", 832 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", 833 | "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", 834 | "shasum": "" 835 | }, 836 | "require": { 837 | "doctrine/instantiator": "^1.0.2", 838 | "php": ">=5.3.3", 839 | "phpunit/php-text-template": "~1.2", 840 | "sebastian/exporter": "~1.2" 841 | }, 842 | "require-dev": { 843 | "phpunit/phpunit": "~4.4" 844 | }, 845 | "suggest": { 846 | "ext-soap": "*" 847 | }, 848 | "type": "library", 849 | "extra": { 850 | "branch-alias": { 851 | "dev-master": "2.3.x-dev" 852 | } 853 | }, 854 | "autoload": { 855 | "classmap": [ 856 | "src/" 857 | ] 858 | }, 859 | "notification-url": "https://packagist.org/downloads/", 860 | "license": [ 861 | "BSD-3-Clause" 862 | ], 863 | "authors": [ 864 | { 865 | "name": "Sebastian Bergmann", 866 | "email": "sb@sebastian-bergmann.de", 867 | "role": "lead" 868 | } 869 | ], 870 | "description": "Mock Object library for PHPUnit", 871 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 872 | "keywords": [ 873 | "mock", 874 | "xunit" 875 | ], 876 | "time": "2015-10-02T06:51:40+00:00" 877 | }, 878 | { 879 | "name": "sebastian/comparator", 880 | "version": "1.2.4", 881 | "source": { 882 | "type": "git", 883 | "url": "https://github.com/sebastianbergmann/comparator.git", 884 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" 885 | }, 886 | "dist": { 887 | "type": "zip", 888 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 889 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 890 | "shasum": "" 891 | }, 892 | "require": { 893 | "php": ">=5.3.3", 894 | "sebastian/diff": "~1.2", 895 | "sebastian/exporter": "~1.2 || ~2.0" 896 | }, 897 | "require-dev": { 898 | "phpunit/phpunit": "~4.4" 899 | }, 900 | "type": "library", 901 | "extra": { 902 | "branch-alias": { 903 | "dev-master": "1.2.x-dev" 904 | } 905 | }, 906 | "autoload": { 907 | "classmap": [ 908 | "src/" 909 | ] 910 | }, 911 | "notification-url": "https://packagist.org/downloads/", 912 | "license": [ 913 | "BSD-3-Clause" 914 | ], 915 | "authors": [ 916 | { 917 | "name": "Jeff Welch", 918 | "email": "whatthejeff@gmail.com" 919 | }, 920 | { 921 | "name": "Volker Dusch", 922 | "email": "github@wallbash.com" 923 | }, 924 | { 925 | "name": "Bernhard Schussek", 926 | "email": "bschussek@2bepublished.at" 927 | }, 928 | { 929 | "name": "Sebastian Bergmann", 930 | "email": "sebastian@phpunit.de" 931 | } 932 | ], 933 | "description": "Provides the functionality to compare PHP values for equality", 934 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 935 | "keywords": [ 936 | "comparator", 937 | "compare", 938 | "equality" 939 | ], 940 | "time": "2017-01-29T09:50:25+00:00" 941 | }, 942 | { 943 | "name": "sebastian/diff", 944 | "version": "1.4.1", 945 | "source": { 946 | "type": "git", 947 | "url": "https://github.com/sebastianbergmann/diff.git", 948 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" 949 | }, 950 | "dist": { 951 | "type": "zip", 952 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", 953 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", 954 | "shasum": "" 955 | }, 956 | "require": { 957 | "php": ">=5.3.3" 958 | }, 959 | "require-dev": { 960 | "phpunit/phpunit": "~4.8" 961 | }, 962 | "type": "library", 963 | "extra": { 964 | "branch-alias": { 965 | "dev-master": "1.4-dev" 966 | } 967 | }, 968 | "autoload": { 969 | "classmap": [ 970 | "src/" 971 | ] 972 | }, 973 | "notification-url": "https://packagist.org/downloads/", 974 | "license": [ 975 | "BSD-3-Clause" 976 | ], 977 | "authors": [ 978 | { 979 | "name": "Kore Nordmann", 980 | "email": "mail@kore-nordmann.de" 981 | }, 982 | { 983 | "name": "Sebastian Bergmann", 984 | "email": "sebastian@phpunit.de" 985 | } 986 | ], 987 | "description": "Diff implementation", 988 | "homepage": "https://github.com/sebastianbergmann/diff", 989 | "keywords": [ 990 | "diff" 991 | ], 992 | "time": "2015-12-08T07:14:41+00:00" 993 | }, 994 | { 995 | "name": "sebastian/environment", 996 | "version": "1.3.8", 997 | "source": { 998 | "type": "git", 999 | "url": "https://github.com/sebastianbergmann/environment.git", 1000 | "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" 1001 | }, 1002 | "dist": { 1003 | "type": "zip", 1004 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", 1005 | "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", 1006 | "shasum": "" 1007 | }, 1008 | "require": { 1009 | "php": "^5.3.3 || ^7.0" 1010 | }, 1011 | "require-dev": { 1012 | "phpunit/phpunit": "^4.8 || ^5.0" 1013 | }, 1014 | "type": "library", 1015 | "extra": { 1016 | "branch-alias": { 1017 | "dev-master": "1.3.x-dev" 1018 | } 1019 | }, 1020 | "autoload": { 1021 | "classmap": [ 1022 | "src/" 1023 | ] 1024 | }, 1025 | "notification-url": "https://packagist.org/downloads/", 1026 | "license": [ 1027 | "BSD-3-Clause" 1028 | ], 1029 | "authors": [ 1030 | { 1031 | "name": "Sebastian Bergmann", 1032 | "email": "sebastian@phpunit.de" 1033 | } 1034 | ], 1035 | "description": "Provides functionality to handle HHVM/PHP environments", 1036 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1037 | "keywords": [ 1038 | "Xdebug", 1039 | "environment", 1040 | "hhvm" 1041 | ], 1042 | "time": "2016-08-18T05:49:44+00:00" 1043 | }, 1044 | { 1045 | "name": "sebastian/exporter", 1046 | "version": "1.2.2", 1047 | "source": { 1048 | "type": "git", 1049 | "url": "https://github.com/sebastianbergmann/exporter.git", 1050 | "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" 1051 | }, 1052 | "dist": { 1053 | "type": "zip", 1054 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", 1055 | "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", 1056 | "shasum": "" 1057 | }, 1058 | "require": { 1059 | "php": ">=5.3.3", 1060 | "sebastian/recursion-context": "~1.0" 1061 | }, 1062 | "require-dev": { 1063 | "ext-mbstring": "*", 1064 | "phpunit/phpunit": "~4.4" 1065 | }, 1066 | "type": "library", 1067 | "extra": { 1068 | "branch-alias": { 1069 | "dev-master": "1.3.x-dev" 1070 | } 1071 | }, 1072 | "autoload": { 1073 | "classmap": [ 1074 | "src/" 1075 | ] 1076 | }, 1077 | "notification-url": "https://packagist.org/downloads/", 1078 | "license": [ 1079 | "BSD-3-Clause" 1080 | ], 1081 | "authors": [ 1082 | { 1083 | "name": "Jeff Welch", 1084 | "email": "whatthejeff@gmail.com" 1085 | }, 1086 | { 1087 | "name": "Volker Dusch", 1088 | "email": "github@wallbash.com" 1089 | }, 1090 | { 1091 | "name": "Bernhard Schussek", 1092 | "email": "bschussek@2bepublished.at" 1093 | }, 1094 | { 1095 | "name": "Sebastian Bergmann", 1096 | "email": "sebastian@phpunit.de" 1097 | }, 1098 | { 1099 | "name": "Adam Harvey", 1100 | "email": "aharvey@php.net" 1101 | } 1102 | ], 1103 | "description": "Provides the functionality to export PHP variables for visualization", 1104 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1105 | "keywords": [ 1106 | "export", 1107 | "exporter" 1108 | ], 1109 | "time": "2016-06-17T09:04:28+00:00" 1110 | }, 1111 | { 1112 | "name": "sebastian/global-state", 1113 | "version": "1.1.1", 1114 | "source": { 1115 | "type": "git", 1116 | "url": "https://github.com/sebastianbergmann/global-state.git", 1117 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 1118 | }, 1119 | "dist": { 1120 | "type": "zip", 1121 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 1122 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 1123 | "shasum": "" 1124 | }, 1125 | "require": { 1126 | "php": ">=5.3.3" 1127 | }, 1128 | "require-dev": { 1129 | "phpunit/phpunit": "~4.2" 1130 | }, 1131 | "suggest": { 1132 | "ext-uopz": "*" 1133 | }, 1134 | "type": "library", 1135 | "extra": { 1136 | "branch-alias": { 1137 | "dev-master": "1.0-dev" 1138 | } 1139 | }, 1140 | "autoload": { 1141 | "classmap": [ 1142 | "src/" 1143 | ] 1144 | }, 1145 | "notification-url": "https://packagist.org/downloads/", 1146 | "license": [ 1147 | "BSD-3-Clause" 1148 | ], 1149 | "authors": [ 1150 | { 1151 | "name": "Sebastian Bergmann", 1152 | "email": "sebastian@phpunit.de" 1153 | } 1154 | ], 1155 | "description": "Snapshotting of global state", 1156 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1157 | "keywords": [ 1158 | "global state" 1159 | ], 1160 | "time": "2015-10-12T03:26:01+00:00" 1161 | }, 1162 | { 1163 | "name": "sebastian/recursion-context", 1164 | "version": "1.0.5", 1165 | "source": { 1166 | "type": "git", 1167 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1168 | "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" 1169 | }, 1170 | "dist": { 1171 | "type": "zip", 1172 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", 1173 | "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", 1174 | "shasum": "" 1175 | }, 1176 | "require": { 1177 | "php": ">=5.3.3" 1178 | }, 1179 | "require-dev": { 1180 | "phpunit/phpunit": "~4.4" 1181 | }, 1182 | "type": "library", 1183 | "extra": { 1184 | "branch-alias": { 1185 | "dev-master": "1.0.x-dev" 1186 | } 1187 | }, 1188 | "autoload": { 1189 | "classmap": [ 1190 | "src/" 1191 | ] 1192 | }, 1193 | "notification-url": "https://packagist.org/downloads/", 1194 | "license": [ 1195 | "BSD-3-Clause" 1196 | ], 1197 | "authors": [ 1198 | { 1199 | "name": "Jeff Welch", 1200 | "email": "whatthejeff@gmail.com" 1201 | }, 1202 | { 1203 | "name": "Sebastian Bergmann", 1204 | "email": "sebastian@phpunit.de" 1205 | }, 1206 | { 1207 | "name": "Adam Harvey", 1208 | "email": "aharvey@php.net" 1209 | } 1210 | ], 1211 | "description": "Provides functionality to recursively process PHP variables", 1212 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1213 | "time": "2016-10-03T07:41:43+00:00" 1214 | }, 1215 | { 1216 | "name": "sebastian/version", 1217 | "version": "1.0.6", 1218 | "source": { 1219 | "type": "git", 1220 | "url": "https://github.com/sebastianbergmann/version.git", 1221 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" 1222 | }, 1223 | "dist": { 1224 | "type": "zip", 1225 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 1226 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 1227 | "shasum": "" 1228 | }, 1229 | "type": "library", 1230 | "autoload": { 1231 | "classmap": [ 1232 | "src/" 1233 | ] 1234 | }, 1235 | "notification-url": "https://packagist.org/downloads/", 1236 | "license": [ 1237 | "BSD-3-Clause" 1238 | ], 1239 | "authors": [ 1240 | { 1241 | "name": "Sebastian Bergmann", 1242 | "email": "sebastian@phpunit.de", 1243 | "role": "lead" 1244 | } 1245 | ], 1246 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1247 | "homepage": "https://github.com/sebastianbergmann/version", 1248 | "time": "2015-06-21T13:59:46+00:00" 1249 | }, 1250 | { 1251 | "name": "symfony/yaml", 1252 | "version": "v3.2.6", 1253 | "source": { 1254 | "type": "git", 1255 | "url": "https://github.com/symfony/yaml.git", 1256 | "reference": "093e416ad096355149e265ea2e4cc1f9ee40ab1a" 1257 | }, 1258 | "dist": { 1259 | "type": "zip", 1260 | "url": "https://api.github.com/repos/symfony/yaml/zipball/093e416ad096355149e265ea2e4cc1f9ee40ab1a", 1261 | "reference": "093e416ad096355149e265ea2e4cc1f9ee40ab1a", 1262 | "shasum": "" 1263 | }, 1264 | "require": { 1265 | "php": ">=5.5.9" 1266 | }, 1267 | "require-dev": { 1268 | "symfony/console": "~2.8|~3.0" 1269 | }, 1270 | "suggest": { 1271 | "symfony/console": "For validating YAML files using the lint command" 1272 | }, 1273 | "type": "library", 1274 | "extra": { 1275 | "branch-alias": { 1276 | "dev-master": "3.2-dev" 1277 | } 1278 | }, 1279 | "autoload": { 1280 | "psr-4": { 1281 | "Symfony\\Component\\Yaml\\": "" 1282 | }, 1283 | "exclude-from-classmap": [ 1284 | "/Tests/" 1285 | ] 1286 | }, 1287 | "notification-url": "https://packagist.org/downloads/", 1288 | "license": [ 1289 | "MIT" 1290 | ], 1291 | "authors": [ 1292 | { 1293 | "name": "Fabien Potencier", 1294 | "email": "fabien@symfony.com" 1295 | }, 1296 | { 1297 | "name": "Symfony Community", 1298 | "homepage": "https://symfony.com/contributors" 1299 | } 1300 | ], 1301 | "description": "Symfony Yaml Component", 1302 | "homepage": "https://symfony.com", 1303 | "time": "2017-03-07T16:47:02+00:00" 1304 | }, 1305 | { 1306 | "name": "webmozart/assert", 1307 | "version": "1.2.0", 1308 | "source": { 1309 | "type": "git", 1310 | "url": "https://github.com/webmozart/assert.git", 1311 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" 1312 | }, 1313 | "dist": { 1314 | "type": "zip", 1315 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", 1316 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", 1317 | "shasum": "" 1318 | }, 1319 | "require": { 1320 | "php": "^5.3.3 || ^7.0" 1321 | }, 1322 | "require-dev": { 1323 | "phpunit/phpunit": "^4.6", 1324 | "sebastian/version": "^1.0.1" 1325 | }, 1326 | "type": "library", 1327 | "extra": { 1328 | "branch-alias": { 1329 | "dev-master": "1.3-dev" 1330 | } 1331 | }, 1332 | "autoload": { 1333 | "psr-4": { 1334 | "Webmozart\\Assert\\": "src/" 1335 | } 1336 | }, 1337 | "notification-url": "https://packagist.org/downloads/", 1338 | "license": [ 1339 | "MIT" 1340 | ], 1341 | "authors": [ 1342 | { 1343 | "name": "Bernhard Schussek", 1344 | "email": "bschussek@gmail.com" 1345 | } 1346 | ], 1347 | "description": "Assertions to validate method input/output with nice error messages.", 1348 | "keywords": [ 1349 | "assert", 1350 | "check", 1351 | "validate" 1352 | ], 1353 | "time": "2016-11-23T20:04:58+00:00" 1354 | } 1355 | ], 1356 | "aliases": [], 1357 | "minimum-stability": "stable", 1358 | "stability-flags": [], 1359 | "prefer-stable": false, 1360 | "prefer-lowest": false, 1361 | "platform": { 1362 | "php": ">=5.5" 1363 | }, 1364 | "platform-dev": [] 1365 | } 1366 | --------------------------------------------------------------------------------