├── .gitignore ├── .styleci.yml ├── tests ├── models │ └── User.php ├── database │ ├── factories │ │ └── ModelFactory.php │ └── migrations │ │ └── 2014_10_12_000000_create_users_table.php ├── ExampleTest.php ├── unit │ └── UnitTest.php ├── AbstractTestCase.php └── functional │ ├── UserQueryTest.php │ └── FriendsTest.php ├── src ├── Friends │ ├── FriendshipStatus.php │ ├── FriendsServiceProvider.php │ └── Traits │ │ └── Friendable.php ├── config │ └── friends.php └── database │ └── migrations │ └── 2016_06_18_000000_create_friends_table.php ├── CHANGELOG.md ├── .travis.yml ├── LICENSE ├── composer.json ├── phpunit.xml.dist ├── .php_cs ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | vendor 3 | /.php_cs 4 | /.php_cs.cache 5 | -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | preset: laravel 2 | 3 | finder: 4 | exclude: 5 | - "tests" 6 | name: 7 | - "*.php" -------------------------------------------------------------------------------- /tests/models/User.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | use Illuminate\Foundation\Auth\User as Authenticatable; 12 | class User extends Authenticatable { 13 | use \Arubacao\Friends\Traits\Friendable; 14 | } -------------------------------------------------------------------------------- /tests/database/factories/ModelFactory.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | $factory->define(User::class, function (Faker\Generator $faker) { 12 | return [ 13 | 'name' => $faker->name, 14 | ]; 15 | }); 16 | -------------------------------------------------------------------------------- /tests/ExampleTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | class ExampleTest extends AbstractTestCase 12 | { 13 | /** 14 | * @test 15 | */ 16 | public function testStuff() 17 | { 18 | $this->assertTrue(true); 19 | } 20 | } -------------------------------------------------------------------------------- /src/Friends/FriendshipStatus.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | namespace Arubacao\Friends; 12 | 13 | /** 14 | * Class Status. 15 | */ 16 | class FriendshipStatus 17 | { 18 | const PENDING = 0; 19 | const ACCEPTED = 1; 20 | const DENIED = 2; 21 | const BLOCKED = 3; 22 | } 23 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log Friends 2 | All notable changes to the Friends package will be documented in this file. 3 | It adheres to [Semantic Versioning](http://semver.org/). 4 | `MAJOR.MINOR.PATCH` 5 | `Breaking.Feature.Bugfix` 6 | 7 | ## 2.0.1 - 21 June 2016 8 | #### Added 9 | - Lumen support 10 | 11 | #### Changed 12 | - Change Identical to Equal Comparison Operators 13 | 14 | ## 2.0.0 - 20 June 2016 15 | 16 | #### Added 17 | - Rewrote package from scratch 18 | 19 | #### Removed 20 | - Deleted complete sourcecode from Hootlex 21 | 22 | ## v1.0.15 - 2 May 2016 23 | #### Forked repo from Hootlex 24 | -------------------------------------------------------------------------------- /src/config/friends.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | return [ 12 | /* 13 | |-------------------------------------------------------------------------- 14 | | Applications User Model 15 | |-------------------------------------------------------------------------- 16 | | 17 | | This is the applications `User` model used by Friends. 18 | | 19 | */ 20 | 'user_model' => App\User::class, 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Applications users Table 25 | |-------------------------------------------------------------------------- 26 | | 27 | | This is the applications `users` table name used by Friends. 28 | | 29 | */ 30 | 'users_table' => 'users', 31 | 32 | ]; 33 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.6 5 | - 7.0 6 | - hhvm 7 | 8 | sudo: false 9 | 10 | install: 11 | - travis_retry composer install --no-interaction --prefer-source 12 | 13 | script: 14 | - if [ "$TRAVIS_PHP_VERSION" != "5.5.9" ] && [ "$TRAVIS_PHP_VERSION" != "5.5" ] && [ "$TRAVIS_PHP_VERSION" != "5.6" ]; then vendor/bin/phpunit; fi 15 | - if [ "$TRAVIS_PHP_VERSION" == "5.5.9" ] || [ "$TRAVIS_PHP_VERSION" == "5.5" ] || [ "$TRAVIS_PHP_VERSION" == "5.6" ]; then vendor/bin/phpunit --coverage-clover build/logs/clover.xml; fi 16 | 17 | after_script: 18 | - if [ "$TRAVIS_PHP_VERSION" == "5.5.9" ] || [ "$TRAVIS_PHP_VERSION" == "5.5" ] || [ "$TRAVIS_PHP_VERSION" == "5.6" ]; then wget https://scrutinizer-ci.com/ocular.phar; fi 19 | - if [ "$TRAVIS_PHP_VERSION" == "5.5.9" ] || [ "$TRAVIS_PHP_VERSION" == "5.5" ] || [ "$TRAVIS_PHP_VERSION" == "5.6" ]; then php ocular.phar code-coverage:upload --format=php-clover build/logs/clover.xml; fi 20 | 21 | after_success: 22 | - bash <(curl -s https://codecov.io/bash) -------------------------------------------------------------------------------- /tests/database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | use Illuminate\Database\Schema\Blueprint; 12 | use Illuminate\Database\Migrations\Migration; 13 | 14 | class CreateUsersTable extends Migration 15 | { 16 | /** 17 | * Run the migrations. 18 | * 19 | * @return void 20 | */ 21 | public function up() 22 | { 23 | Schema::create('users', function (Blueprint $table) { 24 | $table->increments('id'); 25 | $table->string('name'); 26 | $table->timestamps(); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | * 33 | * @return void 34 | */ 35 | public function down() 36 | { 37 | Schema::drop('users'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Christopher Lass 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "arubacao/friends", 3 | "description": "Manage Friends in Laravel", 4 | "keywords": [ 5 | "laravel", 6 | "Lumen", 7 | "friend-system", 8 | "friendships", 9 | "friends", 10 | "relationships", 11 | "eloquent" 12 | ], 13 | "license": "MIT", 14 | "authors": [ 15 | { 16 | "name": "arubacao", 17 | "email": "arubacao@gmail.com" 18 | } 19 | ], 20 | "support": { 21 | "issues": "https://github.com/arubacao/friends/issues", 22 | "source": "https://github.com/arubacao/friends" 23 | }, 24 | "require": { 25 | "php": ">=5.6.0", 26 | "illuminate/database": "^5.2", 27 | "illuminate/support": "^5.2" 28 | }, 29 | "require-dev": { 30 | "phpunit/phpunit" : "^4.1", 31 | "mockery/mockery": "dev-master", 32 | "graham-campbell/testbench": "^3.2" 33 | }, 34 | "autoload": { 35 | "psr-4": { 36 | "Arubacao\\Friends\\": "src/Friends/" 37 | } 38 | }, 39 | "autoload-dev": { 40 | "classmap": [ 41 | "tests/models/User.php", 42 | "tests/AbstractTestCase.php" 43 | ] 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/unit/UnitTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | class UnitTest extends AbstractTestCase 12 | { 13 | 14 | /** 15 | * @test 16 | */ 17 | public function retrieveUserId_returns_user_id_for_user_model(){ 18 | $sender = factory(User::class)->create(); 19 | $id = $this->invokeMethod($sender, 'retrieveUserId', [$sender]); 20 | $this->assertEquals($sender->id, $id); 21 | } 22 | 23 | /** 24 | * @test 25 | */ 26 | public function retrieveUserId_returns_user_id_for_user_array(){ 27 | $sender = factory(User::class)->create(); 28 | $id = $this->invokeMethod($sender, 'retrieveUserId', [$sender->toArray()]); 29 | $this->assertEquals($sender->id, $id); 30 | } 31 | 32 | /** 33 | * @test 34 | */ 35 | public function retrieveUserId_returns_user_id_for_user_id_integer(){ 36 | $sender = factory(User::class)->create(); 37 | $id = $this->invokeMethod($sender, 'retrieveUserId', [$sender->id]); 38 | $this->assertEquals($sender->id, $id); 39 | } 40 | } -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 27 | 28 | 29 | ./tests 30 | 31 | 32 | 33 | 34 | ./src 35 | 36 | ./src/database/migrations/ 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/database/migrations/2016_06_18_000000_create_friends_table.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | use Illuminate\Database\Schema\Blueprint; 12 | use Illuminate\Database\Migrations\Migration; 13 | use Illuminate\Support\Facades\Config; 14 | 15 | class CreateFriendsTable extends Migration 16 | { 17 | /** 18 | * Run the migrations. 19 | * 20 | * @return void 21 | */ 22 | public function up() 23 | { 24 | Schema::create('friends', function (Blueprint $table) { 25 | $table->unsignedInteger('sender_id')->index(); 26 | $table->foreign('sender_id') 27 | ->references('id') 28 | ->on(Config::get('friends.users_table')) 29 | ->onDelete('cascade'); 30 | $table->unsignedInteger('recipient_id')->index(); 31 | $table->foreign('recipient_id') 32 | ->references('id') 33 | ->on(Config::get('friends.users_table')) 34 | ->onDelete('cascade'); 35 | $table->tinyInteger('friendship_status')->default(0); 36 | $table->timestamps(); 37 | }); 38 | } 39 | 40 | /** 41 | * Reverse the migrations. 42 | * 43 | * @return void 44 | */ 45 | public function down() 46 | { 47 | Schema::dropIfExists('friends'); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /.php_cs: -------------------------------------------------------------------------------- 1 | notPath('bootstrap/cache') 9 | ->notPath('storage') 10 | ->notPath('vendor') 11 | ->exclude('tests') 12 | ->in(__DIR__) 13 | ->name('*.php') 14 | ->ignoreDotFiles(true) 15 | ->ignoreVCS(true); 16 | 17 | $fixers = [ 18 | 'blankline_after_open_tag', 19 | 'braces', 20 | 'concat_without_spaces', 21 | 'double_arrow_multiline_whitespaces', 22 | 'duplicate_semicolon', 23 | 'elseif', 24 | 'empty_return', 25 | 'encoding', 26 | 'eof_ending', 27 | 'extra_empty_lines', 28 | 'function_call_space', 29 | 'function_declaration', 30 | 'include', 31 | 'indentation', 32 | 'join_function', 33 | 'line_after_namespace', 34 | 'linefeed', 35 | 'list_commas', 36 | 'logical_not_operators_with_successor_space', 37 | 'lowercase_constants', 38 | 'lowercase_keywords', 39 | 'method_argument_space', 40 | 'multiline_array_trailing_comma', 41 | 'multiline_spaces_before_semicolon', 42 | 'multiple_use', 43 | 'namespace_no_leading_whitespace', 44 | 'no_blank_lines_after_class_opening', 45 | 'no_empty_lines_after_phpdocs', 46 | 'object_operator', 47 | 'operators_spaces', 48 | 'parenthesis', 49 | 'phpdoc_indent', 50 | 'phpdoc_inline_tag', 51 | 'phpdoc_no_access', 52 | 'phpdoc_scalar', 53 | 'phpdoc_short_description', 54 | 'phpdoc_to_comment', 55 | 'phpdoc_trim', 56 | 'phpdoc_type_to_var', 57 | 'phpdoc_var_without_name', 58 | 'remove_leading_slash_use', 59 | 'remove_lines_between_uses', 60 | 'return', 61 | 'self_accessor', 62 | 'short_array_syntax', 63 | 'short_echo_tag', 64 | 'short_tag', 65 | 'single_array_no_trailing_comma', 66 | 'single_blank_line_before_namespace', 67 | 'single_line_after_imports', 68 | 'single_quote', 69 | 'spaces_before_semicolon', 70 | 'spaces_cast', 71 | 'standardize_not_equal', 72 | 'ternary_spaces', 73 | 'trailing_spaces', 74 | 'trim_array_spaces', 75 | 'unalign_equals', 76 | 'unary_operators_spaces', 77 | 'unused_use', 78 | 'visibility', 79 | 'whitespacy_lines', 80 | ]; 81 | 82 | return Config::create() 83 | ->finder($finder) 84 | ->fixers($fixers) 85 | ->level(FixerInterface::NONE_LEVEL) 86 | ->setUsingCache(true); -------------------------------------------------------------------------------- /src/Friends/FriendsServiceProvider.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | namespace Arubacao\Friends; 12 | 13 | use Illuminate\Support\ServiceProvider; 14 | 15 | class FriendsServiceProvider extends ServiceProvider 16 | { 17 | /** 18 | * Indicates if loading of the provider is deferred. 19 | * 20 | * @var bool 21 | */ 22 | protected $defer = false; 23 | 24 | /** 25 | * Bootstrap the application events. 26 | * 27 | * @return void 28 | */ 29 | public function boot() 30 | { 31 | $this->publishConfig(); 32 | $this->publishMigration(); 33 | } 34 | 35 | /** 36 | * Publish Friends configuration. 37 | */ 38 | protected function publishConfig() 39 | { 40 | if (function_exists('config_path')) { 41 | // Publish config files 42 | $this->publishes([ 43 | __DIR__.'/../config/friends.php' => config_path('friends.php'), 44 | ]); 45 | } 46 | } 47 | 48 | /** 49 | * Publish Friends migration. 50 | */ 51 | protected function publishMigration() 52 | { 53 | if (class_exists('CreateFriendsTable')) { 54 | return; 55 | } 56 | 57 | $published_migration = glob(database_path('/migrations/*_create_friends_table.php')); 58 | if (count($published_migration) != 0) { 59 | return; 60 | } 61 | 62 | $stub = __DIR__.'/../database/migrations/2016_06_18_000000_create_friends_table.php'; 63 | $target = database_path('/migrations/'.date('Y_m_d_His').'_create_friends_table.php'); 64 | $this->publishes([$stub => $target], 'migrations'); 65 | } 66 | 67 | /** 68 | * Register the service provider. 69 | * 70 | * @return void 71 | */ 72 | public function register() 73 | { 74 | if(method_exists($this->app,'configure')) { 75 | $this->app->configure('friends'); 76 | } 77 | $this->mergeConfig(); 78 | } 79 | 80 | /** 81 | * Merges user's and friends's configs. 82 | * 83 | * @return void 84 | */ 85 | protected function mergeConfig() 86 | { 87 | $this->mergeConfigFrom( 88 | __DIR__.'/../config/friends.php', 'friends' 89 | ); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /tests/AbstractTestCase.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | use Arubacao\Friends\FriendsServiceProvider; 12 | use GrahamCampbell\TestBench\AbstractPackageTestCase; 13 | 14 | abstract class AbstractTestCase extends AbstractPackageTestCase 15 | { 16 | /** 17 | * Get the service provider class. 18 | * 19 | * @param \Illuminate\Contracts\Foundation\Application $app 20 | * 21 | * @return string 22 | */ 23 | protected function getServiceProviderClass($app) 24 | { 25 | return FriendsServiceProvider::class; 26 | } 27 | /** 28 | * Define environment setup. 29 | * 30 | * @param \Illuminate\Foundation\Application $app 31 | * 32 | * @return void 33 | */ 34 | protected function getEnvironmentSetUp($app) 35 | { 36 | parent::getEnvironmentSetUp($app); 37 | 38 | $app['config']->set('friends.user_model', User::class); 39 | 40 | // \Schema::create('users', function ($table) { 41 | // $table->increments('id'); 42 | // $table->string('name'); 43 | // $table->timestamps(); 44 | // }); 45 | } 46 | 47 | /** 48 | * Setup the test environment. 49 | */ 50 | public function setUp() 51 | { 52 | parent::setUp(); 53 | 54 | $this->artisan('migrate', [ 55 | '--realpath' => realpath(__DIR__.'/database/migrations'), 56 | ]); 57 | 58 | $this->artisan('migrate', [ 59 | '--realpath' => realpath(__DIR__.'/../src/database/migrations'), 60 | ]); 61 | 62 | $this->withFactories(realpath(__DIR__.'/database/factories')); 63 | } 64 | 65 | /** 66 | * Call protected/private method of a class. 67 | * 68 | * @param object &$object Instantiated object that we will run method on. 69 | * @param string $methodName Method name to call 70 | * @param array $parameters Array of parameters to pass into method. 71 | * 72 | * @return mixed Method return. 73 | */ 74 | public function invokeMethod(&$object, $methodName, array $parameters = array()) 75 | { 76 | $reflection = new \ReflectionClass(get_class($object)); 77 | $method = $reflection->getMethod($methodName); 78 | $method->setAccessible(true); 79 | 80 | return $method->invokeArgs($object, $parameters); 81 | } 82 | } -------------------------------------------------------------------------------- /tests/functional/UserQueryTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | use Arubacao\Friends\FriendshipStatus; 12 | 13 | class UserQueryTest extends AbstractTestCase 14 | { 15 | 16 | /** 17 | * @test 18 | */ 19 | public function query_user_with_relationships() { 20 | $users = factory(User::class)->times(10)->create(); 21 | 22 | $users[0]->sendFriendRequestTo($users[1]); 23 | $users[1]->acceptFriendRequestFrom($users[0]); 24 | 25 | $users[0]->sendFriendRequestTo($users[2]); 26 | $users[2]->acceptFriendRequestFrom($users[0]); 27 | 28 | $users[0]->sendFriendRequestTo($users[3]); 29 | 30 | $users[4]->sendFriendRequestTo($users[0]); 31 | 32 | $results = User::includeRelationshipsWith($users[0])->get(); 33 | 34 | $users_with_relationships = collect([]); 35 | foreach ($results as $key => $result) { 36 | $users_with_relationships->put($key, $results->where('name', $users[$key]->name)->first()); 37 | } 38 | 39 | // User 0 : No relations with self 40 | $this->assertCount(0, $users_with_relationships[0]->friends_i_am_recipient); 41 | $this->assertCount(0, $users_with_relationships[0]->friends_i_am_sender); 42 | 43 | // User 1 : Friends with User 0 - Is Recipient 44 | $this->assertCount(1, $users_with_relationships[1]->friends_i_am_recipient); 45 | $this->assertCount(0, $users_with_relationships[1]->friends_i_am_sender); 46 | $this->assertEquals($users[1]->id, $users_with_relationships[1]->friends_i_am_recipient->first()->pivot->recipient_id); 47 | $this->assertEquals($users[0]->id, $users_with_relationships[1]->friends_i_am_recipient->first()->pivot->sender_id); 48 | $this->assertEquals(FriendshipStatus::ACCEPTED, $users_with_relationships[1]->friends_i_am_recipient->first()->pivot->friendship_status); 49 | 50 | // User 2 : Friends with User 0 - Is Recipient 51 | $this->assertCount(1, $users_with_relationships[2]->friends_i_am_recipient); 52 | $this->assertCount(0, $users_with_relationships[2]->friends_i_am_sender); 53 | $this->assertEquals($users[2]->id, $users_with_relationships[2]->friends_i_am_recipient->first()->pivot->recipient_id); 54 | $this->assertEquals($users[0]->id, $users_with_relationships[2]->friends_i_am_recipient->first()->pivot->sender_id); 55 | $this->assertEquals(FriendshipStatus::ACCEPTED, $users_with_relationships[2]->friends_i_am_recipient->first()->pivot->friendship_status); 56 | 57 | // User 3 : Pending Request from User 0 - Is Recipient 58 | $this->assertCount(1, $users_with_relationships[3]->friends_i_am_recipient); 59 | $this->assertCount(0, $users_with_relationships[3]->friends_i_am_sender); 60 | $this->assertEquals($users[3]->id, $users_with_relationships[3]->friends_i_am_recipient->first()->pivot->recipient_id); 61 | $this->assertEquals($users[0]->id, $users_with_relationships[3]->friends_i_am_recipient->first()->pivot->sender_id); 62 | $this->assertEquals(FriendshipStatus::PENDING, $users_with_relationships[3]->friends_i_am_recipient->first()->pivot->friendship_status); 63 | 64 | // User 4 : Pending Request for User 0 - Is Sender 65 | $this->assertCount(0, $users_with_relationships[4]->friends_i_am_recipient); 66 | $this->assertCount(1, $users_with_relationships[4]->friends_i_am_sender); 67 | $this->assertEquals($users[4]->id, $users_with_relationships[4]->friends_i_am_sender->first()->pivot->sender_id); 68 | $this->assertEquals($users[0]->id, $users_with_relationships[4]->friends_i_am_sender->first()->pivot->recipient_id); 69 | $this->assertEquals(FriendshipStatus::PENDING, $users_with_relationships[4]->friends_i_am_sender->first()->pivot->friendship_status); 70 | } 71 | 72 | 73 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Unmaintained 3 | This package is unmaintained and was only a quick hacking around. Don't use in production code. 4 | 5 | # Friends (Laravel 5 Package) 6 | 7 | [![Build Status](https://img.shields.io/travis/arubacao/friends/master.svg?style=flat-square)](https://travis-ci.org/arubacao/friends) 8 | [![Latest Version](https://img.shields.io/packagist/v/arubacao/friends.svg?style=flat-square)](https://packagist.org/packages/arubacao/friends) 9 | [![SensioLabsInsight](https://img.shields.io/sensiolabs/i/9c0e986c-44e0-417d-bd8c-96ea170bcb50.svg?style=flat-square)](https://insight.sensiolabs.com/projects/9c0e986c-44e0-417d-bd8c-96ea170bcb50) 10 | [![Quality Score](https://img.shields.io/scrutinizer/g/arubacao/friends.svg?style=flat-square)](https://scrutinizer-ci.com/g/arubacao/friends) 11 | [![Code Coverage](https://scrutinizer-ci.com/g/arubacao/friends/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/arubacao/friends/?branch=master) 12 | [![codecov](https://codecov.io/gh/arubacao/friends/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/arubacao/friends) 13 | [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) 14 | 15 | ## Organise Friends and Relationships Between Users in Laravel and Lumen. 16 | #### Friends provides everything you need to easily implement your own Facebook like Friend System. 17 | 18 | ## Users can: 19 | - Send Friend Requests 20 | - Accept Friend Requests 21 | - Deny Friend Requests 22 | - Delete Friends 23 | 24 | ## Contents 25 | 26 | - [Installation](#installation) 27 | - [Configuration](#configuration) 28 | - [Usage](#usage) 29 | - [Friend Requests](#friend-requests) 30 | - [Send Friend Request](#send-friend-request) 31 | - [Accept Friend Request](#accept-friend-request) 32 | - [Deny Friend Request](#deny-friend-request) 33 | - [My Friends](#my-friends) 34 | - [Is Friend With](#is-friend-with) 35 | - [Delete Friend](#delete-friend) 36 | - [Retrieve Friends](#retrieve-friends) 37 | - [Retrieve Incoming Friends](#retrieve-incoming-friends) 38 | - [Retrieve Any Friends](#retrieve-any-friends) 39 | - [Relationships](#relationships) 40 | - [Has Relationship With](#has-relationship-with) 41 | - [Get Relationship With](#get-relationship-with) 42 | - [Has Pending Request From](#has-pending-request-from) 43 | - [Query Users Including Relationships](#query-users) 44 | - [License](#license) 45 | 46 | 47 | ## Installation 48 | 49 | ## For Laravel 5.* 50 | 51 | ### Pull in Package with Composer 52 | `composer require arubacao/friends` 53 | 54 | ### Register Service Provider 55 | Include the service provider inside `config/app.php`. 56 | 57 | ```php 58 | 'providers' => [ 59 | ... 60 | Arubacao\Friends\FriendsServiceProvider::class, 61 | ... 62 | ]; 63 | ``` 64 | 65 | ### Run Migrations 66 | Publish the migration and migrate the database 67 | 68 | ```bash 69 | php artisan vendor:publish --provider="Arubacao\Friends\FriendsServiceProvider" 70 | php artisan migrate 71 | ``` 72 | 73 | After the migration, 1 new table will be created: 74 | 75 | - `friends` — stores [relationships/friendships](http://laravel.com/docs/5.2/eloquent-relationships#many-to-many) between Users 76 | 77 | The `vendor:publish` command will also create a `friends.php` file in your config directory. 78 | The default configuration should work just fine for most applications. 79 | Otherwise check out [Configuration](#configuration). 80 | 81 | ### Prepare User Model 82 | Include `Friendable` Trait in `User` Model 83 | ```php 84 | 85 | use Arubacao\Friends\Traits\Friendable; 86 | 87 | class User extends Model 88 | { 89 | use Friendable; // Add this trait to your model 90 | ... 91 | } 92 | ``` 93 | 94 | **And you are ready to go.** 95 | 96 | 97 | ## Configuration 98 | 99 | ### Configuration File `friends.php` _(Optional)_ 100 | Find `friends.php` in your config folder. Make sure you published the package beforehand. 101 | 102 | - `user_model` — This is the applications `User` model used by Friends. 103 | - `users_table` — This is the applications `users` table name used by Friends. 104 | 105 | 106 | ## Usage 107 | 108 | 109 | ### Friend Requests 110 | 111 | 112 | #### Send Friend Request 113 | ```php 114 | $user->sendFriendRequestTo($recipient); 115 | ``` 116 | `$user` must be instance of `User` 117 | `$recipient` must be instance of `User`, `User` array or integer (User id) 118 | 119 | 120 | #### Accept Friend Request 121 | ```php 122 | $user->acceptFriendRequestFrom($sender); 123 | ``` 124 | `$user` must be instance of `User` 125 | `$sender` must be instance of `User`, `User` array or integer (User id) 126 | 127 | 128 | #### Deny Friend Request 129 | ```php 130 | $user->denyFriendRequestFrom($sender); 131 | ``` 132 | `$user` must be instance of `User` 133 | `$sender` must be instance of `User`, `User` array or integer (User id) 134 | 135 | 136 | ### My Friends 137 | 138 | 139 | #### Delete Friend 140 | ```php 141 | $user->deleteFriend($douchebag); 142 | ``` 143 | `$user` must be instance of `User` 144 | `$douchebag` must be instance of `User`, `User` array or integer (User id) 145 | 146 | 147 | #### Retrieve Friends 148 | - Get all friends of a user 149 | - `status` is always `1` *ACCEPTED* 150 | 151 | ```php 152 | $friends = $user->friends(); 153 | ``` 154 | `$user` must be instance of `User` 155 | 156 | `$friends`: 157 | ```json 158 | [{ 159 | "id": 3, 160 | "name": "harri121", 161 | "created_at": "2016-06-18 19:08:45", 162 | "updated_at": "2016-06-18 19:08:45", 163 | "pivot": { 164 | "sender_id": 1, 165 | "recipient_id": 3, 166 | "created_at": "2016-06-19 19:53:27", 167 | "updated_at": "2016-06-19 22:56:40", 168 | "status": 1 169 | } 170 | }] 171 | ``` 172 | 173 | 174 | #### Retrieve Incoming Friends 175 | - Get all users who send friend request to `$user` 176 | - `status` is always `0` *PENDING* 177 | - `recipient_id` is always `id` of `$user` 178 | 179 | ```php 180 | $friends = $user->incoming_friends(); 181 | ``` 182 | `$user` must be instance of `User` 183 | 184 | `$friends`: 185 | ```json 186 | [{ 187 | "id": 3, 188 | "name": "ejoebstl", 189 | "created_at": "2016-06-18 19:08:45", 190 | "updated_at": "2016-06-18 19:08:45", 191 | "pivot": { 192 | "sender_id": 3, 193 | "recipient_id": 1, 194 | "created_at": "2016-06-19 19:53:27", 195 | "updated_at": "2016-06-19 22:56:40", 196 | "status": 0 197 | } 198 | }] 199 | ``` 200 | 201 | 202 | #### Retrieve Any Friends 203 | **Remember:** 204 | > Just like in the real life a 'friend' or 'friendship' can be anything, also negative ;) 205 | 206 | - Get all users who have any kind of friendship/relationship with `$user` 207 | 208 | ```php 209 | $friends = $user->any_friends(); 210 | ``` 211 | `$user` must be instance of `User` 212 | 213 | `$friends`: 214 | ```json 215 | [{ 216 | "id": 3, 217 | "name": "harri121", 218 | "created_at": "2016-06-18 19:08:45", 219 | "updated_at": "2016-06-18 19:08:45", 220 | "pivot": { 221 | "sender_id": 1, 222 | "recipient_id": 3, 223 | "created_at": "2016-06-19 19:53:27", 224 | "updated_at": "2016-06-19 22:56:40", 225 | "status": 1 226 | } 227 | }, 228 | { 229 | "id": 2, 230 | "name": "ejoebstl", 231 | "created_at": "2016-06-18 19:08:41", 232 | "updated_at": "2016-06-18 19:08:41", 233 | "pivot": { 234 | "recipient_id": 1, 235 | "sender_id": 2, 236 | "created_at": "2016-06-19 19:53:27", 237 | "updated_at": "2016-06-19 19:53:27", 238 | "status": 0 239 | } 240 | }] 241 | ``` 242 | 243 | 244 | ### Relationships 245 | 246 | 247 | #### Has Relationship With 248 | ```php 249 | $user->hasRelationshipWith($person, $status); 250 | ``` 251 | `$user` must be instance of `User` 252 | `$person` must be instance of `User`, `User` array or integer (User id) 253 | `$status` must be array of integers (`Status`) 254 | 255 | 256 | #### Get Relationship With 257 | ```php 258 | $user->getRelationshipWith($person, $status); 259 | ``` 260 | `$user` must be instance of `User` 261 | `$person` must be instance of `User`, `User` array or integer (User id) 262 | `$status` must be array of integers (`Status`) 263 | 264 | 265 | #### Has Pending Request From 266 | ```php 267 | $user->hasPendingRequestFrom($person); 268 | ``` 269 | `$user` must be instance of `User` 270 | `$person` must be instance of `User`, `User` array or integer (User id) 271 | 272 | 273 | ### Query Users Including Relationships 274 | 275 | ```php 276 | $users = \App\User::whereIn('id', [2,3,4]) 277 | ->includeRelationshipsWith(1) 278 | ->get(); 279 | ``` 280 | 281 | `$users`: 282 | ```json 283 | [{ 284 | "id": 2, 285 | "name": "ejoebstl", 286 | "created_at": "2016-06-18 19:08:41", 287 | "updated_at": "2016-06-18 19:08:41", 288 | "friends_i_am_sender": [{ 289 | "id": 1, 290 | "name": "arubacao", 291 | "created_at": "2016-06-18 19:08:35", 292 | "updated_at": "2016-06-18 19:08:35", 293 | "pivot": { 294 | "sender_id": 2, 295 | "recipient_id": 1, 296 | "created_at": "2016-06-19 19:53:27", 297 | "updated_at": "2016-06-19 19:53:27", 298 | "status": 0 299 | } 300 | }], 301 | "friends_i_am_recipient": [] 302 | }, 303 | { 304 | "id": 3, 305 | "name": "harri121", 306 | "created_at": "2016-06-18 19:08:45", 307 | "updated_at": "2016-06-18 19:08:45", 308 | "friends_i_am_sender": [], 309 | "friends_i_am_recipient": [{ 310 | "id": 1, 311 | "name": "arubacao", 312 | "created_at": "2016-06-18 19:08:35", 313 | "updated_at": "2016-06-18 19:08:35", 314 | "pivot": { 315 | "recipient_id": 3, 316 | "sender_id": 1, 317 | "created_at": "2016-06-19 19:53:27", 318 | "updated_at": "2016-06-19 22:56:40", 319 | "status": 1 320 | } 321 | }] 322 | }, 323 | { 324 | "id": 4, 325 | "name": "random_user", 326 | "created_at": "2016-06-19 19:55:25", 327 | "updated_at": "2016-06-19 19:55:25", 328 | "friends_i_am_sender": [], 329 | "friends_i_am_recipient": [] 330 | }] 331 | ``` 332 | 333 | 334 | 335 | ## License 336 | 337 | Friends is free software distributed under the terms of the MIT license. 338 | 339 | [![Analytics](https://ga-beacon.appspot.com/UA-77737156-1/readme?pixel)](https://github.com/arubacao/friends) 340 | -------------------------------------------------------------------------------- /src/Friends/Traits/Friendable.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | namespace Arubacao\Friends\Traits; 12 | 13 | use Arubacao\Friends\FriendshipStatus; 14 | use Illuminate\Support\Facades\Config; 15 | 16 | trait Friendable 17 | { 18 | /** 19 | * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany 20 | */ 21 | public function friends_i_am_sender() 22 | { 23 | return $this->belongsToMany( 24 | Config::get('friends.user_model'), 25 | 'friends', 26 | 'sender_id', 'recipient_id') 27 | ->withTimestamps() 28 | ->withPivot([ 29 | 'friendship_status', 30 | ]) 31 | ->orderBy('friends.updated_at', 'desc'); 32 | } 33 | 34 | /** 35 | * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany 36 | */ 37 | public function friends_i_am_recipient() 38 | { 39 | return $this->belongsToMany( 40 | Config::get('friends.user_model'), 41 | 'friends', 42 | 'recipient_id', 'sender_id') 43 | ->withTimestamps() 44 | ->withPivot([ 45 | 'friendship_status', 46 | ]) 47 | ->orderBy('friends.updated_at', 'desc'); 48 | } 49 | 50 | /** 51 | * @return \Illuminate\Database\Eloquent\Builder 52 | */ 53 | public function scopeIncludeRelationshipsWith($query, $user) 54 | { 55 | $userId = $this->retrieveUserId($user); 56 | 57 | return $query->with([ 58 | 'friends_i_am_sender' => function ($queryIn) use ($userId) { 59 | $queryIn->where('friends.recipient_id', $userId) 60 | ->get(); 61 | }, 62 | 'friends_i_am_recipient' => function ($queryIn) use ($userId) { 63 | $queryIn->where('friends.sender_id', $userId) 64 | ->get(); 65 | }, 66 | ]); 67 | } 68 | 69 | /** 70 | * @return \Illuminate\Database\Eloquent\Collection 71 | */ 72 | public function friends() 73 | { 74 | $me = $this->with([ 75 | 'friends_i_am_sender' => function ($query) { 76 | $query->where('friends.friendship_status', FriendshipStatus::ACCEPTED) 77 | ->get(); 78 | }, 79 | 'friends_i_am_recipient' => function ($query) { 80 | $query->where('friends.friendship_status', FriendshipStatus::ACCEPTED) 81 | ->get(); 82 | }, 83 | ]) 84 | ->where('id', '=', $this->getKey()) 85 | ->first(); 86 | 87 | $friends = $this->mergedFriends($me); 88 | 89 | return $friends; 90 | } 91 | 92 | /** 93 | * @return \Illuminate\Database\Eloquent\Collection 94 | */ 95 | public function incoming_friends() 96 | { 97 | $me = $this->with([ 98 | 'friends_i_am_recipient' => function ($query) { 99 | $query->where('friends.friendship_status', FriendshipStatus::PENDING) 100 | ->get(); 101 | }, 102 | ]) 103 | ->where('id', '=', $this->getKey()) 104 | ->first(); 105 | 106 | return $me->friends_i_am_recipient; 107 | } 108 | 109 | /** 110 | * @return \Illuminate\Database\Eloquent\Collection 111 | */ 112 | public function any_friends() 113 | { 114 | $me = $this->with([ 115 | 'friends_i_am_sender', 116 | 'friends_i_am_recipient', 117 | ]) 118 | ->where('id', '=', $this->getKey()) 119 | ->first(); 120 | 121 | $any_friends = $this->mergedFriends($me); 122 | 123 | return $any_friends; 124 | } 125 | 126 | /** 127 | * Alias to eloquent many-to-many relation's attach() method. 128 | * 129 | * @param int|User $user 130 | * @return bool 131 | */ 132 | public function sendFriendRequestTo($user) 133 | { 134 | $userId = $this->retrieveUserId($user); 135 | 136 | if ($userId == $this->getKey()) { 137 | // Method not allowed on self 138 | return false; 139 | } 140 | 141 | $relationship = $this->getRelationshipWith($userId, [ 142 | FriendshipStatus::PENDING, 143 | FriendshipStatus::ACCEPTED, 144 | ]); 145 | 146 | if (! is_null($relationship)) { 147 | if ($relationship->pivot->friendship_status == FriendshipStatus::ACCEPTED) { 148 | // Already friends 149 | return false; 150 | } 151 | if ($relationship->pivot->friendship_status == FriendshipStatus::PENDING && 152 | $relationship->pivot->recipient_id == $this->getKey()) { 153 | // Recipient already sent a friend request 154 | // Accept pending friend request 155 | $relationship->pivot->friendship_status = FriendshipStatus::ACCEPTED; 156 | $relationship->pivot->save(); 157 | /* @todo: fire event friend request accepted */ 158 | $this->reload(); 159 | 160 | return true; 161 | } 162 | 163 | return false; 164 | } 165 | 166 | $this->friends_i_am_sender()->attach($userId, [ 167 | 'friendship_status' => FriendshipStatus::PENDING, 168 | ]); 169 | /* @todo: fire event friend request sent */ 170 | 171 | $this->reload(); 172 | 173 | return true; 174 | } 175 | 176 | /** 177 | * @param int|User $user 178 | * @return bool 179 | */ 180 | public function acceptFriendRequestFrom($user) 181 | { 182 | $userId = $this->retrieveUserId($user); 183 | 184 | if ($userId == $this->getKey()) { 185 | // Method not allowed on self 186 | return false; 187 | } 188 | 189 | $relationship = $this->getPendingRequestFrom($userId); 190 | 191 | if (! is_null($relationship)) { 192 | $relationship->pivot->friendship_status = FriendshipStatus::ACCEPTED; 193 | $relationship->pivot->save(); 194 | /* @todo: fire event friend request accepted */ 195 | $this->reload(); 196 | 197 | return true; 198 | } 199 | 200 | return false; 201 | } 202 | 203 | /** 204 | * @param int|User $user 205 | * @return bool 206 | */ 207 | public function denyFriendRequestFrom($user) 208 | { 209 | $userId = $this->retrieveUserId($user); 210 | 211 | if ($userId == $this->getKey()) { 212 | // Method not allowed on self 213 | return false; 214 | } 215 | 216 | $relationship = $this->getPendingRequestFrom($userId); 217 | 218 | if (! is_null($relationship)) { 219 | $relationship->pivot->delete(); 220 | /* @todo: fire event friend request denied */ 221 | $this->reload(); 222 | 223 | return true; 224 | } 225 | 226 | return false; 227 | } 228 | 229 | /** 230 | * @param int|User $user 231 | * @return bool 232 | */ 233 | public function deleteFriend($user) 234 | { 235 | $userId = $this->retrieveUserId($user); 236 | 237 | if ($userId == $this->getKey()) { 238 | // Method not allowed on self 239 | return false; 240 | } 241 | 242 | while ($relationship = $this->getRelationshipWith($userId, [ 243 | FriendshipStatus::ACCEPTED, 244 | FriendshipStatus::PENDING, 245 | ])) { 246 | $relationship->pivot->delete(); 247 | /* @todo: fire event friend deleted */ 248 | } 249 | $this->reload(); 250 | 251 | return true; 252 | } 253 | 254 | /** 255 | * @param int|array|User $user 256 | * @return bool 257 | */ 258 | public function isFriendWith($user) 259 | { 260 | $userId = $this->retrieveUserId($user); 261 | 262 | return $this->hasRelationshipWith($userId, [FriendshipStatus::ACCEPTED]); 263 | } 264 | 265 | /** 266 | * @param int|array|User $user 267 | * @param array $status 268 | * @return bool 269 | */ 270 | public function hasRelationshipWith($user, $status) 271 | { 272 | $userId = $this->retrieveUserId($user); 273 | 274 | $relationship = $this->getRelationshipWith($userId, $status); 275 | 276 | return (is_null($relationship)) ? false : true; 277 | } 278 | 279 | /** 280 | * @param int|array|User $user 281 | * @param array $status 282 | * @return mixed 283 | */ 284 | public function getRelationshipWith($user, $status) 285 | { 286 | $userId = $this->retrieveUserId($user); 287 | 288 | if ($userId == $this->getKey()) { 289 | // Method not allowed on self 290 | return; 291 | } 292 | 293 | $attempt1 = $this->friends_i_am_recipient() 294 | ->wherePivotIn('friendship_status', $status) 295 | ->wherePivot('sender_id', $userId) 296 | ->first(); 297 | 298 | if (! is_null($attempt1)) { 299 | return $attempt1; 300 | } 301 | 302 | $attempt2 = $this->friends_i_am_sender() 303 | ->wherePivotIn('friendship_status', $status) 304 | ->wherePivot('recipient_id', $userId) 305 | ->first(); 306 | 307 | if (! is_null($attempt2)) { 308 | return $attempt2; 309 | } 310 | } 311 | 312 | /** 313 | * @param int|array|User $user 314 | * @return bool 315 | */ 316 | public function hasPendingRequestFrom($user) 317 | { 318 | $userId = $this->retrieveUserId($user); 319 | 320 | if ($userId == $this->getKey()) { 321 | // Method not allowed on self 322 | return false; 323 | } 324 | 325 | $relationship = $this->getPendingRequestFrom($userId); 326 | 327 | if (! is_null($relationship)) { 328 | return true; 329 | } 330 | 331 | return false; 332 | } 333 | 334 | /** 335 | * @param int|array|User $user 336 | * @return int|null 337 | */ 338 | private function retrieveUserId($user) 339 | { 340 | if (is_object($user)) { 341 | return $user->getKey(); 342 | } 343 | if (is_array($user) && isset($user['id'])) { 344 | return $user['id']; 345 | } 346 | 347 | return $user; 348 | } 349 | 350 | /** 351 | * @param int $userId 352 | * @return mixed 353 | */ 354 | private function getPendingRequestFrom($userId) 355 | { 356 | return $this->friends_i_am_recipient() 357 | ->wherePivot('friendship_status', FriendshipStatus::PENDING) 358 | ->wherePivot('sender_id', $userId) 359 | ->first(); 360 | } 361 | 362 | /** 363 | * Eager load relations on the model. 364 | */ 365 | private function reload() 366 | { 367 | $this->load('friends_i_am_recipient', 'friends_i_am_sender'); 368 | } 369 | 370 | /** 371 | * @param User $me 372 | * @return \Illuminate\Database\Eloquent\Collection 373 | */ 374 | private function mergedFriends($me) 375 | { 376 | $friends = collect([]); 377 | $friends->push($me->friends_i_am_sender); 378 | $friends->push($me->friends_i_am_recipient); 379 | $friends = $friends->flatten(); 380 | 381 | return $friends; 382 | } 383 | } 384 | -------------------------------------------------------------------------------- /tests/functional/FriendsTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | use Arubacao\Friends\FriendshipStatus; 12 | 13 | class FriendsTest extends AbstractTestCase 14 | { 15 | use \Illuminate\Foundation\Testing\DatabaseTransactions; 16 | // use \Illuminate\Foundation\Testing\DatabaseMigrations; 17 | 18 | /** 19 | * @test 20 | */ 21 | public function a_user_can_send_a_user_a_friend_request() { 22 | $sender = factory(User::class)->create(); 23 | $recipient = factory(User::class)->create(); 24 | 25 | $bool = $sender->sendFriendRequestTo($recipient); 26 | 27 | $this->assertTrue($bool); 28 | $this->seeInDatabase('friends', [ 29 | 'sender_id' => $sender->id, 30 | 'recipient_id' => $recipient->id, 31 | 'friendship_status' => FriendshipStatus::PENDING, 32 | ]); 33 | $this->dontSeeInDatabase('friends', [ 34 | 'recipient_id' => $sender->id, 35 | 'sender_id' => $recipient->id, 36 | 'friendship_status' => FriendshipStatus::PENDING, 37 | ]); 38 | $this->assertCount(1, $sender->any_friends()); 39 | $this->assertCount(1, $recipient->any_friends()); 40 | $this->assertTrue($recipient->hasPendingRequestFrom($sender)); 41 | $this->assertFalse($sender->hasPendingRequestFrom($recipient)); 42 | } 43 | 44 | /** 45 | * @test 46 | */ 47 | public function a_user_can_not_send_a_user_a_friend_request_to_himself() { 48 | $sender = factory(User::class)->create(); 49 | 50 | $bool = $sender->sendFriendRequestTo($sender); 51 | 52 | $this->assertFalse($bool); 53 | $this->dontSeeInDatabase('friends', [ 54 | 'recipient_id' => $sender->id, 55 | ]); 56 | $this->dontSeeInDatabase('friends', [ 57 | 'sender_id' => $sender->id, 58 | ]); 59 | $this->assertCount(0, $sender->any_friends()); 60 | } 61 | 62 | /** 63 | * @test 64 | */ 65 | public function a_user_can_only_send_one_friend_request_to_a_user() { 66 | $sender = factory(User::class)->create(); 67 | $recipient = factory(User::class)->create(); 68 | 69 | $true = $sender->sendFriendRequestTo($recipient); 70 | $false1 = $sender->sendFriendRequestTo($recipient); 71 | $false2 = $sender->sendFriendRequestTo($recipient); 72 | $false3 = $sender->sendFriendRequestTo($recipient); 73 | 74 | 75 | $this->assertTrue($true); 76 | $this->assertFalse($false1); 77 | $this->assertFalse($false2); 78 | $this->assertFalse($false3); 79 | $this->seeInDatabase('friends', [ 80 | 'sender_id' => $sender->id, 81 | 'recipient_id' => $recipient->id, 82 | 'friendship_status' => FriendshipStatus::PENDING, 83 | ]); 84 | $this->dontSeeInDatabase('friends', [ 85 | 'recipient_id' => $sender->id, 86 | 'sender_id' => $recipient->id, 87 | 'friendship_status' => FriendshipStatus::PENDING, 88 | ]); 89 | $this->assertCount(1, $sender->any_friends()); 90 | $this->assertCount(1, $recipient->any_friends()); 91 | $this->assertTrue($recipient->hasPendingRequestFrom($sender)); 92 | $this->assertFalse($sender->hasPendingRequestFrom($recipient)); 93 | } 94 | 95 | /** 96 | * @test 97 | */ 98 | public function a_user_can_not_send_a_new_friend_request_to_a_friend() { 99 | $sender = factory(User::class)->create(); 100 | $recipient = factory(User::class)->create(); 101 | 102 | $true1 = $sender->sendFriendRequestTo($recipient); 103 | $true2 = $recipient->acceptFriendRequestFrom($sender); 104 | $false = $sender->sendFriendRequestTo($recipient); 105 | 106 | $this->assertTrue($true1); 107 | $this->assertTrue($true2); 108 | $this->assertFalse($false); 109 | $this->seeInDatabase('friends', [ 110 | 'sender_id' => $sender->id, 111 | 'recipient_id' => $recipient->id, 112 | 'friendship_status' => FriendshipStatus::ACCEPTED, 113 | ]); 114 | $this->dontSeeInDatabase('friends', [ 115 | 'sender_id' => $sender->id, 116 | 'recipient_id' => $recipient->id, 117 | 'friendship_status' => FriendshipStatus::PENDING, 118 | ]); 119 | $this->assertCount(1, $sender->any_friends()); 120 | $this->assertCount(1, $sender->friends()); 121 | $this->assertCount(1, $recipient->any_friends()); 122 | $this->assertCount(1, $recipient->friends()); 123 | $this->assertFalse($recipient->hasPendingRequestFrom($sender)); 124 | $this->assertFalse($sender->hasPendingRequestFrom($recipient)); 125 | } 126 | 127 | /** 128 | * @test 129 | */ 130 | public function a_user_can_not_send_a_new_friend_request_to_a_friend_2() { 131 | $sender = factory(User::class)->create(); 132 | $recipient = factory(User::class)->create(); 133 | 134 | $true1 = $sender->sendFriendRequestTo($recipient); 135 | $true2 = $recipient->acceptFriendRequestFrom($sender); 136 | $false = $recipient->sendFriendRequestTo($sender); 137 | 138 | $this->assertTrue($true1); 139 | $this->assertTrue($true2); 140 | $this->assertFalse($false); 141 | $this->seeInDatabase('friends', [ 142 | 'sender_id' => $sender->id, 143 | 'recipient_id' => $recipient->id, 144 | 'friendship_status' => FriendshipStatus::ACCEPTED, 145 | ]); 146 | $this->dontSeeInDatabase('friends', [ 147 | 'sender_id' => $sender->id, 148 | 'recipient_id' => $recipient->id, 149 | 'friendship_status' => FriendshipStatus::PENDING, 150 | ]); 151 | $this->dontSeeInDatabase('friends', [ 152 | 'sender_id' => $recipient->id, 153 | 'recipient_id' => $sender->id, 154 | 'friendship_status' => FriendshipStatus::PENDING, 155 | ]); 156 | $this->assertCount(1, $sender->any_friends()); 157 | $this->assertCount(1, $sender->friends()); 158 | $this->assertCount(1, $recipient->any_friends()); 159 | $this->assertCount(1, $recipient->friends()); 160 | $this->assertFalse($recipient->hasPendingRequestFrom($sender)); 161 | $this->assertFalse($sender->hasPendingRequestFrom($recipient)); 162 | } 163 | 164 | /** 165 | * @test 166 | */ 167 | public function a_user_can_delete_a_friend() { 168 | $sender = factory(User::class)->create(); 169 | $recipient = factory(User::class)->create(); 170 | 171 | $sender->sendFriendRequestTo($recipient); 172 | $recipient->acceptFriendRequestFrom($sender); 173 | $sender->deleteFriend($recipient); 174 | 175 | $this->dontSeeInDatabase('friends', [ 176 | 'sender_id' => $sender->id, 177 | ]); 178 | $this->assertCount(0, $sender->any_friends()); 179 | $this->assertCount(0, $recipient->any_friends()); 180 | $this->assertFalse($recipient->isFriendWith($sender)); 181 | $this->assertFalse($sender->isFriendWith($recipient)); 182 | } 183 | 184 | /** 185 | * @test 186 | */ 187 | public function a_user_can_accept_a_friend_request() { 188 | $sender = factory(User::class)->create(); 189 | $recipient = factory(User::class)->create(); 190 | 191 | $sender->sendFriendRequestTo($recipient); 192 | $recipient->acceptFriendRequestFrom($sender); 193 | 194 | $this->seeInDatabase('friends', [ 195 | 'sender_id' => $sender->id, 196 | 'recipient_id' => $recipient->id, 197 | 'friendship_status' => FriendshipStatus::ACCEPTED, 198 | ]); 199 | $this->dontSeeInDatabase('friends', [ 200 | 'sender_id' => $sender->id, 201 | 'recipient_id' => $recipient->id, 202 | 'friendship_status' => FriendshipStatus::PENDING, 203 | ]); 204 | 205 | $this->assertCount(1, $sender->friends()); 206 | $this->assertCount(1, $recipient->friends()); 207 | } 208 | 209 | /** 210 | * @test 211 | */ 212 | public function a_user_is_friend_with_a_user_after_a_friend_request() { 213 | $sender = factory(User::class)->create(); 214 | $recipient = factory(User::class)->create(); 215 | 216 | $sender->sendFriendRequestTo($recipient); 217 | $recipient->sendFriendRequestTo($sender); 218 | 219 | $this->assertTrue($sender->isFriendWith($recipient)); 220 | $this->assertTrue($recipient->isFriendWith($sender)); 221 | } 222 | 223 | /** 224 | * @test 225 | */ 226 | public function a_user_can_deny_a_friend_request() { 227 | $sender = factory(User::class)->create(); 228 | $recipient = factory(User::class)->create(); 229 | 230 | $sender->sendFriendRequestTo($recipient); 231 | $recipient->denyFriendRequestFrom($sender); 232 | 233 | $this->dontSeeInDatabase('friends', [ 234 | 'sender_id' => $sender->id, 235 | ]); 236 | $this->dontSeeInDatabase('friends', [ 237 | 'recipient_id' => $recipient->id, 238 | ]); 239 | 240 | $this->assertCount(0, $sender->any_friends()); 241 | $this->assertCount(0, $recipient->any_friends()); 242 | } 243 | 244 | /** 245 | * @test 246 | */ 247 | public function a_user_can_not_accept_a_non_existing_friend_request() { 248 | $sender = factory(User::class)->create(); 249 | $recipient = factory(User::class)->create(); 250 | 251 | $bool = $recipient->acceptFriendRequestFrom($sender); 252 | 253 | $this->assertFalse($bool); 254 | $this->dontSeeInDatabase('friends', [ 255 | 'sender_id' => $recipient->id, 256 | 'recipient_id' => $sender->id, 257 | ]); 258 | $this->dontSeeInDatabase('friends', [ 259 | 'sender_id' => $sender->id, 260 | 'recipient_id' => $recipient->id, 261 | ]); 262 | 263 | $this->assertCount(0, $sender->friends()); 264 | $this->assertCount(0, $recipient->friends()); 265 | $this->assertCount(0, $sender->any_friends()); 266 | $this->assertCount(0, $recipient->any_friends()); 267 | } 268 | 269 | /** 270 | * @test 271 | */ 272 | public function a_friend_request_results_in_a_accepted_if_pending_request_is_available_from_recipient() { 273 | $sender = factory(User::class)->create(); 274 | $recipient = factory(User::class)->create(); 275 | 276 | $sender->sendFriendRequestTo($recipient); 277 | $recipient->sendFriendRequestTo($sender); 278 | 279 | $this->seeInDatabase('friends', [ 280 | 'sender_id' => $sender->id, 281 | 'recipient_id' => $recipient->id, 282 | 'friendship_status' => FriendshipStatus::ACCEPTED, 283 | ]); 284 | $this->dontSeeInDatabase('friends', [ 285 | 'sender_id' => $sender->id, 286 | 'recipient_id' => $recipient->id, 287 | 'friendship_status' => FriendshipStatus::PENDING, 288 | ]); 289 | $this->dontSeeInDatabase('friends', [ 290 | 'sender_id' => $recipient->id, 291 | 'recipient_id' => $sender->id, 292 | 'friendship_status' => FriendshipStatus::PENDING, 293 | ]); 294 | 295 | $this->assertCount(1, $sender->friends()); 296 | $this->assertCount(1, $recipient->friends()); 297 | } 298 | 299 | /** 300 | * @test 301 | */ 302 | public function friends_method_returns_empty_array_after_friend_request() { 303 | $sender = factory(User::class)->create(); 304 | $recipient = factory(User::class)->create(); 305 | 306 | $sender->sendFriendRequestTo($recipient); 307 | 308 | $this->assertCount(0, $sender->friends()); 309 | $this->assertCount(0, $recipient->friends()); 310 | } 311 | 312 | /** 313 | * @test 314 | */ 315 | public function friends_method_returns_correct_count_of_friends__2_requests_and_2_accepts() { 316 | $sender = factory(User::class)->create(); 317 | $recipient1 = factory(User::class)->create(); 318 | $recipient2 = factory(User::class)->create(); 319 | 320 | $sender->sendFriendRequestTo($recipient1); 321 | $sender->sendFriendRequestTo($recipient2); 322 | $recipient1->acceptFriendRequestFrom($sender); 323 | $recipient2->acceptFriendRequestFrom($sender); 324 | 325 | $this->seeInDatabase('friends', [ 326 | 'sender_id' => $sender->id, 327 | 'recipient_id' => $recipient1->id, 328 | 'friendship_status' => FriendshipStatus::ACCEPTED, 329 | ]); 330 | $this->seeInDatabase('friends', [ 331 | 'sender_id' => $sender->id, 332 | 'recipient_id' => $recipient2->id, 333 | 'friendship_status' => FriendshipStatus::ACCEPTED, 334 | ]); 335 | $this->assertCount(2, $sender->friends()); 336 | $this->assertCount(1, $recipient1->friends()); 337 | $this->assertCount(1, $recipient2->friends()); 338 | } 339 | 340 | /** 341 | * @test 342 | */ 343 | public function friends_method_returns_correct_count_of_friends__50_requests_and_50_accepts() { 344 | $sender = factory(User::class)->create(); 345 | $recipients = factory(User::class)->times(50)->create(); 346 | 347 | foreach ($recipients as $recipient) { 348 | $sender->sendFriendRequestTo($recipient); 349 | $recipient->acceptFriendRequestFrom($sender); 350 | $this->assertCount(1, $recipient->friends()); 351 | } 352 | 353 | $this->assertCount(50, $sender->friends()); 354 | } 355 | 356 | /** 357 | * @test 358 | */ 359 | public function friends_method_returns_correct_count_of_friends__50_requests_and_25_accepts() { 360 | $sender = factory(User::class)->create(); 361 | $recipients = factory(User::class)->times(50)->create(); 362 | 363 | foreach ($recipients as $key => $recipient) { 364 | $sender->sendFriendRequestTo($recipient); 365 | if ($key % 2) { 366 | $recipient->acceptFriendRequestFrom($sender); 367 | $this->assertCount(1, $recipient->friends()); 368 | continue; 369 | } 370 | $this->assertCount(0, $recipient->friends()); 371 | } 372 | 373 | $this->assertCount(25, $sender->friends()); 374 | } 375 | 376 | /** 377 | * @test 378 | */ 379 | public function friends_method_returns_correct_friends__2_requests_and_2_accepts() { 380 | $sender = factory(User::class)->create(); 381 | $recipient0 = factory(User::class)->create(); 382 | $recipient1 = factory(User::class)->create(); 383 | 384 | $sender->sendFriendRequestTo($recipient0); 385 | $sender->sendFriendRequestTo($recipient1); 386 | $recipient0->acceptFriendRequestFrom($sender); 387 | $recipient1->acceptFriendRequestFrom($sender); 388 | 389 | $this->seeInDatabase('friends', [ 390 | 'sender_id' => $sender->id, 391 | 'recipient_id' => $recipient0->id, 392 | 'friendship_status' => FriendshipStatus::ACCEPTED, 393 | ]); 394 | $this->seeInDatabase('friends', [ 395 | 'sender_id' => $sender->id, 396 | 'recipient_id' => $recipient1->id, 397 | 'friendship_status' => FriendshipStatus::ACCEPTED, 398 | ]); 399 | $friends = $sender->friends(); 400 | $this->assertEquals($recipient0->id, $friends[0]->id); 401 | $this->assertEquals($recipient1->id, $friends[1]->id); 402 | } 403 | 404 | /** 405 | * @test 406 | */ 407 | public function any_friends_method_returns_1_user_after_friend_request() { 408 | $sender = factory(User::class)->create(); 409 | $recipient = factory(User::class)->create(); 410 | 411 | $sender->sendFriendRequestTo($recipient); 412 | 413 | $this->assertCount(1, $sender->any_friends()); 414 | $this->assertCount(1, $recipient->any_friends()); 415 | } 416 | 417 | /** 418 | * @test 419 | */ 420 | public function any_friends_method_returns_correct_count_of_any_friends__50_requests_and_25_accepts() { 421 | $sender = factory(User::class)->create(); 422 | $recipients = factory(User::class)->times(50)->create(); 423 | 424 | foreach ($recipients as $key => $recipient) { 425 | $sender->sendFriendRequestTo($recipient); 426 | if ($key % 2) { 427 | $recipient->acceptFriendRequestFrom($sender); 428 | $this->assertCount(1, $recipient->any_friends()); 429 | continue; 430 | } 431 | $this->assertCount(1, $recipient->any_friends()); 432 | } 433 | 434 | $this->assertCount(50, $sender->any_friends()); 435 | } 436 | 437 | /** 438 | * @test 439 | */ 440 | public function any_friends_method_returns_correct_count_of_any_friends__50_requests_and_25_accepts_25_denies() { 441 | $sender = factory(User::class)->create(); 442 | $recipients = factory(User::class)->times(50)->create(); 443 | 444 | foreach ($recipients as $key => $recipient) { 445 | $sender->sendFriendRequestTo($recipient); 446 | if ($key % 2) { 447 | $recipient->acceptFriendRequestFrom($sender); 448 | $this->assertCount(1, $recipient->any_friends()); 449 | continue; 450 | } 451 | $recipient->denyFriendRequestFrom($sender); 452 | $this->assertCount(0, $recipient->any_friends()); 453 | } 454 | 455 | $this->assertCount(25, $sender->any_friends()); 456 | } 457 | 458 | /** 459 | * @test 460 | */ 461 | public function incoming_friends_method_returns_1_user_after_friend_request() { 462 | $sender = factory(User::class)->create(); 463 | $recipient = factory(User::class)->create(); 464 | 465 | $sender->sendFriendRequestTo($recipient); 466 | 467 | $this->assertCount(0, $sender->incoming_friends()); 468 | $this->assertCount(1, $recipient->incoming_friends()); 469 | } 470 | 471 | /** 472 | * @test 473 | */ 474 | public function incoming_friends_method_returns_correct_count_of_any_friends__50_requests_and_25_accepts() { 475 | $recipient = factory(User::class)->create(); 476 | $senders = factory(User::class)->times(50)->create(); 477 | 478 | foreach ($senders as $key => $sender) { 479 | $sender->sendFriendRequestTo($recipient); 480 | if ($key % 2) { 481 | $recipient->acceptFriendRequestFrom($sender); 482 | continue; 483 | } 484 | } 485 | 486 | $this->assertCount(25, $recipient->incoming_friends()); 487 | } 488 | } -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "hash": "9294d9afcaf68d941d8988a573011f9f", 8 | "content-hash": "3978524877a6b136f593788642987afa", 9 | "packages": [ 10 | { 11 | "name": "classpreloader/classpreloader", 12 | "version": "3.0.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/ClassPreloader/ClassPreloader.git", 16 | "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/9b10b913c2bdf90c3d2e0d726b454fb7f77c552a", 21 | "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "nikic/php-parser": "^1.0|^2.0", 26 | "php": ">=5.5.9" 27 | }, 28 | "require-dev": { 29 | "phpunit/phpunit": "^4.8|^5.0" 30 | }, 31 | "type": "library", 32 | "extra": { 33 | "branch-alias": { 34 | "dev-master": "3.0-dev" 35 | } 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "ClassPreloader\\": "src/" 40 | } 41 | }, 42 | "notification-url": "https://packagist.org/downloads/", 43 | "license": [ 44 | "MIT" 45 | ], 46 | "authors": [ 47 | { 48 | "name": "Michael Dowling", 49 | "email": "mtdowling@gmail.com" 50 | }, 51 | { 52 | "name": "Graham Campbell", 53 | "email": "graham@alt-three.com" 54 | } 55 | ], 56 | "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case", 57 | "keywords": [ 58 | "autoload", 59 | "class", 60 | "preload" 61 | ], 62 | "time": "2015-11-09 22:51:51" 63 | }, 64 | { 65 | "name": "dnoegel/php-xdg-base-dir", 66 | "version": "0.1", 67 | "source": { 68 | "type": "git", 69 | "url": "https://github.com/dnoegel/php-xdg-base-dir.git", 70 | "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" 71 | }, 72 | "dist": { 73 | "type": "zip", 74 | "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a", 75 | "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", 76 | "shasum": "" 77 | }, 78 | "require": { 79 | "php": ">=5.3.2" 80 | }, 81 | "require-dev": { 82 | "phpunit/phpunit": "@stable" 83 | }, 84 | "type": "project", 85 | "autoload": { 86 | "psr-4": { 87 | "XdgBaseDir\\": "src/" 88 | } 89 | }, 90 | "notification-url": "https://packagist.org/downloads/", 91 | "license": [ 92 | "MIT" 93 | ], 94 | "description": "implementation of xdg base directory specification for php", 95 | "time": "2014-10-24 07:27:01" 96 | }, 97 | { 98 | "name": "doctrine/inflector", 99 | "version": "v1.1.0", 100 | "source": { 101 | "type": "git", 102 | "url": "https://github.com/doctrine/inflector.git", 103 | "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" 104 | }, 105 | "dist": { 106 | "type": "zip", 107 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", 108 | "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", 109 | "shasum": "" 110 | }, 111 | "require": { 112 | "php": ">=5.3.2" 113 | }, 114 | "require-dev": { 115 | "phpunit/phpunit": "4.*" 116 | }, 117 | "type": "library", 118 | "extra": { 119 | "branch-alias": { 120 | "dev-master": "1.1.x-dev" 121 | } 122 | }, 123 | "autoload": { 124 | "psr-0": { 125 | "Doctrine\\Common\\Inflector\\": "lib/" 126 | } 127 | }, 128 | "notification-url": "https://packagist.org/downloads/", 129 | "license": [ 130 | "MIT" 131 | ], 132 | "authors": [ 133 | { 134 | "name": "Roman Borschel", 135 | "email": "roman@code-factory.org" 136 | }, 137 | { 138 | "name": "Benjamin Eberlei", 139 | "email": "kontakt@beberlei.de" 140 | }, 141 | { 142 | "name": "Guilherme Blanco", 143 | "email": "guilhermeblanco@gmail.com" 144 | }, 145 | { 146 | "name": "Jonathan Wage", 147 | "email": "jonwage@gmail.com" 148 | }, 149 | { 150 | "name": "Johannes Schmitt", 151 | "email": "schmittjoh@gmail.com" 152 | } 153 | ], 154 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 155 | "homepage": "http://www.doctrine-project.org", 156 | "keywords": [ 157 | "inflection", 158 | "pluralize", 159 | "singularize", 160 | "string" 161 | ], 162 | "time": "2015-11-06 14:35:42" 163 | }, 164 | { 165 | "name": "jakub-onderka/php-console-color", 166 | "version": "0.1", 167 | "source": { 168 | "type": "git", 169 | "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", 170 | "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" 171 | }, 172 | "dist": { 173 | "type": "zip", 174 | "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", 175 | "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", 176 | "shasum": "" 177 | }, 178 | "require": { 179 | "php": ">=5.3.2" 180 | }, 181 | "require-dev": { 182 | "jakub-onderka/php-code-style": "1.0", 183 | "jakub-onderka/php-parallel-lint": "0.*", 184 | "jakub-onderka/php-var-dump-check": "0.*", 185 | "phpunit/phpunit": "3.7.*", 186 | "squizlabs/php_codesniffer": "1.*" 187 | }, 188 | "type": "library", 189 | "autoload": { 190 | "psr-0": { 191 | "JakubOnderka\\PhpConsoleColor": "src/" 192 | } 193 | }, 194 | "notification-url": "https://packagist.org/downloads/", 195 | "license": [ 196 | "BSD-2-Clause" 197 | ], 198 | "authors": [ 199 | { 200 | "name": "Jakub Onderka", 201 | "email": "jakub.onderka@gmail.com", 202 | "homepage": "http://www.acci.cz" 203 | } 204 | ], 205 | "time": "2014-04-08 15:00:19" 206 | }, 207 | { 208 | "name": "jakub-onderka/php-console-highlighter", 209 | "version": "v0.3.2", 210 | "source": { 211 | "type": "git", 212 | "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", 213 | "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" 214 | }, 215 | "dist": { 216 | "type": "zip", 217 | "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", 218 | "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", 219 | "shasum": "" 220 | }, 221 | "require": { 222 | "jakub-onderka/php-console-color": "~0.1", 223 | "php": ">=5.3.0" 224 | }, 225 | "require-dev": { 226 | "jakub-onderka/php-code-style": "~1.0", 227 | "jakub-onderka/php-parallel-lint": "~0.5", 228 | "jakub-onderka/php-var-dump-check": "~0.1", 229 | "phpunit/phpunit": "~4.0", 230 | "squizlabs/php_codesniffer": "~1.5" 231 | }, 232 | "type": "library", 233 | "autoload": { 234 | "psr-0": { 235 | "JakubOnderka\\PhpConsoleHighlighter": "src/" 236 | } 237 | }, 238 | "notification-url": "https://packagist.org/downloads/", 239 | "license": [ 240 | "MIT" 241 | ], 242 | "authors": [ 243 | { 244 | "name": "Jakub Onderka", 245 | "email": "acci@acci.cz", 246 | "homepage": "http://www.acci.cz/" 247 | } 248 | ], 249 | "time": "2015-04-20 18:58:01" 250 | }, 251 | { 252 | "name": "jeremeamia/SuperClosure", 253 | "version": "2.2.0", 254 | "source": { 255 | "type": "git", 256 | "url": "https://github.com/jeremeamia/super_closure.git", 257 | "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938" 258 | }, 259 | "dist": { 260 | "type": "zip", 261 | "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/29a88be2a4846d27c1613aed0c9071dfad7b5938", 262 | "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938", 263 | "shasum": "" 264 | }, 265 | "require": { 266 | "nikic/php-parser": "^1.2|^2.0", 267 | "php": ">=5.4", 268 | "symfony/polyfill-php56": "^1.0" 269 | }, 270 | "require-dev": { 271 | "phpunit/phpunit": "^4.0|^5.0" 272 | }, 273 | "type": "library", 274 | "extra": { 275 | "branch-alias": { 276 | "dev-master": "2.2-dev" 277 | } 278 | }, 279 | "autoload": { 280 | "psr-4": { 281 | "SuperClosure\\": "src/" 282 | } 283 | }, 284 | "notification-url": "https://packagist.org/downloads/", 285 | "license": [ 286 | "MIT" 287 | ], 288 | "authors": [ 289 | { 290 | "name": "Jeremy Lindblom", 291 | "email": "jeremeamia@gmail.com", 292 | "homepage": "https://github.com/jeremeamia", 293 | "role": "Developer" 294 | } 295 | ], 296 | "description": "Serialize Closure objects, including their context and binding", 297 | "homepage": "https://github.com/jeremeamia/super_closure", 298 | "keywords": [ 299 | "closure", 300 | "function", 301 | "lambda", 302 | "parser", 303 | "serializable", 304 | "serialize", 305 | "tokenizer" 306 | ], 307 | "time": "2015-12-05 17:17:57" 308 | }, 309 | { 310 | "name": "laravel/framework", 311 | "version": "v5.2.39", 312 | "source": { 313 | "type": "git", 314 | "url": "https://github.com/laravel/framework.git", 315 | "reference": "c2a77050269b4e03bd9a735a9f24e573a7598b8a" 316 | }, 317 | "dist": { 318 | "type": "zip", 319 | "url": "https://api.github.com/repos/laravel/framework/zipball/c2a77050269b4e03bd9a735a9f24e573a7598b8a", 320 | "reference": "c2a77050269b4e03bd9a735a9f24e573a7598b8a", 321 | "shasum": "" 322 | }, 323 | "require": { 324 | "classpreloader/classpreloader": "~3.0", 325 | "doctrine/inflector": "~1.0", 326 | "ext-mbstring": "*", 327 | "ext-openssl": "*", 328 | "jeremeamia/superclosure": "~2.2", 329 | "league/flysystem": "~1.0", 330 | "monolog/monolog": "~1.11", 331 | "mtdowling/cron-expression": "~1.0", 332 | "nesbot/carbon": "~1.20", 333 | "paragonie/random_compat": "~1.4", 334 | "php": ">=5.5.9", 335 | "psy/psysh": "0.7.*", 336 | "swiftmailer/swiftmailer": "~5.1", 337 | "symfony/console": "2.8.*|3.0.*", 338 | "symfony/debug": "2.8.*|3.0.*", 339 | "symfony/finder": "2.8.*|3.0.*", 340 | "symfony/http-foundation": "2.8.*|3.0.*", 341 | "symfony/http-kernel": "2.8.*|3.0.*", 342 | "symfony/polyfill-php56": "~1.0", 343 | "symfony/process": "2.8.*|3.0.*", 344 | "symfony/routing": "2.8.*|3.0.*", 345 | "symfony/translation": "2.8.*|3.0.*", 346 | "symfony/var-dumper": "2.8.*|3.0.*", 347 | "vlucas/phpdotenv": "~2.2" 348 | }, 349 | "replace": { 350 | "illuminate/auth": "self.version", 351 | "illuminate/broadcasting": "self.version", 352 | "illuminate/bus": "self.version", 353 | "illuminate/cache": "self.version", 354 | "illuminate/config": "self.version", 355 | "illuminate/console": "self.version", 356 | "illuminate/container": "self.version", 357 | "illuminate/contracts": "self.version", 358 | "illuminate/cookie": "self.version", 359 | "illuminate/database": "self.version", 360 | "illuminate/encryption": "self.version", 361 | "illuminate/events": "self.version", 362 | "illuminate/exception": "self.version", 363 | "illuminate/filesystem": "self.version", 364 | "illuminate/hashing": "self.version", 365 | "illuminate/http": "self.version", 366 | "illuminate/log": "self.version", 367 | "illuminate/mail": "self.version", 368 | "illuminate/pagination": "self.version", 369 | "illuminate/pipeline": "self.version", 370 | "illuminate/queue": "self.version", 371 | "illuminate/redis": "self.version", 372 | "illuminate/routing": "self.version", 373 | "illuminate/session": "self.version", 374 | "illuminate/support": "self.version", 375 | "illuminate/translation": "self.version", 376 | "illuminate/validation": "self.version", 377 | "illuminate/view": "self.version" 378 | }, 379 | "require-dev": { 380 | "aws/aws-sdk-php": "~3.0", 381 | "mockery/mockery": "~0.9.4", 382 | "pda/pheanstalk": "~3.0", 383 | "phpunit/phpunit": "~4.1", 384 | "predis/predis": "~1.0", 385 | "symfony/css-selector": "2.8.*|3.0.*", 386 | "symfony/dom-crawler": "2.8.*|3.0.*" 387 | }, 388 | "suggest": { 389 | "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", 390 | "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).", 391 | "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", 392 | "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).", 393 | "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", 394 | "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", 395 | "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", 396 | "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", 397 | "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", 398 | "symfony/css-selector": "Required to use some of the crawler integration testing tools (2.8.*|3.0.*).", 399 | "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (2.8.*|3.0.*).", 400 | "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)." 401 | }, 402 | "type": "library", 403 | "extra": { 404 | "branch-alias": { 405 | "dev-master": "5.2-dev" 406 | } 407 | }, 408 | "autoload": { 409 | "classmap": [ 410 | "src/Illuminate/Queue/IlluminateQueueClosure.php" 411 | ], 412 | "files": [ 413 | "src/Illuminate/Foundation/helpers.php", 414 | "src/Illuminate/Support/helpers.php" 415 | ], 416 | "psr-4": { 417 | "Illuminate\\": "src/Illuminate/" 418 | } 419 | }, 420 | "notification-url": "https://packagist.org/downloads/", 421 | "license": [ 422 | "MIT" 423 | ], 424 | "authors": [ 425 | { 426 | "name": "Taylor Otwell", 427 | "email": "taylorotwell@gmail.com" 428 | } 429 | ], 430 | "description": "The Laravel Framework.", 431 | "homepage": "http://laravel.com", 432 | "keywords": [ 433 | "framework", 434 | "laravel" 435 | ], 436 | "time": "2016-06-17 19:25:12" 437 | }, 438 | { 439 | "name": "league/flysystem", 440 | "version": "1.0.24", 441 | "source": { 442 | "type": "git", 443 | "url": "https://github.com/thephpleague/flysystem.git", 444 | "reference": "9aca859a303fdca30370f42b8c611d9cf0dedf4b" 445 | }, 446 | "dist": { 447 | "type": "zip", 448 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9aca859a303fdca30370f42b8c611d9cf0dedf4b", 449 | "reference": "9aca859a303fdca30370f42b8c611d9cf0dedf4b", 450 | "shasum": "" 451 | }, 452 | "require": { 453 | "php": ">=5.4.0" 454 | }, 455 | "conflict": { 456 | "league/flysystem-sftp": "<1.0.6" 457 | }, 458 | "require-dev": { 459 | "ext-fileinfo": "*", 460 | "mockery/mockery": "~0.9", 461 | "phpspec/phpspec": "^2.2", 462 | "phpunit/phpunit": "~4.8 || ~5.0" 463 | }, 464 | "suggest": { 465 | "ext-fileinfo": "Required for MimeType", 466 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 467 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 468 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 469 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 470 | "league/flysystem-copy": "Allows you to use Copy.com storage", 471 | "league/flysystem-dropbox": "Allows you to use Dropbox storage", 472 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 473 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 474 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 475 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 476 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter" 477 | }, 478 | "type": "library", 479 | "extra": { 480 | "branch-alias": { 481 | "dev-master": "1.1-dev" 482 | } 483 | }, 484 | "autoload": { 485 | "psr-4": { 486 | "League\\Flysystem\\": "src/" 487 | } 488 | }, 489 | "notification-url": "https://packagist.org/downloads/", 490 | "license": [ 491 | "MIT" 492 | ], 493 | "authors": [ 494 | { 495 | "name": "Frank de Jonge", 496 | "email": "info@frenky.net" 497 | } 498 | ], 499 | "description": "Filesystem abstraction: Many filesystems, one API.", 500 | "keywords": [ 501 | "Cloud Files", 502 | "WebDAV", 503 | "abstraction", 504 | "aws", 505 | "cloud", 506 | "copy.com", 507 | "dropbox", 508 | "file systems", 509 | "files", 510 | "filesystem", 511 | "filesystems", 512 | "ftp", 513 | "rackspace", 514 | "remote", 515 | "s3", 516 | "sftp", 517 | "storage" 518 | ], 519 | "time": "2016-06-03 19:11:39" 520 | }, 521 | { 522 | "name": "monolog/monolog", 523 | "version": "1.19.0", 524 | "source": { 525 | "type": "git", 526 | "url": "https://github.com/Seldaek/monolog.git", 527 | "reference": "5f56ed5212dc509c8dc8caeba2715732abb32dbf" 528 | }, 529 | "dist": { 530 | "type": "zip", 531 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5f56ed5212dc509c8dc8caeba2715732abb32dbf", 532 | "reference": "5f56ed5212dc509c8dc8caeba2715732abb32dbf", 533 | "shasum": "" 534 | }, 535 | "require": { 536 | "php": ">=5.3.0", 537 | "psr/log": "~1.0" 538 | }, 539 | "provide": { 540 | "psr/log-implementation": "1.0.0" 541 | }, 542 | "require-dev": { 543 | "aws/aws-sdk-php": "^2.4.9", 544 | "doctrine/couchdb": "~1.0@dev", 545 | "graylog2/gelf-php": "~1.0", 546 | "jakub-onderka/php-parallel-lint": "0.9", 547 | "php-amqplib/php-amqplib": "~2.4", 548 | "php-console/php-console": "^3.1.3", 549 | "phpunit/phpunit": "~4.5", 550 | "phpunit/phpunit-mock-objects": "2.3.0", 551 | "raven/raven": "^0.13", 552 | "ruflin/elastica": ">=0.90 <3.0", 553 | "swiftmailer/swiftmailer": "~5.3" 554 | }, 555 | "suggest": { 556 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 557 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 558 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 559 | "ext-mongo": "Allow sending log messages to a MongoDB server", 560 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 561 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", 562 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 563 | "php-console/php-console": "Allow sending log messages to Google Chrome", 564 | "raven/raven": "Allow sending log messages to a Sentry server", 565 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 566 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server" 567 | }, 568 | "type": "library", 569 | "extra": { 570 | "branch-alias": { 571 | "dev-master": "2.0.x-dev" 572 | } 573 | }, 574 | "autoload": { 575 | "psr-4": { 576 | "Monolog\\": "src/Monolog" 577 | } 578 | }, 579 | "notification-url": "https://packagist.org/downloads/", 580 | "license": [ 581 | "MIT" 582 | ], 583 | "authors": [ 584 | { 585 | "name": "Jordi Boggiano", 586 | "email": "j.boggiano@seld.be", 587 | "homepage": "http://seld.be" 588 | } 589 | ], 590 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 591 | "homepage": "http://github.com/Seldaek/monolog", 592 | "keywords": [ 593 | "log", 594 | "logging", 595 | "psr-3" 596 | ], 597 | "time": "2016-04-12 18:29:35" 598 | }, 599 | { 600 | "name": "mtdowling/cron-expression", 601 | "version": "v1.1.0", 602 | "source": { 603 | "type": "git", 604 | "url": "https://github.com/mtdowling/cron-expression.git", 605 | "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5" 606 | }, 607 | "dist": { 608 | "type": "zip", 609 | "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", 610 | "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", 611 | "shasum": "" 612 | }, 613 | "require": { 614 | "php": ">=5.3.2" 615 | }, 616 | "require-dev": { 617 | "phpunit/phpunit": "~4.0|~5.0" 618 | }, 619 | "type": "library", 620 | "autoload": { 621 | "psr-0": { 622 | "Cron": "src/" 623 | } 624 | }, 625 | "notification-url": "https://packagist.org/downloads/", 626 | "license": [ 627 | "MIT" 628 | ], 629 | "authors": [ 630 | { 631 | "name": "Michael Dowling", 632 | "email": "mtdowling@gmail.com", 633 | "homepage": "https://github.com/mtdowling" 634 | } 635 | ], 636 | "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", 637 | "keywords": [ 638 | "cron", 639 | "schedule" 640 | ], 641 | "time": "2016-01-26 21:23:30" 642 | }, 643 | { 644 | "name": "nesbot/carbon", 645 | "version": "1.21.0", 646 | "source": { 647 | "type": "git", 648 | "url": "https://github.com/briannesbitt/Carbon.git", 649 | "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7" 650 | }, 651 | "dist": { 652 | "type": "zip", 653 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7b08ec6f75791e130012f206e3f7b0e76e18e3d7", 654 | "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7", 655 | "shasum": "" 656 | }, 657 | "require": { 658 | "php": ">=5.3.0", 659 | "symfony/translation": "~2.6|~3.0" 660 | }, 661 | "require-dev": { 662 | "phpunit/phpunit": "~4.0|~5.0" 663 | }, 664 | "type": "library", 665 | "autoload": { 666 | "psr-4": { 667 | "Carbon\\": "src/Carbon/" 668 | } 669 | }, 670 | "notification-url": "https://packagist.org/downloads/", 671 | "license": [ 672 | "MIT" 673 | ], 674 | "authors": [ 675 | { 676 | "name": "Brian Nesbitt", 677 | "email": "brian@nesbot.com", 678 | "homepage": "http://nesbot.com" 679 | } 680 | ], 681 | "description": "A simple API extension for DateTime.", 682 | "homepage": "http://carbon.nesbot.com", 683 | "keywords": [ 684 | "date", 685 | "datetime", 686 | "time" 687 | ], 688 | "time": "2015-11-04 20:07:17" 689 | }, 690 | { 691 | "name": "nikic/php-parser", 692 | "version": "v2.1.0", 693 | "source": { 694 | "type": "git", 695 | "url": "https://github.com/nikic/PHP-Parser.git", 696 | "reference": "47b254ea51f1d6d5dc04b9b299e88346bf2369e3" 697 | }, 698 | "dist": { 699 | "type": "zip", 700 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/47b254ea51f1d6d5dc04b9b299e88346bf2369e3", 701 | "reference": "47b254ea51f1d6d5dc04b9b299e88346bf2369e3", 702 | "shasum": "" 703 | }, 704 | "require": { 705 | "ext-tokenizer": "*", 706 | "php": ">=5.4" 707 | }, 708 | "require-dev": { 709 | "phpunit/phpunit": "~4.0" 710 | }, 711 | "bin": [ 712 | "bin/php-parse" 713 | ], 714 | "type": "library", 715 | "extra": { 716 | "branch-alias": { 717 | "dev-master": "2.1-dev" 718 | } 719 | }, 720 | "autoload": { 721 | "psr-4": { 722 | "PhpParser\\": "lib/PhpParser" 723 | } 724 | }, 725 | "notification-url": "https://packagist.org/downloads/", 726 | "license": [ 727 | "BSD-3-Clause" 728 | ], 729 | "authors": [ 730 | { 731 | "name": "Nikita Popov" 732 | } 733 | ], 734 | "description": "A PHP parser written in PHP", 735 | "keywords": [ 736 | "parser", 737 | "php" 738 | ], 739 | "time": "2016-04-19 13:41:41" 740 | }, 741 | { 742 | "name": "paragonie/random_compat", 743 | "version": "v1.4.1", 744 | "source": { 745 | "type": "git", 746 | "url": "https://github.com/paragonie/random_compat.git", 747 | "reference": "c7e26a21ba357863de030f0b9e701c7d04593774" 748 | }, 749 | "dist": { 750 | "type": "zip", 751 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774", 752 | "reference": "c7e26a21ba357863de030f0b9e701c7d04593774", 753 | "shasum": "" 754 | }, 755 | "require": { 756 | "php": ">=5.2.0" 757 | }, 758 | "require-dev": { 759 | "phpunit/phpunit": "4.*|5.*" 760 | }, 761 | "suggest": { 762 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 763 | }, 764 | "type": "library", 765 | "autoload": { 766 | "files": [ 767 | "lib/random.php" 768 | ] 769 | }, 770 | "notification-url": "https://packagist.org/downloads/", 771 | "license": [ 772 | "MIT" 773 | ], 774 | "authors": [ 775 | { 776 | "name": "Paragon Initiative Enterprises", 777 | "email": "security@paragonie.com", 778 | "homepage": "https://paragonie.com" 779 | } 780 | ], 781 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 782 | "keywords": [ 783 | "csprng", 784 | "pseudorandom", 785 | "random" 786 | ], 787 | "time": "2016-03-18 20:34:03" 788 | }, 789 | { 790 | "name": "psr/log", 791 | "version": "1.0.0", 792 | "source": { 793 | "type": "git", 794 | "url": "https://github.com/php-fig/log.git", 795 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" 796 | }, 797 | "dist": { 798 | "type": "zip", 799 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", 800 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", 801 | "shasum": "" 802 | }, 803 | "type": "library", 804 | "autoload": { 805 | "psr-0": { 806 | "Psr\\Log\\": "" 807 | } 808 | }, 809 | "notification-url": "https://packagist.org/downloads/", 810 | "license": [ 811 | "MIT" 812 | ], 813 | "authors": [ 814 | { 815 | "name": "PHP-FIG", 816 | "homepage": "http://www.php-fig.org/" 817 | } 818 | ], 819 | "description": "Common interface for logging libraries", 820 | "keywords": [ 821 | "log", 822 | "psr", 823 | "psr-3" 824 | ], 825 | "time": "2012-12-21 11:40:51" 826 | }, 827 | { 828 | "name": "psy/psysh", 829 | "version": "v0.7.2", 830 | "source": { 831 | "type": "git", 832 | "url": "https://github.com/bobthecow/psysh.git", 833 | "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280" 834 | }, 835 | "dist": { 836 | "type": "zip", 837 | "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280", 838 | "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280", 839 | "shasum": "" 840 | }, 841 | "require": { 842 | "dnoegel/php-xdg-base-dir": "0.1", 843 | "jakub-onderka/php-console-highlighter": "0.3.*", 844 | "nikic/php-parser": "^1.2.1|~2.0", 845 | "php": ">=5.3.9", 846 | "symfony/console": "~2.3.10|^2.4.2|~3.0", 847 | "symfony/var-dumper": "~2.7|~3.0" 848 | }, 849 | "require-dev": { 850 | "fabpot/php-cs-fixer": "~1.5", 851 | "phpunit/phpunit": "~3.7|~4.0|~5.0", 852 | "squizlabs/php_codesniffer": "~2.0", 853 | "symfony/finder": "~2.1|~3.0" 854 | }, 855 | "suggest": { 856 | "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", 857 | "ext-pdo-sqlite": "The doc command requires SQLite to work.", 858 | "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", 859 | "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." 860 | }, 861 | "bin": [ 862 | "bin/psysh" 863 | ], 864 | "type": "library", 865 | "extra": { 866 | "branch-alias": { 867 | "dev-develop": "0.8.x-dev" 868 | } 869 | }, 870 | "autoload": { 871 | "files": [ 872 | "src/Psy/functions.php" 873 | ], 874 | "psr-4": { 875 | "Psy\\": "src/Psy/" 876 | } 877 | }, 878 | "notification-url": "https://packagist.org/downloads/", 879 | "license": [ 880 | "MIT" 881 | ], 882 | "authors": [ 883 | { 884 | "name": "Justin Hileman", 885 | "email": "justin@justinhileman.info", 886 | "homepage": "http://justinhileman.com" 887 | } 888 | ], 889 | "description": "An interactive shell for modern PHP.", 890 | "homepage": "http://psysh.org", 891 | "keywords": [ 892 | "REPL", 893 | "console", 894 | "interactive", 895 | "shell" 896 | ], 897 | "time": "2016-03-09 05:03:14" 898 | }, 899 | { 900 | "name": "swiftmailer/swiftmailer", 901 | "version": "v5.4.2", 902 | "source": { 903 | "type": "git", 904 | "url": "https://github.com/swiftmailer/swiftmailer.git", 905 | "reference": "d8db871a54619458a805229a057ea2af33c753e8" 906 | }, 907 | "dist": { 908 | "type": "zip", 909 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/d8db871a54619458a805229a057ea2af33c753e8", 910 | "reference": "d8db871a54619458a805229a057ea2af33c753e8", 911 | "shasum": "" 912 | }, 913 | "require": { 914 | "php": ">=5.3.3" 915 | }, 916 | "require-dev": { 917 | "mockery/mockery": "~0.9.1,<0.9.4" 918 | }, 919 | "type": "library", 920 | "extra": { 921 | "branch-alias": { 922 | "dev-master": "5.4-dev" 923 | } 924 | }, 925 | "autoload": { 926 | "files": [ 927 | "lib/swift_required.php" 928 | ] 929 | }, 930 | "notification-url": "https://packagist.org/downloads/", 931 | "license": [ 932 | "MIT" 933 | ], 934 | "authors": [ 935 | { 936 | "name": "Chris Corbyn" 937 | }, 938 | { 939 | "name": "Fabien Potencier", 940 | "email": "fabien@symfony.com" 941 | } 942 | ], 943 | "description": "Swiftmailer, free feature-rich PHP mailer", 944 | "homepage": "http://swiftmailer.org", 945 | "keywords": [ 946 | "email", 947 | "mail", 948 | "mailer" 949 | ], 950 | "time": "2016-05-01 08:45:47" 951 | }, 952 | { 953 | "name": "symfony/console", 954 | "version": "v3.0.7", 955 | "source": { 956 | "type": "git", 957 | "url": "https://github.com/symfony/console.git", 958 | "reference": "382fc9ed852edabd6133e34f8549d7a7d99db115" 959 | }, 960 | "dist": { 961 | "type": "zip", 962 | "url": "https://api.github.com/repos/symfony/console/zipball/382fc9ed852edabd6133e34f8549d7a7d99db115", 963 | "reference": "382fc9ed852edabd6133e34f8549d7a7d99db115", 964 | "shasum": "" 965 | }, 966 | "require": { 967 | "php": ">=5.5.9", 968 | "symfony/polyfill-mbstring": "~1.0" 969 | }, 970 | "require-dev": { 971 | "psr/log": "~1.0", 972 | "symfony/event-dispatcher": "~2.8|~3.0", 973 | "symfony/process": "~2.8|~3.0" 974 | }, 975 | "suggest": { 976 | "psr/log": "For using the console logger", 977 | "symfony/event-dispatcher": "", 978 | "symfony/process": "" 979 | }, 980 | "type": "library", 981 | "extra": { 982 | "branch-alias": { 983 | "dev-master": "3.0-dev" 984 | } 985 | }, 986 | "autoload": { 987 | "psr-4": { 988 | "Symfony\\Component\\Console\\": "" 989 | }, 990 | "exclude-from-classmap": [ 991 | "/Tests/" 992 | ] 993 | }, 994 | "notification-url": "https://packagist.org/downloads/", 995 | "license": [ 996 | "MIT" 997 | ], 998 | "authors": [ 999 | { 1000 | "name": "Fabien Potencier", 1001 | "email": "fabien@symfony.com" 1002 | }, 1003 | { 1004 | "name": "Symfony Community", 1005 | "homepage": "https://symfony.com/contributors" 1006 | } 1007 | ], 1008 | "description": "Symfony Console Component", 1009 | "homepage": "https://symfony.com", 1010 | "time": "2016-06-06 15:08:35" 1011 | }, 1012 | { 1013 | "name": "symfony/debug", 1014 | "version": "v3.0.7", 1015 | "source": { 1016 | "type": "git", 1017 | "url": "https://github.com/symfony/debug.git", 1018 | "reference": "e67e1552dd7313df1cf6535cb606751899e0e727" 1019 | }, 1020 | "dist": { 1021 | "type": "zip", 1022 | "url": "https://api.github.com/repos/symfony/debug/zipball/e67e1552dd7313df1cf6535cb606751899e0e727", 1023 | "reference": "e67e1552dd7313df1cf6535cb606751899e0e727", 1024 | "shasum": "" 1025 | }, 1026 | "require": { 1027 | "php": ">=5.5.9", 1028 | "psr/log": "~1.0" 1029 | }, 1030 | "conflict": { 1031 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 1032 | }, 1033 | "require-dev": { 1034 | "symfony/class-loader": "~2.8|~3.0", 1035 | "symfony/http-kernel": "~2.8|~3.0" 1036 | }, 1037 | "type": "library", 1038 | "extra": { 1039 | "branch-alias": { 1040 | "dev-master": "3.0-dev" 1041 | } 1042 | }, 1043 | "autoload": { 1044 | "psr-4": { 1045 | "Symfony\\Component\\Debug\\": "" 1046 | }, 1047 | "exclude-from-classmap": [ 1048 | "/Tests/" 1049 | ] 1050 | }, 1051 | "notification-url": "https://packagist.org/downloads/", 1052 | "license": [ 1053 | "MIT" 1054 | ], 1055 | "authors": [ 1056 | { 1057 | "name": "Fabien Potencier", 1058 | "email": "fabien@symfony.com" 1059 | }, 1060 | { 1061 | "name": "Symfony Community", 1062 | "homepage": "https://symfony.com/contributors" 1063 | } 1064 | ], 1065 | "description": "Symfony Debug Component", 1066 | "homepage": "https://symfony.com", 1067 | "time": "2016-06-06 15:08:35" 1068 | }, 1069 | { 1070 | "name": "symfony/event-dispatcher", 1071 | "version": "v3.1.1", 1072 | "source": { 1073 | "type": "git", 1074 | "url": "https://github.com/symfony/event-dispatcher.git", 1075 | "reference": "f5b7563f67779c6d3d5370e23448e707c858df3e" 1076 | }, 1077 | "dist": { 1078 | "type": "zip", 1079 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f5b7563f67779c6d3d5370e23448e707c858df3e", 1080 | "reference": "f5b7563f67779c6d3d5370e23448e707c858df3e", 1081 | "shasum": "" 1082 | }, 1083 | "require": { 1084 | "php": ">=5.5.9" 1085 | }, 1086 | "require-dev": { 1087 | "psr/log": "~1.0", 1088 | "symfony/config": "~2.8|~3.0", 1089 | "symfony/dependency-injection": "~2.8|~3.0", 1090 | "symfony/expression-language": "~2.8|~3.0", 1091 | "symfony/stopwatch": "~2.8|~3.0" 1092 | }, 1093 | "suggest": { 1094 | "symfony/dependency-injection": "", 1095 | "symfony/http-kernel": "" 1096 | }, 1097 | "type": "library", 1098 | "extra": { 1099 | "branch-alias": { 1100 | "dev-master": "3.1-dev" 1101 | } 1102 | }, 1103 | "autoload": { 1104 | "psr-4": { 1105 | "Symfony\\Component\\EventDispatcher\\": "" 1106 | }, 1107 | "exclude-from-classmap": [ 1108 | "/Tests/" 1109 | ] 1110 | }, 1111 | "notification-url": "https://packagist.org/downloads/", 1112 | "license": [ 1113 | "MIT" 1114 | ], 1115 | "authors": [ 1116 | { 1117 | "name": "Fabien Potencier", 1118 | "email": "fabien@symfony.com" 1119 | }, 1120 | { 1121 | "name": "Symfony Community", 1122 | "homepage": "https://symfony.com/contributors" 1123 | } 1124 | ], 1125 | "description": "Symfony EventDispatcher Component", 1126 | "homepage": "https://symfony.com", 1127 | "time": "2016-06-06 11:42:41" 1128 | }, 1129 | { 1130 | "name": "symfony/finder", 1131 | "version": "v3.0.7", 1132 | "source": { 1133 | "type": "git", 1134 | "url": "https://github.com/symfony/finder.git", 1135 | "reference": "39e5f3d533d07b5416b9d7aad53a27f939d4f811" 1136 | }, 1137 | "dist": { 1138 | "type": "zip", 1139 | "url": "https://api.github.com/repos/symfony/finder/zipball/39e5f3d533d07b5416b9d7aad53a27f939d4f811", 1140 | "reference": "39e5f3d533d07b5416b9d7aad53a27f939d4f811", 1141 | "shasum": "" 1142 | }, 1143 | "require": { 1144 | "php": ">=5.5.9" 1145 | }, 1146 | "type": "library", 1147 | "extra": { 1148 | "branch-alias": { 1149 | "dev-master": "3.0-dev" 1150 | } 1151 | }, 1152 | "autoload": { 1153 | "psr-4": { 1154 | "Symfony\\Component\\Finder\\": "" 1155 | }, 1156 | "exclude-from-classmap": [ 1157 | "/Tests/" 1158 | ] 1159 | }, 1160 | "notification-url": "https://packagist.org/downloads/", 1161 | "license": [ 1162 | "MIT" 1163 | ], 1164 | "authors": [ 1165 | { 1166 | "name": "Fabien Potencier", 1167 | "email": "fabien@symfony.com" 1168 | }, 1169 | { 1170 | "name": "Symfony Community", 1171 | "homepage": "https://symfony.com/contributors" 1172 | } 1173 | ], 1174 | "description": "Symfony Finder Component", 1175 | "homepage": "https://symfony.com", 1176 | "time": "2016-05-13 18:03:36" 1177 | }, 1178 | { 1179 | "name": "symfony/http-foundation", 1180 | "version": "v3.0.7", 1181 | "source": { 1182 | "type": "git", 1183 | "url": "https://github.com/symfony/http-foundation.git", 1184 | "reference": "d268a643884f85e91d6ba11ca68de96833f3f6e5" 1185 | }, 1186 | "dist": { 1187 | "type": "zip", 1188 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d268a643884f85e91d6ba11ca68de96833f3f6e5", 1189 | "reference": "d268a643884f85e91d6ba11ca68de96833f3f6e5", 1190 | "shasum": "" 1191 | }, 1192 | "require": { 1193 | "php": ">=5.5.9", 1194 | "symfony/polyfill-mbstring": "~1.1" 1195 | }, 1196 | "require-dev": { 1197 | "symfony/expression-language": "~2.8|~3.0" 1198 | }, 1199 | "type": "library", 1200 | "extra": { 1201 | "branch-alias": { 1202 | "dev-master": "3.0-dev" 1203 | } 1204 | }, 1205 | "autoload": { 1206 | "psr-4": { 1207 | "Symfony\\Component\\HttpFoundation\\": "" 1208 | }, 1209 | "exclude-from-classmap": [ 1210 | "/Tests/" 1211 | ] 1212 | }, 1213 | "notification-url": "https://packagist.org/downloads/", 1214 | "license": [ 1215 | "MIT" 1216 | ], 1217 | "authors": [ 1218 | { 1219 | "name": "Fabien Potencier", 1220 | "email": "fabien@symfony.com" 1221 | }, 1222 | { 1223 | "name": "Symfony Community", 1224 | "homepage": "https://symfony.com/contributors" 1225 | } 1226 | ], 1227 | "description": "Symfony HttpFoundation Component", 1228 | "homepage": "https://symfony.com", 1229 | "time": "2016-06-06 11:33:26" 1230 | }, 1231 | { 1232 | "name": "symfony/http-kernel", 1233 | "version": "v3.0.7", 1234 | "source": { 1235 | "type": "git", 1236 | "url": "https://github.com/symfony/http-kernel.git", 1237 | "reference": "97cc1c15e3406e7a2adf14ad6b0e41a04d4a6fc4" 1238 | }, 1239 | "dist": { 1240 | "type": "zip", 1241 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/97cc1c15e3406e7a2adf14ad6b0e41a04d4a6fc4", 1242 | "reference": "97cc1c15e3406e7a2adf14ad6b0e41a04d4a6fc4", 1243 | "shasum": "" 1244 | }, 1245 | "require": { 1246 | "php": ">=5.5.9", 1247 | "psr/log": "~1.0", 1248 | "symfony/debug": "~2.8|~3.0", 1249 | "symfony/event-dispatcher": "~2.8|~3.0", 1250 | "symfony/http-foundation": "~2.8|~3.0" 1251 | }, 1252 | "conflict": { 1253 | "symfony/config": "<2.8" 1254 | }, 1255 | "require-dev": { 1256 | "symfony/browser-kit": "~2.8|~3.0", 1257 | "symfony/class-loader": "~2.8|~3.0", 1258 | "symfony/config": "~2.8|~3.0", 1259 | "symfony/console": "~2.8|~3.0", 1260 | "symfony/css-selector": "~2.8|~3.0", 1261 | "symfony/dependency-injection": "~2.8|~3.0", 1262 | "symfony/dom-crawler": "~2.8|~3.0", 1263 | "symfony/expression-language": "~2.8|~3.0", 1264 | "symfony/finder": "~2.8|~3.0", 1265 | "symfony/process": "~2.8|~3.0", 1266 | "symfony/routing": "~2.8|~3.0", 1267 | "symfony/stopwatch": "~2.8|~3.0", 1268 | "symfony/templating": "~2.8|~3.0", 1269 | "symfony/translation": "~2.8|~3.0", 1270 | "symfony/var-dumper": "~2.8|~3.0" 1271 | }, 1272 | "suggest": { 1273 | "symfony/browser-kit": "", 1274 | "symfony/class-loader": "", 1275 | "symfony/config": "", 1276 | "symfony/console": "", 1277 | "symfony/dependency-injection": "", 1278 | "symfony/finder": "", 1279 | "symfony/var-dumper": "" 1280 | }, 1281 | "type": "library", 1282 | "extra": { 1283 | "branch-alias": { 1284 | "dev-master": "3.0-dev" 1285 | } 1286 | }, 1287 | "autoload": { 1288 | "psr-4": { 1289 | "Symfony\\Component\\HttpKernel\\": "" 1290 | }, 1291 | "exclude-from-classmap": [ 1292 | "/Tests/" 1293 | ] 1294 | }, 1295 | "notification-url": "https://packagist.org/downloads/", 1296 | "license": [ 1297 | "MIT" 1298 | ], 1299 | "authors": [ 1300 | { 1301 | "name": "Fabien Potencier", 1302 | "email": "fabien@symfony.com" 1303 | }, 1304 | { 1305 | "name": "Symfony Community", 1306 | "homepage": "https://symfony.com/contributors" 1307 | } 1308 | ], 1309 | "description": "Symfony HttpKernel Component", 1310 | "homepage": "https://symfony.com", 1311 | "time": "2016-06-06 16:52:35" 1312 | }, 1313 | { 1314 | "name": "symfony/polyfill-mbstring", 1315 | "version": "v1.2.0", 1316 | "source": { 1317 | "type": "git", 1318 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1319 | "reference": "dff51f72b0706335131b00a7f49606168c582594" 1320 | }, 1321 | "dist": { 1322 | "type": "zip", 1323 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594", 1324 | "reference": "dff51f72b0706335131b00a7f49606168c582594", 1325 | "shasum": "" 1326 | }, 1327 | "require": { 1328 | "php": ">=5.3.3" 1329 | }, 1330 | "suggest": { 1331 | "ext-mbstring": "For best performance" 1332 | }, 1333 | "type": "library", 1334 | "extra": { 1335 | "branch-alias": { 1336 | "dev-master": "1.2-dev" 1337 | } 1338 | }, 1339 | "autoload": { 1340 | "psr-4": { 1341 | "Symfony\\Polyfill\\Mbstring\\": "" 1342 | }, 1343 | "files": [ 1344 | "bootstrap.php" 1345 | ] 1346 | }, 1347 | "notification-url": "https://packagist.org/downloads/", 1348 | "license": [ 1349 | "MIT" 1350 | ], 1351 | "authors": [ 1352 | { 1353 | "name": "Nicolas Grekas", 1354 | "email": "p@tchwork.com" 1355 | }, 1356 | { 1357 | "name": "Symfony Community", 1358 | "homepage": "https://symfony.com/contributors" 1359 | } 1360 | ], 1361 | "description": "Symfony polyfill for the Mbstring extension", 1362 | "homepage": "https://symfony.com", 1363 | "keywords": [ 1364 | "compatibility", 1365 | "mbstring", 1366 | "polyfill", 1367 | "portable", 1368 | "shim" 1369 | ], 1370 | "time": "2016-05-18 14:26:46" 1371 | }, 1372 | { 1373 | "name": "symfony/polyfill-php56", 1374 | "version": "v1.2.0", 1375 | "source": { 1376 | "type": "git", 1377 | "url": "https://github.com/symfony/polyfill-php56.git", 1378 | "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a" 1379 | }, 1380 | "dist": { 1381 | "type": "zip", 1382 | "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/3edf57a8fbf9a927533344cef65ad7e1cf31030a", 1383 | "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a", 1384 | "shasum": "" 1385 | }, 1386 | "require": { 1387 | "php": ">=5.3.3", 1388 | "symfony/polyfill-util": "~1.0" 1389 | }, 1390 | "type": "library", 1391 | "extra": { 1392 | "branch-alias": { 1393 | "dev-master": "1.2-dev" 1394 | } 1395 | }, 1396 | "autoload": { 1397 | "psr-4": { 1398 | "Symfony\\Polyfill\\Php56\\": "" 1399 | }, 1400 | "files": [ 1401 | "bootstrap.php" 1402 | ] 1403 | }, 1404 | "notification-url": "https://packagist.org/downloads/", 1405 | "license": [ 1406 | "MIT" 1407 | ], 1408 | "authors": [ 1409 | { 1410 | "name": "Nicolas Grekas", 1411 | "email": "p@tchwork.com" 1412 | }, 1413 | { 1414 | "name": "Symfony Community", 1415 | "homepage": "https://symfony.com/contributors" 1416 | } 1417 | ], 1418 | "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", 1419 | "homepage": "https://symfony.com", 1420 | "keywords": [ 1421 | "compatibility", 1422 | "polyfill", 1423 | "portable", 1424 | "shim" 1425 | ], 1426 | "time": "2016-05-18 14:26:46" 1427 | }, 1428 | { 1429 | "name": "symfony/polyfill-util", 1430 | "version": "v1.2.0", 1431 | "source": { 1432 | "type": "git", 1433 | "url": "https://github.com/symfony/polyfill-util.git", 1434 | "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99" 1435 | }, 1436 | "dist": { 1437 | "type": "zip", 1438 | "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ef830ce3d218e622b221d6bfad42c751d974bf99", 1439 | "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99", 1440 | "shasum": "" 1441 | }, 1442 | "require": { 1443 | "php": ">=5.3.3" 1444 | }, 1445 | "type": "library", 1446 | "extra": { 1447 | "branch-alias": { 1448 | "dev-master": "1.2-dev" 1449 | } 1450 | }, 1451 | "autoload": { 1452 | "psr-4": { 1453 | "Symfony\\Polyfill\\Util\\": "" 1454 | } 1455 | }, 1456 | "notification-url": "https://packagist.org/downloads/", 1457 | "license": [ 1458 | "MIT" 1459 | ], 1460 | "authors": [ 1461 | { 1462 | "name": "Nicolas Grekas", 1463 | "email": "p@tchwork.com" 1464 | }, 1465 | { 1466 | "name": "Symfony Community", 1467 | "homepage": "https://symfony.com/contributors" 1468 | } 1469 | ], 1470 | "description": "Symfony utilities for portability of PHP codes", 1471 | "homepage": "https://symfony.com", 1472 | "keywords": [ 1473 | "compat", 1474 | "compatibility", 1475 | "polyfill", 1476 | "shim" 1477 | ], 1478 | "time": "2016-05-18 14:26:46" 1479 | }, 1480 | { 1481 | "name": "symfony/process", 1482 | "version": "v3.0.7", 1483 | "source": { 1484 | "type": "git", 1485 | "url": "https://github.com/symfony/process.git", 1486 | "reference": "bf6e2d1fa8b93fdd7cca6b684c0ea213cf0255dd" 1487 | }, 1488 | "dist": { 1489 | "type": "zip", 1490 | "url": "https://api.github.com/repos/symfony/process/zipball/bf6e2d1fa8b93fdd7cca6b684c0ea213cf0255dd", 1491 | "reference": "bf6e2d1fa8b93fdd7cca6b684c0ea213cf0255dd", 1492 | "shasum": "" 1493 | }, 1494 | "require": { 1495 | "php": ">=5.5.9" 1496 | }, 1497 | "type": "library", 1498 | "extra": { 1499 | "branch-alias": { 1500 | "dev-master": "3.0-dev" 1501 | } 1502 | }, 1503 | "autoload": { 1504 | "psr-4": { 1505 | "Symfony\\Component\\Process\\": "" 1506 | }, 1507 | "exclude-from-classmap": [ 1508 | "/Tests/" 1509 | ] 1510 | }, 1511 | "notification-url": "https://packagist.org/downloads/", 1512 | "license": [ 1513 | "MIT" 1514 | ], 1515 | "authors": [ 1516 | { 1517 | "name": "Fabien Potencier", 1518 | "email": "fabien@symfony.com" 1519 | }, 1520 | { 1521 | "name": "Symfony Community", 1522 | "homepage": "https://symfony.com/contributors" 1523 | } 1524 | ], 1525 | "description": "Symfony Process Component", 1526 | "homepage": "https://symfony.com", 1527 | "time": "2016-06-06 11:33:26" 1528 | }, 1529 | { 1530 | "name": "symfony/routing", 1531 | "version": "v3.0.7", 1532 | "source": { 1533 | "type": "git", 1534 | "url": "https://github.com/symfony/routing.git", 1535 | "reference": "c780454838a1131adc756d737a4b4cc1d18f8c64" 1536 | }, 1537 | "dist": { 1538 | "type": "zip", 1539 | "url": "https://api.github.com/repos/symfony/routing/zipball/c780454838a1131adc756d737a4b4cc1d18f8c64", 1540 | "reference": "c780454838a1131adc756d737a4b4cc1d18f8c64", 1541 | "shasum": "" 1542 | }, 1543 | "require": { 1544 | "php": ">=5.5.9" 1545 | }, 1546 | "conflict": { 1547 | "symfony/config": "<2.8" 1548 | }, 1549 | "require-dev": { 1550 | "doctrine/annotations": "~1.0", 1551 | "doctrine/common": "~2.2", 1552 | "psr/log": "~1.0", 1553 | "symfony/config": "~2.8|~3.0", 1554 | "symfony/expression-language": "~2.8|~3.0", 1555 | "symfony/http-foundation": "~2.8|~3.0", 1556 | "symfony/yaml": "~2.8|~3.0" 1557 | }, 1558 | "suggest": { 1559 | "doctrine/annotations": "For using the annotation loader", 1560 | "symfony/config": "For using the all-in-one router or any loader", 1561 | "symfony/dependency-injection": "For loading routes from a service", 1562 | "symfony/expression-language": "For using expression matching", 1563 | "symfony/http-foundation": "For using a Symfony Request object", 1564 | "symfony/yaml": "For using the YAML loader" 1565 | }, 1566 | "type": "library", 1567 | "extra": { 1568 | "branch-alias": { 1569 | "dev-master": "3.0-dev" 1570 | } 1571 | }, 1572 | "autoload": { 1573 | "psr-4": { 1574 | "Symfony\\Component\\Routing\\": "" 1575 | }, 1576 | "exclude-from-classmap": [ 1577 | "/Tests/" 1578 | ] 1579 | }, 1580 | "notification-url": "https://packagist.org/downloads/", 1581 | "license": [ 1582 | "MIT" 1583 | ], 1584 | "authors": [ 1585 | { 1586 | "name": "Fabien Potencier", 1587 | "email": "fabien@symfony.com" 1588 | }, 1589 | { 1590 | "name": "Symfony Community", 1591 | "homepage": "https://symfony.com/contributors" 1592 | } 1593 | ], 1594 | "description": "Symfony Routing Component", 1595 | "homepage": "https://symfony.com", 1596 | "keywords": [ 1597 | "router", 1598 | "routing", 1599 | "uri", 1600 | "url" 1601 | ], 1602 | "time": "2016-05-30 06:58:27" 1603 | }, 1604 | { 1605 | "name": "symfony/translation", 1606 | "version": "v3.0.7", 1607 | "source": { 1608 | "type": "git", 1609 | "url": "https://github.com/symfony/translation.git", 1610 | "reference": "2b0aacaa613c0ec1ad8046f972d8abdcb19c1db7" 1611 | }, 1612 | "dist": { 1613 | "type": "zip", 1614 | "url": "https://api.github.com/repos/symfony/translation/zipball/2b0aacaa613c0ec1ad8046f972d8abdcb19c1db7", 1615 | "reference": "2b0aacaa613c0ec1ad8046f972d8abdcb19c1db7", 1616 | "shasum": "" 1617 | }, 1618 | "require": { 1619 | "php": ">=5.5.9", 1620 | "symfony/polyfill-mbstring": "~1.0" 1621 | }, 1622 | "conflict": { 1623 | "symfony/config": "<2.8" 1624 | }, 1625 | "require-dev": { 1626 | "psr/log": "~1.0", 1627 | "symfony/config": "~2.8|~3.0", 1628 | "symfony/intl": "~2.8|~3.0", 1629 | "symfony/yaml": "~2.8|~3.0" 1630 | }, 1631 | "suggest": { 1632 | "psr/log": "To use logging capability in translator", 1633 | "symfony/config": "", 1634 | "symfony/yaml": "" 1635 | }, 1636 | "type": "library", 1637 | "extra": { 1638 | "branch-alias": { 1639 | "dev-master": "3.0-dev" 1640 | } 1641 | }, 1642 | "autoload": { 1643 | "psr-4": { 1644 | "Symfony\\Component\\Translation\\": "" 1645 | }, 1646 | "exclude-from-classmap": [ 1647 | "/Tests/" 1648 | ] 1649 | }, 1650 | "notification-url": "https://packagist.org/downloads/", 1651 | "license": [ 1652 | "MIT" 1653 | ], 1654 | "authors": [ 1655 | { 1656 | "name": "Fabien Potencier", 1657 | "email": "fabien@symfony.com" 1658 | }, 1659 | { 1660 | "name": "Symfony Community", 1661 | "homepage": "https://symfony.com/contributors" 1662 | } 1663 | ], 1664 | "description": "Symfony Translation Component", 1665 | "homepage": "https://symfony.com", 1666 | "time": "2016-06-06 11:33:26" 1667 | }, 1668 | { 1669 | "name": "symfony/var-dumper", 1670 | "version": "v3.0.7", 1671 | "source": { 1672 | "type": "git", 1673 | "url": "https://github.com/symfony/var-dumper.git", 1674 | "reference": "d8bb851da153d97abe7c2b71a65dee19f324bcf7" 1675 | }, 1676 | "dist": { 1677 | "type": "zip", 1678 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d8bb851da153d97abe7c2b71a65dee19f324bcf7", 1679 | "reference": "d8bb851da153d97abe7c2b71a65dee19f324bcf7", 1680 | "shasum": "" 1681 | }, 1682 | "require": { 1683 | "php": ">=5.5.9", 1684 | "symfony/polyfill-mbstring": "~1.0" 1685 | }, 1686 | "require-dev": { 1687 | "twig/twig": "~1.20|~2.0" 1688 | }, 1689 | "suggest": { 1690 | "ext-symfony_debug": "" 1691 | }, 1692 | "type": "library", 1693 | "extra": { 1694 | "branch-alias": { 1695 | "dev-master": "3.0-dev" 1696 | } 1697 | }, 1698 | "autoload": { 1699 | "files": [ 1700 | "Resources/functions/dump.php" 1701 | ], 1702 | "psr-4": { 1703 | "Symfony\\Component\\VarDumper\\": "" 1704 | }, 1705 | "exclude-from-classmap": [ 1706 | "/Tests/" 1707 | ] 1708 | }, 1709 | "notification-url": "https://packagist.org/downloads/", 1710 | "license": [ 1711 | "MIT" 1712 | ], 1713 | "authors": [ 1714 | { 1715 | "name": "Nicolas Grekas", 1716 | "email": "p@tchwork.com" 1717 | }, 1718 | { 1719 | "name": "Symfony Community", 1720 | "homepage": "https://symfony.com/contributors" 1721 | } 1722 | ], 1723 | "description": "Symfony mechanism for exploring and dumping PHP variables", 1724 | "homepage": "https://symfony.com", 1725 | "keywords": [ 1726 | "debug", 1727 | "dump" 1728 | ], 1729 | "time": "2016-05-24 10:03:10" 1730 | }, 1731 | { 1732 | "name": "vlucas/phpdotenv", 1733 | "version": "v2.3.0", 1734 | "source": { 1735 | "type": "git", 1736 | "url": "https://github.com/vlucas/phpdotenv.git", 1737 | "reference": "9ca5644c536654e9509b9d257f53c58630eb2a6a" 1738 | }, 1739 | "dist": { 1740 | "type": "zip", 1741 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/9ca5644c536654e9509b9d257f53c58630eb2a6a", 1742 | "reference": "9ca5644c536654e9509b9d257f53c58630eb2a6a", 1743 | "shasum": "" 1744 | }, 1745 | "require": { 1746 | "php": ">=5.3.9" 1747 | }, 1748 | "require-dev": { 1749 | "phpunit/phpunit": "^4.8 || ^5.0" 1750 | }, 1751 | "type": "library", 1752 | "extra": { 1753 | "branch-alias": { 1754 | "dev-master": "2.3-dev" 1755 | } 1756 | }, 1757 | "autoload": { 1758 | "psr-4": { 1759 | "Dotenv\\": "src/" 1760 | } 1761 | }, 1762 | "notification-url": "https://packagist.org/downloads/", 1763 | "license": [ 1764 | "BSD-3-Clause-Attribution" 1765 | ], 1766 | "authors": [ 1767 | { 1768 | "name": "Vance Lucas", 1769 | "email": "vance@vancelucas.com", 1770 | "homepage": "http://www.vancelucas.com" 1771 | } 1772 | ], 1773 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 1774 | "keywords": [ 1775 | "dotenv", 1776 | "env", 1777 | "environment" 1778 | ], 1779 | "time": "2016-06-14 14:14:52" 1780 | } 1781 | ], 1782 | "packages-dev": [ 1783 | { 1784 | "name": "doctrine/instantiator", 1785 | "version": "1.0.5", 1786 | "source": { 1787 | "type": "git", 1788 | "url": "https://github.com/doctrine/instantiator.git", 1789 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 1790 | }, 1791 | "dist": { 1792 | "type": "zip", 1793 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 1794 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 1795 | "shasum": "" 1796 | }, 1797 | "require": { 1798 | "php": ">=5.3,<8.0-DEV" 1799 | }, 1800 | "require-dev": { 1801 | "athletic/athletic": "~0.1.8", 1802 | "ext-pdo": "*", 1803 | "ext-phar": "*", 1804 | "phpunit/phpunit": "~4.0", 1805 | "squizlabs/php_codesniffer": "~2.0" 1806 | }, 1807 | "type": "library", 1808 | "extra": { 1809 | "branch-alias": { 1810 | "dev-master": "1.0.x-dev" 1811 | } 1812 | }, 1813 | "autoload": { 1814 | "psr-4": { 1815 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 1816 | } 1817 | }, 1818 | "notification-url": "https://packagist.org/downloads/", 1819 | "license": [ 1820 | "MIT" 1821 | ], 1822 | "authors": [ 1823 | { 1824 | "name": "Marco Pivetta", 1825 | "email": "ocramius@gmail.com", 1826 | "homepage": "http://ocramius.github.com/" 1827 | } 1828 | ], 1829 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 1830 | "homepage": "https://github.com/doctrine/instantiator", 1831 | "keywords": [ 1832 | "constructor", 1833 | "instantiate" 1834 | ], 1835 | "time": "2015-06-14 21:17:01" 1836 | }, 1837 | { 1838 | "name": "fzaninotto/faker", 1839 | "version": "v1.6.0", 1840 | "source": { 1841 | "type": "git", 1842 | "url": "https://github.com/fzaninotto/Faker.git", 1843 | "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123" 1844 | }, 1845 | "dist": { 1846 | "type": "zip", 1847 | "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/44f9a286a04b80c76a4e5fb7aad8bb539b920123", 1848 | "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123", 1849 | "shasum": "" 1850 | }, 1851 | "require": { 1852 | "php": "^5.3.3|^7.0" 1853 | }, 1854 | "require-dev": { 1855 | "ext-intl": "*", 1856 | "phpunit/phpunit": "~4.0", 1857 | "squizlabs/php_codesniffer": "~1.5" 1858 | }, 1859 | "type": "library", 1860 | "extra": { 1861 | "branch-alias": [] 1862 | }, 1863 | "autoload": { 1864 | "psr-4": { 1865 | "Faker\\": "src/Faker/" 1866 | } 1867 | }, 1868 | "notification-url": "https://packagist.org/downloads/", 1869 | "license": [ 1870 | "MIT" 1871 | ], 1872 | "authors": [ 1873 | { 1874 | "name": "François Zaninotto" 1875 | } 1876 | ], 1877 | "description": "Faker is a PHP library that generates fake data for you.", 1878 | "keywords": [ 1879 | "data", 1880 | "faker", 1881 | "fixtures" 1882 | ], 1883 | "time": "2016-04-29 12:21:54" 1884 | }, 1885 | { 1886 | "name": "graham-campbell/testbench", 1887 | "version": "v3.2.0", 1888 | "source": { 1889 | "type": "git", 1890 | "url": "https://github.com/GrahamCampbell/Laravel-TestBench.git", 1891 | "reference": "01cb56f7d7ae17979d327e9758b3d4b9d55df8d2" 1892 | }, 1893 | "dist": { 1894 | "type": "zip", 1895 | "url": "https://api.github.com/repos/GrahamCampbell/Laravel-TestBench/zipball/01cb56f7d7ae17979d327e9758b3d4b9d55df8d2", 1896 | "reference": "01cb56f7d7ae17979d327e9758b3d4b9d55df8d2", 1897 | "shasum": "" 1898 | }, 1899 | "require": { 1900 | "graham-campbell/testbench-core": "^1.1", 1901 | "orchestra/testbench": "3.1.*|3.2.*|3.3.*", 1902 | "php": ">=5.5.9" 1903 | }, 1904 | "require-dev": { 1905 | "mockery/mockery": "^0.9.4", 1906 | "phpunit/phpunit": "^4.8|^5.0" 1907 | }, 1908 | "type": "library", 1909 | "extra": { 1910 | "branch-alias": { 1911 | "dev-master": "3.2-dev" 1912 | } 1913 | }, 1914 | "autoload": { 1915 | "psr-4": { 1916 | "GrahamCampbell\\TestBench\\": "src/" 1917 | } 1918 | }, 1919 | "notification-url": "https://packagist.org/downloads/", 1920 | "license": [ 1921 | "MIT" 1922 | ], 1923 | "authors": [ 1924 | { 1925 | "name": "Graham Campbell", 1926 | "email": "graham@alt-three.com" 1927 | } 1928 | ], 1929 | "description": "TestBench Provides Some Testing Functionality For Laravel 5", 1930 | "keywords": [ 1931 | "Graham Campbell", 1932 | "GrahamCampbell", 1933 | "Laravel TestBench", 1934 | "Laravel-TestBench", 1935 | "TestBench", 1936 | "framework", 1937 | "laravel", 1938 | "testing" 1939 | ], 1940 | "time": "2016-04-26 14:29:20" 1941 | }, 1942 | { 1943 | "name": "graham-campbell/testbench-core", 1944 | "version": "v1.1.1", 1945 | "source": { 1946 | "type": "git", 1947 | "url": "https://github.com/GrahamCampbell/Laravel-TestBench-Core.git", 1948 | "reference": "407e8cff5568ab95c4788ed5f7633e54be712de1" 1949 | }, 1950 | "dist": { 1951 | "type": "zip", 1952 | "url": "https://api.github.com/repos/GrahamCampbell/Laravel-TestBench-Core/zipball/407e8cff5568ab95c4788ed5f7633e54be712de1", 1953 | "reference": "407e8cff5568ab95c4788ed5f7633e54be712de1", 1954 | "shasum": "" 1955 | }, 1956 | "require": { 1957 | "php": ">=5.5.9" 1958 | }, 1959 | "require-dev": { 1960 | "phpunit/phpunit": "^4.8|^5.0" 1961 | }, 1962 | "suggest": { 1963 | "illuminate/support": "Required to use the laravel trait.", 1964 | "mockery/mockery": "Required to use the mockery trait.", 1965 | "phpunit/phpunit": "Required to use the most of the features." 1966 | }, 1967 | "type": "library", 1968 | "extra": { 1969 | "branch-alias": { 1970 | "dev-master": "1.1-dev" 1971 | } 1972 | }, 1973 | "autoload": { 1974 | "psr-4": { 1975 | "GrahamCampbell\\TestBenchCore\\": "src/" 1976 | } 1977 | }, 1978 | "notification-url": "https://packagist.org/downloads/", 1979 | "license": [ 1980 | "MIT" 1981 | ], 1982 | "authors": [ 1983 | { 1984 | "name": "Graham Campbell", 1985 | "email": "graham@alt-three.com" 1986 | } 1987 | ], 1988 | "description": "TestBench Core Provides Some Testing Functionality For Laravel 5", 1989 | "keywords": [ 1990 | "Graham Campbell", 1991 | "GrahamCampbell", 1992 | "Laravel TestBench Core", 1993 | "Laravel-TestBench-Core", 1994 | "TestBench", 1995 | "framework", 1996 | "laravel", 1997 | "testbench-core", 1998 | "testing" 1999 | ], 2000 | "time": "2016-01-30 13:57:27" 2001 | }, 2002 | { 2003 | "name": "hamcrest/hamcrest-php", 2004 | "version": "v2.0.0", 2005 | "source": { 2006 | "type": "git", 2007 | "url": "https://github.com/hamcrest/hamcrest-php.git", 2008 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" 2009 | }, 2010 | "dist": { 2011 | "type": "zip", 2012 | "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", 2013 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", 2014 | "shasum": "" 2015 | }, 2016 | "require": { 2017 | "php": "^5.3|^7.0" 2018 | }, 2019 | "replace": { 2020 | "cordoval/hamcrest-php": "*", 2021 | "davedevelopment/hamcrest-php": "*", 2022 | "kodova/hamcrest-php": "*" 2023 | }, 2024 | "require-dev": { 2025 | "phpunit/php-file-iterator": "1.3.3", 2026 | "phpunit/phpunit": "~4.0", 2027 | "satooshi/php-coveralls": "^1.0" 2028 | }, 2029 | "type": "library", 2030 | "extra": { 2031 | "branch-alias": { 2032 | "dev-master": "2.0-dev" 2033 | } 2034 | }, 2035 | "autoload": { 2036 | "classmap": [ 2037 | "hamcrest" 2038 | ] 2039 | }, 2040 | "notification-url": "https://packagist.org/downloads/", 2041 | "license": [ 2042 | "BSD" 2043 | ], 2044 | "description": "This is the PHP port of Hamcrest Matchers", 2045 | "keywords": [ 2046 | "test" 2047 | ], 2048 | "time": "2016-01-20 08:20:44" 2049 | }, 2050 | { 2051 | "name": "mockery/mockery", 2052 | "version": "dev-master", 2053 | "source": { 2054 | "type": "git", 2055 | "url": "https://github.com/padraic/mockery.git", 2056 | "reference": "ec1ca8266d9f8220cb0f90bbb84735137d180c90" 2057 | }, 2058 | "dist": { 2059 | "type": "zip", 2060 | "url": "https://api.github.com/repos/padraic/mockery/zipball/ec1ca8266d9f8220cb0f90bbb84735137d180c90", 2061 | "reference": "ec1ca8266d9f8220cb0f90bbb84735137d180c90", 2062 | "shasum": "" 2063 | }, 2064 | "require": { 2065 | "hamcrest/hamcrest-php": "^2.0@dev", 2066 | "lib-pcre": ">=7.0", 2067 | "php": ">=5.4.0" 2068 | }, 2069 | "require-dev": { 2070 | "phpunit/phpunit": "~4.0" 2071 | }, 2072 | "type": "library", 2073 | "extra": { 2074 | "branch-alias": { 2075 | "dev-master": "1.0.x-dev" 2076 | } 2077 | }, 2078 | "autoload": { 2079 | "psr-0": { 2080 | "Mockery": "library/" 2081 | } 2082 | }, 2083 | "notification-url": "https://packagist.org/downloads/", 2084 | "license": [ 2085 | "BSD-3-Clause" 2086 | ], 2087 | "authors": [ 2088 | { 2089 | "name": "Pádraic Brady", 2090 | "email": "padraic.brady@gmail.com", 2091 | "homepage": "http://blog.astrumfutura.com" 2092 | }, 2093 | { 2094 | "name": "Dave Marshall", 2095 | "email": "dave.marshall@atstsolutions.co.uk", 2096 | "homepage": "http://davedevelopment.co.uk" 2097 | } 2098 | ], 2099 | "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", 2100 | "homepage": "http://github.com/padraic/mockery", 2101 | "keywords": [ 2102 | "BDD", 2103 | "TDD", 2104 | "library", 2105 | "mock", 2106 | "mock objects", 2107 | "mockery", 2108 | "stub", 2109 | "test", 2110 | "test double", 2111 | "testing" 2112 | ], 2113 | "time": "2016-06-02 10:51:58" 2114 | }, 2115 | { 2116 | "name": "orchestra/database", 2117 | "version": "v3.2.2", 2118 | "source": { 2119 | "type": "git", 2120 | "url": "https://github.com/orchestral/database.git", 2121 | "reference": "7bdcd44a722dd1afb9ad7fe1f2154059e325b275" 2122 | }, 2123 | "dist": { 2124 | "type": "zip", 2125 | "url": "https://api.github.com/repos/orchestral/database/zipball/7bdcd44a722dd1afb9ad7fe1f2154059e325b275", 2126 | "reference": "7bdcd44a722dd1afb9ad7fe1f2154059e325b275", 2127 | "shasum": "" 2128 | }, 2129 | "require": { 2130 | "illuminate/contracts": "~5.2.0", 2131 | "illuminate/database": "~5.2.0", 2132 | "php": ">=5.5.0" 2133 | }, 2134 | "type": "library", 2135 | "extra": { 2136 | "branch-alias": { 2137 | "dev-master": "3.3-dev" 2138 | } 2139 | }, 2140 | "autoload": { 2141 | "psr-4": { 2142 | "Orchestra\\Database\\": "" 2143 | } 2144 | }, 2145 | "notification-url": "https://packagist.org/downloads/", 2146 | "license": [ 2147 | "MIT" 2148 | ], 2149 | "authors": [ 2150 | { 2151 | "name": "Mior Muhammad Zaki", 2152 | "email": "crynobone@gmail.com", 2153 | "homepage": "https://github.com/crynobone" 2154 | }, 2155 | { 2156 | "name": "Taylor Otwell", 2157 | "email": "taylorotwell@gmail.com", 2158 | "homepage": "https://github.com/taylorotwell" 2159 | } 2160 | ], 2161 | "description": "Database Component for Orchestra Platform", 2162 | "keywords": [ 2163 | "database", 2164 | "orchestra-platform", 2165 | "orchestral" 2166 | ], 2167 | "time": "2016-03-01 13:50:22" 2168 | }, 2169 | { 2170 | "name": "orchestra/testbench", 2171 | "version": "v3.2.5", 2172 | "source": { 2173 | "type": "git", 2174 | "url": "https://github.com/orchestral/testbench.git", 2175 | "reference": "69d215f736e1f7f497a71e69ef292271ba7a6be2" 2176 | }, 2177 | "dist": { 2178 | "type": "zip", 2179 | "url": "https://api.github.com/repos/orchestral/testbench/zipball/69d215f736e1f7f497a71e69ef292271ba7a6be2", 2180 | "reference": "69d215f736e1f7f497a71e69ef292271ba7a6be2", 2181 | "shasum": "" 2182 | }, 2183 | "require": { 2184 | "fzaninotto/faker": "~1.4", 2185 | "laravel/framework": "~5.2.28", 2186 | "orchestra/database": "~3.2.0", 2187 | "php": ">=5.5.0", 2188 | "symfony/css-selector": "2.8.*|3.0.*", 2189 | "symfony/dom-crawler": "2.8.*|3.0.*" 2190 | }, 2191 | "require-dev": { 2192 | "mockery/mockery": "^0.9.4", 2193 | "phpunit/phpunit": "~4.8|~5.0" 2194 | }, 2195 | "suggest": { 2196 | "phpunit/phpunit": "Allow to use PHPUnit for testing your Laravel Application/Package (~4.0|~5.0)." 2197 | }, 2198 | "type": "library", 2199 | "extra": { 2200 | "branch-alias": { 2201 | "dev-master": "3.3-dev" 2202 | } 2203 | }, 2204 | "autoload": { 2205 | "psr-4": { 2206 | "Orchestra\\Testbench\\": "src/" 2207 | } 2208 | }, 2209 | "notification-url": "https://packagist.org/downloads/", 2210 | "license": [ 2211 | "MIT" 2212 | ], 2213 | "authors": [ 2214 | { 2215 | "name": "Mior Muhammad Zaki", 2216 | "email": "crynobone@gmail.com", 2217 | "homepage": "https://github.com/crynobone" 2218 | } 2219 | ], 2220 | "description": "Laravel Package Unit Testing Helper", 2221 | "homepage": "http://orchestraplatform.com/docs/latest/components/testbench/", 2222 | "keywords": [ 2223 | "BDD", 2224 | "TDD", 2225 | "laravel", 2226 | "orchestra-platform", 2227 | "orchestral", 2228 | "testing" 2229 | ], 2230 | "time": "2016-05-26 22:54:22" 2231 | }, 2232 | { 2233 | "name": "phpdocumentor/reflection-common", 2234 | "version": "1.0", 2235 | "source": { 2236 | "type": "git", 2237 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 2238 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" 2239 | }, 2240 | "dist": { 2241 | "type": "zip", 2242 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 2243 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 2244 | "shasum": "" 2245 | }, 2246 | "require": { 2247 | "php": ">=5.5" 2248 | }, 2249 | "require-dev": { 2250 | "phpunit/phpunit": "^4.6" 2251 | }, 2252 | "type": "library", 2253 | "extra": { 2254 | "branch-alias": { 2255 | "dev-master": "1.0.x-dev" 2256 | } 2257 | }, 2258 | "autoload": { 2259 | "psr-4": { 2260 | "phpDocumentor\\Reflection\\": [ 2261 | "src" 2262 | ] 2263 | } 2264 | }, 2265 | "notification-url": "https://packagist.org/downloads/", 2266 | "license": [ 2267 | "MIT" 2268 | ], 2269 | "authors": [ 2270 | { 2271 | "name": "Jaap van Otterdijk", 2272 | "email": "opensource@ijaap.nl" 2273 | } 2274 | ], 2275 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 2276 | "homepage": "http://www.phpdoc.org", 2277 | "keywords": [ 2278 | "FQSEN", 2279 | "phpDocumentor", 2280 | "phpdoc", 2281 | "reflection", 2282 | "static analysis" 2283 | ], 2284 | "time": "2015-12-27 11:43:31" 2285 | }, 2286 | { 2287 | "name": "phpdocumentor/reflection-docblock", 2288 | "version": "3.1.0", 2289 | "source": { 2290 | "type": "git", 2291 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 2292 | "reference": "9270140b940ff02e58ec577c237274e92cd40cdd" 2293 | }, 2294 | "dist": { 2295 | "type": "zip", 2296 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd", 2297 | "reference": "9270140b940ff02e58ec577c237274e92cd40cdd", 2298 | "shasum": "" 2299 | }, 2300 | "require": { 2301 | "php": ">=5.5", 2302 | "phpdocumentor/reflection-common": "^1.0@dev", 2303 | "phpdocumentor/type-resolver": "^0.2.0", 2304 | "webmozart/assert": "^1.0" 2305 | }, 2306 | "require-dev": { 2307 | "mockery/mockery": "^0.9.4", 2308 | "phpunit/phpunit": "^4.4" 2309 | }, 2310 | "type": "library", 2311 | "autoload": { 2312 | "psr-4": { 2313 | "phpDocumentor\\Reflection\\": [ 2314 | "src/" 2315 | ] 2316 | } 2317 | }, 2318 | "notification-url": "https://packagist.org/downloads/", 2319 | "license": [ 2320 | "MIT" 2321 | ], 2322 | "authors": [ 2323 | { 2324 | "name": "Mike van Riel", 2325 | "email": "me@mikevanriel.com" 2326 | } 2327 | ], 2328 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 2329 | "time": "2016-06-10 09:48:41" 2330 | }, 2331 | { 2332 | "name": "phpdocumentor/type-resolver", 2333 | "version": "0.2", 2334 | "source": { 2335 | "type": "git", 2336 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 2337 | "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" 2338 | }, 2339 | "dist": { 2340 | "type": "zip", 2341 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", 2342 | "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", 2343 | "shasum": "" 2344 | }, 2345 | "require": { 2346 | "php": ">=5.5", 2347 | "phpdocumentor/reflection-common": "^1.0" 2348 | }, 2349 | "require-dev": { 2350 | "mockery/mockery": "^0.9.4", 2351 | "phpunit/phpunit": "^5.2||^4.8.24" 2352 | }, 2353 | "type": "library", 2354 | "extra": { 2355 | "branch-alias": { 2356 | "dev-master": "1.0.x-dev" 2357 | } 2358 | }, 2359 | "autoload": { 2360 | "psr-4": { 2361 | "phpDocumentor\\Reflection\\": [ 2362 | "src/" 2363 | ] 2364 | } 2365 | }, 2366 | "notification-url": "https://packagist.org/downloads/", 2367 | "license": [ 2368 | "MIT" 2369 | ], 2370 | "authors": [ 2371 | { 2372 | "name": "Mike van Riel", 2373 | "email": "me@mikevanriel.com" 2374 | } 2375 | ], 2376 | "time": "2016-06-10 07:14:17" 2377 | }, 2378 | { 2379 | "name": "phpspec/prophecy", 2380 | "version": "v1.6.1", 2381 | "source": { 2382 | "type": "git", 2383 | "url": "https://github.com/phpspec/prophecy.git", 2384 | "reference": "58a8137754bc24b25740d4281399a4a3596058e0" 2385 | }, 2386 | "dist": { 2387 | "type": "zip", 2388 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", 2389 | "reference": "58a8137754bc24b25740d4281399a4a3596058e0", 2390 | "shasum": "" 2391 | }, 2392 | "require": { 2393 | "doctrine/instantiator": "^1.0.2", 2394 | "php": "^5.3|^7.0", 2395 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", 2396 | "sebastian/comparator": "^1.1", 2397 | "sebastian/recursion-context": "^1.0" 2398 | }, 2399 | "require-dev": { 2400 | "phpspec/phpspec": "^2.0" 2401 | }, 2402 | "type": "library", 2403 | "extra": { 2404 | "branch-alias": { 2405 | "dev-master": "1.6.x-dev" 2406 | } 2407 | }, 2408 | "autoload": { 2409 | "psr-0": { 2410 | "Prophecy\\": "src/" 2411 | } 2412 | }, 2413 | "notification-url": "https://packagist.org/downloads/", 2414 | "license": [ 2415 | "MIT" 2416 | ], 2417 | "authors": [ 2418 | { 2419 | "name": "Konstantin Kudryashov", 2420 | "email": "ever.zet@gmail.com", 2421 | "homepage": "http://everzet.com" 2422 | }, 2423 | { 2424 | "name": "Marcello Duarte", 2425 | "email": "marcello.duarte@gmail.com" 2426 | } 2427 | ], 2428 | "description": "Highly opinionated mocking framework for PHP 5.3+", 2429 | "homepage": "https://github.com/phpspec/prophecy", 2430 | "keywords": [ 2431 | "Double", 2432 | "Dummy", 2433 | "fake", 2434 | "mock", 2435 | "spy", 2436 | "stub" 2437 | ], 2438 | "time": "2016-06-07 08:13:47" 2439 | }, 2440 | { 2441 | "name": "phpunit/php-code-coverage", 2442 | "version": "2.2.4", 2443 | "source": { 2444 | "type": "git", 2445 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 2446 | "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" 2447 | }, 2448 | "dist": { 2449 | "type": "zip", 2450 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", 2451 | "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", 2452 | "shasum": "" 2453 | }, 2454 | "require": { 2455 | "php": ">=5.3.3", 2456 | "phpunit/php-file-iterator": "~1.3", 2457 | "phpunit/php-text-template": "~1.2", 2458 | "phpunit/php-token-stream": "~1.3", 2459 | "sebastian/environment": "^1.3.2", 2460 | "sebastian/version": "~1.0" 2461 | }, 2462 | "require-dev": { 2463 | "ext-xdebug": ">=2.1.4", 2464 | "phpunit/phpunit": "~4" 2465 | }, 2466 | "suggest": { 2467 | "ext-dom": "*", 2468 | "ext-xdebug": ">=2.2.1", 2469 | "ext-xmlwriter": "*" 2470 | }, 2471 | "type": "library", 2472 | "extra": { 2473 | "branch-alias": { 2474 | "dev-master": "2.2.x-dev" 2475 | } 2476 | }, 2477 | "autoload": { 2478 | "classmap": [ 2479 | "src/" 2480 | ] 2481 | }, 2482 | "notification-url": "https://packagist.org/downloads/", 2483 | "license": [ 2484 | "BSD-3-Clause" 2485 | ], 2486 | "authors": [ 2487 | { 2488 | "name": "Sebastian Bergmann", 2489 | "email": "sb@sebastian-bergmann.de", 2490 | "role": "lead" 2491 | } 2492 | ], 2493 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2494 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2495 | "keywords": [ 2496 | "coverage", 2497 | "testing", 2498 | "xunit" 2499 | ], 2500 | "time": "2015-10-06 15:47:00" 2501 | }, 2502 | { 2503 | "name": "phpunit/php-file-iterator", 2504 | "version": "1.4.1", 2505 | "source": { 2506 | "type": "git", 2507 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2508 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" 2509 | }, 2510 | "dist": { 2511 | "type": "zip", 2512 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 2513 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 2514 | "shasum": "" 2515 | }, 2516 | "require": { 2517 | "php": ">=5.3.3" 2518 | }, 2519 | "type": "library", 2520 | "extra": { 2521 | "branch-alias": { 2522 | "dev-master": "1.4.x-dev" 2523 | } 2524 | }, 2525 | "autoload": { 2526 | "classmap": [ 2527 | "src/" 2528 | ] 2529 | }, 2530 | "notification-url": "https://packagist.org/downloads/", 2531 | "license": [ 2532 | "BSD-3-Clause" 2533 | ], 2534 | "authors": [ 2535 | { 2536 | "name": "Sebastian Bergmann", 2537 | "email": "sb@sebastian-bergmann.de", 2538 | "role": "lead" 2539 | } 2540 | ], 2541 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2542 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2543 | "keywords": [ 2544 | "filesystem", 2545 | "iterator" 2546 | ], 2547 | "time": "2015-06-21 13:08:43" 2548 | }, 2549 | { 2550 | "name": "phpunit/php-text-template", 2551 | "version": "1.2.1", 2552 | "source": { 2553 | "type": "git", 2554 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2555 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2556 | }, 2557 | "dist": { 2558 | "type": "zip", 2559 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2560 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2561 | "shasum": "" 2562 | }, 2563 | "require": { 2564 | "php": ">=5.3.3" 2565 | }, 2566 | "type": "library", 2567 | "autoload": { 2568 | "classmap": [ 2569 | "src/" 2570 | ] 2571 | }, 2572 | "notification-url": "https://packagist.org/downloads/", 2573 | "license": [ 2574 | "BSD-3-Clause" 2575 | ], 2576 | "authors": [ 2577 | { 2578 | "name": "Sebastian Bergmann", 2579 | "email": "sebastian@phpunit.de", 2580 | "role": "lead" 2581 | } 2582 | ], 2583 | "description": "Simple template engine.", 2584 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2585 | "keywords": [ 2586 | "template" 2587 | ], 2588 | "time": "2015-06-21 13:50:34" 2589 | }, 2590 | { 2591 | "name": "phpunit/php-timer", 2592 | "version": "1.0.8", 2593 | "source": { 2594 | "type": "git", 2595 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2596 | "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" 2597 | }, 2598 | "dist": { 2599 | "type": "zip", 2600 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", 2601 | "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", 2602 | "shasum": "" 2603 | }, 2604 | "require": { 2605 | "php": ">=5.3.3" 2606 | }, 2607 | "require-dev": { 2608 | "phpunit/phpunit": "~4|~5" 2609 | }, 2610 | "type": "library", 2611 | "autoload": { 2612 | "classmap": [ 2613 | "src/" 2614 | ] 2615 | }, 2616 | "notification-url": "https://packagist.org/downloads/", 2617 | "license": [ 2618 | "BSD-3-Clause" 2619 | ], 2620 | "authors": [ 2621 | { 2622 | "name": "Sebastian Bergmann", 2623 | "email": "sb@sebastian-bergmann.de", 2624 | "role": "lead" 2625 | } 2626 | ], 2627 | "description": "Utility class for timing", 2628 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 2629 | "keywords": [ 2630 | "timer" 2631 | ], 2632 | "time": "2016-05-12 18:03:57" 2633 | }, 2634 | { 2635 | "name": "phpunit/php-token-stream", 2636 | "version": "1.4.8", 2637 | "source": { 2638 | "type": "git", 2639 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 2640 | "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" 2641 | }, 2642 | "dist": { 2643 | "type": "zip", 2644 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", 2645 | "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", 2646 | "shasum": "" 2647 | }, 2648 | "require": { 2649 | "ext-tokenizer": "*", 2650 | "php": ">=5.3.3" 2651 | }, 2652 | "require-dev": { 2653 | "phpunit/phpunit": "~4.2" 2654 | }, 2655 | "type": "library", 2656 | "extra": { 2657 | "branch-alias": { 2658 | "dev-master": "1.4-dev" 2659 | } 2660 | }, 2661 | "autoload": { 2662 | "classmap": [ 2663 | "src/" 2664 | ] 2665 | }, 2666 | "notification-url": "https://packagist.org/downloads/", 2667 | "license": [ 2668 | "BSD-3-Clause" 2669 | ], 2670 | "authors": [ 2671 | { 2672 | "name": "Sebastian Bergmann", 2673 | "email": "sebastian@phpunit.de" 2674 | } 2675 | ], 2676 | "description": "Wrapper around PHP's tokenizer extension.", 2677 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 2678 | "keywords": [ 2679 | "tokenizer" 2680 | ], 2681 | "time": "2015-09-15 10:49:45" 2682 | }, 2683 | { 2684 | "name": "phpunit/phpunit", 2685 | "version": "4.8.26", 2686 | "source": { 2687 | "type": "git", 2688 | "url": "https://github.com/sebastianbergmann/phpunit.git", 2689 | "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74" 2690 | }, 2691 | "dist": { 2692 | "type": "zip", 2693 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc1d8cd5b5de11625979125c5639347896ac2c74", 2694 | "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74", 2695 | "shasum": "" 2696 | }, 2697 | "require": { 2698 | "ext-dom": "*", 2699 | "ext-json": "*", 2700 | "ext-pcre": "*", 2701 | "ext-reflection": "*", 2702 | "ext-spl": "*", 2703 | "php": ">=5.3.3", 2704 | "phpspec/prophecy": "^1.3.1", 2705 | "phpunit/php-code-coverage": "~2.1", 2706 | "phpunit/php-file-iterator": "~1.4", 2707 | "phpunit/php-text-template": "~1.2", 2708 | "phpunit/php-timer": "^1.0.6", 2709 | "phpunit/phpunit-mock-objects": "~2.3", 2710 | "sebastian/comparator": "~1.1", 2711 | "sebastian/diff": "~1.2", 2712 | "sebastian/environment": "~1.3", 2713 | "sebastian/exporter": "~1.2", 2714 | "sebastian/global-state": "~1.0", 2715 | "sebastian/version": "~1.0", 2716 | "symfony/yaml": "~2.1|~3.0" 2717 | }, 2718 | "suggest": { 2719 | "phpunit/php-invoker": "~1.1" 2720 | }, 2721 | "bin": [ 2722 | "phpunit" 2723 | ], 2724 | "type": "library", 2725 | "extra": { 2726 | "branch-alias": { 2727 | "dev-master": "4.8.x-dev" 2728 | } 2729 | }, 2730 | "autoload": { 2731 | "classmap": [ 2732 | "src/" 2733 | ] 2734 | }, 2735 | "notification-url": "https://packagist.org/downloads/", 2736 | "license": [ 2737 | "BSD-3-Clause" 2738 | ], 2739 | "authors": [ 2740 | { 2741 | "name": "Sebastian Bergmann", 2742 | "email": "sebastian@phpunit.de", 2743 | "role": "lead" 2744 | } 2745 | ], 2746 | "description": "The PHP Unit Testing framework.", 2747 | "homepage": "https://phpunit.de/", 2748 | "keywords": [ 2749 | "phpunit", 2750 | "testing", 2751 | "xunit" 2752 | ], 2753 | "time": "2016-05-17 03:09:28" 2754 | }, 2755 | { 2756 | "name": "phpunit/phpunit-mock-objects", 2757 | "version": "2.3.8", 2758 | "source": { 2759 | "type": "git", 2760 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 2761 | "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" 2762 | }, 2763 | "dist": { 2764 | "type": "zip", 2765 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", 2766 | "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", 2767 | "shasum": "" 2768 | }, 2769 | "require": { 2770 | "doctrine/instantiator": "^1.0.2", 2771 | "php": ">=5.3.3", 2772 | "phpunit/php-text-template": "~1.2", 2773 | "sebastian/exporter": "~1.2" 2774 | }, 2775 | "require-dev": { 2776 | "phpunit/phpunit": "~4.4" 2777 | }, 2778 | "suggest": { 2779 | "ext-soap": "*" 2780 | }, 2781 | "type": "library", 2782 | "extra": { 2783 | "branch-alias": { 2784 | "dev-master": "2.3.x-dev" 2785 | } 2786 | }, 2787 | "autoload": { 2788 | "classmap": [ 2789 | "src/" 2790 | ] 2791 | }, 2792 | "notification-url": "https://packagist.org/downloads/", 2793 | "license": [ 2794 | "BSD-3-Clause" 2795 | ], 2796 | "authors": [ 2797 | { 2798 | "name": "Sebastian Bergmann", 2799 | "email": "sb@sebastian-bergmann.de", 2800 | "role": "lead" 2801 | } 2802 | ], 2803 | "description": "Mock Object library for PHPUnit", 2804 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 2805 | "keywords": [ 2806 | "mock", 2807 | "xunit" 2808 | ], 2809 | "time": "2015-10-02 06:51:40" 2810 | }, 2811 | { 2812 | "name": "sebastian/comparator", 2813 | "version": "1.2.0", 2814 | "source": { 2815 | "type": "git", 2816 | "url": "https://github.com/sebastianbergmann/comparator.git", 2817 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" 2818 | }, 2819 | "dist": { 2820 | "type": "zip", 2821 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", 2822 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", 2823 | "shasum": "" 2824 | }, 2825 | "require": { 2826 | "php": ">=5.3.3", 2827 | "sebastian/diff": "~1.2", 2828 | "sebastian/exporter": "~1.2" 2829 | }, 2830 | "require-dev": { 2831 | "phpunit/phpunit": "~4.4" 2832 | }, 2833 | "type": "library", 2834 | "extra": { 2835 | "branch-alias": { 2836 | "dev-master": "1.2.x-dev" 2837 | } 2838 | }, 2839 | "autoload": { 2840 | "classmap": [ 2841 | "src/" 2842 | ] 2843 | }, 2844 | "notification-url": "https://packagist.org/downloads/", 2845 | "license": [ 2846 | "BSD-3-Clause" 2847 | ], 2848 | "authors": [ 2849 | { 2850 | "name": "Jeff Welch", 2851 | "email": "whatthejeff@gmail.com" 2852 | }, 2853 | { 2854 | "name": "Volker Dusch", 2855 | "email": "github@wallbash.com" 2856 | }, 2857 | { 2858 | "name": "Bernhard Schussek", 2859 | "email": "bschussek@2bepublished.at" 2860 | }, 2861 | { 2862 | "name": "Sebastian Bergmann", 2863 | "email": "sebastian@phpunit.de" 2864 | } 2865 | ], 2866 | "description": "Provides the functionality to compare PHP values for equality", 2867 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 2868 | "keywords": [ 2869 | "comparator", 2870 | "compare", 2871 | "equality" 2872 | ], 2873 | "time": "2015-07-26 15:48:44" 2874 | }, 2875 | { 2876 | "name": "sebastian/diff", 2877 | "version": "1.4.1", 2878 | "source": { 2879 | "type": "git", 2880 | "url": "https://github.com/sebastianbergmann/diff.git", 2881 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" 2882 | }, 2883 | "dist": { 2884 | "type": "zip", 2885 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", 2886 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", 2887 | "shasum": "" 2888 | }, 2889 | "require": { 2890 | "php": ">=5.3.3" 2891 | }, 2892 | "require-dev": { 2893 | "phpunit/phpunit": "~4.8" 2894 | }, 2895 | "type": "library", 2896 | "extra": { 2897 | "branch-alias": { 2898 | "dev-master": "1.4-dev" 2899 | } 2900 | }, 2901 | "autoload": { 2902 | "classmap": [ 2903 | "src/" 2904 | ] 2905 | }, 2906 | "notification-url": "https://packagist.org/downloads/", 2907 | "license": [ 2908 | "BSD-3-Clause" 2909 | ], 2910 | "authors": [ 2911 | { 2912 | "name": "Kore Nordmann", 2913 | "email": "mail@kore-nordmann.de" 2914 | }, 2915 | { 2916 | "name": "Sebastian Bergmann", 2917 | "email": "sebastian@phpunit.de" 2918 | } 2919 | ], 2920 | "description": "Diff implementation", 2921 | "homepage": "https://github.com/sebastianbergmann/diff", 2922 | "keywords": [ 2923 | "diff" 2924 | ], 2925 | "time": "2015-12-08 07:14:41" 2926 | }, 2927 | { 2928 | "name": "sebastian/environment", 2929 | "version": "1.3.7", 2930 | "source": { 2931 | "type": "git", 2932 | "url": "https://github.com/sebastianbergmann/environment.git", 2933 | "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" 2934 | }, 2935 | "dist": { 2936 | "type": "zip", 2937 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", 2938 | "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", 2939 | "shasum": "" 2940 | }, 2941 | "require": { 2942 | "php": ">=5.3.3" 2943 | }, 2944 | "require-dev": { 2945 | "phpunit/phpunit": "~4.4" 2946 | }, 2947 | "type": "library", 2948 | "extra": { 2949 | "branch-alias": { 2950 | "dev-master": "1.3.x-dev" 2951 | } 2952 | }, 2953 | "autoload": { 2954 | "classmap": [ 2955 | "src/" 2956 | ] 2957 | }, 2958 | "notification-url": "https://packagist.org/downloads/", 2959 | "license": [ 2960 | "BSD-3-Clause" 2961 | ], 2962 | "authors": [ 2963 | { 2964 | "name": "Sebastian Bergmann", 2965 | "email": "sebastian@phpunit.de" 2966 | } 2967 | ], 2968 | "description": "Provides functionality to handle HHVM/PHP environments", 2969 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2970 | "keywords": [ 2971 | "Xdebug", 2972 | "environment", 2973 | "hhvm" 2974 | ], 2975 | "time": "2016-05-17 03:18:57" 2976 | }, 2977 | { 2978 | "name": "sebastian/exporter", 2979 | "version": "1.2.2", 2980 | "source": { 2981 | "type": "git", 2982 | "url": "https://github.com/sebastianbergmann/exporter.git", 2983 | "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" 2984 | }, 2985 | "dist": { 2986 | "type": "zip", 2987 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", 2988 | "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", 2989 | "shasum": "" 2990 | }, 2991 | "require": { 2992 | "php": ">=5.3.3", 2993 | "sebastian/recursion-context": "~1.0" 2994 | }, 2995 | "require-dev": { 2996 | "ext-mbstring": "*", 2997 | "phpunit/phpunit": "~4.4" 2998 | }, 2999 | "type": "library", 3000 | "extra": { 3001 | "branch-alias": { 3002 | "dev-master": "1.3.x-dev" 3003 | } 3004 | }, 3005 | "autoload": { 3006 | "classmap": [ 3007 | "src/" 3008 | ] 3009 | }, 3010 | "notification-url": "https://packagist.org/downloads/", 3011 | "license": [ 3012 | "BSD-3-Clause" 3013 | ], 3014 | "authors": [ 3015 | { 3016 | "name": "Jeff Welch", 3017 | "email": "whatthejeff@gmail.com" 3018 | }, 3019 | { 3020 | "name": "Volker Dusch", 3021 | "email": "github@wallbash.com" 3022 | }, 3023 | { 3024 | "name": "Bernhard Schussek", 3025 | "email": "bschussek@2bepublished.at" 3026 | }, 3027 | { 3028 | "name": "Sebastian Bergmann", 3029 | "email": "sebastian@phpunit.de" 3030 | }, 3031 | { 3032 | "name": "Adam Harvey", 3033 | "email": "aharvey@php.net" 3034 | } 3035 | ], 3036 | "description": "Provides the functionality to export PHP variables for visualization", 3037 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 3038 | "keywords": [ 3039 | "export", 3040 | "exporter" 3041 | ], 3042 | "time": "2016-06-17 09:04:28" 3043 | }, 3044 | { 3045 | "name": "sebastian/global-state", 3046 | "version": "1.1.1", 3047 | "source": { 3048 | "type": "git", 3049 | "url": "https://github.com/sebastianbergmann/global-state.git", 3050 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 3051 | }, 3052 | "dist": { 3053 | "type": "zip", 3054 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 3055 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 3056 | "shasum": "" 3057 | }, 3058 | "require": { 3059 | "php": ">=5.3.3" 3060 | }, 3061 | "require-dev": { 3062 | "phpunit/phpunit": "~4.2" 3063 | }, 3064 | "suggest": { 3065 | "ext-uopz": "*" 3066 | }, 3067 | "type": "library", 3068 | "extra": { 3069 | "branch-alias": { 3070 | "dev-master": "1.0-dev" 3071 | } 3072 | }, 3073 | "autoload": { 3074 | "classmap": [ 3075 | "src/" 3076 | ] 3077 | }, 3078 | "notification-url": "https://packagist.org/downloads/", 3079 | "license": [ 3080 | "BSD-3-Clause" 3081 | ], 3082 | "authors": [ 3083 | { 3084 | "name": "Sebastian Bergmann", 3085 | "email": "sebastian@phpunit.de" 3086 | } 3087 | ], 3088 | "description": "Snapshotting of global state", 3089 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 3090 | "keywords": [ 3091 | "global state" 3092 | ], 3093 | "time": "2015-10-12 03:26:01" 3094 | }, 3095 | { 3096 | "name": "sebastian/recursion-context", 3097 | "version": "1.0.2", 3098 | "source": { 3099 | "type": "git", 3100 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 3101 | "reference": "913401df809e99e4f47b27cdd781f4a258d58791" 3102 | }, 3103 | "dist": { 3104 | "type": "zip", 3105 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", 3106 | "reference": "913401df809e99e4f47b27cdd781f4a258d58791", 3107 | "shasum": "" 3108 | }, 3109 | "require": { 3110 | "php": ">=5.3.3" 3111 | }, 3112 | "require-dev": { 3113 | "phpunit/phpunit": "~4.4" 3114 | }, 3115 | "type": "library", 3116 | "extra": { 3117 | "branch-alias": { 3118 | "dev-master": "1.0.x-dev" 3119 | } 3120 | }, 3121 | "autoload": { 3122 | "classmap": [ 3123 | "src/" 3124 | ] 3125 | }, 3126 | "notification-url": "https://packagist.org/downloads/", 3127 | "license": [ 3128 | "BSD-3-Clause" 3129 | ], 3130 | "authors": [ 3131 | { 3132 | "name": "Jeff Welch", 3133 | "email": "whatthejeff@gmail.com" 3134 | }, 3135 | { 3136 | "name": "Sebastian Bergmann", 3137 | "email": "sebastian@phpunit.de" 3138 | }, 3139 | { 3140 | "name": "Adam Harvey", 3141 | "email": "aharvey@php.net" 3142 | } 3143 | ], 3144 | "description": "Provides functionality to recursively process PHP variables", 3145 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 3146 | "time": "2015-11-11 19:50:13" 3147 | }, 3148 | { 3149 | "name": "sebastian/version", 3150 | "version": "1.0.6", 3151 | "source": { 3152 | "type": "git", 3153 | "url": "https://github.com/sebastianbergmann/version.git", 3154 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" 3155 | }, 3156 | "dist": { 3157 | "type": "zip", 3158 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 3159 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 3160 | "shasum": "" 3161 | }, 3162 | "type": "library", 3163 | "autoload": { 3164 | "classmap": [ 3165 | "src/" 3166 | ] 3167 | }, 3168 | "notification-url": "https://packagist.org/downloads/", 3169 | "license": [ 3170 | "BSD-3-Clause" 3171 | ], 3172 | "authors": [ 3173 | { 3174 | "name": "Sebastian Bergmann", 3175 | "email": "sebastian@phpunit.de", 3176 | "role": "lead" 3177 | } 3178 | ], 3179 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3180 | "homepage": "https://github.com/sebastianbergmann/version", 3181 | "time": "2015-06-21 13:59:46" 3182 | }, 3183 | { 3184 | "name": "symfony/css-selector", 3185 | "version": "v3.0.7", 3186 | "source": { 3187 | "type": "git", 3188 | "url": "https://github.com/symfony/css-selector.git", 3189 | "reference": "e8a66c51bf65f188c02f8120c0748b2291d3a2d0" 3190 | }, 3191 | "dist": { 3192 | "type": "zip", 3193 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/e8a66c51bf65f188c02f8120c0748b2291d3a2d0", 3194 | "reference": "e8a66c51bf65f188c02f8120c0748b2291d3a2d0", 3195 | "shasum": "" 3196 | }, 3197 | "require": { 3198 | "php": ">=5.5.9" 3199 | }, 3200 | "type": "library", 3201 | "extra": { 3202 | "branch-alias": { 3203 | "dev-master": "3.0-dev" 3204 | } 3205 | }, 3206 | "autoload": { 3207 | "psr-4": { 3208 | "Symfony\\Component\\CssSelector\\": "" 3209 | }, 3210 | "exclude-from-classmap": [ 3211 | "/Tests/" 3212 | ] 3213 | }, 3214 | "notification-url": "https://packagist.org/downloads/", 3215 | "license": [ 3216 | "MIT" 3217 | ], 3218 | "authors": [ 3219 | { 3220 | "name": "Jean-François Simon", 3221 | "email": "jeanfrancois.simon@sensiolabs.com" 3222 | }, 3223 | { 3224 | "name": "Fabien Potencier", 3225 | "email": "fabien@symfony.com" 3226 | }, 3227 | { 3228 | "name": "Symfony Community", 3229 | "homepage": "https://symfony.com/contributors" 3230 | } 3231 | ], 3232 | "description": "Symfony CssSelector Component", 3233 | "homepage": "https://symfony.com", 3234 | "time": "2016-06-06 11:33:26" 3235 | }, 3236 | { 3237 | "name": "symfony/dom-crawler", 3238 | "version": "v3.0.7", 3239 | "source": { 3240 | "type": "git", 3241 | "url": "https://github.com/symfony/dom-crawler.git", 3242 | "reference": "49b588841225b205700e5122fa01911cabada857" 3243 | }, 3244 | "dist": { 3245 | "type": "zip", 3246 | "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/49b588841225b205700e5122fa01911cabada857", 3247 | "reference": "49b588841225b205700e5122fa01911cabada857", 3248 | "shasum": "" 3249 | }, 3250 | "require": { 3251 | "php": ">=5.5.9", 3252 | "symfony/polyfill-mbstring": "~1.0" 3253 | }, 3254 | "require-dev": { 3255 | "symfony/css-selector": "~2.8|~3.0" 3256 | }, 3257 | "suggest": { 3258 | "symfony/css-selector": "" 3259 | }, 3260 | "type": "library", 3261 | "extra": { 3262 | "branch-alias": { 3263 | "dev-master": "3.0-dev" 3264 | } 3265 | }, 3266 | "autoload": { 3267 | "psr-4": { 3268 | "Symfony\\Component\\DomCrawler\\": "" 3269 | }, 3270 | "exclude-from-classmap": [ 3271 | "/Tests/" 3272 | ] 3273 | }, 3274 | "notification-url": "https://packagist.org/downloads/", 3275 | "license": [ 3276 | "MIT" 3277 | ], 3278 | "authors": [ 3279 | { 3280 | "name": "Fabien Potencier", 3281 | "email": "fabien@symfony.com" 3282 | }, 3283 | { 3284 | "name": "Symfony Community", 3285 | "homepage": "https://symfony.com/contributors" 3286 | } 3287 | ], 3288 | "description": "Symfony DomCrawler Component", 3289 | "homepage": "https://symfony.com", 3290 | "time": "2016-04-12 18:09:53" 3291 | }, 3292 | { 3293 | "name": "symfony/yaml", 3294 | "version": "v3.1.1", 3295 | "source": { 3296 | "type": "git", 3297 | "url": "https://github.com/symfony/yaml.git", 3298 | "reference": "c5a7e7fc273c758b92b85dcb9c46149ccda89623" 3299 | }, 3300 | "dist": { 3301 | "type": "zip", 3302 | "url": "https://api.github.com/repos/symfony/yaml/zipball/c5a7e7fc273c758b92b85dcb9c46149ccda89623", 3303 | "reference": "c5a7e7fc273c758b92b85dcb9c46149ccda89623", 3304 | "shasum": "" 3305 | }, 3306 | "require": { 3307 | "php": ">=5.5.9" 3308 | }, 3309 | "type": "library", 3310 | "extra": { 3311 | "branch-alias": { 3312 | "dev-master": "3.1-dev" 3313 | } 3314 | }, 3315 | "autoload": { 3316 | "psr-4": { 3317 | "Symfony\\Component\\Yaml\\": "" 3318 | }, 3319 | "exclude-from-classmap": [ 3320 | "/Tests/" 3321 | ] 3322 | }, 3323 | "notification-url": "https://packagist.org/downloads/", 3324 | "license": [ 3325 | "MIT" 3326 | ], 3327 | "authors": [ 3328 | { 3329 | "name": "Fabien Potencier", 3330 | "email": "fabien@symfony.com" 3331 | }, 3332 | { 3333 | "name": "Symfony Community", 3334 | "homepage": "https://symfony.com/contributors" 3335 | } 3336 | ], 3337 | "description": "Symfony Yaml Component", 3338 | "homepage": "https://symfony.com", 3339 | "time": "2016-06-14 11:18:07" 3340 | }, 3341 | { 3342 | "name": "webmozart/assert", 3343 | "version": "1.0.2", 3344 | "source": { 3345 | "type": "git", 3346 | "url": "https://github.com/webmozart/assert.git", 3347 | "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde" 3348 | }, 3349 | "dist": { 3350 | "type": "zip", 3351 | "url": "https://api.github.com/repos/webmozart/assert/zipball/30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde", 3352 | "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde", 3353 | "shasum": "" 3354 | }, 3355 | "require": { 3356 | "php": ">=5.3.3" 3357 | }, 3358 | "require-dev": { 3359 | "phpunit/phpunit": "^4.6" 3360 | }, 3361 | "type": "library", 3362 | "extra": { 3363 | "branch-alias": { 3364 | "dev-master": "1.0-dev" 3365 | } 3366 | }, 3367 | "autoload": { 3368 | "psr-4": { 3369 | "Webmozart\\Assert\\": "src/" 3370 | } 3371 | }, 3372 | "notification-url": "https://packagist.org/downloads/", 3373 | "license": [ 3374 | "MIT" 3375 | ], 3376 | "authors": [ 3377 | { 3378 | "name": "Bernhard Schussek", 3379 | "email": "bschussek@gmail.com" 3380 | } 3381 | ], 3382 | "description": "Assertions to validate method input/output with nice error messages.", 3383 | "keywords": [ 3384 | "assert", 3385 | "check", 3386 | "validate" 3387 | ], 3388 | "time": "2015-08-24 13:29:44" 3389 | } 3390 | ], 3391 | "aliases": [], 3392 | "minimum-stability": "stable", 3393 | "stability-flags": { 3394 | "mockery/mockery": 20 3395 | }, 3396 | "prefer-stable": false, 3397 | "prefer-lowest": false, 3398 | "platform": { 3399 | "php": ">=5.6.0" 3400 | }, 3401 | "platform-dev": [] 3402 | } 3403 | --------------------------------------------------------------------------------