├── 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 |
--------------------------------------------------------------------------------