From ba4ab833db2a9d1a704de043a2d9f5484b92587b Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Tue, 24 Oct 2017 12:21:02 +0100 Subject: [PATCH 01/14] Create RememberFileUploads.php --- src/Middleware/RememberFileUploads.php | 62 ++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/Middleware/RememberFileUploads.php diff --git a/src/Middleware/RememberFileUploads.php b/src/Middleware/RememberFileUploads.php new file mode 100644 index 0000000..ba3af62 --- /dev/null +++ b/src/Middleware/RememberFileUploads.php @@ -0,0 +1,62 @@ +session = $store; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @param array $fields + * @return mixed + */ + public function handle($request, Closure $next, $fields = ['*']) + { + if ($request->files->count() > 0) { + $this->remember($request, $fields); + } + + return $next($request); + } + + /** + * Remember all files found in request. + * + * @param \Illuminate\Http\Request $request + * @param array $fields + */ + private function remember($request, array $fields) + { + $files = ($fields[0] === '*') ? $request->files : $request->only($fields); + $stored = []; + + /** + * @var \Symfony\Component\HttpFoundation\File\UploadedFile $file + */ + foreach ($files as $file) { + $details = [ + 'tmpPathName' => $file->getPathname(), + 'originalName' => $file->getClientOriginalName() + ]; + array_push($stored, $details); + } + + $this->session->put('remembered.files', $stored); + } +} From c17a51cc6fdf2034a37ba43da2aea0901cc8b70c Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Tue, 24 Oct 2017 12:24:20 +0100 Subject: [PATCH 02/14] Create RememberedFilesComposer.php --- src/ViewComposers/RememberedFilesComposer.php | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/ViewComposers/RememberedFilesComposer.php diff --git a/src/ViewComposers/RememberedFilesComposer.php b/src/ViewComposers/RememberedFilesComposer.php new file mode 100644 index 0000000..05461d1 --- /dev/null +++ b/src/ViewComposers/RememberedFilesComposer.php @@ -0,0 +1,31 @@ + Date: Tue, 24 Oct 2017 12:24:52 +0100 Subject: [PATCH 03/14] Update RememberFileUploads.php --- src/Middleware/RememberFileUploads.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Middleware/RememberFileUploads.php b/src/Middleware/RememberFileUploads.php index ba3af62..aa0fd1a 100644 --- a/src/Middleware/RememberFileUploads.php +++ b/src/Middleware/RememberFileUploads.php @@ -1,6 +1,6 @@ Date: Tue, 24 Oct 2017 12:27:22 +0100 Subject: [PATCH 04/14] Create RememberUploadsServiceProvider.php --- src/RememberUploadsServiceProvider.php | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/RememberUploadsServiceProvider.php diff --git a/src/RememberUploadsServiceProvider.php b/src/RememberUploadsServiceProvider.php new file mode 100644 index 0000000..68a3c15 --- /dev/null +++ b/src/RememberUploadsServiceProvider.php @@ -0,0 +1,32 @@ + Date: Tue, 24 Oct 2017 12:33:41 +0100 Subject: [PATCH 05/14] Create composer.json --- composer.json | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 composer.json diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..f3d2338 --- /dev/null +++ b/composer.json @@ -0,0 +1,35 @@ +{ + "name": "photogabble/laravel-remember-uploads', + "type": "library", + "description": "A simple helper for remembering uploaded files during form validation.", + "keywords": [ + "laravel", + "file", + "validation" + ], + "support": { + "issues": "https://github.com/photogabble/laravel-remember-uploads/issues", + "source": "https://github.com/photogabble/laravel-remember-uploads" + }, + "license": "MIT", + "authors": [ + { + "name": "Simon Dann", + "email": "simon.dann@gmail.com", + "homepage": "https://www.photogabble.co.uk" + } + ], + "require": { + "php": ">=5.6.0", + }, + "autoload": { + "psr-4": { + "Photogabble\\LaravelRememberUploads\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, +} From 549fc4c19b5cb14443918a97acec3d1a659c0ec5 Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Tue, 24 Oct 2017 12:34:58 +0100 Subject: [PATCH 06/14] Update composer.json --- composer.json | 64 +++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/composer.json b/composer.json index f3d2338..79f9dc7 100644 --- a/composer.json +++ b/composer.json @@ -1,35 +1,35 @@ { - "name": "photogabble/laravel-remember-uploads', - "type": "library", - "description": "A simple helper for remembering uploaded files during form validation.", - "keywords": [ - "laravel", - "file", - "validation" - ], - "support": { - "issues": "https://github.com/photogabble/laravel-remember-uploads/issues", - "source": "https://github.com/photogabble/laravel-remember-uploads" - }, - "license": "MIT", - "authors": [ - { - "name": "Simon Dann", - "email": "simon.dann@gmail.com", - "homepage": "https://www.photogabble.co.uk" + "name": "photogabble/laravel-remember-uploads', + "type": "library", + "description": "A simple helper for remembering uploaded files during form validation.", + "keywords": [ + "laravel", + "file", + "validation" + ], + "support": { + "issues": "https://github.com/photogabble/laravel-remember-uploads/issues", + "source": "https://github.com/photogabble/laravel-remember-uploads" + }, + "license": "MIT", + "authors": [ + { + "name": "Simon Dann", + "email": "simon.dann@gmail.com", + "homepage": "https://www.photogabble.co.uk" + } + ], + "require": { + "php": ">=5.6.0", + }, + "autoload": { + "psr-4": { + "Photogabble\\LaravelRememberUploads\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } } - ], - "require": { - "php": ">=5.6.0", - }, - "autoload": { - "psr-4": { - "Photogabble\\LaravelRememberUploads\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - } - }, } From cdf3511b73f232fb7831d0e725d9b141b3767ced Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Tue, 24 Oct 2017 12:35:11 +0100 Subject: [PATCH 07/14] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 79f9dc7..00ee73b 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "photogabble/laravel-remember-uploads', + "name": "photogabble/laravel-remember-uploads", "type": "library", "description": "A simple helper for remembering uploaded files during form validation.", "keywords": [ From 8b211516d9d286231baf8a531d747d6e6eb302d3 Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Tue, 24 Oct 2017 12:50:15 +0100 Subject: [PATCH 08/14] Update RememberedFilesComposer.php --- src/ViewComposers/RememberedFilesComposer.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/ViewComposers/RememberedFilesComposer.php b/src/ViewComposers/RememberedFilesComposer.php index 05461d1..084c6fc 100644 --- a/src/ViewComposers/RememberedFilesComposer.php +++ b/src/ViewComposers/RememberedFilesComposer.php @@ -7,15 +7,16 @@ class RememberedFilesComposer { + private $session; /** * Create a new remembered files composer. * - * @return void + * @param \Illuminate\Session\Store $store */ - public function __construct() + public function __construct(\Illuminate\Session\Store $store) { - // + $this->session = $store; } /** @@ -26,6 +27,14 @@ public function __construct() */ public function compose(View $view) { - // + $fileBag = new FileBag(); + + if ($files = $this->session->get('remembered.files', null)) { + foreach($files as $key => $file) { + $fileBag->set($key, new UploadedFile($file['tmpPathName'], $file['originalName'])); + } + } + + $view->with('rememberedFiles', $fileBag); } } From a5c36550bdbc3e7c790bbfe670223ec5a043f12b Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Tue, 24 Oct 2017 12:58:16 +0100 Subject: [PATCH 09/14] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 05f1baf..7d474e3 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # laravel-remember-uploads -A laravel package to aid in remembering file uploads + +** This is a work in progress ** From 12f3e8e3d088d8a2434fa140064a4a22806d673d Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Wed, 25 Oct 2017 09:33:54 +0100 Subject: [PATCH 10/14] Update RememberUploadsServiceProvider.php --- src/RememberUploadsServiceProvider.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/RememberUploadsServiceProvider.php b/src/RememberUploadsServiceProvider.php index 68a3c15..d4d51db 100644 --- a/src/RememberUploadsServiceProvider.php +++ b/src/RememberUploadsServiceProvider.php @@ -16,6 +16,7 @@ public function boot() { // Using class based composers... View::composer( + '*', 'Photogabble\LaravelRememberUploads\ViewComposers\RememberedFilesComposer' ); } From 580c21e4afde2acf5e4ba9fa638f87cd94ec8586 Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Wed, 25 Oct 2017 10:00:43 +0100 Subject: [PATCH 11/14] Update RememberFileUploads.php --- src/Middleware/RememberFileUploads.php | 32 ++++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/Middleware/RememberFileUploads.php b/src/Middleware/RememberFileUploads.php index aa0fd1a..a75b87e 100644 --- a/src/Middleware/RememberFileUploads.php +++ b/src/Middleware/RememberFileUploads.php @@ -7,6 +7,9 @@ class RememberFileUploads { + /** + * @var \Illuminate\Session\Store + */ private $session; /** @@ -40,6 +43,7 @@ public function handle($request, Closure $next, $fields = ['*']) * * @param \Illuminate\Http\Request $request * @param array $fields + * @throws \Exception */ private function remember($request, array $fields) { @@ -48,15 +52,29 @@ private function remember($request, array $fields) /** * @var \Symfony\Component\HttpFoundation\File\UploadedFile $file + * @todo there is likely a bug here when $file is an array and not an UploadedFile... write unit test */ - foreach ($files as $file) { - $details = [ - 'tmpPathName' => $file->getPathname(), - 'originalName' => $file->getClientOriginalName() + foreach ($files as $key => $file) { + $storagePath = storage_path('app' . DIRECTORY_SEPARATOR . 'tmp-image-uploads'); + + if (! file_exists($storagePath)) { + if (!mkdir($storagePath)) { + throw new \Exception('Could not create directory ['. $storagePath .'].'); + } + } + + $storagePathName = $storagePath . DIRECTORY_SEPARATOR . $file->getFilename(); + + copy($file->getPathname(), $storagePathName); + + $stored[$key] = [ + 'tmpPathName' => $storagePathName, + 'originalName' => $file->getClientOriginalName(), + 'mimeType' => $file->getMimeType(), + 'size' => $file->getSize() ]; - array_push($stored, $details); } - - $this->session->put('remembered.files', $stored); + + $this->session->flash('_remembered_files', $stored); } } From 497a619b95169371304122b864ddf4c28321cb4c Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Wed, 25 Oct 2017 10:01:02 +0100 Subject: [PATCH 12/14] Update RememberedFilesComposer.php --- src/ViewComposers/RememberedFilesComposer.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ViewComposers/RememberedFilesComposer.php b/src/ViewComposers/RememberedFilesComposer.php index 084c6fc..abb9618 100644 --- a/src/ViewComposers/RememberedFilesComposer.php +++ b/src/ViewComposers/RememberedFilesComposer.php @@ -3,10 +3,15 @@ namespace Photogabble\LaravelRememberUploads\ViewComposers; use Illuminate\View\View; -use App\Repositories\UserRepository; +use Symfony\Component\HttpFoundation\File\UploadedFile; +use Symfony\Component\HttpFoundation\FileBag; class RememberedFilesComposer { + + /** + * @var \Illuminate\Session\Store + */ private $session; /** @@ -29,9 +34,9 @@ public function compose(View $view) { $fileBag = new FileBag(); - if ($files = $this->session->get('remembered.files', null)) { + if ($files = $this->session->get('_remembered_files', null)) { foreach($files as $key => $file) { - $fileBag->set($key, new UploadedFile($file['tmpPathName'], $file['originalName'])); + $fileBag->set($key, new UploadedFile($file['tmpPathName'], $file['originalName'], $file['mimeType'], $file['size'])); } } From 2a4b9f6c14dcffbeb8124f439a36354823055648 Mon Sep 17 00:00:00 2001 From: Simon Dann Date: Wed, 25 Oct 2017 14:17:48 +0100 Subject: [PATCH 13/14] :white_check_mark: TDD --- .gitignore | 22 +- composer.json | 69 +- composer.lock | 3082 ++++++++++++++++++++++++ phpunit.xml | 35 + src/Middleware/RememberFileUploads.php | 89 +- src/RememberUploadsServiceProvider.php | 8 +- src/helpers.php | 2 + tests/UploadTest.php | 167 ++ tests/stubs/test.blade.php | 0 tests/stubs/test.jpg | Bin 0 -> 73906 bytes 10 files changed, 3408 insertions(+), 66 deletions(-) create mode 100644 composer.lock create mode 100644 phpunit.xml create mode 100644 src/helpers.php create mode 100644 tests/UploadTest.php create mode 100644 tests/stubs/test.blade.php create mode 100644 tests/stubs/test.jpg diff --git a/.gitignore b/.gitignore index a4854be..331c58f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,2 @@ -vendor/ -node_modules/ -npm-debug.log - -# Laravel 4 specific -bootstrap/compiled.php -app/storage/ - -# Laravel 5 & Lumen specific -public/storage -public/hot -storage/*.key -.env.*.php -.env.php -.env -Homestead.yaml -Homestead.json - -# Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer -.rocketeer/ +.idea +vendor \ No newline at end of file diff --git a/composer.json b/composer.json index 00ee73b..f5bd4ff 100644 --- a/composer.json +++ b/composer.json @@ -1,35 +1,42 @@ { - "name": "photogabble/laravel-remember-uploads", - "type": "library", - "description": "A simple helper for remembering uploaded files during form validation.", - "keywords": [ - "laravel", - "file", - "validation" - ], - "support": { - "issues": "https://github.com/photogabble/laravel-remember-uploads/issues", - "source": "https://github.com/photogabble/laravel-remember-uploads" - }, - "license": "MIT", - "authors": [ - { - "name": "Simon Dann", - "email": "simon.dann@gmail.com", - "homepage": "https://www.photogabble.co.uk" - } - ], - "require": { - "php": ">=5.6.0", - }, - "autoload": { - "psr-4": { - "Photogabble\\LaravelRememberUploads\\": "src/" - } + "name": "photogabble/laravel-remember-uploads", + "type": "library", + "description": "A simple helper for remembering uploaded files during form validation.", + "keywords": [ + "laravel", + "file", + "validation" + ], + "support": { + "issues": "https://github.com/photogabble/laravel-remember-uploads/issues", + "source": "https://github.com/photogabble/laravel-remember-uploads" + }, + "license": "MIT", + "authors": [ + { + "name": "Simon Dann", + "email": "simon.dann@gmail.com", + "homepage": "https://www.photogabble.co.uk" + } + ], + "require": { + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.*", + "orchestra/testbench": "~3.0" + }, + "autoload": { + "psr-4": { + "Photogabble\\LaravelRememberUploads\\": "src/" }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - } + "files": [ + "src/helpers.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Photogabble\\LaravelRememberUploads\\Tests\\": "tests/" } + } } diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..1562ec9 --- /dev/null +++ b/composer.lock @@ -0,0 +1,3082 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "b4b3a7f17df72a1cbe05c846674abaeb", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/inflector", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", + "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Inflector\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2015-11-06T14:35:42+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14T21:17:01+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.6.3", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "728952b90a333b5c6f77f06ea9422b94b585878d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/728952b90a333b5c6f77f06ea9422b94b585878d", + "reference": "728952b90a333b5c6f77f06ea9422b94b585878d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2017-05-14T14:47:48+00:00" + }, + { + "name": "fzaninotto/faker", + "version": "v1.7.1", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", + "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "^4.0 || ^5.0", + "squizlabs/php_codesniffer": "^1.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2017-08-15T16:48:10+00:00" + }, + { + "name": "laravel/framework", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/1062a22232071c3e8636487c86ec1ae75681bbf9", + "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9", + "shasum": "" + }, + "require": { + "doctrine/inflector": "~1.1", + "erusev/parsedown": "~1.6", + "ext-mbstring": "*", + "ext-openssl": "*", + "league/flysystem": "~1.0", + "monolog/monolog": "~1.11", + "mtdowling/cron-expression": "~1.0", + "nesbot/carbon": "~1.20", + "paragonie/random_compat": "~1.4|~2.0", + "php": ">=5.6.4", + "ramsey/uuid": "~3.0", + "swiftmailer/swiftmailer": "~5.4", + "symfony/console": "~3.2", + "symfony/debug": "~3.2", + "symfony/finder": "~3.2", + "symfony/http-foundation": "~3.2", + "symfony/http-kernel": "~3.2", + "symfony/process": "~3.2", + "symfony/routing": "~3.2", + "symfony/var-dumper": "~3.2", + "tijsverkoyen/css-to-inline-styles": "~2.2", + "vlucas/phpdotenv": "~2.2" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/exception": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "tightenco/collect": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "~3.0", + "doctrine/dbal": "~2.5", + "mockery/mockery": "~0.9.4", + "pda/pheanstalk": "~3.0", + "phpunit/phpunit": "~5.7", + "predis/predis": "~1.0", + "symfony/css-selector": "~3.2", + "symfony/dom-crawler": "~3.2" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", + "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", + "laravel/tinker": "Required to use the tinker console command (~1.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "nexmo/client": "Required to use the Nexmo transport (~1.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", + "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.2).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.2).", + "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "time": "2017-08-30T09:26:16+00:00" + }, + { + "name": "league/flysystem", + "version": "1.0.41", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "f400aa98912c561ba625ea4065031b7a41e5a155" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f400aa98912c561ba625ea4065031b7a41e5a155", + "reference": "f400aa98912c561ba625ea4065031b7a41e5a155", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "ext-fileinfo": "*", + "mockery/mockery": "~0.9", + "phpspec/phpspec": "^2.2", + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "time": "2017-08-06T17:41:04+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.23.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2017-06-19T01:22:40+00:00" + }, + { + "name": "mtdowling/cron-expression", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/mtdowling/cron-expression.git", + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2017-01-23T04:29:33+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2017-10-19T19:58:43+00:00" + }, + { + "name": "nesbot/carbon", + "version": "1.22.1", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", + "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "symfony/translation": "~2.6 || ~3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "~4.0 || ~5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.23-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + } + ], + "description": "A simple API extension for DateTime.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "time": "2017-01-16T07:55:07+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v3.4.10", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "3f4f3a129fa315d65f6827b3eeb89c4190e19d19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/3f4f3a129fa315d65f6827b3eeb89c4190e19d19", + "reference": "3f4f3a129fa315d65f6827b3eeb89c4190e19d19", + "shasum": "" + }, + "require": { + "fzaninotto/faker": "~1.4", + "laravel/framework": "~5.4.17", + "orchestra/testbench-core": "~3.4.4", + "php": ">=5.6.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "orchestra/database": "~3.4.0", + "phpunit/phpunit": "~5.7" + }, + "suggest": { + "mockery/mockery": "Allow to use Mockery for testing (^0.9.4).", + "orchestra/database": "Allow to use --realpath migration for testing (~3.4).", + "orchestra/testbench-browser-kit": "Allow to use legacy BrowserKit for testing (~3.4).", + "phpunit/phpunit": "Allow to use PHPUnit for testing (~5.7)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "http://orchestraplatform.com/docs/latest/components/testbench/", + "keywords": [ + "BDD", + "TDD", + "laravel", + "orchestra-platform", + "orchestral", + "testing" + ], + "time": "2017-10-08T07:55:54+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v3.4.4", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "3533c7477b077afa8fc069979e3afde72a806698" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/3533c7477b077afa8fc069979e3afde72a806698", + "reference": "3533c7477b077afa8fc069979e3afde72a806698", + "shasum": "" + }, + "require": { + "fzaninotto/faker": "~1.4", + "php": ">=5.6.0" + }, + "require-dev": { + "laravel/framework": "~5.4.17", + "mockery/mockery": "^0.9.4", + "orchestra/database": "~3.4.0", + "phpunit/phpunit": "~5.7 || ~6.0" + }, + "suggest": { + "laravel/framework": "Required for testing (~5.4.0).", + "mockery/mockery": "Allow to use Mockery for testing (^0.9.4).", + "orchestra/database": "Allow to use --realpath migration for testing (~3.4).", + "orchestra/testbench-browser-kit": "Allow to use legacy BrowserKit for testing (~3.4).", + "phpunit/phpunit": "Allow to use PHPUnit for testing (~6.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "http://orchestraplatform.com/docs/latest/components/testbench/", + "keywords": [ + "BDD", + "TDD", + "laravel", + "orchestra-platform", + "orchestral", + "testing" + ], + "time": "2017-10-08T07:39:49+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v2.0.11", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", + "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "pseudorandom", + "random" + ], + "time": "2017-09-27T21:40:39+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2017-09-11T18:02:19+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "3.2.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/4aada1f93c72c35e22fb1383b47fee43b8f1d157", + "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.3.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2017-08-08T06:39:58+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fb3933512008d8162b3cdf9e18dba9309b7c3773", + "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2017-06-03T08:32:36+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.7.2", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", + "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8 || ^5.6.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2017-09-04T11:05:03+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^5.6 || ^7.0", + "phpunit/php-file-iterator": "^1.3", + "phpunit/php-text-template": "^1.2", + "phpunit/php-token-stream": "^1.4.2 || ^2.0", + "sebastian/code-unit-reverse-lookup": "^1.0", + "sebastian/environment": "^1.3.2 || ^2.0", + "sebastian/version": "^1.0 || ^2.0" + }, + "require-dev": { + "ext-xdebug": "^2.1.4", + "phpunit/phpunit": "^5.7" + }, + "suggest": { + "ext-xdebug": "^2.5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2017-04-02T07:44:40+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2016-10-03T07:40:28+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2017-02-26T11:10:40+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", + "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2017-02-27T10:12:30+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "5.7.23", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "78532d5269d984660080d8e0f4c99c5c2ea65ffe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/78532d5269d984660080d8e0f4c99c5c2ea65ffe", + "reference": "78532d5269d984660080d8e0f4c99c5c2ea65ffe", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "~1.3", + "php": "^5.6 || ^7.0", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.4", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", + "sebastian/comparator": "^1.2.4", + "sebastian/diff": "^1.4.3", + "sebastian/environment": "^1.3.4 || ^2.0", + "sebastian/exporter": "~2.0", + "sebastian/global-state": "^1.1", + "sebastian/object-enumerator": "~2.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "~1.0.3|~2.0", + "symfony/yaml": "~2.1|~3.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.7.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2017-10-15T06:13:55+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.6 || ^7.0", + "phpunit/php-text-template": "^1.2", + "sebastian/exporter": "^1.2 || ^2.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2017-06-30T09:13:00+00:00" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "ramsey/uuid", + "version": "3.7.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "45cffe822057a09e05f7bd09ec5fb88eeecd2334" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/45cffe822057a09e05f7bd09ec5fb88eeecd2334", + "reference": "45cffe822057a09e05f7bd09ec5fb88eeecd2334", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "^1.0|^2.0", + "php": "^5.4 || ^7.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "apigen/apigen": "^4.1", + "codeception/aspect-mock": "^1.0 | ^2.0", + "doctrine/annotations": "~1.2.0", + "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1", + "ircmaxell/random-lib": "^1.1", + "jakub-onderka/php-parallel-lint": "^0.9.0", + "mockery/mockery": "^0.9.4", + "moontoast/math": "^1.1", + "php-mock/php-mock-phpunit": "^0.3|^1.1", + "phpunit/phpunit": "^4.7|>=5.0 <5.4", + "satooshi/php-coveralls": "^0.6.1", + "squizlabs/php_codesniffer": "^2.3" + }, + "suggest": { + "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", + "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", + "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marijn Huizendveld", + "email": "marijn.huizendveld@gmail.com" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io" + }, + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "time": "2017-09-22T20:46:04+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2017-01-29T09:50:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2017-05-22T07:24:03+00:00" + }, + { + "name": "sebastian/environment", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2016-11-26T07:53:53+00:00" + }, + { + "name": "sebastian/exporter", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2016-11-19T08:54:04+00:00" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12T03:26:01+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-02-18T15:18:39+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2016-11-19T07:33:16+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28T20:34:47+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.8", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517", + "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2017-05-01T15:54:03+00:00" + }, + { + "name": "symfony/console", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "116bc56e45a8e5572e51eb43ab58c769a352366c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/116bc56e45a8e5572e51eb43ab58c769a352366c", + "reference": "116bc56e45a8e5572e51eb43ab58c769a352366c", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3", + "symfony/dependency-injection": "~3.3", + "symfony/event-dispatcher": "~2.8|~3.0", + "symfony/filesystem": "~2.8|~3.0", + "symfony/process": "~2.8|~3.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/filesystem": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2017-10-02T06:42:24+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "07447650225ca9223bd5c97180fe7c8267f7d332" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/07447650225ca9223bd5c97180fe7c8267f7d332", + "reference": "07447650225ca9223bd5c97180fe7c8267f7d332", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "time": "2017-10-02T06:42:24+00:00" + }, + { + "name": "symfony/debug", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "eb95d9ce8f18dcc1b3dfff00cb624c402be78ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/eb95d9ce8f18dcc1b3dfff00cb624c402be78ffd", + "reference": "eb95d9ce8f18dcc1b3dfff00cb624c402be78ffd", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/http-kernel": "~2.8|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2017-10-02T06:42:24+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "d7ba037e4b8221956ab1e221c73c9e27e05dd423" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d7ba037e4b8221956ab1e221c73c9e27e05dd423", + "reference": "d7ba037e4b8221956ab1e221c73c9e27e05dd423", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/dependency-injection": "~3.3", + "symfony/expression-language": "~2.8|~3.0", + "symfony/stopwatch": "~2.8|~3.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2017-10-02T06:42:24+00:00" + }, + { + "name": "symfony/finder", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "773e19a491d97926f236942484cb541560ce862d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/773e19a491d97926f236942484cb541560ce862d", + "reference": "773e19a491d97926f236942484cb541560ce862d", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2017-10-02T06:42:24+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "22cf9c2b1d9f67cc8e75ae7f4eaa60e4c1eff1f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/22cf9c2b1d9f67cc8e75ae7f4eaa60e4c1eff1f8", + "reference": "22cf9c2b1d9f67cc8e75ae7f4eaa60e4c1eff1f8", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "symfony/expression-language": "~2.8|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2017-10-05T23:10:23+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "654f047a78756964bf91b619554f956517394018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/654f047a78756964bf91b619554f956517394018", + "reference": "654f047a78756964bf91b619554f956517394018", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0", + "symfony/debug": "~2.8|~3.0", + "symfony/event-dispatcher": "~2.8|~3.0", + "symfony/http-foundation": "~3.3" + }, + "conflict": { + "symfony/config": "<2.8", + "symfony/dependency-injection": "<3.3", + "symfony/var-dumper": "<3.3", + "twig/twig": "<1.34|<2.4,>=2" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "~2.8|~3.0", + "symfony/class-loader": "~2.8|~3.0", + "symfony/config": "~2.8|~3.0", + "symfony/console": "~2.8|~3.0", + "symfony/css-selector": "~2.8|~3.0", + "symfony/dependency-injection": "~3.3", + "symfony/dom-crawler": "~2.8|~3.0", + "symfony/expression-language": "~2.8|~3.0", + "symfony/finder": "~2.8|~3.0", + "symfony/process": "~2.8|~3.0", + "symfony/routing": "~2.8|~3.0", + "symfony/stopwatch": "~2.8|~3.0", + "symfony/templating": "~2.8|~3.0", + "symfony/translation": "~2.8|~3.0", + "symfony/var-dumper": "~3.3" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/class-loader": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2017-10-05T23:40:19+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2017-10-11T12:05:26+00:00" + }, + { + "name": "symfony/process", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "fdf89e57a723a29baf536e288d6e232c059697b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/fdf89e57a723a29baf536e288d6e232c059697b1", + "reference": "fdf89e57a723a29baf536e288d6e232c059697b1", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2017-10-02T06:42:24+00:00" + }, + { + "name": "symfony/routing", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "2e26fa63da029dab49bf9377b3b4f60a8fecb009" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/2e26fa63da029dab49bf9377b3b4f60a8fecb009", + "reference": "2e26fa63da029dab49bf9377b3b4f60a8fecb009", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/config": "<2.8", + "symfony/dependency-injection": "<3.3", + "symfony/yaml": "<3.3" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/dependency-injection": "~3.3", + "symfony/expression-language": "~2.8|~3.0", + "symfony/http-foundation": "~2.8|~3.0", + "symfony/yaml": "~3.3" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/dependency-injection": "For loading routes from a service", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2017-10-02T07:25:00+00:00" + }, + { + "name": "symfony/translation", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "409bf229cd552bf7e3faa8ab7e3980b07672073f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/409bf229cd552bf7e3faa8ab7e3980b07672073f", + "reference": "409bf229cd552bf7e3faa8ab7e3980b07672073f", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<2.8", + "symfony/yaml": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/intl": "^2.8.18|^3.2.5", + "symfony/yaml": "~3.3" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2017-10-02T06:42:24+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "03e3693a36701f1c581dd24a6d6eea2eba2113f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/03e3693a36701f1c581dd24a6d6eea2eba2113f6", + "reference": "03e3693a36701f1c581dd24a6d6eea2eba2113f6", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "require-dev": { + "ext-iconv": "*", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-symfony_debug": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2017-10-02T06:42:24+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46", + "reference": "8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "require-dev": { + "symfony/console": "~2.8|~3.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2017-10-05T14:43:42+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b", + "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7", + "symfony/css-selector": "^2.7|~3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8|5.1.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "time": "2016-09-20T12:50:39+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", + "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause-Attribution" + ], + "authors": [ + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "http://www.vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2016-09-01T10:05:43+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2016-11-23T20:04:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.6.0" + }, + "platform-dev": [] +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..4a031ac --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + ./tests/ + + + + + + ./src + + ./tests + ./vendor + + + + \ No newline at end of file diff --git a/src/Middleware/RememberFileUploads.php b/src/Middleware/RememberFileUploads.php index a75b87e..fe7c395 100644 --- a/src/Middleware/RememberFileUploads.php +++ b/src/Middleware/RememberFileUploads.php @@ -3,22 +3,48 @@ namespace Photogabble\LaravelRememberUploads\Middleware; use Closure; +use Illuminate\Cache\CacheManager; +use Illuminate\Session\Store; class RememberFileUploads { /** - * @var \Illuminate\Session\Store + * @var Store */ private $session; + private $cache; + + /** + * @var string + */ + private $storagePath; + + /** + * Session lifetime, used for caching values. + * @var int + */ + private $cacheTimeout = 0; + /** * RememberFileUploads constructor. - * @param \Illuminate\Session\Store $store + * @param Store $store + * @param CacheManager $cache + * @throws \Exception */ - public function __construct(\Illuminate\Session\Store $store) + public function __construct(Store $store, CacheManager $cache) { $this->session = $store; + $this->cache = $cache; + $this->storagePath = storage_path('app' . DIRECTORY_SEPARATOR . 'tmp-image-uploads'); + $this->cacheTimeout = config('session.lifetime'); + + if (! file_exists($this->storagePath)) { + if (!mkdir($this->storagePath)) { + throw new \Exception('Could not create directory ['. $this->storagePath .'].'); + } + } } /** @@ -31,13 +57,53 @@ public function __construct(\Illuminate\Session\Store $store) */ public function handle($request, Closure $next, $fields = ['*']) { + // + // There is a bug here, that if the user uploads an additional file to what has been remembered + // then they will loose the remembered one. + // + // The method checkRequestForRemembered needs to always be executed. + // @todo the above + // if ($request->files->count() > 0) { $this->remember($request, $fields); + }else{ + $this->checkRequestForRemembered($request, $fields); } return $next($request); } + /** + * Remember all files found in request. + * + * @param \Illuminate\Http\Request $request + * @param array $fields + */ + private function checkRequestForRemembered($request, array $fields) + { + $remembered = $request->get('_rememberedFiles', []); + $files = ($fields[0] === '*') ? $remembered : array_filter($remembered, function($k) use ($fields) { return in_array($k, $fields); }, ARRAY_FILTER_USE_KEY); + $stored = []; + + foreach ($files as $key => $fileName) { + $storagePathName = $this->storagePath . DIRECTORY_SEPARATOR . $fileName; + + if (! $this->cache->has('_remembered_files.'.$key)){ + continue; + } + + $cached = $this->cache->get('_remembered_files.'.$key); + $stored[$key] = [ + 'tmpPathName' => $storagePathName, + 'originalName' => $cached['originalName'], + 'mimeType' => $cached['mimeType'], + 'size' => $cached['size'] + ]; + } + + $this->session->flash('_remembered_files', $stored); + } + /** * Remember all files found in request. * @@ -55,18 +121,15 @@ private function remember($request, array $fields) * @todo there is likely a bug here when $file is an array and not an UploadedFile... write unit test */ foreach ($files as $key => $file) { - $storagePath = storage_path('app' . DIRECTORY_SEPARATOR . 'tmp-image-uploads'); - - if (! file_exists($storagePath)) { - if (!mkdir($storagePath)) { - throw new \Exception('Could not create directory ['. $storagePath .'].'); - } - } - - $storagePathName = $storagePath . DIRECTORY_SEPARATOR . $file->getFilename(); - + $storagePathName = $this->storagePath . DIRECTORY_SEPARATOR . $file->getFilename(); copy($file->getPathname(), $storagePathName); + $this->cache->put('_remembered_files.'.$key, [ + 'originalName' => $file->getClientOriginalName(), + 'mimeType' => $file->getMimeType(), + 'size' => $file->getSize() + ], $this->cacheTimeout); + $stored[$key] = [ 'tmpPathName' => $storagePathName, 'originalName' => $file->getClientOriginalName(), diff --git a/src/RememberUploadsServiceProvider.php b/src/RememberUploadsServiceProvider.php index d4d51db..d7f6554 100644 --- a/src/RememberUploadsServiceProvider.php +++ b/src/RememberUploadsServiceProvider.php @@ -2,10 +2,12 @@ namespace Photogabble\LaravelRememberUploads; +use Illuminate\Routing\Router; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; +use Photogabble\LaravelRememberUploads\Middleware\RememberFileUploads; -class ComposerServiceProvider extends ServiceProvider +class RememberUploadsServiceProvider extends ServiceProvider { /** * Register bindings in the container. @@ -28,6 +30,8 @@ public function boot() */ public function register() { - // + /** @var Router $router */ + $router =$this->app->make(Router::class); + $router->aliasMiddleware('remember.files', RememberFileUploads::class); } } diff --git a/src/helpers.php b/src/helpers.php new file mode 100644 index 0000000..a4abe2d --- /dev/null +++ b/src/helpers.php @@ -0,0 +1,2 @@ +app->make('router'); + + $router->post('test', function () { + return ['ok' => true]; + })->middleware('remember.files'); + } + + /** + * This tests to see if the middleware correctly captures the uploaded file and that the + * view composer injects that captured upload into the next page load via flash sessions. + * + * It then goes to check that "refreshing" the page without any file upload will clear + * the captured uploaded file. + */ + public function testSingleFileUpload() + { + /** @var Store $session */ + $session = $this->app->make(Store::class); + + $remembered = $session->get('_remembered_files', []); + $this->assertEquals([], $remembered); + + $stub = __DIR__.DIRECTORY_SEPARATOR.'stubs'.DIRECTORY_SEPARATOR.'test.jpg'; + $name = str_random(8).'.jpg'; + $path = sys_get_temp_dir().DIRECTORY_SEPARATOR.$name; + + copy($stub, $path); + + $file = new UploadedFile($path, $name, filesize($path), 'image/jpeg', null, true); + + $response = $this->call('POST', 'test', [], [], ['img' => $file], ['Accept' => 'application/json']); + $this->assertTrue($response->isOk()); + $content = json_decode($response->getContent()); + $this->assertTrue($content->ok); + $session->ageFlashData(); // should this be required, shouldn't it happen during $this->call? + + $remembered = $session->get('_remembered_files'); + $this->assertArrayHasKey('img', $remembered); + $this->assertEquals($name, $remembered['img']['originalName']); + + // + // Test that the view composer sets the right properties + // + $viewData = $this->mockView()->getData(); + $this->assertArrayHasKey('rememberedFiles', $viewData); + $this->assertInstanceOf(FileBag::class, $viewData['rememberedFiles']); + $this->assertEquals(1, $viewData['rememberedFiles']->count()); + + // + // Test that upon re-calling the post event without any image data that + // the _remembered_files doesn't contain any old data. + // + + $response = $this->call('POST', 'test', [], [], [], ['Accept' => 'application/json']); + $this->assertTrue($response->isOk()); + $session->ageFlashData(); // should this be required, shouldn't it happen during $this- + + $remembered = $session->get('_remembered_files', []); + $this->assertEquals([], $remembered); + + // + // Test that the view composer sets the right properties + // + $viewData = $this->mockView()->getData(); + $this->assertArrayHasKey('rememberedFiles', $viewData); + $this->assertInstanceOf(FileBag::class, $viewData['rememberedFiles']); + $this->assertEquals(0, $viewData['rememberedFiles']->count()); + } + + /** + * This tests to see if the middleware correctly captures the cached upload file from the + * form data with the naming format _rememberedFiles[key]. + * + * It then goes to check that "refreshing" the page without any file upload will clear + * the captured uploaded file. + */ + public function testSingleFileUploadOldRemembered() + { + /** @var Store $session */ + $session = $this->app->make(Store::class); + + $remembered = $session->get('_remembered_files', []); + $this->assertEquals([], $remembered); + + $stub = __DIR__.DIRECTORY_SEPARATOR.'stubs'.DIRECTORY_SEPARATOR.'test.jpg'; + $name = str_random(8).'.jpg'; + $path = sys_get_temp_dir().DIRECTORY_SEPARATOR.$name; + + copy($stub, $path); + + $file = new UploadedFile($path, $name, filesize($path), 'image/jpeg', null, true); + + $response = $this->call('POST', 'test', [], [], ['img' => $file], ['Accept' => 'application/json']); + $this->assertTrue($response->isOk()); + $session->ageFlashData(); + + // "Refresh"... + + $response = $this->call('POST', 'test', ['_rememberedFiles' => ['img' => $name]], [], [], ['Accept' => 'application/json']); + $this->assertTrue($response->isOk()); + $session->ageFlashData(); + + $viewData = $this->mockView()->getData(); + $this->assertArrayHasKey('rememberedFiles', $viewData); + $this->assertInstanceOf(FileBag::class, $viewData['rememberedFiles']); + $this->assertEquals(1, $viewData['rememberedFiles']->count()); + + // "Refresh... + + $response = $this->call('POST', 'test', [], [], [], ['Accept' => 'application/json']); + $this->assertTrue($response->isOk()); + $session->ageFlashData(); + + $viewData = $this->mockView()->getData(); + $this->assertArrayHasKey('rememberedFiles', $viewData); + $this->assertInstanceOf(FileBag::class, $viewData['rememberedFiles']); + $this->assertEquals(0, $viewData['rememberedFiles']->count()); + } + + private function mockView() + { + /** @var Factory $factory */ + $factory = app(Factory::class); + + /** @var View $mockView */ + $mockView = $factory->file(__DIR__ . DIRECTORY_SEPARATOR . 'test.blade.php'); + + /** @var RememberedFilesComposer $mockComposer */ + $mockComposer = $this->app->make(RememberedFilesComposer::class); + + $mockComposer->compose($mockView); + return $mockView; + } + +} \ No newline at end of file diff --git a/tests/stubs/test.blade.php b/tests/stubs/test.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/tests/stubs/test.jpg b/tests/stubs/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e791e90d0ed9aa78cfe4f8538e8db3c3cd6598f GIT binary patch literal 73906 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 MB8>aeQ9ytH*; Date: Wed, 25 Oct 2017 14:49:46 +0100 Subject: [PATCH 14/14] :sparkles: adding helper function and tests --- src/helpers.php | 27 +++++++++++++++++++++++++++ tests/UploadTest.php | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/helpers.php b/src/helpers.php index a4abe2d..8d38b20 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -1,2 +1,29 @@ get('_remembered_files', null)) { + foreach($files as $k => $f) { + $fileBag->set( + $k, + new Symfony\Component\HttpFoundation\File\UploadedFile( + $f['tmpPathName'], + $f['originalName'], + $f['mimeType'], + $f['size'] + ) + ); + } + } + + return is_null($key) ? $fileBag : $fileBag->get($key, $default); + } +} diff --git a/tests/UploadTest.php b/tests/UploadTest.php index 572577b..13900b4 100644 --- a/tests/UploadTest.php +++ b/tests/UploadTest.php @@ -3,9 +3,8 @@ namespace Photogabble\LaravelRememberUploads\Tests; use Illuminate\Contracts\View\Factory; -use Illuminate\Http\Request; use Illuminate\Http\UploadedFile; -use \Illuminate\Session\Store; +use Illuminate\Session\Store; use Illuminate\View\View; use Orchestra\Testbench\TestCase; use Photogabble\LaravelRememberUploads\RememberUploadsServiceProvider; @@ -149,6 +148,39 @@ public function testSingleFileUploadOldRemembered() $this->assertEquals(0, $viewData['rememberedFiles']->count()); } + public function testHelper() + { + /** @var Store $session */ + $session = $this->app->make(Store::class); + + $remembered = $session->get('_remembered_files', []); + $this->assertEquals([], $remembered); + + $stub = __DIR__.DIRECTORY_SEPARATOR.'stubs'.DIRECTORY_SEPARATOR.'test.jpg'; + $name = str_random(8).'.jpg'; + $path = sys_get_temp_dir().DIRECTORY_SEPARATOR.$name; + + copy($stub, $path); + + $file = new UploadedFile($path, $name, filesize($path), 'image/jpeg', null, true); + + $response = $this->call('POST', 'test', [], [], ['img' => $file], ['Accept' => 'application/json']); + $this->assertTrue($response->isOk()); + $session->ageFlashData(); + + $fileBag = oldFile(); + $this->assertInstanceOf(FileBag::class, $fileBag); + $this->assertInstanceOf(\Symfony\Component\HttpFoundation\File\UploadedFile::class, $fileBag->get('img')); + + $oldFile = oldFile('img'); + $this->assertInstanceOf(\Symfony\Component\HttpFoundation\File\UploadedFile::class, $oldFile); + + $this->assertNull(oldFile('test')); + $this->assertTrue(oldFile('test', true)); + $this->assertFalse(oldFile('test', false)); + + } + private function mockView() { /** @var Factory $factory */