├── 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 |
4 |
5 |
6 |
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 |
4 |
5 |
6 |
7 |
8 |
9 |
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 |
--------------------------------------------------------------------------------