├── .gitignore ├── demo.php ├── bin └── php-security-scanner ├── test ├── code │ ├── mysql_query.php │ └── mysql_query_func_argument.php └── PHPSecurityScanner │ └── EndToEndTest.php ├── phpunit.xml.dist ├── README.md ├── composer.json ├── LICENSE ├── .php_cs ├── lib └── PHPSecurityScanner │ ├── Command │ └── Scan.php │ └── Rule │ └── MySQLQuery.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | vendor 2 | test.php 3 | -------------------------------------------------------------------------------- /demo.php: -------------------------------------------------------------------------------- 1 | = 0; $i--) { 9 | $file = __DIR__ . str_repeat('/..', $i) . "/vendor/autoload.php"; 10 | if (file_exists($file)) { 11 | $found = true; 12 | require_once $file; 13 | break; 14 | } 15 | } 16 | 17 | if (!$found) { 18 | fwrite(STDERR, 'You need to setup the project dependencies using Composer' . PHP_EOL); 19 | die(1); 20 | } 21 | 22 | $app = new \Cilex\Application("SecurityScanner"); 23 | $app->command(new \PHPSecurityScanner\Command\Scan); 24 | $app->run(); 25 | 26 | -------------------------------------------------------------------------------- /test/code/mysql_query.php: -------------------------------------------------------------------------------- 1 | 16 | EOF; 17 | 18 | return [ 19 | $code, 20 | [ 21 | [ 22 | "line" => 3, 23 | "message" => "Possible SQL Injection found in call to mysql_query() argument number 1", 24 | ] 25 | ] 26 | ]; -------------------------------------------------------------------------------- /test/code/mysql_query_func_argument.php: -------------------------------------------------------------------------------- 1 | 21 | EOF; 22 | 23 | return [ 24 | $code, 25 | [ 26 | [ 27 | "line" => 4, 28 | "message" => "Possible SQL Injection found in call to foo() argument number 1", 29 | ] 30 | ] 31 | ]; -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 15 | ./test/ 16 | 17 | 18 | 19 | 20 | 21 | ./lib/PHPSecurityScanner/ 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A Static Analyzer Security Scanner (for PHP) 2 | 3 | This detects passing unsafe variables to unsafe function arguments. 4 | 5 | ## Usage: 6 | 7 | bin/php-security-scanner scan path/to/files 8 | 9 | It will search through all files for security issues. 10 | 11 | ## Example 12 | 13 | Given the following code: 14 | 15 | ```php 16 | 27 | ``` 28 | 29 | Running the scanner on this file will identify like 4 as an error, with the message: 30 | 31 | > Possible SQL Injection found in call to foo() argument number 1 32 | 33 | ## Supported vulnerability scanners: 34 | 35 | Currently, only `mysql_query` is supported, and only in limited situations. -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ircmaxell/php-security-scanner", 3 | "description": "A Static Security Scanner for PHP", 4 | "license": "MIT", 5 | "authors": [ 6 | { 7 | "name": "Anthony Ferrara", 8 | "email": "ircmaxell@gmail.com" 9 | } 10 | ], 11 | "require": { 12 | "php": ">=5.5", 13 | "ircmaxell/php-cfg": "dev-master", 14 | "ircmaxell/php-types": "dev-master", 15 | "ircmaxell/tuli": "dev-master", 16 | "cilex/cilex": "1.*" 17 | }, 18 | "require-dev": { 19 | "phpunit/phpunit": "^4.7", 20 | "fabpot/php-cs-fixer": "1.*" 21 | }, 22 | "minimum-stability": "dev", 23 | "autoload": { 24 | "psr-4": { 25 | "PHPSecurityScanner\\": "lib/PHPSecurityScanner/" 26 | } 27 | }, 28 | "bin": [ 29 | "bin/php-security-scanner" 30 | ] 31 | 32 | } 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Anthony Ferrara 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /.php_cs: -------------------------------------------------------------------------------- 1 | level(Symfony\CS\FixerInterface::NONE_LEVEL) 14 | ->fixers([ 15 | 'header_comment', 16 | 'linefeed', 17 | 'indentation', 18 | 'elseif', 19 | 'line_after_namespace', 20 | 'lowercase_constants', 21 | 'lowercase_keywords', 22 | 'method_argument_space', 23 | 'single_blank_line_before_namespace', 24 | 'ordered_use', 25 | 'short_array_syntax', 26 | 'single_line_after_imports', 27 | 'visibility', 28 | 'trailing_spaces', 29 | 'concat_with_spaces', 30 | 'align_double_arrow', 31 | 'unused_use', 32 | 'ternary_spaces', 33 | 'remove_leading_slash_use', 34 | 'remove_lines_between_uses', 35 | 'phpdoc_indent', 36 | 'phpdoc_no_access', 37 | 'phpdoc_params', 38 | 'phpdoc_scalar', 39 | 'phpdoc_separation', 40 | 'phpdoc_trim', 41 | 'phpdoc_var_without_name', 42 | 'phpdoc_order', 43 | 'no_empty_lines_after_phpdocs', 44 | ]) 45 | ->finder( 46 | Symfony\CS\Finder\DefaultFinder::create() 47 | ->in(__DIR__ . "/lib") 48 | ->in(__DIR__ . "/bin") 49 | ->in(__DIR__ . "/test") 50 | ) 51 | ; 52 | -------------------------------------------------------------------------------- /lib/PHPSecurityScanner/Command/Scan.php: -------------------------------------------------------------------------------- 1 | setName('scan') 29 | ->setDescription('Scan the provided files'); 30 | } 31 | 32 | protected function execute(InputInterface $input, OutputInterface $output) { 33 | $state = parent::execute($input, $output); 34 | $this->loadRules(); 35 | $errors = []; 36 | foreach ($this->rules as $rule) { 37 | echo "Executing rule: " . $rule->getName() . "\n"; 38 | $errors = array_merge($errors, $rule->execute($state)); 39 | } 40 | foreach ($errors as $error) { 41 | $this->emitError($error[0], $error[1]); 42 | } 43 | } 44 | 45 | 46 | public function loadRules() { 47 | $this->rules[] = new PHPSecurityScanner\Rule\MySQLQuery; 48 | } 49 | 50 | protected function emitError($msg, Op $op) { 51 | echo $msg; 52 | echo " in "; 53 | echo $op->getFile() . " on line " . $op->getLine(); 54 | echo "\n"; 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /test/PHPSecurityScanner/EndToEndTest.php: -------------------------------------------------------------------------------- 1 | getExtension() === 'php'; 26 | } 27 | ); 28 | $tests = []; 29 | foreach ($it as $file) { 30 | $tests[] = array_merge([basename($file)], require($file)); 31 | } 32 | return $tests; 33 | } 34 | 35 | private $analyzer; 36 | private $parser; 37 | private $traverser; 38 | 39 | public function setUp() { 40 | $this->analyzer = new Command\Scan; 41 | $this->parser = new CFGParser((new ParserFactory)->create(ParserFactory::PREFER_PHP7)); 42 | $this->traverser = new Traverser; 43 | $this->traverser->addVisitor(new Visitor\Simplifier); 44 | } 45 | 46 | /** 47 | * @dataProvider provideTest 48 | */ 49 | public function testAll($file, $code, $expected) { 50 | $blocks = [$this->traverser->traverse($this->parser->parse($code, "file.php"))]; 51 | ob_start(); 52 | $components = $this->analyzer->analyzeGraphs($blocks); 53 | $rules = []; 54 | $rules[] = new Rule\MySQLQuery; 55 | $errors = []; 56 | foreach ($rules as $rule) { 57 | $errors = array_merge($errors, $rule->execute($components)); 58 | } 59 | $results = []; 60 | foreach ($errors as $tmp) { 61 | $results[] = [ 62 | "line" => $tmp[1]->getLine(), 63 | "message" => $tmp[0], 64 | ]; 65 | } 66 | $output = ob_get_clean(); 67 | $sort = function($a, $b) { 68 | if ($a['line'] !== $b['line']) { 69 | return $a['line'] - $b['line']; 70 | } 71 | return strcmp($a['message'], $b['message']); 72 | }; 73 | usort($expected, $sort); 74 | usort($results, $sort); 75 | $this->assertEquals($expected, $results); 76 | } 77 | 78 | } -------------------------------------------------------------------------------- /lib/PHPSecurityScanner/Rule/MySQLQuery.php: -------------------------------------------------------------------------------- 1 | callFinder->getCallsForFunction($func) as $call) { 33 | 34 | if (!$this->processQueryArg($call[0]->args[$argNum])) { 35 | $errors[] = ["Possible SQL Injection found in call to {$func}() argument number {$printableArgNum}", $call[0]]; 36 | } 37 | if ($call[1]) { 38 | foreach ($call[1]->getParams() as $i => $param) { 39 | if ($param->getAttribute("unsafe", false) && !isset($checked[$call[1]->name->value])) { 40 | $toCheck[] = [$call[1]->name->value, $i]; 41 | } 42 | } 43 | } 44 | } 45 | } 46 | return $errors; 47 | } 48 | 49 | private function processQueryArg(Operand $arg) { 50 | if ($arg instanceof Operand\Literal) { 51 | // Literal queries are always OK 52 | return true; 53 | } 54 | // Otherwise, we need to look up where the arg came from 55 | $i = 0; 56 | foreach ($arg->ops as $prev) { 57 | $i++; 58 | if (!$this->processQueryArgOp($prev)) { 59 | return false; 60 | } 61 | } 62 | if ($i > 0) { 63 | return true; 64 | } 65 | // We don't know the source 66 | return false; 67 | } 68 | 69 | private function processQueryArgOp(Op $op) { 70 | static $seen; 71 | if ($seen === null) { 72 | $seen = new \SplObjectStorage; 73 | } 74 | if ($seen->contains($op)) { 75 | return $seen[$op]; 76 | } 77 | $seen[$op] = false; 78 | switch ($op->getType()) { 79 | case 'Expr_ArrayDimFetch': 80 | return $seen[$op] = $this->processQueryArg($op->var); 81 | case 'Expr_Assign': 82 | return $seen[$op] = $this->processQueryArg($op->expr); 83 | case 'Expr_ConcatList': 84 | foreach ($op->list as $el) { 85 | if (!$this->processQueryArg($el)) { 86 | return $seen[$op] = false; 87 | } 88 | } 89 | return $seen[$op] = true; 90 | case 'Expr_BinaryOp_Concat': 91 | if (!$this->processQueryArg($op->left)) { 92 | return $seen[$op] = false; 93 | } 94 | if (!$this->processQueryArg($op->right)) { 95 | return $seen[$op] = false; 96 | } 97 | return $seen[$op] = true; 98 | case 'Expr_FuncCall': 99 | if ($op->name instanceof Operand\Literal && $op->name->value === "mysql_real_escape_string") { 100 | return $seen[$op] = true; 101 | } 102 | return $seen[$op] = false; 103 | case 'Expr_Param': 104 | $unsafe = true; 105 | $op->setAttribute("unsafe", $unsafe); 106 | return $seen[$op] = true; 107 | case 'Phi': 108 | // assume it's safe 109 | $seen[$op] = true; 110 | foreach ($op->vars as $var) { 111 | if (!$this->processQueryArg($var)) { 112 | return $seen[$op] = false; 113 | } 114 | } 115 | return $seen[$op] = true; 116 | default: 117 | throw new \RuntimeException("Unknown OP Type: " . $op->getType()); 118 | } 119 | 120 | } 121 | 122 | } -------------------------------------------------------------------------------- /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": "b6398288d4d7d61afec2254d45e1fad1", 8 | "packages": [ 9 | { 10 | "name": "cilex/cilex", 11 | "version": "1.1.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/Cilex/Cilex.git", 15 | "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/Cilex/Cilex/zipball/7acd965a609a56d0345e8b6071c261fbdb926cb5", 20 | "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "cilex/console-service-provider": "1.*", 25 | "php": ">=5.3.3", 26 | "pimple/pimple": "~1.0", 27 | "symfony/finder": "~2.1", 28 | "symfony/process": "~2.1" 29 | }, 30 | "require-dev": { 31 | "phpunit/phpunit": "3.7.*", 32 | "symfony/validator": "~2.1" 33 | }, 34 | "suggest": { 35 | "monolog/monolog": ">=1.0.0", 36 | "symfony/validator": ">=1.0.0", 37 | "symfony/yaml": ">=1.0.0" 38 | }, 39 | "type": "library", 40 | "extra": { 41 | "branch-alias": { 42 | "dev-master": "1.0-dev" 43 | } 44 | }, 45 | "autoload": { 46 | "psr-0": { 47 | "Cilex": "src/" 48 | } 49 | }, 50 | "notification-url": "https://packagist.org/downloads/", 51 | "license": [ 52 | "MIT" 53 | ], 54 | "authors": [ 55 | { 56 | "name": "Mike van Riel", 57 | "email": "mike.vanriel@naenius.com" 58 | } 59 | ], 60 | "description": "The PHP micro-framework for Command line tools based on the Symfony2 Components", 61 | "homepage": "http://cilex.github.com", 62 | "keywords": [ 63 | "cli", 64 | "microframework" 65 | ], 66 | "time": "2014-03-29 14:03:13" 67 | }, 68 | { 69 | "name": "cilex/console-service-provider", 70 | "version": "1.0.0", 71 | "source": { 72 | "type": "git", 73 | "url": "https://github.com/Cilex/console-service-provider.git", 74 | "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e" 75 | }, 76 | "dist": { 77 | "type": "zip", 78 | "url": "https://api.github.com/repos/Cilex/console-service-provider/zipball/25ee3d1875243d38e1a3448ff94bdf944f70d24e", 79 | "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e", 80 | "shasum": "" 81 | }, 82 | "require": { 83 | "php": ">=5.3.3", 84 | "pimple/pimple": "1.*@dev", 85 | "symfony/console": "~2.1" 86 | }, 87 | "require-dev": { 88 | "cilex/cilex": "1.*@dev", 89 | "silex/silex": "1.*@dev" 90 | }, 91 | "type": "library", 92 | "extra": { 93 | "branch-alias": { 94 | "dev-master": "1.0-dev" 95 | } 96 | }, 97 | "autoload": { 98 | "psr-0": { 99 | "Cilex\\Provider\\Console": "src" 100 | } 101 | }, 102 | "notification-url": "https://packagist.org/downloads/", 103 | "license": [ 104 | "MIT" 105 | ], 106 | "authors": [ 107 | { 108 | "name": "Beau Simensen", 109 | "email": "beau@dflydev.com", 110 | "homepage": "http://beausimensen.com" 111 | }, 112 | { 113 | "name": "Mike van Riel", 114 | "email": "mike.vanriel@naenius.com" 115 | } 116 | ], 117 | "description": "Console Service Provider", 118 | "keywords": [ 119 | "cilex", 120 | "console", 121 | "pimple", 122 | "service-provider", 123 | "silex" 124 | ], 125 | "time": "2012-12-19 10:50:58" 126 | }, 127 | { 128 | "name": "ircmaxell/php-cfg", 129 | "version": "dev-master", 130 | "source": { 131 | "type": "git", 132 | "url": "https://github.com/ircmaxell/php-cfg.git", 133 | "reference": "8fc8dbbfb98a509aecbc0ca3877901e785f1c1e2" 134 | }, 135 | "dist": { 136 | "type": "zip", 137 | "url": "https://api.github.com/repos/ircmaxell/php-cfg/zipball/8fc8dbbfb98a509aecbc0ca3877901e785f1c1e2", 138 | "reference": "8fc8dbbfb98a509aecbc0ca3877901e785f1c1e2", 139 | "shasum": "" 140 | }, 141 | "require": { 142 | "nikic/php-parser": "dev-master", 143 | "php": ">=5.5", 144 | "phpdocumentor/graphviz": "dev-master" 145 | }, 146 | "require-dev": { 147 | "fabpot/php-cs-fixer": "1.*", 148 | "phpunit/phpunit": "^4.7" 149 | }, 150 | "type": "library", 151 | "autoload": { 152 | "psr-4": { 153 | "PHPCfg\\": "lib/PHPCfg/" 154 | } 155 | }, 156 | "notification-url": "https://packagist.org/downloads/", 157 | "license": [ 158 | "BSD" 159 | ], 160 | "authors": [ 161 | { 162 | "name": "Anthony Ferrara", 163 | "email": "ircmaxell@gmail.com" 164 | } 165 | ], 166 | "description": "A Control Flow Graph implementation for PHP", 167 | "time": "2015-07-29 16:58:44" 168 | }, 169 | { 170 | "name": "ircmaxell/php-types", 171 | "version": "dev-master", 172 | "source": { 173 | "type": "git", 174 | "url": "https://github.com/ircmaxell/php-types.git", 175 | "reference": "e73cb3039d6a57cb17f0b91a9b9210ef12a50cfe" 176 | }, 177 | "dist": { 178 | "type": "zip", 179 | "url": "https://api.github.com/repos/ircmaxell/php-types/zipball/e73cb3039d6a57cb17f0b91a9b9210ef12a50cfe", 180 | "reference": "e73cb3039d6a57cb17f0b91a9b9210ef12a50cfe", 181 | "shasum": "" 182 | }, 183 | "require": { 184 | "ircmaxell/php-cfg": "dev-master", 185 | "php": ">=5.5" 186 | }, 187 | "require-dev": { 188 | "fabpot/php-cs-fixer": "1.*", 189 | "phpunit/phpunit": "^4.7" 190 | }, 191 | "type": "library", 192 | "autoload": { 193 | "psr-4": { 194 | "PHPTypes\\": "lib/PHPTypes/" 195 | } 196 | }, 197 | "notification-url": "https://packagist.org/downloads/", 198 | "license": [ 199 | "MIT" 200 | ], 201 | "authors": [ 202 | { 203 | "name": "Anthony Ferrara", 204 | "email": "ircmaxell@gmail.com" 205 | } 206 | ], 207 | "description": "A PHP CFG Type Inference / Reconstruction Engine", 208 | "time": "2015-07-28 17:11:16" 209 | }, 210 | { 211 | "name": "ircmaxell/tuli", 212 | "version": "dev-master", 213 | "source": { 214 | "type": "git", 215 | "url": "https://github.com/ircmaxell/Tuli.git", 216 | "reference": "f647b5a14fd4877463c8b0ab2e244bc07994061e" 217 | }, 218 | "dist": { 219 | "type": "zip", 220 | "url": "https://api.github.com/repos/ircmaxell/Tuli/zipball/f647b5a14fd4877463c8b0ab2e244bc07994061e", 221 | "reference": "f647b5a14fd4877463c8b0ab2e244bc07994061e", 222 | "shasum": "" 223 | }, 224 | "require": { 225 | "cilex/cilex": "1.*", 226 | "ircmaxell/php-cfg": "dev-master", 227 | "ircmaxell/php-types": "dev-master", 228 | "php": ">=5.5" 229 | }, 230 | "require-dev": { 231 | "fabpot/php-cs-fixer": "1.*", 232 | "phpunit/phpunit": "^4.7" 233 | }, 234 | "bin": [ 235 | "bin/tuli" 236 | ], 237 | "type": "library", 238 | "autoload": { 239 | "psr-4": { 240 | "Tuli\\": "lib/Tuli/" 241 | } 242 | }, 243 | "notification-url": "https://packagist.org/downloads/", 244 | "license": [ 245 | "BSD" 246 | ], 247 | "authors": [ 248 | { 249 | "name": "Anthony Ferrara", 250 | "email": "ircmaxell@gmail.com" 251 | } 252 | ], 253 | "description": "A Static Analyzer for PHP", 254 | "time": "2015-07-29 16:56:40" 255 | }, 256 | { 257 | "name": "nikic/php-parser", 258 | "version": "dev-master", 259 | "source": { 260 | "type": "git", 261 | "url": "https://github.com/nikic/PHP-Parser.git", 262 | "reference": "e0a75ededaecccee2f083f951f4611ef95f6a562" 263 | }, 264 | "dist": { 265 | "type": "zip", 266 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e0a75ededaecccee2f083f951f4611ef95f6a562", 267 | "reference": "e0a75ededaecccee2f083f951f4611ef95f6a562", 268 | "shasum": "" 269 | }, 270 | "require": { 271 | "ext-tokenizer": "*", 272 | "php": ">=5.4" 273 | }, 274 | "type": "library", 275 | "extra": { 276 | "branch-alias": { 277 | "dev-master": "2.0-dev" 278 | } 279 | }, 280 | "autoload": { 281 | "files": [ 282 | "lib/bootstrap.php" 283 | ] 284 | }, 285 | "notification-url": "https://packagist.org/downloads/", 286 | "license": [ 287 | "BSD-3-Clause" 288 | ], 289 | "authors": [ 290 | { 291 | "name": "Nikita Popov" 292 | } 293 | ], 294 | "description": "A PHP parser written in PHP", 295 | "keywords": [ 296 | "parser", 297 | "php" 298 | ], 299 | "time": "2015-07-14 19:13:42" 300 | }, 301 | { 302 | "name": "phpdocumentor/graphviz", 303 | "version": "dev-master", 304 | "source": { 305 | "type": "git", 306 | "url": "https://github.com/phpDocumentor/GraphViz.git", 307 | "reference": "c87d3646aa92357b311c9670a4f61c332eee02c2" 308 | }, 309 | "dist": { 310 | "type": "zip", 311 | "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/c87d3646aa92357b311c9670a4f61c332eee02c2", 312 | "reference": "c87d3646aa92357b311c9670a4f61c332eee02c2", 313 | "shasum": "" 314 | }, 315 | "require": { 316 | "php": ">=5.3.3" 317 | }, 318 | "require-dev": { 319 | "phpunit/phpunit": "~4.0" 320 | }, 321 | "type": "library", 322 | "autoload": { 323 | "psr-0": { 324 | "phpDocumentor": [ 325 | "src/", 326 | "tests/unit" 327 | ] 328 | } 329 | }, 330 | "notification-url": "https://packagist.org/downloads/", 331 | "license": [ 332 | "MIT" 333 | ], 334 | "authors": [ 335 | { 336 | "name": "Mike van Riel", 337 | "email": "mike.vanriel@naenius.com" 338 | } 339 | ], 340 | "time": "2015-07-16 20:42:47" 341 | }, 342 | { 343 | "name": "pimple/pimple", 344 | "version": "1.1.x-dev", 345 | "source": { 346 | "type": "git", 347 | "url": "https://github.com/silexphp/Pimple.git", 348 | "reference": "bc2fc12cdf1f29bcad9e650d493a54a8fd1f3d85" 349 | }, 350 | "dist": { 351 | "type": "zip", 352 | "url": "https://api.github.com/repos/silexphp/Pimple/zipball/bc2fc12cdf1f29bcad9e650d493a54a8fd1f3d85", 353 | "reference": "bc2fc12cdf1f29bcad9e650d493a54a8fd1f3d85", 354 | "shasum": "" 355 | }, 356 | "require": { 357 | "php": ">=5.3.0" 358 | }, 359 | "type": "library", 360 | "extra": { 361 | "branch-alias": { 362 | "dev-master": "1.1.x-dev" 363 | } 364 | }, 365 | "autoload": { 366 | "psr-0": { 367 | "Pimple": "lib/" 368 | } 369 | }, 370 | "notification-url": "https://packagist.org/downloads/", 371 | "license": [ 372 | "MIT" 373 | ], 374 | "authors": [ 375 | { 376 | "name": "Fabien Potencier", 377 | "email": "fabien@symfony.com" 378 | } 379 | ], 380 | "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", 381 | "homepage": "http://pimple.sensiolabs.org", 382 | "keywords": [ 383 | "container", 384 | "dependency injection" 385 | ], 386 | "time": "2014-04-20 07:24:09" 387 | }, 388 | { 389 | "name": "symfony/console", 390 | "version": "2.8.x-dev", 391 | "source": { 392 | "type": "git", 393 | "url": "https://github.com/symfony/Console.git", 394 | "reference": "eef94b47e4e21ab887ef03192d2fb65cc9929c76" 395 | }, 396 | "dist": { 397 | "type": "zip", 398 | "url": "https://api.github.com/repos/symfony/Console/zipball/eef94b47e4e21ab887ef03192d2fb65cc9929c76", 399 | "reference": "eef94b47e4e21ab887ef03192d2fb65cc9929c76", 400 | "shasum": "" 401 | }, 402 | "require": { 403 | "php": ">=5.3.9" 404 | }, 405 | "require-dev": { 406 | "psr/log": "~1.0", 407 | "symfony/event-dispatcher": "~2.1|~3.0.0", 408 | "symfony/phpunit-bridge": "~2.7|~3.0.0", 409 | "symfony/process": "~2.1|~3.0.0" 410 | }, 411 | "suggest": { 412 | "psr/log": "For using the console logger", 413 | "symfony/event-dispatcher": "", 414 | "symfony/process": "" 415 | }, 416 | "type": "library", 417 | "extra": { 418 | "branch-alias": { 419 | "dev-master": "2.8-dev" 420 | } 421 | }, 422 | "autoload": { 423 | "psr-4": { 424 | "Symfony\\Component\\Console\\": "" 425 | } 426 | }, 427 | "notification-url": "https://packagist.org/downloads/", 428 | "license": [ 429 | "MIT" 430 | ], 431 | "authors": [ 432 | { 433 | "name": "Fabien Potencier", 434 | "email": "fabien@symfony.com" 435 | }, 436 | { 437 | "name": "Symfony Community", 438 | "homepage": "https://symfony.com/contributors" 439 | } 440 | ], 441 | "description": "Symfony Console Component", 442 | "homepage": "https://symfony.com", 443 | "time": "2015-07-29 07:12:56" 444 | }, 445 | { 446 | "name": "symfony/finder", 447 | "version": "2.8.x-dev", 448 | "source": { 449 | "type": "git", 450 | "url": "https://github.com/symfony/Finder.git", 451 | "reference": "8712d5e8c4ad65e6b936ed9b6a581e5e6a87fddf" 452 | }, 453 | "dist": { 454 | "type": "zip", 455 | "url": "https://api.github.com/repos/symfony/Finder/zipball/8712d5e8c4ad65e6b936ed9b6a581e5e6a87fddf", 456 | "reference": "8712d5e8c4ad65e6b936ed9b6a581e5e6a87fddf", 457 | "shasum": "" 458 | }, 459 | "require": { 460 | "php": ">=5.3.9" 461 | }, 462 | "require-dev": { 463 | "symfony/phpunit-bridge": "~2.7|~3.0.0" 464 | }, 465 | "type": "library", 466 | "extra": { 467 | "branch-alias": { 468 | "dev-master": "2.8-dev" 469 | } 470 | }, 471 | "autoload": { 472 | "psr-4": { 473 | "Symfony\\Component\\Finder\\": "" 474 | } 475 | }, 476 | "notification-url": "https://packagist.org/downloads/", 477 | "license": [ 478 | "MIT" 479 | ], 480 | "authors": [ 481 | { 482 | "name": "Fabien Potencier", 483 | "email": "fabien@symfony.com" 484 | }, 485 | { 486 | "name": "Symfony Community", 487 | "homepage": "https://symfony.com/contributors" 488 | } 489 | ], 490 | "description": "Symfony Finder Component", 491 | "homepage": "https://symfony.com", 492 | "time": "2015-07-09 16:11:14" 493 | }, 494 | { 495 | "name": "symfony/process", 496 | "version": "2.8.x-dev", 497 | "source": { 498 | "type": "git", 499 | "url": "https://github.com/symfony/Process.git", 500 | "reference": "25d74c90d79e66905013714d8d188e4ccb5ff466" 501 | }, 502 | "dist": { 503 | "type": "zip", 504 | "url": "https://api.github.com/repos/symfony/Process/zipball/25d74c90d79e66905013714d8d188e4ccb5ff466", 505 | "reference": "25d74c90d79e66905013714d8d188e4ccb5ff466", 506 | "shasum": "" 507 | }, 508 | "require": { 509 | "php": ">=5.3.9" 510 | }, 511 | "require-dev": { 512 | "symfony/phpunit-bridge": "~2.7|~3.0.0" 513 | }, 514 | "type": "library", 515 | "extra": { 516 | "branch-alias": { 517 | "dev-master": "2.8-dev" 518 | } 519 | }, 520 | "autoload": { 521 | "psr-4": { 522 | "Symfony\\Component\\Process\\": "" 523 | } 524 | }, 525 | "notification-url": "https://packagist.org/downloads/", 526 | "license": [ 527 | "MIT" 528 | ], 529 | "authors": [ 530 | { 531 | "name": "Fabien Potencier", 532 | "email": "fabien@symfony.com" 533 | }, 534 | { 535 | "name": "Symfony Community", 536 | "homepage": "https://symfony.com/contributors" 537 | } 538 | ], 539 | "description": "Symfony Process Component", 540 | "homepage": "https://symfony.com", 541 | "time": "2015-07-01 14:16:54" 542 | } 543 | ], 544 | "packages-dev": [ 545 | { 546 | "name": "doctrine/instantiator", 547 | "version": "dev-master", 548 | "source": { 549 | "type": "git", 550 | "url": "https://github.com/doctrine/instantiator.git", 551 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 552 | }, 553 | "dist": { 554 | "type": "zip", 555 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 556 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 557 | "shasum": "" 558 | }, 559 | "require": { 560 | "php": ">=5.3,<8.0-DEV" 561 | }, 562 | "require-dev": { 563 | "athletic/athletic": "~0.1.8", 564 | "ext-pdo": "*", 565 | "ext-phar": "*", 566 | "phpunit/phpunit": "~4.0", 567 | "squizlabs/php_codesniffer": "~2.0" 568 | }, 569 | "type": "library", 570 | "extra": { 571 | "branch-alias": { 572 | "dev-master": "1.0.x-dev" 573 | } 574 | }, 575 | "autoload": { 576 | "psr-4": { 577 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 578 | } 579 | }, 580 | "notification-url": "https://packagist.org/downloads/", 581 | "license": [ 582 | "MIT" 583 | ], 584 | "authors": [ 585 | { 586 | "name": "Marco Pivetta", 587 | "email": "ocramius@gmail.com", 588 | "homepage": "http://ocramius.github.com/" 589 | } 590 | ], 591 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 592 | "homepage": "https://github.com/doctrine/instantiator", 593 | "keywords": [ 594 | "constructor", 595 | "instantiate" 596 | ], 597 | "time": "2015-06-14 21:17:01" 598 | }, 599 | { 600 | "name": "fabpot/php-cs-fixer", 601 | "version": "1.11.x-dev", 602 | "source": { 603 | "type": "git", 604 | "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", 605 | "reference": "a32e3111cb3f811cb661024edaa3700e1b23b05d" 606 | }, 607 | "dist": { 608 | "type": "zip", 609 | "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/a32e3111cb3f811cb661024edaa3700e1b23b05d", 610 | "reference": "a32e3111cb3f811cb661024edaa3700e1b23b05d", 611 | "shasum": "" 612 | }, 613 | "require": { 614 | "ext-tokenizer": "*", 615 | "php": ">=5.3.6", 616 | "sebastian/diff": "~1.1", 617 | "symfony/console": "~2.3", 618 | "symfony/event-dispatcher": "~2.1", 619 | "symfony/filesystem": "~2.1", 620 | "symfony/finder": "~2.1", 621 | "symfony/process": "~2.3", 622 | "symfony/stopwatch": "~2.5" 623 | }, 624 | "require-dev": { 625 | "satooshi/php-coveralls": "0.7.*@dev" 626 | }, 627 | "bin": [ 628 | "php-cs-fixer" 629 | ], 630 | "type": "application", 631 | "autoload": { 632 | "psr-4": { 633 | "Symfony\\CS\\": "Symfony/CS/" 634 | } 635 | }, 636 | "notification-url": "https://packagist.org/downloads/", 637 | "license": [ 638 | "MIT" 639 | ], 640 | "authors": [ 641 | { 642 | "name": "Dariusz Rumiński", 643 | "email": "dariusz.ruminski@gmail.com" 644 | }, 645 | { 646 | "name": "Fabien Potencier", 647 | "email": "fabien@symfony.com" 648 | } 649 | ], 650 | "description": "A tool to automatically fix PHP code style", 651 | "time": "2015-07-28 21:25:27" 652 | }, 653 | { 654 | "name": "phpdocumentor/reflection-docblock", 655 | "version": "2.0.4", 656 | "source": { 657 | "type": "git", 658 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 659 | "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" 660 | }, 661 | "dist": { 662 | "type": "zip", 663 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", 664 | "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", 665 | "shasum": "" 666 | }, 667 | "require": { 668 | "php": ">=5.3.3" 669 | }, 670 | "require-dev": { 671 | "phpunit/phpunit": "~4.0" 672 | }, 673 | "suggest": { 674 | "dflydev/markdown": "~1.0", 675 | "erusev/parsedown": "~1.0" 676 | }, 677 | "type": "library", 678 | "extra": { 679 | "branch-alias": { 680 | "dev-master": "2.0.x-dev" 681 | } 682 | }, 683 | "autoload": { 684 | "psr-0": { 685 | "phpDocumentor": [ 686 | "src/" 687 | ] 688 | } 689 | }, 690 | "notification-url": "https://packagist.org/downloads/", 691 | "license": [ 692 | "MIT" 693 | ], 694 | "authors": [ 695 | { 696 | "name": "Mike van Riel", 697 | "email": "mike.vanriel@naenius.com" 698 | } 699 | ], 700 | "time": "2015-02-03 12:10:50" 701 | }, 702 | { 703 | "name": "phpspec/prophecy", 704 | "version": "dev-master", 705 | "source": { 706 | "type": "git", 707 | "url": "https://github.com/phpspec/prophecy.git", 708 | "reference": "5700f75b23b0dd3495c0f495fe33a5e6717ee160" 709 | }, 710 | "dist": { 711 | "type": "zip", 712 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/5700f75b23b0dd3495c0f495fe33a5e6717ee160", 713 | "reference": "5700f75b23b0dd3495c0f495fe33a5e6717ee160", 714 | "shasum": "" 715 | }, 716 | "require": { 717 | "doctrine/instantiator": "^1.0.2", 718 | "phpdocumentor/reflection-docblock": "~2.0", 719 | "sebastian/comparator": "~1.1" 720 | }, 721 | "require-dev": { 722 | "phpspec/phpspec": "~2.0" 723 | }, 724 | "type": "library", 725 | "extra": { 726 | "branch-alias": { 727 | "dev-master": "1.4.x-dev" 728 | } 729 | }, 730 | "autoload": { 731 | "psr-0": { 732 | "Prophecy\\": "src/" 733 | } 734 | }, 735 | "notification-url": "https://packagist.org/downloads/", 736 | "license": [ 737 | "MIT" 738 | ], 739 | "authors": [ 740 | { 741 | "name": "Konstantin Kudryashov", 742 | "email": "ever.zet@gmail.com", 743 | "homepage": "http://everzet.com" 744 | }, 745 | { 746 | "name": "Marcello Duarte", 747 | "email": "marcello.duarte@gmail.com" 748 | } 749 | ], 750 | "description": "Highly opinionated mocking framework for PHP 5.3+", 751 | "homepage": "https://github.com/phpspec/prophecy", 752 | "keywords": [ 753 | "Double", 754 | "Dummy", 755 | "fake", 756 | "mock", 757 | "spy", 758 | "stub" 759 | ], 760 | "time": "2015-06-30 10:26:46" 761 | }, 762 | { 763 | "name": "phpunit/php-code-coverage", 764 | "version": "dev-master", 765 | "source": { 766 | "type": "git", 767 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 768 | "reference": "df29d420311aa94ed1eb26560b573710f3603b2d" 769 | }, 770 | "dist": { 771 | "type": "zip", 772 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/df29d420311aa94ed1eb26560b573710f3603b2d", 773 | "reference": "df29d420311aa94ed1eb26560b573710f3603b2d", 774 | "shasum": "" 775 | }, 776 | "require": { 777 | "php": ">=5.3.3", 778 | "phpunit/php-file-iterator": "~1.3", 779 | "phpunit/php-text-template": "~1.2", 780 | "phpunit/php-token-stream": "~1.3", 781 | "sebastian/environment": "~1.3", 782 | "sebastian/version": "~1.0" 783 | }, 784 | "require-dev": { 785 | "ext-xdebug": ">=2.1.4", 786 | "phpunit/phpunit": "~4" 787 | }, 788 | "suggest": { 789 | "ext-dom": "*", 790 | "ext-xdebug": ">=2.2.1", 791 | "ext-xmlwriter": "*" 792 | }, 793 | "type": "library", 794 | "extra": { 795 | "branch-alias": { 796 | "dev-master": "2.2.x-dev" 797 | } 798 | }, 799 | "autoload": { 800 | "classmap": [ 801 | "src/" 802 | ] 803 | }, 804 | "notification-url": "https://packagist.org/downloads/", 805 | "license": [ 806 | "BSD-3-Clause" 807 | ], 808 | "authors": [ 809 | { 810 | "name": "Sebastian Bergmann", 811 | "email": "sb@sebastian-bergmann.de", 812 | "role": "lead" 813 | } 814 | ], 815 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 816 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 817 | "keywords": [ 818 | "coverage", 819 | "testing", 820 | "xunit" 821 | ], 822 | "time": "2015-07-27 14:08:10" 823 | }, 824 | { 825 | "name": "phpunit/php-file-iterator", 826 | "version": "dev-master", 827 | "source": { 828 | "type": "git", 829 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 830 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" 831 | }, 832 | "dist": { 833 | "type": "zip", 834 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 835 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 836 | "shasum": "" 837 | }, 838 | "require": { 839 | "php": ">=5.3.3" 840 | }, 841 | "type": "library", 842 | "extra": { 843 | "branch-alias": { 844 | "dev-master": "1.4.x-dev" 845 | } 846 | }, 847 | "autoload": { 848 | "classmap": [ 849 | "src/" 850 | ] 851 | }, 852 | "notification-url": "https://packagist.org/downloads/", 853 | "license": [ 854 | "BSD-3-Clause" 855 | ], 856 | "authors": [ 857 | { 858 | "name": "Sebastian Bergmann", 859 | "email": "sb@sebastian-bergmann.de", 860 | "role": "lead" 861 | } 862 | ], 863 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 864 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 865 | "keywords": [ 866 | "filesystem", 867 | "iterator" 868 | ], 869 | "time": "2015-06-21 13:08:43" 870 | }, 871 | { 872 | "name": "phpunit/php-text-template", 873 | "version": "1.2.1", 874 | "source": { 875 | "type": "git", 876 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 877 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 878 | }, 879 | "dist": { 880 | "type": "zip", 881 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 882 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 883 | "shasum": "" 884 | }, 885 | "require": { 886 | "php": ">=5.3.3" 887 | }, 888 | "type": "library", 889 | "autoload": { 890 | "classmap": [ 891 | "src/" 892 | ] 893 | }, 894 | "notification-url": "https://packagist.org/downloads/", 895 | "license": [ 896 | "BSD-3-Clause" 897 | ], 898 | "authors": [ 899 | { 900 | "name": "Sebastian Bergmann", 901 | "email": "sebastian@phpunit.de", 902 | "role": "lead" 903 | } 904 | ], 905 | "description": "Simple template engine.", 906 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 907 | "keywords": [ 908 | "template" 909 | ], 910 | "time": "2015-06-21 13:50:34" 911 | }, 912 | { 913 | "name": "phpunit/php-timer", 914 | "version": "dev-master", 915 | "source": { 916 | "type": "git", 917 | "url": "https://github.com/sebastianbergmann/php-timer.git", 918 | "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" 919 | }, 920 | "dist": { 921 | "type": "zip", 922 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", 923 | "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", 924 | "shasum": "" 925 | }, 926 | "require": { 927 | "php": ">=5.3.3" 928 | }, 929 | "type": "library", 930 | "autoload": { 931 | "classmap": [ 932 | "src/" 933 | ] 934 | }, 935 | "notification-url": "https://packagist.org/downloads/", 936 | "license": [ 937 | "BSD-3-Clause" 938 | ], 939 | "authors": [ 940 | { 941 | "name": "Sebastian Bergmann", 942 | "email": "sb@sebastian-bergmann.de", 943 | "role": "lead" 944 | } 945 | ], 946 | "description": "Utility class for timing", 947 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 948 | "keywords": [ 949 | "timer" 950 | ], 951 | "time": "2015-06-21 08:01:12" 952 | }, 953 | { 954 | "name": "phpunit/php-token-stream", 955 | "version": "dev-master", 956 | "source": { 957 | "type": "git", 958 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 959 | "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9" 960 | }, 961 | "dist": { 962 | "type": "zip", 963 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9", 964 | "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9", 965 | "shasum": "" 966 | }, 967 | "require": { 968 | "ext-tokenizer": "*", 969 | "php": ">=5.3.3" 970 | }, 971 | "require-dev": { 972 | "phpunit/phpunit": "~4.2" 973 | }, 974 | "type": "library", 975 | "extra": { 976 | "branch-alias": { 977 | "dev-master": "1.4-dev" 978 | } 979 | }, 980 | "autoload": { 981 | "classmap": [ 982 | "src/" 983 | ] 984 | }, 985 | "notification-url": "https://packagist.org/downloads/", 986 | "license": [ 987 | "BSD-3-Clause" 988 | ], 989 | "authors": [ 990 | { 991 | "name": "Sebastian Bergmann", 992 | "email": "sebastian@phpunit.de" 993 | } 994 | ], 995 | "description": "Wrapper around PHP's tokenizer extension.", 996 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 997 | "keywords": [ 998 | "tokenizer" 999 | ], 1000 | "time": "2015-06-19 03:43:16" 1001 | }, 1002 | { 1003 | "name": "phpunit/phpunit", 1004 | "version": "4.8.x-dev", 1005 | "source": { 1006 | "type": "git", 1007 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1008 | "reference": "4b4f866d456648e625dc37e224c618659f13d121" 1009 | }, 1010 | "dist": { 1011 | "type": "zip", 1012 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b4f866d456648e625dc37e224c618659f13d121", 1013 | "reference": "4b4f866d456648e625dc37e224c618659f13d121", 1014 | "shasum": "" 1015 | }, 1016 | "require": { 1017 | "ext-dom": "*", 1018 | "ext-json": "*", 1019 | "ext-pcre": "*", 1020 | "ext-reflection": "*", 1021 | "ext-spl": "*", 1022 | "php": ">=5.3.3", 1023 | "phpspec/prophecy": "~1.3,>=1.3.1", 1024 | "phpunit/php-code-coverage": "~2.1", 1025 | "phpunit/php-file-iterator": "~1.4", 1026 | "phpunit/php-text-template": "~1.2", 1027 | "phpunit/php-timer": ">=1.0.6", 1028 | "phpunit/phpunit-mock-objects": "~2.3", 1029 | "sebastian/comparator": "~1.1", 1030 | "sebastian/diff": "~1.2", 1031 | "sebastian/environment": "~1.3", 1032 | "sebastian/exporter": "~1.2", 1033 | "sebastian/global-state": "~1.0", 1034 | "sebastian/version": "~1.0", 1035 | "symfony/yaml": "~2.1|~3.0" 1036 | }, 1037 | "suggest": { 1038 | "phpunit/php-invoker": "~1.1" 1039 | }, 1040 | "bin": [ 1041 | "phpunit" 1042 | ], 1043 | "type": "library", 1044 | "extra": { 1045 | "branch-alias": { 1046 | "dev-master": "4.8.x-dev" 1047 | } 1048 | }, 1049 | "autoload": { 1050 | "classmap": [ 1051 | "src/" 1052 | ] 1053 | }, 1054 | "notification-url": "https://packagist.org/downloads/", 1055 | "license": [ 1056 | "BSD-3-Clause" 1057 | ], 1058 | "authors": [ 1059 | { 1060 | "name": "Sebastian Bergmann", 1061 | "email": "sebastian@phpunit.de", 1062 | "role": "lead" 1063 | } 1064 | ], 1065 | "description": "The PHP Unit Testing framework.", 1066 | "homepage": "https://phpunit.de/", 1067 | "keywords": [ 1068 | "phpunit", 1069 | "testing", 1070 | "xunit" 1071 | ], 1072 | "time": "2015-07-29 11:20:37" 1073 | }, 1074 | { 1075 | "name": "phpunit/phpunit-mock-objects", 1076 | "version": "2.3.x-dev", 1077 | "source": { 1078 | "type": "git", 1079 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 1080 | "reference": "18dfbcb81d05e2296c0bcddd4db96cade75e6f42" 1081 | }, 1082 | "dist": { 1083 | "type": "zip", 1084 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/18dfbcb81d05e2296c0bcddd4db96cade75e6f42", 1085 | "reference": "18dfbcb81d05e2296c0bcddd4db96cade75e6f42", 1086 | "shasum": "" 1087 | }, 1088 | "require": { 1089 | "doctrine/instantiator": "~1.0,>=1.0.2", 1090 | "php": ">=5.3.3", 1091 | "phpunit/php-text-template": "~1.2", 1092 | "sebastian/exporter": "~1.2" 1093 | }, 1094 | "require-dev": { 1095 | "phpunit/phpunit": "~4.4" 1096 | }, 1097 | "suggest": { 1098 | "ext-soap": "*" 1099 | }, 1100 | "type": "library", 1101 | "extra": { 1102 | "branch-alias": { 1103 | "dev-master": "2.3.x-dev" 1104 | } 1105 | }, 1106 | "autoload": { 1107 | "classmap": [ 1108 | "src/" 1109 | ] 1110 | }, 1111 | "notification-url": "https://packagist.org/downloads/", 1112 | "license": [ 1113 | "BSD-3-Clause" 1114 | ], 1115 | "authors": [ 1116 | { 1117 | "name": "Sebastian Bergmann", 1118 | "email": "sb@sebastian-bergmann.de", 1119 | "role": "lead" 1120 | } 1121 | ], 1122 | "description": "Mock Object library for PHPUnit", 1123 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 1124 | "keywords": [ 1125 | "mock", 1126 | "xunit" 1127 | ], 1128 | "time": "2015-07-10 06:54:24" 1129 | }, 1130 | { 1131 | "name": "sebastian/comparator", 1132 | "version": "dev-master", 1133 | "source": { 1134 | "type": "git", 1135 | "url": "https://github.com/sebastianbergmann/comparator.git", 1136 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" 1137 | }, 1138 | "dist": { 1139 | "type": "zip", 1140 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", 1141 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", 1142 | "shasum": "" 1143 | }, 1144 | "require": { 1145 | "php": ">=5.3.3", 1146 | "sebastian/diff": "~1.2", 1147 | "sebastian/exporter": "~1.2" 1148 | }, 1149 | "require-dev": { 1150 | "phpunit/phpunit": "~4.4" 1151 | }, 1152 | "type": "library", 1153 | "extra": { 1154 | "branch-alias": { 1155 | "dev-master": "1.2.x-dev" 1156 | } 1157 | }, 1158 | "autoload": { 1159 | "classmap": [ 1160 | "src/" 1161 | ] 1162 | }, 1163 | "notification-url": "https://packagist.org/downloads/", 1164 | "license": [ 1165 | "BSD-3-Clause" 1166 | ], 1167 | "authors": [ 1168 | { 1169 | "name": "Jeff Welch", 1170 | "email": "whatthejeff@gmail.com" 1171 | }, 1172 | { 1173 | "name": "Volker Dusch", 1174 | "email": "github@wallbash.com" 1175 | }, 1176 | { 1177 | "name": "Bernhard Schussek", 1178 | "email": "bschussek@2bepublished.at" 1179 | }, 1180 | { 1181 | "name": "Sebastian Bergmann", 1182 | "email": "sebastian@phpunit.de" 1183 | } 1184 | ], 1185 | "description": "Provides the functionality to compare PHP values for equality", 1186 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 1187 | "keywords": [ 1188 | "comparator", 1189 | "compare", 1190 | "equality" 1191 | ], 1192 | "time": "2015-07-26 15:48:44" 1193 | }, 1194 | { 1195 | "name": "sebastian/diff", 1196 | "version": "dev-master", 1197 | "source": { 1198 | "type": "git", 1199 | "url": "https://github.com/sebastianbergmann/diff.git", 1200 | "reference": "6899b3e33bfbd386d88b5eea5f65f563e8793051" 1201 | }, 1202 | "dist": { 1203 | "type": "zip", 1204 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6899b3e33bfbd386d88b5eea5f65f563e8793051", 1205 | "reference": "6899b3e33bfbd386d88b5eea5f65f563e8793051", 1206 | "shasum": "" 1207 | }, 1208 | "require": { 1209 | "php": ">=5.3.3" 1210 | }, 1211 | "require-dev": { 1212 | "phpunit/phpunit": "~4.2" 1213 | }, 1214 | "type": "library", 1215 | "extra": { 1216 | "branch-alias": { 1217 | "dev-master": "1.3-dev" 1218 | } 1219 | }, 1220 | "autoload": { 1221 | "classmap": [ 1222 | "src/" 1223 | ] 1224 | }, 1225 | "notification-url": "https://packagist.org/downloads/", 1226 | "license": [ 1227 | "BSD-3-Clause" 1228 | ], 1229 | "authors": [ 1230 | { 1231 | "name": "Kore Nordmann", 1232 | "email": "mail@kore-nordmann.de" 1233 | }, 1234 | { 1235 | "name": "Sebastian Bergmann", 1236 | "email": "sebastian@phpunit.de" 1237 | } 1238 | ], 1239 | "description": "Diff implementation", 1240 | "homepage": "http://www.github.com/sebastianbergmann/diff", 1241 | "keywords": [ 1242 | "diff" 1243 | ], 1244 | "time": "2015-06-22 14:15:55" 1245 | }, 1246 | { 1247 | "name": "sebastian/environment", 1248 | "version": "dev-master", 1249 | "source": { 1250 | "type": "git", 1251 | "url": "https://github.com/sebastianbergmann/environment.git", 1252 | "reference": "70c3ba9398826b0d0117c2e9f1922c3bc47644ce" 1253 | }, 1254 | "dist": { 1255 | "type": "zip", 1256 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/70c3ba9398826b0d0117c2e9f1922c3bc47644ce", 1257 | "reference": "70c3ba9398826b0d0117c2e9f1922c3bc47644ce", 1258 | "shasum": "" 1259 | }, 1260 | "require": { 1261 | "php": ">=5.3.3" 1262 | }, 1263 | "require-dev": { 1264 | "phpunit/phpunit": "~4.4" 1265 | }, 1266 | "type": "library", 1267 | "extra": { 1268 | "branch-alias": { 1269 | "dev-master": "1.3.x-dev" 1270 | } 1271 | }, 1272 | "autoload": { 1273 | "classmap": [ 1274 | "src/" 1275 | ] 1276 | }, 1277 | "notification-url": "https://packagist.org/downloads/", 1278 | "license": [ 1279 | "BSD-3-Clause" 1280 | ], 1281 | "authors": [ 1282 | { 1283 | "name": "Sebastian Bergmann", 1284 | "email": "sebastian@phpunit.de" 1285 | } 1286 | ], 1287 | "description": "Provides functionality to handle HHVM/PHP environments", 1288 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1289 | "keywords": [ 1290 | "Xdebug", 1291 | "environment", 1292 | "hhvm" 1293 | ], 1294 | "time": "2015-07-26 09:06:39" 1295 | }, 1296 | { 1297 | "name": "sebastian/exporter", 1298 | "version": "dev-master", 1299 | "source": { 1300 | "type": "git", 1301 | "url": "https://github.com/sebastianbergmann/exporter.git", 1302 | "reference": "7ae5513327cb536431847bcc0c10edba2701064e" 1303 | }, 1304 | "dist": { 1305 | "type": "zip", 1306 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", 1307 | "reference": "7ae5513327cb536431847bcc0c10edba2701064e", 1308 | "shasum": "" 1309 | }, 1310 | "require": { 1311 | "php": ">=5.3.3", 1312 | "sebastian/recursion-context": "~1.0" 1313 | }, 1314 | "require-dev": { 1315 | "phpunit/phpunit": "~4.4" 1316 | }, 1317 | "type": "library", 1318 | "extra": { 1319 | "branch-alias": { 1320 | "dev-master": "1.2.x-dev" 1321 | } 1322 | }, 1323 | "autoload": { 1324 | "classmap": [ 1325 | "src/" 1326 | ] 1327 | }, 1328 | "notification-url": "https://packagist.org/downloads/", 1329 | "license": [ 1330 | "BSD-3-Clause" 1331 | ], 1332 | "authors": [ 1333 | { 1334 | "name": "Jeff Welch", 1335 | "email": "whatthejeff@gmail.com" 1336 | }, 1337 | { 1338 | "name": "Volker Dusch", 1339 | "email": "github@wallbash.com" 1340 | }, 1341 | { 1342 | "name": "Bernhard Schussek", 1343 | "email": "bschussek@2bepublished.at" 1344 | }, 1345 | { 1346 | "name": "Sebastian Bergmann", 1347 | "email": "sebastian@phpunit.de" 1348 | }, 1349 | { 1350 | "name": "Adam Harvey", 1351 | "email": "aharvey@php.net" 1352 | } 1353 | ], 1354 | "description": "Provides the functionality to export PHP variables for visualization", 1355 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1356 | "keywords": [ 1357 | "export", 1358 | "exporter" 1359 | ], 1360 | "time": "2015-06-21 07:55:53" 1361 | }, 1362 | { 1363 | "name": "sebastian/global-state", 1364 | "version": "dev-master", 1365 | "source": { 1366 | "type": "git", 1367 | "url": "https://github.com/sebastianbergmann/global-state.git", 1368 | "reference": "23af31f402993cfd94e99cbc4b782e9a78eb0e97" 1369 | }, 1370 | "dist": { 1371 | "type": "zip", 1372 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23af31f402993cfd94e99cbc4b782e9a78eb0e97", 1373 | "reference": "23af31f402993cfd94e99cbc4b782e9a78eb0e97", 1374 | "shasum": "" 1375 | }, 1376 | "require": { 1377 | "php": ">=5.3.3" 1378 | }, 1379 | "require-dev": { 1380 | "phpunit/phpunit": "~4.2" 1381 | }, 1382 | "suggest": { 1383 | "ext-uopz": "*" 1384 | }, 1385 | "type": "library", 1386 | "extra": { 1387 | "branch-alias": { 1388 | "dev-master": "1.0-dev" 1389 | } 1390 | }, 1391 | "autoload": { 1392 | "classmap": [ 1393 | "src/" 1394 | ] 1395 | }, 1396 | "notification-url": "https://packagist.org/downloads/", 1397 | "license": [ 1398 | "BSD-3-Clause" 1399 | ], 1400 | "authors": [ 1401 | { 1402 | "name": "Sebastian Bergmann", 1403 | "email": "sebastian@phpunit.de" 1404 | } 1405 | ], 1406 | "description": "Snapshotting of global state", 1407 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1408 | "keywords": [ 1409 | "global state" 1410 | ], 1411 | "time": "2015-06-21 15:11:22" 1412 | }, 1413 | { 1414 | "name": "sebastian/recursion-context", 1415 | "version": "dev-master", 1416 | "source": { 1417 | "type": "git", 1418 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1419 | "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" 1420 | }, 1421 | "dist": { 1422 | "type": "zip", 1423 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", 1424 | "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", 1425 | "shasum": "" 1426 | }, 1427 | "require": { 1428 | "php": ">=5.3.3" 1429 | }, 1430 | "require-dev": { 1431 | "phpunit/phpunit": "~4.4" 1432 | }, 1433 | "type": "library", 1434 | "extra": { 1435 | "branch-alias": { 1436 | "dev-master": "1.0.x-dev" 1437 | } 1438 | }, 1439 | "autoload": { 1440 | "classmap": [ 1441 | "src/" 1442 | ] 1443 | }, 1444 | "notification-url": "https://packagist.org/downloads/", 1445 | "license": [ 1446 | "BSD-3-Clause" 1447 | ], 1448 | "authors": [ 1449 | { 1450 | "name": "Jeff Welch", 1451 | "email": "whatthejeff@gmail.com" 1452 | }, 1453 | { 1454 | "name": "Sebastian Bergmann", 1455 | "email": "sebastian@phpunit.de" 1456 | }, 1457 | { 1458 | "name": "Adam Harvey", 1459 | "email": "aharvey@php.net" 1460 | } 1461 | ], 1462 | "description": "Provides functionality to recursively process PHP variables", 1463 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1464 | "time": "2015-06-21 08:04:50" 1465 | }, 1466 | { 1467 | "name": "sebastian/version", 1468 | "version": "1.0.6", 1469 | "source": { 1470 | "type": "git", 1471 | "url": "https://github.com/sebastianbergmann/version.git", 1472 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" 1473 | }, 1474 | "dist": { 1475 | "type": "zip", 1476 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 1477 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 1478 | "shasum": "" 1479 | }, 1480 | "type": "library", 1481 | "autoload": { 1482 | "classmap": [ 1483 | "src/" 1484 | ] 1485 | }, 1486 | "notification-url": "https://packagist.org/downloads/", 1487 | "license": [ 1488 | "BSD-3-Clause" 1489 | ], 1490 | "authors": [ 1491 | { 1492 | "name": "Sebastian Bergmann", 1493 | "email": "sebastian@phpunit.de", 1494 | "role": "lead" 1495 | } 1496 | ], 1497 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1498 | "homepage": "https://github.com/sebastianbergmann/version", 1499 | "time": "2015-06-21 13:59:46" 1500 | }, 1501 | { 1502 | "name": "symfony/event-dispatcher", 1503 | "version": "2.8.x-dev", 1504 | "source": { 1505 | "type": "git", 1506 | "url": "https://github.com/symfony/EventDispatcher.git", 1507 | "reference": "d7246885b7fe4cb5a2786bda34362d2f0e40b730" 1508 | }, 1509 | "dist": { 1510 | "type": "zip", 1511 | "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/d7246885b7fe4cb5a2786bda34362d2f0e40b730", 1512 | "reference": "d7246885b7fe4cb5a2786bda34362d2f0e40b730", 1513 | "shasum": "" 1514 | }, 1515 | "require": { 1516 | "php": ">=5.3.9" 1517 | }, 1518 | "require-dev": { 1519 | "psr/log": "~1.0", 1520 | "symfony/config": "~2.0,>=2.0.5|~3.0.0", 1521 | "symfony/dependency-injection": "~2.6|~3.0.0", 1522 | "symfony/expression-language": "~2.6|~3.0.0", 1523 | "symfony/phpunit-bridge": "~2.7|~3.0.0", 1524 | "symfony/stopwatch": "~2.3|~3.0.0" 1525 | }, 1526 | "suggest": { 1527 | "symfony/dependency-injection": "", 1528 | "symfony/http-kernel": "" 1529 | }, 1530 | "type": "library", 1531 | "extra": { 1532 | "branch-alias": { 1533 | "dev-master": "2.8-dev" 1534 | } 1535 | }, 1536 | "autoload": { 1537 | "psr-4": { 1538 | "Symfony\\Component\\EventDispatcher\\": "" 1539 | } 1540 | }, 1541 | "notification-url": "https://packagist.org/downloads/", 1542 | "license": [ 1543 | "MIT" 1544 | ], 1545 | "authors": [ 1546 | { 1547 | "name": "Fabien Potencier", 1548 | "email": "fabien@symfony.com" 1549 | }, 1550 | { 1551 | "name": "Symfony Community", 1552 | "homepage": "https://symfony.com/contributors" 1553 | } 1554 | ], 1555 | "description": "Symfony EventDispatcher Component", 1556 | "homepage": "https://symfony.com", 1557 | "time": "2015-06-24 15:32:32" 1558 | }, 1559 | { 1560 | "name": "symfony/filesystem", 1561 | "version": "2.8.x-dev", 1562 | "source": { 1563 | "type": "git", 1564 | "url": "https://github.com/symfony/Filesystem.git", 1565 | "reference": "9f70c5625a32b2f1e6fc37222f52b4e0eb437b0e" 1566 | }, 1567 | "dist": { 1568 | "type": "zip", 1569 | "url": "https://api.github.com/repos/symfony/Filesystem/zipball/9f70c5625a32b2f1e6fc37222f52b4e0eb437b0e", 1570 | "reference": "9f70c5625a32b2f1e6fc37222f52b4e0eb437b0e", 1571 | "shasum": "" 1572 | }, 1573 | "require": { 1574 | "php": ">=5.3.9" 1575 | }, 1576 | "require-dev": { 1577 | "symfony/phpunit-bridge": "~2.7|~3.0.0" 1578 | }, 1579 | "type": "library", 1580 | "extra": { 1581 | "branch-alias": { 1582 | "dev-master": "2.8-dev" 1583 | } 1584 | }, 1585 | "autoload": { 1586 | "psr-4": { 1587 | "Symfony\\Component\\Filesystem\\": "" 1588 | } 1589 | }, 1590 | "notification-url": "https://packagist.org/downloads/", 1591 | "license": [ 1592 | "MIT" 1593 | ], 1594 | "authors": [ 1595 | { 1596 | "name": "Fabien Potencier", 1597 | "email": "fabien@symfony.com" 1598 | }, 1599 | { 1600 | "name": "Symfony Community", 1601 | "homepage": "https://symfony.com/contributors" 1602 | } 1603 | ], 1604 | "description": "Symfony Filesystem Component", 1605 | "homepage": "https://symfony.com", 1606 | "time": "2015-07-09 16:11:14" 1607 | }, 1608 | { 1609 | "name": "symfony/stopwatch", 1610 | "version": "2.8.x-dev", 1611 | "source": { 1612 | "type": "git", 1613 | "url": "https://github.com/symfony/Stopwatch.git", 1614 | "reference": "cd5f0dc1d3d0e2c83461dad77e20a9186beb6146" 1615 | }, 1616 | "dist": { 1617 | "type": "zip", 1618 | "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/cd5f0dc1d3d0e2c83461dad77e20a9186beb6146", 1619 | "reference": "cd5f0dc1d3d0e2c83461dad77e20a9186beb6146", 1620 | "shasum": "" 1621 | }, 1622 | "require": { 1623 | "php": ">=5.3.9" 1624 | }, 1625 | "require-dev": { 1626 | "symfony/phpunit-bridge": "~2.7|~3.0.0" 1627 | }, 1628 | "type": "library", 1629 | "extra": { 1630 | "branch-alias": { 1631 | "dev-master": "2.8-dev" 1632 | } 1633 | }, 1634 | "autoload": { 1635 | "psr-4": { 1636 | "Symfony\\Component\\Stopwatch\\": "" 1637 | } 1638 | }, 1639 | "notification-url": "https://packagist.org/downloads/", 1640 | "license": [ 1641 | "MIT" 1642 | ], 1643 | "authors": [ 1644 | { 1645 | "name": "Fabien Potencier", 1646 | "email": "fabien@symfony.com" 1647 | }, 1648 | { 1649 | "name": "Symfony Community", 1650 | "homepage": "https://symfony.com/contributors" 1651 | } 1652 | ], 1653 | "description": "Symfony Stopwatch Component", 1654 | "homepage": "https://symfony.com", 1655 | "time": "2015-07-01 18:24:26" 1656 | }, 1657 | { 1658 | "name": "symfony/yaml", 1659 | "version": "dev-master", 1660 | "source": { 1661 | "type": "git", 1662 | "url": "https://github.com/symfony/Yaml.git", 1663 | "reference": "1edbff215ddf93bf41e8b6a0e02428ef66fa2ea3" 1664 | }, 1665 | "dist": { 1666 | "type": "zip", 1667 | "url": "https://api.github.com/repos/symfony/Yaml/zipball/1edbff215ddf93bf41e8b6a0e02428ef66fa2ea3", 1668 | "reference": "1edbff215ddf93bf41e8b6a0e02428ef66fa2ea3", 1669 | "shasum": "" 1670 | }, 1671 | "require": { 1672 | "php": ">=5.5.9" 1673 | }, 1674 | "require-dev": { 1675 | "symfony/phpunit-bridge": "~2.8|~3.0" 1676 | }, 1677 | "type": "library", 1678 | "extra": { 1679 | "branch-alias": { 1680 | "dev-master": "3.0-dev" 1681 | } 1682 | }, 1683 | "autoload": { 1684 | "psr-4": { 1685 | "Symfony\\Component\\Yaml\\": "" 1686 | } 1687 | }, 1688 | "notification-url": "https://packagist.org/downloads/", 1689 | "license": [ 1690 | "MIT" 1691 | ], 1692 | "authors": [ 1693 | { 1694 | "name": "Fabien Potencier", 1695 | "email": "fabien@symfony.com" 1696 | }, 1697 | { 1698 | "name": "Symfony Community", 1699 | "homepage": "https://symfony.com/contributors" 1700 | } 1701 | ], 1702 | "description": "Symfony Yaml Component", 1703 | "homepage": "https://symfony.com", 1704 | "time": "2015-07-26 09:09:51" 1705 | } 1706 | ], 1707 | "aliases": [], 1708 | "minimum-stability": "dev", 1709 | "stability-flags": { 1710 | "ircmaxell/php-cfg": 20, 1711 | "ircmaxell/php-types": 20, 1712 | "ircmaxell/tuli": 20 1713 | }, 1714 | "prefer-stable": false, 1715 | "prefer-lowest": false, 1716 | "platform": { 1717 | "php": ">=5.5" 1718 | }, 1719 | "platform-dev": [] 1720 | } 1721 | --------------------------------------------------------------------------------