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