├── app ├── Commands │ ├── .gitkeep │ ├── ClearFollowCommand.php │ ├── ClearCacheCommand.php │ ├── AddUserCommand.php │ ├── ListToFollowCommand.php │ ├── TestTwitterCommand.php │ ├── ListFollowedCommand.php │ ├── UnfollowCommand.php │ ├── FollowCommand.php │ └── WorkCommand.php ├── Providers │ ├── AppServiceProvider.php │ └── TwitterServiceProvider.php └── Library │ └── Twitter.php ├── .gitignore ├── .env.example ├── .gitattributes ├── tests ├── TestCase.php ├── Feature │ └── InspiringCommandTest.php └── CreatesApplication.php ├── .editorconfig ├── box.json ├── phpunit.xml.dist ├── LICENSE.md ├── composer.json ├── bootstrap └── app.php ├── chirp ├── config ├── app.php └── commands.php ├── README.md └── composer.lock /app/Commands/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /.idea 3 | /.vscode 4 | /.vagrant 5 | .env 6 | /storage 7 | chirp.log -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | TWITTER_CONSUMER_KEY= 2 | TWITTER_CONSUMER_SECRET= 3 | TWITTER_ACCESS_TOKEN= 4 | TWITTER_ACCESS_SECRET= -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | .travis.yml export-ignore 3 | .styleci.yml export-ignore 4 | .scrutinizer.yml export-ignore 5 | BACKERS.md export-ignore 6 | CONTRIBUTING.md export-ignore 7 | CHANGELOG.md export-ignore 8 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | artisan('inspiring') 17 | ->expectsOutput('Simplicity is the ultimate sophistication.') 18 | ->assertExitCode(0); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | app->singleton(Twitter::class, function ($app) { 19 | \Codebird\Codebird::setConsumerKey(env('TWITTER_CONSUMER_KEY'), env('TWITTER_CONSUMER_SECRET')); 20 | $cb = \Codebird\Codebird::getInstance(); 21 | $cb->setToken(env('TWITTER_ACCESS_TOKEN'), env('TWITTER_ACCESS_SECRET')); 22 | return new Twitter($cb); 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Feature 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | ./app 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/Commands/ClearFollowCommand.php: -------------------------------------------------------------------------------- 1 | info('To-follow list cleared successfully!'); 33 | } 34 | 35 | /** 36 | * Define the command's schedule. 37 | * 38 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 39 | * @return void 40 | */ 41 | public function schedule(Schedule $schedule): void 42 | { 43 | // $schedule->command(static::class)->everyMinute(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Nuno Maduro 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 | -------------------------------------------------------------------------------- /app/Commands/ClearCacheCommand.php: -------------------------------------------------------------------------------- 1 | info('Cached list of followers cleared successfully!'); 34 | } 35 | 36 | /** 37 | * Define the command's schedule. 38 | * 39 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 40 | * @return void 41 | */ 42 | public function schedule(Schedule $schedule): void 43 | { 44 | // $schedule->command(static::class)->everyMinute(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gazugafan/chirp", 3 | "description": "Automatically follow and later unfollow Twitter users", 4 | "keywords": ["twitter", "php", "bot", "follow", "automatic", "automation", "console", "cli"], 5 | "license": "MIT", 6 | "require": { 7 | "php": "^7.1.3", 8 | "jublonet/codebird-php": "^3.1", 9 | "laravel-zero/framework": "5.7.*", 10 | "vlucas/phpdotenv": "^2.5" 11 | }, 12 | "require-dev": { 13 | "mockery/mockery": "^1.0", 14 | "phpunit/phpunit": "^7.3" 15 | }, 16 | "autoload": { 17 | "psr-4": { 18 | "App\\": "app/" 19 | } 20 | }, 21 | "autoload-dev": { 22 | "psr-4": { 23 | "Tests\\": "tests/" 24 | } 25 | }, 26 | "config": { 27 | "preferred-install": "dist", 28 | "sort-packages": true, 29 | "optimize-autoloader": true, 30 | "platform": { 31 | "ext-posix": "0" 32 | } 33 | }, 34 | "scripts": { 35 | "post-create-project-cmd": [ 36 | "@php application app:rename" 37 | ] 38 | }, 39 | "minimum-stability": "dev", 40 | "prefer-stable": true, 41 | "bin": ["chirp"] 42 | } 43 | -------------------------------------------------------------------------------- /app/Commands/AddUserCommand.php: -------------------------------------------------------------------------------- 1 | get_users_followers($this->argument('username')); 35 | $added = $twitter->add_users_to_follow($userIDs); 36 | $this->info($added . ' users added successfully!'); 37 | } 38 | catch(\Exception $e) 39 | { 40 | $this->error($e->getMessage()); 41 | } 42 | } 43 | 44 | /** 45 | * Define the command's schedule. 46 | * 47 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 48 | * @return void 49 | */ 50 | public function schedule(Schedule $schedule): void 51 | { 52 | // $schedule->command(static::class)->everyMinute(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/Commands/ListToFollowCommand.php: -------------------------------------------------------------------------------- 1 | get_users_to_follow(); 35 | if (count($userIDs) > 0) 36 | { 37 | foreach($userIDs as $userID) 38 | $this->line($userID); 39 | } 40 | else 41 | $this->warn("There are no users we will try to follow. Add some using the add:user command."); 42 | } 43 | catch(\Exception $e) 44 | { 45 | $this->error($e->getMessage()); 46 | } 47 | } 48 | 49 | /** 50 | * Define the command's schedule. 51 | * 52 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 53 | * @return void 54 | */ 55 | public function schedule(Schedule $schedule): void 56 | { 57 | // $schedule->command(static::class)->everyMinute(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/Commands/TestTwitterCommand.php: -------------------------------------------------------------------------------- 1 | test_api(); 35 | if (array_key_exists('screen_name', $userInfo) && $userInfo['screen_name'] != '') 36 | { 37 | $this->info('Successfully authenticated as ' . $userInfo['screen_name'] . '!'); 38 | } 39 | else 40 | { 41 | $this->error('You seem to be authenticating, but we can\'t find your screen name. This is unexpected. More info...'); 42 | var_dump($userInfo); 43 | } 44 | } 45 | catch(\Exception $e) 46 | { 47 | $this->error($e->getMessage()); 48 | } 49 | } 50 | 51 | /** 52 | * Define the command's schedule. 53 | * 54 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 55 | * @return void 56 | */ 57 | public function schedule(Schedule $schedule): void 58 | { 59 | // $schedule->command(static::class)->everyMinute(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/Commands/ListFollowedCommand.php: -------------------------------------------------------------------------------- 1 | get_followed_users(); 35 | if (count($users) > 0) 36 | { 37 | foreach($users as $user) 38 | $this->line($user->userID . ' (expires ' . \Carbon\Carbon::createFromTimestamp($user->followed, 'UTC')->addDays(config('app.days_to_wait_for_followback'))->format('l, M d, Y @ h:ia T') . ')'); 39 | } 40 | else 41 | $this->warn("There are no users we might unfollow. Add some using the add:user command."); 42 | } 43 | catch(\Exception $e) 44 | { 45 | $this->error($e->getMessage()); 46 | } 47 | } 48 | 49 | /** 50 | * Define the command's schedule. 51 | * 52 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 53 | * @return void 54 | */ 55 | public function schedule(Schedule $schedule): void 56 | { 57 | // $schedule->command(static::class)->everyMinute(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Console\Kernel::class, 31 | LaravelZero\Framework\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Debug\ExceptionHandler::class, 36 | Illuminate\Foundation\Exceptions\Handler::class 37 | ); 38 | 39 | /* 40 | |-------------------------------------------------------------------------- 41 | | Return The Application 42 | |-------------------------------------------------------------------------- 43 | | 44 | | This script returns the application instance. The instance is given to 45 | | the calling script so we can separate the building of the instances 46 | | from the actual running of the application and sending responses. 47 | | 48 | */ 49 | 50 | return $app; 51 | -------------------------------------------------------------------------------- /chirp: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /app/Commands/UnfollowCommand.php: -------------------------------------------------------------------------------- 1 | get_user_to_unfollow()) 35 | { 36 | //unfollow the user... 37 | $userData = $twitter->unfollow_user($userID); 38 | 39 | //remove the user from our list of users to unfollow... 40 | $twitter->remove_followed_user($userID); 41 | 42 | $this->info('Unfollowed ' . $userData['screen_name'] . '!'); 43 | } 44 | else 45 | $this->warn("There aren't any users to unfollow"); 46 | } 47 | catch(\TwitterRateLimitException $e) 48 | { 49 | $this->error($e->getMessage()); 50 | } 51 | catch(\Exception $e) 52 | { 53 | $this->error($e->getMessage()); 54 | if ($userID) 55 | { 56 | $twitter->remove_followed_user($userID); 57 | $this->error('Removed user #' . $userID . ' from our list of users to unfollow, since unfollowing them doesn\'t seem to be working'); 58 | } 59 | } 60 | } 61 | 62 | /** 63 | * Define the command's schedule. 64 | * 65 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 66 | * @return void 67 | */ 68 | public function schedule(Schedule $schedule): void 69 | { 70 | // $schedule->command(static::class)->everyMinute(); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/Commands/FollowCommand.php: -------------------------------------------------------------------------------- 1 | get_users_to_follow(); 35 | if (count($userIDs) > 0) 36 | { 37 | //follow the user... 38 | $userID = reset($userIDs); 39 | $userData = $twitter->mute_user($userID); 40 | $userData = $twitter->follow_user($userID); 41 | 42 | //remove the user from our list of users to follow... 43 | $twitter->remove_user_to_follow($userID); 44 | 45 | //add the user to our list of followed users (to potentially be unfollowed later)... 46 | $twitter->add_followed_user($userID); 47 | 48 | $this->info('Followed ' . $userData['screen_name'] . '!'); 49 | } 50 | else 51 | $this->warn("There aren't any users waiting to be followed"); 52 | } 53 | catch(\TwitterRateLimitException $e) 54 | { 55 | $this->error($e->getMessage()); 56 | } 57 | catch(\Exception $e) 58 | { 59 | $this->error($e->getMessage()); 60 | if ($userID) 61 | { 62 | $twitter->remove_user_to_follow($userID); 63 | $this->error('Removed user #' . $userID . ' from our list of users to follow, since following them doesn\'t seem to be working'); 64 | } 65 | } 66 | } 67 | 68 | /** 69 | * Define the command's schedule. 70 | * 71 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 72 | * @return void 73 | */ 74 | public function schedule(Schedule $schedule): void 75 | { 76 | // $schedule->command(static::class)->everyMinute(); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | 990, 7 | 8 | //If a user doesn't follow you back after this many days, we'll unfollow them... 9 | 'days_to_wait_for_followback'=>10, 10 | 11 | /* 12 | |-------------------------------------------------------------------------- 13 | | Application Name 14 | |-------------------------------------------------------------------------- 15 | | 16 | | This value is the name of your application. This value is used when the 17 | | framework needs to place the application's name in a notification or 18 | | any other location as required by the application or its packages. 19 | | 20 | */ 21 | 22 | 'name' => 'Chirp', 23 | 24 | /* 25 | |-------------------------------------------------------------------------- 26 | | Application Version 27 | |-------------------------------------------------------------------------- 28 | | 29 | | This value determines the "version" your application is currently running 30 | | in. You may want to follow the "Semantic Versioning" - Given a version 31 | | number MAJOR.MINOR.PATCH when an update happens: https://semver.org. 32 | | 33 | */ 34 | 35 | 'version' => "0.1.0", 36 | 37 | /* 38 | |-------------------------------------------------------------------------- 39 | | Application Environment 40 | |-------------------------------------------------------------------------- 41 | | 42 | | This value determines the "environment" your application is currently 43 | | running in. This may determine how you prefer to configure various 44 | | services your application utilizes. Should be true in production. 45 | | 46 | */ 47 | 48 | 'production' => env('PRODUCTION', true), 49 | 50 | /* 51 | |-------------------------------------------------------------------------- 52 | | Autoloaded Service Providers 53 | |-------------------------------------------------------------------------- 54 | | 55 | | The service providers listed here will be automatically loaded on the 56 | | request to your application. Feel free to add your own services to 57 | | this array to grant expanded functionality to your applications. 58 | | 59 | */ 60 | 61 | 'providers' => [ 62 | App\Providers\AppServiceProvider::class, 63 | App\Providers\TwitterServiceProvider::class, 64 | ], 65 | 66 | ]; 67 | -------------------------------------------------------------------------------- /config/commands.php: -------------------------------------------------------------------------------- 1 | NunoMaduro\LaravelConsoleSummary\SummaryCommand::class, 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Commands Paths 21 | |-------------------------------------------------------------------------- 22 | | 23 | | This value determines the "paths" that should be loaded by the console's 24 | | kernel. Foreach "path" present on the array provided below the kernel 25 | | will extract all "Illuminate\Console\Command" based class commands. 26 | | 27 | */ 28 | 29 | 'paths' => [app_path('Commands')], 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Added Commands 34 | |-------------------------------------------------------------------------- 35 | | 36 | | You may want to include a single command class without having to load an 37 | | entire folder. Here you can specify which commands should be added to 38 | | your list of commands. The console's kernel will try to load them. 39 | | 40 | */ 41 | 42 | 'add' => [ 43 | // .. 44 | ], 45 | 46 | /* 47 | |-------------------------------------------------------------------------- 48 | | Hidden Commands 49 | |-------------------------------------------------------------------------- 50 | | 51 | | Your application commands will always be visible on the application list 52 | | of commands. But you can still make them "hidden" specifying an array 53 | | of commands below. All "hidden" commands can still be run/executed. 54 | | 55 | */ 56 | 57 | 'hidden' => [ 58 | NunoMaduro\LaravelConsoleSummary\SummaryCommand::class, 59 | Symfony\Component\Console\Command\HelpCommand::class, 60 | Illuminate\Console\Scheduling\ScheduleRunCommand::class, 61 | Illuminate\Console\Scheduling\ScheduleFinishCommand::class, 62 | Illuminate\Foundation\Console\VendorPublishCommand::class, 63 | ], 64 | 65 | /* 66 | |-------------------------------------------------------------------------- 67 | | Removed Commands 68 | |-------------------------------------------------------------------------- 69 | | 70 | | Do you have a service provider that loads a list of commands that 71 | | you don't need? No problem. Laravel Zero allows you to specify 72 | | below a list of commands that you don't to see in your app. 73 | | 74 | */ 75 | 76 | 'remove' => [ 77 | // .. 78 | ], 79 | 80 | ]; 81 | -------------------------------------------------------------------------------- /app/Commands/WorkCommand.php: -------------------------------------------------------------------------------- 1 | argument('count') * 1); $x++) 35 | { 36 | sleep(rand(0, $this->argument('fuzz') * 1)); 37 | 38 | $this->line(\Carbon\Carbon::now()->format('Y-m-d H:i:s T') . ': Starting work...'); 39 | 40 | try 41 | { 42 | $this->call('process:follow'); 43 | $this->call('process:unfollow'); 44 | } 45 | catch(\Exception $e) 46 | { 47 | $this->error($e->getMessage()); 48 | } 49 | 50 | $this->line(\Carbon\Carbon::now()->format('Y-m-d H:i:s T') . ': Finished work!'); 51 | } 52 | } 53 | 54 | /** 55 | * Define the command's schedule. 56 | * 57 | * @param \Illuminate\Console\Scheduling\Schedule $schedule 58 | * @return void 59 | */ 60 | public function schedule(Schedule $schedule): void 61 | { 62 | /* 63 | For information on how to modify the schedule, see... 64 | https://laravel.com/docs/5.7/scheduling#defining-schedules 65 | 66 | If you do modify the schedule, be sure to update the '250' below 67 | as well. We'll wait a random number of seconds up to this number 68 | before attempting each follow/unfollow (to add some fuzziness 69 | to the schedule). 70 | 71 | For example, you could schedule this to run up to every minute 72 | and set the fuzziness to about 50 seconds. Just make sure the 73 | fuzziness is less than the scheduled run time, minus a few seconds 74 | to account for how long it might take to access the Twitter API. 75 | Otherwise, a run could end up overlapping into the next run. If 76 | this happens, nothing will blow up, but the next run will simply 77 | be skipped. 78 | 79 | To make it go even faster, schedule it to run every minute, but 80 | set the count to something higher than 1, so that multiple 81 | follows/unfollows are attempted every minute. 82 | 83 | No matter what, we'll always proactively respect Twitter's 84 | rate limits. 85 | */ 86 | $schedule->command(static::class, ['250', '1']) 87 | ->withoutOverlapping() 88 | ->appendOutputTo('chirp.log') 89 | ->everyFiveMinutes() 90 | ->weekdays() 91 | ->timezone('US/Central') 92 | ->between('10:00', '16:00') 93 | ; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chirp 2 | 3 | A command-line tool to automatically follow Twitter users and later unfollow them if they don't follow you back. Use it to easily grow your Twitter audience. 4 | 5 | ## Requirements 6 | * PHP 7.1.3+ 7 | * Composer 8 | 9 | ## Installation 10 | * Clone this repository on your server 11 | * Run `composer install` 12 | * Run `php chirp` to test that it's working and see a list of commands 13 | * Add the following cron task to run every minute (the actual schedule is managed in the app)... 14 | ``` 15 | * * * * * php /INSTALL/PATH/chirp schedule:run >> /dev/null 2>&1 16 | ``` 17 | 18 | ## Setup 19 | * You'll need to have a Twitter app created, along with a personal access token to authenticate to the Twitter API. You might be able to do this from [the Twitter app manager](https://apps.twitter.com/), but this is being deprecated soon. If you can't do it there, you'll probably need to [apply for a developer account](https://developer.twitter.com). 20 | * Rename `.env.example` to `.env` 21 | * Open `.env` and fill in the OAuth details from the Twitter app you created. You'll need the app's consumer key and secret, along with a personal access token and secret. 22 | * Run `php chirp test:twitter` to test that we can authenticate to the Twitter API. 23 | 24 | ## Usage 25 | Run `php chirp add:user ` to add the followers of the specified user to a locally stored list. Do this as many times as you'd like to grow this list of users. Duplicates are automatically removed, along with users you already follow. 26 | 27 | After this, chirp will periodically follow and mute a random user from this list. Muted users don't appear in your timeline, but otherwise act as normal follows. The hope is that some of these users will follow you back soon! If they do, consider unmuting them if you'd like to see their tweets. 28 | 29 | Chirp keeps track of who it's followed for you, along with when it followed them. If one of these users hasn't followed you back after 10 days, chirp will eventually unfollow them. 30 | 31 | ## Rate Limits 32 | Out of the box, chirp is not scheduled to run fast enough to come close to hitting any rate limits. However, you can modify this schedule to run as fast as you'd like. In this case, chirp attempts to proactively respects Twitter's rate limits. 33 | 34 | Some of Twitter's API methods always respond with rate limit data--telling us how many requests you have remaining and when you'll get more. For these API methods, chirp remembers the rate-limit information and will not attempt an API request if you have no more attempts remaining. Chirp does NOT simply make API requests until the API starts responding with rate limit errors. It knows to stop ahead of time, and it knows when it can start again. 35 | 36 | There are other Twitter API methods that do NOT respond with rate limit data. These include following users, muting users, and unfollowing users. Twitter is a little ambiguous about the rate limits on these, but from what I can tell they each have their own 1000 daily request limit. By default, chirp is configured to proactively limit these requests to 990 per day to be sure to stay under. You can adjust this in `config/app.php`. 37 | 38 | In any case, if Twitter ever responds with a rate limit error, chirp will hold off on that type of request for 24 hours just to be safe. 39 | 40 | ## Schedule 41 | By default, chirp is scheduled to run once every 5 minutes on weekdays between 10am-4pm CST. To make things a little fuzzy, chirp will wait a random number of seconds (up to 250, or about 4 minutes) everytime it runs. Each time chirp runs, it will... 42 | 43 | 1) Attempt to follow 1 random user from your list of users to follow, and 44 | 2) Attempt to unfollow 1 random user from the list of users chirp followed over 10 days ago who have not followed you back. (you can change how many days to wait for a follow back in `config/app.php`) 45 | 46 | You can modify this schedule in `app/Commands/WorkCommand.php`. To make it go really fast, you can have each run perform multiple follows/unfollows. See the end of the file for more information. 47 | 48 | ## Log 49 | You can review the log of what chirp did when it was running on schedule in the `chirp.log` file. 50 | 51 | ## Other Commands 52 | The main command you'll use is `add:user`, which adds the followers of a user to the list of users chirp will attempt to follow. If you'd like, you can review this list using the `list:to_follow` command (though it lists user IDs--not screen names). 53 | 54 | Once you've setup the cron, chirp will run the `process:work` command on schedule, which attempts to follow 1 user and unfollow 1 user. 55 | 56 | You can also manually follow a user from the list of users you want to follow using the `process:follow` command. Likewise, you can manually unfollow a user who hasn't followed you back using the `process:unfollow` command. 57 | 58 | To see all of the available commands, run `php chirp`. To get more help on a specific command, run `php chirp help `. For example: `php chirp help add:user` will tell you how to use the `add:user` command. 59 | 60 | ## Storage 61 | Chirp just uses simple local file storage to remember who it has followed and such--no database server required! These files are located in the `storage` folder. -------------------------------------------------------------------------------- /app/Library/Twitter.php: -------------------------------------------------------------------------------- 1 | codebird = $codebird; 15 | } 16 | 17 | /** 18 | * Removes spaces and @ symbols from a username and returns it in lowercase 19 | */ 20 | private function clean_username($username) 21 | { 22 | return trim(strtolower($username), "@ "); 23 | } 24 | 25 | /** 26 | * Gets all of the stored user IDs that you want to follow, randomized. 27 | * Removes userIDs that you already follow. 28 | * Duplicates are removed 29 | * 30 | * @return string[] An array of unique user IDs 31 | */ 32 | public function get_users_to_follow() 33 | { 34 | if (\Storage::exists('to_follow')) 35 | { 36 | $existingUserIDs = $this->get_following(); 37 | $userIDs = explode("\n", \Storage::read('to_follow')); 38 | $results = array(); 39 | foreach($userIDs as $userID) 40 | { 41 | if ($userID && !in_array($userID, $existingUserIDs)) 42 | $results[] = $userID; 43 | } 44 | shuffle($results); 45 | return array_unique($results); 46 | } 47 | 48 | return array(); 49 | } 50 | 51 | /** 52 | * Adds new userIDs to be followed. Returns the number of user IDs added. 53 | * Duplicates are removed 54 | * 55 | * @param string[] $newUserIDs An array of user IDs to add 56 | * @return int The number of users added (taking into account duplicates that might have already existed) 57 | */ 58 | public function add_users_to_follow($newUserIDs) 59 | { 60 | $userIDs = $this->get_users_to_follow(); 61 | $originalCount = count($userIDs); 62 | foreach($newUserIDs as $newUserID) 63 | { 64 | if ($newUserID) 65 | $userIDs[] = $newUserID; 66 | } 67 | 68 | if (\Storage::exists('to_follow')) 69 | \Storage::delete('to_follow'); 70 | 71 | $userIDs = array_unique($userIDs); 72 | \Storage::write('to_follow', implode("\n", $userIDs)); 73 | $userIDs = $this->get_users_to_follow(); 74 | 75 | return count($userIDs) - $originalCount; 76 | } 77 | 78 | /** 79 | * Removes a userID to be followed. 80 | * 81 | * @param int $removeUserID The user ID to remove 82 | */ 83 | public function remove_user_to_follow($removeUserID) 84 | { 85 | $userIDs = $this->get_users_to_follow(); 86 | 87 | $newUserIDs = []; 88 | 89 | foreach($userIDs as $userID) 90 | { 91 | if ($userID != $removeUserID) 92 | $newUserIDs[] = $userID; 93 | } 94 | 95 | if (\Storage::exists('to_follow')) 96 | \Storage::delete('to_follow'); 97 | 98 | $newUserIDs = array_unique($newUserIDs); 99 | \Storage::write('to_follow', implode("\n", $newUserIDs)); 100 | } 101 | 102 | /** 103 | * Gets all of the users that have been followed by this tool (stored locally) 104 | * Results are returned in random order, with duplicates removed 105 | * Each user will be an object with a userID and timestamp 106 | * 107 | * @return [] An array of users 108 | */ 109 | public function get_followed_users() 110 | { 111 | if (\Storage::exists('followed')) 112 | { 113 | $users = json_decode(\Storage::read('followed')); 114 | $uniqueUsers = []; 115 | foreach($users as $user) 116 | { 117 | $alreadyAdded = false; 118 | foreach($uniqueUsers as $uniqueUser) 119 | { 120 | if ($uniqueUser->userID == $user->userID) 121 | { 122 | $alreadyAdded = true; 123 | break; 124 | } 125 | } 126 | 127 | if (!$alreadyAdded) 128 | $uniqueUsers[] = $user; 129 | } 130 | 131 | shuffle($uniqueUsers); 132 | return $uniqueUsers; 133 | } 134 | 135 | return array(); 136 | } 137 | 138 | /** 139 | * Adds a new userID that has been followed. 140 | * Also automatically logs the date of the follow. 141 | * 142 | * @param int $newUserID The user ID to add 143 | */ 144 | public function add_followed_user($newUserID) 145 | { 146 | $users = $this->get_followed_users(); 147 | $users[] = [ 148 | 'userID'=>$newUserID, 149 | 'followed'=>Carbon::now('UTC')->timestamp, 150 | ]; 151 | 152 | if (\Storage::exists('followed')) 153 | \Storage::delete('followed'); 154 | 155 | \Storage::write('followed', json_encode($users)); 156 | } 157 | 158 | /** 159 | * Removes a user from our list of users that we have followed 160 | * 161 | * @param int $removeUserID The user ID to remove 162 | */ 163 | public function remove_followed_user($removeUserID) 164 | { 165 | $users = $this->get_followed_users(); 166 | 167 | $newUsers = []; 168 | 169 | foreach($users as $user) 170 | { 171 | if ($user->userID != $removeUserID) 172 | $newUsers[] = $user; 173 | } 174 | 175 | if (\Storage::exists('followed')) 176 | \Storage::delete('followed'); 177 | 178 | \Storage::write('followed', json_encode($newUsers)); 179 | } 180 | 181 | /** 182 | * Returns the userID of a random user that we have followed, but has not followed 183 | * us back within a set amount of days. 184 | * If there is no such user, null is returned 185 | */ 186 | public function get_user_to_unfollow() 187 | { 188 | $followers = $this->get_followers(); 189 | 190 | //go through each user that we followed... 191 | $followed = $this->get_followed_users(); 192 | foreach($followed as $user) 193 | { 194 | //if we followed this user over X days ago... 195 | if (Carbon::now('UTC')->subDays(config('app.days_to_wait_for_followback'))->timestamp > $user->followed) 196 | { 197 | //check to see if the user is following us... 198 | if (!in_array($user->userID, $followers)) 199 | { 200 | return $user->userID; 201 | } 202 | } 203 | } 204 | 205 | return null; 206 | } 207 | 208 | /** 209 | * Uses the Twitter API to get the userIDs of the users that follow us. 210 | * The results are cached locally, and only retrieved from the API once per day. 211 | * 212 | * @return string[] and Array of user IDs 213 | */ 214 | public function get_followers() 215 | { 216 | if (\Storage::exists('followers')) 217 | { 218 | $cache = json_decode(\Storage::read('followers')); 219 | if (Carbon::now('UTC')->subDay()->timestamp < $cache->cached) 220 | { 221 | return $cache->followers; 222 | } 223 | 224 | \Storage::delete('followers'); 225 | } 226 | 227 | $followers = $this->get_users_followers(); 228 | $cache = [ 229 | 'followers'=>$followers, 230 | 'cached'=>Carbon::now('UTC')->timestamp, 231 | ]; 232 | 233 | \Storage::write('followers', json_encode($cache)); 234 | 235 | return $followers; 236 | } 237 | 238 | /** 239 | * Uses the Twitter API to get the userIDs of the users that you follow. 240 | * The results are cached locally, and only retrieved from the API once per day. 241 | * 242 | * @return string[] and Array of user IDs 243 | */ 244 | public function get_following() 245 | { 246 | if (\Storage::exists('following')) 247 | { 248 | $cache = json_decode(\Storage::read('following')); 249 | if (Carbon::now('UTC')->subDay()->timestamp < $cache->cached) 250 | { 251 | return $cache->following; 252 | } 253 | 254 | \Storage::delete('following'); 255 | } 256 | 257 | $following = $this->get_users_following(); 258 | $cache = [ 259 | 'following'=>$following, 260 | 'cached'=>Carbon::now('UTC')->timestamp, 261 | ]; 262 | 263 | \Storage::write('following', json_encode($cache)); 264 | 265 | return $following; 266 | } 267 | 268 | /** 269 | * Uses the Twitter API to get the userIDs of the users that you (or the specified user) follow. 270 | * 271 | * @return string[] an Array of user IDs 272 | */ 273 | public function get_users_following($username = null) 274 | { 275 | $username = $this->clean_username($username); 276 | 277 | //get all following IDs, in pages... 278 | $returnArray = []; 279 | $cursor = false; 280 | do 281 | { 282 | $params = []; 283 | if ($username) 284 | $params['screen_name'] = $username; 285 | 286 | if ($cursor) 287 | $params['cursor'] = $cursor; 288 | 289 | $this->respect_rate_limit('friends_ids'); 290 | $response = (array)$this->codebird->friends_ids($params); 291 | $this->update_rate_limit('friends_ids', $response); 292 | 293 | //add this page of IDs... 294 | foreach($response['ids'] as $id) 295 | { 296 | if ($id) 297 | $returnArray[] = (string)$id; 298 | } 299 | 300 | $cursor = $response['next_cursor_str']; 301 | 302 | } while($cursor); 303 | 304 | return array_unique($returnArray); 305 | } 306 | 307 | /** 308 | * Uses the Twitter API to get the userIDs of the users that follow the specified user. 309 | * 310 | * @param string $username The user whose followers to get 311 | * @return string[] an Array of user IDs 312 | */ 313 | public function get_users_followers($username = null) 314 | { 315 | $username = $this->clean_username($username); 316 | 317 | //get all follower IDs, in pages... 318 | $returnArray = []; 319 | $cursor = false; 320 | do 321 | { 322 | $params = []; 323 | if ($username) 324 | $params['screen_name'] = $username; 325 | 326 | if ($cursor) 327 | $params['cursor'] = $cursor; 328 | 329 | $this->respect_rate_limit('followers_ids'); 330 | $response = (array)$this->codebird->followers_ids($params); 331 | $this->update_rate_limit('followers_ids', $response); 332 | 333 | //add this page of IDs... 334 | foreach($response['ids'] as $id) 335 | { 336 | if ($id) 337 | $returnArray[] = (string)$id; 338 | } 339 | 340 | $cursor = $response['next_cursor_str']; 341 | 342 | } while($cursor); 343 | 344 | return array_unique($returnArray); 345 | } 346 | 347 | /** 348 | * Uses the Twitter API to follow a user 349 | * 350 | * @param int $userID The ID of the user to follow 351 | * @return string[] The user that was just followed 352 | */ 353 | public function follow_user($userID) 354 | { 355 | if (!$userID) 356 | throw new \Exception('You must specify the user ID to follow'); 357 | 358 | $params = [ 359 | 'user_id'=>$userID, 360 | 'follow'=>false, 361 | ]; 362 | 363 | $this->respect_rate_limit('friendships_create'); 364 | $response = (array)$this->codebird->friendships_create($params); 365 | $this->update_rate_limit('friendships_create', $response); 366 | 367 | return $response; 368 | } 369 | 370 | /** 371 | * Uses the Twitter API to mute a user 372 | * 373 | * @param int $userID The ID of the user to mute 374 | * @return string[] The user that was just followed 375 | */ 376 | public function mute_user($userID) 377 | { 378 | if (!$userID) 379 | throw new \Exception('You must specify the user ID to mute'); 380 | 381 | $params = [ 382 | 'user_id'=>$userID, 383 | 'follow'=>false, 384 | ]; 385 | 386 | $this->respect_rate_limit('mutes_users_create'); 387 | $response = (array)$this->codebird->mutes_users_create($params); 388 | $this->update_rate_limit('mutes_users_create', $response); 389 | 390 | return $response; 391 | } 392 | 393 | /** 394 | * Uses the Twitter API to unfollow a user 395 | * 396 | * @param int $userID The ID of the user to unfollow 397 | * @return string[] The user that was just unfollowed 398 | */ 399 | public function unfollow_user($userID) 400 | { 401 | if (!$userID) 402 | throw new \Exception('You must specify the user ID to unfollow'); 403 | 404 | $params = [ 405 | 'user_id'=>$userID, 406 | ]; 407 | 408 | $this->respect_rate_limit('friendships_destroy'); 409 | $response = (array)$this->codebird->friendships_destroy($params); 410 | $this->update_rate_limit('friendships_destroy', $response); 411 | 412 | return $response; 413 | } 414 | 415 | /** 416 | * Tests to see if you can authenticate to the Twitter API. 417 | * Returns user's info if successful. throws an error if you can't 418 | */ 419 | public function test_api() 420 | { 421 | $response = (array)$this->codebird->account_settings(); 422 | 423 | if ($response['httpstatus'] == 200) 424 | { 425 | return $response; 426 | } 427 | elseif (array_key_exists('errors', $response)) 428 | { 429 | $errorMessages = ''; 430 | foreach($response['errors'] as $error) 431 | $errorMessages .= '; ' . $error->message; 432 | 433 | throw new \Exception('Could not authenticate. Twitter responded with: ' . trim($errorMessages, '; ')); 434 | } 435 | elseif (array_key_exists('error', $response)) 436 | throw new \Exception('Could not authenticate. Twitter responded with: ' . $response['error']); 437 | else 438 | throw new \Exception('Could not authenticate. Twitter didn\'t response with any more information about the problem.'); 439 | } 440 | 441 | /** 442 | * Checks to see if we previously exhausted our rate limit for the specified method. If so, we just throw an error. 443 | * We'll automatically clear an exhausted rate limit when the exhausted period has expired. 444 | * Call this before calling the Twitter API to make sure we don't ever go over any of their rate limits. 445 | */ 446 | public function respect_rate_limit($method) 447 | { 448 | if (\Storage::exists('rate_' . $method)) 449 | { 450 | $rateInfo = \Storage::read('rate_' . $method); 451 | if ($rateInfo) 452 | { 453 | $rateInfo = (array)json_decode($rateInfo); 454 | if (array_key_exists('remaining', $rateInfo)) 455 | { 456 | if (((int)$rateInfo['remaining']) <= 0) 457 | { 458 | $currentTimestamp = Carbon::now('UTC')->timestamp; 459 | $resetTimestamp = Carbon::createFromTimestamp($rateInfo['reset'], 'UTC')->timestamp; 460 | 461 | if ($currentTimestamp <= $resetTimestamp) 462 | throw new TwitterRateLimitException('Respecting rate limit on the ' . $method . ' method. This will clear at ' . Carbon::createFromTimestamp($rateInfo['reset'], 'UTC')->format('l, M d, Y @ h:ia T')); 463 | } 464 | } 465 | } 466 | } 467 | } 468 | 469 | /** 470 | * Takes a response from the twitter API and updates our local rate limit info. 471 | * Call this immediately after calling a Twitter API method to make sure the response was OK, and to 472 | * update our local rate limit info so we can respect it before calling the same API method next time. 473 | * 474 | * @param string $method The name of the twitter API method that was called 475 | * @param array $response The response we got from calling this API method 476 | * @param boolean $validate If true, we'll throw an appropriate error if the response wasn't a 200 OK. 477 | */ 478 | public function update_rate_limit($method, $response, $validate = true) 479 | { 480 | switch($method) 481 | { 482 | case 'friendships_create': 483 | case 'mutes_users_create': 484 | case 'friendships_destroy': 485 | if (\Storage::exists('rate_' . $method)) 486 | { 487 | $rateInfo = (array)json_decode(\Storage::read('rate_' . $method)); 488 | $currentTimestamp = Carbon::now('UTC')->timestamp; 489 | $resetTimestamp = Carbon::createFromTimestamp($rateInfo['reset'], 'UTC')->timestamp; 490 | 491 | if ($currentTimestamp > $resetTimestamp) 492 | $rateInfo['remaining'] = config('app.daily_follow_limit'); 493 | else 494 | $rateInfo['remaining'] = ((int)$rateInfo['remaining'] - 1); 495 | 496 | if ((int)$rateInfo['remaining'] < 0) 497 | $rateInfo['remaining'] = '0'; 498 | 499 | \Storage::delete('rate_' . $method); 500 | } 501 | else 502 | { 503 | $rateInfo = [ 504 | 'remaining'=>(int)config('app.daily_follow_limit'), 505 | ]; 506 | } 507 | 508 | if ($response['httpstatus'] == 400 || $response['httpstatus'] == 429) 509 | $rateInfo['remaining'] = '0'; 510 | 511 | $rateInfo['reset'] = Carbon::today('UTC')->addDay()->timestamp; 512 | 513 | \Storage::write('rate_' . $method, json_encode($rateInfo)); 514 | break; 515 | 516 | default: 517 | if (\Storage::exists('rate_' . $method)) 518 | \Storage::delete('rate_' . $method); 519 | 520 | if (array_key_exists('rate', $response) && $response['rate'] != null) 521 | { 522 | \Storage::write('rate_' . $method, json_encode($response['rate'])); 523 | } 524 | else 525 | { 526 | //if for some reason we didn't get rate info in the response, lets just set a 24-hour delay to be safe... 527 | \Storage::write('rate_' . $method, json_encode([ 528 | 'limit'=>'15', 529 | 'remaining'=>'0', 530 | 'reset'=>(string)Carbon::now('UTC')->addDay()->timestamp, 531 | ])); 532 | } 533 | } 534 | 535 | //if requested, make sure this is a good response from twitter and throw an error if it wasn't... 536 | if ($validate) 537 | { 538 | if ($response['httpstatus'] == 200) 539 | { 540 | return; 541 | } 542 | elseif (array_key_exists('errors', $response)) 543 | { 544 | $errorMessages = ''; 545 | foreach($response['errors'] as $error) 546 | $errorMessages .= '; ' . $error->message; 547 | 548 | throw new \Exception('A call to the ' . $method . ' twitter API method returned with the following errors: ' . trim($errorMessages, '; ')); 549 | } 550 | elseif (array_key_exists('error', $response)) 551 | throw new \Exception('A call to the ' . $method . ' twitter API method returned with the following error: ' . $response['error']); 552 | else 553 | throw new \Exception('A call to the ' . $method . ' twitter API method returned with an unexplained error.'); 554 | } 555 | } 556 | } -------------------------------------------------------------------------------- /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#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "2ea13ce30d38e5e2bf4254ef1a9a59af", 8 | "packages": [ 9 | { 10 | "name": "beberlei/assert", 11 | "version": "v2.9.6", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/beberlei/assert.git", 15 | "reference": "ec9e4cf0b63890edce844ee3922e2b95a526e936" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/beberlei/assert/zipball/ec9e4cf0b63890edce844ee3922e2b95a526e936", 20 | "reference": "ec9e4cf0b63890edce844ee3922e2b95a526e936", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-mbstring": "*", 25 | "php": ">=5.3" 26 | }, 27 | "require-dev": { 28 | "friendsofphp/php-cs-fixer": "^2.1.1", 29 | "phpunit/phpunit": "^4.8.35|^5.7" 30 | }, 31 | "type": "library", 32 | "autoload": { 33 | "psr-4": { 34 | "Assert\\": "lib/Assert" 35 | }, 36 | "files": [ 37 | "lib/Assert/functions.php" 38 | ] 39 | }, 40 | "notification-url": "https://packagist.org/downloads/", 41 | "license": [ 42 | "BSD-2-Clause" 43 | ], 44 | "authors": [ 45 | { 46 | "name": "Benjamin Eberlei", 47 | "email": "kontakt@beberlei.de", 48 | "role": "Lead Developer" 49 | }, 50 | { 51 | "name": "Richard Quadling", 52 | "email": "rquadling@gmail.com", 53 | "role": "Collaborator" 54 | } 55 | ], 56 | "description": "Thin assertion library for input validation in business models.", 57 | "keywords": [ 58 | "assert", 59 | "assertion", 60 | "validation" 61 | ], 62 | "time": "2018-06-11T17:15:25+00:00" 63 | }, 64 | { 65 | "name": "composer/installers", 66 | "version": "v1.6.0", 67 | "source": { 68 | "type": "git", 69 | "url": "https://github.com/composer/installers.git", 70 | "reference": "cfcca6b1b60bc4974324efb5783c13dca6932b5b" 71 | }, 72 | "dist": { 73 | "type": "zip", 74 | "url": "https://api.github.com/repos/composer/installers/zipball/cfcca6b1b60bc4974324efb5783c13dca6932b5b", 75 | "reference": "cfcca6b1b60bc4974324efb5783c13dca6932b5b", 76 | "shasum": "" 77 | }, 78 | "require": { 79 | "composer-plugin-api": "^1.0" 80 | }, 81 | "replace": { 82 | "roundcube/plugin-installer": "*", 83 | "shama/baton": "*" 84 | }, 85 | "require-dev": { 86 | "composer/composer": "1.0.*@dev", 87 | "phpunit/phpunit": "^4.8.36" 88 | }, 89 | "type": "composer-plugin", 90 | "extra": { 91 | "class": "Composer\\Installers\\Plugin", 92 | "branch-alias": { 93 | "dev-master": "1.0-dev" 94 | } 95 | }, 96 | "autoload": { 97 | "psr-4": { 98 | "Composer\\Installers\\": "src/Composer/Installers" 99 | } 100 | }, 101 | "notification-url": "https://packagist.org/downloads/", 102 | "license": [ 103 | "MIT" 104 | ], 105 | "authors": [ 106 | { 107 | "name": "Kyle Robinson Young", 108 | "email": "kyle@dontkry.com", 109 | "homepage": "https://github.com/shama" 110 | } 111 | ], 112 | "description": "A multi-framework Composer library installer", 113 | "homepage": "https://composer.github.io/installers/", 114 | "keywords": [ 115 | "Craft", 116 | "Dolibarr", 117 | "Eliasis", 118 | "Hurad", 119 | "ImageCMS", 120 | "Kanboard", 121 | "Lan Management System", 122 | "MODX Evo", 123 | "Mautic", 124 | "Maya", 125 | "OXID", 126 | "Plentymarkets", 127 | "Porto", 128 | "RadPHP", 129 | "SMF", 130 | "Thelia", 131 | "WolfCMS", 132 | "agl", 133 | "aimeos", 134 | "annotatecms", 135 | "attogram", 136 | "bitrix", 137 | "cakephp", 138 | "chef", 139 | "cockpit", 140 | "codeigniter", 141 | "concrete5", 142 | "croogo", 143 | "dokuwiki", 144 | "drupal", 145 | "eZ Platform", 146 | "elgg", 147 | "expressionengine", 148 | "fuelphp", 149 | "grav", 150 | "installer", 151 | "itop", 152 | "joomla", 153 | "kohana", 154 | "laravel", 155 | "lavalite", 156 | "lithium", 157 | "magento", 158 | "majima", 159 | "mako", 160 | "mediawiki", 161 | "modulework", 162 | "modx", 163 | "moodle", 164 | "osclass", 165 | "phpbb", 166 | "piwik", 167 | "ppi", 168 | "puppet", 169 | "pxcms", 170 | "reindex", 171 | "roundcube", 172 | "shopware", 173 | "silverstripe", 174 | "sydes", 175 | "symfony", 176 | "typo3", 177 | "wordpress", 178 | "yawik", 179 | "zend", 180 | "zikula" 181 | ], 182 | "time": "2018-08-27T06:10:37+00:00" 183 | }, 184 | { 185 | "name": "doctrine/inflector", 186 | "version": "v1.3.0", 187 | "source": { 188 | "type": "git", 189 | "url": "https://github.com/doctrine/inflector.git", 190 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a" 191 | }, 192 | "dist": { 193 | "type": "zip", 194 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", 195 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a", 196 | "shasum": "" 197 | }, 198 | "require": { 199 | "php": "^7.1" 200 | }, 201 | "require-dev": { 202 | "phpunit/phpunit": "^6.2" 203 | }, 204 | "type": "library", 205 | "extra": { 206 | "branch-alias": { 207 | "dev-master": "1.3.x-dev" 208 | } 209 | }, 210 | "autoload": { 211 | "psr-4": { 212 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 213 | } 214 | }, 215 | "notification-url": "https://packagist.org/downloads/", 216 | "license": [ 217 | "MIT" 218 | ], 219 | "authors": [ 220 | { 221 | "name": "Roman Borschel", 222 | "email": "roman@code-factory.org" 223 | }, 224 | { 225 | "name": "Benjamin Eberlei", 226 | "email": "kontakt@beberlei.de" 227 | }, 228 | { 229 | "name": "Guilherme Blanco", 230 | "email": "guilhermeblanco@gmail.com" 231 | }, 232 | { 233 | "name": "Jonathan Wage", 234 | "email": "jonwage@gmail.com" 235 | }, 236 | { 237 | "name": "Johannes Schmitt", 238 | "email": "schmittjoh@gmail.com" 239 | } 240 | ], 241 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 242 | "homepage": "http://www.doctrine-project.org", 243 | "keywords": [ 244 | "inflection", 245 | "pluralize", 246 | "singularize", 247 | "string" 248 | ], 249 | "time": "2018-01-09T20:05:19+00:00" 250 | }, 251 | { 252 | "name": "dragonmantank/cron-expression", 253 | "version": "v2.2.0", 254 | "source": { 255 | "type": "git", 256 | "url": "https://github.com/dragonmantank/cron-expression.git", 257 | "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5" 258 | }, 259 | "dist": { 260 | "type": "zip", 261 | "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/92a2c3768d50e21a1f26a53cb795ce72806266c5", 262 | "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5", 263 | "shasum": "" 264 | }, 265 | "require": { 266 | "php": ">=7.0.0" 267 | }, 268 | "require-dev": { 269 | "phpunit/phpunit": "~6.4" 270 | }, 271 | "type": "library", 272 | "autoload": { 273 | "psr-4": { 274 | "Cron\\": "src/Cron/" 275 | } 276 | }, 277 | "notification-url": "https://packagist.org/downloads/", 278 | "license": [ 279 | "MIT" 280 | ], 281 | "authors": [ 282 | { 283 | "name": "Michael Dowling", 284 | "email": "mtdowling@gmail.com", 285 | "homepage": "https://github.com/mtdowling" 286 | }, 287 | { 288 | "name": "Chris Tankersley", 289 | "email": "chris@ctankersley.com", 290 | "homepage": "https://github.com/dragonmantank" 291 | } 292 | ], 293 | "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", 294 | "keywords": [ 295 | "cron", 296 | "schedule" 297 | ], 298 | "time": "2018-06-06T03:12:17+00:00" 299 | }, 300 | { 301 | "name": "filp/whoops", 302 | "version": "2.2.1", 303 | "source": { 304 | "type": "git", 305 | "url": "https://github.com/filp/whoops.git", 306 | "reference": "e79cd403fb77fc8963a99ecc30e80ddd885b3311" 307 | }, 308 | "dist": { 309 | "type": "zip", 310 | "url": "https://api.github.com/repos/filp/whoops/zipball/e79cd403fb77fc8963a99ecc30e80ddd885b3311", 311 | "reference": "e79cd403fb77fc8963a99ecc30e80ddd885b3311", 312 | "shasum": "" 313 | }, 314 | "require": { 315 | "php": "^5.5.9 || ^7.0", 316 | "psr/log": "^1.0.1" 317 | }, 318 | "require-dev": { 319 | "mockery/mockery": "^0.9 || ^1.0", 320 | "phpunit/phpunit": "^4.8.35 || ^5.7", 321 | "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0" 322 | }, 323 | "suggest": { 324 | "symfony/var-dumper": "Pretty print complex values better with var-dumper available", 325 | "whoops/soap": "Formats errors as SOAP responses" 326 | }, 327 | "type": "library", 328 | "extra": { 329 | "branch-alias": { 330 | "dev-master": "2.2-dev" 331 | } 332 | }, 333 | "autoload": { 334 | "psr-4": { 335 | "Whoops\\": "src/Whoops/" 336 | } 337 | }, 338 | "notification-url": "https://packagist.org/downloads/", 339 | "license": [ 340 | "MIT" 341 | ], 342 | "authors": [ 343 | { 344 | "name": "Filipe Dobreira", 345 | "homepage": "https://github.com/filp", 346 | "role": "Developer" 347 | } 348 | ], 349 | "description": "php error handling for cool kids", 350 | "homepage": "https://filp.github.io/whoops/", 351 | "keywords": [ 352 | "error", 353 | "exception", 354 | "handling", 355 | "library", 356 | "throwable", 357 | "whoops" 358 | ], 359 | "time": "2018-06-30T13:14:06+00:00" 360 | }, 361 | { 362 | "name": "illuminate/cache", 363 | "version": "v5.7.4", 364 | "source": { 365 | "type": "git", 366 | "url": "https://github.com/illuminate/cache.git", 367 | "reference": "6f6312f31f93b2631be4133304990b301e6e0442" 368 | }, 369 | "dist": { 370 | "type": "zip", 371 | "url": "https://api.github.com/repos/illuminate/cache/zipball/6f6312f31f93b2631be4133304990b301e6e0442", 372 | "reference": "6f6312f31f93b2631be4133304990b301e6e0442", 373 | "shasum": "" 374 | }, 375 | "require": { 376 | "illuminate/contracts": "5.7.*", 377 | "illuminate/support": "5.7.*", 378 | "php": "^7.1.3" 379 | }, 380 | "suggest": { 381 | "illuminate/database": "Required to use the database cache driver (5.7.*).", 382 | "illuminate/filesystem": "Required to use the file cache driver (5.7.*).", 383 | "illuminate/redis": "Required to use the redis cache driver (5.7.*)." 384 | }, 385 | "type": "library", 386 | "extra": { 387 | "branch-alias": { 388 | "dev-master": "5.7-dev" 389 | } 390 | }, 391 | "autoload": { 392 | "psr-4": { 393 | "Illuminate\\Cache\\": "" 394 | } 395 | }, 396 | "notification-url": "https://packagist.org/downloads/", 397 | "license": [ 398 | "MIT" 399 | ], 400 | "authors": [ 401 | { 402 | "name": "Taylor Otwell", 403 | "email": "taylor@laravel.com" 404 | } 405 | ], 406 | "description": "The Illuminate Cache package.", 407 | "homepage": "https://laravel.com", 408 | "time": "2018-09-16T20:37:01+00:00" 409 | }, 410 | { 411 | "name": "illuminate/config", 412 | "version": "v5.7.4", 413 | "source": { 414 | "type": "git", 415 | "url": "https://github.com/illuminate/config.git", 416 | "reference": "3cc6f07804b0a349c81b6479765a0bb58050fea0" 417 | }, 418 | "dist": { 419 | "type": "zip", 420 | "url": "https://api.github.com/repos/illuminate/config/zipball/3cc6f07804b0a349c81b6479765a0bb58050fea0", 421 | "reference": "3cc6f07804b0a349c81b6479765a0bb58050fea0", 422 | "shasum": "" 423 | }, 424 | "require": { 425 | "illuminate/contracts": "5.7.*", 426 | "illuminate/support": "5.7.*", 427 | "php": "^7.1.3" 428 | }, 429 | "type": "library", 430 | "extra": { 431 | "branch-alias": { 432 | "dev-master": "5.7-dev" 433 | } 434 | }, 435 | "autoload": { 436 | "psr-4": { 437 | "Illuminate\\Config\\": "" 438 | } 439 | }, 440 | "notification-url": "https://packagist.org/downloads/", 441 | "license": [ 442 | "MIT" 443 | ], 444 | "authors": [ 445 | { 446 | "name": "Taylor Otwell", 447 | "email": "taylor@laravel.com" 448 | } 449 | ], 450 | "description": "The Illuminate Config package.", 451 | "homepage": "https://laravel.com", 452 | "time": "2018-01-04T20:39:14+00:00" 453 | }, 454 | { 455 | "name": "illuminate/console", 456 | "version": "v5.7.4", 457 | "source": { 458 | "type": "git", 459 | "url": "https://github.com/illuminate/console.git", 460 | "reference": "735e2a57327359f34a7fc016cf219a48ee4f2051" 461 | }, 462 | "dist": { 463 | "type": "zip", 464 | "url": "https://api.github.com/repos/illuminate/console/zipball/735e2a57327359f34a7fc016cf219a48ee4f2051", 465 | "reference": "735e2a57327359f34a7fc016cf219a48ee4f2051", 466 | "shasum": "" 467 | }, 468 | "require": { 469 | "illuminate/contracts": "5.7.*", 470 | "illuminate/support": "5.7.*", 471 | "php": "^7.1.3", 472 | "symfony/console": "^4.1" 473 | }, 474 | "suggest": { 475 | "dragonmantank/cron-expression": "Required to use scheduling component (^2.0).", 476 | "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^6.0).", 477 | "symfony/process": "Required to use scheduling component (^4.1)." 478 | }, 479 | "type": "library", 480 | "extra": { 481 | "branch-alias": { 482 | "dev-master": "5.7-dev" 483 | } 484 | }, 485 | "autoload": { 486 | "psr-4": { 487 | "Illuminate\\Console\\": "" 488 | } 489 | }, 490 | "notification-url": "https://packagist.org/downloads/", 491 | "license": [ 492 | "MIT" 493 | ], 494 | "authors": [ 495 | { 496 | "name": "Taylor Otwell", 497 | "email": "taylor@laravel.com" 498 | } 499 | ], 500 | "description": "The Illuminate Console package.", 501 | "homepage": "https://laravel.com", 502 | "time": "2018-09-11T13:32:44+00:00" 503 | }, 504 | { 505 | "name": "illuminate/container", 506 | "version": "v5.7.4", 507 | "source": { 508 | "type": "git", 509 | "url": "https://github.com/illuminate/container.git", 510 | "reference": "0fc33b14ae6cf9a1e694fd43f2a274e590a824b2" 511 | }, 512 | "dist": { 513 | "type": "zip", 514 | "url": "https://api.github.com/repos/illuminate/container/zipball/0fc33b14ae6cf9a1e694fd43f2a274e590a824b2", 515 | "reference": "0fc33b14ae6cf9a1e694fd43f2a274e590a824b2", 516 | "shasum": "" 517 | }, 518 | "require": { 519 | "illuminate/contracts": "5.7.*", 520 | "php": "^7.1.3", 521 | "psr/container": "^1.0" 522 | }, 523 | "type": "library", 524 | "extra": { 525 | "branch-alias": { 526 | "dev-master": "5.7-dev" 527 | } 528 | }, 529 | "autoload": { 530 | "psr-4": { 531 | "Illuminate\\Container\\": "" 532 | } 533 | }, 534 | "notification-url": "https://packagist.org/downloads/", 535 | "license": [ 536 | "MIT" 537 | ], 538 | "authors": [ 539 | { 540 | "name": "Taylor Otwell", 541 | "email": "taylor@laravel.com" 542 | } 543 | ], 544 | "description": "The Illuminate Container package.", 545 | "homepage": "https://laravel.com", 546 | "time": "2018-05-28T08:50:10+00:00" 547 | }, 548 | { 549 | "name": "illuminate/contracts", 550 | "version": "v5.7.4", 551 | "source": { 552 | "type": "git", 553 | "url": "https://github.com/illuminate/contracts.git", 554 | "reference": "2daf3c078610f744e2a4dc2f44fb5060cce9835b" 555 | }, 556 | "dist": { 557 | "type": "zip", 558 | "url": "https://api.github.com/repos/illuminate/contracts/zipball/2daf3c078610f744e2a4dc2f44fb5060cce9835b", 559 | "reference": "2daf3c078610f744e2a4dc2f44fb5060cce9835b", 560 | "shasum": "" 561 | }, 562 | "require": { 563 | "php": "^7.1.3", 564 | "psr/container": "^1.0", 565 | "psr/simple-cache": "^1.0" 566 | }, 567 | "type": "library", 568 | "extra": { 569 | "branch-alias": { 570 | "dev-master": "5.7-dev" 571 | } 572 | }, 573 | "autoload": { 574 | "psr-4": { 575 | "Illuminate\\Contracts\\": "" 576 | } 577 | }, 578 | "notification-url": "https://packagist.org/downloads/", 579 | "license": [ 580 | "MIT" 581 | ], 582 | "authors": [ 583 | { 584 | "name": "Taylor Otwell", 585 | "email": "taylor@laravel.com" 586 | } 587 | ], 588 | "description": "The Illuminate Contracts package.", 589 | "homepage": "https://laravel.com", 590 | "time": "2018-09-18T12:50:05+00:00" 591 | }, 592 | { 593 | "name": "illuminate/events", 594 | "version": "v5.7.4", 595 | "source": { 596 | "type": "git", 597 | "url": "https://github.com/illuminate/events.git", 598 | "reference": "4cf622acc05592f86d4a5c77ad1a544d38e58dee" 599 | }, 600 | "dist": { 601 | "type": "zip", 602 | "url": "https://api.github.com/repos/illuminate/events/zipball/4cf622acc05592f86d4a5c77ad1a544d38e58dee", 603 | "reference": "4cf622acc05592f86d4a5c77ad1a544d38e58dee", 604 | "shasum": "" 605 | }, 606 | "require": { 607 | "illuminate/container": "5.7.*", 608 | "illuminate/contracts": "5.7.*", 609 | "illuminate/support": "5.7.*", 610 | "php": "^7.1.3" 611 | }, 612 | "type": "library", 613 | "extra": { 614 | "branch-alias": { 615 | "dev-master": "5.7-dev" 616 | } 617 | }, 618 | "autoload": { 619 | "psr-4": { 620 | "Illuminate\\Events\\": "" 621 | } 622 | }, 623 | "notification-url": "https://packagist.org/downloads/", 624 | "license": [ 625 | "MIT" 626 | ], 627 | "authors": [ 628 | { 629 | "name": "Taylor Otwell", 630 | "email": "taylor@laravel.com" 631 | } 632 | ], 633 | "description": "The Illuminate Events package.", 634 | "homepage": "https://laravel.com", 635 | "time": "2018-07-26T15:27:42+00:00" 636 | }, 637 | { 638 | "name": "illuminate/filesystem", 639 | "version": "v5.7.4", 640 | "source": { 641 | "type": "git", 642 | "url": "https://github.com/illuminate/filesystem.git", 643 | "reference": "a09fae4470494dc9867609221b46fe844f2f3b70" 644 | }, 645 | "dist": { 646 | "type": "zip", 647 | "url": "https://api.github.com/repos/illuminate/filesystem/zipball/a09fae4470494dc9867609221b46fe844f2f3b70", 648 | "reference": "a09fae4470494dc9867609221b46fe844f2f3b70", 649 | "shasum": "" 650 | }, 651 | "require": { 652 | "illuminate/contracts": "5.7.*", 653 | "illuminate/support": "5.7.*", 654 | "php": "^7.1.3", 655 | "symfony/finder": "^4.1" 656 | }, 657 | "suggest": { 658 | "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.0).", 659 | "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", 660 | "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", 661 | "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (^1.0).", 662 | "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0)." 663 | }, 664 | "type": "library", 665 | "extra": { 666 | "branch-alias": { 667 | "dev-master": "5.7-dev" 668 | } 669 | }, 670 | "autoload": { 671 | "psr-4": { 672 | "Illuminate\\Filesystem\\": "" 673 | } 674 | }, 675 | "notification-url": "https://packagist.org/downloads/", 676 | "license": [ 677 | "MIT" 678 | ], 679 | "authors": [ 680 | { 681 | "name": "Taylor Otwell", 682 | "email": "taylor@laravel.com" 683 | } 684 | ], 685 | "description": "The Illuminate Filesystem package.", 686 | "homepage": "https://laravel.com", 687 | "time": "2018-08-14T19:42:44+00:00" 688 | }, 689 | { 690 | "name": "illuminate/support", 691 | "version": "v5.7.4", 692 | "source": { 693 | "type": "git", 694 | "url": "https://github.com/illuminate/support.git", 695 | "reference": "bb579d7174181c343259933cac430869eada7edb" 696 | }, 697 | "dist": { 698 | "type": "zip", 699 | "url": "https://api.github.com/repos/illuminate/support/zipball/bb579d7174181c343259933cac430869eada7edb", 700 | "reference": "bb579d7174181c343259933cac430869eada7edb", 701 | "shasum": "" 702 | }, 703 | "require": { 704 | "doctrine/inflector": "^1.1", 705 | "ext-mbstring": "*", 706 | "illuminate/contracts": "5.7.*", 707 | "nesbot/carbon": "^1.26.3", 708 | "php": "^7.1.3" 709 | }, 710 | "conflict": { 711 | "tightenco/collect": "<5.5.33" 712 | }, 713 | "suggest": { 714 | "illuminate/filesystem": "Required to use the composer class (5.7.*).", 715 | "moontoast/math": "Required to use ordered UUIDs (^1.1).", 716 | "ramsey/uuid": "Required to use Str::uuid() (^3.7).", 717 | "symfony/process": "Required to use the composer class (^4.1).", 718 | "symfony/var-dumper": "Required to use the dd function (^4.1)." 719 | }, 720 | "type": "library", 721 | "extra": { 722 | "branch-alias": { 723 | "dev-master": "5.7-dev" 724 | } 725 | }, 726 | "autoload": { 727 | "psr-4": { 728 | "Illuminate\\Support\\": "" 729 | }, 730 | "files": [ 731 | "helpers.php" 732 | ] 733 | }, 734 | "notification-url": "https://packagist.org/downloads/", 735 | "license": [ 736 | "MIT" 737 | ], 738 | "authors": [ 739 | { 740 | "name": "Taylor Otwell", 741 | "email": "taylor@laravel.com" 742 | } 743 | ], 744 | "description": "The Illuminate Support package.", 745 | "homepage": "https://laravel.com", 746 | "time": "2018-09-16T20:37:01+00:00" 747 | }, 748 | { 749 | "name": "jakub-onderka/php-console-color", 750 | "version": "0.1", 751 | "source": { 752 | "type": "git", 753 | "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", 754 | "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" 755 | }, 756 | "dist": { 757 | "type": "zip", 758 | "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", 759 | "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", 760 | "shasum": "" 761 | }, 762 | "require": { 763 | "php": ">=5.3.2" 764 | }, 765 | "require-dev": { 766 | "jakub-onderka/php-code-style": "1.0", 767 | "jakub-onderka/php-parallel-lint": "0.*", 768 | "jakub-onderka/php-var-dump-check": "0.*", 769 | "phpunit/phpunit": "3.7.*", 770 | "squizlabs/php_codesniffer": "1.*" 771 | }, 772 | "type": "library", 773 | "autoload": { 774 | "psr-0": { 775 | "JakubOnderka\\PhpConsoleColor": "src/" 776 | } 777 | }, 778 | "notification-url": "https://packagist.org/downloads/", 779 | "license": [ 780 | "BSD-2-Clause" 781 | ], 782 | "authors": [ 783 | { 784 | "name": "Jakub Onderka", 785 | "email": "jakub.onderka@gmail.com", 786 | "homepage": "http://www.acci.cz" 787 | } 788 | ], 789 | "time": "2014-04-08T15:00:19+00:00" 790 | }, 791 | { 792 | "name": "jakub-onderka/php-console-highlighter", 793 | "version": "v0.3.2", 794 | "source": { 795 | "type": "git", 796 | "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", 797 | "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" 798 | }, 799 | "dist": { 800 | "type": "zip", 801 | "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", 802 | "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", 803 | "shasum": "" 804 | }, 805 | "require": { 806 | "jakub-onderka/php-console-color": "~0.1", 807 | "php": ">=5.3.0" 808 | }, 809 | "require-dev": { 810 | "jakub-onderka/php-code-style": "~1.0", 811 | "jakub-onderka/php-parallel-lint": "~0.5", 812 | "jakub-onderka/php-var-dump-check": "~0.1", 813 | "phpunit/phpunit": "~4.0", 814 | "squizlabs/php_codesniffer": "~1.5" 815 | }, 816 | "type": "library", 817 | "autoload": { 818 | "psr-0": { 819 | "JakubOnderka\\PhpConsoleHighlighter": "src/" 820 | } 821 | }, 822 | "notification-url": "https://packagist.org/downloads/", 823 | "license": [ 824 | "MIT" 825 | ], 826 | "authors": [ 827 | { 828 | "name": "Jakub Onderka", 829 | "email": "acci@acci.cz", 830 | "homepage": "http://www.acci.cz/" 831 | } 832 | ], 833 | "time": "2015-04-20T18:58:01+00:00" 834 | }, 835 | { 836 | "name": "jolicode/jolinotif", 837 | "version": "v2.0.1", 838 | "source": { 839 | "type": "git", 840 | "url": "https://github.com/jolicode/JoliNotif.git", 841 | "reference": "3bb98bc60372aae7f23b85a3e70b374a99eb35e4" 842 | }, 843 | "dist": { 844 | "type": "zip", 845 | "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/3bb98bc60372aae7f23b85a3e70b374a99eb35e4", 846 | "reference": "3bb98bc60372aae7f23b85a3e70b374a99eb35e4", 847 | "shasum": "" 848 | }, 849 | "require": { 850 | "php": ">=7.0", 851 | "symfony/process": "~3.3|~4.0" 852 | }, 853 | "require-dev": { 854 | "friendsofphp/php-cs-fixer": "~2.0", 855 | "symfony/phpunit-bridge": "^3.3" 856 | }, 857 | "bin": [ 858 | "jolinotif" 859 | ], 860 | "type": "library", 861 | "extra": { 862 | "branch-alias": { 863 | "dev-master": "2.0.x-dev" 864 | } 865 | }, 866 | "autoload": { 867 | "psr-4": { 868 | "Joli\\JoliNotif\\": "src/" 869 | } 870 | }, 871 | "notification-url": "https://packagist.org/downloads/", 872 | "license": [ 873 | "MIT" 874 | ], 875 | "authors": [ 876 | { 877 | "name": "Loïck Piera", 878 | "email": "pyrech@gmail.com" 879 | } 880 | ], 881 | "description": "Send desktop notifications on Windows, Linux, MacOS.", 882 | "keywords": [ 883 | "MAC", 884 | "growl", 885 | "linux", 886 | "notification", 887 | "windows" 888 | ], 889 | "time": "2018-04-04T15:31:01+00:00" 890 | }, 891 | { 892 | "name": "jublonet/codebird-php", 893 | "version": "3.1.0", 894 | "source": { 895 | "type": "git", 896 | "url": "https://github.com/jublonet/codebird-php.git", 897 | "reference": "100a8e8f1928a5738b4476f0caf83f2c2ba6da5b" 898 | }, 899 | "dist": { 900 | "type": "zip", 901 | "url": "https://api.github.com/repos/jublonet/codebird-php/zipball/100a8e8f1928a5738b4476f0caf83f2c2ba6da5b", 902 | "reference": "100a8e8f1928a5738b4476f0caf83f2c2ba6da5b", 903 | "shasum": "" 904 | }, 905 | "require": { 906 | "composer/installers": "~1.0", 907 | "ext-hash": "*", 908 | "ext-json": "*", 909 | "lib-openssl": "*", 910 | "php": ">=5.5.0" 911 | }, 912 | "require-dev": { 913 | "phpunit/phpunit": ">=3.7", 914 | "satooshi/php-coveralls": ">=0.6", 915 | "squizlabs/php_codesniffer": "2.*" 916 | }, 917 | "type": "library", 918 | "autoload": { 919 | "classmap": [ 920 | "src/" 921 | ] 922 | }, 923 | "notification-url": "https://packagist.org/downloads/", 924 | "license": [ 925 | "GPL-3.0+" 926 | ], 927 | "authors": [ 928 | { 929 | "name": "Joshua Atkins", 930 | "email": "joshua.atkins@jublo.net", 931 | "homepage": "http://atkins.im/", 932 | "role": "Developer" 933 | }, 934 | { 935 | "name": "J.M.", 936 | "email": "jm@jublo.net", 937 | "homepage": "http://mynetx.net/", 938 | "role": "Developer" 939 | } 940 | ], 941 | "description": "Easy access to the Twitter REST API, Collections API, Streaming API, TON (Object Nest) API and Twitter Ads API — all from one PHP library.", 942 | "homepage": "https://www.jublo.net/projects/codebird/php", 943 | "keywords": [ 944 | "api", 945 | "networking", 946 | "twitter" 947 | ], 948 | "time": "2016-02-15T18:38:55+00:00" 949 | }, 950 | { 951 | "name": "laravel-zero/foundation", 952 | "version": "v5.7.3", 953 | "source": { 954 | "type": "git", 955 | "url": "https://github.com/laravel-zero/foundation.git", 956 | "reference": "1f7b538985c54e5f4a5d9fdcdb967e642d0797c6" 957 | }, 958 | "dist": { 959 | "type": "zip", 960 | "url": "https://api.github.com/repos/laravel-zero/foundation/zipball/1f7b538985c54e5f4a5d9fdcdb967e642d0797c6", 961 | "reference": "1f7b538985c54e5f4a5d9fdcdb967e642d0797c6", 962 | "shasum": "" 963 | }, 964 | "require": { 965 | "php": "^7.1.3" 966 | }, 967 | "type": "library", 968 | "autoload": { 969 | "files": [ 970 | "src/Illuminate/Foundation/helpers.php" 971 | ], 972 | "psr-4": { 973 | "Illuminate\\": "src/Illuminate/" 974 | } 975 | }, 976 | "notification-url": "https://packagist.org/downloads/", 977 | "license": [ 978 | "MIT" 979 | ], 980 | "description": "This is a mirror from illuminate/foundation.", 981 | "keywords": [ 982 | "framework", 983 | "laravel" 984 | ], 985 | "time": "2018-09-12T21:36:07+00:00" 986 | }, 987 | { 988 | "name": "laravel-zero/framework", 989 | "version": "v5.7.3", 990 | "source": { 991 | "type": "git", 992 | "url": "https://github.com/laravel-zero/framework.git", 993 | "reference": "4bb5f0d911f6fe17d5978fdb36617cac87d7c47e" 994 | }, 995 | "dist": { 996 | "type": "zip", 997 | "url": "https://api.github.com/repos/laravel-zero/framework/zipball/4bb5f0d911f6fe17d5978fdb36617cac87d7c47e", 998 | "reference": "4bb5f0d911f6fe17d5978fdb36617cac87d7c47e", 999 | "shasum": "" 1000 | }, 1001 | "require": { 1002 | "dragonmantank/cron-expression": "^2.0", 1003 | "illuminate/cache": "5.7.*", 1004 | "illuminate/config": "5.7.*", 1005 | "illuminate/console": "5.7.*", 1006 | "illuminate/container": "5.7.*", 1007 | "illuminate/contracts": "5.7.*", 1008 | "illuminate/events": "5.7.*", 1009 | "illuminate/filesystem": "5.7.*", 1010 | "illuminate/support": "5.7.*", 1011 | "laravel-zero/foundation": "5.7.*", 1012 | "league/flysystem": "^1.0.8", 1013 | "nunomaduro/collision": "^2.0", 1014 | "nunomaduro/laravel-console-menu": "^2.0", 1015 | "nunomaduro/laravel-console-summary": "^1.0", 1016 | "nunomaduro/laravel-console-task": "^1.0.6", 1017 | "nunomaduro/laravel-desktop-notifier": "^2.0", 1018 | "php": "^7.1.3", 1019 | "symfony/console": "^4.1", 1020 | "symfony/debug": "^4.1", 1021 | "symfony/process": "^4.1", 1022 | "symfony/var-dumper": "^4.1" 1023 | }, 1024 | "require-dev": { 1025 | "illuminate/bus": "5.7.*", 1026 | "illuminate/database": "5.7.*", 1027 | "illuminate/log": "5.7.*", 1028 | "illuminate/queue": "5.7.*", 1029 | "nunomaduro/laravel-console-dusk": "^1.0", 1030 | "phpstan/phpstan": "^0.10", 1031 | "phpunit/phpunit": "^7.3", 1032 | "vlucas/phpdotenv": "^2.4" 1033 | }, 1034 | "type": "library", 1035 | "autoload": { 1036 | "psr-4": { 1037 | "LaravelZero\\Framework\\": "src" 1038 | } 1039 | }, 1040 | "notification-url": "https://packagist.org/downloads/", 1041 | "license": [ 1042 | "MIT" 1043 | ], 1044 | "authors": [ 1045 | { 1046 | "name": "Nuno Maduro", 1047 | "email": "enunomaduro@gmail.com" 1048 | } 1049 | ], 1050 | "description": "The Laravel Zero Framework.", 1051 | "homepage": "https://laravel-zero.com", 1052 | "keywords": [ 1053 | "Laravel Zero", 1054 | "cli", 1055 | "console", 1056 | "framework", 1057 | "laravel" 1058 | ], 1059 | "time": "2018-09-17T19:29:39+00:00" 1060 | }, 1061 | { 1062 | "name": "league/flysystem", 1063 | "version": "1.0.47", 1064 | "source": { 1065 | "type": "git", 1066 | "url": "https://github.com/thephpleague/flysystem.git", 1067 | "reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c" 1068 | }, 1069 | "dist": { 1070 | "type": "zip", 1071 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a11e4a75f256bdacf99d20780ce42d3b8272975c", 1072 | "reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c", 1073 | "shasum": "" 1074 | }, 1075 | "require": { 1076 | "ext-fileinfo": "*", 1077 | "php": ">=5.5.9" 1078 | }, 1079 | "conflict": { 1080 | "league/flysystem-sftp": "<1.0.6" 1081 | }, 1082 | "require-dev": { 1083 | "phpspec/phpspec": "^3.4", 1084 | "phpunit/phpunit": "^5.7.10" 1085 | }, 1086 | "suggest": { 1087 | "ext-fileinfo": "Required for MimeType", 1088 | "ext-ftp": "Allows you to use FTP server storage", 1089 | "ext-openssl": "Allows you to use FTPS server storage", 1090 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 1091 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 1092 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 1093 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 1094 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 1095 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 1096 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 1097 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 1098 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", 1099 | "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", 1100 | "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" 1101 | }, 1102 | "type": "library", 1103 | "extra": { 1104 | "branch-alias": { 1105 | "dev-master": "1.1-dev" 1106 | } 1107 | }, 1108 | "autoload": { 1109 | "psr-4": { 1110 | "League\\Flysystem\\": "src/" 1111 | } 1112 | }, 1113 | "notification-url": "https://packagist.org/downloads/", 1114 | "license": [ 1115 | "MIT" 1116 | ], 1117 | "authors": [ 1118 | { 1119 | "name": "Frank de Jonge", 1120 | "email": "info@frenky.net" 1121 | } 1122 | ], 1123 | "description": "Filesystem abstraction: Many filesystems, one API.", 1124 | "keywords": [ 1125 | "Cloud Files", 1126 | "WebDAV", 1127 | "abstraction", 1128 | "aws", 1129 | "cloud", 1130 | "copy.com", 1131 | "dropbox", 1132 | "file systems", 1133 | "files", 1134 | "filesystem", 1135 | "filesystems", 1136 | "ftp", 1137 | "rackspace", 1138 | "remote", 1139 | "s3", 1140 | "sftp", 1141 | "storage" 1142 | ], 1143 | "time": "2018-09-14T15:30:29+00:00" 1144 | }, 1145 | { 1146 | "name": "nesbot/carbon", 1147 | "version": "1.33.0", 1148 | "source": { 1149 | "type": "git", 1150 | "url": "https://github.com/briannesbitt/Carbon.git", 1151 | "reference": "55667c1007a99e82030874b1bb14d24d07108413" 1152 | }, 1153 | "dist": { 1154 | "type": "zip", 1155 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/55667c1007a99e82030874b1bb14d24d07108413", 1156 | "reference": "55667c1007a99e82030874b1bb14d24d07108413", 1157 | "shasum": "" 1158 | }, 1159 | "require": { 1160 | "php": ">=5.3.9", 1161 | "symfony/translation": "~2.6 || ~3.0 || ~4.0" 1162 | }, 1163 | "require-dev": { 1164 | "friendsofphp/php-cs-fixer": "~2", 1165 | "phpunit/phpunit": "^4.8.35 || ^5.7" 1166 | }, 1167 | "type": "library", 1168 | "extra": { 1169 | "laravel": { 1170 | "providers": [ 1171 | "Carbon\\Laravel\\ServiceProvider" 1172 | ] 1173 | } 1174 | }, 1175 | "autoload": { 1176 | "psr-4": { 1177 | "": "src/" 1178 | } 1179 | }, 1180 | "notification-url": "https://packagist.org/downloads/", 1181 | "license": [ 1182 | "MIT" 1183 | ], 1184 | "authors": [ 1185 | { 1186 | "name": "Brian Nesbitt", 1187 | "email": "brian@nesbot.com", 1188 | "homepage": "http://nesbot.com" 1189 | } 1190 | ], 1191 | "description": "A simple API extension for DateTime.", 1192 | "homepage": "http://carbon.nesbot.com", 1193 | "keywords": [ 1194 | "date", 1195 | "datetime", 1196 | "time" 1197 | ], 1198 | "time": "2018-08-07T08:39:47+00:00" 1199 | }, 1200 | { 1201 | "name": "nunomaduro/collision", 1202 | "version": "v2.0.3", 1203 | "source": { 1204 | "type": "git", 1205 | "url": "https://github.com/nunomaduro/collision.git", 1206 | "reference": "b1f606399ae77e9479b5597cd1aa3d8ea0078176" 1207 | }, 1208 | "dist": { 1209 | "type": "zip", 1210 | "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b1f606399ae77e9479b5597cd1aa3d8ea0078176", 1211 | "reference": "b1f606399ae77e9479b5597cd1aa3d8ea0078176", 1212 | "shasum": "" 1213 | }, 1214 | "require": { 1215 | "filp/whoops": "^2.1.4", 1216 | "jakub-onderka/php-console-highlighter": "0.3.*", 1217 | "php": "^7.1", 1218 | "symfony/console": "~2.8|~3.3|~4.0" 1219 | }, 1220 | "require-dev": { 1221 | "laravel/framework": "5.6.*", 1222 | "phpstan/phpstan": "^0.9.2", 1223 | "phpunit/phpunit": "~7.2" 1224 | }, 1225 | "type": "library", 1226 | "extra": { 1227 | "laravel": { 1228 | "providers": [ 1229 | "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" 1230 | ] 1231 | } 1232 | }, 1233 | "autoload": { 1234 | "psr-4": { 1235 | "NunoMaduro\\Collision\\": "src/" 1236 | } 1237 | }, 1238 | "notification-url": "https://packagist.org/downloads/", 1239 | "license": [ 1240 | "MIT" 1241 | ], 1242 | "authors": [ 1243 | { 1244 | "name": "Nuno Maduro", 1245 | "email": "enunomaduro@gmail.com" 1246 | } 1247 | ], 1248 | "description": "Cli error handling for console/command-line PHP applications.", 1249 | "keywords": [ 1250 | "artisan", 1251 | "cli", 1252 | "command-line", 1253 | "console", 1254 | "error", 1255 | "handling", 1256 | "laravel", 1257 | "laravel-zero", 1258 | "php", 1259 | "symfony" 1260 | ], 1261 | "time": "2018-06-16T22:05:52+00:00" 1262 | }, 1263 | { 1264 | "name": "nunomaduro/laravel-console-menu", 1265 | "version": "v2.0.0", 1266 | "source": { 1267 | "type": "git", 1268 | "url": "https://github.com/nunomaduro/laravel-console-menu.git", 1269 | "reference": "0bdb20e37a54708429d6c8aa7bb63dbafb04ca35" 1270 | }, 1271 | "dist": { 1272 | "type": "zip", 1273 | "url": "https://api.github.com/repos/nunomaduro/laravel-console-menu/zipball/0bdb20e37a54708429d6c8aa7bb63dbafb04ca35", 1274 | "reference": "0bdb20e37a54708429d6c8aa7bb63dbafb04ca35", 1275 | "shasum": "" 1276 | }, 1277 | "require": { 1278 | "illuminate/console": "5.6.*|5.7.*", 1279 | "illuminate/support": "5.6.*|5.7.*", 1280 | "php": "^7.1.3", 1281 | "php-school/cli-menu": "^3.0" 1282 | }, 1283 | "type": "library", 1284 | "extra": { 1285 | "laravel": { 1286 | "providers": [ 1287 | "NunoMaduro\\LaravelConsoleMenu\\LaravelConsoleMenuServiceProvider" 1288 | ] 1289 | } 1290 | }, 1291 | "autoload": { 1292 | "psr-4": { 1293 | "NunoMaduro\\LaravelConsoleMenu\\": "src/" 1294 | } 1295 | }, 1296 | "notification-url": "https://packagist.org/downloads/", 1297 | "license": [ 1298 | "MIT" 1299 | ], 1300 | "authors": [ 1301 | { 1302 | "name": "Nuno Maduro", 1303 | "email": "enunomaduro@gmail.com" 1304 | } 1305 | ], 1306 | "description": "Laravel Console Menu is an output method for your Laravel/Laravel Zero commands.", 1307 | "keywords": [ 1308 | "artisan", 1309 | "cli", 1310 | "command-line", 1311 | "console", 1312 | "laravel", 1313 | "laravel-zero", 1314 | "php", 1315 | "symfony" 1316 | ], 1317 | "time": "2018-08-27T09:19:52+00:00" 1318 | }, 1319 | { 1320 | "name": "nunomaduro/laravel-console-summary", 1321 | "version": "v1.0.4", 1322 | "source": { 1323 | "type": "git", 1324 | "url": "https://github.com/nunomaduro/laravel-console-summary.git", 1325 | "reference": "dd3be06e03946137f98670d00f5d10e89a5f3cf2" 1326 | }, 1327 | "dist": { 1328 | "type": "zip", 1329 | "url": "https://api.github.com/repos/nunomaduro/laravel-console-summary/zipball/dd3be06e03946137f98670d00f5d10e89a5f3cf2", 1330 | "reference": "dd3be06e03946137f98670d00f5d10e89a5f3cf2", 1331 | "shasum": "" 1332 | }, 1333 | "require": { 1334 | "illuminate/console": "5.6.*|5.7.*", 1335 | "illuminate/support": "5.6.*|5.7.*", 1336 | "php": ">=7.1.3" 1337 | }, 1338 | "type": "library", 1339 | "extra": { 1340 | "laravel": { 1341 | "providers": [ 1342 | "NunoMaduro\\LaravelConsoleSummary\\LaravelConsoleSummaryServiceProvider" 1343 | ] 1344 | } 1345 | }, 1346 | "autoload": { 1347 | "psr-4": { 1348 | "NunoMaduro\\LaravelConsoleSummary\\": "src/" 1349 | } 1350 | }, 1351 | "notification-url": "https://packagist.org/downloads/", 1352 | "license": [ 1353 | "MIT" 1354 | ], 1355 | "authors": [ 1356 | { 1357 | "name": "Nuno Maduro", 1358 | "email": "enunomaduro@gmail.com" 1359 | } 1360 | ], 1361 | "description": "A Beautiful Laravel Console Summary for your Laravel/Laravel Zero commands.", 1362 | "keywords": [ 1363 | "artisan", 1364 | "cli", 1365 | "command-line", 1366 | "console", 1367 | "laravel", 1368 | "laravel-zero", 1369 | "php", 1370 | "symfony" 1371 | ], 1372 | "time": "2018-08-26T23:04:18+00:00" 1373 | }, 1374 | { 1375 | "name": "nunomaduro/laravel-console-task", 1376 | "version": "v1.0.7", 1377 | "source": { 1378 | "type": "git", 1379 | "url": "https://github.com/nunomaduro/laravel-console-task.git", 1380 | "reference": "e247b223429809b2287c92298e93b13e0e575533" 1381 | }, 1382 | "dist": { 1383 | "type": "zip", 1384 | "url": "https://api.github.com/repos/nunomaduro/laravel-console-task/zipball/e247b223429809b2287c92298e93b13e0e575533", 1385 | "reference": "e247b223429809b2287c92298e93b13e0e575533", 1386 | "shasum": "" 1387 | }, 1388 | "require": { 1389 | "illuminate/console": "~5.5.26|5.6.*|5.7.*", 1390 | "illuminate/support": "~5.5.26|5.6.*|5.7.*", 1391 | "php": "^7.0" 1392 | }, 1393 | "require-dev": { 1394 | "phpunit/phpunit": "^6.5" 1395 | }, 1396 | "type": "library", 1397 | "extra": { 1398 | "laravel": { 1399 | "providers": [ 1400 | "NunoMaduro\\LaravelConsoleTask\\LaravelConsoleTaskServiceProvider" 1401 | ] 1402 | } 1403 | }, 1404 | "autoload": { 1405 | "psr-4": { 1406 | "NunoMaduro\\LaravelConsoleTask\\": "src/" 1407 | } 1408 | }, 1409 | "notification-url": "https://packagist.org/downloads/", 1410 | "license": [ 1411 | "MIT" 1412 | ], 1413 | "authors": [ 1414 | { 1415 | "name": "Nuno Maduro", 1416 | "email": "enunomaduro@gmail.com" 1417 | } 1418 | ], 1419 | "description": "Laravel Console Task is a output method for your Laravel/Laravel Zero commands.", 1420 | "keywords": [ 1421 | "artisan", 1422 | "cli", 1423 | "command-line", 1424 | "console", 1425 | "laravel", 1426 | "laravel-zero", 1427 | "php", 1428 | "symfony" 1429 | ], 1430 | "time": "2018-08-26T19:40:07+00:00" 1431 | }, 1432 | { 1433 | "name": "nunomaduro/laravel-desktop-notifier", 1434 | "version": "v2.0.6", 1435 | "source": { 1436 | "type": "git", 1437 | "url": "https://github.com/nunomaduro/laravel-desktop-notifier.git", 1438 | "reference": "9cf87364f021c3d411770cb34e46e6a656dab928" 1439 | }, 1440 | "dist": { 1441 | "type": "zip", 1442 | "url": "https://api.github.com/repos/nunomaduro/laravel-desktop-notifier/zipball/9cf87364f021c3d411770cb34e46e6a656dab928", 1443 | "reference": "9cf87364f021c3d411770cb34e46e6a656dab928", 1444 | "shasum": "" 1445 | }, 1446 | "require": { 1447 | "illuminate/console": "5.6.*|5.7.*", 1448 | "illuminate/support": "5.6.*|5.7.*", 1449 | "jolicode/jolinotif": "^2.0", 1450 | "php": "^7.1.3" 1451 | }, 1452 | "require-dev": { 1453 | "graham-campbell/testbench": "dev-master", 1454 | "phpunit/phpunit": "^7.0" 1455 | }, 1456 | "type": "library", 1457 | "extra": { 1458 | "laravel": { 1459 | "providers": [ 1460 | "NunoMaduro\\LaravelDesktopNotifier\\LaravelDesktopNotifierServiceProvider" 1461 | ], 1462 | "aliases": { 1463 | "Notifier": "NunoMaduro\\LaravelDesktopNotifier\\Facaces\\Notifier" 1464 | } 1465 | } 1466 | }, 1467 | "autoload": { 1468 | "psr-4": { 1469 | "NunoMaduro\\LaravelDesktopNotifier\\": "src/" 1470 | } 1471 | }, 1472 | "notification-url": "https://packagist.org/downloads/", 1473 | "license": [ 1474 | "MIT" 1475 | ], 1476 | "authors": [ 1477 | { 1478 | "name": "Nuno Maduro", 1479 | "email": "enunomaduro@gmail.com" 1480 | } 1481 | ], 1482 | "description": "Send notifications to your desktop from your Laravel commands. An JoliNotif wrapper for Laravel 5.", 1483 | "keywords": [ 1484 | "JoliNotif", 1485 | "Nuno Maduro", 1486 | "NunoMaduro", 1487 | "artisan", 1488 | "console", 1489 | "framework", 1490 | "laravel", 1491 | "notification", 1492 | "notifier", 1493 | "php", 1494 | "wrapper" 1495 | ], 1496 | "time": "2018-08-26T22:58:22+00:00" 1497 | }, 1498 | { 1499 | "name": "php-school/cli-menu", 1500 | "version": "3.0.0", 1501 | "source": { 1502 | "type": "git", 1503 | "url": "https://github.com/php-school/cli-menu.git", 1504 | "reference": "b825381156a5716cb4e4ef8c1ddab8abafc0fbca" 1505 | }, 1506 | "dist": { 1507 | "type": "zip", 1508 | "url": "https://api.github.com/repos/php-school/cli-menu/zipball/b825381156a5716cb4e4ef8c1ddab8abafc0fbca", 1509 | "reference": "b825381156a5716cb4e4ef8c1ddab8abafc0fbca", 1510 | "shasum": "" 1511 | }, 1512 | "require": { 1513 | "beberlei/assert": "^2.4", 1514 | "ext-posix": "*", 1515 | "php": ">=7.1", 1516 | "php-school/terminal": "^0.1" 1517 | }, 1518 | "require-dev": { 1519 | "phpstan/phpstan": "^0.9.2", 1520 | "phpunit/phpunit": "^7.1", 1521 | "squizlabs/php_codesniffer": "^3.2" 1522 | }, 1523 | "type": "library", 1524 | "autoload": { 1525 | "psr-4": { 1526 | "PhpSchool\\CliMenu\\": "src" 1527 | } 1528 | }, 1529 | "notification-url": "https://packagist.org/downloads/", 1530 | "license": [ 1531 | "MIT" 1532 | ], 1533 | "authors": [ 1534 | { 1535 | "name": "Michael Woodward", 1536 | "email": "mikeymike.mw@gmail.com" 1537 | }, 1538 | { 1539 | "name": "Aydin Hassan", 1540 | "email": "aydin@hotmail.com" 1541 | } 1542 | ], 1543 | "description": "A command line menu helper in PHP", 1544 | "keywords": [ 1545 | "cli", 1546 | "console", 1547 | "menu", 1548 | "php-school", 1549 | "phpschool", 1550 | "terminal" 1551 | ], 1552 | "time": "2018-05-17T11:38:22+00:00" 1553 | }, 1554 | { 1555 | "name": "php-school/terminal", 1556 | "version": "0.1.0", 1557 | "source": { 1558 | "type": "git", 1559 | "url": "https://github.com/php-school/terminal.git", 1560 | "reference": "5533b179095668f951bb393aa41def386f0f6edf" 1561 | }, 1562 | "dist": { 1563 | "type": "zip", 1564 | "url": "https://api.github.com/repos/php-school/terminal/zipball/5533b179095668f951bb393aa41def386f0f6edf", 1565 | "reference": "5533b179095668f951bb393aa41def386f0f6edf", 1566 | "shasum": "" 1567 | }, 1568 | "require": { 1569 | "ext-posix": "*", 1570 | "php": ">=7.1" 1571 | }, 1572 | "require-dev": { 1573 | "phpstan/phpstan": "^0.9.2", 1574 | "phpunit/phpunit": "^7.1", 1575 | "squizlabs/php_codesniffer": "^3.2" 1576 | }, 1577 | "type": "library", 1578 | "autoload": { 1579 | "psr-4": { 1580 | "PhpSchool\\Terminal\\": "src" 1581 | } 1582 | }, 1583 | "notification-url": "https://packagist.org/downloads/", 1584 | "license": [ 1585 | "MIT" 1586 | ], 1587 | "authors": [ 1588 | { 1589 | "name": "Michael Woodward", 1590 | "email": "mikeymike.mw@gmail.com" 1591 | }, 1592 | { 1593 | "name": "Aydin Hassan", 1594 | "email": "aydin@hotmail.com" 1595 | } 1596 | ], 1597 | "description": "A command line terminal utility in PHP", 1598 | "keywords": [ 1599 | "cli", 1600 | "console", 1601 | "php-school", 1602 | "phpschool", 1603 | "terminal" 1604 | ], 1605 | "time": "2018-05-06T20:10:24+00:00" 1606 | }, 1607 | { 1608 | "name": "psr/container", 1609 | "version": "1.0.0", 1610 | "source": { 1611 | "type": "git", 1612 | "url": "https://github.com/php-fig/container.git", 1613 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 1614 | }, 1615 | "dist": { 1616 | "type": "zip", 1617 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1618 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1619 | "shasum": "" 1620 | }, 1621 | "require": { 1622 | "php": ">=5.3.0" 1623 | }, 1624 | "type": "library", 1625 | "extra": { 1626 | "branch-alias": { 1627 | "dev-master": "1.0.x-dev" 1628 | } 1629 | }, 1630 | "autoload": { 1631 | "psr-4": { 1632 | "Psr\\Container\\": "src/" 1633 | } 1634 | }, 1635 | "notification-url": "https://packagist.org/downloads/", 1636 | "license": [ 1637 | "MIT" 1638 | ], 1639 | "authors": [ 1640 | { 1641 | "name": "PHP-FIG", 1642 | "homepage": "http://www.php-fig.org/" 1643 | } 1644 | ], 1645 | "description": "Common Container Interface (PHP FIG PSR-11)", 1646 | "homepage": "https://github.com/php-fig/container", 1647 | "keywords": [ 1648 | "PSR-11", 1649 | "container", 1650 | "container-interface", 1651 | "container-interop", 1652 | "psr" 1653 | ], 1654 | "time": "2017-02-14T16:28:37+00:00" 1655 | }, 1656 | { 1657 | "name": "psr/log", 1658 | "version": "1.0.2", 1659 | "source": { 1660 | "type": "git", 1661 | "url": "https://github.com/php-fig/log.git", 1662 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 1663 | }, 1664 | "dist": { 1665 | "type": "zip", 1666 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 1667 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 1668 | "shasum": "" 1669 | }, 1670 | "require": { 1671 | "php": ">=5.3.0" 1672 | }, 1673 | "type": "library", 1674 | "extra": { 1675 | "branch-alias": { 1676 | "dev-master": "1.0.x-dev" 1677 | } 1678 | }, 1679 | "autoload": { 1680 | "psr-4": { 1681 | "Psr\\Log\\": "Psr/Log/" 1682 | } 1683 | }, 1684 | "notification-url": "https://packagist.org/downloads/", 1685 | "license": [ 1686 | "MIT" 1687 | ], 1688 | "authors": [ 1689 | { 1690 | "name": "PHP-FIG", 1691 | "homepage": "http://www.php-fig.org/" 1692 | } 1693 | ], 1694 | "description": "Common interface for logging libraries", 1695 | "homepage": "https://github.com/php-fig/log", 1696 | "keywords": [ 1697 | "log", 1698 | "psr", 1699 | "psr-3" 1700 | ], 1701 | "time": "2016-10-10T12:19:37+00:00" 1702 | }, 1703 | { 1704 | "name": "psr/simple-cache", 1705 | "version": "1.0.1", 1706 | "source": { 1707 | "type": "git", 1708 | "url": "https://github.com/php-fig/simple-cache.git", 1709 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 1710 | }, 1711 | "dist": { 1712 | "type": "zip", 1713 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1714 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1715 | "shasum": "" 1716 | }, 1717 | "require": { 1718 | "php": ">=5.3.0" 1719 | }, 1720 | "type": "library", 1721 | "extra": { 1722 | "branch-alias": { 1723 | "dev-master": "1.0.x-dev" 1724 | } 1725 | }, 1726 | "autoload": { 1727 | "psr-4": { 1728 | "Psr\\SimpleCache\\": "src/" 1729 | } 1730 | }, 1731 | "notification-url": "https://packagist.org/downloads/", 1732 | "license": [ 1733 | "MIT" 1734 | ], 1735 | "authors": [ 1736 | { 1737 | "name": "PHP-FIG", 1738 | "homepage": "http://www.php-fig.org/" 1739 | } 1740 | ], 1741 | "description": "Common interfaces for simple caching", 1742 | "keywords": [ 1743 | "cache", 1744 | "caching", 1745 | "psr", 1746 | "psr-16", 1747 | "simple-cache" 1748 | ], 1749 | "time": "2017-10-23T01:57:42+00:00" 1750 | }, 1751 | { 1752 | "name": "symfony/console", 1753 | "version": "v4.1.4", 1754 | "source": { 1755 | "type": "git", 1756 | "url": "https://github.com/symfony/console.git", 1757 | "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f" 1758 | }, 1759 | "dist": { 1760 | "type": "zip", 1761 | "url": "https://api.github.com/repos/symfony/console/zipball/ca80b8ced97cf07390078b29773dc384c39eee1f", 1762 | "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f", 1763 | "shasum": "" 1764 | }, 1765 | "require": { 1766 | "php": "^7.1.3", 1767 | "symfony/polyfill-mbstring": "~1.0" 1768 | }, 1769 | "conflict": { 1770 | "symfony/dependency-injection": "<3.4", 1771 | "symfony/process": "<3.3" 1772 | }, 1773 | "require-dev": { 1774 | "psr/log": "~1.0", 1775 | "symfony/config": "~3.4|~4.0", 1776 | "symfony/dependency-injection": "~3.4|~4.0", 1777 | "symfony/event-dispatcher": "~3.4|~4.0", 1778 | "symfony/lock": "~3.4|~4.0", 1779 | "symfony/process": "~3.4|~4.0" 1780 | }, 1781 | "suggest": { 1782 | "psr/log-implementation": "For using the console logger", 1783 | "symfony/event-dispatcher": "", 1784 | "symfony/lock": "", 1785 | "symfony/process": "" 1786 | }, 1787 | "type": "library", 1788 | "extra": { 1789 | "branch-alias": { 1790 | "dev-master": "4.1-dev" 1791 | } 1792 | }, 1793 | "autoload": { 1794 | "psr-4": { 1795 | "Symfony\\Component\\Console\\": "" 1796 | }, 1797 | "exclude-from-classmap": [ 1798 | "/Tests/" 1799 | ] 1800 | }, 1801 | "notification-url": "https://packagist.org/downloads/", 1802 | "license": [ 1803 | "MIT" 1804 | ], 1805 | "authors": [ 1806 | { 1807 | "name": "Fabien Potencier", 1808 | "email": "fabien@symfony.com" 1809 | }, 1810 | { 1811 | "name": "Symfony Community", 1812 | "homepage": "https://symfony.com/contributors" 1813 | } 1814 | ], 1815 | "description": "Symfony Console Component", 1816 | "homepage": "https://symfony.com", 1817 | "time": "2018-07-26T11:24:31+00:00" 1818 | }, 1819 | { 1820 | "name": "symfony/debug", 1821 | "version": "v4.1.4", 1822 | "source": { 1823 | "type": "git", 1824 | "url": "https://github.com/symfony/debug.git", 1825 | "reference": "47ead688f1f2877f3f14219670f52e4722ee7052" 1826 | }, 1827 | "dist": { 1828 | "type": "zip", 1829 | "url": "https://api.github.com/repos/symfony/debug/zipball/47ead688f1f2877f3f14219670f52e4722ee7052", 1830 | "reference": "47ead688f1f2877f3f14219670f52e4722ee7052", 1831 | "shasum": "" 1832 | }, 1833 | "require": { 1834 | "php": "^7.1.3", 1835 | "psr/log": "~1.0" 1836 | }, 1837 | "conflict": { 1838 | "symfony/http-kernel": "<3.4" 1839 | }, 1840 | "require-dev": { 1841 | "symfony/http-kernel": "~3.4|~4.0" 1842 | }, 1843 | "type": "library", 1844 | "extra": { 1845 | "branch-alias": { 1846 | "dev-master": "4.1-dev" 1847 | } 1848 | }, 1849 | "autoload": { 1850 | "psr-4": { 1851 | "Symfony\\Component\\Debug\\": "" 1852 | }, 1853 | "exclude-from-classmap": [ 1854 | "/Tests/" 1855 | ] 1856 | }, 1857 | "notification-url": "https://packagist.org/downloads/", 1858 | "license": [ 1859 | "MIT" 1860 | ], 1861 | "authors": [ 1862 | { 1863 | "name": "Fabien Potencier", 1864 | "email": "fabien@symfony.com" 1865 | }, 1866 | { 1867 | "name": "Symfony Community", 1868 | "homepage": "https://symfony.com/contributors" 1869 | } 1870 | ], 1871 | "description": "Symfony Debug Component", 1872 | "homepage": "https://symfony.com", 1873 | "time": "2018-08-03T11:13:38+00:00" 1874 | }, 1875 | { 1876 | "name": "symfony/finder", 1877 | "version": "v4.1.4", 1878 | "source": { 1879 | "type": "git", 1880 | "url": "https://github.com/symfony/finder.git", 1881 | "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068" 1882 | }, 1883 | "dist": { 1884 | "type": "zip", 1885 | "url": "https://api.github.com/repos/symfony/finder/zipball/e162f1df3102d0b7472805a5a9d5db9fcf0a8068", 1886 | "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068", 1887 | "shasum": "" 1888 | }, 1889 | "require": { 1890 | "php": "^7.1.3" 1891 | }, 1892 | "type": "library", 1893 | "extra": { 1894 | "branch-alias": { 1895 | "dev-master": "4.1-dev" 1896 | } 1897 | }, 1898 | "autoload": { 1899 | "psr-4": { 1900 | "Symfony\\Component\\Finder\\": "" 1901 | }, 1902 | "exclude-from-classmap": [ 1903 | "/Tests/" 1904 | ] 1905 | }, 1906 | "notification-url": "https://packagist.org/downloads/", 1907 | "license": [ 1908 | "MIT" 1909 | ], 1910 | "authors": [ 1911 | { 1912 | "name": "Fabien Potencier", 1913 | "email": "fabien@symfony.com" 1914 | }, 1915 | { 1916 | "name": "Symfony Community", 1917 | "homepage": "https://symfony.com/contributors" 1918 | } 1919 | ], 1920 | "description": "Symfony Finder Component", 1921 | "homepage": "https://symfony.com", 1922 | "time": "2018-07-26T11:24:31+00:00" 1923 | }, 1924 | { 1925 | "name": "symfony/polyfill-mbstring", 1926 | "version": "v1.9.0", 1927 | "source": { 1928 | "type": "git", 1929 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1930 | "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" 1931 | }, 1932 | "dist": { 1933 | "type": "zip", 1934 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", 1935 | "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", 1936 | "shasum": "" 1937 | }, 1938 | "require": { 1939 | "php": ">=5.3.3" 1940 | }, 1941 | "suggest": { 1942 | "ext-mbstring": "For best performance" 1943 | }, 1944 | "type": "library", 1945 | "extra": { 1946 | "branch-alias": { 1947 | "dev-master": "1.9-dev" 1948 | } 1949 | }, 1950 | "autoload": { 1951 | "psr-4": { 1952 | "Symfony\\Polyfill\\Mbstring\\": "" 1953 | }, 1954 | "files": [ 1955 | "bootstrap.php" 1956 | ] 1957 | }, 1958 | "notification-url": "https://packagist.org/downloads/", 1959 | "license": [ 1960 | "MIT" 1961 | ], 1962 | "authors": [ 1963 | { 1964 | "name": "Nicolas Grekas", 1965 | "email": "p@tchwork.com" 1966 | }, 1967 | { 1968 | "name": "Symfony Community", 1969 | "homepage": "https://symfony.com/contributors" 1970 | } 1971 | ], 1972 | "description": "Symfony polyfill for the Mbstring extension", 1973 | "homepage": "https://symfony.com", 1974 | "keywords": [ 1975 | "compatibility", 1976 | "mbstring", 1977 | "polyfill", 1978 | "portable", 1979 | "shim" 1980 | ], 1981 | "time": "2018-08-06T14:22:27+00:00" 1982 | }, 1983 | { 1984 | "name": "symfony/polyfill-php72", 1985 | "version": "v1.9.0", 1986 | "source": { 1987 | "type": "git", 1988 | "url": "https://github.com/symfony/polyfill-php72.git", 1989 | "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae" 1990 | }, 1991 | "dist": { 1992 | "type": "zip", 1993 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/95c50420b0baed23852452a7f0c7b527303ed5ae", 1994 | "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae", 1995 | "shasum": "" 1996 | }, 1997 | "require": { 1998 | "php": ">=5.3.3" 1999 | }, 2000 | "type": "library", 2001 | "extra": { 2002 | "branch-alias": { 2003 | "dev-master": "1.9-dev" 2004 | } 2005 | }, 2006 | "autoload": { 2007 | "psr-4": { 2008 | "Symfony\\Polyfill\\Php72\\": "" 2009 | }, 2010 | "files": [ 2011 | "bootstrap.php" 2012 | ] 2013 | }, 2014 | "notification-url": "https://packagist.org/downloads/", 2015 | "license": [ 2016 | "MIT" 2017 | ], 2018 | "authors": [ 2019 | { 2020 | "name": "Nicolas Grekas", 2021 | "email": "p@tchwork.com" 2022 | }, 2023 | { 2024 | "name": "Symfony Community", 2025 | "homepage": "https://symfony.com/contributors" 2026 | } 2027 | ], 2028 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 2029 | "homepage": "https://symfony.com", 2030 | "keywords": [ 2031 | "compatibility", 2032 | "polyfill", 2033 | "portable", 2034 | "shim" 2035 | ], 2036 | "time": "2018-08-06T14:22:27+00:00" 2037 | }, 2038 | { 2039 | "name": "symfony/process", 2040 | "version": "v4.1.4", 2041 | "source": { 2042 | "type": "git", 2043 | "url": "https://github.com/symfony/process.git", 2044 | "reference": "86cdb930a6a855b0ab35fb60c1504cb36184f843" 2045 | }, 2046 | "dist": { 2047 | "type": "zip", 2048 | "url": "https://api.github.com/repos/symfony/process/zipball/86cdb930a6a855b0ab35fb60c1504cb36184f843", 2049 | "reference": "86cdb930a6a855b0ab35fb60c1504cb36184f843", 2050 | "shasum": "" 2051 | }, 2052 | "require": { 2053 | "php": "^7.1.3" 2054 | }, 2055 | "type": "library", 2056 | "extra": { 2057 | "branch-alias": { 2058 | "dev-master": "4.1-dev" 2059 | } 2060 | }, 2061 | "autoload": { 2062 | "psr-4": { 2063 | "Symfony\\Component\\Process\\": "" 2064 | }, 2065 | "exclude-from-classmap": [ 2066 | "/Tests/" 2067 | ] 2068 | }, 2069 | "notification-url": "https://packagist.org/downloads/", 2070 | "license": [ 2071 | "MIT" 2072 | ], 2073 | "authors": [ 2074 | { 2075 | "name": "Fabien Potencier", 2076 | "email": "fabien@symfony.com" 2077 | }, 2078 | { 2079 | "name": "Symfony Community", 2080 | "homepage": "https://symfony.com/contributors" 2081 | } 2082 | ], 2083 | "description": "Symfony Process Component", 2084 | "homepage": "https://symfony.com", 2085 | "time": "2018-08-03T11:13:38+00:00" 2086 | }, 2087 | { 2088 | "name": "symfony/translation", 2089 | "version": "v4.1.4", 2090 | "source": { 2091 | "type": "git", 2092 | "url": "https://github.com/symfony/translation.git", 2093 | "reference": "fa2182669f7983b7aa5f1a770d053f79f0ef144f" 2094 | }, 2095 | "dist": { 2096 | "type": "zip", 2097 | "url": "https://api.github.com/repos/symfony/translation/zipball/fa2182669f7983b7aa5f1a770d053f79f0ef144f", 2098 | "reference": "fa2182669f7983b7aa5f1a770d053f79f0ef144f", 2099 | "shasum": "" 2100 | }, 2101 | "require": { 2102 | "php": "^7.1.3", 2103 | "symfony/polyfill-mbstring": "~1.0" 2104 | }, 2105 | "conflict": { 2106 | "symfony/config": "<3.4", 2107 | "symfony/dependency-injection": "<3.4", 2108 | "symfony/yaml": "<3.4" 2109 | }, 2110 | "require-dev": { 2111 | "psr/log": "~1.0", 2112 | "symfony/config": "~3.4|~4.0", 2113 | "symfony/console": "~3.4|~4.0", 2114 | "symfony/dependency-injection": "~3.4|~4.0", 2115 | "symfony/finder": "~2.8|~3.0|~4.0", 2116 | "symfony/intl": "~3.4|~4.0", 2117 | "symfony/yaml": "~3.4|~4.0" 2118 | }, 2119 | "suggest": { 2120 | "psr/log-implementation": "To use logging capability in translator", 2121 | "symfony/config": "", 2122 | "symfony/yaml": "" 2123 | }, 2124 | "type": "library", 2125 | "extra": { 2126 | "branch-alias": { 2127 | "dev-master": "4.1-dev" 2128 | } 2129 | }, 2130 | "autoload": { 2131 | "psr-4": { 2132 | "Symfony\\Component\\Translation\\": "" 2133 | }, 2134 | "exclude-from-classmap": [ 2135 | "/Tests/" 2136 | ] 2137 | }, 2138 | "notification-url": "https://packagist.org/downloads/", 2139 | "license": [ 2140 | "MIT" 2141 | ], 2142 | "authors": [ 2143 | { 2144 | "name": "Fabien Potencier", 2145 | "email": "fabien@symfony.com" 2146 | }, 2147 | { 2148 | "name": "Symfony Community", 2149 | "homepage": "https://symfony.com/contributors" 2150 | } 2151 | ], 2152 | "description": "Symfony Translation Component", 2153 | "homepage": "https://symfony.com", 2154 | "time": "2018-08-07T12:45:11+00:00" 2155 | }, 2156 | { 2157 | "name": "symfony/var-dumper", 2158 | "version": "v4.1.4", 2159 | "source": { 2160 | "type": "git", 2161 | "url": "https://github.com/symfony/var-dumper.git", 2162 | "reference": "a05426e27294bba7b0226ffc17dd01a3c6ef9777" 2163 | }, 2164 | "dist": { 2165 | "type": "zip", 2166 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a05426e27294bba7b0226ffc17dd01a3c6ef9777", 2167 | "reference": "a05426e27294bba7b0226ffc17dd01a3c6ef9777", 2168 | "shasum": "" 2169 | }, 2170 | "require": { 2171 | "php": "^7.1.3", 2172 | "symfony/polyfill-mbstring": "~1.0", 2173 | "symfony/polyfill-php72": "~1.5" 2174 | }, 2175 | "conflict": { 2176 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 2177 | "symfony/console": "<3.4" 2178 | }, 2179 | "require-dev": { 2180 | "ext-iconv": "*", 2181 | "symfony/process": "~3.4|~4.0", 2182 | "twig/twig": "~1.34|~2.4" 2183 | }, 2184 | "suggest": { 2185 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", 2186 | "ext-intl": "To show region name in time zone dump", 2187 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" 2188 | }, 2189 | "bin": [ 2190 | "Resources/bin/var-dump-server" 2191 | ], 2192 | "type": "library", 2193 | "extra": { 2194 | "branch-alias": { 2195 | "dev-master": "4.1-dev" 2196 | } 2197 | }, 2198 | "autoload": { 2199 | "files": [ 2200 | "Resources/functions/dump.php" 2201 | ], 2202 | "psr-4": { 2203 | "Symfony\\Component\\VarDumper\\": "" 2204 | }, 2205 | "exclude-from-classmap": [ 2206 | "/Tests/" 2207 | ] 2208 | }, 2209 | "notification-url": "https://packagist.org/downloads/", 2210 | "license": [ 2211 | "MIT" 2212 | ], 2213 | "authors": [ 2214 | { 2215 | "name": "Nicolas Grekas", 2216 | "email": "p@tchwork.com" 2217 | }, 2218 | { 2219 | "name": "Symfony Community", 2220 | "homepage": "https://symfony.com/contributors" 2221 | } 2222 | ], 2223 | "description": "Symfony mechanism for exploring and dumping PHP variables", 2224 | "homepage": "https://symfony.com", 2225 | "keywords": [ 2226 | "debug", 2227 | "dump" 2228 | ], 2229 | "time": "2018-08-02T09:24:26+00:00" 2230 | }, 2231 | { 2232 | "name": "vlucas/phpdotenv", 2233 | "version": "v2.5.1", 2234 | "source": { 2235 | "type": "git", 2236 | "url": "https://github.com/vlucas/phpdotenv.git", 2237 | "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e" 2238 | }, 2239 | "dist": { 2240 | "type": "zip", 2241 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", 2242 | "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", 2243 | "shasum": "" 2244 | }, 2245 | "require": { 2246 | "php": ">=5.3.9" 2247 | }, 2248 | "require-dev": { 2249 | "phpunit/phpunit": "^4.8.35 || ^5.0" 2250 | }, 2251 | "type": "library", 2252 | "extra": { 2253 | "branch-alias": { 2254 | "dev-master": "2.5-dev" 2255 | } 2256 | }, 2257 | "autoload": { 2258 | "psr-4": { 2259 | "Dotenv\\": "src/" 2260 | } 2261 | }, 2262 | "notification-url": "https://packagist.org/downloads/", 2263 | "license": [ 2264 | "BSD-3-Clause" 2265 | ], 2266 | "authors": [ 2267 | { 2268 | "name": "Vance Lucas", 2269 | "email": "vance@vancelucas.com", 2270 | "homepage": "http://www.vancelucas.com" 2271 | } 2272 | ], 2273 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 2274 | "keywords": [ 2275 | "dotenv", 2276 | "env", 2277 | "environment" 2278 | ], 2279 | "time": "2018-07-29T20:33:41+00:00" 2280 | } 2281 | ], 2282 | "packages-dev": [ 2283 | { 2284 | "name": "doctrine/instantiator", 2285 | "version": "1.1.0", 2286 | "source": { 2287 | "type": "git", 2288 | "url": "https://github.com/doctrine/instantiator.git", 2289 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 2290 | }, 2291 | "dist": { 2292 | "type": "zip", 2293 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 2294 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 2295 | "shasum": "" 2296 | }, 2297 | "require": { 2298 | "php": "^7.1" 2299 | }, 2300 | "require-dev": { 2301 | "athletic/athletic": "~0.1.8", 2302 | "ext-pdo": "*", 2303 | "ext-phar": "*", 2304 | "phpunit/phpunit": "^6.2.3", 2305 | "squizlabs/php_codesniffer": "^3.0.2" 2306 | }, 2307 | "type": "library", 2308 | "extra": { 2309 | "branch-alias": { 2310 | "dev-master": "1.2.x-dev" 2311 | } 2312 | }, 2313 | "autoload": { 2314 | "psr-4": { 2315 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 2316 | } 2317 | }, 2318 | "notification-url": "https://packagist.org/downloads/", 2319 | "license": [ 2320 | "MIT" 2321 | ], 2322 | "authors": [ 2323 | { 2324 | "name": "Marco Pivetta", 2325 | "email": "ocramius@gmail.com", 2326 | "homepage": "http://ocramius.github.com/" 2327 | } 2328 | ], 2329 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 2330 | "homepage": "https://github.com/doctrine/instantiator", 2331 | "keywords": [ 2332 | "constructor", 2333 | "instantiate" 2334 | ], 2335 | "time": "2017-07-22T11:58:36+00:00" 2336 | }, 2337 | { 2338 | "name": "hamcrest/hamcrest-php", 2339 | "version": "v2.0.0", 2340 | "source": { 2341 | "type": "git", 2342 | "url": "https://github.com/hamcrest/hamcrest-php.git", 2343 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" 2344 | }, 2345 | "dist": { 2346 | "type": "zip", 2347 | "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", 2348 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", 2349 | "shasum": "" 2350 | }, 2351 | "require": { 2352 | "php": "^5.3|^7.0" 2353 | }, 2354 | "replace": { 2355 | "cordoval/hamcrest-php": "*", 2356 | "davedevelopment/hamcrest-php": "*", 2357 | "kodova/hamcrest-php": "*" 2358 | }, 2359 | "require-dev": { 2360 | "phpunit/php-file-iterator": "1.3.3", 2361 | "phpunit/phpunit": "~4.0", 2362 | "satooshi/php-coveralls": "^1.0" 2363 | }, 2364 | "type": "library", 2365 | "extra": { 2366 | "branch-alias": { 2367 | "dev-master": "2.0-dev" 2368 | } 2369 | }, 2370 | "autoload": { 2371 | "classmap": [ 2372 | "hamcrest" 2373 | ] 2374 | }, 2375 | "notification-url": "https://packagist.org/downloads/", 2376 | "license": [ 2377 | "BSD" 2378 | ], 2379 | "description": "This is the PHP port of Hamcrest Matchers", 2380 | "keywords": [ 2381 | "test" 2382 | ], 2383 | "time": "2016-01-20T08:20:44+00:00" 2384 | }, 2385 | { 2386 | "name": "mockery/mockery", 2387 | "version": "1.1.0", 2388 | "source": { 2389 | "type": "git", 2390 | "url": "https://github.com/mockery/mockery.git", 2391 | "reference": "99e29d3596b16dabe4982548527d5ddf90232e99" 2392 | }, 2393 | "dist": { 2394 | "type": "zip", 2395 | "url": "https://api.github.com/repos/mockery/mockery/zipball/99e29d3596b16dabe4982548527d5ddf90232e99", 2396 | "reference": "99e29d3596b16dabe4982548527d5ddf90232e99", 2397 | "shasum": "" 2398 | }, 2399 | "require": { 2400 | "hamcrest/hamcrest-php": "~2.0", 2401 | "lib-pcre": ">=7.0", 2402 | "php": ">=5.6.0" 2403 | }, 2404 | "require-dev": { 2405 | "phpdocumentor/phpdocumentor": "^2.9", 2406 | "phpunit/phpunit": "~5.7.10|~6.5" 2407 | }, 2408 | "type": "library", 2409 | "extra": { 2410 | "branch-alias": { 2411 | "dev-master": "1.0.x-dev" 2412 | } 2413 | }, 2414 | "autoload": { 2415 | "psr-0": { 2416 | "Mockery": "library/" 2417 | } 2418 | }, 2419 | "notification-url": "https://packagist.org/downloads/", 2420 | "license": [ 2421 | "BSD-3-Clause" 2422 | ], 2423 | "authors": [ 2424 | { 2425 | "name": "Pádraic Brady", 2426 | "email": "padraic.brady@gmail.com", 2427 | "homepage": "http://blog.astrumfutura.com" 2428 | }, 2429 | { 2430 | "name": "Dave Marshall", 2431 | "email": "dave.marshall@atstsolutions.co.uk", 2432 | "homepage": "http://davedevelopment.co.uk" 2433 | } 2434 | ], 2435 | "description": "Mockery is a simple yet flexible PHP mock object framework", 2436 | "homepage": "https://github.com/mockery/mockery", 2437 | "keywords": [ 2438 | "BDD", 2439 | "TDD", 2440 | "library", 2441 | "mock", 2442 | "mock objects", 2443 | "mockery", 2444 | "stub", 2445 | "test", 2446 | "test double", 2447 | "testing" 2448 | ], 2449 | "time": "2018-05-08T08:54:48+00:00" 2450 | }, 2451 | { 2452 | "name": "myclabs/deep-copy", 2453 | "version": "1.8.1", 2454 | "source": { 2455 | "type": "git", 2456 | "url": "https://github.com/myclabs/DeepCopy.git", 2457 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" 2458 | }, 2459 | "dist": { 2460 | "type": "zip", 2461 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 2462 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 2463 | "shasum": "" 2464 | }, 2465 | "require": { 2466 | "php": "^7.1" 2467 | }, 2468 | "replace": { 2469 | "myclabs/deep-copy": "self.version" 2470 | }, 2471 | "require-dev": { 2472 | "doctrine/collections": "^1.0", 2473 | "doctrine/common": "^2.6", 2474 | "phpunit/phpunit": "^7.1" 2475 | }, 2476 | "type": "library", 2477 | "autoload": { 2478 | "psr-4": { 2479 | "DeepCopy\\": "src/DeepCopy/" 2480 | }, 2481 | "files": [ 2482 | "src/DeepCopy/deep_copy.php" 2483 | ] 2484 | }, 2485 | "notification-url": "https://packagist.org/downloads/", 2486 | "license": [ 2487 | "MIT" 2488 | ], 2489 | "description": "Create deep copies (clones) of your objects", 2490 | "keywords": [ 2491 | "clone", 2492 | "copy", 2493 | "duplicate", 2494 | "object", 2495 | "object graph" 2496 | ], 2497 | "time": "2018-06-11T23:09:50+00:00" 2498 | }, 2499 | { 2500 | "name": "phar-io/manifest", 2501 | "version": "1.0.3", 2502 | "source": { 2503 | "type": "git", 2504 | "url": "https://github.com/phar-io/manifest.git", 2505 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 2506 | }, 2507 | "dist": { 2508 | "type": "zip", 2509 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 2510 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 2511 | "shasum": "" 2512 | }, 2513 | "require": { 2514 | "ext-dom": "*", 2515 | "ext-phar": "*", 2516 | "phar-io/version": "^2.0", 2517 | "php": "^5.6 || ^7.0" 2518 | }, 2519 | "type": "library", 2520 | "extra": { 2521 | "branch-alias": { 2522 | "dev-master": "1.0.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": "Arne Blankerts", 2537 | "email": "arne@blankerts.de", 2538 | "role": "Developer" 2539 | }, 2540 | { 2541 | "name": "Sebastian Heuer", 2542 | "email": "sebastian@phpeople.de", 2543 | "role": "Developer" 2544 | }, 2545 | { 2546 | "name": "Sebastian Bergmann", 2547 | "email": "sebastian@phpunit.de", 2548 | "role": "Developer" 2549 | } 2550 | ], 2551 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 2552 | "time": "2018-07-08T19:23:20+00:00" 2553 | }, 2554 | { 2555 | "name": "phar-io/version", 2556 | "version": "2.0.1", 2557 | "source": { 2558 | "type": "git", 2559 | "url": "https://github.com/phar-io/version.git", 2560 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 2561 | }, 2562 | "dist": { 2563 | "type": "zip", 2564 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 2565 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 2566 | "shasum": "" 2567 | }, 2568 | "require": { 2569 | "php": "^5.6 || ^7.0" 2570 | }, 2571 | "type": "library", 2572 | "autoload": { 2573 | "classmap": [ 2574 | "src/" 2575 | ] 2576 | }, 2577 | "notification-url": "https://packagist.org/downloads/", 2578 | "license": [ 2579 | "BSD-3-Clause" 2580 | ], 2581 | "authors": [ 2582 | { 2583 | "name": "Arne Blankerts", 2584 | "email": "arne@blankerts.de", 2585 | "role": "Developer" 2586 | }, 2587 | { 2588 | "name": "Sebastian Heuer", 2589 | "email": "sebastian@phpeople.de", 2590 | "role": "Developer" 2591 | }, 2592 | { 2593 | "name": "Sebastian Bergmann", 2594 | "email": "sebastian@phpunit.de", 2595 | "role": "Developer" 2596 | } 2597 | ], 2598 | "description": "Library for handling version information and constraints", 2599 | "time": "2018-07-08T19:19:57+00:00" 2600 | }, 2601 | { 2602 | "name": "phpdocumentor/reflection-common", 2603 | "version": "1.0.1", 2604 | "source": { 2605 | "type": "git", 2606 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 2607 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 2608 | }, 2609 | "dist": { 2610 | "type": "zip", 2611 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 2612 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 2613 | "shasum": "" 2614 | }, 2615 | "require": { 2616 | "php": ">=5.5" 2617 | }, 2618 | "require-dev": { 2619 | "phpunit/phpunit": "^4.6" 2620 | }, 2621 | "type": "library", 2622 | "extra": { 2623 | "branch-alias": { 2624 | "dev-master": "1.0.x-dev" 2625 | } 2626 | }, 2627 | "autoload": { 2628 | "psr-4": { 2629 | "phpDocumentor\\Reflection\\": [ 2630 | "src" 2631 | ] 2632 | } 2633 | }, 2634 | "notification-url": "https://packagist.org/downloads/", 2635 | "license": [ 2636 | "MIT" 2637 | ], 2638 | "authors": [ 2639 | { 2640 | "name": "Jaap van Otterdijk", 2641 | "email": "opensource@ijaap.nl" 2642 | } 2643 | ], 2644 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 2645 | "homepage": "http://www.phpdoc.org", 2646 | "keywords": [ 2647 | "FQSEN", 2648 | "phpDocumentor", 2649 | "phpdoc", 2650 | "reflection", 2651 | "static analysis" 2652 | ], 2653 | "time": "2017-09-11T18:02:19+00:00" 2654 | }, 2655 | { 2656 | "name": "phpdocumentor/reflection-docblock", 2657 | "version": "4.3.0", 2658 | "source": { 2659 | "type": "git", 2660 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 2661 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08" 2662 | }, 2663 | "dist": { 2664 | "type": "zip", 2665 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", 2666 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08", 2667 | "shasum": "" 2668 | }, 2669 | "require": { 2670 | "php": "^7.0", 2671 | "phpdocumentor/reflection-common": "^1.0.0", 2672 | "phpdocumentor/type-resolver": "^0.4.0", 2673 | "webmozart/assert": "^1.0" 2674 | }, 2675 | "require-dev": { 2676 | "doctrine/instantiator": "~1.0.5", 2677 | "mockery/mockery": "^1.0", 2678 | "phpunit/phpunit": "^6.4" 2679 | }, 2680 | "type": "library", 2681 | "extra": { 2682 | "branch-alias": { 2683 | "dev-master": "4.x-dev" 2684 | } 2685 | }, 2686 | "autoload": { 2687 | "psr-4": { 2688 | "phpDocumentor\\Reflection\\": [ 2689 | "src/" 2690 | ] 2691 | } 2692 | }, 2693 | "notification-url": "https://packagist.org/downloads/", 2694 | "license": [ 2695 | "MIT" 2696 | ], 2697 | "authors": [ 2698 | { 2699 | "name": "Mike van Riel", 2700 | "email": "me@mikevanriel.com" 2701 | } 2702 | ], 2703 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 2704 | "time": "2017-11-30T07:14:17+00:00" 2705 | }, 2706 | { 2707 | "name": "phpdocumentor/type-resolver", 2708 | "version": "0.4.0", 2709 | "source": { 2710 | "type": "git", 2711 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 2712 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 2713 | }, 2714 | "dist": { 2715 | "type": "zip", 2716 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 2717 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 2718 | "shasum": "" 2719 | }, 2720 | "require": { 2721 | "php": "^5.5 || ^7.0", 2722 | "phpdocumentor/reflection-common": "^1.0" 2723 | }, 2724 | "require-dev": { 2725 | "mockery/mockery": "^0.9.4", 2726 | "phpunit/phpunit": "^5.2||^4.8.24" 2727 | }, 2728 | "type": "library", 2729 | "extra": { 2730 | "branch-alias": { 2731 | "dev-master": "1.0.x-dev" 2732 | } 2733 | }, 2734 | "autoload": { 2735 | "psr-4": { 2736 | "phpDocumentor\\Reflection\\": [ 2737 | "src/" 2738 | ] 2739 | } 2740 | }, 2741 | "notification-url": "https://packagist.org/downloads/", 2742 | "license": [ 2743 | "MIT" 2744 | ], 2745 | "authors": [ 2746 | { 2747 | "name": "Mike van Riel", 2748 | "email": "me@mikevanriel.com" 2749 | } 2750 | ], 2751 | "time": "2017-07-14T14:27:02+00:00" 2752 | }, 2753 | { 2754 | "name": "phpspec/prophecy", 2755 | "version": "1.8.0", 2756 | "source": { 2757 | "type": "git", 2758 | "url": "https://github.com/phpspec/prophecy.git", 2759 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" 2760 | }, 2761 | "dist": { 2762 | "type": "zip", 2763 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 2764 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 2765 | "shasum": "" 2766 | }, 2767 | "require": { 2768 | "doctrine/instantiator": "^1.0.2", 2769 | "php": "^5.3|^7.0", 2770 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 2771 | "sebastian/comparator": "^1.1|^2.0|^3.0", 2772 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 2773 | }, 2774 | "require-dev": { 2775 | "phpspec/phpspec": "^2.5|^3.2", 2776 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 2777 | }, 2778 | "type": "library", 2779 | "extra": { 2780 | "branch-alias": { 2781 | "dev-master": "1.8.x-dev" 2782 | } 2783 | }, 2784 | "autoload": { 2785 | "psr-0": { 2786 | "Prophecy\\": "src/" 2787 | } 2788 | }, 2789 | "notification-url": "https://packagist.org/downloads/", 2790 | "license": [ 2791 | "MIT" 2792 | ], 2793 | "authors": [ 2794 | { 2795 | "name": "Konstantin Kudryashov", 2796 | "email": "ever.zet@gmail.com", 2797 | "homepage": "http://everzet.com" 2798 | }, 2799 | { 2800 | "name": "Marcello Duarte", 2801 | "email": "marcello.duarte@gmail.com" 2802 | } 2803 | ], 2804 | "description": "Highly opinionated mocking framework for PHP 5.3+", 2805 | "homepage": "https://github.com/phpspec/prophecy", 2806 | "keywords": [ 2807 | "Double", 2808 | "Dummy", 2809 | "fake", 2810 | "mock", 2811 | "spy", 2812 | "stub" 2813 | ], 2814 | "time": "2018-08-05T17:53:17+00:00" 2815 | }, 2816 | { 2817 | "name": "phpunit/php-code-coverage", 2818 | "version": "6.0.7", 2819 | "source": { 2820 | "type": "git", 2821 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 2822 | "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a" 2823 | }, 2824 | "dist": { 2825 | "type": "zip", 2826 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a", 2827 | "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a", 2828 | "shasum": "" 2829 | }, 2830 | "require": { 2831 | "ext-dom": "*", 2832 | "ext-xmlwriter": "*", 2833 | "php": "^7.1", 2834 | "phpunit/php-file-iterator": "^2.0", 2835 | "phpunit/php-text-template": "^1.2.1", 2836 | "phpunit/php-token-stream": "^3.0", 2837 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 2838 | "sebastian/environment": "^3.1", 2839 | "sebastian/version": "^2.0.1", 2840 | "theseer/tokenizer": "^1.1" 2841 | }, 2842 | "require-dev": { 2843 | "phpunit/phpunit": "^7.0" 2844 | }, 2845 | "suggest": { 2846 | "ext-xdebug": "^2.6.0" 2847 | }, 2848 | "type": "library", 2849 | "extra": { 2850 | "branch-alias": { 2851 | "dev-master": "6.0-dev" 2852 | } 2853 | }, 2854 | "autoload": { 2855 | "classmap": [ 2856 | "src/" 2857 | ] 2858 | }, 2859 | "notification-url": "https://packagist.org/downloads/", 2860 | "license": [ 2861 | "BSD-3-Clause" 2862 | ], 2863 | "authors": [ 2864 | { 2865 | "name": "Sebastian Bergmann", 2866 | "email": "sebastian@phpunit.de", 2867 | "role": "lead" 2868 | } 2869 | ], 2870 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2871 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2872 | "keywords": [ 2873 | "coverage", 2874 | "testing", 2875 | "xunit" 2876 | ], 2877 | "time": "2018-06-01T07:51:50+00:00" 2878 | }, 2879 | { 2880 | "name": "phpunit/php-file-iterator", 2881 | "version": "2.0.2", 2882 | "source": { 2883 | "type": "git", 2884 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2885 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 2886 | }, 2887 | "dist": { 2888 | "type": "zip", 2889 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 2890 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 2891 | "shasum": "" 2892 | }, 2893 | "require": { 2894 | "php": "^7.1" 2895 | }, 2896 | "require-dev": { 2897 | "phpunit/phpunit": "^7.1" 2898 | }, 2899 | "type": "library", 2900 | "extra": { 2901 | "branch-alias": { 2902 | "dev-master": "2.0.x-dev" 2903 | } 2904 | }, 2905 | "autoload": { 2906 | "classmap": [ 2907 | "src/" 2908 | ] 2909 | }, 2910 | "notification-url": "https://packagist.org/downloads/", 2911 | "license": [ 2912 | "BSD-3-Clause" 2913 | ], 2914 | "authors": [ 2915 | { 2916 | "name": "Sebastian Bergmann", 2917 | "email": "sebastian@phpunit.de", 2918 | "role": "lead" 2919 | } 2920 | ], 2921 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2922 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2923 | "keywords": [ 2924 | "filesystem", 2925 | "iterator" 2926 | ], 2927 | "time": "2018-09-13T20:33:42+00:00" 2928 | }, 2929 | { 2930 | "name": "phpunit/php-text-template", 2931 | "version": "1.2.1", 2932 | "source": { 2933 | "type": "git", 2934 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2935 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2936 | }, 2937 | "dist": { 2938 | "type": "zip", 2939 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2940 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2941 | "shasum": "" 2942 | }, 2943 | "require": { 2944 | "php": ">=5.3.3" 2945 | }, 2946 | "type": "library", 2947 | "autoload": { 2948 | "classmap": [ 2949 | "src/" 2950 | ] 2951 | }, 2952 | "notification-url": "https://packagist.org/downloads/", 2953 | "license": [ 2954 | "BSD-3-Clause" 2955 | ], 2956 | "authors": [ 2957 | { 2958 | "name": "Sebastian Bergmann", 2959 | "email": "sebastian@phpunit.de", 2960 | "role": "lead" 2961 | } 2962 | ], 2963 | "description": "Simple template engine.", 2964 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2965 | "keywords": [ 2966 | "template" 2967 | ], 2968 | "time": "2015-06-21T13:50:34+00:00" 2969 | }, 2970 | { 2971 | "name": "phpunit/php-timer", 2972 | "version": "2.0.0", 2973 | "source": { 2974 | "type": "git", 2975 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2976 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" 2977 | }, 2978 | "dist": { 2979 | "type": "zip", 2980 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", 2981 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", 2982 | "shasum": "" 2983 | }, 2984 | "require": { 2985 | "php": "^7.1" 2986 | }, 2987 | "require-dev": { 2988 | "phpunit/phpunit": "^7.0" 2989 | }, 2990 | "type": "library", 2991 | "extra": { 2992 | "branch-alias": { 2993 | "dev-master": "2.0-dev" 2994 | } 2995 | }, 2996 | "autoload": { 2997 | "classmap": [ 2998 | "src/" 2999 | ] 3000 | }, 3001 | "notification-url": "https://packagist.org/downloads/", 3002 | "license": [ 3003 | "BSD-3-Clause" 3004 | ], 3005 | "authors": [ 3006 | { 3007 | "name": "Sebastian Bergmann", 3008 | "email": "sebastian@phpunit.de", 3009 | "role": "lead" 3010 | } 3011 | ], 3012 | "description": "Utility class for timing", 3013 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 3014 | "keywords": [ 3015 | "timer" 3016 | ], 3017 | "time": "2018-02-01T13:07:23+00:00" 3018 | }, 3019 | { 3020 | "name": "phpunit/php-token-stream", 3021 | "version": "3.0.0", 3022 | "source": { 3023 | "type": "git", 3024 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 3025 | "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" 3026 | }, 3027 | "dist": { 3028 | "type": "zip", 3029 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", 3030 | "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", 3031 | "shasum": "" 3032 | }, 3033 | "require": { 3034 | "ext-tokenizer": "*", 3035 | "php": "^7.1" 3036 | }, 3037 | "require-dev": { 3038 | "phpunit/phpunit": "^7.0" 3039 | }, 3040 | "type": "library", 3041 | "extra": { 3042 | "branch-alias": { 3043 | "dev-master": "3.0-dev" 3044 | } 3045 | }, 3046 | "autoload": { 3047 | "classmap": [ 3048 | "src/" 3049 | ] 3050 | }, 3051 | "notification-url": "https://packagist.org/downloads/", 3052 | "license": [ 3053 | "BSD-3-Clause" 3054 | ], 3055 | "authors": [ 3056 | { 3057 | "name": "Sebastian Bergmann", 3058 | "email": "sebastian@phpunit.de" 3059 | } 3060 | ], 3061 | "description": "Wrapper around PHP's tokenizer extension.", 3062 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 3063 | "keywords": [ 3064 | "tokenizer" 3065 | ], 3066 | "time": "2018-02-01T13:16:43+00:00" 3067 | }, 3068 | { 3069 | "name": "phpunit/phpunit", 3070 | "version": "7.3.5", 3071 | "source": { 3072 | "type": "git", 3073 | "url": "https://github.com/sebastianbergmann/phpunit.git", 3074 | "reference": "7b331efabbb628c518c408fdfcaf571156775de2" 3075 | }, 3076 | "dist": { 3077 | "type": "zip", 3078 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7b331efabbb628c518c408fdfcaf571156775de2", 3079 | "reference": "7b331efabbb628c518c408fdfcaf571156775de2", 3080 | "shasum": "" 3081 | }, 3082 | "require": { 3083 | "doctrine/instantiator": "^1.1", 3084 | "ext-dom": "*", 3085 | "ext-json": "*", 3086 | "ext-libxml": "*", 3087 | "ext-mbstring": "*", 3088 | "ext-xml": "*", 3089 | "myclabs/deep-copy": "^1.7", 3090 | "phar-io/manifest": "^1.0.2", 3091 | "phar-io/version": "^2.0", 3092 | "php": "^7.1", 3093 | "phpspec/prophecy": "^1.7", 3094 | "phpunit/php-code-coverage": "^6.0.7", 3095 | "phpunit/php-file-iterator": "^2.0.1", 3096 | "phpunit/php-text-template": "^1.2.1", 3097 | "phpunit/php-timer": "^2.0", 3098 | "sebastian/comparator": "^3.0", 3099 | "sebastian/diff": "^3.0", 3100 | "sebastian/environment": "^3.1", 3101 | "sebastian/exporter": "^3.1", 3102 | "sebastian/global-state": "^2.0", 3103 | "sebastian/object-enumerator": "^3.0.3", 3104 | "sebastian/resource-operations": "^1.0", 3105 | "sebastian/version": "^2.0.1" 3106 | }, 3107 | "conflict": { 3108 | "phpunit/phpunit-mock-objects": "*" 3109 | }, 3110 | "require-dev": { 3111 | "ext-pdo": "*" 3112 | }, 3113 | "suggest": { 3114 | "ext-soap": "*", 3115 | "ext-xdebug": "*", 3116 | "phpunit/php-invoker": "^2.0" 3117 | }, 3118 | "bin": [ 3119 | "phpunit" 3120 | ], 3121 | "type": "library", 3122 | "extra": { 3123 | "branch-alias": { 3124 | "dev-master": "7.3-dev" 3125 | } 3126 | }, 3127 | "autoload": { 3128 | "classmap": [ 3129 | "src/" 3130 | ] 3131 | }, 3132 | "notification-url": "https://packagist.org/downloads/", 3133 | "license": [ 3134 | "BSD-3-Clause" 3135 | ], 3136 | "authors": [ 3137 | { 3138 | "name": "Sebastian Bergmann", 3139 | "email": "sebastian@phpunit.de", 3140 | "role": "lead" 3141 | } 3142 | ], 3143 | "description": "The PHP Unit Testing framework.", 3144 | "homepage": "https://phpunit.de/", 3145 | "keywords": [ 3146 | "phpunit", 3147 | "testing", 3148 | "xunit" 3149 | ], 3150 | "time": "2018-09-08T15:14:29+00:00" 3151 | }, 3152 | { 3153 | "name": "sebastian/code-unit-reverse-lookup", 3154 | "version": "1.0.1", 3155 | "source": { 3156 | "type": "git", 3157 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 3158 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 3159 | }, 3160 | "dist": { 3161 | "type": "zip", 3162 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 3163 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 3164 | "shasum": "" 3165 | }, 3166 | "require": { 3167 | "php": "^5.6 || ^7.0" 3168 | }, 3169 | "require-dev": { 3170 | "phpunit/phpunit": "^5.7 || ^6.0" 3171 | }, 3172 | "type": "library", 3173 | "extra": { 3174 | "branch-alias": { 3175 | "dev-master": "1.0.x-dev" 3176 | } 3177 | }, 3178 | "autoload": { 3179 | "classmap": [ 3180 | "src/" 3181 | ] 3182 | }, 3183 | "notification-url": "https://packagist.org/downloads/", 3184 | "license": [ 3185 | "BSD-3-Clause" 3186 | ], 3187 | "authors": [ 3188 | { 3189 | "name": "Sebastian Bergmann", 3190 | "email": "sebastian@phpunit.de" 3191 | } 3192 | ], 3193 | "description": "Looks up which function or method a line of code belongs to", 3194 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 3195 | "time": "2017-03-04T06:30:41+00:00" 3196 | }, 3197 | { 3198 | "name": "sebastian/comparator", 3199 | "version": "3.0.2", 3200 | "source": { 3201 | "type": "git", 3202 | "url": "https://github.com/sebastianbergmann/comparator.git", 3203 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 3204 | }, 3205 | "dist": { 3206 | "type": "zip", 3207 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 3208 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 3209 | "shasum": "" 3210 | }, 3211 | "require": { 3212 | "php": "^7.1", 3213 | "sebastian/diff": "^3.0", 3214 | "sebastian/exporter": "^3.1" 3215 | }, 3216 | "require-dev": { 3217 | "phpunit/phpunit": "^7.1" 3218 | }, 3219 | "type": "library", 3220 | "extra": { 3221 | "branch-alias": { 3222 | "dev-master": "3.0-dev" 3223 | } 3224 | }, 3225 | "autoload": { 3226 | "classmap": [ 3227 | "src/" 3228 | ] 3229 | }, 3230 | "notification-url": "https://packagist.org/downloads/", 3231 | "license": [ 3232 | "BSD-3-Clause" 3233 | ], 3234 | "authors": [ 3235 | { 3236 | "name": "Jeff Welch", 3237 | "email": "whatthejeff@gmail.com" 3238 | }, 3239 | { 3240 | "name": "Volker Dusch", 3241 | "email": "github@wallbash.com" 3242 | }, 3243 | { 3244 | "name": "Bernhard Schussek", 3245 | "email": "bschussek@2bepublished.at" 3246 | }, 3247 | { 3248 | "name": "Sebastian Bergmann", 3249 | "email": "sebastian@phpunit.de" 3250 | } 3251 | ], 3252 | "description": "Provides the functionality to compare PHP values for equality", 3253 | "homepage": "https://github.com/sebastianbergmann/comparator", 3254 | "keywords": [ 3255 | "comparator", 3256 | "compare", 3257 | "equality" 3258 | ], 3259 | "time": "2018-07-12T15:12:46+00:00" 3260 | }, 3261 | { 3262 | "name": "sebastian/diff", 3263 | "version": "3.0.1", 3264 | "source": { 3265 | "type": "git", 3266 | "url": "https://github.com/sebastianbergmann/diff.git", 3267 | "reference": "366541b989927187c4ca70490a35615d3fef2dce" 3268 | }, 3269 | "dist": { 3270 | "type": "zip", 3271 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", 3272 | "reference": "366541b989927187c4ca70490a35615d3fef2dce", 3273 | "shasum": "" 3274 | }, 3275 | "require": { 3276 | "php": "^7.1" 3277 | }, 3278 | "require-dev": { 3279 | "phpunit/phpunit": "^7.0", 3280 | "symfony/process": "^2 || ^3.3 || ^4" 3281 | }, 3282 | "type": "library", 3283 | "extra": { 3284 | "branch-alias": { 3285 | "dev-master": "3.0-dev" 3286 | } 3287 | }, 3288 | "autoload": { 3289 | "classmap": [ 3290 | "src/" 3291 | ] 3292 | }, 3293 | "notification-url": "https://packagist.org/downloads/", 3294 | "license": [ 3295 | "BSD-3-Clause" 3296 | ], 3297 | "authors": [ 3298 | { 3299 | "name": "Kore Nordmann", 3300 | "email": "mail@kore-nordmann.de" 3301 | }, 3302 | { 3303 | "name": "Sebastian Bergmann", 3304 | "email": "sebastian@phpunit.de" 3305 | } 3306 | ], 3307 | "description": "Diff implementation", 3308 | "homepage": "https://github.com/sebastianbergmann/diff", 3309 | "keywords": [ 3310 | "diff", 3311 | "udiff", 3312 | "unidiff", 3313 | "unified diff" 3314 | ], 3315 | "time": "2018-06-10T07:54:39+00:00" 3316 | }, 3317 | { 3318 | "name": "sebastian/environment", 3319 | "version": "3.1.0", 3320 | "source": { 3321 | "type": "git", 3322 | "url": "https://github.com/sebastianbergmann/environment.git", 3323 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" 3324 | }, 3325 | "dist": { 3326 | "type": "zip", 3327 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 3328 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 3329 | "shasum": "" 3330 | }, 3331 | "require": { 3332 | "php": "^7.0" 3333 | }, 3334 | "require-dev": { 3335 | "phpunit/phpunit": "^6.1" 3336 | }, 3337 | "type": "library", 3338 | "extra": { 3339 | "branch-alias": { 3340 | "dev-master": "3.1.x-dev" 3341 | } 3342 | }, 3343 | "autoload": { 3344 | "classmap": [ 3345 | "src/" 3346 | ] 3347 | }, 3348 | "notification-url": "https://packagist.org/downloads/", 3349 | "license": [ 3350 | "BSD-3-Clause" 3351 | ], 3352 | "authors": [ 3353 | { 3354 | "name": "Sebastian Bergmann", 3355 | "email": "sebastian@phpunit.de" 3356 | } 3357 | ], 3358 | "description": "Provides functionality to handle HHVM/PHP environments", 3359 | "homepage": "http://www.github.com/sebastianbergmann/environment", 3360 | "keywords": [ 3361 | "Xdebug", 3362 | "environment", 3363 | "hhvm" 3364 | ], 3365 | "time": "2017-07-01T08:51:00+00:00" 3366 | }, 3367 | { 3368 | "name": "sebastian/exporter", 3369 | "version": "3.1.0", 3370 | "source": { 3371 | "type": "git", 3372 | "url": "https://github.com/sebastianbergmann/exporter.git", 3373 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" 3374 | }, 3375 | "dist": { 3376 | "type": "zip", 3377 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", 3378 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", 3379 | "shasum": "" 3380 | }, 3381 | "require": { 3382 | "php": "^7.0", 3383 | "sebastian/recursion-context": "^3.0" 3384 | }, 3385 | "require-dev": { 3386 | "ext-mbstring": "*", 3387 | "phpunit/phpunit": "^6.0" 3388 | }, 3389 | "type": "library", 3390 | "extra": { 3391 | "branch-alias": { 3392 | "dev-master": "3.1.x-dev" 3393 | } 3394 | }, 3395 | "autoload": { 3396 | "classmap": [ 3397 | "src/" 3398 | ] 3399 | }, 3400 | "notification-url": "https://packagist.org/downloads/", 3401 | "license": [ 3402 | "BSD-3-Clause" 3403 | ], 3404 | "authors": [ 3405 | { 3406 | "name": "Jeff Welch", 3407 | "email": "whatthejeff@gmail.com" 3408 | }, 3409 | { 3410 | "name": "Volker Dusch", 3411 | "email": "github@wallbash.com" 3412 | }, 3413 | { 3414 | "name": "Bernhard Schussek", 3415 | "email": "bschussek@2bepublished.at" 3416 | }, 3417 | { 3418 | "name": "Sebastian Bergmann", 3419 | "email": "sebastian@phpunit.de" 3420 | }, 3421 | { 3422 | "name": "Adam Harvey", 3423 | "email": "aharvey@php.net" 3424 | } 3425 | ], 3426 | "description": "Provides the functionality to export PHP variables for visualization", 3427 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 3428 | "keywords": [ 3429 | "export", 3430 | "exporter" 3431 | ], 3432 | "time": "2017-04-03T13:19:02+00:00" 3433 | }, 3434 | { 3435 | "name": "sebastian/global-state", 3436 | "version": "2.0.0", 3437 | "source": { 3438 | "type": "git", 3439 | "url": "https://github.com/sebastianbergmann/global-state.git", 3440 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 3441 | }, 3442 | "dist": { 3443 | "type": "zip", 3444 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 3445 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 3446 | "shasum": "" 3447 | }, 3448 | "require": { 3449 | "php": "^7.0" 3450 | }, 3451 | "require-dev": { 3452 | "phpunit/phpunit": "^6.0" 3453 | }, 3454 | "suggest": { 3455 | "ext-uopz": "*" 3456 | }, 3457 | "type": "library", 3458 | "extra": { 3459 | "branch-alias": { 3460 | "dev-master": "2.0-dev" 3461 | } 3462 | }, 3463 | "autoload": { 3464 | "classmap": [ 3465 | "src/" 3466 | ] 3467 | }, 3468 | "notification-url": "https://packagist.org/downloads/", 3469 | "license": [ 3470 | "BSD-3-Clause" 3471 | ], 3472 | "authors": [ 3473 | { 3474 | "name": "Sebastian Bergmann", 3475 | "email": "sebastian@phpunit.de" 3476 | } 3477 | ], 3478 | "description": "Snapshotting of global state", 3479 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 3480 | "keywords": [ 3481 | "global state" 3482 | ], 3483 | "time": "2017-04-27T15:39:26+00:00" 3484 | }, 3485 | { 3486 | "name": "sebastian/object-enumerator", 3487 | "version": "3.0.3", 3488 | "source": { 3489 | "type": "git", 3490 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 3491 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 3492 | }, 3493 | "dist": { 3494 | "type": "zip", 3495 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 3496 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 3497 | "shasum": "" 3498 | }, 3499 | "require": { 3500 | "php": "^7.0", 3501 | "sebastian/object-reflector": "^1.1.1", 3502 | "sebastian/recursion-context": "^3.0" 3503 | }, 3504 | "require-dev": { 3505 | "phpunit/phpunit": "^6.0" 3506 | }, 3507 | "type": "library", 3508 | "extra": { 3509 | "branch-alias": { 3510 | "dev-master": "3.0.x-dev" 3511 | } 3512 | }, 3513 | "autoload": { 3514 | "classmap": [ 3515 | "src/" 3516 | ] 3517 | }, 3518 | "notification-url": "https://packagist.org/downloads/", 3519 | "license": [ 3520 | "BSD-3-Clause" 3521 | ], 3522 | "authors": [ 3523 | { 3524 | "name": "Sebastian Bergmann", 3525 | "email": "sebastian@phpunit.de" 3526 | } 3527 | ], 3528 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 3529 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 3530 | "time": "2017-08-03T12:35:26+00:00" 3531 | }, 3532 | { 3533 | "name": "sebastian/object-reflector", 3534 | "version": "1.1.1", 3535 | "source": { 3536 | "type": "git", 3537 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 3538 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 3539 | }, 3540 | "dist": { 3541 | "type": "zip", 3542 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 3543 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 3544 | "shasum": "" 3545 | }, 3546 | "require": { 3547 | "php": "^7.0" 3548 | }, 3549 | "require-dev": { 3550 | "phpunit/phpunit": "^6.0" 3551 | }, 3552 | "type": "library", 3553 | "extra": { 3554 | "branch-alias": { 3555 | "dev-master": "1.1-dev" 3556 | } 3557 | }, 3558 | "autoload": { 3559 | "classmap": [ 3560 | "src/" 3561 | ] 3562 | }, 3563 | "notification-url": "https://packagist.org/downloads/", 3564 | "license": [ 3565 | "BSD-3-Clause" 3566 | ], 3567 | "authors": [ 3568 | { 3569 | "name": "Sebastian Bergmann", 3570 | "email": "sebastian@phpunit.de" 3571 | } 3572 | ], 3573 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 3574 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 3575 | "time": "2017-03-29T09:07:27+00:00" 3576 | }, 3577 | { 3578 | "name": "sebastian/recursion-context", 3579 | "version": "3.0.0", 3580 | "source": { 3581 | "type": "git", 3582 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 3583 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 3584 | }, 3585 | "dist": { 3586 | "type": "zip", 3587 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 3588 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 3589 | "shasum": "" 3590 | }, 3591 | "require": { 3592 | "php": "^7.0" 3593 | }, 3594 | "require-dev": { 3595 | "phpunit/phpunit": "^6.0" 3596 | }, 3597 | "type": "library", 3598 | "extra": { 3599 | "branch-alias": { 3600 | "dev-master": "3.0.x-dev" 3601 | } 3602 | }, 3603 | "autoload": { 3604 | "classmap": [ 3605 | "src/" 3606 | ] 3607 | }, 3608 | "notification-url": "https://packagist.org/downloads/", 3609 | "license": [ 3610 | "BSD-3-Clause" 3611 | ], 3612 | "authors": [ 3613 | { 3614 | "name": "Jeff Welch", 3615 | "email": "whatthejeff@gmail.com" 3616 | }, 3617 | { 3618 | "name": "Sebastian Bergmann", 3619 | "email": "sebastian@phpunit.de" 3620 | }, 3621 | { 3622 | "name": "Adam Harvey", 3623 | "email": "aharvey@php.net" 3624 | } 3625 | ], 3626 | "description": "Provides functionality to recursively process PHP variables", 3627 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 3628 | "time": "2017-03-03T06:23:57+00:00" 3629 | }, 3630 | { 3631 | "name": "sebastian/resource-operations", 3632 | "version": "1.0.0", 3633 | "source": { 3634 | "type": "git", 3635 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 3636 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 3637 | }, 3638 | "dist": { 3639 | "type": "zip", 3640 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3641 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3642 | "shasum": "" 3643 | }, 3644 | "require": { 3645 | "php": ">=5.6.0" 3646 | }, 3647 | "type": "library", 3648 | "extra": { 3649 | "branch-alias": { 3650 | "dev-master": "1.0.x-dev" 3651 | } 3652 | }, 3653 | "autoload": { 3654 | "classmap": [ 3655 | "src/" 3656 | ] 3657 | }, 3658 | "notification-url": "https://packagist.org/downloads/", 3659 | "license": [ 3660 | "BSD-3-Clause" 3661 | ], 3662 | "authors": [ 3663 | { 3664 | "name": "Sebastian Bergmann", 3665 | "email": "sebastian@phpunit.de" 3666 | } 3667 | ], 3668 | "description": "Provides a list of PHP built-in functions that operate on resources", 3669 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 3670 | "time": "2015-07-28T20:34:47+00:00" 3671 | }, 3672 | { 3673 | "name": "sebastian/version", 3674 | "version": "2.0.1", 3675 | "source": { 3676 | "type": "git", 3677 | "url": "https://github.com/sebastianbergmann/version.git", 3678 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 3679 | }, 3680 | "dist": { 3681 | "type": "zip", 3682 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 3683 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 3684 | "shasum": "" 3685 | }, 3686 | "require": { 3687 | "php": ">=5.6" 3688 | }, 3689 | "type": "library", 3690 | "extra": { 3691 | "branch-alias": { 3692 | "dev-master": "2.0.x-dev" 3693 | } 3694 | }, 3695 | "autoload": { 3696 | "classmap": [ 3697 | "src/" 3698 | ] 3699 | }, 3700 | "notification-url": "https://packagist.org/downloads/", 3701 | "license": [ 3702 | "BSD-3-Clause" 3703 | ], 3704 | "authors": [ 3705 | { 3706 | "name": "Sebastian Bergmann", 3707 | "email": "sebastian@phpunit.de", 3708 | "role": "lead" 3709 | } 3710 | ], 3711 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3712 | "homepage": "https://github.com/sebastianbergmann/version", 3713 | "time": "2016-10-03T07:35:21+00:00" 3714 | }, 3715 | { 3716 | "name": "theseer/tokenizer", 3717 | "version": "1.1.0", 3718 | "source": { 3719 | "type": "git", 3720 | "url": "https://github.com/theseer/tokenizer.git", 3721 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" 3722 | }, 3723 | "dist": { 3724 | "type": "zip", 3725 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", 3726 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", 3727 | "shasum": "" 3728 | }, 3729 | "require": { 3730 | "ext-dom": "*", 3731 | "ext-tokenizer": "*", 3732 | "ext-xmlwriter": "*", 3733 | "php": "^7.0" 3734 | }, 3735 | "type": "library", 3736 | "autoload": { 3737 | "classmap": [ 3738 | "src/" 3739 | ] 3740 | }, 3741 | "notification-url": "https://packagist.org/downloads/", 3742 | "license": [ 3743 | "BSD-3-Clause" 3744 | ], 3745 | "authors": [ 3746 | { 3747 | "name": "Arne Blankerts", 3748 | "email": "arne@blankerts.de", 3749 | "role": "Developer" 3750 | } 3751 | ], 3752 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3753 | "time": "2017-04-07T12:08:54+00:00" 3754 | }, 3755 | { 3756 | "name": "webmozart/assert", 3757 | "version": "1.3.0", 3758 | "source": { 3759 | "type": "git", 3760 | "url": "https://github.com/webmozart/assert.git", 3761 | "reference": "0df1908962e7a3071564e857d86874dad1ef204a" 3762 | }, 3763 | "dist": { 3764 | "type": "zip", 3765 | "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", 3766 | "reference": "0df1908962e7a3071564e857d86874dad1ef204a", 3767 | "shasum": "" 3768 | }, 3769 | "require": { 3770 | "php": "^5.3.3 || ^7.0" 3771 | }, 3772 | "require-dev": { 3773 | "phpunit/phpunit": "^4.6", 3774 | "sebastian/version": "^1.0.1" 3775 | }, 3776 | "type": "library", 3777 | "extra": { 3778 | "branch-alias": { 3779 | "dev-master": "1.3-dev" 3780 | } 3781 | }, 3782 | "autoload": { 3783 | "psr-4": { 3784 | "Webmozart\\Assert\\": "src/" 3785 | } 3786 | }, 3787 | "notification-url": "https://packagist.org/downloads/", 3788 | "license": [ 3789 | "MIT" 3790 | ], 3791 | "authors": [ 3792 | { 3793 | "name": "Bernhard Schussek", 3794 | "email": "bschussek@gmail.com" 3795 | } 3796 | ], 3797 | "description": "Assertions to validate method input/output with nice error messages.", 3798 | "keywords": [ 3799 | "assert", 3800 | "check", 3801 | "validate" 3802 | ], 3803 | "time": "2018-01-29T19:49:41+00:00" 3804 | } 3805 | ], 3806 | "aliases": [], 3807 | "minimum-stability": "dev", 3808 | "stability-flags": [], 3809 | "prefer-stable": true, 3810 | "prefer-lowest": false, 3811 | "platform": { 3812 | "php": "^7.1.3" 3813 | }, 3814 | "platform-dev": [], 3815 | "platform-overrides": { 3816 | "ext-posix": "0" 3817 | } 3818 | } 3819 | --------------------------------------------------------------------------------