├── ruleset.xml ├── .idea └── inspectionProfiles │ ├── profiles_settings.xml │ └── Project_Default.xml ├── .travis.yml ├── src ├── Models │ ├── stubs │ │ └── model-content.stub │ ├── Migration │ │ ├── ForeignKey.php │ │ └── Base.php │ ├── ModelContent.php │ ├── MigrationField.php │ └── TableMigration.php ├── MWBModelReader.php ├── ServiceProvider.php └── Console │ └── Commands │ └── MakeMWBModel.php ├── composer.json ├── LICENSE ├── .gitignore ├── README.md └── composer.lock /ruleset.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ./src/ 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.4 5 | - 5.5 6 | - 5.6 7 | - 7.0 8 | - hhvm 9 | 10 | matrix: 11 | allow_failures: 12 | - php: 7.0 13 | 14 | sudo: false 15 | 16 | install: travis_retry composer install --no-interaction --prefer-source 17 | 18 | script: vendor/bin/phpcs -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /src/Models/stubs/model-content.stub: -------------------------------------------------------------------------------- 1 | // {{traits}} 2 | 3 | /** 4 | * Which values should be casted? 5 | * @var array 6 | */ 7 | protected $casts = {{casts}}; 8 | 9 | /** 10 | * The attributes that should be mutated to dates. 11 | * 12 | * @var array 13 | */ 14 | protected $dates = {{dates}}; 15 | 16 | /** 17 | * The attributes that are mass assignable. 18 | * 19 | * @var array 20 | */ 21 | protected $fillable = {{fillable}}; 22 | 23 | /** 24 | * The database table used by the model. 25 | * 26 | * @var string 27 | */ 28 | protected $table = {{table}}; 29 | 30 | // {{relations}} 31 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "authors": [ 3 | { 4 | "name": "Bjoern Lange", 5 | "email": "code@b3nl.de" 6 | } 7 | ], 8 | "autoload": { 9 | "psr-4": { 10 | "b3nl\\MWBModel\\": "src/" 11 | } 12 | }, 13 | "description": "Converts an MySQL Workbench model to laravel counterparts.", 14 | "license": "MIT", 15 | "minimum-stability": "dev", 16 | "name": "b3nl/laravel-mwb-model", 17 | "require": { 18 | "laravel/framework": "5.1 - 5.2", 19 | "php": ">= 5.5.9", 20 | "squizlabs/php_codesniffer": "~2.3", 21 | "laracasts/generators": "^1.1" 22 | }, 23 | "require-dev": { 24 | "phpunit/phpunit": "~4.0", 25 | "phpspec/phpspec": "~2.1" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/MWBModelReader.php: -------------------------------------------------------------------------------- 1 | read() && !$return) { 20 | $return = ($this->nodeType === \XMLReader::ELEMENT) && $this->hasAttributes && 21 | ($this->getAttribute('version') === '1.4.4'); 22 | } // while 23 | 24 | return $return; 25 | } // function 26 | 27 | /** 28 | * Returns true, if the actual node is a model table. 29 | * @return bool 30 | */ 31 | public function isModelTable() 32 | { 33 | return ($this->nodeType === \XMLReader::ELEMENT) && $this->hasAttributes && 34 | ($this->getAttribute('struct-name') === 'db.mysql.Table') && $this->name === 'value'; 35 | } // function 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Björn Lange 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /src/ServiceProvider.php: -------------------------------------------------------------------------------- 1 | 9 | * @package b3nl\MWBModel 10 | * @version $id$ 11 | */ 12 | class ServiceProvider extends ProviderBase 13 | { 14 | /** 15 | * Indicates if loading of the provider is deferred. 16 | * @var bool 17 | */ 18 | protected $defer = true; 19 | 20 | /** 21 | * Register the service provider. 22 | * @return void 23 | */ 24 | public function register() 25 | { 26 | if ($this->app->environment() === 'local') { 27 | $this->commands(['b3nl\MWBModel\Console\Commands\MakeMWBModel']); 28 | 29 | $this->app->register('Laracasts\Generators\GeneratorsServiceProvider'); 30 | } 31 | } 32 | 33 | /** 34 | * Get the services provided by the provider. 35 | * @return array 36 | */ 37 | public function provides() 38 | { 39 | return ($this->app->environment() === 'local') ? ['b3nl\MWBModel\Console\Commands\MakeMWBModel'] : []; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /bootstrap/compiled.php 2 | vendor 3 | .env.*.php 4 | .env.php 5 | 6 | ### JetBrains template 7 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio 8 | 9 | *.iml 10 | 11 | ## Directory-based project format: 12 | .idea/ 13 | # if you remove the above rule, at least ignore the following: 14 | 15 | # User-specific stuff: 16 | # .idea/workspace.xml 17 | # .idea/tasks.xml 18 | # .idea/dictionaries 19 | 20 | # Sensitive or high-churn files: 21 | # .idea/dataSources.ids 22 | # .idea/dataSources.xml 23 | # .idea/sqlDataSources.xml 24 | # .idea/dynamic.xml 25 | # .idea/uiDesigner.xml 26 | 27 | # Gradle: 28 | # .idea/gradle.xml 29 | # .idea/libraries 30 | 31 | # Mongo Explorer plugin: 32 | # .idea/mongoSettings.xml 33 | 34 | ## File-based project format: 35 | *.ipr 36 | *.iws 37 | 38 | ## Plugin-specific files: 39 | 40 | # IntelliJ 41 | /out/ 42 | 43 | # mpeltonen/sbt-idea plugin 44 | .idea_modules/ 45 | 46 | # JIRA plugin 47 | atlassian-ide-plugin.xml 48 | 49 | # Crashlytics plugin (for Android Studio and IntelliJ) 50 | com_crashlytics_export_strings.xml 51 | crashlytics.properties 52 | crashlytics-build.properties 53 | 54 | vendor 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Laravel MySQL-Workbench Model 2 | 3 | With this project you can kickstart your models and database migrations for your Laravel 5 Project. Updates are not possible with it yet, just the start. 4 | 5 | * Just add this project to your composer setup: **"b3nl/laravel-mwb-model": "dev-master"** 6 | * Add our service provider to the list of your service providers in config/app.php: **b3nl\MWBModel\ServiceProvider::class** 7 | 8 | Now you have access to an artisan command for parsing your MySQL-Workbench-File: 9 | 10 | ``` 11 | php artisan make:mwb-model $FILE_TO_SAVED_MODEL --pivots=$COMMA_SEPARATED_LIST_OF_YOUR_PIVOT_TABLE_NAMES 12 | ``` 13 | 14 | ## Special Table Comments 15 | 16 | You can comment your tables in the MySQL-Workbrench with an [ini-String](http://php.net/manual/de/function.parse-ini-string.php) with the following options: 17 | 18 | ``` 19 | ; With this comment, this table is ignored for parsing. Leave it out, if you do not want it ignored. 20 | ignore=true 21 | ; Name of the Laravel model 22 | model=Name 23 | ; Is this a pivot table? Leave it out if not. 24 | isPivot=true 25 | ; withoutTimestamps removes the default timestamps() call for the database migrations 26 | withoutTimestamps=true 27 | ; Ini-Array for the laravel model castings: http://laravel.com/docs/5.1/eloquent-mutators#attribute-casting 28 | [casting] 29 | values=array 30 | ``` 31 | -------------------------------------------------------------------------------- /src/Models/Migration/ForeignKey.php: -------------------------------------------------------------------------------- 1 | 8 | * @package b3nl\MWBModel 9 | * @subpackage Models\Migration 10 | * @version $id$ 11 | */ 12 | class ForeignKey extends Base 13 | { 14 | /** 15 | * Is this foreign key for a 1:n? 16 | * @var bool 17 | */ 18 | protected $isForMany = false; 19 | 20 | /** 21 | * Is this foreign key for a pivot table? 22 | * @var bool 23 | */ 24 | protected $isForPivot = false; 25 | 26 | /** 27 | * Is this this the relation source? 28 | * @var bool 29 | */ 30 | protected $isSource = false; 31 | 32 | /** 33 | * The related table. 34 | * @var TableMigration|void 35 | */ 36 | protected $relatedTable = null; 37 | 38 | /** 39 | * Returns the related table. 40 | * @return TableMigration|void 41 | */ 42 | public function getRelatedTable() 43 | { 44 | return $this->relatedTable; 45 | } // function 46 | 47 | /** 48 | * Is this foreign key for a 1:n? 49 | * @param bool $newStatus The new status. 50 | * @return bool Returns the old status. 51 | */ 52 | public function isForMany($newStatus = false) 53 | { 54 | $oldStatus = $this->isForMany; 55 | 56 | if (func_num_args()) { 57 | $this->isForMany = $newStatus; 58 | } // if 59 | 60 | return $oldStatus; 61 | } // function 62 | 63 | /** 64 | * Is this foreign key for a m:n? 65 | * @param bool $newStatus The new status. 66 | * @return bool Returns the old status. 67 | */ 68 | public function isForPivotTable($newStatus = false) 69 | { 70 | $oldStatus = $this->isForPivot; 71 | 72 | if (func_num_args()) { 73 | $this->isForPivot = $newStatus; 74 | } // if 75 | 76 | return $oldStatus; 77 | } // function 78 | 79 | /** 80 | * Is this this the relation source? 81 | * @param bool $newStatus The new status. 82 | * @return bool Returns the old status. 83 | */ 84 | public function isSource($newStatus = true) 85 | { 86 | $oldStatus = $this->isSource; 87 | 88 | if (func_num_args()) { 89 | $this->isSource = $newStatus; 90 | } // if 91 | 92 | return $oldStatus; 93 | } // function 94 | 95 | /** 96 | * Sets the related table. 97 | * @param TableMigration $relatedTable 98 | * @return ForeignKey 99 | */ 100 | public function setRelatedTable(TableMigration $relatedTable) 101 | { 102 | $this->relatedTable = $relatedTable; 103 | 104 | return $this; 105 | } // function 106 | } 107 | -------------------------------------------------------------------------------- /src/Models/Migration/Base.php: -------------------------------------------------------------------------------- 1 | 6 | * @package b3nl\MWBModel 7 | * @subpackage Models\Migration 8 | * @version $id$ 9 | */ 10 | class Base 11 | { 12 | /** 13 | * The found migration calls. 14 | * @var array 15 | */ 16 | protected $migrations = []; 17 | 18 | /** 19 | * Startpoint of the call hierarchy. 20 | * @var string 21 | */ 22 | protected $startPoint = '$table'; 23 | 24 | /** 25 | * Adds this method call to the list of migration calls. 26 | * @param string $method 27 | * @param array $aArgs 28 | * @return MigrationField 29 | */ 30 | public function __call($method, array $aArgs = []) 31 | { 32 | // an index can't overwrite a foreign key. 33 | if (($method !== 'index') || (!isset($this->migrations['foreign']))) { 34 | $this->migrations[$method] = $aArgs; 35 | } // if 36 | 37 | // the foreign key overwrites an index. 38 | if (($method === 'foreign') && (isset($this->migrations['index']))) { 39 | unset($this->migrations['index']); 40 | } // if 41 | 42 | return $this; 43 | } // function 44 | 45 | /** 46 | * Returns the parameters of the given migrated method. 47 | * @param string $name 48 | * @return null|mixed 49 | */ 50 | public function __get($name) 51 | { 52 | $return = null; 53 | 54 | if (isset($this->$name)) { 55 | $tmp = $this->migrations[$name]; 56 | 57 | $return = is_array($tmp) && count($tmp) === 1 ? current($tmp) : $tmp; 58 | } // 59 | 60 | return $return; 61 | } // function 62 | 63 | /** 64 | * Returns true if there is a migration with the given method call. 65 | * @param string $name 66 | * @return bool 67 | */ 68 | public function __isset($name) 69 | { 70 | return isset($this->migrations[$name]); 71 | } // function 72 | 73 | /** 74 | * Changes the parameters of a migration call. 75 | * @param string $name The method name. 76 | * @param $value 77 | * @return void 78 | */ 79 | public function __set($name, $value) 80 | { 81 | $this->migrations[$name] = array($value); 82 | } // function 83 | 84 | /** 85 | * Returns the method call, to be saved in the migration file. 86 | * @return string 87 | */ 88 | public function __toString() 89 | { 90 | $fieldMigration = ''; 91 | 92 | if ($migrations = $this->getMigrations()) { 93 | $fieldMigration .= $this->getStartPoint(); 94 | 95 | $paramParser = function ($value) { 96 | $return = ''; 97 | 98 | if (is_array($value)) { 99 | $return = 100 | '[' . 101 | rtrim( 102 | array_reduce( 103 | $value, 104 | function ($combined, $single) { 105 | return $combined . var_export($single, true) . ', '; 106 | }, 107 | '' 108 | ), 109 | ', ' 110 | ) . 111 | ']'; 112 | } else { 113 | $return = var_export($value, true); 114 | } // else 115 | 116 | return $return; 117 | }; 118 | 119 | foreach ($migrations as $method => $params) { 120 | $fieldMigration .= "->{$method}("; 121 | 122 | if ($params) { 123 | $fieldMigration .= implode(', ', array_map($paramParser, $params)); 124 | } // if 125 | 126 | $fieldMigration .= ')'; 127 | } // foreach 128 | } // if 129 | 130 | return $fieldMigration . ";"; 131 | } // function 132 | 133 | /** 134 | * Returns the migration calls for a field. 135 | * @return array 136 | */ 137 | public function getMigrations() 138 | { 139 | return $this->migrations; 140 | } 141 | 142 | /** 143 | * Returns the startpoint of the call hierarchy. 144 | * @return string 145 | */ 146 | public function getStartPoint() 147 | { 148 | return $this->startPoint; 149 | } // function 150 | 151 | /** 152 | * Sets the startpoint for the call hierarchy. 153 | * @param string $startPoint 154 | * @return Base 155 | */ 156 | public function setStartPoint($startPoint) 157 | { 158 | $this->startPoint = $startPoint; 159 | 160 | return $this; 161 | } // function 162 | } 163 | -------------------------------------------------------------------------------- /src/Console/Commands/MakeMWBModel.php: -------------------------------------------------------------------------------- 1 | argument('modelfile'))) { 62 | throw new \InvalidArgumentException('Could not find the model.'); 63 | } // if 64 | 65 | $archive = new \ZipArchive(); 66 | 67 | if (!$archive->open(realpath($file))) { 68 | throw new \InvalidArgumentException('Could not open the model.'); 69 | } // if 70 | 71 | $dir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid() . DIRECTORY_SEPARATOR; 72 | 73 | if (!$archive->extractTo($dir)) { 74 | throw new \InvalidArgumentException('Could not extract the model.'); 75 | } // if 76 | 77 | return $dir; 78 | } // function 79 | 80 | /** 81 | * Creates the relations between the tables. 82 | * @param TableMigration[] $tables 83 | * @return TableMigration[] 84 | */ 85 | protected function createTableRelations(array $tables) 86 | { 87 | /** @var TableMigration $tableObject */ 88 | foreach ($tables as $tableObject) { 89 | $tableObject->relateToOtherTables($tables); 90 | } // foreach 91 | 92 | return $this->sortTablesWithFKsToEnd($tables); 93 | } // function 94 | 95 | /** 96 | * Opens the zipped model container and reads the xml model file. 97 | * @return void 98 | */ 99 | public function fire() 100 | { 101 | $this->loadMNTables(); 102 | $dir = $this->checkAndExtractModelFile(); 103 | 104 | foreach (glob($dir . '*.mwb.xml') as $file) { 105 | $reader = new MWBModelReader(); 106 | $reader->open($file); 107 | 108 | $this 109 | ->setModelReader($reader) 110 | ->handleModelTables(); 111 | } // foreach 112 | 113 | return null; 114 | } // function 115 | 116 | /** 117 | * Get the console command arguments. 118 | * @return array 119 | */ 120 | protected function getArguments() 121 | { 122 | return [ 123 | ['modelfile', InputArgument::REQUIRED, 'The file path to your *.mwb-file.'], 124 | ]; 125 | } // function 126 | 127 | /** 128 | * Returns the used model reader. 129 | * @return MWBModelReader 130 | */ 131 | public function getModelReader() 132 | { 133 | return $this->modelReader; 134 | } // function 135 | 136 | /** 137 | * Returns the loaded model tables. 138 | * @return TableMigration[] 139 | */ 140 | public function getModelTables() 141 | { 142 | if ($this->tables === null) { 143 | $this->setModelTables($this->loadModelTables()); 144 | } 145 | 146 | return $this->tables; 147 | } 148 | 149 | /** 150 | * Get the console command options. 151 | * @return array 152 | */ 153 | protected function getOptions() 154 | { 155 | return [ 156 | [ 157 | 'pivots', 158 | null, 159 | InputOption::VALUE_OPTIONAL, 160 | 'Please provide the names of the m:n-pivot tables (table1,table2,...), if there are any:', 161 | '' 162 | ], 163 | ]; 164 | } // function 165 | 166 | /** 167 | * Loads the model tables out of the model file. 168 | * @return MakeMWBModel 169 | * @todo We need to save a way to save the relations in the models. 170 | */ 171 | protected function handleModelTables() 172 | { 173 | if (!$this->getModelReader()->isCompatibleVersion()) { 174 | throw new \InvalidArgumentException('Wrong model version.'); 175 | } // if 176 | 177 | $bar = $this->output->createProgressBar(); 178 | 179 | $bar->start(count($tables = $this->getModelTables())); 180 | 181 | /** @var TableMigration $tableObject */ 182 | foreach ($this->createTableRelations($tables) as $tableObject) { 183 | $tableObject->save($this); 184 | 185 | $bar->advance(); 186 | } // foreach 187 | 188 | return $this; 189 | } 190 | 191 | /** 192 | * Loads the names of the m:n tables. 193 | * @return MakeMWBModel 194 | */ 195 | protected function loadMNTables() 196 | { 197 | if ($tables = $this->option('pivots')) { 198 | $this->pivotTables = array_map('trim', array_filter(explode(',', rtrim($tables, ',')))); 199 | } // if 200 | 201 | return $this; 202 | } 203 | 204 | /** 205 | * Generates the model and migration for/with laravel and extends the contents of the generated classes. 206 | * @param \DOMNode $node The node of the table. 207 | * @return MakeMWBModel|bool False if the table should be ignored. 208 | */ 209 | protected function loadModelTable(\DOMNode $node) 210 | { 211 | $tableObject = new TableMigration($this); 212 | $loaded = $tableObject->load($node); 213 | 214 | if ($loaded && in_array($tableObject->getName(), $this->pivotTables)) { 215 | $tableObject->isPivotTable(true); 216 | } else if ($tableObject->isPivotTable()) { 217 | $this->pivotTables[] = $tableObject->getName(); 218 | } // else if 219 | 220 | return $loaded ? $tableObject : false; 221 | } 222 | 223 | /** 224 | * Loads the model tables from the file. 225 | * @return TableMigration[] 226 | */ 227 | protected function loadModelTables() 228 | { 229 | $reader = $this->getModelReader(); 230 | $tables = []; 231 | 232 | while ($reader->read()) { 233 | if ($reader->isModelTable()) { 234 | if ($table = $this->loadModelTable($reader->expand())) { 235 | $tables[$table->getId()] = $table; 236 | } // if 237 | } // if 238 | } // while 239 | 240 | return $tables; 241 | } 242 | 243 | /** 244 | * Sets the model reader. 245 | * @param MWBModelReader $modelReader 246 | * @return MakeMWBModel 247 | */ 248 | public function setModelReader(MWBModelReader $modelReader) 249 | { 250 | $this->modelReader = $modelReader; 251 | 252 | return $this; 253 | } 254 | 255 | /** 256 | * Sets the model tables. 257 | * @param TableMigration[] $tables 258 | * @return $this 259 | */ 260 | public function setModelTables(array $tables) 261 | { 262 | $this->tables = $tables; 263 | 264 | return $this; 265 | } 266 | 267 | /** 268 | * Callback to sort tables with foreign keys to the end. 269 | * @param TableMigration[] $tables 270 | * @return TableMigration[] 271 | */ 272 | protected function sortTablesWithFKsToEnd(array $tables) 273 | { 274 | $return = []; 275 | 276 | while ($tables) { 277 | /** @var TableMigration $table */ 278 | foreach ($tables as $key => $table) { 279 | // if there are no fks or the required fks are allready saved. 280 | if ((!$fks = $table->getForeignKeys()) || (count(array_intersect_key($return, $fks)) === count($fks))) { 281 | $return[$table->getName()] = $table; 282 | unset($tables[$key]); 283 | } // if 284 | } // foreach 285 | } // while 286 | 287 | return $return; 288 | } // function 289 | } 290 | -------------------------------------------------------------------------------- /src/Models/ModelContent.php: -------------------------------------------------------------------------------- 1 | [], 35 | 'dates' => [], 36 | 'fillable' => [], 37 | 'table' => '' 38 | ]; 39 | 40 | /** 41 | * The extended model. 42 | * @var object|string 43 | */ 44 | protected $targetModel = null; 45 | 46 | /** 47 | * The array of used traits for the model. 48 | * @var array 49 | */ 50 | protected $traits = []; 51 | 52 | /** 53 | * Construct. 54 | * @param string|object $targetModel The target model for writing the properties. 55 | */ 56 | public function __construct($targetModel) 57 | { 58 | $this->targetModel = $targetModel; 59 | } // function 60 | 61 | /** 62 | * Setter for the stubbed properties. 63 | * @param string $method 64 | * @param array $args 65 | * @return ModelContent 66 | */ 67 | public function __call($method, array $args = []) 68 | { 69 | if (strpos($method, 'set') === 0) { 70 | $this->properties[lcfirst(substr($method, 3))] = $args[0]; 71 | } // if 72 | 73 | return $this; 74 | } // function 75 | 76 | /** 77 | * Adds a foreign key to this model. 78 | * @param ForeignKey $key 79 | * @return ModelContent 80 | */ 81 | public function addForeignKey(ForeignKey $key) 82 | { 83 | $this->foreignKeys[] = $key; 84 | 85 | return $this; 86 | } // function 87 | 88 | /** 89 | * Returns the foreign keys. 90 | * @return Migration\ForeignKey[] 91 | */ 92 | public function getForeignKeys() 93 | { 94 | return $this->foreignKeys; 95 | } // function 96 | 97 | /** 98 | * Returns the parsed method calls for the foreign keys. 99 | * @return array 100 | */ 101 | protected function getMethodCallsForForeignKeys() 102 | { 103 | $methods = []; 104 | 105 | if ($keys = $this->getForeignKeys()) { 106 | /** @var ForeignKey $key */ 107 | foreach ($keys as $key) { 108 | $relatedTable = $key->getRelatedTable(); 109 | $relatedModel = '\\' . $this->getAppNamespace() . $relatedTable->getModelName() . '::class'; 110 | 111 | if ($key->isSource()) { 112 | $methodName = lcfirst($key->isForMany() ? $relatedTable->getName() : $relatedTable->getModelName()); 113 | 114 | $methodReturnSuffix = 'has' . ($key->isForMany() ? 'Many' : 'One'); 115 | $methodContent = "return \$this->{$methodReturnSuffix}({$relatedModel});"; 116 | } // if 117 | elseif ($key->isForPivotTable()) { 118 | $methodName = lcfirst($key->isForMany() && $key->isForPivotTable() 119 | ? $relatedTable->getName() 120 | : $relatedTable->getModelName()); 121 | 122 | $methodReturnSuffix = 'belongsToMany'; 123 | 124 | $methodContent = "return \$this->{$methodReturnSuffix}({$relatedModel});"; 125 | } // elseif 126 | else { 127 | $methodName = lcfirst($key->isForMany() && $key->isForPivotTable() 128 | ? $relatedTable->getName() 129 | : $relatedTable->getModelName()); 130 | 131 | $methodReturnSuffix = 'belongsTo'; 132 | 133 | $methodContent = "return \$this->{$methodReturnSuffix}({$relatedModel}, '{$key->foreign}');"; 134 | } // else 135 | 136 | $methodName = preg_replace_callback( 137 | '/(_[a-z])/', 138 | function ($matches) { 139 | return strtoupper(substr($matches[0], 1)); 140 | }, 141 | $methodName 142 | ); 143 | 144 | $method = "\t/**\n\t * Getter for {$relatedTable->getName()}.\n\t " . 145 | "* @return \\Illuminate\\Database\\Eloquent\\Relations\\" . 146 | ucfirst($methodReturnSuffix) . " \n\t */\n\t" . 147 | "public function {$methodName}()\n\t{\n\t\t{$methodContent}\n\t}"; 148 | 149 | $methods[] = $method; 150 | } // foreach 151 | } // if 152 | 153 | return array_unique($methods); 154 | } // function 155 | 156 | /** 157 | * Returns the used properties. 158 | * @return array 159 | */ 160 | public function getProperties() 161 | { 162 | return $this->properties; 163 | } // function 164 | 165 | /** 166 | * Returns the extended object. 167 | * @return object|string 168 | */ 169 | public function getTargetModel() 170 | { 171 | return $this->targetModel; 172 | } 173 | 174 | /** 175 | * Returns the special traits for the model. 176 | * @return array 177 | */ 178 | public function getTraits() 179 | { 180 | return $this->traits; 181 | } // function 182 | 183 | /** 184 | * Parses the given value to an exportable php code. 185 | * @param string|array $value 186 | * @return string 187 | */ 188 | protected function parsePropertyValue($value) 189 | { 190 | $return = ''; 191 | 192 | if (is_array($value)) { 193 | $withStringIndex = (bool) array_filter(array_keys($value), 'is_string'); 194 | 195 | if ($withStringIndex) { 196 | $return = preg_replace( 197 | ['/^(array ?\( *)/', '/\)$/'], 198 | ['[', ']'], 199 | str_replace("\n", '', var_export($value, true)) 200 | ); 201 | } else { 202 | $return = 203 | '[' . 204 | rtrim( 205 | array_reduce( 206 | $value, 207 | function ($combined, $single) { 208 | return $combined . var_export($single, true) . ', '; 209 | }, 210 | '' 211 | ), 212 | ', ' 213 | ) . 214 | ']'; 215 | } // else 216 | } else { 217 | $return = var_export($value, true); 218 | } // else 219 | 220 | return $return; 221 | } // function 222 | 223 | /** 224 | * Saves the properties in the placeholder. 225 | * @param string $inPlaceholder 226 | * @return bool 227 | * @throws LogicException 228 | */ 229 | public function save($inPlaceholder = " //") 230 | { 231 | if (!file_exists($modelFile = app_path($target = $this->getTargetModel(). '.php'))) { 232 | throw new LogicException(sprintf('Model %s not found', $target)); 233 | } 234 | 235 | $this->writeToModel($modelFile, $inPlaceholder); 236 | 237 | return true; 238 | } // function 239 | 240 | /** 241 | * Sets the names of the traits. 242 | * @param array $traits 243 | * @return ModelContent 244 | */ 245 | public function setTraits($traits) 246 | { 247 | $this->traits = $traits; 248 | 249 | return $this; 250 | } // function 251 | 252 | /** 253 | * Writes the stub properties to the target model. 254 | * @param string $modelFile The path to the model file. 255 | * @param string $inPlaceholder 256 | * @return int 257 | */ 258 | protected function writeToModel($modelFile, $inPlaceholder = " //") 259 | { 260 | $replaces = []; 261 | $searches = []; 262 | 263 | foreach ($this->getProperties() as $property => $content) { 264 | $replaces[] = $this->parsePropertyValue($content); 265 | $searches[] = '{{' . $property . '}}'; 266 | } // foreach 267 | 268 | $methodContent = ''; 269 | $newContent = str_replace( 270 | $searches, 271 | $replaces, 272 | file_get_contents(realpath(__DIR__ . '/stubs/model-content.stub')) 273 | ); 274 | 275 | if ($keys = $this->getForeignKeys()) { 276 | $methodContent = implode("\n\n", $this->getMethodCallsForForeignKeys()); 277 | } // if 278 | 279 | $newContent = str_replace( 280 | [" // {{relations}}", '// {{traits}}'], 281 | [$methodContent, ($traits = $this->getTraits()) ? 'use ' . implode(', ', $traits) . ';' : ''], 282 | $newContent 283 | ); 284 | 285 | $written = file_put_contents( 286 | $modelFile, 287 | str_replace( 288 | $inPlaceholder, 289 | $newContent, 290 | file_get_contents($modelFile) 291 | ) 292 | ); 293 | 294 | if ($written) { 295 | // Success of formatting is optional. 296 | if (DIRECTORY_SEPARATOR === '\\') { 297 | $exec = ".\\vendor\\bin\\phpcbf.bat {$modelFile} --standard=PSR2"; 298 | } else { 299 | $exec = "vendor/bin/phpcbf {$modelFile} --standard=PSR2"; 300 | } 301 | 302 | @exec($exec, $output, $return); 303 | } // if 304 | 305 | return $written; 306 | } // function 307 | } 308 | -------------------------------------------------------------------------------- /src/Models/MigrationField.php: -------------------------------------------------------------------------------- 1 | [ 44 | 'boolean(./value[@type="int" and @key="isNotNull" and text() = 0])' 45 | ], 46 | 'default' => [ 47 | 'boolean(./value[@type="string" and @key="defaultValue" and text() != ""])', 48 | ['./value[@type="string" and @key="defaultValue"]'] 49 | ] 50 | ]; 51 | 52 | /** 53 | * The settings of this field. 54 | * @var array 55 | */ 56 | protected $settings = []; 57 | 58 | /** 59 | * XPath evals for the main type of the desired database field in the migration. 60 | * 61 | * Key is the laravel call, the first array value is the xpath to check, if the call is needed and the second 62 | * array value are the XPaths to get the method arguments. 63 | * @var array 64 | */ 65 | protected $typeEvals = [ 66 | 'boolean' => [ 67 | './link[@key="userType" and text() = "com.mysql.rdbms.mysql.userdatatype.boolean"]' 68 | ], 69 | 'bigInteger' => [ 70 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.bigint"]', 71 | [ 72 | 'boolean(./value[@type="int" and @key="autoIncrement" and number() = 1])', 73 | 'boolean(./value[@content-type="string" and @key="flags"]/value[@type="string" ' . 74 | 'and text() = "UNSIGNED"])' 75 | ] 76 | ], 77 | 'dateTime' => [ 78 | './link[@key="simpleType" and (text() = "com.mysql.rdbms.mysql.datatype.datetime" or ' . 79 | 'text() = "com.mysql.rdbms.mysql.datatype.datetime_f")]' 80 | ], 81 | 'enum' => [ 82 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.enum"]' 83 | ], 84 | 'increments' => [ 85 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.int"] and ./value[@key="name" ' . 86 | 'and text() = "id"] and ./value[@type="int" and @key="autoIncrement" and number() = 1]' 87 | ], 88 | 'integer' => [ 89 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.int"]', 90 | [ 91 | 'boolean(./value[@type="int" and @key="autoIncrement" and number() = 1])', 92 | 'boolean(./value[@content-type="string" and @key="flags"]/value[@type="string" ' . 93 | 'and text() = "UNSIGNED"])' 94 | ] 95 | ], 96 | 'mediumInteger' => [ 97 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.mediumint"]', 98 | [ 99 | 'boolean(./value[@type="int" and @key="autoIncrement" and number() = 1])', 100 | 'boolean(./value[@content-type="string" and @key="flags"]/value[@type="string" ' . 101 | 'and text() = "UNSIGNED"])' 102 | ] 103 | ], 104 | 'text' => [ 105 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.text"]' 106 | ], 107 | 'timestamp' => [ 108 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.timestamp_f"]' 109 | ], 110 | 'tinyInteger' => [ 111 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.tinyint"]', 112 | [ 113 | 'boolean(./value[@type="int" and @key="autoIncrement" and text() = 1])', 114 | 'boolean(./value[@content-type="string" and @key="flags"]/value[@type="string" ' . 115 | 'and text() = "UNSIGNED"])' 116 | ] 117 | ], 118 | 'rememberToken' => [ 119 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.varchar"]/../value[@key="name" ' . 120 | 'and text() = "remember_token"]' 121 | ], 122 | 'smallInteger' => [ 123 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.smallint"]', 124 | [ 125 | 'boolean(./value[@type="int" and @key="autoIncrement" and text() = 1])', 126 | 'boolean(./value[@content-type="string" and @key="flags"]/value[@type="string" ' . 127 | 'and text() = "UNSIGNED"])' 128 | ] 129 | ], 130 | 'string' => [ 131 | './link[@key="simpleType" and text() = "com.mysql.rdbms.mysql.datatype.varchar"]', 132 | ['number(./value[@type="int" and @key="length"])'] 133 | ] 134 | ]; 135 | 136 | /** 137 | * The construct. 138 | * @param string $name The name of the field. 139 | */ 140 | public function __construct($name) 141 | { 142 | $this->setName($name); 143 | } // function 144 | 145 | /** 146 | * Returns the method call, to be saved in the migration file. 147 | * @return string 148 | */ 149 | public function __toString() 150 | { 151 | $schema = $this->getName() . ':'; 152 | 153 | foreach ($this->getSettings() as $type => $values) { 154 | $schema .= $type; 155 | 156 | if ($values) { 157 | $schema .= '(' . 158 | implode(',', array_map(function($value) { return var_export($value, true); }, $values)) . 159 | ')'; 160 | } 161 | } 162 | 163 | if ($options = $this->getAdditionalOptions()) { 164 | $schema .= ':'; 165 | 166 | foreach ($options as $name => $values) { 167 | $schema .= $name; 168 | 169 | if ($values) { 170 | $schema .= '(' . 171 | implode(',', array_map(function($value) { return var_export($value, true); }, $values)) . 172 | ')'; 173 | } 174 | } 175 | } 176 | 177 | return $schema; 178 | } 179 | 180 | /** 181 | * @param $name 182 | * @param array $values 183 | * @return $this 184 | */ 185 | public function addAdditionalOption($name, array $values = []) 186 | { 187 | $this->additionalOptions[$name] = $values; 188 | 189 | return $this; 190 | } 191 | 192 | /** 193 | * Returns the options for this field. 194 | * @return array 195 | */ 196 | public function getAdditionalOptions() 197 | { 198 | return $this->additionalOptions; 199 | } 200 | 201 | /** 202 | * Returns the id of this field in the model. 203 | * @return string 204 | */ 205 | public function getId() 206 | { 207 | return $this->id; 208 | } 209 | 210 | /** 211 | * Returns the field name. 212 | * @return string 213 | */ 214 | public function getName() 215 | { 216 | return $this->name; 217 | } 218 | 219 | /** 220 | * Returns the settings of this field. 221 | * @return array 222 | */ 223 | public function getSettings() 224 | { 225 | return $this->settings; 226 | } 227 | 228 | /** 229 | * Loads the database migrations calls of the database field.. 230 | * @param \DOMNode $field 231 | * @param \DOMXPath $rootPath 232 | * @return MigrationField 233 | */ 234 | public function load(DOMNode $field, DOMXPath $rootPath) 235 | { 236 | $this->setId($field->attributes->getNamedItem('id')->nodeValue); 237 | 238 | return $this 239 | ->loadMigrationCalls($field, $rootPath, $this->typeEvals) 240 | ->loadMigrationCalls($field, $rootPath, $this->optionEvals, true); 241 | } // function 242 | 243 | /** 244 | * Loads the database migrations calls of the database field.. 245 | * @param \DOMNode $field 246 | * @param \DOMXPath $rootPath 247 | * @param array $migrationRules The rules how the mgiration call should be created. 248 | * @param bool $isOptional Should the main type or the minor options for the field be configured? 249 | * @return MigrationField 250 | */ 251 | protected function loadMigrationCalls( 252 | DOMNode $field, 253 | DOMXPath $rootPath, 254 | array $migrationRules, 255 | $isOptional = false 256 | ) { 257 | $method = ''; 258 | $params = []; 259 | 260 | foreach ($migrationRules as $ruleMethod => $rules) { 261 | $evaledXPath = $rootPath->evaluate($rules[0], $field); 262 | 263 | // is it a found domnodelist or evaled the xpath to a scalar value !== false. 264 | if ((($evaledXPath instanceof DOMNodeList) && ($evaledXPath->length)) || 265 | ((!($evaledXPath instanceof DOMNodeList)) && $evaledXPath) 266 | ) { 267 | $method = $ruleMethod; 268 | break; 269 | } // if 270 | } // foreach 271 | 272 | // optional calls are only added, if the desired method is found. 273 | if ($method || !$isOptional) { 274 | if (!$method) { 275 | $method = 'string'; 276 | $rules = []; 277 | } // if 278 | 279 | if (@$rules[1] && is_array($rules[1])) { 280 | foreach ($rules[1] as $paramPath) { 281 | $paramResult = $rootPath->evaluate($paramPath, $field); 282 | $isResultNodeList = $paramResult instanceof \DOMNodeList; 283 | 284 | if ((($isResultNodeList) && ($paramResult->length)) || (!$isResultNodeList)) { 285 | $rawParam = $isResultNodeList ? $paramResult->item(0)->nodeValue : $paramResult; 286 | $params[] = is_numeric($rawParam) ? $rawParam * 1 : $rawParam; 287 | } // if 288 | } // foreach 289 | } // if 290 | 291 | $this->{'set' . ($isOptional ? 'AdditionalOptions' : 'Settings')}(array($method => $params)); 292 | } // if 293 | 294 | return $this; 295 | } 296 | 297 | /** 298 | * Sets the options array. 299 | * @param array $options 300 | * @return MigrationField 301 | */ 302 | public function setAdditionalOptions($options) 303 | { 304 | $this->options = $options; 305 | 306 | return $this; 307 | } 308 | 309 | /** 310 | * Sets the id of this field. 311 | * @param string $id 312 | * @return MigrationField 313 | */ 314 | public function setId($id) 315 | { 316 | $this->id = $id; 317 | 318 | return $this; 319 | } 320 | 321 | /** 322 | * Sets the fieldname. 323 | * @param string $name 324 | * @return MigrationField 325 | */ 326 | public function setName($name) 327 | { 328 | $this->name = $name; 329 | 330 | return $this; 331 | } 332 | 333 | /** 334 | * Sets the settings of this field. 335 | * @param array $settings 336 | * @return MigrationField 337 | */ 338 | public function setSettings($settings) 339 | { 340 | $this->settings = $settings; 341 | 342 | return $this; 343 | } 344 | } 345 | -------------------------------------------------------------------------------- /src/Models/TableMigration.php: -------------------------------------------------------------------------------- 1 | setCommand($command); 105 | } 106 | 107 | /** 108 | * Adds a foreign key, where this table is the source. 109 | * @param ForeignKey $foreignKey 110 | * @return TableMigration 111 | */ 112 | public function addAsRelationSource(ForeignKey $foreignKey) 113 | { 114 | $foreignKey->isSource(true); 115 | $this->relationSources[] = $foreignKey; 116 | 117 | return $this; 118 | } // function 119 | 120 | protected function addCallsToMigrationFile($file) 121 | { 122 | $name = $this->getName(); 123 | $written = false; 124 | 125 | // filter every "foreign call" (for m:n tables) to itself. 126 | $calls = array_filter($this->getGenericCalls(), function ($call) use ($name) { 127 | return !$call->foreign || $call->on !== $name; 128 | }); 129 | 130 | if ($calls) { 131 | $search = ' $table->timestamps();' . "\n"; 132 | $replace = "\t\t\t" . implode("\n\t\t\t", $calls); 133 | 134 | $written = (bool)file_put_contents($file, str_replace($search, $replace . "\n", file_get_contents($file))); 135 | 136 | if ($written) { 137 | if (DIRECTORY_SEPARATOR === '\\') { 138 | $exec = ".\\vendor\\bin\\phpcbf.bat {$file} --standard=PSR2"; 139 | } else { 140 | $exec = "vendor/bin/phpcbf {$file} --standard=PSR2"; 141 | } 142 | 143 | // Success of formatting is optional. 144 | @exec($exec, $output, $return); 145 | } 146 | } 147 | 148 | return $written; 149 | } 150 | 151 | /** 152 | * Adds a field for the given name. 153 | * @param string $name The field name. 154 | * @return MigrationField 155 | */ 156 | protected function addField($name) 157 | { 158 | $this->fields[$name] = $field = new MigrationField($name); 159 | 160 | return $field; 161 | } // function 162 | 163 | /** 164 | * Adds the foreign keys to the field. 165 | * @param DOMXPath $rootPath 166 | * @return TableMigration 167 | */ 168 | protected function addForeignKeys(DOMXPath $rootPath) 169 | { 170 | $fields = $this->getFields(); 171 | $idMap = array_flip(array_map(function (MigrationField $field) { 172 | return $field->getId(); 173 | }, $fields)); 174 | 175 | /** @var MigrationField $field */ 176 | foreach ($fields as $name => $field) { 177 | $usedId = $field->getId(); 178 | $indexNodes = $this->getForeignKeysForField($field, $rootPath); 179 | 180 | if ($indexNodes && $indexNodes->length) { 181 | /** @var \DOMNode $indexNode */ 182 | foreach ($indexNodes as $indexNode) { 183 | $call = new ForeignKey(); 184 | 185 | $call 186 | ->foreign($field->getName()) 187 | ->references('id') 188 | ->on( 189 | $rootPath->evaluate( 190 | 'string(.//link[@type="object" and @struct-name="db.mysql.Table" ' . 191 | 'and @key="referencedTable"])', 192 | $indexNode 193 | ) 194 | ); 195 | 196 | if ($rule = $rootPath->evaluate('string(./value[@key="deleteRule"])', $indexNode)) { 197 | $call->onDelete(strtolower($rule)); 198 | } // if 199 | 200 | if ($rule = $rootPath->evaluate('string(./value[@key="updateRule"])', $indexNode)) { 201 | $call->onUpdate(strtolower($rule)); 202 | } // if 203 | 204 | $call->isForMany((int)$rootPath->evaluate('number(./value[@key="many"])', $indexNode) === 1); 205 | } // foreach 206 | 207 | $this->addGenericCall($call); 208 | } // if 209 | } // foreach 210 | 211 | return $this; 212 | } // function 213 | 214 | /** 215 | * Adds a possible ambigiuous call. 216 | * @param Base $call The migration call. 217 | * @return TableMigration 218 | * @todo Duplicates on "doubled" unique keys. 219 | */ 220 | protected function addGenericCall(Base $call) 221 | { 222 | $this->genericCalls[] = $call; 223 | 224 | return $this; 225 | } // function 226 | 227 | /** 228 | * Adds the simple indices to the fields directly and returns the indices for multiple values. 229 | * @param DOMXPath $rootPath 230 | * @return array 231 | * @todo Primary missing; Problems with m:ns. 232 | */ 233 | protected function addIndicesToFields(DOMXPath $rootPath) 234 | { 235 | $fetchedNodes = []; 236 | $fields = $this->getFields(); 237 | $multipleIndices = []; 238 | $idMap = array_flip( 239 | array_map( 240 | function (MigrationField $field) { 241 | return $field->getId(); 242 | }, 243 | $fields 244 | ) 245 | ); 246 | 247 | /** @var MigrationField $field */ 248 | foreach ($fields as $name => $field) { 249 | $usedId = $field->getId(); 250 | $indexNodes = $rootPath->query( 251 | './value[@content-struct-name="db.mysql.Index" and @key="indices"]/' . 252 | 'value[@type="object" and @struct-name="db.mysql.Index"]//' . 253 | 'value[@type="object" and @struct-name="db.mysql.IndexColumn"]//' . 254 | 'link[@type="object" and @struct-name="db.Column" and @key="referencedColumn" ' . 255 | 'and text() = "' . $usedId . '"]/' . 256 | '../' . 257 | '../' . 258 | '..' 259 | ); 260 | 261 | if ($indexNodes && $indexNodes->length) { 262 | $fks = $this->getForeignKeysForField($field, $rootPath); 263 | 264 | /** @var \DOMNode $indexNode */ 265 | foreach ($indexNodes as $indexNode) { 266 | if (in_array($nodeId = $indexNode->attributes->getNamedItem('id')->nodeValue, $fetchedNodes)) { 267 | continue; 268 | } // if 269 | 270 | $fetchedNodes[] = $nodeId; 271 | 272 | $indexColumns = $rootPath->query( 273 | './/link[@type="object" and @struct-name="db.Column" and @key="referencedColumn"]', 274 | $indexNode 275 | ); 276 | 277 | $isSingleColumn = $indexColumns && $indexColumns->length <= 1; 278 | $genericCall = !$isSingleColumn ? new Base() : null; 279 | 280 | if ($rootPath->evaluate( 281 | 'boolean(./value[@type="int" and @key="unique" and number() = 1])', 282 | $indexNode 283 | ) 284 | ) { 285 | if ($isSingleColumn) { 286 | $field->addAdditionalOption('unique'); 287 | } // if 288 | else { 289 | $genericMethod = 'unique'; 290 | } // else 291 | } // if 292 | 293 | $hasIndex = $rootPath->evaluate( 294 | 'boolean(./value[@type="string" and @key="indexType" and text() = "INDEX"])', 295 | $indexNode 296 | ); 297 | 298 | if ($hasIndex && (!$fks || !$fks->length)) { 299 | if ($isSingleColumn) { 300 | $field->addAdditionalOption('index'); 301 | } // if 302 | else { 303 | $genericMethod = 'index'; 304 | } // else 305 | } // if 306 | 307 | if ($rootPath->evaluate( 308 | 'boolean(./value[@type="string" and @key="indexType" and text() = "PRIMARY"])', 309 | $indexNode 310 | ) 311 | ) { 312 | if ($isSingleColumn) { 313 | $field->addAdditionalOption('primary'); 314 | } // if 315 | else { 316 | $genericMethod = 'primary'; 317 | } // else 318 | } // if 319 | 320 | if ($genericCall && $genericMethod) { 321 | $genericParams = []; 322 | /** @var DOMNode $column */ 323 | foreach ($indexColumns as $column) { 324 | $genericParams[] = $idMap[$column->nodeValue]; 325 | } // foreach 326 | 327 | $this->addGenericCall(call_user_func_array( 328 | [$genericCall, $genericMethod], 329 | $genericParams ? [$genericParams] : [] 330 | )); 331 | } 332 | } 333 | } 334 | } 335 | 336 | return array_unique($multipleIndices); 337 | } 338 | 339 | /** 340 | * Returns the count of fields. 341 | * @return int 342 | */ 343 | public function count() 344 | { 345 | return count($this->fields); 346 | } // function 347 | 348 | /** 349 | * Creates the migration file for the given table. 350 | * @return mixed|string 351 | * @todo softDeletes, timestamps 352 | */ 353 | protected function createMigrationFile() 354 | { 355 | $fieldObjects = $this->getFields(); 356 | 357 | if (@$fieldObjects['id']) { 358 | unset($fieldObjects['id']); 359 | } 360 | 361 | if (@$fieldObjects['created_at'] && @$fieldObjects['updated_at']) { 362 | $this->addGenericCall((new Base())->timestamps()); 363 | 364 | unset($fieldObjects['created_at'], $fieldObjects['updated_at']); 365 | } // if 366 | 367 | if (@$fieldObjects['deleted_at']) { 368 | $this->addGenericCall((new Base())->softDeletes()); 369 | 370 | unset($fieldObjects['deleted_at']); 371 | } // if 372 | 373 | $schema = implode(', ', $fieldObjects); 374 | 375 | if (strpos($schema, 'enum') !== false) { 376 | $this->getCommand()->info(sprintf('Please change the enum field of table "%s" manually.', 377 | $this->getName())); 378 | } 379 | 380 | if ($this->isPivotTable()) { 381 | $tables = array_keys($this->getForeignKeys()); 382 | 383 | Artisan::call( 384 | 'make:migration:pivot', 385 | [ 386 | 'tableOne' => $tables[0], 387 | 'tableTwo' => $tables[1] 388 | ] 389 | ); 390 | } else { 391 | Artisan::call( 392 | 'make:migration:schema', 393 | [ 394 | 'name' => "create_{$this->getName()}_table", 395 | '--model' => $this->needsLaravelModel(), 396 | '--schema' => $fieldObjects ? $schema : '' 397 | ] 398 | ); 399 | 400 | $migrationFiles = glob( 401 | database_path('migrations') . DIRECTORY_SEPARATOR . "*_create_{$this->getName()}_table.php" 402 | ); 403 | } 404 | 405 | return @$migrationFiles ? end($migrationFiles) : ''; 406 | } // function 407 | 408 | /** 409 | * Returns the guarded fields. 410 | * @return array 411 | */ 412 | public function getBlacklist() 413 | { 414 | return $this->blacklist; 415 | } 416 | 417 | /** 418 | * Returns the casted fields. 419 | * @return array 420 | */ 421 | public function getCastedFields() 422 | { 423 | return $this->castedFields; 424 | } 425 | 426 | /** 427 | * Returns Sets the issueing command. 428 | * @return Command 429 | */ 430 | public function getCommand() 431 | { 432 | return $this->command; 433 | } 434 | 435 | /** 436 | * Returns the field with the given name 437 | * @param string $name 438 | * @return null 439 | */ 440 | public function getField($name) 441 | { 442 | return $this->fields[$name] ?: $this->addField($name); 443 | } // function 444 | 445 | /** 446 | * Returns the migration fields. 447 | * @return MigrationField[] 448 | */ 449 | public function getFields() 450 | { 451 | return $this->fields; 452 | } // function 453 | 454 | /** 455 | * Returns the relations for foreign keys. 456 | * @return Base[] 457 | */ 458 | public function getForeignKeys() 459 | { 460 | $return = []; 461 | $table = $this->getName(); 462 | 463 | /** @var Base $call */ 464 | foreach ($this->getGenericCalls() as $call) { 465 | if (isset($call->on) && $call->on !== $table) { 466 | $return[(string)$call->on] = $call; 467 | } // if 468 | } // foreach 469 | 470 | return $return; 471 | } // function 472 | 473 | /** 474 | * Returns the foreign key fields for a field. 475 | * @param MigrationField $field 476 | * @param DOMXPath $rootPath 477 | * @return DOMNodeList 478 | */ 479 | protected function getForeignKeysForField(MigrationField $field, DOMXPath $rootPath) 480 | { 481 | return $rootPath->query( 482 | './value[@content-struct-name="db.mysql.ForeignKey" and @key="foreignKeys"]/' . 483 | 'value[@type="object" and @struct-name="db.mysql.ForeignKey"]//' . 484 | 'value[@type="list" and @content-type="object" and @content-struct-name="db.Column" and @key="columns"]/' . 485 | 'link[text() = "' . $field->getId() . '"]/' . 486 | '../' . 487 | '..' 488 | ); 489 | } // function 490 | 491 | /** 492 | * Returns the generic calls, the ambigiuous calls for fields. 493 | * @return Base[] 494 | */ 495 | public function getGenericCalls() 496 | { 497 | return $this->genericCalls; 498 | } // function 499 | 500 | /** 501 | * Returns the id of this field in the model. 502 | * @return string 503 | */ 504 | public function getId() 505 | { 506 | return $this->id; 507 | } 508 | 509 | /** 510 | * Returns the model name. 511 | * @return string 512 | */ 513 | public function getModelName() 514 | { 515 | if (!$name = $this->modelName) { 516 | $tableName = $this->getName(); 517 | 518 | $modelNames = []; 519 | foreach (explode('_', $tableName) as $word) { 520 | $modelNames[] = ucfirst(Inflector::singularize($word)); 521 | } //foreach 522 | $modelName = implode('', $modelNames); 523 | 524 | $this->setModelName($name = ucfirst($this->isReservedPHPWord($modelName) ? $tableName : $modelName)); 525 | } // if 526 | 527 | return $name; 528 | } // function 529 | 530 | /** 531 | * Returns the name of the table. 532 | * @return string 533 | */ 534 | public function getName() 535 | { 536 | return $this->name; 537 | } 538 | 539 | /** 540 | * Returns the Relation-Sources. 541 | * @return Migration\ForeignKey[] 542 | */ 543 | public function getRelationSources() 544 | { 545 | return $this->relationSources; 546 | } // function 547 | 548 | /** 549 | * Returns true if there is a field with the given name. 550 | * @param string $name 551 | * @return bool 552 | */ 553 | public function hasField($name) 554 | { 555 | return array_key_exists($name, $this->fields); 556 | } // function 557 | 558 | /** 559 | * Is this table a m:n pivot table? 560 | * @param bool $newStatus The new status. 561 | * @return bool The old status. 562 | */ 563 | public function isPivotTable($newStatus = false) 564 | { 565 | $oldStatus = $this->isPivotTable; 566 | 567 | if (func_num_args()) { 568 | $this->isPivotTable = $newStatus; 569 | } // if 570 | 571 | return $oldStatus; 572 | } // function 573 | 574 | /** 575 | * Returns true if the given word is a php keyword. 576 | * @param string $word 577 | * @return bool 578 | */ 579 | protected function isReservedPHPWord($word) 580 | { 581 | $word = strtolower($word); 582 | 583 | $keywords = [ 584 | '__halt_compiler', 585 | 'abstract', 586 | 'and', 587 | 'array', 588 | 'as', 589 | 'break', 590 | 'callable', 591 | 'case', 592 | 'catch', 593 | 'class', 594 | 'clone', 595 | 'const', 596 | 'continue', 597 | 'declare', 598 | 'default', 599 | 'die', 600 | 'do', 601 | 'echo', 602 | 'else', 603 | 'elseif', 604 | 'empty', 605 | 'enddeclare', 606 | 'endfor', 607 | 'endforeach', 608 | 'endif', 609 | 'endswitch', 610 | 'endwhile', 611 | 'eval', 612 | 'exit', 613 | 'extends', 614 | 'final', 615 | 'for', 616 | 'foreach', 617 | 'function', 618 | 'global', 619 | 'goto', 620 | 'if', 621 | 'implements', 622 | 'include', 623 | 'include_once', 624 | 'instanceof', 625 | 'insteadof', 626 | 'interface', 627 | 'isset', 628 | 'list', 629 | 'namespace', 630 | 'new', 631 | 'or', 632 | 'print', 633 | 'private', 634 | 'protected', 635 | 'public', 636 | 'require', 637 | 'require_once', 638 | 'return', 639 | 'static', 640 | 'switch', 641 | 'throw', 642 | 'trait', 643 | 'try', 644 | 'unset', 645 | 'use', 646 | 'var', 647 | 'while', 648 | 'xor' 649 | ]; 650 | 651 | $predefined_constants = [ 652 | '__CLASS__', 653 | '__DIR__', 654 | '__FILE__', 655 | '__FUNCTION__', 656 | '__LINE__', 657 | '__METHOD__', 658 | '__NAMESPACE__', 659 | '__TRAIT__' 660 | ]; 661 | 662 | return in_array($word, $keywords) || in_array($word, $predefined_constants); 663 | } // function 664 | 665 | /** 666 | * Load this table with its dom node. 667 | * @param DOMNode $node 668 | * @return TableMigration|bool Returns false if the table should be ignored. 669 | */ 670 | public function load(DOMNode $node) 671 | { 672 | $return = true; 673 | 674 | $dom = new \DOMDocument('1.0'); 675 | $dom->importNode($node, true); 676 | $dom->appendChild($node); 677 | 678 | $path = new \DOMXPath($dom); 679 | 680 | $this->setName($tableName = $path->evaluate('string((./value[@key="name"])[1])')); 681 | 682 | $comment = $path->evaluate('string((./value[@key="comment"])[1])'); 683 | 684 | if ($comment) { 685 | $return = $this->loadAnnotations($comment); 686 | } // if 687 | 688 | if ($return) { 689 | $this->setId($tableId = $node->attributes->getNamedItem('id')->nodeValue); 690 | 691 | if (!$tableId || !$tableName) { 692 | throw new \LogicException('Table name or id could not be fond.'); 693 | } // if 694 | 695 | $return = $this->loadMigrationFields($path); 696 | } // if 697 | 698 | return $return; 699 | } // function 700 | 701 | /** 702 | * Loads the annotations for this table. 703 | * @param string $annotations 704 | * @return bool Returns false, if this table should be ignored. 705 | */ 706 | public function loadAnnotations($annotations) 707 | { 708 | $moreSettings = parse_ini_string($annotations, true) ?: []; 709 | 710 | if (@$guardedFields = $moreSettings['blacklist']) { 711 | $this->setBlacklist(explode(',', $guardedFields)); 712 | } // if 713 | 714 | if (@$moreSettings['casting'] && is_array($moreSettings['casting'])) { 715 | $this->setCastedFields($moreSettings['casting']); 716 | } // if 717 | 718 | if (@$modelName = $moreSettings['model']) { 719 | $this->setModelName($modelName); 720 | } // if 721 | 722 | $this->isPivotTable(@ (bool)$moreSettings['isPivot']); 723 | $this->withoutTimestamps(@ (bool)$moreSettings['withoutTimestamps']); 724 | 725 | return !@$moreSettings['ignore']; 726 | } 727 | 728 | /** 729 | * Returns the migration fields of the model. 730 | * @param DOMXPath $rootPath 731 | * @return TableMigration 732 | */ 733 | protected function loadMigrationFields(DOMXPath $rootPath) 734 | { 735 | $fields = $rootPath->query( 736 | './value[@type="list" and @key="columns"]/value[@type="object" and @struct-name="db.mysql.Column"]' 737 | ); 738 | 739 | if ($fields && $fields->length) { 740 | /** @var \DOMNode $field */ 741 | foreach ($fields as $field) { 742 | $fieldName = $rootPath->query('./value[@key="name"]', $field)->item(0)->nodeValue; 743 | 744 | $this->addField($fieldName)->load($field, $rootPath); 745 | } // foreach 746 | } // if 747 | 748 | $this->addIndicesToFields($rootPath); 749 | 750 | return $this->addForeignKeys($rootPath); 751 | } // function 752 | 753 | /** 754 | * Returns true, if this table needs a laravel model aswell. 755 | * @return bool 756 | */ 757 | public function needsLaravelModel() 758 | { 759 | return !$this->isPivotTable() || count($this->fields) > 2; 760 | } // function 761 | 762 | /** 763 | * Relates this table to others. 764 | * @param TableMigration[] $otherTables 765 | * @return TableMigration 766 | */ 767 | public function relateToOtherTables(array $otherTables) 768 | { 769 | if ($calls = $this->getGenericCalls()) { 770 | $tablesByModelName = []; 771 | 772 | /** @var TableMigration $tableObject */ 773 | foreach ($otherTables as $tableObject) { 774 | $tablesByModelName[$tableObject->getModelName()] = $tableObject; 775 | } // foreach 776 | 777 | /** @var ForeignKey $call */ 778 | foreach ($calls as $call) { 779 | if ($on = $call->on) { 780 | /** @var TableMigration $otherTable */ 781 | $otherTable = @$otherTables[$on]; 782 | $call->on = $otherTable->getName(); 783 | 784 | $otherCall = clone $call; 785 | 786 | if ($this->isPivotTable()) { 787 | $modelNames = array_map('ucfirst', explode('_', $tableName = $this->getName())); 788 | 789 | $matchedModelTables = array_intersect_key($tablesByModelName, array_flip($modelNames)); 790 | unset($matchedModelTables[$otherTable->getModelName()]); 791 | 792 | $otherCall->isForMany(true); 793 | $otherCall->isForPivotTable(true); 794 | 795 | $call->on = current($matchedModelTables)->getName(); 796 | $otherTable->addGenericCall($otherCall->setRelatedTable(current($matchedModelTables))); 797 | } // if 798 | else { 799 | $call->setRelatedTable($otherTable); 800 | $otherTable->addAsRelationSource($otherCall->setRelatedTable($this)); 801 | } // else 802 | } // if 803 | } // foreach 804 | } // if 805 | 806 | return $this; 807 | } // function 808 | 809 | /** 810 | * Saves the table in the given migration file. 811 | * @return bool 812 | */ 813 | public function save() 814 | { 815 | $file = $this->createMigrationFile(); 816 | 817 | if (!$written = !$file) { 818 | $written = $this->addCallsToMigrationFile($file); 819 | } 820 | 821 | if ($this->needsLaravelModel()) { 822 | $this->saveModelForTable(); 823 | } 824 | 825 | return $written; 826 | } // function 827 | 828 | /** 829 | * Saves the model content for a table. 830 | * @return MakeMWBModel 831 | */ 832 | protected function saveModelForTable() 833 | { 834 | $table = $this; 835 | $dates = []; 836 | $fields = $table->getFields(); 837 | // TODO Work with the namespace again. The FQN does not work since switching to the generator.s 838 | $modelContent = (new ModelContent($table->getModelName()))->setTable($table->getName()); 839 | 840 | if (array_key_exists($field = 'deleted_at', $fields)) { 841 | unset($fields[$field]); 842 | 843 | $dates[] = $field; 844 | $modelContent->setTraits(['\Illuminate\Database\Eloquent\SoftDeletes']); 845 | } // if 846 | 847 | if (array_key_exists($field = 'created_at', $fields)) { 848 | unset($fields[$field]); 849 | 850 | $dates[] = $field; 851 | } // if 852 | 853 | if (array_key_exists($field = 'updated_at', $fields)) { 854 | unset($fields[$field]); 855 | 856 | $dates[] = $field; 857 | } // if 858 | 859 | if ($dates) { 860 | $modelContent->setDates($dates); 861 | } // if 862 | 863 | unset($fields['id']); 864 | $modelContent->setFillable(array_diff(array_keys($fields), $table->getBlacklist())); 865 | $modelContent->setCasts($table->getCastedFields()); 866 | 867 | if ($genericCalls = $table->getGenericCalls()) { 868 | foreach ($genericCalls as $call) { 869 | if ($call instanceof ForeignKey) { 870 | $modelContent->addForeignKey($call); 871 | } // if 872 | } // foreach 873 | } // if 874 | 875 | if ($sources = $table->getRelationSources()) { 876 | foreach ($sources as $call) { 877 | if ($call instanceof ForeignKey) { 878 | $modelContent->addForeignKey($call); 879 | } // if 880 | } // foreach 881 | } // if 882 | 883 | $modelContent->save(); 884 | 885 | return $this; 886 | } // function 887 | 888 | /** 889 | * Sets the guarded fields. 890 | * @param array $blacklist 891 | * @return TableMigration. 892 | */ 893 | public function setBlacklist(array $blacklist) 894 | { 895 | $this->blacklist = $blacklist; 896 | 897 | return $this; 898 | } // function 899 | 900 | /** 901 | * Sets the casted fields for this table. 902 | * @param array $castedFields 903 | * @return TableMigration 904 | */ 905 | public function setCastedFields(array $castedFields) 906 | { 907 | $this->castedFields = $castedFields; 908 | 909 | return $this; 910 | } // function 911 | 912 | /** 913 | * Sets the issueing command. 914 | * @param Command|void $command 915 | * @return TableMigration 916 | */ 917 | public function setCommand($command) 918 | { 919 | $this->command = $command; 920 | 921 | return $this; 922 | } 923 | 924 | /** 925 | * Sets the generic calls, the ambigiuous calls for fields. 926 | * @param array $genericCalls 927 | * @return TableMigration 928 | */ 929 | public function setGenericCalls($genericCalls) 930 | { 931 | $this->genericCalls = $genericCalls; 932 | 933 | return $this; 934 | } // function 935 | 936 | /** 937 | * Sets the id of this field. 938 | * @param string $id 939 | * @return TableMigration 940 | */ 941 | public function setId($id) 942 | { 943 | $this->id = $id; 944 | 945 | return $this; 946 | } // function 947 | 948 | /** 949 | * Sets the model name. 950 | * @param string $name 951 | * @return TableMigration 952 | */ 953 | public function setModelName($name) 954 | { 955 | $this->modelName = $name; 956 | 957 | return $this; 958 | } // function 959 | 960 | /** 961 | * Sets the name of the table. 962 | * @param string $name 963 | * @return TableMigration 964 | */ 965 | public function setName($name) 966 | { 967 | $this->name = $name; 968 | 969 | return $this; 970 | } // function 971 | 972 | /** 973 | * Should this table be rendered without the timestamps? 974 | * @param bool $newStatus 975 | * @return bool 976 | */ 977 | public function withoutTimestamps($newStatus = false) 978 | { 979 | $oldStatus = $this->withoutTimestamps; 980 | 981 | if (func_num_args()) { 982 | $this->withoutTimestamps = $newStatus; 983 | } // if 984 | 985 | return $oldStatus; 986 | } 987 | } 988 | -------------------------------------------------------------------------------- /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": "6cca04a5f9e4b0937876bcbaabe0fa40", 8 | "content-hash": "54a83540b99e0b81ac3978bf1a445d95", 9 | "packages": [ 10 | { 11 | "name": "classpreloader/classpreloader", 12 | "version": "dev-master", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/ClassPreloader/ClassPreloader.git", 16 | "reference": "8c3c14b10309e3b40bce833913a6c0c0b8c8f962" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/de1d55df4f492374f0b77eb06da990b7393a433f", 21 | "reference": "8c3c14b10309e3b40bce833913a6c0c0b8c8f962", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "nikic/php-parser": "~1.3", 26 | "php": ">=5.5.9" 27 | }, 28 | "require-dev": { 29 | "phpunit/phpunit": "~4.0" 30 | }, 31 | "type": "library", 32 | "extra": { 33 | "branch-alias": { 34 | "dev-master": "2.0-dev" 35 | } 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "ClassPreloader\\": "src/" 40 | } 41 | }, 42 | "notification-url": "https://packagist.org/downloads/", 43 | "license": [ 44 | "MIT" 45 | ], 46 | "authors": [ 47 | { 48 | "name": "Michael Dowling", 49 | "email": "mtdowling@gmail.com" 50 | }, 51 | { 52 | "name": "Graham Campbell", 53 | "email": "graham@alt-three.com" 54 | } 55 | ], 56 | "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case", 57 | "keywords": [ 58 | "autoload", 59 | "class", 60 | "preload" 61 | ], 62 | "time": "2015-06-28 21:39:13" 63 | }, 64 | { 65 | "name": "danielstjules/stringy", 66 | "version": "1.x-dev", 67 | "source": { 68 | "type": "git", 69 | "url": "https://github.com/danielstjules/Stringy.git", 70 | "reference": "4749c205db47ee5b32e8d1adf6d9aff8db6caf3b" 71 | }, 72 | "dist": { 73 | "type": "zip", 74 | "url": "https://api.github.com/repos/danielstjules/Stringy/zipball/4749c205db47ee5b32e8d1adf6d9aff8db6caf3b", 75 | "reference": "4749c205db47ee5b32e8d1adf6d9aff8db6caf3b", 76 | "shasum": "" 77 | }, 78 | "require": { 79 | "ext-mbstring": "*", 80 | "php": ">=5.3.0" 81 | }, 82 | "require-dev": { 83 | "phpunit/phpunit": "~4.0" 84 | }, 85 | "type": "library", 86 | "autoload": { 87 | "psr-4": { 88 | "Stringy\\": "src/" 89 | }, 90 | "files": [ 91 | "src/Create.php" 92 | ] 93 | }, 94 | "notification-url": "https://packagist.org/downloads/", 95 | "license": [ 96 | "MIT" 97 | ], 98 | "authors": [ 99 | { 100 | "name": "Daniel St. Jules", 101 | "email": "danielst.jules@gmail.com", 102 | "homepage": "http://www.danielstjules.com" 103 | } 104 | ], 105 | "description": "A string manipulation library with multibyte support", 106 | "homepage": "https://github.com/danielstjules/Stringy", 107 | "keywords": [ 108 | "UTF", 109 | "helpers", 110 | "manipulation", 111 | "methods", 112 | "multibyte", 113 | "string", 114 | "utf-8", 115 | "utility", 116 | "utils" 117 | ], 118 | "time": "2015-07-23 00:54:12" 119 | }, 120 | { 121 | "name": "dnoegel/php-xdg-base-dir", 122 | "version": "0.1", 123 | "source": { 124 | "type": "git", 125 | "url": "https://github.com/dnoegel/php-xdg-base-dir.git", 126 | "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" 127 | }, 128 | "dist": { 129 | "type": "zip", 130 | "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a", 131 | "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", 132 | "shasum": "" 133 | }, 134 | "require": { 135 | "php": ">=5.3.2" 136 | }, 137 | "require-dev": { 138 | "phpunit/phpunit": "@stable" 139 | }, 140 | "type": "project", 141 | "autoload": { 142 | "psr-4": { 143 | "XdgBaseDir\\": "src/" 144 | } 145 | }, 146 | "notification-url": "https://packagist.org/downloads/", 147 | "license": [ 148 | "MIT" 149 | ], 150 | "description": "implementation of xdg base directory specification for php", 151 | "time": "2014-10-24 07:27:01" 152 | }, 153 | { 154 | "name": "doctrine/inflector", 155 | "version": "dev-master", 156 | "source": { 157 | "type": "git", 158 | "url": "https://github.com/doctrine/inflector.git", 159 | "reference": "b0b2feffb47906a03b570777c07044c529d1d124" 160 | }, 161 | "dist": { 162 | "type": "zip", 163 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", 164 | "reference": "b0b2feffb47906a03b570777c07044c529d1d124", 165 | "shasum": "" 166 | }, 167 | "require": { 168 | "php": ">=5.3.2" 169 | }, 170 | "require-dev": { 171 | "phpunit/phpunit": "4.*" 172 | }, 173 | "type": "library", 174 | "extra": { 175 | "branch-alias": { 176 | "dev-master": "1.0.x-dev" 177 | } 178 | }, 179 | "autoload": { 180 | "psr-0": { 181 | "Doctrine\\Common\\Inflector\\": "lib/" 182 | } 183 | }, 184 | "notification-url": "https://packagist.org/downloads/", 185 | "license": [ 186 | "MIT" 187 | ], 188 | "authors": [ 189 | { 190 | "name": "Roman Borschel", 191 | "email": "roman@code-factory.org" 192 | }, 193 | { 194 | "name": "Benjamin Eberlei", 195 | "email": "kontakt@beberlei.de" 196 | }, 197 | { 198 | "name": "Guilherme Blanco", 199 | "email": "guilhermeblanco@gmail.com" 200 | }, 201 | { 202 | "name": "Jonathan Wage", 203 | "email": "jonwage@gmail.com" 204 | }, 205 | { 206 | "name": "Johannes Schmitt", 207 | "email": "schmittjoh@gmail.com" 208 | } 209 | ], 210 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 211 | "homepage": "http://www.doctrine-project.org", 212 | "keywords": [ 213 | "inflection", 214 | "pluralize", 215 | "singularize", 216 | "string" 217 | ], 218 | "time": "2015-07-07 15:32:45" 219 | }, 220 | { 221 | "name": "jakub-onderka/php-console-color", 222 | "version": "0.1", 223 | "source": { 224 | "type": "git", 225 | "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", 226 | "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" 227 | }, 228 | "dist": { 229 | "type": "zip", 230 | "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", 231 | "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", 232 | "shasum": "" 233 | }, 234 | "require": { 235 | "php": ">=5.3.2" 236 | }, 237 | "require-dev": { 238 | "jakub-onderka/php-code-style": "1.0", 239 | "jakub-onderka/php-parallel-lint": "0.*", 240 | "jakub-onderka/php-var-dump-check": "0.*", 241 | "phpunit/phpunit": "3.7.*", 242 | "squizlabs/php_codesniffer": "1.*" 243 | }, 244 | "type": "library", 245 | "autoload": { 246 | "psr-0": { 247 | "JakubOnderka\\PhpConsoleColor": "src/" 248 | } 249 | }, 250 | "notification-url": "https://packagist.org/downloads/", 251 | "license": [ 252 | "BSD-2-Clause" 253 | ], 254 | "authors": [ 255 | { 256 | "name": "Jakub Onderka", 257 | "email": "jakub.onderka@gmail.com", 258 | "homepage": "http://www.acci.cz" 259 | } 260 | ], 261 | "time": "2014-04-08 15:00:19" 262 | }, 263 | { 264 | "name": "jakub-onderka/php-console-highlighter", 265 | "version": "v0.3.2", 266 | "source": { 267 | "type": "git", 268 | "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", 269 | "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" 270 | }, 271 | "dist": { 272 | "type": "zip", 273 | "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", 274 | "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", 275 | "shasum": "" 276 | }, 277 | "require": { 278 | "jakub-onderka/php-console-color": "~0.1", 279 | "php": ">=5.3.0" 280 | }, 281 | "require-dev": { 282 | "jakub-onderka/php-code-style": "~1.0", 283 | "jakub-onderka/php-parallel-lint": "~0.5", 284 | "jakub-onderka/php-var-dump-check": "~0.1", 285 | "phpunit/phpunit": "~4.0", 286 | "squizlabs/php_codesniffer": "~1.5" 287 | }, 288 | "type": "library", 289 | "autoload": { 290 | "psr-0": { 291 | "JakubOnderka\\PhpConsoleHighlighter": "src/" 292 | } 293 | }, 294 | "notification-url": "https://packagist.org/downloads/", 295 | "license": [ 296 | "MIT" 297 | ], 298 | "authors": [ 299 | { 300 | "name": "Jakub Onderka", 301 | "email": "acci@acci.cz", 302 | "homepage": "http://www.acci.cz/" 303 | } 304 | ], 305 | "time": "2015-04-20 18:58:01" 306 | }, 307 | { 308 | "name": "jeremeamia/SuperClosure", 309 | "version": "dev-master", 310 | "source": { 311 | "type": "git", 312 | "url": "https://github.com/jeremeamia/super_closure.git", 313 | "reference": "155fadced44802618435130ed7e16e44a2575e65" 314 | }, 315 | "dist": { 316 | "type": "zip", 317 | "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/6fe8ad066d3b2b01ad71d2130ebd38ccaabd549f", 318 | "reference": "155fadced44802618435130ed7e16e44a2575e65", 319 | "shasum": "" 320 | }, 321 | "require": { 322 | "nikic/php-parser": "~1.2", 323 | "php": ">=5.4" 324 | }, 325 | "require-dev": { 326 | "codeclimate/php-test-reporter": "~0.1.2", 327 | "phpunit/phpunit": "~4.0" 328 | }, 329 | "type": "library", 330 | "extra": { 331 | "branch-alias": { 332 | "dev-master": "2.2-dev" 333 | } 334 | }, 335 | "autoload": { 336 | "psr-4": { 337 | "SuperClosure\\": "src/" 338 | } 339 | }, 340 | "notification-url": "https://packagist.org/downloads/", 341 | "license": [ 342 | "MIT" 343 | ], 344 | "authors": [ 345 | { 346 | "name": "Jeremy Lindblom", 347 | "email": "jeremeamia@gmail.com", 348 | "homepage": "https://github.com/jeremeamia", 349 | "role": "developer" 350 | } 351 | ], 352 | "description": "Serialize Closure objects, including their context and binding", 353 | "homepage": "https://github.com/jeremeamia/super_closure", 354 | "keywords": [ 355 | "closure", 356 | "function", 357 | "lambda", 358 | "parser", 359 | "serializable", 360 | "serialize", 361 | "tokenizer" 362 | ], 363 | "time": "2015-06-09 19:13:35" 364 | }, 365 | { 366 | "name": "laracasts/generators", 367 | "version": "1.1.3", 368 | "source": { 369 | "type": "git", 370 | "url": "https://github.com/laracasts/Laravel-5-Generators-Extended.git", 371 | "reference": "d6afcc60dff846980393d59f6df2074b8a297b08" 372 | }, 373 | "dist": { 374 | "type": "zip", 375 | "url": "https://api.github.com/repos/laracasts/Laravel-5-Generators-Extended/zipball/d6afcc60dff846980393d59f6df2074b8a297b08", 376 | "reference": "d6afcc60dff846980393d59f6df2074b8a297b08", 377 | "shasum": "" 378 | }, 379 | "require": { 380 | "illuminate/support": "~5.0", 381 | "php": ">=5.4.0" 382 | }, 383 | "require-dev": { 384 | "phpspec/phpspec": "~2.1" 385 | }, 386 | "type": "library", 387 | "autoload": { 388 | "psr-4": { 389 | "Laracasts\\Generators\\": "src/" 390 | } 391 | }, 392 | "notification-url": "https://packagist.org/downloads/", 393 | "license": [ 394 | "MIT" 395 | ], 396 | "authors": [ 397 | { 398 | "name": "Jeffrey Way", 399 | "email": "jeffrey@laracasts.com" 400 | } 401 | ], 402 | "description": "Extend Laravel 5's generators.", 403 | "keywords": [ 404 | "generators", 405 | "laravel" 406 | ], 407 | "time": "2015-12-31 18:44:32" 408 | }, 409 | { 410 | "name": "laravel/framework", 411 | "version": "5.1.x-dev", 412 | "source": { 413 | "type": "git", 414 | "url": "https://github.com/laravel/framework.git", 415 | "reference": "df541f80ab8871c2eb047fc91909258bc2ea2cc1" 416 | }, 417 | "dist": { 418 | "type": "zip", 419 | "url": "https://api.github.com/repos/laravel/framework/zipball/cc00dedec9f36a2647a4cc1cde1014ed67e65d82", 420 | "reference": "df541f80ab8871c2eb047fc91909258bc2ea2cc1", 421 | "shasum": "" 422 | }, 423 | "require": { 424 | "classpreloader/classpreloader": "~2.0", 425 | "danielstjules/stringy": "~1.8", 426 | "doctrine/inflector": "~1.0", 427 | "ext-mbstring": "*", 428 | "ext-openssl": "*", 429 | "jeremeamia/superclosure": "~2.0", 430 | "league/flysystem": "~1.0", 431 | "monolog/monolog": "~1.11", 432 | "mtdowling/cron-expression": "~1.0", 433 | "nesbot/carbon": "~1.19", 434 | "php": ">=5.5.9", 435 | "psy/psysh": "~0.5.1", 436 | "swiftmailer/swiftmailer": "~5.1", 437 | "symfony/console": "2.7.*", 438 | "symfony/css-selector": "2.7.*", 439 | "symfony/debug": "2.7.*", 440 | "symfony/dom-crawler": "2.7.*", 441 | "symfony/finder": "2.7.*", 442 | "symfony/http-foundation": "2.7.*", 443 | "symfony/http-kernel": "2.7.*", 444 | "symfony/process": "2.7.*", 445 | "symfony/routing": "2.7.*", 446 | "symfony/translation": "2.7.*", 447 | "symfony/var-dumper": "2.7.*", 448 | "vlucas/phpdotenv": "~1.0" 449 | }, 450 | "replace": { 451 | "illuminate/auth": "self.version", 452 | "illuminate/broadcasting": "self.version", 453 | "illuminate/bus": "self.version", 454 | "illuminate/cache": "self.version", 455 | "illuminate/config": "self.version", 456 | "illuminate/console": "self.version", 457 | "illuminate/container": "self.version", 458 | "illuminate/contracts": "self.version", 459 | "illuminate/cookie": "self.version", 460 | "illuminate/database": "self.version", 461 | "illuminate/encryption": "self.version", 462 | "illuminate/events": "self.version", 463 | "illuminate/exception": "self.version", 464 | "illuminate/filesystem": "self.version", 465 | "illuminate/foundation": "self.version", 466 | "illuminate/hashing": "self.version", 467 | "illuminate/http": "self.version", 468 | "illuminate/log": "self.version", 469 | "illuminate/mail": "self.version", 470 | "illuminate/pagination": "self.version", 471 | "illuminate/pipeline": "self.version", 472 | "illuminate/queue": "self.version", 473 | "illuminate/redis": "self.version", 474 | "illuminate/routing": "self.version", 475 | "illuminate/session": "self.version", 476 | "illuminate/support": "self.version", 477 | "illuminate/translation": "self.version", 478 | "illuminate/validation": "self.version", 479 | "illuminate/view": "self.version" 480 | }, 481 | "require-dev": { 482 | "aws/aws-sdk-php": "~3.0", 483 | "iron-io/iron_mq": "~2.0", 484 | "mockery/mockery": "~0.9.1", 485 | "pda/pheanstalk": "~3.0", 486 | "phpunit/phpunit": "~4.0", 487 | "predis/predis": "~1.0" 488 | }, 489 | "suggest": { 490 | "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", 491 | "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).", 492 | "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", 493 | "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers (~5.3|~6.0).", 494 | "iron-io/iron_mq": "Required to use the iron queue driver (~2.0).", 495 | "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", 496 | "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", 497 | "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", 498 | "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", 499 | "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0)." 500 | }, 501 | "type": "library", 502 | "extra": { 503 | "branch-alias": { 504 | "dev-master": "5.1-dev" 505 | } 506 | }, 507 | "autoload": { 508 | "classmap": [ 509 | "src/Illuminate/Queue/IlluminateQueueClosure.php" 510 | ], 511 | "files": [ 512 | "src/Illuminate/Foundation/helpers.php", 513 | "src/Illuminate/Support/helpers.php" 514 | ], 515 | "psr-4": { 516 | "Illuminate\\": "src/Illuminate/" 517 | } 518 | }, 519 | "notification-url": "https://packagist.org/downloads/", 520 | "license": [ 521 | "MIT" 522 | ], 523 | "authors": [ 524 | { 525 | "name": "Taylor Otwell", 526 | "email": "taylorotwell@gmail.com" 527 | } 528 | ], 529 | "description": "The Laravel Framework.", 530 | "homepage": "http://laravel.com", 531 | "keywords": [ 532 | "framework", 533 | "laravel" 534 | ], 535 | "time": "2015-07-26 16:33:02" 536 | }, 537 | { 538 | "name": "league/flysystem", 539 | "version": "dev-master", 540 | "source": { 541 | "type": "git", 542 | "url": "https://github.com/thephpleague/flysystem.git", 543 | "reference": "864cd3ecca6f912f6c41a4fe482029d092daed4a" 544 | }, 545 | "dist": { 546 | "type": "zip", 547 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2cb2b02a1d9d699c4883a9c4b20f9d8e64b04ba5", 548 | "reference": "864cd3ecca6f912f6c41a4fe482029d092daed4a", 549 | "shasum": "" 550 | }, 551 | "require": { 552 | "php": ">=5.4.0" 553 | }, 554 | "require-dev": { 555 | "ext-fileinfo": "*", 556 | "mockery/mockery": "~0.9", 557 | "phpspec/phpspec": "^2.2", 558 | "phpspec/prophecy-phpunit": "~1.0", 559 | "phpunit/phpunit": "~4.1" 560 | }, 561 | "suggest": { 562 | "ext-fileinfo": "Required for MimeType", 563 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 564 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 565 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 566 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 567 | "league/flysystem-copy": "Allows you to use Copy.com storage", 568 | "league/flysystem-dropbox": "Allows you to use Dropbox storage", 569 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 570 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 571 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 572 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 573 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter" 574 | }, 575 | "type": "library", 576 | "extra": { 577 | "branch-alias": { 578 | "dev-master": "1.1-dev" 579 | } 580 | }, 581 | "autoload": { 582 | "psr-4": { 583 | "League\\Flysystem\\": "src/" 584 | } 585 | }, 586 | "notification-url": "https://packagist.org/downloads/", 587 | "license": [ 588 | "MIT" 589 | ], 590 | "authors": [ 591 | { 592 | "name": "Frank de Jonge", 593 | "email": "info@frenky.net" 594 | } 595 | ], 596 | "description": "Filesystem abstraction: Many filesystems, one API.", 597 | "keywords": [ 598 | "Cloud Files", 599 | "WebDAV", 600 | "abstraction", 601 | "aws", 602 | "cloud", 603 | "copy.com", 604 | "dropbox", 605 | "file systems", 606 | "files", 607 | "filesystem", 608 | "filesystems", 609 | "ftp", 610 | "rackspace", 611 | "remote", 612 | "s3", 613 | "sftp", 614 | "storage" 615 | ], 616 | "time": "2015-07-21 20:38:14" 617 | }, 618 | { 619 | "name": "monolog/monolog", 620 | "version": "dev-master", 621 | "source": { 622 | "type": "git", 623 | "url": "https://github.com/Seldaek/monolog.git", 624 | "reference": "e4f45be5dcfeb54c45f85b50cdbb3ef8a2bfbd81" 625 | }, 626 | "dist": { 627 | "type": "zip", 628 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e4f45be5dcfeb54c45f85b50cdbb3ef8a2bfbd81", 629 | "reference": "e4f45be5dcfeb54c45f85b50cdbb3ef8a2bfbd81", 630 | "shasum": "" 631 | }, 632 | "require": { 633 | "php": ">=5.3.0", 634 | "psr/log": "~1.0" 635 | }, 636 | "provide": { 637 | "psr/log-implementation": "1.0.0" 638 | }, 639 | "require-dev": { 640 | "aws/aws-sdk-php": "^2.4.9", 641 | "doctrine/couchdb": "~1.0@dev", 642 | "graylog2/gelf-php": "~1.0", 643 | "php-console/php-console": "^3.1.3", 644 | "phpunit/phpunit": "~4.5", 645 | "phpunit/phpunit-mock-objects": "2.3.0", 646 | "raven/raven": "~0.8", 647 | "ruflin/elastica": ">=0.90 <3.0", 648 | "swiftmailer/swiftmailer": "~5.3", 649 | "videlalvaro/php-amqplib": "~2.4" 650 | }, 651 | "suggest": { 652 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 653 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 654 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 655 | "ext-mongo": "Allow sending log messages to a MongoDB server", 656 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 657 | "php-console/php-console": "Allow sending log messages to Google Chrome", 658 | "raven/raven": "Allow sending log messages to a Sentry server", 659 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 660 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server", 661 | "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" 662 | }, 663 | "type": "library", 664 | "extra": { 665 | "branch-alias": { 666 | "dev-master": "1.15.x-dev" 667 | } 668 | }, 669 | "autoload": { 670 | "psr-4": { 671 | "Monolog\\": "src/Monolog" 672 | } 673 | }, 674 | "notification-url": "https://packagist.org/downloads/", 675 | "license": [ 676 | "MIT" 677 | ], 678 | "authors": [ 679 | { 680 | "name": "Jordi Boggiano", 681 | "email": "j.boggiano@seld.be", 682 | "homepage": "http://seld.be" 683 | } 684 | ], 685 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 686 | "homepage": "http://github.com/Seldaek/monolog", 687 | "keywords": [ 688 | "log", 689 | "logging", 690 | "psr-3" 691 | ], 692 | "time": "2015-07-20 18:31:46" 693 | }, 694 | { 695 | "name": "mtdowling/cron-expression", 696 | "version": "v1.0.4", 697 | "source": { 698 | "type": "git", 699 | "url": "https://github.com/mtdowling/cron-expression.git", 700 | "reference": "fd92e883195e5dfa77720b1868cf084b08be4412" 701 | }, 702 | "dist": { 703 | "type": "zip", 704 | "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/fd92e883195e5dfa77720b1868cf084b08be4412", 705 | "reference": "fd92e883195e5dfa77720b1868cf084b08be4412", 706 | "shasum": "" 707 | }, 708 | "require": { 709 | "php": ">=5.3.2" 710 | }, 711 | "require-dev": { 712 | "phpunit/phpunit": "4.*" 713 | }, 714 | "type": "library", 715 | "autoload": { 716 | "psr-0": { 717 | "Cron": "src/" 718 | } 719 | }, 720 | "notification-url": "https://packagist.org/downloads/", 721 | "license": [ 722 | "MIT" 723 | ], 724 | "authors": [ 725 | { 726 | "name": "Michael Dowling", 727 | "email": "mtdowling@gmail.com", 728 | "homepage": "https://github.com/mtdowling" 729 | } 730 | ], 731 | "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", 732 | "keywords": [ 733 | "cron", 734 | "schedule" 735 | ], 736 | "time": "2015-01-11 23:07:46" 737 | }, 738 | { 739 | "name": "nesbot/carbon", 740 | "version": "1.20.0", 741 | "source": { 742 | "type": "git", 743 | "url": "https://github.com/briannesbitt/Carbon.git", 744 | "reference": "bfd3eaba109c9a2405c92174c8e17f20c2b9caf3" 745 | }, 746 | "dist": { 747 | "type": "zip", 748 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bfd3eaba109c9a2405c92174c8e17f20c2b9caf3", 749 | "reference": "bfd3eaba109c9a2405c92174c8e17f20c2b9caf3", 750 | "shasum": "" 751 | }, 752 | "require": { 753 | "php": ">=5.3.0", 754 | "symfony/translation": "~2.6|~3.0" 755 | }, 756 | "require-dev": { 757 | "phpunit/phpunit": "~4.0" 758 | }, 759 | "type": "library", 760 | "autoload": { 761 | "psr-0": { 762 | "Carbon": "src" 763 | } 764 | }, 765 | "notification-url": "https://packagist.org/downloads/", 766 | "license": [ 767 | "MIT" 768 | ], 769 | "authors": [ 770 | { 771 | "name": "Brian Nesbitt", 772 | "email": "brian@nesbot.com", 773 | "homepage": "http://nesbot.com" 774 | } 775 | ], 776 | "description": "A simple API extension for DateTime.", 777 | "homepage": "http://carbon.nesbot.com", 778 | "keywords": [ 779 | "date", 780 | "datetime", 781 | "time" 782 | ], 783 | "time": "2015-06-25 04:19:39" 784 | }, 785 | { 786 | "name": "nikic/php-parser", 787 | "version": "1.x-dev", 788 | "source": { 789 | "type": "git", 790 | "url": "https://github.com/nikic/PHP-Parser.git", 791 | "reference": "196f177cfefa0f1f7166c0a05d8255889be12418" 792 | }, 793 | "dist": { 794 | "type": "zip", 795 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c4bbc8e236a1f21b2b17cfbf3d46aa6ece69b9f7", 796 | "reference": "196f177cfefa0f1f7166c0a05d8255889be12418", 797 | "shasum": "" 798 | }, 799 | "require": { 800 | "ext-tokenizer": "*", 801 | "php": ">=5.3" 802 | }, 803 | "type": "library", 804 | "extra": { 805 | "branch-alias": { 806 | "dev-master": "1.4-dev" 807 | } 808 | }, 809 | "autoload": { 810 | "files": [ 811 | "lib/bootstrap.php" 812 | ] 813 | }, 814 | "notification-url": "https://packagist.org/downloads/", 815 | "license": [ 816 | "BSD-3-Clause" 817 | ], 818 | "authors": [ 819 | { 820 | "name": "Nikita Popov" 821 | } 822 | ], 823 | "description": "A PHP parser written in PHP", 824 | "keywords": [ 825 | "parser", 826 | "php" 827 | ], 828 | "time": "2015-07-14 17:31:05" 829 | }, 830 | { 831 | "name": "psr/log", 832 | "version": "dev-master", 833 | "source": { 834 | "type": "git", 835 | "url": "https://github.com/php-fig/log.git", 836 | "reference": "9e45edca52cc9c954680072c93e621f8b71fab26" 837 | }, 838 | "dist": { 839 | "type": "zip", 840 | "url": "https://api.github.com/repos/php-fig/log/zipball/d8e60a5619fff77f9669da8997697443ef1a1d7e", 841 | "reference": "9e45edca52cc9c954680072c93e621f8b71fab26", 842 | "shasum": "" 843 | }, 844 | "require": { 845 | "php": ">=5.3.0" 846 | }, 847 | "type": "library", 848 | "extra": { 849 | "branch-alias": { 850 | "dev-master": "1.0.x-dev" 851 | } 852 | }, 853 | "autoload": { 854 | "psr-4": { 855 | "Psr\\Log\\": "Psr/Log/" 856 | } 857 | }, 858 | "notification-url": "https://packagist.org/downloads/", 859 | "license": [ 860 | "MIT" 861 | ], 862 | "authors": [ 863 | { 864 | "name": "PHP-FIG", 865 | "homepage": "http://www.php-fig.org/" 866 | } 867 | ], 868 | "description": "Common interface for logging libraries", 869 | "keywords": [ 870 | "log", 871 | "psr", 872 | "psr-3" 873 | ], 874 | "time": "2015-06-02 13:48:41" 875 | }, 876 | { 877 | "name": "psy/psysh", 878 | "version": "v0.5.2", 879 | "source": { 880 | "type": "git", 881 | "url": "https://github.com/bobthecow/psysh.git", 882 | "reference": "aaf8772ade08b5f0f6830774a5d5c2f800415975" 883 | }, 884 | "dist": { 885 | "type": "zip", 886 | "url": "https://api.github.com/repos/bobthecow/psysh/zipball/aaf8772ade08b5f0f6830774a5d5c2f800415975", 887 | "reference": "aaf8772ade08b5f0f6830774a5d5c2f800415975", 888 | "shasum": "" 889 | }, 890 | "require": { 891 | "dnoegel/php-xdg-base-dir": "0.1", 892 | "jakub-onderka/php-console-highlighter": "0.3.*", 893 | "nikic/php-parser": "^1.2.1", 894 | "php": ">=5.3.9", 895 | "symfony/console": "~2.3.10|^2.4.2|~3.0", 896 | "symfony/var-dumper": "~2.7|~3.0" 897 | }, 898 | "require-dev": { 899 | "fabpot/php-cs-fixer": "~1.5", 900 | "phpunit/phpunit": "~3.7|~4.0", 901 | "squizlabs/php_codesniffer": "~2.0", 902 | "symfony/finder": "~2.1|~3.0" 903 | }, 904 | "suggest": { 905 | "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", 906 | "ext-pdo-sqlite": "The doc command requires SQLite to work.", 907 | "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", 908 | "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." 909 | }, 910 | "bin": [ 911 | "bin/psysh" 912 | ], 913 | "type": "library", 914 | "extra": { 915 | "branch-alias": { 916 | "dev-develop": "0.6.x-dev" 917 | } 918 | }, 919 | "autoload": { 920 | "files": [ 921 | "src/Psy/functions.php" 922 | ], 923 | "psr-0": { 924 | "Psy\\": "src/" 925 | } 926 | }, 927 | "notification-url": "https://packagist.org/downloads/", 928 | "license": [ 929 | "MIT" 930 | ], 931 | "authors": [ 932 | { 933 | "name": "Justin Hileman", 934 | "email": "justin@justinhileman.info", 935 | "homepage": "http://justinhileman.com" 936 | } 937 | ], 938 | "description": "An interactive shell for modern PHP.", 939 | "homepage": "http://psysh.org", 940 | "keywords": [ 941 | "REPL", 942 | "console", 943 | "interactive", 944 | "shell" 945 | ], 946 | "time": "2015-07-16 15:26:57" 947 | }, 948 | { 949 | "name": "squizlabs/php_codesniffer", 950 | "version": "2.3.3", 951 | "source": { 952 | "type": "git", 953 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 954 | "reference": "c1a26c729508f73560c1a4f767f60b8ab6b4a666" 955 | }, 956 | "dist": { 957 | "type": "zip", 958 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/c1a26c729508f73560c1a4f767f60b8ab6b4a666", 959 | "reference": "c1a26c729508f73560c1a4f767f60b8ab6b4a666", 960 | "shasum": "" 961 | }, 962 | "require": { 963 | "ext-tokenizer": "*", 964 | "ext-xmlwriter": "*", 965 | "php": ">=5.1.2" 966 | }, 967 | "bin": [ 968 | "scripts/phpcs", 969 | "scripts/phpcbf" 970 | ], 971 | "type": "library", 972 | "extra": { 973 | "branch-alias": { 974 | "dev-master": "2.0.x-dev" 975 | } 976 | }, 977 | "autoload": { 978 | "classmap": [ 979 | "CodeSniffer.php", 980 | "CodeSniffer/CLI.php", 981 | "CodeSniffer/Exception.php", 982 | "CodeSniffer/File.php", 983 | "CodeSniffer/Fixer.php", 984 | "CodeSniffer/Report.php", 985 | "CodeSniffer/Reporting.php", 986 | "CodeSniffer/Sniff.php", 987 | "CodeSniffer/Tokens.php", 988 | "CodeSniffer/Reports/", 989 | "CodeSniffer/Tokenizers/", 990 | "CodeSniffer/DocGenerators/", 991 | "CodeSniffer/Standards/AbstractPatternSniff.php", 992 | "CodeSniffer/Standards/AbstractScopeSniff.php", 993 | "CodeSniffer/Standards/AbstractVariableSniff.php", 994 | "CodeSniffer/Standards/IncorrectPatternException.php", 995 | "CodeSniffer/Standards/Generic/Sniffs/", 996 | "CodeSniffer/Standards/MySource/Sniffs/", 997 | "CodeSniffer/Standards/PEAR/Sniffs/", 998 | "CodeSniffer/Standards/PSR1/Sniffs/", 999 | "CodeSniffer/Standards/PSR2/Sniffs/", 1000 | "CodeSniffer/Standards/Squiz/Sniffs/", 1001 | "CodeSniffer/Standards/Zend/Sniffs/" 1002 | ] 1003 | }, 1004 | "notification-url": "https://packagist.org/downloads/", 1005 | "license": [ 1006 | "BSD-3-Clause" 1007 | ], 1008 | "authors": [ 1009 | { 1010 | "name": "Greg Sherwood", 1011 | "role": "lead" 1012 | } 1013 | ], 1014 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 1015 | "homepage": "http://www.squizlabs.com/php-codesniffer", 1016 | "keywords": [ 1017 | "phpcs", 1018 | "standards" 1019 | ], 1020 | "time": "2015-06-24 03:16:23" 1021 | }, 1022 | { 1023 | "name": "swiftmailer/swiftmailer", 1024 | "version": "5.x-dev", 1025 | "source": { 1026 | "type": "git", 1027 | "url": "https://github.com/swiftmailer/swiftmailer.git", 1028 | "reference": "caf94ee2473ba6503e411ce3bcbd33b080f1d903" 1029 | }, 1030 | "dist": { 1031 | "type": "zip", 1032 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/fffbc0e2a7e376dbb0a4b5f2ff6847330f20ccf9", 1033 | "reference": "caf94ee2473ba6503e411ce3bcbd33b080f1d903", 1034 | "shasum": "" 1035 | }, 1036 | "require": { 1037 | "php": ">=5.3.3" 1038 | }, 1039 | "require-dev": { 1040 | "mockery/mockery": "~0.9.1,<0.9.4" 1041 | }, 1042 | "type": "library", 1043 | "extra": { 1044 | "branch-alias": { 1045 | "dev-master": "5.4-dev" 1046 | } 1047 | }, 1048 | "autoload": { 1049 | "files": [ 1050 | "lib/swift_required.php" 1051 | ] 1052 | }, 1053 | "notification-url": "https://packagist.org/downloads/", 1054 | "license": [ 1055 | "MIT" 1056 | ], 1057 | "authors": [ 1058 | { 1059 | "name": "Chris Corbyn" 1060 | }, 1061 | { 1062 | "name": "Fabien Potencier", 1063 | "email": "fabien@symfony.com" 1064 | } 1065 | ], 1066 | "description": "Swiftmailer, free feature-rich PHP mailer", 1067 | "homepage": "http://swiftmailer.org", 1068 | "keywords": [ 1069 | "email", 1070 | "mail", 1071 | "mailer" 1072 | ], 1073 | "time": "2015-07-15 23:24:06" 1074 | }, 1075 | { 1076 | "name": "symfony/console", 1077 | "version": "2.7.x-dev", 1078 | "source": { 1079 | "type": "git", 1080 | "url": "https://github.com/symfony/console.git", 1081 | "reference": "6100a40569b2be1b6aba1cc6a92fe6cb71024fc8" 1082 | }, 1083 | "dist": { 1084 | "type": "zip", 1085 | "url": "https://api.github.com/repos/symfony/console/zipball/6100a40569b2be1b6aba1cc6a92fe6cb71024fc8", 1086 | "reference": "89f17d9d36a6bb630a1f2bb2f3adc8ea3dd1849b", 1087 | "shasum": "" 1088 | }, 1089 | "require": { 1090 | "php": ">=5.3.9" 1091 | }, 1092 | "require-dev": { 1093 | "psr/log": "~1.0", 1094 | "symfony/event-dispatcher": "~2.1", 1095 | "symfony/phpunit-bridge": "~2.7", 1096 | "symfony/process": "~2.1" 1097 | }, 1098 | "suggest": { 1099 | "psr/log": "For using the console logger", 1100 | "symfony/event-dispatcher": "", 1101 | "symfony/process": "" 1102 | }, 1103 | "type": "library", 1104 | "extra": { 1105 | "branch-alias": { 1106 | "dev-master": "2.7-dev" 1107 | } 1108 | }, 1109 | "autoload": { 1110 | "psr-4": { 1111 | "Symfony\\Component\\Console\\": "" 1112 | } 1113 | }, 1114 | "notification-url": "https://packagist.org/downloads/", 1115 | "license": [ 1116 | "MIT" 1117 | ], 1118 | "authors": [ 1119 | { 1120 | "name": "Fabien Potencier", 1121 | "email": "fabien@symfony.com" 1122 | }, 1123 | { 1124 | "name": "Symfony Community", 1125 | "homepage": "https://symfony.com/contributors" 1126 | } 1127 | ], 1128 | "description": "Symfony Console Component", 1129 | "homepage": "https://symfony.com", 1130 | "time": "2015-07-26 09:08:49" 1131 | }, 1132 | { 1133 | "name": "symfony/css-selector", 1134 | "version": "2.7.x-dev", 1135 | "source": { 1136 | "type": "git", 1137 | "url": "https://github.com/symfony/css-selector.git", 1138 | "reference": "b6e5e9087ed7affbd4c38948da8f93513a87de43" 1139 | }, 1140 | "dist": { 1141 | "type": "zip", 1142 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/b6e5e9087ed7affbd4c38948da8f93513a87de43", 1143 | "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092", 1144 | "shasum": "" 1145 | }, 1146 | "require": { 1147 | "php": ">=5.3.9" 1148 | }, 1149 | "require-dev": { 1150 | "symfony/phpunit-bridge": "~2.7" 1151 | }, 1152 | "type": "library", 1153 | "extra": { 1154 | "branch-alias": { 1155 | "dev-master": "2.7-dev" 1156 | } 1157 | }, 1158 | "autoload": { 1159 | "psr-4": { 1160 | "Symfony\\Component\\CssSelector\\": "" 1161 | } 1162 | }, 1163 | "notification-url": "https://packagist.org/downloads/", 1164 | "license": [ 1165 | "MIT" 1166 | ], 1167 | "authors": [ 1168 | { 1169 | "name": "Jean-François Simon", 1170 | "email": "jeanfrancois.simon@sensiolabs.com" 1171 | }, 1172 | { 1173 | "name": "Fabien Potencier", 1174 | "email": "fabien@symfony.com" 1175 | }, 1176 | { 1177 | "name": "Symfony Community", 1178 | "homepage": "https://symfony.com/contributors" 1179 | } 1180 | ], 1181 | "description": "Symfony CssSelector Component", 1182 | "homepage": "https://symfony.com", 1183 | "time": "2015-05-15 13:33:16" 1184 | }, 1185 | { 1186 | "name": "symfony/debug", 1187 | "version": "2.7.x-dev", 1188 | "source": { 1189 | "type": "git", 1190 | "url": "https://github.com/symfony/debug.git", 1191 | "reference": "8dc12181610d9f59ef6aae55ddc13a73578608f4" 1192 | }, 1193 | "dist": { 1194 | "type": "zip", 1195 | "url": "https://api.github.com/repos/symfony/debug/zipball/8dc12181610d9f59ef6aae55ddc13a73578608f4", 1196 | "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3", 1197 | "shasum": "" 1198 | }, 1199 | "require": { 1200 | "php": ">=5.3.9", 1201 | "psr/log": "~1.0" 1202 | }, 1203 | "conflict": { 1204 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 1205 | }, 1206 | "require-dev": { 1207 | "symfony/class-loader": "~2.2", 1208 | "symfony/http-foundation": "~2.1", 1209 | "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2", 1210 | "symfony/phpunit-bridge": "~2.7" 1211 | }, 1212 | "suggest": { 1213 | "symfony/http-foundation": "", 1214 | "symfony/http-kernel": "" 1215 | }, 1216 | "type": "library", 1217 | "extra": { 1218 | "branch-alias": { 1219 | "dev-master": "2.7-dev" 1220 | } 1221 | }, 1222 | "autoload": { 1223 | "psr-4": { 1224 | "Symfony\\Component\\Debug\\": "" 1225 | } 1226 | }, 1227 | "notification-url": "https://packagist.org/downloads/", 1228 | "license": [ 1229 | "MIT" 1230 | ], 1231 | "authors": [ 1232 | { 1233 | "name": "Fabien Potencier", 1234 | "email": "fabien@symfony.com" 1235 | }, 1236 | { 1237 | "name": "Symfony Community", 1238 | "homepage": "https://symfony.com/contributors" 1239 | } 1240 | ], 1241 | "description": "Symfony Debug Component", 1242 | "homepage": "https://symfony.com", 1243 | "time": "2015-07-09 16:07:40" 1244 | }, 1245 | { 1246 | "name": "symfony/dom-crawler", 1247 | "version": "2.7.x-dev", 1248 | "source": { 1249 | "type": "git", 1250 | "url": "https://github.com/symfony/dom-crawler.git", 1251 | "reference": "2de9d7d00669b53a7727a706b59d94c302cfe62c" 1252 | }, 1253 | "dist": { 1254 | "type": "zip", 1255 | "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2de9d7d00669b53a7727a706b59d94c302cfe62c", 1256 | "reference": "9dabece63182e95c42b06967a0d929a5df78bc35", 1257 | "shasum": "" 1258 | }, 1259 | "require": { 1260 | "php": ">=5.3.9" 1261 | }, 1262 | "require-dev": { 1263 | "symfony/css-selector": "~2.3", 1264 | "symfony/phpunit-bridge": "~2.7" 1265 | }, 1266 | "suggest": { 1267 | "symfony/css-selector": "" 1268 | }, 1269 | "type": "library", 1270 | "extra": { 1271 | "branch-alias": { 1272 | "dev-master": "2.7-dev" 1273 | } 1274 | }, 1275 | "autoload": { 1276 | "psr-4": { 1277 | "Symfony\\Component\\DomCrawler\\": "" 1278 | } 1279 | }, 1280 | "notification-url": "https://packagist.org/downloads/", 1281 | "license": [ 1282 | "MIT" 1283 | ], 1284 | "authors": [ 1285 | { 1286 | "name": "Fabien Potencier", 1287 | "email": "fabien@symfony.com" 1288 | }, 1289 | { 1290 | "name": "Symfony Community", 1291 | "homepage": "https://symfony.com/contributors" 1292 | } 1293 | ], 1294 | "description": "Symfony DomCrawler Component", 1295 | "homepage": "https://symfony.com", 1296 | "time": "2015-07-09 16:07:40" 1297 | }, 1298 | { 1299 | "name": "symfony/event-dispatcher", 1300 | "version": "2.8.x-dev", 1301 | "source": { 1302 | "type": "git", 1303 | "url": "https://github.com/symfony/event-dispatcher.git", 1304 | "reference": "9116263e778f720dcdecffb8e66c4d6b8b1cfc49" 1305 | }, 1306 | "dist": { 1307 | "type": "zip", 1308 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9116263e778f720dcdecffb8e66c4d6b8b1cfc49", 1309 | "reference": "d7246885b7fe4cb5a2786bda34362d2f0e40b730", 1310 | "shasum": "" 1311 | }, 1312 | "require": { 1313 | "php": ">=5.3.9" 1314 | }, 1315 | "require-dev": { 1316 | "psr/log": "~1.0", 1317 | "symfony/config": "~2.0,>=2.0.5|~3.0.0", 1318 | "symfony/dependency-injection": "~2.6|~3.0.0", 1319 | "symfony/expression-language": "~2.6|~3.0.0", 1320 | "symfony/phpunit-bridge": "~2.7|~3.0.0", 1321 | "symfony/stopwatch": "~2.3|~3.0.0" 1322 | }, 1323 | "suggest": { 1324 | "symfony/dependency-injection": "", 1325 | "symfony/http-kernel": "" 1326 | }, 1327 | "type": "library", 1328 | "extra": { 1329 | "branch-alias": { 1330 | "dev-master": "2.8-dev" 1331 | } 1332 | }, 1333 | "autoload": { 1334 | "psr-4": { 1335 | "Symfony\\Component\\EventDispatcher\\": "" 1336 | } 1337 | }, 1338 | "notification-url": "https://packagist.org/downloads/", 1339 | "license": [ 1340 | "MIT" 1341 | ], 1342 | "authors": [ 1343 | { 1344 | "name": "Fabien Potencier", 1345 | "email": "fabien@symfony.com" 1346 | }, 1347 | { 1348 | "name": "Symfony Community", 1349 | "homepage": "https://symfony.com/contributors" 1350 | } 1351 | ], 1352 | "description": "Symfony EventDispatcher Component", 1353 | "homepage": "https://symfony.com", 1354 | "time": "2015-06-24 15:32:32" 1355 | }, 1356 | { 1357 | "name": "symfony/finder", 1358 | "version": "2.7.x-dev", 1359 | "source": { 1360 | "type": "git", 1361 | "url": "https://github.com/symfony/finder.git", 1362 | "reference": "9387638e290dc53cc759e6356b61174195fd5cb5" 1363 | }, 1364 | "dist": { 1365 | "type": "zip", 1366 | "url": "https://api.github.com/repos/symfony/finder/zipball/9387638e290dc53cc759e6356b61174195fd5cb5", 1367 | "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4", 1368 | "shasum": "" 1369 | }, 1370 | "require": { 1371 | "php": ">=5.3.9" 1372 | }, 1373 | "require-dev": { 1374 | "symfony/phpunit-bridge": "~2.7" 1375 | }, 1376 | "type": "library", 1377 | "extra": { 1378 | "branch-alias": { 1379 | "dev-master": "2.7-dev" 1380 | } 1381 | }, 1382 | "autoload": { 1383 | "psr-4": { 1384 | "Symfony\\Component\\Finder\\": "" 1385 | } 1386 | }, 1387 | "notification-url": "https://packagist.org/downloads/", 1388 | "license": [ 1389 | "MIT" 1390 | ], 1391 | "authors": [ 1392 | { 1393 | "name": "Fabien Potencier", 1394 | "email": "fabien@symfony.com" 1395 | }, 1396 | { 1397 | "name": "Symfony Community", 1398 | "homepage": "https://symfony.com/contributors" 1399 | } 1400 | ], 1401 | "description": "Symfony Finder Component", 1402 | "homepage": "https://symfony.com", 1403 | "time": "2015-07-09 16:07:40" 1404 | }, 1405 | { 1406 | "name": "symfony/http-foundation", 1407 | "version": "2.7.x-dev", 1408 | "source": { 1409 | "type": "git", 1410 | "url": "https://github.com/symfony/http-foundation.git", 1411 | "reference": "80128442fc6a7324536358691909e90a81e9bd94" 1412 | }, 1413 | "dist": { 1414 | "type": "zip", 1415 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/80128442fc6a7324536358691909e90a81e9bd94", 1416 | "reference": "863af6898081b34c65d42100c370b9f3c51b70ca", 1417 | "shasum": "" 1418 | }, 1419 | "require": { 1420 | "php": ">=5.3.9" 1421 | }, 1422 | "require-dev": { 1423 | "symfony/expression-language": "~2.4", 1424 | "symfony/phpunit-bridge": "~2.7" 1425 | }, 1426 | "type": "library", 1427 | "extra": { 1428 | "branch-alias": { 1429 | "dev-master": "2.7-dev" 1430 | } 1431 | }, 1432 | "autoload": { 1433 | "psr-4": { 1434 | "Symfony\\Component\\HttpFoundation\\": "" 1435 | }, 1436 | "classmap": [ 1437 | "Resources/stubs" 1438 | ] 1439 | }, 1440 | "notification-url": "https://packagist.org/downloads/", 1441 | "license": [ 1442 | "MIT" 1443 | ], 1444 | "authors": [ 1445 | { 1446 | "name": "Fabien Potencier", 1447 | "email": "fabien@symfony.com" 1448 | }, 1449 | { 1450 | "name": "Symfony Community", 1451 | "homepage": "https://symfony.com/contributors" 1452 | } 1453 | ], 1454 | "description": "Symfony HttpFoundation Component", 1455 | "homepage": "https://symfony.com", 1456 | "time": "2015-07-22 10:11:00" 1457 | }, 1458 | { 1459 | "name": "symfony/http-kernel", 1460 | "version": "2.7.x-dev", 1461 | "source": { 1462 | "type": "git", 1463 | "url": "https://github.com/symfony/http-kernel.git", 1464 | "reference": "e6813ddb92052ff60e58df70a95631d2cfef5715" 1465 | }, 1466 | "dist": { 1467 | "type": "zip", 1468 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e6813ddb92052ff60e58df70a95631d2cfef5715", 1469 | "reference": "1501b28793f184d3de2ba9985445fa76a7773f7e", 1470 | "shasum": "" 1471 | }, 1472 | "require": { 1473 | "php": ">=5.3.9", 1474 | "psr/log": "~1.0", 1475 | "symfony/debug": "~2.6,>=2.6.2", 1476 | "symfony/event-dispatcher": "~2.6,>=2.6.7", 1477 | "symfony/http-foundation": "~2.5,>=2.5.4" 1478 | }, 1479 | "conflict": { 1480 | "symfony/config": "<2.7" 1481 | }, 1482 | "require-dev": { 1483 | "symfony/browser-kit": "~2.3", 1484 | "symfony/class-loader": "~2.1", 1485 | "symfony/config": "~2.7", 1486 | "symfony/console": "~2.3", 1487 | "symfony/css-selector": "~2.0,>=2.0.5", 1488 | "symfony/dependency-injection": "~2.2", 1489 | "symfony/dom-crawler": "~2.0,>=2.0.5", 1490 | "symfony/expression-language": "~2.4", 1491 | "symfony/finder": "~2.0,>=2.0.5", 1492 | "symfony/phpunit-bridge": "~2.7", 1493 | "symfony/process": "~2.0,>=2.0.5", 1494 | "symfony/routing": "~2.2", 1495 | "symfony/stopwatch": "~2.3", 1496 | "symfony/templating": "~2.2", 1497 | "symfony/translation": "~2.0,>=2.0.5", 1498 | "symfony/var-dumper": "~2.6" 1499 | }, 1500 | "suggest": { 1501 | "symfony/browser-kit": "", 1502 | "symfony/class-loader": "", 1503 | "symfony/config": "", 1504 | "symfony/console": "", 1505 | "symfony/dependency-injection": "", 1506 | "symfony/finder": "", 1507 | "symfony/var-dumper": "" 1508 | }, 1509 | "type": "library", 1510 | "extra": { 1511 | "branch-alias": { 1512 | "dev-master": "2.7-dev" 1513 | } 1514 | }, 1515 | "autoload": { 1516 | "psr-4": { 1517 | "Symfony\\Component\\HttpKernel\\": "" 1518 | } 1519 | }, 1520 | "notification-url": "https://packagist.org/downloads/", 1521 | "license": [ 1522 | "MIT" 1523 | ], 1524 | "authors": [ 1525 | { 1526 | "name": "Fabien Potencier", 1527 | "email": "fabien@symfony.com" 1528 | }, 1529 | { 1530 | "name": "Symfony Community", 1531 | "homepage": "https://symfony.com/contributors" 1532 | } 1533 | ], 1534 | "description": "Symfony HttpKernel Component", 1535 | "homepage": "https://symfony.com", 1536 | "time": "2015-07-24 08:19:55" 1537 | }, 1538 | { 1539 | "name": "symfony/process", 1540 | "version": "2.7.x-dev", 1541 | "source": { 1542 | "type": "git", 1543 | "url": "https://github.com/symfony/process.git", 1544 | "reference": "cba2f70dc10aef30e1517008c1a63d25aec912e1" 1545 | }, 1546 | "dist": { 1547 | "type": "zip", 1548 | "url": "https://api.github.com/repos/symfony/process/zipball/cba2f70dc10aef30e1517008c1a63d25aec912e1", 1549 | "reference": "48aeb0e48600321c272955132d7606ab0a49adb3", 1550 | "shasum": "" 1551 | }, 1552 | "require": { 1553 | "php": ">=5.3.9" 1554 | }, 1555 | "require-dev": { 1556 | "symfony/phpunit-bridge": "~2.7" 1557 | }, 1558 | "type": "library", 1559 | "extra": { 1560 | "branch-alias": { 1561 | "dev-master": "2.7-dev" 1562 | } 1563 | }, 1564 | "autoload": { 1565 | "psr-4": { 1566 | "Symfony\\Component\\Process\\": "" 1567 | } 1568 | }, 1569 | "notification-url": "https://packagist.org/downloads/", 1570 | "license": [ 1571 | "MIT" 1572 | ], 1573 | "authors": [ 1574 | { 1575 | "name": "Fabien Potencier", 1576 | "email": "fabien@symfony.com" 1577 | }, 1578 | { 1579 | "name": "Symfony Community", 1580 | "homepage": "https://symfony.com/contributors" 1581 | } 1582 | ], 1583 | "description": "Symfony Process Component", 1584 | "homepage": "https://symfony.com", 1585 | "time": "2015-07-01 11:25:50" 1586 | }, 1587 | { 1588 | "name": "symfony/routing", 1589 | "version": "2.7.x-dev", 1590 | "source": { 1591 | "type": "git", 1592 | "url": "https://github.com/symfony/routing.git", 1593 | "reference": "c65267dcb9c4dceccb2b61effecc4b8673c0918e" 1594 | }, 1595 | "dist": { 1596 | "type": "zip", 1597 | "url": "https://api.github.com/repos/symfony/routing/zipball/c65267dcb9c4dceccb2b61effecc4b8673c0918e", 1598 | "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26", 1599 | "shasum": "" 1600 | }, 1601 | "require": { 1602 | "php": ">=5.3.9" 1603 | }, 1604 | "conflict": { 1605 | "symfony/config": "<2.7" 1606 | }, 1607 | "require-dev": { 1608 | "doctrine/annotations": "~1.0", 1609 | "doctrine/common": "~2.2", 1610 | "psr/log": "~1.0", 1611 | "symfony/config": "~2.7", 1612 | "symfony/expression-language": "~2.4", 1613 | "symfony/http-foundation": "~2.3", 1614 | "symfony/phpunit-bridge": "~2.7", 1615 | "symfony/yaml": "~2.0,>=2.0.5" 1616 | }, 1617 | "suggest": { 1618 | "doctrine/annotations": "For using the annotation loader", 1619 | "symfony/config": "For using the all-in-one router or any loader", 1620 | "symfony/expression-language": "For using expression matching", 1621 | "symfony/yaml": "For using the YAML loader" 1622 | }, 1623 | "type": "library", 1624 | "extra": { 1625 | "branch-alias": { 1626 | "dev-master": "2.7-dev" 1627 | } 1628 | }, 1629 | "autoload": { 1630 | "psr-4": { 1631 | "Symfony\\Component\\Routing\\": "" 1632 | } 1633 | }, 1634 | "notification-url": "https://packagist.org/downloads/", 1635 | "license": [ 1636 | "MIT" 1637 | ], 1638 | "authors": [ 1639 | { 1640 | "name": "Fabien Potencier", 1641 | "email": "fabien@symfony.com" 1642 | }, 1643 | { 1644 | "name": "Symfony Community", 1645 | "homepage": "https://symfony.com/contributors" 1646 | } 1647 | ], 1648 | "description": "Symfony Routing Component", 1649 | "homepage": "https://symfony.com", 1650 | "keywords": [ 1651 | "router", 1652 | "routing", 1653 | "uri", 1654 | "url" 1655 | ], 1656 | "time": "2015-07-09 16:07:40" 1657 | }, 1658 | { 1659 | "name": "symfony/translation", 1660 | "version": "2.7.x-dev", 1661 | "source": { 1662 | "type": "git", 1663 | "url": "https://github.com/symfony/translation.git", 1664 | "reference": "2db15c3a9409aa357e109ca729c89839b32e3517" 1665 | }, 1666 | "dist": { 1667 | "type": "zip", 1668 | "url": "https://api.github.com/repos/symfony/translation/zipball/2db15c3a9409aa357e109ca729c89839b32e3517", 1669 | "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6", 1670 | "shasum": "" 1671 | }, 1672 | "require": { 1673 | "php": ">=5.3.9" 1674 | }, 1675 | "conflict": { 1676 | "symfony/config": "<2.7" 1677 | }, 1678 | "require-dev": { 1679 | "psr/log": "~1.0", 1680 | "symfony/config": "~2.7", 1681 | "symfony/intl": "~2.3", 1682 | "symfony/phpunit-bridge": "~2.7", 1683 | "symfony/yaml": "~2.2" 1684 | }, 1685 | "suggest": { 1686 | "psr/log": "To use logging capability in translator", 1687 | "symfony/config": "", 1688 | "symfony/yaml": "" 1689 | }, 1690 | "type": "library", 1691 | "extra": { 1692 | "branch-alias": { 1693 | "dev-master": "2.7-dev" 1694 | } 1695 | }, 1696 | "autoload": { 1697 | "psr-4": { 1698 | "Symfony\\Component\\Translation\\": "" 1699 | } 1700 | }, 1701 | "notification-url": "https://packagist.org/downloads/", 1702 | "license": [ 1703 | "MIT" 1704 | ], 1705 | "authors": [ 1706 | { 1707 | "name": "Fabien Potencier", 1708 | "email": "fabien@symfony.com" 1709 | }, 1710 | { 1711 | "name": "Symfony Community", 1712 | "homepage": "https://symfony.com/contributors" 1713 | } 1714 | ], 1715 | "description": "Symfony Translation Component", 1716 | "homepage": "https://symfony.com", 1717 | "time": "2015-07-09 16:07:40" 1718 | }, 1719 | { 1720 | "name": "symfony/var-dumper", 1721 | "version": "2.7.x-dev", 1722 | "source": { 1723 | "type": "git", 1724 | "url": "https://github.com/symfony/var-dumper.git", 1725 | "reference": "fde603d9f4b2418ff0f0315b93eb039c9aa41205" 1726 | }, 1727 | "dist": { 1728 | "type": "zip", 1729 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c88d135c41c10d178e9724c69cbf699c5112883d", 1730 | "reference": "fde603d9f4b2418ff0f0315b93eb039c9aa41205", 1731 | "shasum": "" 1732 | }, 1733 | "require": { 1734 | "php": ">=5.3.9" 1735 | }, 1736 | "require-dev": { 1737 | "symfony/phpunit-bridge": "~2.7" 1738 | }, 1739 | "suggest": { 1740 | "ext-symfony_debug": "" 1741 | }, 1742 | "type": "library", 1743 | "extra": { 1744 | "branch-alias": { 1745 | "dev-master": "2.7-dev" 1746 | } 1747 | }, 1748 | "autoload": { 1749 | "files": [ 1750 | "Resources/functions/dump.php" 1751 | ], 1752 | "psr-4": { 1753 | "Symfony\\Component\\VarDumper\\": "" 1754 | } 1755 | }, 1756 | "notification-url": "https://packagist.org/downloads/", 1757 | "license": [ 1758 | "MIT" 1759 | ], 1760 | "authors": [ 1761 | { 1762 | "name": "Nicolas Grekas", 1763 | "email": "p@tchwork.com" 1764 | }, 1765 | { 1766 | "name": "Symfony Community", 1767 | "homepage": "https://symfony.com/contributors" 1768 | } 1769 | ], 1770 | "description": "Symfony mechanism for exploring and dumping PHP variables", 1771 | "homepage": "https://symfony.com", 1772 | "keywords": [ 1773 | "debug", 1774 | "dump" 1775 | ], 1776 | "time": "2015-07-01 12:07:40" 1777 | }, 1778 | { 1779 | "name": "vlucas/phpdotenv", 1780 | "version": "dev-master", 1781 | "source": { 1782 | "type": "git", 1783 | "url": "https://github.com/vlucas/phpdotenv.git", 1784 | "reference": "ae388efe53a2c352ddd270f4d316bad58952b8e3" 1785 | }, 1786 | "dist": { 1787 | "type": "zip", 1788 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/11a353b704488944a7477b229d119fe1cfa56f68", 1789 | "reference": "ae388efe53a2c352ddd270f4d316bad58952b8e3", 1790 | "shasum": "" 1791 | }, 1792 | "require": { 1793 | "php": ">=5.3.9" 1794 | }, 1795 | "require-dev": { 1796 | "phpunit/phpunit": "~4.0" 1797 | }, 1798 | "type": "library", 1799 | "extra": { 1800 | "branch-alias": { 1801 | "dev-master": "1.1-dev" 1802 | } 1803 | }, 1804 | "autoload": { 1805 | "psr-0": { 1806 | "Dotenv": "src/" 1807 | } 1808 | }, 1809 | "notification-url": "https://packagist.org/downloads/", 1810 | "license": [ 1811 | "BSD" 1812 | ], 1813 | "authors": [ 1814 | { 1815 | "name": "Vance Lucas", 1816 | "email": "vance@vancelucas.com", 1817 | "homepage": "http://www.vancelucas.com" 1818 | } 1819 | ], 1820 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 1821 | "homepage": "http://github.com/vlucas/phpdotenv", 1822 | "keywords": [ 1823 | "dotenv", 1824 | "env", 1825 | "environment" 1826 | ], 1827 | "time": "2015-02-19 20:37:05" 1828 | } 1829 | ], 1830 | "packages-dev": [ 1831 | { 1832 | "name": "doctrine/instantiator", 1833 | "version": "dev-master", 1834 | "source": { 1835 | "type": "git", 1836 | "url": "https://github.com/doctrine/instantiator.git", 1837 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 1838 | }, 1839 | "dist": { 1840 | "type": "zip", 1841 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 1842 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 1843 | "shasum": "" 1844 | }, 1845 | "require": { 1846 | "php": ">=5.3,<8.0-DEV" 1847 | }, 1848 | "require-dev": { 1849 | "athletic/athletic": "~0.1.8", 1850 | "ext-pdo": "*", 1851 | "ext-phar": "*", 1852 | "phpunit/phpunit": "~4.0", 1853 | "squizlabs/php_codesniffer": "~2.0" 1854 | }, 1855 | "type": "library", 1856 | "extra": { 1857 | "branch-alias": { 1858 | "dev-master": "1.0.x-dev" 1859 | } 1860 | }, 1861 | "autoload": { 1862 | "psr-4": { 1863 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 1864 | } 1865 | }, 1866 | "notification-url": "https://packagist.org/downloads/", 1867 | "license": [ 1868 | "MIT" 1869 | ], 1870 | "authors": [ 1871 | { 1872 | "name": "Marco Pivetta", 1873 | "email": "ocramius@gmail.com", 1874 | "homepage": "http://ocramius.github.com/" 1875 | } 1876 | ], 1877 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 1878 | "homepage": "https://github.com/doctrine/instantiator", 1879 | "keywords": [ 1880 | "constructor", 1881 | "instantiate" 1882 | ], 1883 | "time": "2015-06-14 21:17:01" 1884 | }, 1885 | { 1886 | "name": "phpdocumentor/reflection-common", 1887 | "version": "dev-master", 1888 | "source": { 1889 | "type": "git", 1890 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 1891 | "reference": "e5d252e92d5b975ff2c2efb00b2ebd083ab4bf2c" 1892 | }, 1893 | "dist": { 1894 | "type": "zip", 1895 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 1896 | "reference": "e5d252e92d5b975ff2c2efb00b2ebd083ab4bf2c", 1897 | "shasum": "" 1898 | }, 1899 | "require": { 1900 | "php": ">=5.5" 1901 | }, 1902 | "require-dev": { 1903 | "phpunit/phpunit": "^4.6" 1904 | }, 1905 | "type": "library", 1906 | "extra": { 1907 | "branch-alias": { 1908 | "dev-master": "1.0.x-dev" 1909 | } 1910 | }, 1911 | "autoload": { 1912 | "psr-4": { 1913 | "phpDocumentor\\Reflection\\": [ 1914 | "src" 1915 | ] 1916 | } 1917 | }, 1918 | "notification-url": "https://packagist.org/downloads/", 1919 | "license": [ 1920 | "MIT" 1921 | ], 1922 | "authors": [ 1923 | { 1924 | "name": "Jaap van Otterdijk", 1925 | "email": "opensource@ijaap.nl" 1926 | } 1927 | ], 1928 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1929 | "homepage": "http://www.phpdoc.org", 1930 | "keywords": [ 1931 | "FQSEN", 1932 | "phpDocumentor", 1933 | "phpdoc", 1934 | "reflection", 1935 | "static analysis" 1936 | ], 1937 | "time": "2015-07-02 18:59:23" 1938 | }, 1939 | { 1940 | "name": "phpdocumentor/reflection-docblock", 1941 | "version": "dev-master", 1942 | "source": { 1943 | "type": "git", 1944 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1945 | "reference": "d1da796ba5565789a623052eb9f2cf59d57fec60" 1946 | }, 1947 | "dist": { 1948 | "type": "zip", 1949 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d1da796ba5565789a623052eb9f2cf59d57fec60", 1950 | "reference": "d1da796ba5565789a623052eb9f2cf59d57fec60", 1951 | "shasum": "" 1952 | }, 1953 | "require": { 1954 | "php": ">=5.5", 1955 | "phpdocumentor/reflection-common": "^1.0@dev", 1956 | "phpdocumentor/type-resolver": "^0.1.2", 1957 | "webmozart/assert": "^1.0" 1958 | }, 1959 | "require-dev": { 1960 | "phpunit/phpunit": "~4.0" 1961 | }, 1962 | "suggest": { 1963 | "dflydev/markdown": "~1.0", 1964 | "erusev/parsedown": "~1.0", 1965 | "league/commonmark": "*" 1966 | }, 1967 | "type": "library", 1968 | "extra": { 1969 | "branch-alias": { 1970 | "dev-master": "2.0.x-dev" 1971 | } 1972 | }, 1973 | "autoload": { 1974 | "psr-0": { 1975 | "phpDocumentor": [ 1976 | "src/" 1977 | ] 1978 | } 1979 | }, 1980 | "notification-url": "https://packagist.org/downloads/", 1981 | "license": [ 1982 | "MIT" 1983 | ], 1984 | "authors": [ 1985 | { 1986 | "name": "Mike van Riel", 1987 | "email": "mike.vanriel@naenius.com" 1988 | } 1989 | ], 1990 | "time": "2015-02-27 09:28:18" 1991 | }, 1992 | { 1993 | "name": "phpdocumentor/type-resolver", 1994 | "version": "0.1.4", 1995 | "source": { 1996 | "type": "git", 1997 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1998 | "reference": "14bb2da6387c6a58648b4a87ff02d4c971050309" 1999 | }, 2000 | "dist": { 2001 | "type": "zip", 2002 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/14bb2da6387c6a58648b4a87ff02d4c971050309", 2003 | "reference": "14bb2da6387c6a58648b4a87ff02d4c971050309", 2004 | "shasum": "" 2005 | }, 2006 | "require": { 2007 | "php": ">=5.5", 2008 | "phpdocumentor/reflection-common": "^1.0@dev" 2009 | }, 2010 | "require-dev": { 2011 | "mockery/mockery": "^0.9.4", 2012 | "phpunit/phpunit": "^4.6" 2013 | }, 2014 | "type": "library", 2015 | "extra": { 2016 | "branch-alias": { 2017 | "dev-master": "1.0.x-dev" 2018 | } 2019 | }, 2020 | "autoload": { 2021 | "psr-4": { 2022 | "phpDocumentor\\Reflection\\": [ 2023 | "src/" 2024 | ] 2025 | } 2026 | }, 2027 | "notification-url": "https://packagist.org/downloads/", 2028 | "license": [ 2029 | "MIT" 2030 | ], 2031 | "authors": [ 2032 | { 2033 | "name": "Mike van Riel", 2034 | "email": "me@mikevanriel.com" 2035 | } 2036 | ], 2037 | "time": "2015-07-02 17:28:34" 2038 | }, 2039 | { 2040 | "name": "phpspec/php-diff", 2041 | "version": "v1.0.2", 2042 | "source": { 2043 | "type": "git", 2044 | "url": "https://github.com/phpspec/php-diff.git", 2045 | "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" 2046 | }, 2047 | "dist": { 2048 | "type": "zip", 2049 | "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", 2050 | "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", 2051 | "shasum": "" 2052 | }, 2053 | "type": "library", 2054 | "autoload": { 2055 | "psr-0": { 2056 | "Diff": "lib/" 2057 | } 2058 | }, 2059 | "notification-url": "https://packagist.org/downloads/", 2060 | "license": [ 2061 | "BSD-3-Clause" 2062 | ], 2063 | "authors": [ 2064 | { 2065 | "name": "Chris Boulton", 2066 | "homepage": "http://github.com/chrisboulton", 2067 | "role": "Original developer" 2068 | } 2069 | ], 2070 | "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", 2071 | "time": "2013-11-01 13:02:21" 2072 | }, 2073 | { 2074 | "name": "phpspec/phpspec", 2075 | "version": "2.3.0-beta", 2076 | "source": { 2077 | "type": "git", 2078 | "url": "https://github.com/phpspec/phpspec.git", 2079 | "reference": "5858b8b111023248ff8e9fc50e914c54118cd3ff" 2080 | }, 2081 | "dist": { 2082 | "type": "zip", 2083 | "url": "https://api.github.com/repos/phpspec/phpspec/zipball/5858b8b111023248ff8e9fc50e914c54118cd3ff", 2084 | "reference": "5858b8b111023248ff8e9fc50e914c54118cd3ff", 2085 | "shasum": "" 2086 | }, 2087 | "require": { 2088 | "doctrine/instantiator": "^1.0.1", 2089 | "php": ">=5.3.3", 2090 | "phpspec/php-diff": "~1.0.0", 2091 | "phpspec/prophecy": "~1.4", 2092 | "sebastian/exporter": "~1.0", 2093 | "symfony/console": "~2.3", 2094 | "symfony/event-dispatcher": "~2.1", 2095 | "symfony/finder": "~2.1", 2096 | "symfony/process": "~2.1", 2097 | "symfony/yaml": "~2.1" 2098 | }, 2099 | "require-dev": { 2100 | "behat/behat": "^3.0.11", 2101 | "bossa/phpspec2-expect": "~1.0", 2102 | "phpunit/phpunit": "~4.4", 2103 | "symfony/filesystem": "~2.1", 2104 | "symfony/process": "~2.1" 2105 | }, 2106 | "suggest": { 2107 | "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters" 2108 | }, 2109 | "bin": [ 2110 | "bin/phpspec" 2111 | ], 2112 | "type": "library", 2113 | "extra": { 2114 | "branch-alias": { 2115 | "dev-master": "2.2.x-dev" 2116 | } 2117 | }, 2118 | "autoload": { 2119 | "psr-0": { 2120 | "PhpSpec": "src/" 2121 | } 2122 | }, 2123 | "notification-url": "https://packagist.org/downloads/", 2124 | "license": [ 2125 | "MIT" 2126 | ], 2127 | "authors": [ 2128 | { 2129 | "name": "Konstantin Kudryashov", 2130 | "email": "ever.zet@gmail.com", 2131 | "homepage": "http://everzet.com" 2132 | }, 2133 | { 2134 | "name": "Marcello Duarte", 2135 | "homepage": "http://marcelloduarte.net/" 2136 | } 2137 | ], 2138 | "description": "Specification-oriented BDD framework for PHP 5.3+", 2139 | "homepage": "http://phpspec.net/", 2140 | "keywords": [ 2141 | "BDD", 2142 | "SpecBDD", 2143 | "TDD", 2144 | "spec", 2145 | "specification", 2146 | "testing", 2147 | "tests" 2148 | ], 2149 | "time": "2015-07-04 10:12:31" 2150 | }, 2151 | { 2152 | "name": "phpspec/prophecy", 2153 | "version": "dev-master", 2154 | "source": { 2155 | "type": "git", 2156 | "url": "https://github.com/phpspec/prophecy.git", 2157 | "reference": "5700f75b23b0dd3495c0f495fe33a5e6717ee160" 2158 | }, 2159 | "dist": { 2160 | "type": "zip", 2161 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b02221e42163be673f9b44a0bc92a8b4907a7c6d", 2162 | "reference": "5700f75b23b0dd3495c0f495fe33a5e6717ee160", 2163 | "shasum": "" 2164 | }, 2165 | "require": { 2166 | "doctrine/instantiator": "^1.0.2", 2167 | "phpdocumentor/reflection-docblock": "~2.0", 2168 | "sebastian/comparator": "~1.1" 2169 | }, 2170 | "require-dev": { 2171 | "phpspec/phpspec": "~2.0" 2172 | }, 2173 | "type": "library", 2174 | "extra": { 2175 | "branch-alias": { 2176 | "dev-master": "1.4.x-dev" 2177 | } 2178 | }, 2179 | "autoload": { 2180 | "psr-0": { 2181 | "Prophecy\\": "src/" 2182 | } 2183 | }, 2184 | "notification-url": "https://packagist.org/downloads/", 2185 | "license": [ 2186 | "MIT" 2187 | ], 2188 | "authors": [ 2189 | { 2190 | "name": "Konstantin Kudryashov", 2191 | "email": "ever.zet@gmail.com", 2192 | "homepage": "http://everzet.com" 2193 | }, 2194 | { 2195 | "name": "Marcello Duarte", 2196 | "email": "marcello.duarte@gmail.com" 2197 | } 2198 | ], 2199 | "description": "Highly opinionated mocking framework for PHP 5.3+", 2200 | "homepage": "https://github.com/phpspec/prophecy", 2201 | "keywords": [ 2202 | "Double", 2203 | "Dummy", 2204 | "fake", 2205 | "mock", 2206 | "spy", 2207 | "stub" 2208 | ], 2209 | "time": "2015-06-30 10:26:46" 2210 | }, 2211 | { 2212 | "name": "phpunit/php-code-coverage", 2213 | "version": "dev-master", 2214 | "source": { 2215 | "type": "git", 2216 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 2217 | "reference": "48bea1f4aa5fe4eb5547bb578bca39a5b2431915" 2218 | }, 2219 | "dist": { 2220 | "type": "zip", 2221 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9b2a050b8ee982bf4132fa5c8b381f33c7416f2b", 2222 | "reference": "48bea1f4aa5fe4eb5547bb578bca39a5b2431915", 2223 | "shasum": "" 2224 | }, 2225 | "require": { 2226 | "php": ">=5.3.3", 2227 | "phpunit/php-file-iterator": "~1.3", 2228 | "phpunit/php-text-template": "~1.2", 2229 | "phpunit/php-token-stream": "~1.3", 2230 | "sebastian/environment": "~1.3", 2231 | "sebastian/version": "~1.0" 2232 | }, 2233 | "require-dev": { 2234 | "ext-xdebug": ">=2.1.4", 2235 | "phpunit/phpunit": "~4" 2236 | }, 2237 | "suggest": { 2238 | "ext-dom": "*", 2239 | "ext-xdebug": ">=2.2.1", 2240 | "ext-xmlwriter": "*" 2241 | }, 2242 | "type": "library", 2243 | "extra": { 2244 | "branch-alias": { 2245 | "dev-master": "2.2.x-dev" 2246 | } 2247 | }, 2248 | "autoload": { 2249 | "classmap": [ 2250 | "src/" 2251 | ] 2252 | }, 2253 | "notification-url": "https://packagist.org/downloads/", 2254 | "license": [ 2255 | "BSD-3-Clause" 2256 | ], 2257 | "authors": [ 2258 | { 2259 | "name": "Sebastian Bergmann", 2260 | "email": "sb@sebastian-bergmann.de", 2261 | "role": "lead" 2262 | } 2263 | ], 2264 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2265 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2266 | "keywords": [ 2267 | "coverage", 2268 | "testing", 2269 | "xunit" 2270 | ], 2271 | "time": "2015-07-26 09:20:10" 2272 | }, 2273 | { 2274 | "name": "phpunit/php-file-iterator", 2275 | "version": "dev-master", 2276 | "source": { 2277 | "type": "git", 2278 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2279 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" 2280 | }, 2281 | "dist": { 2282 | "type": "zip", 2283 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 2284 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 2285 | "shasum": "" 2286 | }, 2287 | "require": { 2288 | "php": ">=5.3.3" 2289 | }, 2290 | "type": "library", 2291 | "extra": { 2292 | "branch-alias": { 2293 | "dev-master": "1.4.x-dev" 2294 | } 2295 | }, 2296 | "autoload": { 2297 | "classmap": [ 2298 | "src/" 2299 | ] 2300 | }, 2301 | "notification-url": "https://packagist.org/downloads/", 2302 | "license": [ 2303 | "BSD-3-Clause" 2304 | ], 2305 | "authors": [ 2306 | { 2307 | "name": "Sebastian Bergmann", 2308 | "email": "sb@sebastian-bergmann.de", 2309 | "role": "lead" 2310 | } 2311 | ], 2312 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2313 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2314 | "keywords": [ 2315 | "filesystem", 2316 | "iterator" 2317 | ], 2318 | "time": "2015-06-21 13:08:43" 2319 | }, 2320 | { 2321 | "name": "phpunit/php-text-template", 2322 | "version": "1.2.1", 2323 | "source": { 2324 | "type": "git", 2325 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2326 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2327 | }, 2328 | "dist": { 2329 | "type": "zip", 2330 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2331 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2332 | "shasum": "" 2333 | }, 2334 | "require": { 2335 | "php": ">=5.3.3" 2336 | }, 2337 | "type": "library", 2338 | "autoload": { 2339 | "classmap": [ 2340 | "src/" 2341 | ] 2342 | }, 2343 | "notification-url": "https://packagist.org/downloads/", 2344 | "license": [ 2345 | "BSD-3-Clause" 2346 | ], 2347 | "authors": [ 2348 | { 2349 | "name": "Sebastian Bergmann", 2350 | "email": "sebastian@phpunit.de", 2351 | "role": "lead" 2352 | } 2353 | ], 2354 | "description": "Simple template engine.", 2355 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2356 | "keywords": [ 2357 | "template" 2358 | ], 2359 | "time": "2015-06-21 13:50:34" 2360 | }, 2361 | { 2362 | "name": "phpunit/php-timer", 2363 | "version": "dev-master", 2364 | "source": { 2365 | "type": "git", 2366 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2367 | "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" 2368 | }, 2369 | "dist": { 2370 | "type": "zip", 2371 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", 2372 | "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", 2373 | "shasum": "" 2374 | }, 2375 | "require": { 2376 | "php": ">=5.3.3" 2377 | }, 2378 | "type": "library", 2379 | "autoload": { 2380 | "classmap": [ 2381 | "src/" 2382 | ] 2383 | }, 2384 | "notification-url": "https://packagist.org/downloads/", 2385 | "license": [ 2386 | "BSD-3-Clause" 2387 | ], 2388 | "authors": [ 2389 | { 2390 | "name": "Sebastian Bergmann", 2391 | "email": "sb@sebastian-bergmann.de", 2392 | "role": "lead" 2393 | } 2394 | ], 2395 | "description": "Utility class for timing", 2396 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 2397 | "keywords": [ 2398 | "timer" 2399 | ], 2400 | "time": "2015-06-21 08:01:12" 2401 | }, 2402 | { 2403 | "name": "phpunit/php-token-stream", 2404 | "version": "dev-master", 2405 | "source": { 2406 | "type": "git", 2407 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 2408 | "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9" 2409 | }, 2410 | "dist": { 2411 | "type": "zip", 2412 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/cab6c6fefee93d7b7c3a01292a0fe0884ea66644", 2413 | "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9", 2414 | "shasum": "" 2415 | }, 2416 | "require": { 2417 | "ext-tokenizer": "*", 2418 | "php": ">=5.3.3" 2419 | }, 2420 | "require-dev": { 2421 | "phpunit/phpunit": "~4.2" 2422 | }, 2423 | "type": "library", 2424 | "extra": { 2425 | "branch-alias": { 2426 | "dev-master": "1.4-dev" 2427 | } 2428 | }, 2429 | "autoload": { 2430 | "classmap": [ 2431 | "src/" 2432 | ] 2433 | }, 2434 | "notification-url": "https://packagist.org/downloads/", 2435 | "license": [ 2436 | "BSD-3-Clause" 2437 | ], 2438 | "authors": [ 2439 | { 2440 | "name": "Sebastian Bergmann", 2441 | "email": "sebastian@phpunit.de" 2442 | } 2443 | ], 2444 | "description": "Wrapper around PHP's tokenizer extension.", 2445 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 2446 | "keywords": [ 2447 | "tokenizer" 2448 | ], 2449 | "time": "2015-06-19 03:43:16" 2450 | }, 2451 | { 2452 | "name": "phpunit/phpunit", 2453 | "version": "4.8.x-dev", 2454 | "source": { 2455 | "type": "git", 2456 | "url": "https://github.com/sebastianbergmann/phpunit.git", 2457 | "reference": "21b64e299bc68a9fed8f5107794acee6f0b657fb" 2458 | }, 2459 | "dist": { 2460 | "type": "zip", 2461 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7718ed2bbb019dc17a802ef035a461eaac9858fa", 2462 | "reference": "21b64e299bc68a9fed8f5107794acee6f0b657fb", 2463 | "shasum": "" 2464 | }, 2465 | "require": { 2466 | "ext-dom": "*", 2467 | "ext-json": "*", 2468 | "ext-pcre": "*", 2469 | "ext-reflection": "*", 2470 | "ext-spl": "*", 2471 | "php": ">=5.3.3", 2472 | "phpspec/prophecy": "~1.3,>=1.3.1", 2473 | "phpunit/php-code-coverage": "~2.1", 2474 | "phpunit/php-file-iterator": "~1.4", 2475 | "phpunit/php-text-template": "~1.2", 2476 | "phpunit/php-timer": ">=1.0.6", 2477 | "phpunit/phpunit-mock-objects": "~2.3", 2478 | "sebastian/comparator": "~1.1", 2479 | "sebastian/diff": "~1.2", 2480 | "sebastian/environment": "~1.3", 2481 | "sebastian/exporter": "~1.2", 2482 | "sebastian/global-state": "~1.0", 2483 | "sebastian/version": "~1.0", 2484 | "symfony/yaml": "~2.1|~3.0" 2485 | }, 2486 | "suggest": { 2487 | "phpunit/php-invoker": "~1.1" 2488 | }, 2489 | "bin": [ 2490 | "phpunit" 2491 | ], 2492 | "type": "library", 2493 | "extra": { 2494 | "branch-alias": { 2495 | "dev-master": "4.8.x-dev" 2496 | } 2497 | }, 2498 | "autoload": { 2499 | "classmap": [ 2500 | "src/" 2501 | ] 2502 | }, 2503 | "notification-url": "https://packagist.org/downloads/", 2504 | "license": [ 2505 | "BSD-3-Clause" 2506 | ], 2507 | "authors": [ 2508 | { 2509 | "name": "Sebastian Bergmann", 2510 | "email": "sebastian@phpunit.de", 2511 | "role": "lead" 2512 | } 2513 | ], 2514 | "description": "The PHP Unit Testing framework.", 2515 | "homepage": "https://phpunit.de/", 2516 | "keywords": [ 2517 | "phpunit", 2518 | "testing", 2519 | "xunit" 2520 | ], 2521 | "time": "2015-07-26 12:57:56" 2522 | }, 2523 | { 2524 | "name": "phpunit/phpunit-mock-objects", 2525 | "version": "2.3.x-dev", 2526 | "source": { 2527 | "type": "git", 2528 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 2529 | "reference": "18dfbcb81d05e2296c0bcddd4db96cade75e6f42" 2530 | }, 2531 | "dist": { 2532 | "type": "zip", 2533 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", 2534 | "reference": "18dfbcb81d05e2296c0bcddd4db96cade75e6f42", 2535 | "shasum": "" 2536 | }, 2537 | "require": { 2538 | "doctrine/instantiator": "~1.0,>=1.0.2", 2539 | "php": ">=5.3.3", 2540 | "phpunit/php-text-template": "~1.2", 2541 | "sebastian/exporter": "~1.2" 2542 | }, 2543 | "require-dev": { 2544 | "phpunit/phpunit": "~4.4" 2545 | }, 2546 | "suggest": { 2547 | "ext-soap": "*" 2548 | }, 2549 | "type": "library", 2550 | "extra": { 2551 | "branch-alias": { 2552 | "dev-master": "2.3.x-dev" 2553 | } 2554 | }, 2555 | "autoload": { 2556 | "classmap": [ 2557 | "src/" 2558 | ] 2559 | }, 2560 | "notification-url": "https://packagist.org/downloads/", 2561 | "license": [ 2562 | "BSD-3-Clause" 2563 | ], 2564 | "authors": [ 2565 | { 2566 | "name": "Sebastian Bergmann", 2567 | "email": "sb@sebastian-bergmann.de", 2568 | "role": "lead" 2569 | } 2570 | ], 2571 | "description": "Mock Object library for PHPUnit", 2572 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 2573 | "keywords": [ 2574 | "mock", 2575 | "xunit" 2576 | ], 2577 | "time": "2015-07-10 06:54:24" 2578 | }, 2579 | { 2580 | "name": "sebastian/comparator", 2581 | "version": "dev-master", 2582 | "source": { 2583 | "type": "git", 2584 | "url": "https://github.com/sebastianbergmann/comparator.git", 2585 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" 2586 | }, 2587 | "dist": { 2588 | "type": "zip", 2589 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", 2590 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", 2591 | "shasum": "" 2592 | }, 2593 | "require": { 2594 | "php": ">=5.3.3", 2595 | "sebastian/diff": "~1.2", 2596 | "sebastian/exporter": "~1.2" 2597 | }, 2598 | "require-dev": { 2599 | "phpunit/phpunit": "~4.4" 2600 | }, 2601 | "type": "library", 2602 | "extra": { 2603 | "branch-alias": { 2604 | "dev-master": "1.2.x-dev" 2605 | } 2606 | }, 2607 | "autoload": { 2608 | "classmap": [ 2609 | "src/" 2610 | ] 2611 | }, 2612 | "notification-url": "https://packagist.org/downloads/", 2613 | "license": [ 2614 | "BSD-3-Clause" 2615 | ], 2616 | "authors": [ 2617 | { 2618 | "name": "Jeff Welch", 2619 | "email": "whatthejeff@gmail.com" 2620 | }, 2621 | { 2622 | "name": "Volker Dusch", 2623 | "email": "github@wallbash.com" 2624 | }, 2625 | { 2626 | "name": "Bernhard Schussek", 2627 | "email": "bschussek@2bepublished.at" 2628 | }, 2629 | { 2630 | "name": "Sebastian Bergmann", 2631 | "email": "sebastian@phpunit.de" 2632 | } 2633 | ], 2634 | "description": "Provides the functionality to compare PHP values for equality", 2635 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 2636 | "keywords": [ 2637 | "comparator", 2638 | "compare", 2639 | "equality" 2640 | ], 2641 | "time": "2015-07-26 15:48:44" 2642 | }, 2643 | { 2644 | "name": "sebastian/diff", 2645 | "version": "dev-master", 2646 | "source": { 2647 | "type": "git", 2648 | "url": "https://github.com/sebastianbergmann/diff.git", 2649 | "reference": "6899b3e33bfbd386d88b5eea5f65f563e8793051" 2650 | }, 2651 | "dist": { 2652 | "type": "zip", 2653 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", 2654 | "reference": "6899b3e33bfbd386d88b5eea5f65f563e8793051", 2655 | "shasum": "" 2656 | }, 2657 | "require": { 2658 | "php": ">=5.3.3" 2659 | }, 2660 | "require-dev": { 2661 | "phpunit/phpunit": "~4.2" 2662 | }, 2663 | "type": "library", 2664 | "extra": { 2665 | "branch-alias": { 2666 | "dev-master": "1.3-dev" 2667 | } 2668 | }, 2669 | "autoload": { 2670 | "classmap": [ 2671 | "src/" 2672 | ] 2673 | }, 2674 | "notification-url": "https://packagist.org/downloads/", 2675 | "license": [ 2676 | "BSD-3-Clause" 2677 | ], 2678 | "authors": [ 2679 | { 2680 | "name": "Kore Nordmann", 2681 | "email": "mail@kore-nordmann.de" 2682 | }, 2683 | { 2684 | "name": "Sebastian Bergmann", 2685 | "email": "sebastian@phpunit.de" 2686 | } 2687 | ], 2688 | "description": "Diff implementation", 2689 | "homepage": "http://www.github.com/sebastianbergmann/diff", 2690 | "keywords": [ 2691 | "diff" 2692 | ], 2693 | "time": "2015-06-22 14:15:55" 2694 | }, 2695 | { 2696 | "name": "sebastian/environment", 2697 | "version": "dev-master", 2698 | "source": { 2699 | "type": "git", 2700 | "url": "https://github.com/sebastianbergmann/environment.git", 2701 | "reference": "70c3ba9398826b0d0117c2e9f1922c3bc47644ce" 2702 | }, 2703 | "dist": { 2704 | "type": "zip", 2705 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", 2706 | "reference": "70c3ba9398826b0d0117c2e9f1922c3bc47644ce", 2707 | "shasum": "" 2708 | }, 2709 | "require": { 2710 | "php": ">=5.3.3" 2711 | }, 2712 | "require-dev": { 2713 | "phpunit/phpunit": "~4.4" 2714 | }, 2715 | "type": "library", 2716 | "extra": { 2717 | "branch-alias": { 2718 | "dev-master": "1.3.x-dev" 2719 | } 2720 | }, 2721 | "autoload": { 2722 | "classmap": [ 2723 | "src/" 2724 | ] 2725 | }, 2726 | "notification-url": "https://packagist.org/downloads/", 2727 | "license": [ 2728 | "BSD-3-Clause" 2729 | ], 2730 | "authors": [ 2731 | { 2732 | "name": "Sebastian Bergmann", 2733 | "email": "sebastian@phpunit.de" 2734 | } 2735 | ], 2736 | "description": "Provides functionality to handle HHVM/PHP environments", 2737 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2738 | "keywords": [ 2739 | "Xdebug", 2740 | "environment", 2741 | "hhvm" 2742 | ], 2743 | "time": "2015-07-26 09:06:39" 2744 | }, 2745 | { 2746 | "name": "sebastian/exporter", 2747 | "version": "dev-master", 2748 | "source": { 2749 | "type": "git", 2750 | "url": "https://github.com/sebastianbergmann/exporter.git", 2751 | "reference": "7ae5513327cb536431847bcc0c10edba2701064e" 2752 | }, 2753 | "dist": { 2754 | "type": "zip", 2755 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f88f8936517d54ae6d589166810877fb2015d0a2", 2756 | "reference": "7ae5513327cb536431847bcc0c10edba2701064e", 2757 | "shasum": "" 2758 | }, 2759 | "require": { 2760 | "php": ">=5.3.3", 2761 | "sebastian/recursion-context": "~1.0" 2762 | }, 2763 | "require-dev": { 2764 | "phpunit/phpunit": "~4.4" 2765 | }, 2766 | "type": "library", 2767 | "extra": { 2768 | "branch-alias": { 2769 | "dev-master": "1.2.x-dev" 2770 | } 2771 | }, 2772 | "autoload": { 2773 | "classmap": [ 2774 | "src/" 2775 | ] 2776 | }, 2777 | "notification-url": "https://packagist.org/downloads/", 2778 | "license": [ 2779 | "BSD-3-Clause" 2780 | ], 2781 | "authors": [ 2782 | { 2783 | "name": "Jeff Welch", 2784 | "email": "whatthejeff@gmail.com" 2785 | }, 2786 | { 2787 | "name": "Volker Dusch", 2788 | "email": "github@wallbash.com" 2789 | }, 2790 | { 2791 | "name": "Bernhard Schussek", 2792 | "email": "bschussek@2bepublished.at" 2793 | }, 2794 | { 2795 | "name": "Sebastian Bergmann", 2796 | "email": "sebastian@phpunit.de" 2797 | }, 2798 | { 2799 | "name": "Adam Harvey", 2800 | "email": "aharvey@php.net" 2801 | } 2802 | ], 2803 | "description": "Provides the functionality to export PHP variables for visualization", 2804 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 2805 | "keywords": [ 2806 | "export", 2807 | "exporter" 2808 | ], 2809 | "time": "2015-06-21 07:55:53" 2810 | }, 2811 | { 2812 | "name": "sebastian/global-state", 2813 | "version": "dev-master", 2814 | "source": { 2815 | "type": "git", 2816 | "url": "https://github.com/sebastianbergmann/global-state.git", 2817 | "reference": "23af31f402993cfd94e99cbc4b782e9a78eb0e97" 2818 | }, 2819 | "dist": { 2820 | "type": "zip", 2821 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/80e75e39bd6895a2240f5f959a5fec2df501d339", 2822 | "reference": "23af31f402993cfd94e99cbc4b782e9a78eb0e97", 2823 | "shasum": "" 2824 | }, 2825 | "require": { 2826 | "php": ">=5.3.3" 2827 | }, 2828 | "require-dev": { 2829 | "phpunit/phpunit": "~4.2" 2830 | }, 2831 | "suggest": { 2832 | "ext-uopz": "*" 2833 | }, 2834 | "type": "library", 2835 | "extra": { 2836 | "branch-alias": { 2837 | "dev-master": "1.0-dev" 2838 | } 2839 | }, 2840 | "autoload": { 2841 | "classmap": [ 2842 | "src/" 2843 | ] 2844 | }, 2845 | "notification-url": "https://packagist.org/downloads/", 2846 | "license": [ 2847 | "BSD-3-Clause" 2848 | ], 2849 | "authors": [ 2850 | { 2851 | "name": "Sebastian Bergmann", 2852 | "email": "sebastian@phpunit.de" 2853 | } 2854 | ], 2855 | "description": "Snapshotting of global state", 2856 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2857 | "keywords": [ 2858 | "global state" 2859 | ], 2860 | "time": "2015-06-21 15:11:22" 2861 | }, 2862 | { 2863 | "name": "sebastian/recursion-context", 2864 | "version": "dev-master", 2865 | "source": { 2866 | "type": "git", 2867 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2868 | "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" 2869 | }, 2870 | "dist": { 2871 | "type": "zip", 2872 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", 2873 | "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", 2874 | "shasum": "" 2875 | }, 2876 | "require": { 2877 | "php": ">=5.3.3" 2878 | }, 2879 | "require-dev": { 2880 | "phpunit/phpunit": "~4.4" 2881 | }, 2882 | "type": "library", 2883 | "extra": { 2884 | "branch-alias": { 2885 | "dev-master": "1.0.x-dev" 2886 | } 2887 | }, 2888 | "autoload": { 2889 | "classmap": [ 2890 | "src/" 2891 | ] 2892 | }, 2893 | "notification-url": "https://packagist.org/downloads/", 2894 | "license": [ 2895 | "BSD-3-Clause" 2896 | ], 2897 | "authors": [ 2898 | { 2899 | "name": "Jeff Welch", 2900 | "email": "whatthejeff@gmail.com" 2901 | }, 2902 | { 2903 | "name": "Sebastian Bergmann", 2904 | "email": "sebastian@phpunit.de" 2905 | }, 2906 | { 2907 | "name": "Adam Harvey", 2908 | "email": "aharvey@php.net" 2909 | } 2910 | ], 2911 | "description": "Provides functionality to recursively process PHP variables", 2912 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2913 | "time": "2015-06-21 08:04:50" 2914 | }, 2915 | { 2916 | "name": "sebastian/version", 2917 | "version": "1.0.6", 2918 | "source": { 2919 | "type": "git", 2920 | "url": "https://github.com/sebastianbergmann/version.git", 2921 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" 2922 | }, 2923 | "dist": { 2924 | "type": "zip", 2925 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 2926 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 2927 | "shasum": "" 2928 | }, 2929 | "type": "library", 2930 | "autoload": { 2931 | "classmap": [ 2932 | "src/" 2933 | ] 2934 | }, 2935 | "notification-url": "https://packagist.org/downloads/", 2936 | "license": [ 2937 | "BSD-3-Clause" 2938 | ], 2939 | "authors": [ 2940 | { 2941 | "name": "Sebastian Bergmann", 2942 | "email": "sebastian@phpunit.de", 2943 | "role": "lead" 2944 | } 2945 | ], 2946 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2947 | "homepage": "https://github.com/sebastianbergmann/version", 2948 | "time": "2015-06-21 13:59:46" 2949 | }, 2950 | { 2951 | "name": "symfony/yaml", 2952 | "version": "2.8.x-dev", 2953 | "source": { 2954 | "type": "git", 2955 | "url": "https://github.com/symfony/yaml.git", 2956 | "reference": "584e52cb8f788a887553ba82db6caacb1d6260bb" 2957 | }, 2958 | "dist": { 2959 | "type": "zip", 2960 | "url": "https://api.github.com/repos/symfony/yaml/zipball/584e52cb8f788a887553ba82db6caacb1d6260bb", 2961 | "reference": "b7bf092bc2b3af532ef916805e214febec89ae4b", 2962 | "shasum": "" 2963 | }, 2964 | "require": { 2965 | "php": ">=5.3.9" 2966 | }, 2967 | "require-dev": { 2968 | "symfony/phpunit-bridge": "~2.7|~3.0.0" 2969 | }, 2970 | "type": "library", 2971 | "extra": { 2972 | "branch-alias": { 2973 | "dev-master": "2.8-dev" 2974 | } 2975 | }, 2976 | "autoload": { 2977 | "psr-4": { 2978 | "Symfony\\Component\\Yaml\\": "" 2979 | } 2980 | }, 2981 | "notification-url": "https://packagist.org/downloads/", 2982 | "license": [ 2983 | "MIT" 2984 | ], 2985 | "authors": [ 2986 | { 2987 | "name": "Fabien Potencier", 2988 | "email": "fabien@symfony.com" 2989 | }, 2990 | { 2991 | "name": "Symfony Community", 2992 | "homepage": "https://symfony.com/contributors" 2993 | } 2994 | ], 2995 | "description": "Symfony Yaml Component", 2996 | "homepage": "https://symfony.com", 2997 | "time": "2015-07-26 09:09:29" 2998 | }, 2999 | { 3000 | "name": "webmozart/assert", 3001 | "version": "dev-master", 3002 | "source": { 3003 | "type": "git", 3004 | "url": "https://github.com/webmozart/assert.git", 3005 | "reference": "ca9ee1dab6062238174de38f8dd19658b716cef3" 3006 | }, 3007 | "dist": { 3008 | "type": "zip", 3009 | "url": "https://api.github.com/repos/webmozart/assert/zipball/3a8e045064f294992a13966b6c892fb9d64853a3", 3010 | "reference": "ca9ee1dab6062238174de38f8dd19658b716cef3", 3011 | "shasum": "" 3012 | }, 3013 | "require": { 3014 | "php": ">=5.3.3" 3015 | }, 3016 | "require-dev": { 3017 | "phpunit/phpunit": "^4.6" 3018 | }, 3019 | "type": "library", 3020 | "extra": { 3021 | "branch-alias": { 3022 | "dev-master": "1.0-dev" 3023 | } 3024 | }, 3025 | "autoload": { 3026 | "psr-4": { 3027 | "Webmozart\\Assert\\": "src/" 3028 | } 3029 | }, 3030 | "notification-url": "https://packagist.org/downloads/", 3031 | "license": [ 3032 | "MIT" 3033 | ], 3034 | "authors": [ 3035 | { 3036 | "name": "Bernhard Schussek", 3037 | "email": "bschussek@gmail.com" 3038 | } 3039 | ], 3040 | "description": "Assertions to validate method input/output with nice error messages.", 3041 | "keywords": [ 3042 | "assert", 3043 | "check", 3044 | "validate" 3045 | ], 3046 | "time": "2015-07-25 15:19:30" 3047 | } 3048 | ], 3049 | "aliases": [], 3050 | "minimum-stability": "dev", 3051 | "stability-flags": [], 3052 | "prefer-stable": false, 3053 | "prefer-lowest": false, 3054 | "platform": { 3055 | "php": ">= 5.5.9" 3056 | }, 3057 | "platform-dev": [] 3058 | } 3059 | --------------------------------------------------------------------------------