├── .gitignore ├── .travis.yml ├── tests ├── bootstrap.php └── ClientTest.php ├── phpunit.xml.dist ├── composer.json ├── src ├── Message │ ├── Response.php │ └── Request.php └── Client.php ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | composer.phar 2 | /vendor/ 3 | composer.lock 4 | .DS_Store 5 | .idea/ 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.6 5 | 6 | before_script: composer install -n 7 | 8 | script: phpunit -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ./tests 7 | 8 | 9 | 10 | 11 | 12 | vendor 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ideasoft/batch-request-client", 3 | "description": "Batch request client implementation for php.", 4 | "keywords" : ["batch request", "api", "request"], 5 | "type": "library", 6 | "require": { 7 | "guzzlehttp/guzzle": "^6.2" 8 | }, 9 | "require-dev": { 10 | "phpunit/phpunit": "^4.8" 11 | }, 12 | "license": "MIT", 13 | "authors": [ 14 | { 15 | "name": "IdeasoftLabs", 16 | "email": "labs@ideasoft.com.tr" 17 | } 18 | ], 19 | "autoload": { 20 | "psr-4": { 21 | "BatchRequest\\Client\\": "src/" 22 | } 23 | }, 24 | "autoload-dev": { 25 | "psr-4": { 26 | "BatchRequest\\Tests\\": "tests/" 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Message/Response.php: -------------------------------------------------------------------------------- 1 | subResponses; 16 | } 17 | 18 | /** 19 | * @param GuzzleResponse[] $subResponses 20 | */ 21 | public function setSubResponses($subResponses) 22 | { 23 | $this->subResponses = $subResponses; 24 | } 25 | 26 | public function addSubResponse($key, GuzzleResponse $response) 27 | { 28 | $this->subResponses[$key] = $response; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Message/Request.php: -------------------------------------------------------------------------------- 1 | subRequests; 16 | } 17 | 18 | /** 19 | * @param GuzzleRequest[] $subRequests 20 | */ 21 | public function setSubRequests($subRequests) 22 | { 23 | $this->subRequests = $subRequests; 24 | } 25 | 26 | /** 27 | * @param string $key 28 | * @param GuzzleRequest $request 29 | */ 30 | public function addSubRequest($key, GuzzleRequest $request) 31 | { 32 | $this->subRequests[$key] = $request; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## http-batch-client [![Build Status](https://travis-ci.org/IdeasoftLabs/http-batch-client.svg?branch=master)](https://travis-ci.org/IdeasoftLabs/http-batch-client) 2 | http-batch-client allows to combine multiple http requests into a single batch request. 3 | This tool is useful for decrease http requests especially for api endpoints. 4 | ## About multipart/batch 5 | Http multipart/batch is a format for packaging multiple HTTP requests in a single request. You can read this draft more info: https://tools.ietf.org/id/draft-snell-http-batch-00.html 6 | 7 | ### Installing http-batch-client 8 | The easiest way to install http-batch-client is through composer. 9 | ```bash 10 | composer require ideasoft/batch-request-client 11 | ``` 12 | 13 | ## Important Note: 14 | This is only a client implementation. Your api service should supports batch request. 15 | If you are using Symfony 2.8+, you can use https://github.com/IdeasoftLabs/http-batch-bundle for server implementation. 16 | ## How to use http-batch-client 17 | You can create a batch request client and send your requests to batch endpoint and use it via client. 18 | ```php 19 | "Bearer TOKEN" 24 | ]; 25 | 26 | $requests = [ 27 | "users" => new \GuzzleHttp\Psr7\Request("GET", "http://your-api-url/users", ["Authorization" => "Bearer TOKEN"]), 28 | "orders" => new \GuzzleHttp\Psr7\Request("GET", "http://your-api-url/orders", ["Authorization" => "Bearer TOKEN"]) 29 | ]; 30 | 31 | $data = $client->send("http://your-api-url/batch", $headers, $requests); 32 | if ($data->getSubResponses()["users"]->getStatusCode()) { 33 | //sub request success for users 34 | } 35 | 36 | -------------------------------------------------------------------------------- /src/Client.php: -------------------------------------------------------------------------------- 1 | guzzleClient = $guzzleClient ?: new GuzzleClient(); 34 | } 35 | 36 | public function send($batchUrl, array $headers = [], array $subRequests = []) 37 | { 38 | if (sizeof($subRequests) < 1) { 39 | throw new \Exception("Sub requests are not found."); 40 | } 41 | $this->batchRequestHost = parse_url($batchUrl, PHP_URL_HOST); 42 | $this->boundary = md5(rand(0, 1000000)); 43 | 44 | $batchRequest = $this->getBatchRequest($batchUrl, $headers, $subRequests); 45 | return $this->getBatchResponse($batchRequest); 46 | } 47 | 48 | private function getBatchRequest($batchUrl, array $headers = [], array $subRequests = []) 49 | { 50 | $body = $this->getBatchRequestBody($subRequests); 51 | $batchRequest = new BatchRequest("POST", $batchUrl, $headers, $body); 52 | $batchRequest->setSubRequests($subRequests); 53 | $batchRequest = $batchRequest->withAddedHeader( 54 | 'Content-Type', 55 | sprintf( 56 | 'multipart/batch; type="application/http;version=%s"; boundary=%s', 57 | $batchRequest->getProtocolVersion(), $this->boundary) 58 | ); 59 | $this->batchRequest = $batchRequest; 60 | return $batchRequest; 61 | } 62 | 63 | private function getBatchRequestBody($subRequests = []) 64 | { 65 | $data = []; 66 | foreach ($subRequests as $key => $subRequest) { 67 | $data[] = $this->getSubRequestAsString($key, $subRequest); 68 | } 69 | 70 | $batchRequestBody = "--" . $this->boundary . PHP_EOL; 71 | $batchRequestBody .= implode("--" . $this->boundary . PHP_EOL, $data); 72 | $batchRequestBody .= "--" . $this->boundary . "--" . PHP_EOL; 73 | return $batchRequestBody; 74 | } 75 | 76 | private function getSubRequestAsString($key, Request $request) 77 | { 78 | $data[] = $this->getBatchHeaderForSubResponse($key, $request); 79 | $data[] = $this->getSubRequestHeaderAsString($request); 80 | if ($request->getBody()->getSize() > 0) { 81 | $data[] = $request->getBody()->getContents(); 82 | } 83 | return implode(PHP_EOL . PHP_EOL, $data) . PHP_EOL; 84 | } 85 | 86 | private function getBatchHeaderForSubResponse($key, Request $request) 87 | { 88 | $data = 89 | [ 90 | 'Content-Type: application/http;version=' . $request->getProtocolVersion(), 91 | 'Content-Transfer-Encoding: binary', 92 | 'Content-ID: ' . sprintf("<%s-%s@%s>", $this->boundary, $key, $this->batchRequestHost) 93 | ]; 94 | return implode(PHP_EOL, $data); 95 | 96 | } 97 | 98 | private function getSubRequestHeaderAsString(Request $request) 99 | { 100 | $headerData = []; 101 | $headerData[] = strtoupper($request->getMethod()) . ' ' . $request->getUri(); 102 | foreach ($request->getHeaders() as $key => $value) { 103 | $headerData[] = sprintf("%s:%s", $key, implode(";", $value)); 104 | } 105 | $headerString = implode(PHP_EOL, $headerData); 106 | 107 | return $headerString; 108 | } 109 | 110 | private function getBatchResponse(Request $batchRequest) 111 | { 112 | $batchResponse = new Response(); 113 | $response = $this->guzzleClient->send($batchRequest); 114 | $subResponsesString = $this->parseResponseBody($response->getBody()->getContents()); 115 | $subRequestKeys = array_keys($this->batchRequest->getSubRequests()); 116 | $i = 0; 117 | foreach ($subResponsesString as $subResponseString) { 118 | $subResponse = $this->getSubResponse(ltrim($subResponseString)); 119 | $batchResponse->addSubResponse($subRequestKeys[$i++], $subResponse); 120 | } 121 | return $batchResponse; 122 | } 123 | 124 | private function parseResponseBody($body) 125 | { 126 | $delimiter = "--" . $this->boundary . "--"; 127 | $body = current(explode($delimiter, $body)); 128 | $delimiter = "--" . $this->boundary; 129 | $subResponseData = explode($delimiter, $body); 130 | $subResponseData = array_filter($subResponseData, function ($data) { 131 | return strlen($data) > 0; 132 | }); 133 | return $subResponseData; 134 | 135 | } 136 | 137 | private function getSubResponse($responseString) 138 | { 139 | $responseString = trim($responseString); 140 | $data = explode(PHP_EOL . PHP_EOL, $responseString, 2); 141 | $subResponseBodyString = $data[1]; 142 | $subResponse = \GuzzleHttp\Psr7\parse_response($subResponseBodyString); 143 | return $subResponse; 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /tests/ClientTest.php: -------------------------------------------------------------------------------- 1 | batchClient = new Client(); 18 | } 19 | 20 | public function testGetBatchRequestBody() 21 | { 22 | $batchUrl = "http://test-url"; 23 | $headers = ["Authorization" => "Bearer TOKEN"]; 24 | $subRequests = [ 25 | "subReq1" => new Request("GET", "http://test-url/req1", ["test_header" => "test_value"]), 26 | "subReq2" => new Request("POST", "http://test-url/req2", ["test_header" => "test_value"]) 27 | ]; 28 | 29 | /** @var \BatchRequest\Client\Message\Request $data */ 30 | $data = $this->invokeRestrictedMethodAndProperties( 31 | $this->batchClient, 32 | 'getBatchRequest', 33 | [$batchUrl, $headers, $subRequests], 34 | ["boundary" => "TEST_BOUNDARY"] 35 | ); 36 | 37 | $this->assertInstanceOf('BatchRequest\Client\Message\Request', $data); 38 | $this->assertTrue(sizeof($data->getSubRequests()) == 2); 39 | } 40 | 41 | public function testGetSubRequestAsString() 42 | { 43 | $subRequestKey = "test-key"; 44 | $subRequest = new Request("GET", "http://test-url", ["Authorization" => "Bearer TOKEN"], json_encode(["a", "test", "json"])); 45 | $data = $this->invokeRestrictedMethodAndProperties( 46 | $this->batchClient, 47 | "getSubRequestAsString", 48 | [$subRequestKey, $subRequest], 49 | ["boundary" => "TEST_BOUNDARY"] 50 | ); 51 | 52 | $this->assertContains('["a","test","json"]', $data); 53 | $this->assertContains('Authorization:Bearer TOKEN', $data); 54 | $this->assertTrue(sizeof(explode(PHP_EOL . PHP_EOL, $data)) == 3); 55 | } 56 | 57 | public function testGetBatchHeaderForSubResponse() 58 | { 59 | $data = $this->invokeRestrictedMethodAndProperties($this->batchClient, 'getBatchHeaderForSubResponse', 60 | ["test_key", new Request("GET", "http://test-url")], ["boundary" => "test_boundary"]); 61 | 62 | $this->assertTrue(sizeof(explode(PHP_EOL, $data)) == 3); 63 | $this->assertContains("Content-Type", $data); 64 | } 65 | 66 | public function testGetSubRequestHeaderAsString() 67 | { 68 | $request = new Request("GET", "http://test-url"); 69 | $request = $request->withAddedHeader("test-header", "test-header-value"); 70 | $request = $request->withAddedHeader("test-header2", "test-header-value2"); 71 | $batchClient = new Client(); 72 | $headerString = $this->invokeRestrictedMethodAndProperties($batchClient, "getSubRequestHeaderAsString", [$request]); 73 | $this->assertTrue(sizeof(explode(PHP_EOL, $headerString)) == 4); 74 | $this->assertContains("test-header", $headerString); 75 | $this->assertContains("test-header-value", $headerString); 76 | $this->assertContains("test-header2", $headerString); 77 | $this->assertContains("test-header-value2", $headerString); 78 | $this->assertContains("http://test-url", $headerString); 79 | } 80 | 81 | public function testParseResponseBody() 82 | { 83 | $responseString = << 87 | 88 | HTTP/1.0 200 OK 89 | Cache-Control:no-cache, private 90 | Content-Type:application/json 91 | X-Debug-Token:ee387c 92 | X-Debug-Token-Link:http://localhost/_profiler/ee387c 93 | 94 | [{"id":1,"username":"mustafaileri","email":"mi@mustafaileri.com"}] 95 | --48d7fa4591ee22b613248363faa0fed8 96 | Content-Type: application/http;version=1.0 97 | Content-Transfer-Encoding: binaryIn-Reply-To: <48d7fa4591ee22b613248363faa0fed8@localhost> 98 | 99 | HTTP/1.0 200 OK 100 | Cache-Control:no-cache, private 101 | Content-Type:application/json 102 | X-Debug-Token:c80ff6 103 | X-Debug-Token-Link:http://localhost/_profiler/c80ff6 104 | 105 | [{"id":1,"username":"mustafaileri","email":"mi@mustafaileri.com"}] 106 | --48d7fa4591ee22b613248363faa0fed8 107 | Content-Type: application/http;version=1.0 108 | Content-Transfer-Encoding: binaryIn-Reply-To: <48d7fa4591ee22b613248363faa0fed8@localhost> 109 | 110 | HTTP/1.0 200 OK 111 | Cache-Control:no-cache, private 112 | Content-Type:application/json 113 | X-Debug-Token:61598f 114 | X-Debug-Token-Link:http://localhost/_profiler/61598f 115 | 116 | [{"id":1,"username":"mustafaileri","email":"mi@mustafaileri.com"}] 117 | --48d7fa4591ee22b613248363faa0fed8-- 118 | EOT; 119 | 120 | $parsedResponseData = $this->invokeRestrictedMethodAndProperties( 121 | $this->batchClient, 122 | "parseResponseBody", 123 | [$responseString], 124 | ["boundary" => "48d7fa4591ee22b613248363faa0fed8"] 125 | ); 126 | $this->assertTrue(3 == sizeof($parsedResponseData)); 127 | } 128 | 129 | public function testGetSubResponse() 130 | { 131 | $subResponseString = "Content-Type: application/http;version=1.0" . PHP_EOL; 132 | $subResponseString .= "Content-Transfer-Encoding: binaryIn-Reply-To: <48d7fa4591ee22b613248363faa0fed8@localhost>" . PHP_EOL; 133 | $subResponseString .= PHP_EOL; 134 | $subResponseString .= "HTTP/1.0 200 OK" . PHP_EOL; 135 | $subResponseString .= "Cache-Control:no-cache, private" . PHP_EOL; 136 | $subResponseString .= "Content-Type:application/json" . PHP_EOL; 137 | $subResponseString .= PHP_EOL; 138 | $subResponseString .= "[{\"id\":1,\"username\":\"mustafaileri\",\"email\":\"mi@mustafaileri.com\"}]"; 139 | 140 | /** @var Response $subResponse */ 141 | $subResponse = $this->invokeRestrictedMethodAndProperties($this->batchClient, "getSubResponse", [$subResponseString]); 142 | $this->assertEquals(200, $subResponse->getStatusCode()); 143 | $this->assertInstanceOf('GuzzleHttp\Psr7\Response', $subResponse); 144 | } 145 | 146 | private function invokeRestrictedMethodAndProperties($object, $methodName, $args = [], $properties = []) 147 | { 148 | $reflectionClass = new \ReflectionClass(get_class($object)); 149 | $method = $reflectionClass->getMethod($methodName); 150 | $method->setAccessible(true); 151 | 152 | foreach ($properties as $propertyKey => $value) { 153 | $prop = $reflectionClass->getProperty($propertyKey); 154 | $prop->setAccessible(true); 155 | $prop->setValue($object, $value); 156 | } 157 | return $method->invokeArgs($object, $args); 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /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 | "hash": "14f3049cfbcbcb9d8a513ae359eebb02", 8 | "content-hash": "aa9f133947067f81f4c1c53c1163f493", 9 | "packages": [ 10 | { 11 | "name": "guzzlehttp/guzzle", 12 | "version": "6.2.2", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/guzzle/guzzle.git", 16 | "reference": "ebf29dee597f02f09f4d5bbecc68230ea9b08f60" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ebf29dee597f02f09f4d5bbecc68230ea9b08f60", 21 | "reference": "ebf29dee597f02f09f4d5bbecc68230ea9b08f60", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "guzzlehttp/promises": "^1.0", 26 | "guzzlehttp/psr7": "^1.3.1", 27 | "php": ">=5.5" 28 | }, 29 | "require-dev": { 30 | "ext-curl": "*", 31 | "phpunit/phpunit": "^4.0", 32 | "psr/log": "^1.0" 33 | }, 34 | "type": "library", 35 | "extra": { 36 | "branch-alias": { 37 | "dev-master": "6.2-dev" 38 | } 39 | }, 40 | "autoload": { 41 | "files": [ 42 | "src/functions_include.php" 43 | ], 44 | "psr-4": { 45 | "GuzzleHttp\\": "src/" 46 | } 47 | }, 48 | "notification-url": "https://packagist.org/downloads/", 49 | "license": [ 50 | "MIT" 51 | ], 52 | "authors": [ 53 | { 54 | "name": "Michael Dowling", 55 | "email": "mtdowling@gmail.com", 56 | "homepage": "https://github.com/mtdowling" 57 | } 58 | ], 59 | "description": "Guzzle is a PHP HTTP client library", 60 | "homepage": "http://guzzlephp.org/", 61 | "keywords": [ 62 | "client", 63 | "curl", 64 | "framework", 65 | "http", 66 | "http client", 67 | "rest", 68 | "web service" 69 | ], 70 | "time": "2016-10-08 15:01:37" 71 | }, 72 | { 73 | "name": "guzzlehttp/promises", 74 | "version": "1.3.0", 75 | "source": { 76 | "type": "git", 77 | "url": "https://github.com/guzzle/promises.git", 78 | "reference": "2693c101803ca78b27972d84081d027fca790a1e" 79 | }, 80 | "dist": { 81 | "type": "zip", 82 | "url": "https://api.github.com/repos/guzzle/promises/zipball/2693c101803ca78b27972d84081d027fca790a1e", 83 | "reference": "2693c101803ca78b27972d84081d027fca790a1e", 84 | "shasum": "" 85 | }, 86 | "require": { 87 | "php": ">=5.5.0" 88 | }, 89 | "require-dev": { 90 | "phpunit/phpunit": "~4.0" 91 | }, 92 | "type": "library", 93 | "extra": { 94 | "branch-alias": { 95 | "dev-master": "1.0-dev" 96 | } 97 | }, 98 | "autoload": { 99 | "psr-4": { 100 | "GuzzleHttp\\Promise\\": "src/" 101 | }, 102 | "files": [ 103 | "src/functions_include.php" 104 | ] 105 | }, 106 | "notification-url": "https://packagist.org/downloads/", 107 | "license": [ 108 | "MIT" 109 | ], 110 | "authors": [ 111 | { 112 | "name": "Michael Dowling", 113 | "email": "mtdowling@gmail.com", 114 | "homepage": "https://github.com/mtdowling" 115 | } 116 | ], 117 | "description": "Guzzle promises library", 118 | "keywords": [ 119 | "promise" 120 | ], 121 | "time": "2016-11-18 17:47:58" 122 | }, 123 | { 124 | "name": "guzzlehttp/psr7", 125 | "version": "1.3.1", 126 | "source": { 127 | "type": "git", 128 | "url": "https://github.com/guzzle/psr7.git", 129 | "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b" 130 | }, 131 | "dist": { 132 | "type": "zip", 133 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/5c6447c9df362e8f8093bda8f5d8873fe5c7f65b", 134 | "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b", 135 | "shasum": "" 136 | }, 137 | "require": { 138 | "php": ">=5.4.0", 139 | "psr/http-message": "~1.0" 140 | }, 141 | "provide": { 142 | "psr/http-message-implementation": "1.0" 143 | }, 144 | "require-dev": { 145 | "phpunit/phpunit": "~4.0" 146 | }, 147 | "type": "library", 148 | "extra": { 149 | "branch-alias": { 150 | "dev-master": "1.4-dev" 151 | } 152 | }, 153 | "autoload": { 154 | "psr-4": { 155 | "GuzzleHttp\\Psr7\\": "src/" 156 | }, 157 | "files": [ 158 | "src/functions_include.php" 159 | ] 160 | }, 161 | "notification-url": "https://packagist.org/downloads/", 162 | "license": [ 163 | "MIT" 164 | ], 165 | "authors": [ 166 | { 167 | "name": "Michael Dowling", 168 | "email": "mtdowling@gmail.com", 169 | "homepage": "https://github.com/mtdowling" 170 | } 171 | ], 172 | "description": "PSR-7 message implementation", 173 | "keywords": [ 174 | "http", 175 | "message", 176 | "stream", 177 | "uri" 178 | ], 179 | "time": "2016-06-24 23:00:38" 180 | }, 181 | { 182 | "name": "psr/http-message", 183 | "version": "1.0.1", 184 | "source": { 185 | "type": "git", 186 | "url": "https://github.com/php-fig/http-message.git", 187 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 188 | }, 189 | "dist": { 190 | "type": "zip", 191 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 192 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 193 | "shasum": "" 194 | }, 195 | "require": { 196 | "php": ">=5.3.0" 197 | }, 198 | "type": "library", 199 | "extra": { 200 | "branch-alias": { 201 | "dev-master": "1.0.x-dev" 202 | } 203 | }, 204 | "autoload": { 205 | "psr-4": { 206 | "Psr\\Http\\Message\\": "src/" 207 | } 208 | }, 209 | "notification-url": "https://packagist.org/downloads/", 210 | "license": [ 211 | "MIT" 212 | ], 213 | "authors": [ 214 | { 215 | "name": "PHP-FIG", 216 | "homepage": "http://www.php-fig.org/" 217 | } 218 | ], 219 | "description": "Common interface for HTTP messages", 220 | "homepage": "https://github.com/php-fig/http-message", 221 | "keywords": [ 222 | "http", 223 | "http-message", 224 | "psr", 225 | "psr-7", 226 | "request", 227 | "response" 228 | ], 229 | "time": "2016-08-06 14:39:51" 230 | } 231 | ], 232 | "packages-dev": [ 233 | { 234 | "name": "doctrine/instantiator", 235 | "version": "1.0.5", 236 | "source": { 237 | "type": "git", 238 | "url": "https://github.com/doctrine/instantiator.git", 239 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 240 | }, 241 | "dist": { 242 | "type": "zip", 243 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 244 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 245 | "shasum": "" 246 | }, 247 | "require": { 248 | "php": ">=5.3,<8.0-DEV" 249 | }, 250 | "require-dev": { 251 | "athletic/athletic": "~0.1.8", 252 | "ext-pdo": "*", 253 | "ext-phar": "*", 254 | "phpunit/phpunit": "~4.0", 255 | "squizlabs/php_codesniffer": "~2.0" 256 | }, 257 | "type": "library", 258 | "extra": { 259 | "branch-alias": { 260 | "dev-master": "1.0.x-dev" 261 | } 262 | }, 263 | "autoload": { 264 | "psr-4": { 265 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 266 | } 267 | }, 268 | "notification-url": "https://packagist.org/downloads/", 269 | "license": [ 270 | "MIT" 271 | ], 272 | "authors": [ 273 | { 274 | "name": "Marco Pivetta", 275 | "email": "ocramius@gmail.com", 276 | "homepage": "http://ocramius.github.com/" 277 | } 278 | ], 279 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 280 | "homepage": "https://github.com/doctrine/instantiator", 281 | "keywords": [ 282 | "constructor", 283 | "instantiate" 284 | ], 285 | "time": "2015-06-14 21:17:01" 286 | }, 287 | { 288 | "name": "myclabs/deep-copy", 289 | "version": "1.5.5", 290 | "source": { 291 | "type": "git", 292 | "url": "https://github.com/myclabs/DeepCopy.git", 293 | "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108" 294 | }, 295 | "dist": { 296 | "type": "zip", 297 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108", 298 | "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108", 299 | "shasum": "" 300 | }, 301 | "require": { 302 | "php": ">=5.4.0" 303 | }, 304 | "require-dev": { 305 | "doctrine/collections": "1.*", 306 | "phpunit/phpunit": "~4.1" 307 | }, 308 | "type": "library", 309 | "autoload": { 310 | "psr-4": { 311 | "DeepCopy\\": "src/DeepCopy/" 312 | } 313 | }, 314 | "notification-url": "https://packagist.org/downloads/", 315 | "license": [ 316 | "MIT" 317 | ], 318 | "description": "Create deep copies (clones) of your objects", 319 | "homepage": "https://github.com/myclabs/DeepCopy", 320 | "keywords": [ 321 | "clone", 322 | "copy", 323 | "duplicate", 324 | "object", 325 | "object graph" 326 | ], 327 | "time": "2016-10-31 17:19:45" 328 | }, 329 | { 330 | "name": "phpdocumentor/reflection-common", 331 | "version": "1.0", 332 | "source": { 333 | "type": "git", 334 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 335 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" 336 | }, 337 | "dist": { 338 | "type": "zip", 339 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 340 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 341 | "shasum": "" 342 | }, 343 | "require": { 344 | "php": ">=5.5" 345 | }, 346 | "require-dev": { 347 | "phpunit/phpunit": "^4.6" 348 | }, 349 | "type": "library", 350 | "extra": { 351 | "branch-alias": { 352 | "dev-master": "1.0.x-dev" 353 | } 354 | }, 355 | "autoload": { 356 | "psr-4": { 357 | "phpDocumentor\\Reflection\\": [ 358 | "src" 359 | ] 360 | } 361 | }, 362 | "notification-url": "https://packagist.org/downloads/", 363 | "license": [ 364 | "MIT" 365 | ], 366 | "authors": [ 367 | { 368 | "name": "Jaap van Otterdijk", 369 | "email": "opensource@ijaap.nl" 370 | } 371 | ], 372 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 373 | "homepage": "http://www.phpdoc.org", 374 | "keywords": [ 375 | "FQSEN", 376 | "phpDocumentor", 377 | "phpdoc", 378 | "reflection", 379 | "static analysis" 380 | ], 381 | "time": "2015-12-27 11:43:31" 382 | }, 383 | { 384 | "name": "phpdocumentor/reflection-docblock", 385 | "version": "3.1.1", 386 | "source": { 387 | "type": "git", 388 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 389 | "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" 390 | }, 391 | "dist": { 392 | "type": "zip", 393 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", 394 | "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", 395 | "shasum": "" 396 | }, 397 | "require": { 398 | "php": ">=5.5", 399 | "phpdocumentor/reflection-common": "^1.0@dev", 400 | "phpdocumentor/type-resolver": "^0.2.0", 401 | "webmozart/assert": "^1.0" 402 | }, 403 | "require-dev": { 404 | "mockery/mockery": "^0.9.4", 405 | "phpunit/phpunit": "^4.4" 406 | }, 407 | "type": "library", 408 | "autoload": { 409 | "psr-4": { 410 | "phpDocumentor\\Reflection\\": [ 411 | "src/" 412 | ] 413 | } 414 | }, 415 | "notification-url": "https://packagist.org/downloads/", 416 | "license": [ 417 | "MIT" 418 | ], 419 | "authors": [ 420 | { 421 | "name": "Mike van Riel", 422 | "email": "me@mikevanriel.com" 423 | } 424 | ], 425 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 426 | "time": "2016-09-30 07:12:33" 427 | }, 428 | { 429 | "name": "phpdocumentor/type-resolver", 430 | "version": "0.2.1", 431 | "source": { 432 | "type": "git", 433 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 434 | "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" 435 | }, 436 | "dist": { 437 | "type": "zip", 438 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", 439 | "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", 440 | "shasum": "" 441 | }, 442 | "require": { 443 | "php": ">=5.5", 444 | "phpdocumentor/reflection-common": "^1.0" 445 | }, 446 | "require-dev": { 447 | "mockery/mockery": "^0.9.4", 448 | "phpunit/phpunit": "^5.2||^4.8.24" 449 | }, 450 | "type": "library", 451 | "extra": { 452 | "branch-alias": { 453 | "dev-master": "1.0.x-dev" 454 | } 455 | }, 456 | "autoload": { 457 | "psr-4": { 458 | "phpDocumentor\\Reflection\\": [ 459 | "src/" 460 | ] 461 | } 462 | }, 463 | "notification-url": "https://packagist.org/downloads/", 464 | "license": [ 465 | "MIT" 466 | ], 467 | "authors": [ 468 | { 469 | "name": "Mike van Riel", 470 | "email": "me@mikevanriel.com" 471 | } 472 | ], 473 | "time": "2016-11-25 06:54:22" 474 | }, 475 | { 476 | "name": "phpspec/prophecy", 477 | "version": "v1.6.2", 478 | "source": { 479 | "type": "git", 480 | "url": "https://github.com/phpspec/prophecy.git", 481 | "reference": "6c52c2722f8460122f96f86346600e1077ce22cb" 482 | }, 483 | "dist": { 484 | "type": "zip", 485 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb", 486 | "reference": "6c52c2722f8460122f96f86346600e1077ce22cb", 487 | "shasum": "" 488 | }, 489 | "require": { 490 | "doctrine/instantiator": "^1.0.2", 491 | "php": "^5.3|^7.0", 492 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", 493 | "sebastian/comparator": "^1.1", 494 | "sebastian/recursion-context": "^1.0|^2.0" 495 | }, 496 | "require-dev": { 497 | "phpspec/phpspec": "^2.0", 498 | "phpunit/phpunit": "^4.8 || ^5.6.5" 499 | }, 500 | "type": "library", 501 | "extra": { 502 | "branch-alias": { 503 | "dev-master": "1.6.x-dev" 504 | } 505 | }, 506 | "autoload": { 507 | "psr-0": { 508 | "Prophecy\\": "src/" 509 | } 510 | }, 511 | "notification-url": "https://packagist.org/downloads/", 512 | "license": [ 513 | "MIT" 514 | ], 515 | "authors": [ 516 | { 517 | "name": "Konstantin Kudryashov", 518 | "email": "ever.zet@gmail.com", 519 | "homepage": "http://everzet.com" 520 | }, 521 | { 522 | "name": "Marcello Duarte", 523 | "email": "marcello.duarte@gmail.com" 524 | } 525 | ], 526 | "description": "Highly opinionated mocking framework for PHP 5.3+", 527 | "homepage": "https://github.com/phpspec/prophecy", 528 | "keywords": [ 529 | "Double", 530 | "Dummy", 531 | "fake", 532 | "mock", 533 | "spy", 534 | "stub" 535 | ], 536 | "time": "2016-11-21 14:58:47" 537 | }, 538 | { 539 | "name": "phpunit/php-code-coverage", 540 | "version": "4.0.3", 541 | "source": { 542 | "type": "git", 543 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 544 | "reference": "903fd6318d0a90b4770a009ff73e4a4e9c437929" 545 | }, 546 | "dist": { 547 | "type": "zip", 548 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/903fd6318d0a90b4770a009ff73e4a4e9c437929", 549 | "reference": "903fd6318d0a90b4770a009ff73e4a4e9c437929", 550 | "shasum": "" 551 | }, 552 | "require": { 553 | "php": "^5.6 || ^7.0", 554 | "phpunit/php-file-iterator": "~1.3", 555 | "phpunit/php-text-template": "~1.2", 556 | "phpunit/php-token-stream": "^1.4.2", 557 | "sebastian/code-unit-reverse-lookup": "~1.0", 558 | "sebastian/environment": "^1.3.2 || ^2.0", 559 | "sebastian/version": "~1.0|~2.0" 560 | }, 561 | "require-dev": { 562 | "ext-xdebug": ">=2.1.4", 563 | "phpunit/phpunit": "^5.4" 564 | }, 565 | "suggest": { 566 | "ext-dom": "*", 567 | "ext-xdebug": ">=2.4.0", 568 | "ext-xmlwriter": "*" 569 | }, 570 | "type": "library", 571 | "extra": { 572 | "branch-alias": { 573 | "dev-master": "4.0.x-dev" 574 | } 575 | }, 576 | "autoload": { 577 | "classmap": [ 578 | "src/" 579 | ] 580 | }, 581 | "notification-url": "https://packagist.org/downloads/", 582 | "license": [ 583 | "BSD-3-Clause" 584 | ], 585 | "authors": [ 586 | { 587 | "name": "Sebastian Bergmann", 588 | "email": "sb@sebastian-bergmann.de", 589 | "role": "lead" 590 | } 591 | ], 592 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 593 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 594 | "keywords": [ 595 | "coverage", 596 | "testing", 597 | "xunit" 598 | ], 599 | "time": "2016-11-28 16:00:31" 600 | }, 601 | { 602 | "name": "phpunit/php-file-iterator", 603 | "version": "1.4.2", 604 | "source": { 605 | "type": "git", 606 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 607 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" 608 | }, 609 | "dist": { 610 | "type": "zip", 611 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 612 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 613 | "shasum": "" 614 | }, 615 | "require": { 616 | "php": ">=5.3.3" 617 | }, 618 | "type": "library", 619 | "extra": { 620 | "branch-alias": { 621 | "dev-master": "1.4.x-dev" 622 | } 623 | }, 624 | "autoload": { 625 | "classmap": [ 626 | "src/" 627 | ] 628 | }, 629 | "notification-url": "https://packagist.org/downloads/", 630 | "license": [ 631 | "BSD-3-Clause" 632 | ], 633 | "authors": [ 634 | { 635 | "name": "Sebastian Bergmann", 636 | "email": "sb@sebastian-bergmann.de", 637 | "role": "lead" 638 | } 639 | ], 640 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 641 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 642 | "keywords": [ 643 | "filesystem", 644 | "iterator" 645 | ], 646 | "time": "2016-10-03 07:40:28" 647 | }, 648 | { 649 | "name": "phpunit/php-text-template", 650 | "version": "1.2.1", 651 | "source": { 652 | "type": "git", 653 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 654 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 655 | }, 656 | "dist": { 657 | "type": "zip", 658 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 659 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 660 | "shasum": "" 661 | }, 662 | "require": { 663 | "php": ">=5.3.3" 664 | }, 665 | "type": "library", 666 | "autoload": { 667 | "classmap": [ 668 | "src/" 669 | ] 670 | }, 671 | "notification-url": "https://packagist.org/downloads/", 672 | "license": [ 673 | "BSD-3-Clause" 674 | ], 675 | "authors": [ 676 | { 677 | "name": "Sebastian Bergmann", 678 | "email": "sebastian@phpunit.de", 679 | "role": "lead" 680 | } 681 | ], 682 | "description": "Simple template engine.", 683 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 684 | "keywords": [ 685 | "template" 686 | ], 687 | "time": "2015-06-21 13:50:34" 688 | }, 689 | { 690 | "name": "phpunit/php-timer", 691 | "version": "1.0.8", 692 | "source": { 693 | "type": "git", 694 | "url": "https://github.com/sebastianbergmann/php-timer.git", 695 | "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" 696 | }, 697 | "dist": { 698 | "type": "zip", 699 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", 700 | "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", 701 | "shasum": "" 702 | }, 703 | "require": { 704 | "php": ">=5.3.3" 705 | }, 706 | "require-dev": { 707 | "phpunit/phpunit": "~4|~5" 708 | }, 709 | "type": "library", 710 | "autoload": { 711 | "classmap": [ 712 | "src/" 713 | ] 714 | }, 715 | "notification-url": "https://packagist.org/downloads/", 716 | "license": [ 717 | "BSD-3-Clause" 718 | ], 719 | "authors": [ 720 | { 721 | "name": "Sebastian Bergmann", 722 | "email": "sb@sebastian-bergmann.de", 723 | "role": "lead" 724 | } 725 | ], 726 | "description": "Utility class for timing", 727 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 728 | "keywords": [ 729 | "timer" 730 | ], 731 | "time": "2016-05-12 18:03:57" 732 | }, 733 | { 734 | "name": "phpunit/php-token-stream", 735 | "version": "1.4.9", 736 | "source": { 737 | "type": "git", 738 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 739 | "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b" 740 | }, 741 | "dist": { 742 | "type": "zip", 743 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b", 744 | "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b", 745 | "shasum": "" 746 | }, 747 | "require": { 748 | "ext-tokenizer": "*", 749 | "php": ">=5.3.3" 750 | }, 751 | "require-dev": { 752 | "phpunit/phpunit": "~4.2" 753 | }, 754 | "type": "library", 755 | "extra": { 756 | "branch-alias": { 757 | "dev-master": "1.4-dev" 758 | } 759 | }, 760 | "autoload": { 761 | "classmap": [ 762 | "src/" 763 | ] 764 | }, 765 | "notification-url": "https://packagist.org/downloads/", 766 | "license": [ 767 | "BSD-3-Clause" 768 | ], 769 | "authors": [ 770 | { 771 | "name": "Sebastian Bergmann", 772 | "email": "sebastian@phpunit.de" 773 | } 774 | ], 775 | "description": "Wrapper around PHP's tokenizer extension.", 776 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 777 | "keywords": [ 778 | "tokenizer" 779 | ], 780 | "time": "2016-11-15 14:06:22" 781 | }, 782 | { 783 | "name": "phpunit/phpunit", 784 | "version": "5.7.3", 785 | "source": { 786 | "type": "git", 787 | "url": "https://github.com/sebastianbergmann/phpunit.git", 788 | "reference": "de164acc2f2bb0b79beb892a36260264b2a03233" 789 | }, 790 | "dist": { 791 | "type": "zip", 792 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de164acc2f2bb0b79beb892a36260264b2a03233", 793 | "reference": "de164acc2f2bb0b79beb892a36260264b2a03233", 794 | "shasum": "" 795 | }, 796 | "require": { 797 | "ext-dom": "*", 798 | "ext-json": "*", 799 | "ext-libxml": "*", 800 | "ext-mbstring": "*", 801 | "ext-xml": "*", 802 | "myclabs/deep-copy": "~1.3", 803 | "php": "^5.6 || ^7.0", 804 | "phpspec/prophecy": "^1.6.2", 805 | "phpunit/php-code-coverage": "^4.0.3", 806 | "phpunit/php-file-iterator": "~1.4", 807 | "phpunit/php-text-template": "~1.2", 808 | "phpunit/php-timer": "^1.0.6", 809 | "phpunit/phpunit-mock-objects": "^3.2", 810 | "sebastian/comparator": "~1.2.2", 811 | "sebastian/diff": "~1.2", 812 | "sebastian/environment": "^1.3.4 || ^2.0", 813 | "sebastian/exporter": "~2.0", 814 | "sebastian/global-state": "~1.0", 815 | "sebastian/object-enumerator": "~2.0", 816 | "sebastian/resource-operations": "~1.0", 817 | "sebastian/version": "~1.0|~2.0", 818 | "symfony/yaml": "~2.1|~3.0" 819 | }, 820 | "conflict": { 821 | "phpdocumentor/reflection-docblock": "3.0.2" 822 | }, 823 | "require-dev": { 824 | "ext-pdo": "*" 825 | }, 826 | "suggest": { 827 | "ext-xdebug": "*", 828 | "phpunit/php-invoker": "~1.1" 829 | }, 830 | "bin": [ 831 | "phpunit" 832 | ], 833 | "type": "library", 834 | "extra": { 835 | "branch-alias": { 836 | "dev-master": "5.7.x-dev" 837 | } 838 | }, 839 | "autoload": { 840 | "classmap": [ 841 | "src/" 842 | ] 843 | }, 844 | "notification-url": "https://packagist.org/downloads/", 845 | "license": [ 846 | "BSD-3-Clause" 847 | ], 848 | "authors": [ 849 | { 850 | "name": "Sebastian Bergmann", 851 | "email": "sebastian@phpunit.de", 852 | "role": "lead" 853 | } 854 | ], 855 | "description": "The PHP Unit Testing framework.", 856 | "homepage": "https://phpunit.de/", 857 | "keywords": [ 858 | "phpunit", 859 | "testing", 860 | "xunit" 861 | ], 862 | "time": "2016-12-09 02:48:53" 863 | }, 864 | { 865 | "name": "phpunit/phpunit-mock-objects", 866 | "version": "3.4.3", 867 | "source": { 868 | "type": "git", 869 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 870 | "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" 871 | }, 872 | "dist": { 873 | "type": "zip", 874 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", 875 | "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", 876 | "shasum": "" 877 | }, 878 | "require": { 879 | "doctrine/instantiator": "^1.0.2", 880 | "php": "^5.6 || ^7.0", 881 | "phpunit/php-text-template": "^1.2", 882 | "sebastian/exporter": "^1.2 || ^2.0" 883 | }, 884 | "conflict": { 885 | "phpunit/phpunit": "<5.4.0" 886 | }, 887 | "require-dev": { 888 | "phpunit/phpunit": "^5.4" 889 | }, 890 | "suggest": { 891 | "ext-soap": "*" 892 | }, 893 | "type": "library", 894 | "extra": { 895 | "branch-alias": { 896 | "dev-master": "3.2.x-dev" 897 | } 898 | }, 899 | "autoload": { 900 | "classmap": [ 901 | "src/" 902 | ] 903 | }, 904 | "notification-url": "https://packagist.org/downloads/", 905 | "license": [ 906 | "BSD-3-Clause" 907 | ], 908 | "authors": [ 909 | { 910 | "name": "Sebastian Bergmann", 911 | "email": "sb@sebastian-bergmann.de", 912 | "role": "lead" 913 | } 914 | ], 915 | "description": "Mock Object library for PHPUnit", 916 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 917 | "keywords": [ 918 | "mock", 919 | "xunit" 920 | ], 921 | "time": "2016-12-08 20:27:08" 922 | }, 923 | { 924 | "name": "sebastian/code-unit-reverse-lookup", 925 | "version": "1.0.0", 926 | "source": { 927 | "type": "git", 928 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 929 | "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe" 930 | }, 931 | "dist": { 932 | "type": "zip", 933 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe", 934 | "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe", 935 | "shasum": "" 936 | }, 937 | "require": { 938 | "php": ">=5.6" 939 | }, 940 | "require-dev": { 941 | "phpunit/phpunit": "~5" 942 | }, 943 | "type": "library", 944 | "extra": { 945 | "branch-alias": { 946 | "dev-master": "1.0.x-dev" 947 | } 948 | }, 949 | "autoload": { 950 | "classmap": [ 951 | "src/" 952 | ] 953 | }, 954 | "notification-url": "https://packagist.org/downloads/", 955 | "license": [ 956 | "BSD-3-Clause" 957 | ], 958 | "authors": [ 959 | { 960 | "name": "Sebastian Bergmann", 961 | "email": "sebastian@phpunit.de" 962 | } 963 | ], 964 | "description": "Looks up which function or method a line of code belongs to", 965 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 966 | "time": "2016-02-13 06:45:14" 967 | }, 968 | { 969 | "name": "sebastian/comparator", 970 | "version": "1.2.2", 971 | "source": { 972 | "type": "git", 973 | "url": "https://github.com/sebastianbergmann/comparator.git", 974 | "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" 975 | }, 976 | "dist": { 977 | "type": "zip", 978 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", 979 | "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", 980 | "shasum": "" 981 | }, 982 | "require": { 983 | "php": ">=5.3.3", 984 | "sebastian/diff": "~1.2", 985 | "sebastian/exporter": "~1.2 || ~2.0" 986 | }, 987 | "require-dev": { 988 | "phpunit/phpunit": "~4.4" 989 | }, 990 | "type": "library", 991 | "extra": { 992 | "branch-alias": { 993 | "dev-master": "1.2.x-dev" 994 | } 995 | }, 996 | "autoload": { 997 | "classmap": [ 998 | "src/" 999 | ] 1000 | }, 1001 | "notification-url": "https://packagist.org/downloads/", 1002 | "license": [ 1003 | "BSD-3-Clause" 1004 | ], 1005 | "authors": [ 1006 | { 1007 | "name": "Jeff Welch", 1008 | "email": "whatthejeff@gmail.com" 1009 | }, 1010 | { 1011 | "name": "Volker Dusch", 1012 | "email": "github@wallbash.com" 1013 | }, 1014 | { 1015 | "name": "Bernhard Schussek", 1016 | "email": "bschussek@2bepublished.at" 1017 | }, 1018 | { 1019 | "name": "Sebastian Bergmann", 1020 | "email": "sebastian@phpunit.de" 1021 | } 1022 | ], 1023 | "description": "Provides the functionality to compare PHP values for equality", 1024 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 1025 | "keywords": [ 1026 | "comparator", 1027 | "compare", 1028 | "equality" 1029 | ], 1030 | "time": "2016-11-19 09:18:40" 1031 | }, 1032 | { 1033 | "name": "sebastian/diff", 1034 | "version": "1.4.1", 1035 | "source": { 1036 | "type": "git", 1037 | "url": "https://github.com/sebastianbergmann/diff.git", 1038 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" 1039 | }, 1040 | "dist": { 1041 | "type": "zip", 1042 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", 1043 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", 1044 | "shasum": "" 1045 | }, 1046 | "require": { 1047 | "php": ">=5.3.3" 1048 | }, 1049 | "require-dev": { 1050 | "phpunit/phpunit": "~4.8" 1051 | }, 1052 | "type": "library", 1053 | "extra": { 1054 | "branch-alias": { 1055 | "dev-master": "1.4-dev" 1056 | } 1057 | }, 1058 | "autoload": { 1059 | "classmap": [ 1060 | "src/" 1061 | ] 1062 | }, 1063 | "notification-url": "https://packagist.org/downloads/", 1064 | "license": [ 1065 | "BSD-3-Clause" 1066 | ], 1067 | "authors": [ 1068 | { 1069 | "name": "Kore Nordmann", 1070 | "email": "mail@kore-nordmann.de" 1071 | }, 1072 | { 1073 | "name": "Sebastian Bergmann", 1074 | "email": "sebastian@phpunit.de" 1075 | } 1076 | ], 1077 | "description": "Diff implementation", 1078 | "homepage": "https://github.com/sebastianbergmann/diff", 1079 | "keywords": [ 1080 | "diff" 1081 | ], 1082 | "time": "2015-12-08 07:14:41" 1083 | }, 1084 | { 1085 | "name": "sebastian/environment", 1086 | "version": "2.0.0", 1087 | "source": { 1088 | "type": "git", 1089 | "url": "https://github.com/sebastianbergmann/environment.git", 1090 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" 1091 | }, 1092 | "dist": { 1093 | "type": "zip", 1094 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 1095 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 1096 | "shasum": "" 1097 | }, 1098 | "require": { 1099 | "php": "^5.6 || ^7.0" 1100 | }, 1101 | "require-dev": { 1102 | "phpunit/phpunit": "^5.0" 1103 | }, 1104 | "type": "library", 1105 | "extra": { 1106 | "branch-alias": { 1107 | "dev-master": "2.0.x-dev" 1108 | } 1109 | }, 1110 | "autoload": { 1111 | "classmap": [ 1112 | "src/" 1113 | ] 1114 | }, 1115 | "notification-url": "https://packagist.org/downloads/", 1116 | "license": [ 1117 | "BSD-3-Clause" 1118 | ], 1119 | "authors": [ 1120 | { 1121 | "name": "Sebastian Bergmann", 1122 | "email": "sebastian@phpunit.de" 1123 | } 1124 | ], 1125 | "description": "Provides functionality to handle HHVM/PHP environments", 1126 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1127 | "keywords": [ 1128 | "Xdebug", 1129 | "environment", 1130 | "hhvm" 1131 | ], 1132 | "time": "2016-11-26 07:53:53" 1133 | }, 1134 | { 1135 | "name": "sebastian/exporter", 1136 | "version": "2.0.0", 1137 | "source": { 1138 | "type": "git", 1139 | "url": "https://github.com/sebastianbergmann/exporter.git", 1140 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" 1141 | }, 1142 | "dist": { 1143 | "type": "zip", 1144 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 1145 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 1146 | "shasum": "" 1147 | }, 1148 | "require": { 1149 | "php": ">=5.3.3", 1150 | "sebastian/recursion-context": "~2.0" 1151 | }, 1152 | "require-dev": { 1153 | "ext-mbstring": "*", 1154 | "phpunit/phpunit": "~4.4" 1155 | }, 1156 | "type": "library", 1157 | "extra": { 1158 | "branch-alias": { 1159 | "dev-master": "2.0.x-dev" 1160 | } 1161 | }, 1162 | "autoload": { 1163 | "classmap": [ 1164 | "src/" 1165 | ] 1166 | }, 1167 | "notification-url": "https://packagist.org/downloads/", 1168 | "license": [ 1169 | "BSD-3-Clause" 1170 | ], 1171 | "authors": [ 1172 | { 1173 | "name": "Jeff Welch", 1174 | "email": "whatthejeff@gmail.com" 1175 | }, 1176 | { 1177 | "name": "Volker Dusch", 1178 | "email": "github@wallbash.com" 1179 | }, 1180 | { 1181 | "name": "Bernhard Schussek", 1182 | "email": "bschussek@2bepublished.at" 1183 | }, 1184 | { 1185 | "name": "Sebastian Bergmann", 1186 | "email": "sebastian@phpunit.de" 1187 | }, 1188 | { 1189 | "name": "Adam Harvey", 1190 | "email": "aharvey@php.net" 1191 | } 1192 | ], 1193 | "description": "Provides the functionality to export PHP variables for visualization", 1194 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1195 | "keywords": [ 1196 | "export", 1197 | "exporter" 1198 | ], 1199 | "time": "2016-11-19 08:54:04" 1200 | }, 1201 | { 1202 | "name": "sebastian/global-state", 1203 | "version": "1.1.1", 1204 | "source": { 1205 | "type": "git", 1206 | "url": "https://github.com/sebastianbergmann/global-state.git", 1207 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 1208 | }, 1209 | "dist": { 1210 | "type": "zip", 1211 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 1212 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 1213 | "shasum": "" 1214 | }, 1215 | "require": { 1216 | "php": ">=5.3.3" 1217 | }, 1218 | "require-dev": { 1219 | "phpunit/phpunit": "~4.2" 1220 | }, 1221 | "suggest": { 1222 | "ext-uopz": "*" 1223 | }, 1224 | "type": "library", 1225 | "extra": { 1226 | "branch-alias": { 1227 | "dev-master": "1.0-dev" 1228 | } 1229 | }, 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 | } 1244 | ], 1245 | "description": "Snapshotting of global state", 1246 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1247 | "keywords": [ 1248 | "global state" 1249 | ], 1250 | "time": "2015-10-12 03:26:01" 1251 | }, 1252 | { 1253 | "name": "sebastian/object-enumerator", 1254 | "version": "2.0.0", 1255 | "source": { 1256 | "type": "git", 1257 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1258 | "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35" 1259 | }, 1260 | "dist": { 1261 | "type": "zip", 1262 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", 1263 | "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", 1264 | "shasum": "" 1265 | }, 1266 | "require": { 1267 | "php": ">=5.6", 1268 | "sebastian/recursion-context": "~2.0" 1269 | }, 1270 | "require-dev": { 1271 | "phpunit/phpunit": "~5" 1272 | }, 1273 | "type": "library", 1274 | "extra": { 1275 | "branch-alias": { 1276 | "dev-master": "2.0.x-dev" 1277 | } 1278 | }, 1279 | "autoload": { 1280 | "classmap": [ 1281 | "src/" 1282 | ] 1283 | }, 1284 | "notification-url": "https://packagist.org/downloads/", 1285 | "license": [ 1286 | "BSD-3-Clause" 1287 | ], 1288 | "authors": [ 1289 | { 1290 | "name": "Sebastian Bergmann", 1291 | "email": "sebastian@phpunit.de" 1292 | } 1293 | ], 1294 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1295 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1296 | "time": "2016-11-19 07:35:10" 1297 | }, 1298 | { 1299 | "name": "sebastian/recursion-context", 1300 | "version": "2.0.0", 1301 | "source": { 1302 | "type": "git", 1303 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1304 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" 1305 | }, 1306 | "dist": { 1307 | "type": "zip", 1308 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", 1309 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", 1310 | "shasum": "" 1311 | }, 1312 | "require": { 1313 | "php": ">=5.3.3" 1314 | }, 1315 | "require-dev": { 1316 | "phpunit/phpunit": "~4.4" 1317 | }, 1318 | "type": "library", 1319 | "extra": { 1320 | "branch-alias": { 1321 | "dev-master": "2.0.x-dev" 1322 | } 1323 | }, 1324 | "autoload": { 1325 | "classmap": [ 1326 | "src/" 1327 | ] 1328 | }, 1329 | "notification-url": "https://packagist.org/downloads/", 1330 | "license": [ 1331 | "BSD-3-Clause" 1332 | ], 1333 | "authors": [ 1334 | { 1335 | "name": "Jeff Welch", 1336 | "email": "whatthejeff@gmail.com" 1337 | }, 1338 | { 1339 | "name": "Sebastian Bergmann", 1340 | "email": "sebastian@phpunit.de" 1341 | }, 1342 | { 1343 | "name": "Adam Harvey", 1344 | "email": "aharvey@php.net" 1345 | } 1346 | ], 1347 | "description": "Provides functionality to recursively process PHP variables", 1348 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1349 | "time": "2016-11-19 07:33:16" 1350 | }, 1351 | { 1352 | "name": "sebastian/resource-operations", 1353 | "version": "1.0.0", 1354 | "source": { 1355 | "type": "git", 1356 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1357 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 1358 | }, 1359 | "dist": { 1360 | "type": "zip", 1361 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1362 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1363 | "shasum": "" 1364 | }, 1365 | "require": { 1366 | "php": ">=5.6.0" 1367 | }, 1368 | "type": "library", 1369 | "extra": { 1370 | "branch-alias": { 1371 | "dev-master": "1.0.x-dev" 1372 | } 1373 | }, 1374 | "autoload": { 1375 | "classmap": [ 1376 | "src/" 1377 | ] 1378 | }, 1379 | "notification-url": "https://packagist.org/downloads/", 1380 | "license": [ 1381 | "BSD-3-Clause" 1382 | ], 1383 | "authors": [ 1384 | { 1385 | "name": "Sebastian Bergmann", 1386 | "email": "sebastian@phpunit.de" 1387 | } 1388 | ], 1389 | "description": "Provides a list of PHP built-in functions that operate on resources", 1390 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1391 | "time": "2015-07-28 20:34:47" 1392 | }, 1393 | { 1394 | "name": "sebastian/version", 1395 | "version": "2.0.1", 1396 | "source": { 1397 | "type": "git", 1398 | "url": "https://github.com/sebastianbergmann/version.git", 1399 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1400 | }, 1401 | "dist": { 1402 | "type": "zip", 1403 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1404 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1405 | "shasum": "" 1406 | }, 1407 | "require": { 1408 | "php": ">=5.6" 1409 | }, 1410 | "type": "library", 1411 | "extra": { 1412 | "branch-alias": { 1413 | "dev-master": "2.0.x-dev" 1414 | } 1415 | }, 1416 | "autoload": { 1417 | "classmap": [ 1418 | "src/" 1419 | ] 1420 | }, 1421 | "notification-url": "https://packagist.org/downloads/", 1422 | "license": [ 1423 | "BSD-3-Clause" 1424 | ], 1425 | "authors": [ 1426 | { 1427 | "name": "Sebastian Bergmann", 1428 | "email": "sebastian@phpunit.de", 1429 | "role": "lead" 1430 | } 1431 | ], 1432 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1433 | "homepage": "https://github.com/sebastianbergmann/version", 1434 | "time": "2016-10-03 07:35:21" 1435 | }, 1436 | { 1437 | "name": "symfony/yaml", 1438 | "version": "v3.2.0", 1439 | "source": { 1440 | "type": "git", 1441 | "url": "https://github.com/symfony/yaml.git", 1442 | "reference": "f2300ba8fbb002c028710b92e1906e7457410693" 1443 | }, 1444 | "dist": { 1445 | "type": "zip", 1446 | "url": "https://api.github.com/repos/symfony/yaml/zipball/f2300ba8fbb002c028710b92e1906e7457410693", 1447 | "reference": "f2300ba8fbb002c028710b92e1906e7457410693", 1448 | "shasum": "" 1449 | }, 1450 | "require": { 1451 | "php": ">=5.5.9" 1452 | }, 1453 | "require-dev": { 1454 | "symfony/console": "~2.8|~3.0" 1455 | }, 1456 | "suggest": { 1457 | "symfony/console": "For validating YAML files using the lint command" 1458 | }, 1459 | "type": "library", 1460 | "extra": { 1461 | "branch-alias": { 1462 | "dev-master": "3.2-dev" 1463 | } 1464 | }, 1465 | "autoload": { 1466 | "psr-4": { 1467 | "Symfony\\Component\\Yaml\\": "" 1468 | }, 1469 | "exclude-from-classmap": [ 1470 | "/Tests/" 1471 | ] 1472 | }, 1473 | "notification-url": "https://packagist.org/downloads/", 1474 | "license": [ 1475 | "MIT" 1476 | ], 1477 | "authors": [ 1478 | { 1479 | "name": "Fabien Potencier", 1480 | "email": "fabien@symfony.com" 1481 | }, 1482 | { 1483 | "name": "Symfony Community", 1484 | "homepage": "https://symfony.com/contributors" 1485 | } 1486 | ], 1487 | "description": "Symfony Yaml Component", 1488 | "homepage": "https://symfony.com", 1489 | "time": "2016-11-18 21:17:59" 1490 | }, 1491 | { 1492 | "name": "webmozart/assert", 1493 | "version": "1.2.0", 1494 | "source": { 1495 | "type": "git", 1496 | "url": "https://github.com/webmozart/assert.git", 1497 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" 1498 | }, 1499 | "dist": { 1500 | "type": "zip", 1501 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", 1502 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", 1503 | "shasum": "" 1504 | }, 1505 | "require": { 1506 | "php": "^5.3.3 || ^7.0" 1507 | }, 1508 | "require-dev": { 1509 | "phpunit/phpunit": "^4.6", 1510 | "sebastian/version": "^1.0.1" 1511 | }, 1512 | "type": "library", 1513 | "extra": { 1514 | "branch-alias": { 1515 | "dev-master": "1.3-dev" 1516 | } 1517 | }, 1518 | "autoload": { 1519 | "psr-4": { 1520 | "Webmozart\\Assert\\": "src/" 1521 | } 1522 | }, 1523 | "notification-url": "https://packagist.org/downloads/", 1524 | "license": [ 1525 | "MIT" 1526 | ], 1527 | "authors": [ 1528 | { 1529 | "name": "Bernhard Schussek", 1530 | "email": "bschussek@gmail.com" 1531 | } 1532 | ], 1533 | "description": "Assertions to validate method input/output with nice error messages.", 1534 | "keywords": [ 1535 | "assert", 1536 | "check", 1537 | "validate" 1538 | ], 1539 | "time": "2016-11-23 20:04:58" 1540 | } 1541 | ], 1542 | "aliases": [], 1543 | "minimum-stability": "stable", 1544 | "stability-flags": [], 1545 | "prefer-stable": false, 1546 | "prefer-lowest": false, 1547 | "platform": [], 1548 | "platform-dev": [] 1549 | } 1550 | --------------------------------------------------------------------------------