Laravel 5.6 updates

Travis config update

Removed HHVM script as Laravel no longer support HHVM after releasing 5.3
This commit is contained in:
Manish Verma
2018-08-06 20:08:55 +05:30
parent 126fbb0255
commit 1ac0f42a58
2464 changed files with 65239 additions and 46734 deletions

View File

@@ -3,9 +3,8 @@ language: php
# Versions of PHP you want your project run with. # Versions of PHP you want your project run with.
php: php:
- 5.5 - 7.1
- 5.6 - 7.2
- hhvm
# Commands to be run before your environment runs. # Commands to be run before your environment runs.
before_script: before_script:
@@ -20,7 +19,6 @@ script: phpunit
matrix: matrix:
allow_failures: allow_failures:
- php: 5.5 - php: 5.5
- php: hhvm
fast_finish: true fast_finish: true
# Customize when the notification emails are sent. # Customize when the notification emails are sent.

View File

@@ -8,7 +8,8 @@
"license": "MIT", "license": "MIT",
"type": "project", "type": "project",
"require": { "require": {
"laravel/framework": "5.5.*", "php": ">=7.1.3",
"laravel/framework": "5.6.*",
"laravelcollective/html": "5.*", "laravelcollective/html": "5.*",
"vsmoraes/laravel-pdf": "1.0.1", "vsmoraes/laravel-pdf": "1.0.1",
"propaganistas/laravel-phone": "~2.0", "propaganistas/laravel-phone": "~2.0",
@@ -19,11 +20,10 @@
"chumper/datatable": "dev-develop", "chumper/datatable": "dev-develop",
"chumper/zipper": "1.0.x", "chumper/zipper": "1.0.x",
"tymon/jwt-auth": "dev-develop", "tymon/jwt-auth": "dev-develop",
"php": ">=5.5.9",
"davejamesmiller/laravel-breadcrumbs": "^3.0", "davejamesmiller/laravel-breadcrumbs": "^3.0",
"davibennun/laravel-push-notification": "dev-laravel5", "davibennun/laravel-push-notification": "dev-laravel5",
"brozot/laravel-fcm": "^1.0", "brozot/laravel-fcm": "^1.0",
"barryvdh/laravel-debugbar": "^2.2", "barryvdh/laravel-debugbar": "3.1.*",
"aws/aws-sdk-php": "~3.0", "aws/aws-sdk-php": "~3.0",
"predis/predis": "~1.0", "predis/predis": "~1.0",
"mremi/url-shortener": "^1.0", "mremi/url-shortener": "^1.0",
@@ -38,13 +38,13 @@
"doctrine/dbal": "^2.5" "doctrine/dbal": "^2.5"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~6.0", "phpunit/phpunit": "~7.0",
"phpspec/phpspec": "~2.1", "phpspec/phpspec": "^4.0",
"symfony/dom-crawler": "3.1.*", "symfony/dom-crawler": "3.1.*",
"symfony/css-selector": "3.1.*", "symfony/css-selector": "3.1.*",
"fzaninotto/faker": "1.*", "fzaninotto/faker": "1.*",
"filp/whoops": "~2.0", "filp/whoops": "~2.0",
"laravel/dusk": "2.0.0" "laravel/dusk": "~3.0"
}, },
"autoload": { "autoload": {
"classmap": [ "classmap": [
@@ -57,8 +57,7 @@
}, },
"autoload-dev": { "autoload-dev": {
"classmap": [ "classmap": [
"tests/TestCase.php", "tests/TestCase.php"
"tests/DuskTestCase.php"
] ]
}, },
"extra": { "extra": {
@@ -70,12 +69,10 @@
}, },
"scripts": { "scripts": {
"post-install-cmd": [ "post-install-cmd": [
"php artisan clear-compiled", "php artisan clear-compiled"
"php artisan optimize"
], ],
"post-update-cmd": [ "post-update-cmd": [
"php artisan clear-compiled", "php artisan clear-compiled"
"php artisan optimize"
], ],
"post-create-project-cmd": [ "post-create-project-cmd": [
"php -r \"copy('.env.example', '.env');\"", "php -r \"copy('.env.example', '.env');\"",

853
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
Copyright (C) 2013-2014 Barry vd. Heuvel Copyright (C) 2013-present Barry vd. Heuvel
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@@ -16,4 +16,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@@ -10,10 +10,13 @@
} }
], ],
"require": { "require": {
"php": ">=5.5.9", "php": ">=7.0",
"illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*", "maximebf/debugbar": "~1.15.0",
"symfony/finder": "~2.7|~3.0", "illuminate/routing": "5.5.x|5.6.x",
"maximebf/debugbar": "~1.13.0" "illuminate/session": "5.5.x|5.6.x",
"illuminate/support": "5.5.x|5.6.x",
"symfony/debug": "^3|^4",
"symfony/finder": "^3|^4"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@@ -22,5 +25,23 @@
"files": [ "files": [
"src/helpers.php" "src/helpers.php"
] ]
},
"minimum-stability": "dev",
"prefer-stable": true,
"extra": {
"branch-alias": {
"dev-master": "3.2-dev"
},
"laravel": {
"providers": [
"Barryvdh\\Debugbar\\ServiceProvider"
],
"aliases": {
"Debugbar": "Barryvdh\\Debugbar\\Facade"
}
}
},
"require-dev": {
"illuminate/framework": "5.5.x"
} }
} }

View File

@@ -9,10 +9,15 @@ return [
| |
| Debugbar is enabled by default, when debug is set to true in app.php. | Debugbar is enabled by default, when debug is set to true in app.php.
| You can override the value by setting enable to true or false instead of null. | You can override the value by setting enable to true or false instead of null.
|
| You can provide an array of URI's that must be ignored (eg. 'api/*')
| |
*/ */
'enabled' => env('DEBUGBAR_ENABLED', null), 'enabled' => env('DEBUGBAR_ENABLED', null),
'except' => [
//
],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@@ -116,6 +121,7 @@ return [
'logs' => false, // Add the latest log messages 'logs' => false, // Add the latest log messages
'files' => false, // Show the included files 'files' => false, // Show the included files
'config' => false, // Display config settings 'config' => false, // Display config settings
'cache' => false, // Display cache events
], ],
/* /*
@@ -153,6 +159,9 @@ return [
'logs' => [ 'logs' => [
'file' => null 'file' => null
], ],
'cache' => [
'values' => true // collect cache values
],
], ],
/* /*

View File

@@ -3,7 +3,9 @@
[![Latest Stable Version](https://poser.pugx.org/barryvdh/laravel-debugbar/version.png)](https://packagist.org/packages/barryvdh/laravel-debugbar) [![Latest Stable Version](https://poser.pugx.org/barryvdh/laravel-debugbar/version.png)](https://packagist.org/packages/barryvdh/laravel-debugbar)
[![Total Downloads](https://poser.pugx.org/barryvdh/laravel-debugbar/d/total.png)](https://packagist.org/packages/barryvdh/laravel-debugbar) [![Total Downloads](https://poser.pugx.org/barryvdh/laravel-debugbar/d/total.png)](https://packagist.org/packages/barryvdh/laravel-debugbar)
### For Laravel 4, please use the [1.8 branch](https://github.com/barryvdh/laravel-debugbar/tree/1.8)! ### Note for v3: Debugbar is now enabled by requiring the package, but still needs APP_DEBUG=true by default!
### For Laravel < 5.5, please use the [2.4 branch](https://github.com/barryvdh/laravel-debugbar/tree/2.4)!
This is a package to integrate [PHP Debug Bar](http://phpdebugbar.com/) with Laravel 5. This is a package to integrate [PHP Debug Bar](http://phpdebugbar.com/) with Laravel 5.
It includes a ServiceProvider to register the debugbar and attach it to the output. You can publish assets and configure it through Laravel. It includes a ServiceProvider to register the debugbar and attach it to the output. You can publish assets and configure it through Laravel.
@@ -25,6 +27,7 @@ This package includes some custom collectors:
- LogsCollector: Show the latest log entries from the storage logs. (disabled by default) - LogsCollector: Show the latest log entries from the storage logs. (disabled by default)
- FilesCollector: Show the files that are included/required by PHP. (disabled by default) - FilesCollector: Show the files that are included/required by PHP. (disabled by default)
- ConfigCollector: Display the values from the config files. (disabled by default) - ConfigCollector: Display the values from the config files. (disabled by default)
- CacheCollector: Display all cache events. (disabled by default)
Bootstraps the following collectors for Laravel: Bootstraps the following collectors for Laravel:
- LogCollector: Show all Log messages - LogCollector: Show all Log messages
@@ -41,17 +44,21 @@ It also provides a Facade interface for easy logging Messages, Exceptions and Ti
## Installation ## Installation
Require this package with composer: Require this package with composer. It is recommended to only require the package for development.
```shell ```shell
composer require barryvdh/laravel-debugbar composer require barryvdh/laravel-debugbar --dev
``` ```
After updating composer, add the ServiceProvider to the providers array in config/app.php Laravel 5.5 uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider.
The Debugbar will be enabled when `APP_DEBUG` is `true`.
> If you use a catch-all/fallback route, make sure you load the Debugbar ServiceProvider before your own App ServiceProviders. > If you use a catch-all/fallback route, make sure you load the Debugbar ServiceProvider before your own App ServiceProviders.
### Laravel 5.x: ### Laravel 5.5+:
If you don't use auto-discovery, add the ServiceProvider to the providers array in config/app.php
```php ```php
Barryvdh\Debugbar\ServiceProvider::class, Barryvdh\Debugbar\ServiceProvider::class,
@@ -63,7 +70,7 @@ If you want to use the facade to log messages, add this to your facades in app.p
'Debugbar' => Barryvdh\Debugbar\Facade::class, 'Debugbar' => Barryvdh\Debugbar\Facade::class,
``` ```
The profiler is enabled by default, if you have app.debug=true. You can override that in the config (`debugbar.enabled`). See more options in `config/debugbar.php` The profiler is enabled by default, if you have APP_DEBUG=true. You can override that in the config (`debugbar.enabled`) or by setting `DEBUGBAR_ENABLED` in your `.env`. See more options in `config/debugbar.php`
You can also set in your config if you want to include/exclude the vendor files also (FontAwesome, Highlight.js and jQuery). If you already use them in your site, set it to false. You can also set in your config if you want to include/exclude the vendor files also (FontAwesome, Highlight.js and jQuery). If you already use them in your site, set it to false.
You can also only display the js or css vendors, by setting it to 'js' or 'css'. (Highlight.js requires both css + js, so set to `true` for syntax highlighting) You can also only display the js or css vendors, by setting it to 'js' or 'css'. (Highlight.js requires both css + js, so set to `true` for syntax highlighting)

View File

@@ -16,7 +16,7 @@ class ClearCommand extends Command
parent::__construct(); parent::__construct();
} }
public function fire() public function handle()
{ {
$this->debugbar->boot(); $this->debugbar->boot();

View File

@@ -1,39 +0,0 @@
<?php
namespace Barryvdh\Debugbar\Console;
use Illuminate\Console\Command;
/**
* Publish the Debugbar assets to the public directory
*
* @author Barry vd. Heuvel <barryvdh@gmail.com>
* @deprecated No longer needed because of the AssetController
*/
class PublishCommand extends Command
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'debugbar:publish';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Publish the Debugbar assets';
/**
* Execute the console command.
*
* @return void
*/
public function fire()
{
$this->info(
'NOTICE: Since laravel-debugbar 1.7.x, publishing assets is no longer necessary. The assets in public/packages/barryvdh/laravel-debugbar and maximebf/php-debugbar can be safely removed.'
);
}
}

View File

@@ -35,4 +35,4 @@ if (class_exists('Illuminate\Routing\Controller')) {
} }
} }
} }
} }

View File

@@ -0,0 +1,27 @@
<?php namespace Barryvdh\Debugbar\Controllers;
use Illuminate\Http\Response;
class CacheController extends BaseController
{
/**
* Forget a cache key
*
*/
public function delete($key, $tags = '')
{
$cache = app('cache');
if (!empty($tags)) {
$tags = json_decode($tags, true);
$cache = $cache->tags($tags);
} else {
unset($tags);
}
$success = $cache->forget($key);
return response()->json(compact('success'));
}
}

View File

@@ -6,17 +6,10 @@ use Illuminate\Http\Response;
class OpenHandlerController extends BaseController class OpenHandlerController extends BaseController
{ {
public function handle() public function handle()
{ {
$debugbar = $this->debugbar; $openHandler = new OpenHandler($this->debugbar);
if (!$debugbar->isEnabled()) {
$this->app->abort('500', 'Debugbar is not enabled');
}
$openHandler = new OpenHandler($debugbar);
$data = $openHandler->handle(null, false, false); $data = $openHandler->handle(null, false, false);
return new Response( return new Response(
@@ -40,14 +33,7 @@ class OpenHandlerController extends BaseController
'id' => $id, 'id' => $id,
]; ];
$debugbar = $this->debugbar; $openHandler = new OpenHandler($this->debugbar);
if (!$debugbar->isEnabled()) {
$this->app->abort('500', 'Debugbar is not enabled');
}
$openHandler = new OpenHandler($debugbar);
$data = $openHandler->handle($request, false, false); $data = $openHandler->handle($request, false, false);
// Convert to Clockwork // Convert to Clockwork

View File

@@ -1,115 +0,0 @@
<?php
namespace Barryvdh\Debugbar\DataCollector;
use DebugBar\DataCollector\DataCollector;
use DebugBar\DataCollector\Renderable;
use Illuminate\Contracts\Support\Arrayable;
/**
* Collector for Laravel's Auth provider
*/
class AuthCollector extends DataCollector implements Renderable
{
/** @var \Illuminate\Auth\AuthManager */
protected $auth;
/** @var bool */
protected $showName = false;
/**
* @param \Illuminate\Auth\AuthManager $auth
*/
public function __construct($auth)
{
$this->auth = $auth;
}
/**
* Set to show the users name/email
* @param bool $showName
*/
public function setShowName($showName)
{
$this->showName = (bool) $showName;
}
/**
* @{inheritDoc}
*/
public function collect()
{
try {
$user = $this->auth->user();
} catch (\Exception $e) {
$user = null;
}
return $this->getUserInformation($user);
}
/**
* Get displayed user information
* @param \Illuminate\Auth\UserInterface $user
* @return array
*/
protected function getUserInformation($user = null)
{
// Defaults
if (is_null($user)) {
return [
'name' => 'Guest',
'user' => ['guest' => true],
];
}
// The default auth identifer is the ID number, which isn't all that
// useful. Try username and email.
$identifier = $user->getAuthIdentifier();
if (is_numeric($identifier)) {
try {
if ($user->username) {
$identifier = $user->username;
} elseif ($user->email) {
$identifier = $user->email;
}
} catch (\Exception $e) {
}
}
return [
'name' => $identifier,
'user' => $user instanceof Arrayable ? $user->toArray() : $user,
];
}
/**
* @{inheritDoc}
*/
public function getName()
{
return 'auth';
}
/**
* @{inheritDoc}
*/
public function getWidgets()
{
$widgets = [
'auth' => [
'icon' => 'lock',
'widget' => 'PhpDebugBar.Widgets.VariableListWidget',
'map' => 'auth.user',
'default' => '{}'
]
];
if ($this->showName) {
$widgets['auth.name'] = [
'icon' => 'user',
'tooltip' => 'Auth status',
'map' => 'auth.name',
'default' => '',
];
}
return $widgets;
}
}

View File

@@ -0,0 +1,95 @@
<?php
namespace Barryvdh\Debugbar\DataCollector;
use DebugBar\DataCollector\TimeDataCollector;
use Illuminate\Cache\Events\CacheEvent;
use Illuminate\Cache\Events\CacheHit;
use Illuminate\Cache\Events\CacheMissed;
use Illuminate\Cache\Events\KeyForgotten;
use Illuminate\Cache\Events\KeyWritten;
use Illuminate\Events\Dispatcher;
class CacheCollector extends TimeDataCollector
{
/** @var bool */
protected $collectValues;
/** @var array */
protected $classMap = [
CacheHit::class => 'hit',
CacheMissed::class => 'missed',
KeyWritten::class => 'written',
KeyForgotten::class => 'forgotten',
];
public function __construct($requestStartTime = null, $collectValues)
{
parent::__construct();
$this->collectValues = $collectValues;
}
public function onCacheEvent(CacheEvent $event)
{
$class = get_class($event);
$params = get_object_vars($event);
$label = $this->classMap[$class];
if (isset($params['value'])) {
if ($this->collectValues) {
$params['value'] = htmlspecialchars($this->getDataFormatter()->formatVar($event->value));
} else {
unset($params['value']);
}
}
if (!empty($params['key']) && in_array($label, ['hit', 'written'])) {
$params['delete'] = route('debugbar.cache.delete', [
'key' => urlencode($params['key']),
'tags' => !empty($params['tags']) ? json_encode($params['tags']) : '',
]);
}
$time = microtime(true);
$this->addMeasure($label . "\t" . $event->key, $time, $time, $params);
}
public function subscribe(Dispatcher $dispatcher)
{
foreach ($this->classMap as $eventClass => $type) {
$dispatcher->listen($eventClass, [$this, 'onCacheEvent']);
}
}
public function collect()
{
$data = parent::collect();
$data['nb_measures'] = count($data['measures']);
return $data;
}
public function getName()
{
return 'cache';
}
public function getWidgets()
{
return [
'cache' => [
'icon' => 'clipboard',
'widget' => 'PhpDebugBar.Widgets.LaravelCacheWidget',
'map' => 'cache',
'default' => '{}',
],
'cache:badge' => [
'map' => 'cache.nb_measures',
'default' => 'null',
],
];
}
}

View File

@@ -1,36 +1,25 @@
<?php <?php
namespace Barryvdh\Debugbar\DataCollector; namespace Barryvdh\Debugbar\DataCollector;
use Barryvdh\Debugbar\DataFormatter\SimpleFormatter;
use DebugBar\DataCollector\TimeDataCollector; use DebugBar\DataCollector\TimeDataCollector;
use Illuminate\Events\Dispatcher; use Illuminate\Events\Dispatcher;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter; use Symfony\Component\VarDumper\Cloner\VarCloner;
class EventCollector extends TimeDataCollector class EventCollector extends TimeDataCollector
{ {
/** @var Dispatcher */ /** @var Dispatcher */
protected $events; protected $events;
/** @var ValueExporter */
protected $exporter;
public function __construct($requestStartTime = null) public function __construct($requestStartTime = null)
{ {
parent::__construct($requestStartTime); parent::__construct($requestStartTime);
$this->setDataFormatter(new SimpleFormatter());
$this->exporter = new ValueExporter();
} }
public function onWildcardEvent($name = null, $data = []) public function onWildcardEvent($name = null, $data = [])
{ {
// Pre-Laravel 5.4, using 'firing' to get the current event name.
if (method_exists($this->events, 'firing')) {
$name = $this->events->firing();
// Get the arguments passed to the event
$data = func_get_args();
}
$params = $this->prepareParams($data); $params = $this->prepareParams($data);
$time = microtime(true); $time = microtime(true);
@@ -63,7 +52,7 @@ class EventCollector extends TimeDataCollector
$listener = $reflector->getName() . ' (' . $filename . ':' . $reflector->getStartLine() . '-' . $reflector->getEndLine() . ')'; $listener = $reflector->getName() . ' (' . $filename . ':' . $reflector->getStartLine() . '-' . $reflector->getEndLine() . ')';
} else { } else {
// Not sure if this is possible, but to prevent edge cases // Not sure if this is possible, but to prevent edge cases
$listener = $this->formatVar($listener); $listener = $this->getDataFormatter()->formatVar($listener);
} }
$params['listeners.' . $i] = $listener; $params['listeners.' . $i] = $listener;
@@ -84,7 +73,7 @@ class EventCollector extends TimeDataCollector
if (is_object($value) && Str::is('Illuminate\*\Events\*', get_class($value))) { if (is_object($value) && Str::is('Illuminate\*\Events\*', get_class($value))) {
$value = $this->prepareParams(get_object_vars($value)); $value = $this->prepareParams(get_object_vars($value));
} }
$data[$key] = htmlentities($this->exporter->exportValue($value), ENT_QUOTES, 'UTF-8', false); $data[$key] = htmlentities($this->getDataFormatter()->formatVar($value), ENT_QUOTES, 'UTF-8', false);
} }
return $data; return $data;

View File

@@ -4,18 +4,18 @@ namespace Barryvdh\Debugbar\DataCollector;
use DebugBar\DataCollector\DataCollector; use DebugBar\DataCollector\DataCollector;
use DebugBar\DataCollector\Renderable; use DebugBar\DataCollector\Renderable;
use Illuminate\Contracts\Foundation\Application; use Illuminate\Container\Container;
class FilesCollector extends DataCollector implements Renderable class FilesCollector extends DataCollector implements Renderable
{ {
/** @var \Illuminate\Contracts\Foundation\Application */ /** @var \Illuminate\Container\Container */
protected $app; protected $app;
protected $basePath; protected $basePath;
/** /**
* @param \Illuminate\Contracts\Foundation\Application $app * @param \Illuminate\Container\Container $app
*/ */
public function __construct(Application $app = null) public function __construct(Container $app = null)
{ {
$this->app = $app; $this->app = $app;
$this->basePath = base_path(); $this->basePath = base_path();

View File

@@ -2,40 +2,45 @@
namespace Barryvdh\Debugbar\DataCollector; namespace Barryvdh\Debugbar\DataCollector;
use Barryvdh\Debugbar\DataFormatter\SimpleFormatter;
use DebugBar\DataCollector\MessagesCollector; use DebugBar\DataCollector\MessagesCollector;
use Illuminate\Contracts\Auth\Access\Gate; use Illuminate\Contracts\Auth\Access\Gate;
use Illuminate\Contracts\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Contracts\Auth\Authenticatable;
use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter; use Symfony\Component\VarDumper\Cloner\VarCloner;
/** /**
* Collector for Laravel's Auth provider * Collector for Laravel's Auth provider
*/ */
class GateCollector extends MessagesCollector class GateCollector extends MessagesCollector
{ {
/** @var ValueExporter */
protected $exporter;
/** /**
* @param Gate $gate * @param Gate $gate
*/ */
public function __construct(Gate $gate) public function __construct(Gate $gate)
{ {
parent::__construct('gate'); parent::__construct('gate');
$this->exporter = new ValueExporter(); $this->setDataFormatter(new SimpleFormatter());
$gate->after([$this, 'addCheck']);
if (method_exists($gate, 'after')) {
$gate->after([$this, 'addCheck']);
}
} }
public function addCheck(Authenticatable $user, $ability, $result, $arguments = []) public function addCheck(Authorizable $user = null, $ability, $result, $arguments = [])
{ {
$userKey = 'user';
$userId = null;
if ($user) {
$userKey = snake_case(class_basename($user));
$userId = $user instanceof Authenticatable ? $user->getAuthIdentifier() : $user->id;
}
$label = $result ? 'success' : 'error'; $label = $result ? 'success' : 'error';
$this->addMessage([ $this->addMessage([
'ability' => $ability, 'ability' => $ability,
'result' => $result, 'result' => $result,
'user' => $user->getAuthIdentifier(), $userKey => $userId,
'arguments' => $this->exporter->exportValue($arguments), 'arguments' => $this->getDataFormatter()->formatVar($arguments),
], $label, false); ], $label, false);
} }
} }

View File

@@ -2,28 +2,45 @@
namespace Barryvdh\Debugbar\DataCollector; namespace Barryvdh\Debugbar\DataCollector;
use DebugBar\DataCollector\DataCollector;
use DebugBar\DataCollector\Renderable;
use Illuminate\Auth\SessionGuard; use Illuminate\Auth\SessionGuard;
use Illuminate\Contracts\Auth\Guard; use Illuminate\Contracts\Auth\Guard;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Contracts\Support\Arrayable;
/** /**
* Collector for Laravel's Auth provider * Collector for Laravel's Auth provider
*/ */
class MultiAuthCollector extends AuthCollector class MultiAuthCollector extends DataCollector implements Renderable
{ {
/** @var array $guards */ /** @var array $guards */
protected $guards; protected $guards;
/** @var \Illuminate\Auth\AuthManager */
protected $auth;
/** @var bool */
protected $showName = false;
/** /**
* @param \Illuminate\Auth\AuthManager $auth * @param \Illuminate\Auth\AuthManager $auth
* @param array $guards * @param array $guards
*/ */
public function __construct($auth, $guards) public function __construct($auth, $guards)
{ {
parent::__construct($auth); $this->auth = $auth;
$this->guards = $guards; $this->guards = $guards;
} }
/**
* Set to show the users name/email
* @param bool $showName
*/
public function setShowName($showName)
{
$this->showName = (bool) $showName;
}
/** /**
* @{inheritDoc} * @{inheritDoc}
@@ -77,6 +94,49 @@ class MultiAuthCollector extends AuthCollector
return $guard->user(); return $guard->user();
} }
/**
* Get displayed user information
* @param \Illuminate\Auth\UserInterface $user
* @return array
*/
protected function getUserInformation($user = null)
{
// Defaults
if (is_null($user)) {
return [
'name' => 'Guest',
'user' => ['guest' => true],
];
}
// The default auth identifer is the ID number, which isn't all that
// useful. Try username and email.
$identifier = $user->getAuthIdentifier();
if (is_numeric($identifier)) {
try {
if ($user->username) {
$identifier = $user->username;
} elseif ($user->email) {
$identifier = $user->email;
}
} catch (\Exception $e) {
}
}
return [
'name' => $identifier,
'user' => $user instanceof Arrayable ? $user->toArray() : $user,
];
}
/**
* @{inheritDoc}
*/
public function getName()
{
return 'auth';
}
/** /**
* @{inheritDoc} * @{inheritDoc}
*/ */
@@ -102,4 +162,5 @@ class MultiAuthCollector extends AuthCollector
return $widgets; return $widgets;
} }
} }

View File

@@ -185,7 +185,7 @@ class QueryCollector extends PDOCollector
*/ */
protected function findSource() protected function findSource()
{ {
$stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT); $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT, 50);
$sources = []; $sources = [];
@@ -218,13 +218,9 @@ class QueryCollector extends PDOCollector
return $frame; return $frame;
} }
if (isset($trace['class']) && isset($trace['file']) && strpos( if (isset($trace['class']) &&
$trace['file'], isset($trace['file']) &&
DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'laravel' . DIRECTORY_SEPARATOR . 'framework' !$this->fileIsInExcludedPath($trace['file'])
) === false && strpos(
$trace['file'],
DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'barryvdh' . DIRECTORY_SEPARATOR . 'laravel-debugbar'
) === false
) { ) {
$file = $trace['file']; $file = $trace['file'];
@@ -261,6 +257,31 @@ class QueryCollector extends PDOCollector
return false; return false;
} }
/**
* Check if the given file is to be excluded from analysis
*
* @param string $file
* @return bool
*/
protected function fileIsInExcludedPath($file)
{
$excludedPaths = [
'/vendor/laravel/framework/src/Illuminate/Database',
'/vendor/laravel/framework/src/Illuminate/Events',
'/vendor/barryvdh/laravel-debugbar',
];
$normalizedPath = str_replace('\\', '/', $file);
foreach ($excludedPaths as $excludedPath) {
if (strpos($normalizedPath, $excludedPath) !== false) {
return true;
}
}
return false;
}
/** /**
* Find the middleware alias from the file. * Find the middleware alias from the file.
* *

View File

@@ -12,7 +12,7 @@ use Symfony\Component\HttpFoundation\Response;
* Based on \Symfony\Component\HttpKernel\DataCollector\RequestDataCollector by Fabien Potencier <fabien@symfony.com> * Based on \Symfony\Component\HttpKernel\DataCollector\RequestDataCollector by Fabien Potencier <fabien@symfony.com>
* *
*/ */
class SymfonyRequestCollector extends DataCollector implements DataCollectorInterface, Renderable class RequestCollector extends DataCollector implements DataCollectorInterface, Renderable
{ {
/** @var \Symfony\Component\HttpFoundation\Request $request */ /** @var \Symfony\Component\HttpFoundation\Request $request */
protected $request; protected $request;

View File

@@ -14,7 +14,7 @@ use Illuminate\Support\Facades\Config;
* https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Console/RoutesCommand.php * https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Console/RoutesCommand.php
* *
*/ */
class IlluminateRouteCollector extends DataCollector implements Renderable class RouteCollector extends DataCollector implements Renderable
{ {
/** /**
* The router instance. * The router instance.

View File

@@ -2,9 +2,10 @@
namespace Barryvdh\Debugbar\DataCollector; namespace Barryvdh\Debugbar\DataCollector;
use Barryvdh\Debugbar\DataFormatter\SimpleFormatter;
use DebugBar\Bridge\Twig\TwigCollector; use DebugBar\Bridge\Twig\TwigCollector;
use Illuminate\View\View; use Illuminate\View\View;
use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter; use Symfony\Component\VarDumper\Cloner\VarCloner;
class ViewCollector extends TwigCollector class ViewCollector extends TwigCollector
{ {
@@ -18,10 +19,10 @@ class ViewCollector extends TwigCollector
*/ */
public function __construct($collectData = true) public function __construct($collectData = true)
{ {
$this->setDataFormatter(new SimpleFormatter());
$this->collect_data = $collectData; $this->collect_data = $collectData;
$this->name = 'views'; $this->name = 'views';
$this->templates = []; $this->templates = [];
$this->exporter = new ValueExporter();
} }
public function getName() public function getName()
@@ -75,17 +76,23 @@ class ViewCollector extends TwigCollector
} else { } else {
$data = []; $data = [];
foreach ($view->getData() as $key => $value) { foreach ($view->getData() as $key => $value) {
$data[$key] = $this->exporter->exportValue($value); $data[$key] = $this->getDataFormatter()->formatVar($value);
} }
$params = $data; $params = $data;
} }
$this->templates[] = [ $template = [
'name' => $path ? sprintf('%s (%s)', $name, $path) : $name, 'name' => $path ? sprintf('%s (%s)', $name, $path) : $name,
'param_count' => count($params), 'param_count' => count($params),
'params' => $params, 'params' => $params,
'type' => $type, 'type' => $type,
]; ];
if ( $this->getXdebugLink($path)) {
$template['xdebug_link'] = $this->getXdebugLink($path);
}
$this->templates[] = $template;
} }
public function collect() public function collect()

View File

@@ -1,25 +1,25 @@
<?php <?php
/* namespace Barryvdh\Debugbar\DataFormatter;
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\HttpKernel\DataCollector\Util; use DebugBar\DataFormatter\DataFormatter;
@trigger_error('The '.__NAMESPACE__.'\ValueExporter class is deprecated since Symfony 3.2 and will be removed in 4.0. Use the VarDumper component instead.', E_USER_DEPRECATED);
/** /**
* @author Bernhard Schussek <bschussek@gmail.com> * Simple DataFormatter based on the deprecated Symfony ValueExporter
* *
* @deprecated since version 3.2, to be removed in 4.0. Use the VarDumper component instead. * @see https://github.com/symfony/symfony/blob/v3.4.4/src/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php
*/ */
class ValueExporter class SimpleFormatter extends DataFormatter
{ {
/**
* @param $data
* @return string
*/
public function formatVar($data)
{
return $this->exportValue($data);
}
/** /**
* Converts a PHP value to a string. * Converts a PHP value to a string.
* *
@@ -28,22 +28,23 @@ class ValueExporter
* @param bool $deep Only for internal usage * @param bool $deep Only for internal usage
* *
* @return string The string representation of the given value * @return string The string representation of the given value
* @author Bernhard Schussek <bschussek@gmail.com>
*/ */
public function exportValue($value, $depth = 1, $deep = false) private function exportValue($value, $depth = 1, $deep = false)
{ {
if ($value instanceof \__PHP_Incomplete_Class) { if ($value instanceof \__PHP_Incomplete_Class) {
return sprintf('__PHP_Incomplete_Class(%s)', $this->getClassNameFromIncomplete($value)); return sprintf('__PHP_Incomplete_Class(%s)', $this->getClassNameFromIncomplete($value));
} }
if (\is_object($value)) { if (is_object($value)) {
if ($value instanceof \DateTimeInterface) { if ($value instanceof \DateTimeInterface) {
return sprintf('Object(%s) - %s', \get_class($value), $value->format(\DateTime::ATOM)); return sprintf('Object(%s) - %s', get_class($value), $value->format(\DateTime::ATOM));
} }
return sprintf('Object(%s)', \get_class($value)); return sprintf('Object(%s)', get_class($value));
} }
if (\is_array($value)) { if (is_array($value)) {
if (empty($value)) { if (empty($value)) {
return '[]'; return '[]';
} }
@@ -52,7 +53,7 @@ class ValueExporter
$a = array(); $a = array();
foreach ($value as $k => $v) { foreach ($value as $k => $v) {
if (\is_array($v)) { if (is_array($v)) {
$deep = true; $deep = true;
} }
$a[] = sprintf('%s => %s', $k, $this->exportValue($v, $depth + 1, $deep)); $a[] = sprintf('%s => %s', $k, $this->exportValue($v, $depth + 1, $deep));
@@ -64,14 +65,14 @@ class ValueExporter
$s = sprintf('[%s]', implode(', ', $a)); $s = sprintf('[%s]', implode(', ', $a));
if (80 > \strlen($s)) { if (80 > strlen($s)) {
return $s; return $s;
} }
return sprintf("[\n%s%s\n]", $indent, implode(sprintf(",\n%s", $indent), $a)); return sprintf("[\n%s%s\n]", $indent, implode(sprintf(",\n%s", $indent), $a));
} }
if (\is_resource($value)) { if (is_resource($value)) {
return sprintf('Resource(%s#%d)', get_resource_type($value), $value); return sprintf('Resource(%s#%d)', get_resource_type($value), $value);
} }
@@ -90,6 +91,11 @@ class ValueExporter
return (string) $value; return (string) $value;
} }
/**
* @param \__PHP_Incomplete_Class $value
* @return mixed
* @author Bernhard Schussek <bschussek@gmail.com>
*/
private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value) private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value)
{ {
$array = new \ArrayObject($value); $array = new \ArrayObject($value);

View File

@@ -7,6 +7,6 @@ class Facade extends \Illuminate\Support\Facades\Facade
*/ */
protected static function getFacadeAccessor() protected static function getFacadeAccessor()
{ {
return 'debugbar'; return LaravelDebugbar::class;
} }
} }

View File

@@ -20,6 +20,7 @@ class JavascriptRenderer extends BaseJavascriptRenderer
$this->cssFiles['laravel'] = __DIR__ . '/Resources/laravel-debugbar.css'; $this->cssFiles['laravel'] = __DIR__ . '/Resources/laravel-debugbar.css';
$this->cssVendors['fontawesome'] = __DIR__ . '/Resources/vendor/font-awesome/style.css'; $this->cssVendors['fontawesome'] = __DIR__ . '/Resources/vendor/font-awesome/style.css';
$this->jsFiles['laravel-sql'] = __DIR__ . '/Resources/sqlqueries/widget.js'; $this->jsFiles['laravel-sql'] = __DIR__ . '/Resources/sqlqueries/widget.js';
$this->jsFiles['laravel-cache'] = __DIR__ . '/Resources/cache/widget.js';
} }
/** /**
@@ -56,9 +57,24 @@ class JavascriptRenderer extends BaseJavascriptRenderer
$html .= '<script type="text/javascript">jQuery.noConflict(true);</script>' . "\n"; $html .= '<script type="text/javascript">jQuery.noConflict(true);</script>' . "\n";
} }
$html .= $this->getInlineHtml();
return $html; return $html;
} }
protected function getInlineHtml()
{
$html = '';
foreach (['head', 'css', 'js'] as $asset) {
foreach ($this->getAssets('inline_' . $asset) as $item) {
$html .= $item . "\n";
}
}
return $html;
}
/** /**
* Get the last modified time of any assets. * Get the last modified time of any assets.
* *

View File

@@ -1,6 +1,7 @@
<?php namespace Barryvdh\Debugbar; <?php namespace Barryvdh\Debugbar;
use Barryvdh\Debugbar\DataCollector\AuthCollector; use Barryvdh\Debugbar\DataCollector\AuthCollector;
use Barryvdh\Debugbar\DataCollector\CacheCollector;
use Barryvdh\Debugbar\DataCollector\EventCollector; use Barryvdh\Debugbar\DataCollector\EventCollector;
use Barryvdh\Debugbar\DataCollector\FilesCollector; use Barryvdh\Debugbar\DataCollector\FilesCollector;
use Barryvdh\Debugbar\DataCollector\GateCollector; use Barryvdh\Debugbar\DataCollector\GateCollector;
@@ -9,13 +10,14 @@ use Barryvdh\Debugbar\DataCollector\LogsCollector;
use Barryvdh\Debugbar\DataCollector\MultiAuthCollector; use Barryvdh\Debugbar\DataCollector\MultiAuthCollector;
use Barryvdh\Debugbar\DataCollector\QueryCollector; use Barryvdh\Debugbar\DataCollector\QueryCollector;
use Barryvdh\Debugbar\DataCollector\SessionCollector; use Barryvdh\Debugbar\DataCollector\SessionCollector;
use Barryvdh\Debugbar\DataCollector\SymfonyRequestCollector; use Barryvdh\Debugbar\DataCollector\RequestCollector;
use Barryvdh\Debugbar\DataCollector\ViewCollector; use Barryvdh\Debugbar\DataCollector\ViewCollector;
use Barryvdh\Debugbar\Storage\FilesystemStorage; use Barryvdh\Debugbar\Storage\FilesystemStorage;
use DebugBar\Bridge\MonologCollector; use DebugBar\Bridge\MonologCollector;
use DebugBar\Bridge\SwiftMailer\SwiftLogCollector; use DebugBar\Bridge\SwiftMailer\SwiftLogCollector;
use DebugBar\Bridge\SwiftMailer\SwiftMailCollector; use DebugBar\Bridge\SwiftMailer\SwiftMailCollector;
use DebugBar\DataCollector\ConfigCollector; use DebugBar\DataCollector\ConfigCollector;
use DebugBar\DataCollector\DataCollectorInterface;
use DebugBar\DataCollector\ExceptionsCollector; use DebugBar\DataCollector\ExceptionsCollector;
use DebugBar\DataCollector\MemoryCollector; use DebugBar\DataCollector\MemoryCollector;
use DebugBar\DataCollector\MessagesCollector; use DebugBar\DataCollector\MessagesCollector;
@@ -124,7 +126,7 @@ class LaravelDebugbar extends DebugBar
/** @var Application $app */ /** @var Application $app */
$app = $this->app; $app = $this->app;
// Set custom error handler // Set custom error handler
if ($app['config']->get('debugbar.error_handler' , false)) { if ($app['config']->get('debugbar.error_handler' , false)) {
set_error_handler([$this, 'handleError']); set_error_handler([$this, 'handleError']);
@@ -222,7 +224,7 @@ class LaravelDebugbar extends DebugBar
if (!$this->isLumen() && $this->shouldCollect('route')) { if (!$this->isLumen() && $this->shouldCollect('route')) {
try { try {
$this->addCollector($this->app->make('Barryvdh\Debugbar\DataCollector\IlluminateRouteCollector')); $this->addCollector($this->app->make('Barryvdh\Debugbar\DataCollector\RouteCollector'));
} catch (\Exception $e) { } catch (\Exception $e) {
$this->addThrowable( $this->addThrowable(
new Exception( new Exception(
@@ -317,6 +319,9 @@ class LaravelDebugbar extends DebugBar
try { try {
$db->listen( $db->listen(
function ($query, $bindings = null, $time = null, $connectionName = null) use ($db, $queryCollector) { function ($query, $bindings = null, $time = null, $connectionName = null) use ($db, $queryCollector) {
if (!$this->shouldCollect('db', true)) {
return; // Issue 776 : We've turned off collecting after the listener was attached
}
// Laravel 5.2 changed the way some core events worked. We must account for // Laravel 5.2 changed the way some core events worked. We must account for
// the first argument being an "event object", where arguments are passed // the first argument being an "event object", where arguments are passed
// via object properties, instead of individual arguments. // via object properties, instead of individual arguments.
@@ -436,13 +441,8 @@ class LaravelDebugbar extends DebugBar
if ($this->shouldCollect('auth', false)) { if ($this->shouldCollect('auth', false)) {
try { try {
if($this->checkVersion('5.2')) { $guards = array_keys($this->app['config']->get('auth.guards', []));
// fix for compatibility with Laravel 5.2.* $authCollector = new MultiAuthCollector($app['auth'], $guards);
$guards = array_keys($this->app['config']->get('auth.guards'));
$authCollector = new MultiAuthCollector($app['auth'], $guards);
} else {
$authCollector = new AuthCollector($app['auth']);
}
$authCollector->setShowName( $authCollector->setShowName(
$this->app['config']->get('debugbar.options.auth.show_name') $this->app['config']->get('debugbar.options.auth.show_name')
@@ -466,6 +466,25 @@ class LaravelDebugbar extends DebugBar
} }
} }
if ($this->shouldCollect('cache', false) && isset($this->app['events'])) {
try {
$collectValues = $this->app['config']->get('debugbar.options.cache.values', true);
$startTime = $this->app['request']->server('REQUEST_TIME_FLOAT');
$cacheCollector = new CacheCollector($startTime, $collectValues);
$this->addCollector($cacheCollector);
$this->app['events']->subscribe($cacheCollector);
} catch (\Exception $e) {
$this->addThrowable(
new Exception(
'Cannot add CacheCollector to Laravel Debugbar: ' . $e->getMessage(),
$e->getCode(),
$e
)
);
}
}
$renderer = $this->getJavascriptRenderer(); $renderer = $this->getJavascriptRenderer();
$renderer->setIncludeVendors($this->app['config']->get('debugbar.include_vendors', true)); $renderer->setIncludeVendors($this->app['config']->get('debugbar.include_vendors', true));
$renderer->setBindAjaxHandlerToXHR($app['config']->get('debugbar.capture_ajax', true)); $renderer->setBindAjaxHandlerToXHR($app['config']->get('debugbar.capture_ajax', true));
@@ -478,6 +497,25 @@ class LaravelDebugbar extends DebugBar
return $this->app['config']->get('debugbar.collectors.' . $name, $default); return $this->app['config']->get('debugbar.collectors.' . $name, $default);
} }
/**
* Adds a data collector
*
* @param DataCollectorInterface $collector
*
* @throws DebugBarException
* @return $this
*/
public function addCollector(DataCollectorInterface $collector)
{
parent::addCollector($collector);
if (method_exists($collector, 'useHtmlVarDumper')) {
$collector->useHtmlVarDumper();
}
return $this;
}
/** /**
* Handle silenced errors * Handle silenced errors
* *
@@ -580,7 +618,7 @@ class LaravelDebugbar extends DebugBar
public function modifyResponse(Request $request, Response $response) public function modifyResponse(Request $request, Response $response)
{ {
$app = $this->app; $app = $this->app;
if ($app->runningInConsole() || !$this->isEnabled() || $this->isDebugbarRequest()) { if (!$this->isEnabled() || $this->isDebugbarRequest()) {
return $response; return $response;
} }
@@ -631,7 +669,7 @@ class LaravelDebugbar extends DebugBar
if ($this->shouldCollect('symfony_request', true) && !$this->hasCollector('request')) { if ($this->shouldCollect('symfony_request', true) && !$this->hasCollector('request')) {
try { try {
$this->addCollector(new SymfonyRequestCollector($request, $response, $sessionManager)); $this->addCollector(new RequestCollector($request, $response, $sessionManager));
} catch (\Exception $e) { } catch (\Exception $e) {
$this->addThrowable( $this->addThrowable(
new Exception( new Exception(
@@ -712,7 +750,14 @@ class LaravelDebugbar extends DebugBar
public function isEnabled() public function isEnabled()
{ {
if ($this->enabled === null) { if ($this->enabled === null) {
$this->enabled = value($this->app['config']->get('debugbar.enabled')); $config = $this->app['config'];
$configEnabled = value($config->get('debugbar.enabled'));
if ($configEnabled === null) {
$configEnabled = $config->get('app.debug');
}
$this->enabled = $configEnabled && !$this->app->runningInConsole() && !$this->app->environment('testing');
} }
return $this->enabled; return $this->enabled;
@@ -970,7 +1015,7 @@ class LaravelDebugbar extends DebugBar
case 'redis': case 'redis':
$connection = $config->get('debugbar.storage.connection'); $connection = $config->get('debugbar.storage.connection');
$client = $this->app['redis']->connection($connection); $client = $this->app['redis']->connection($connection);
if (is_a($client, 'Illuminate\Redis\Connections\PredisConnection', false)) { if (is_a($client, 'Illuminate\Redis\Connections\Connection', false)) {
$client = $client->client(); $client = $client->client();
} }
$storage = new RedisStorage($client); $storage = new RedisStorage($client);
@@ -1011,7 +1056,7 @@ class LaravelDebugbar extends DebugBar
$headers = []; $headers = [];
foreach ($collector->collect()['measures'] as $k => $m) { foreach ($collector->collect()['measures'] as $k => $m) {
$headers[] = sprintf('%d=%F; "%s"', $k, $m['duration'], str_replace('"', "'", $m['label'])); $headers[] = sprintf('%d=%F; "%s"', $k, $m['duration'] * 1000, str_replace('"', "'", $m['label']));
} }
$response->headers->set('Server-Timing', $headers, false); $response->headers->set('Server-Timing', $headers, false);

View File

@@ -14,7 +14,7 @@ class LumenServiceProvider extends ServiceProvider
*/ */
protected function getRouter() protected function getRouter()
{ {
return $this->app; return $this->app->router;
} }
/** /**
@@ -37,14 +37,6 @@ class LumenServiceProvider extends ServiceProvider
$this->app->middleware([$middleware]); $this->app->middleware([$middleware]);
} }
/**
* Check the App Debug status
*/
protected function checkAppDebug()
{
return env('APP_DEBUG');
}
/** /**
* Get the services provided by the provider. * Get the services provided by the provider.
* *

View File

@@ -0,0 +1,42 @@
<?php namespace Barryvdh\Debugbar\Middleware;
use Closure;
use Illuminate\Http\Request;
use Barryvdh\Debugbar\LaravelDebugbar;
class DebugbarEnabled
{
/**
* The DebugBar instance
*
* @var LaravelDebugbar
*/
protected $debugbar;
/**
* Create a new middleware instance.
*
* @param LaravelDebugbar $debugbar
*/
public function __construct(LaravelDebugbar $debugbar)
{
$this->debugbar = $debugbar;
}
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$this->debugbar->isEnabled()) {
abort(404);
}
return $next($request);
}
}

View File

@@ -9,7 +9,7 @@ use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Debug\ExceptionHandler; use Illuminate\Contracts\Debug\ExceptionHandler;
use Symfony\Component\Debug\Exception\FatalThrowableError; use Symfony\Component\Debug\Exception\FatalThrowableError;
class Debugbar class InjectDebugbar
{ {
/** /**
* The App container * The App container
@@ -25,6 +25,13 @@ class Debugbar
*/ */
protected $debugbar; protected $debugbar;
/**
* The URIs that should be excluded.
*
* @var array
*/
protected $except = [];
/** /**
* Create a new middleware instance. * Create a new middleware instance.
* *
@@ -35,6 +42,7 @@ class Debugbar
{ {
$this->container = $container; $this->container = $container;
$this->debugbar = $debugbar; $this->debugbar = $debugbar;
$this->except = config('debugbar.except') ?: [];
} }
/** /**
@@ -46,6 +54,12 @@ class Debugbar
*/ */
public function handle($request, Closure $next) public function handle($request, Closure $next)
{ {
if (!$this->debugbar->isEnabled() || $this->inExceptArray($request)) {
return $next($request);
}
$this->debugbar->boot();
try { try {
/** @var \Illuminate\Http\Response $response */ /** @var \Illuminate\Http\Response $response */
$response = $next($request); $response = $next($request);
@@ -85,4 +99,25 @@ class Debugbar
return $handler->render($passable, $e); return $handler->render($passable, $e);
} }
/**
* Determine if the request has a URI that should be ignored.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function inExceptArray($request)
{
foreach ($this->except as $except) {
if ($except !== '/') {
$except = trim($except, '/');
}
if ($request->is($except)) {
return true;
}
}
return false;
}
} }

View File

@@ -0,0 +1,59 @@
(function($) {
var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-');
/**
* Widget for the displaying cache events
*
* Options:
* - data
*/
var LaravelCacheWidget = PhpDebugBar.Widgets.LaravelCacheWidget = PhpDebugBar.Widgets.TimelineWidget.extend({
tagName: 'ul',
className: csscls('timeline cache'),
onForgetClick: function(e, el) {
e.stopPropagation();
$.ajax({
url: $(el).attr("data-url"),
type: 'DELETE',
success: function(result) {
$(el).fadeOut(200);
}
});
},
render: function() {
LaravelCacheWidget.__super__.render.apply(this);
this.bindAttr('data', function(data) {
if (data.measures) {
var self = this;
var lines = this.$el.find('.'+csscls('measure'));
for (var i = 0; i < data.measures.length; i++) {
var measure = data.measures[i];
var m = lines[i];
if (measure.params && !$.isEmptyObject(measure.params)) {
if (measure.params.delete && measure.params.key) {
$('<a />')
.addClass(csscls('forget'))
.text('forget')
.attr('data-url', measure.params.delete)
.one('click', function(e) { self.onForgetClick(e, this); })
.appendTo(m);
}
}
}
}
});
}
});
})(PhpDebugBar.$);

View File

@@ -3,6 +3,7 @@ div.phpdebugbar {
font-family: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; font-family: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
direction: ltr; direction: ltr;
text-align: left; text-align: left;
z-index: 100000;
} }
div.phpdebugbar-resize-handle { div.phpdebugbar-resize-handle {
@@ -18,14 +19,23 @@ a.phpdebugbar-restore-btn {
border-right-color: #ddd !important; border-right-color: #ddd !important;
} }
div.phpdebugbar code, div.phpdebugbar pre { div.phpdebugbar code, div.phpdebugbar pre, div.phpdebugbar samp {
background: none; background: none;
font-family: monospace; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 1em; font-size: 1em;
border: 0; border: 0;
padding: 0; padding: 0;
} }
div.phpdebugbar code, div.phpdebugbar pre {
color: #000;
}
div.phpdebugbar pre.sf-dump {
color: #a0a000;
outline: 0;
}
div.phpdebugbar-body { div.phpdebugbar-body {
border-top: none; border-top: none;
} }
@@ -195,7 +205,7 @@ div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-w
} }
ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item { ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item {
padding: 5px 10px; padding: 15px 10px;
border: none; border: none;
font-family: inherit; font-family: inherit;
overflow: visible; overflow: visible;
@@ -210,6 +220,7 @@ ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item {
ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-sql { ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-sql {
flex: 1; flex: 1;
margin-right: 5px; margin-right: 5px;
cursor: text;
} }
ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-duration { ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-duration {
@@ -294,3 +305,15 @@ ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-table-list-item {
.phpdebugbar-text-muted { .phpdebugbar-text-muted {
color: #888; color: #888;
} }
ul.phpdebugbar-widgets-cache a.phpdebugbar-widgets-forget {
float: right;
font-size: 12px;
padding: 0 4px;
background: #f4645f;
margin: 0 2px;
border-radius: 4px;
color: #fff;
text-decoration: none;
line-height: 1.5rem;
}

View File

@@ -186,6 +186,9 @@
if (data.statements[i].bindings && data.statements[i].bindings.length) { if (data.statements[i].bindings && data.statements[i].bindings.length) {
stmt += JSON.stringify(data.statements[i].bindings); stmt += JSON.stringify(data.statements[i].bindings);
} }
if (data.statements[i].connection) {
stmt += '@' + data.statements[i].connection;
}
sql[stmt] = sql[stmt] || { keys: [] }; sql[stmt] = sql[stmt] || { keys: [] };
sql[stmt].keys.push(i); sql[stmt].keys.push(i);
} }

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,10 @@
<?php namespace Barryvdh\Debugbar; <?php namespace Barryvdh\Debugbar;
use Barryvdh\Debugbar\Middleware\DebugbarEnabled;
use Barryvdh\Debugbar\Middleware\InjectDebugbar;
use DebugBar\DataFormatter\DataFormatter;
use DebugBar\DataFormatter\DataFormatterInterface;
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Routing\Router; use Illuminate\Routing\Router;
use Illuminate\Session\SessionManager; use Illuminate\Session\SessionManager;
@@ -23,15 +28,15 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider
$this->mergeConfigFrom($configPath, 'debugbar'); $this->mergeConfigFrom($configPath, 'debugbar');
$this->app->alias( $this->app->alias(
'DebugBar\DataFormatter\DataFormatter', DataFormatter::class,
'DebugBar\DataFormatter\DataFormatterInterface' DataFormatterInterface::class
); );
$this->app->singleton('debugbar', function ($app) { $this->app->singleton(LaravelDebugbar::class, function () {
$debugbar = new LaravelDebugbar($app); $debugbar = new LaravelDebugbar($this->app);
if ($app->bound(SessionManager::class)) { if ($this->app->bound(SessionManager::class)) {
$sessionManager = $app->make(SessionManager::class); $sessionManager = $this->app->make(SessionManager::class);
$httpDriver = new SymfonyHttpDriver($sessionManager); $httpDriver = new SymfonyHttpDriver($sessionManager);
$debugbar->setHttpDriver($httpDriver); $debugbar->setHttpDriver($httpDriver);
} }
@@ -40,7 +45,7 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider
} }
); );
$this->app->alias('debugbar', 'Barryvdh\Debugbar\LaravelDebugbar'); $this->app->alias(LaravelDebugbar::class, 'debugbar');
$this->app->singleton('command.debugbar.clear', $this->app->singleton('command.debugbar.clear',
function ($app) { function ($app) {
@@ -58,26 +63,14 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider
*/ */
public function boot() public function boot()
{ {
$app = $this->app;
$configPath = __DIR__ . '/../config/debugbar.php'; $configPath = __DIR__ . '/../config/debugbar.php';
$this->publishes([$configPath => $this->getConfigPath()], 'config'); $this->publishes([$configPath => $this->getConfigPath()], 'config');
// If enabled is null, set from the app.debug value
$enabled = $this->app['config']->get('debugbar.enabled');
if (is_null($enabled)) {
$enabled = $this->checkAppDebug();
}
if (! $enabled) {
return;
}
$routeConfig = [ $routeConfig = [
'namespace' => 'Barryvdh\Debugbar\Controllers', 'namespace' => 'Barryvdh\Debugbar\Controllers',
'prefix' => $this->app['config']->get('debugbar.route_prefix'), 'prefix' => $this->app['config']->get('debugbar.route_prefix'),
'domain' => $this->app['config']->get('debugbar.route_domain'), 'domain' => $this->app['config']->get('debugbar.route_domain'),
'middleware' => [DebugbarEnabled::class],
]; ];
$this->getRouter()->group($routeConfig, function($router) { $this->getRouter()->group($routeConfig, function($router) {
@@ -100,18 +93,14 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider
'uses' => 'AssetController@js', 'uses' => 'AssetController@js',
'as' => 'debugbar.assets.js', 'as' => 'debugbar.assets.js',
]); ]);
$router->delete('cache/{key}/{tags?}', [
'uses' => 'CacheController@delete',
'as' => 'debugbar.cache.delete',
]);
}); });
if ($app->runningInConsole() || $app->environment('testing')) { $this->registerMiddleware(InjectDebugbar::class);
return;
}
/** @var LaravelDebugbar $debugbar */
$debugbar = $this->app['debugbar'];
$debugbar->enable();
$debugbar->boot();
$this->registerMiddleware('Barryvdh\Debugbar\Middleware\Debugbar');
} }
/** /**
@@ -151,18 +140,10 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider
*/ */
protected function registerMiddleware($middleware) protected function registerMiddleware($middleware)
{ {
$kernel = $this->app['Illuminate\Contracts\Http\Kernel']; $kernel = $this->app[Kernel::class];
$kernel->pushMiddleware($middleware); $kernel->pushMiddleware($middleware);
} }
/**
* Check the App Debug status
*/
protected function checkAppDebug()
{
return $this->app['config']->get('app.debug');
}
/** /**
* Get the services provided by the provider. * Get the services provided by the provider.
* *
@@ -170,6 +151,6 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider
*/ */
public function provides() public function provides()
{ {
return ['debugbar', 'command.debugbar.clear']; return ['debugbar', 'command.debugbar.clear', DataFormatterInterface::class, LaravelDebugbar::class];
} }
} }

View File

@@ -33,7 +33,7 @@ class FilesystemStorage implements StorageInterface
{ {
if (!$this->files->isDirectory($this->dirname)) { if (!$this->files->isDirectory($this->dirname)) {
if ($this->files->makeDirectory($this->dirname, 0777, true)) { if ($this->files->makeDirectory($this->dirname, 0777, true)) {
$this->files->put($this->dirname . '.gitignore', "*\n!.gitignore"); $this->files->put($this->dirname . '.gitignore', "*\n!.gitignore\n");
} else { } else {
throw new \Exception("Cannot create directory '$this->dirname'.."); throw new \Exception("Cannot create directory '$this->dirname'..");
} }

View File

@@ -11,8 +11,9 @@ use Symfony\Component\HttpFoundation\Session\Session;
*/ */
class SymfonyHttpDriver implements HttpDriverInterface class SymfonyHttpDriver implements HttpDriverInterface
{ {
/** @var \Symfony\Component\HttpFoundation\Session\Session|\Illuminate\Contracts\Session\Session|\Illuminate\Session\SessionManager */ /** @var \Illuminate\Contracts\Session\Session|\Illuminate\Session\SessionManager */
protected $session; protected $session;
/** @var \Symfony\Component\HttpFoundation\Response */ /** @var \Symfony\Component\HttpFoundation\Response */
protected $response; protected $response;
@@ -40,6 +41,7 @@ class SymfonyHttpDriver implements HttpDriverInterface
if (!$this->session->isStarted()) { if (!$this->session->isStarted()) {
$this->session->start(); $this->session->start();
} }
return $this->session->isStarted(); return $this->session->isStarted();
} }
@@ -48,14 +50,7 @@ class SymfonyHttpDriver implements HttpDriverInterface
*/ */
public function setSessionValue($name, $value) public function setSessionValue($name, $value)
{ {
// In Laravel 5.4 the session changed to use their own custom implementation $this->session->put($name, $value);
// instead of the one from Symfony. One of the changes was the set method
// that was changed to put. Here we check if we are using the new one.
if (method_exists($this->session, 'driver') && $this->session->driver() instanceof \Illuminate\Contracts\Session\Session) {
$this->session->put($name, $value);
return;
}
$this->session->set($name, $value);
} }
/** /**

View File

@@ -8,7 +8,7 @@ if (!function_exists('debugbar')) {
*/ */
function debugbar() function debugbar()
{ {
return app('debugbar'); return app(\Barryvdh\Debugbar\LaravelDebugbar::class);
} }
} }
@@ -21,7 +21,7 @@ if (!function_exists('debug')) {
*/ */
function debug($value) function debug($value)
{ {
$debugbar = app('debugbar'); $debugbar = debugbar();
foreach (func_get_args() as $value) { foreach (func_get_args() as $value) {
$debugbar->addMessage($value, 'debug'); $debugbar->addMessage($value, 'debug');
} }
@@ -37,7 +37,7 @@ if (!function_exists('start_measure')) {
*/ */
function start_measure($name, $label = null) function start_measure($name, $label = null)
{ {
app('debugbar')->startMeasure($name, $label); debugbar()->startMeasure($name, $label);
} }
} }
@@ -49,7 +49,7 @@ if (!function_exists('stop_measure')) {
*/ */
function stop_measure($name) function stop_measure($name)
{ {
app('debugbar')->stopMeasure($name); debugbar()->stopMeasure($name);
} }
} }
@@ -63,7 +63,7 @@ if (!function_exists('add_measure')) {
*/ */
function add_measure($label, $start, $end) function add_measure($label, $start, $end)
{ {
app('debugbar')->addMeasure($label, $start, $end); debugbar()->addMeasure($label, $start, $end);
} }
} }
@@ -76,6 +76,6 @@ if (!function_exists('measure')) {
*/ */
function measure($label, \Closure $closure) function measure($label, \Closure $closure)
{ {
app('debugbar')->measure($label, $closure); debugbar()->measure($label, $closure);
} }
} }

10
vendor/bin/var-dump-server vendored Normal file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/env sh
dir=$(cd "${0%[/\\]*}" > /dev/null; cd "../symfony/var-dumper/Resources/bin" && pwd)
if [ -d /proc/cygdrive ] && [[ $(which php) == $(readlink -n /proc/cygdrive)/* ]]; then
# We are in Cgywin using Windows php, so the path must be translated
dir=$(cygpath -m "$dir");
fi
"${dir}/var-dump-server" "$@"

4
vendor/bin/var-dump-server.bat vendored Normal file
View File

@@ -0,0 +1,4 @@
@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/../symfony/var-dumper/Resources/bin/var-dump-server
php "%BIN_TARGET%" %*

View File

@@ -28,8 +28,6 @@ return array(
'AddForeignKeysToUsersTable' => $baseDir . '/database/migrations/2016_02_16_140454_add_foreign_keys_to_users_table.php', 'AddForeignKeysToUsersTable' => $baseDir . '/database/migrations/2016_02_16_140454_add_foreign_keys_to_users_table.php',
'Adobe_Font_Metrics' => $vendorDir . '/phenx/php-font-lib/classes/Adobe_Font_Metrics.php', 'Adobe_Font_Metrics' => $vendorDir . '/phenx/php-font-lib/classes/Adobe_Font_Metrics.php',
'AlterTicketSourceTable' => $baseDir . '/database/migrations/2016_08_16_104539_alter_ticket_source_table.php', 'AlterTicketSourceTable' => $baseDir . '/database/migrations/2016_08_16_104539_alter_ticket_source_table.php',
'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
'Attribute_Translator' => $vendorDir . '/dompdf/dompdf/include/attribute_translator.cls.php', 'Attribute_Translator' => $vendorDir . '/dompdf/dompdf/include/attribute_translator.cls.php',
'Block_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/block_frame_decorator.cls.php', 'Block_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/block_frame_decorator.cls.php',
'Block_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/block_frame_reflower.cls.php', 'Block_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/block_frame_reflower.cls.php',
@@ -122,12 +120,7 @@ return array(
'DOMPDF_Exception' => $vendorDir . '/dompdf/dompdf/include/dompdf_exception.cls.php', 'DOMPDF_Exception' => $vendorDir . '/dompdf/dompdf/include/dompdf_exception.cls.php',
'DOMPDF_Image_Exception' => $vendorDir . '/dompdf/dompdf/include/dompdf_image_exception.cls.php', 'DOMPDF_Image_Exception' => $vendorDir . '/dompdf/dompdf/include/dompdf_image_exception.cls.php',
'DatabaseSeeder' => $baseDir . '/database/seeds/DatabaseSeeder.php', 'DatabaseSeeder' => $baseDir . '/database/seeds/DatabaseSeeder.php',
'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
'Encoding_Map' => $vendorDir . '/phenx/php-font-lib/classes/Encoding_Map.php', 'Encoding_Map' => $vendorDir . '/phenx/php-font-lib/classes/Encoding_Map.php',
'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php',
'File_Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php',
'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php',
'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php',
'Fixed_Positioner' => $vendorDir . '/dompdf/dompdf/include/fixed_positioner.cls.php', 'Fixed_Positioner' => $vendorDir . '/dompdf/dompdf/include/fixed_positioner.cls.php',
'Font' => $vendorDir . '/phenx/php-font-lib/classes/Font.php', 'Font' => $vendorDir . '/phenx/php-font-lib/classes/Font.php',
'Font_Binary_Stream' => $vendorDir . '/phenx/php-font-lib/classes/Font_Binary_Stream.php', 'Font_Binary_Stream' => $vendorDir . '/phenx/php-font-lib/classes/Font_Binary_Stream.php',
@@ -222,7 +215,6 @@ return array(
'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php',
'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php',
'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php',
'PHPUnit\\Framework\\BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/BaseTestListener.php',
'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php',
'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php',
'PHPUnit\\Framework\\Constraint\\ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', 'PHPUnit\\Framework\\Constraint\\ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
@@ -285,49 +277,50 @@ return array(
'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php',
'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php',
'PHPUnit\\Framework\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php', 'PHPUnit\\Framework\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php',
'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Exception/BadMethodCallException.php', 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php',
'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/Identity.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php',
'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/InvocationMocker.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php',
'PHPUnit\\Framework\\MockObject\\Builder\\Match' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/Match.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php',
'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/MethodNameMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php',
'PHPUnit\\Framework\\MockObject\\Builder\\NamespaceMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/NamespaceMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\NamespaceMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/NamespaceMatch.php',
'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/ParametersMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php',
'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/Stub.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php',
'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Exception/Exception.php', 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php',
'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Generator.php', 'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator.php',
'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Invocation/Invocation.php', 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation/Invocation.php',
'PHPUnit\\Framework\\MockObject\\InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/InvocationMocker.php', 'PHPUnit\\Framework\\MockObject\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/InvocationMocker.php',
'PHPUnit\\Framework\\MockObject\\Invocation\\ObjectInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Invocation/ObjectInvocation.php', 'PHPUnit\\Framework\\MockObject\\Invocation\\ObjectInvocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation/ObjectInvocation.php',
'PHPUnit\\Framework\\MockObject\\Invocation\\StaticInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Invocation/StaticInvocation.php', 'PHPUnit\\Framework\\MockObject\\Invocation\\StaticInvocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation/StaticInvocation.php',
'PHPUnit\\Framework\\MockObject\\Invokable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Invokable.php', 'PHPUnit\\Framework\\MockObject\\Invokable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invokable.php',
'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher.php', 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/AnyInvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/AnyInvokedCount.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\AnyParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/AnyParameters.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/AnyParameters.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/ConsecutiveParameters.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/ConsecutiveParameters.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/Invocation.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\DeferredError' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/DeferredError.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtIndex.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/Invocation.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtLeastCount.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtIndex.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtLeastOnce.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtMostCount.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtMostCount.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedRecorder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedRecorder.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedCount.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\MethodName' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/MethodName.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedRecorder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedRecorder.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\Parameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/Parameters.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/MethodName.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\StatelessInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/StatelessInvocation.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/Parameters.php',
'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/MockBuilder.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\StatelessInvocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/StatelessInvocation.php',
'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/ForwardCompatibility/MockObject.php', 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php',
'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Exception/RuntimeException.php', 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ForwardCompatibility/MockObject.php',
'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub.php', 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ConsecutiveCalls.php', 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub.php',
'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/Exception.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php',
'PHPUnit\\Framework\\MockObject\\Stub\\MatcherCollection' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/MatcherCollection.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnArgument.php', 'PHPUnit\\Framework\\MockObject\\Stub\\MatcherCollection' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/MatcherCollection.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnCallback.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnReference.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnSelf.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnStub.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnValueMap.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php',
'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Verifiable.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php',
'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php',
'PHPUnit\\Framework\\OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php', 'PHPUnit\\Framework\\OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php',
'PHPUnit\\Framework\\RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php', 'PHPUnit\\Framework\\RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php',
'PHPUnit\\Framework\\RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php', 'PHPUnit\\Framework\\RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php',
@@ -348,16 +341,34 @@ return array(
'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php',
'PHPUnit\\Framework\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php', 'PHPUnit\\Framework\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php',
'PHPUnit\\Framework\\WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php', 'PHPUnit\\Framework\\WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php',
'PHPUnit\\Runner\\AfterIncompleteTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php',
'PHPUnit\\Runner\\AfterLastTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php',
'PHPUnit\\Runner\\AfterRiskyTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php',
'PHPUnit\\Runner\\AfterSkippedTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php',
'PHPUnit\\Runner\\AfterSuccessfulTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php',
'PHPUnit\\Runner\\AfterTestErrorHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php',
'PHPUnit\\Runner\\AfterTestFailureHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php',
'PHPUnit\\Runner\\AfterTestWarningHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php',
'PHPUnit\\Runner\\BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', 'PHPUnit\\Runner\\BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php',
'PHPUnit\\Runner\\BeforeFirstTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php',
'PHPUnit\\Runner\\BeforeTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php',
'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php',
'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php',
'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php',
'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php',
'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php',
'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php',
'PHPUnit\\Runner\\Hook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/Hook.php',
'PHPUnit\\Runner\\NullTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Util/NullTestResultCache.php',
'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php',
'PHPUnit\\Runner\\ResultCacheExtension' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php',
'PHPUnit\\Runner\\StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', 'PHPUnit\\Runner\\StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php',
'PHPUnit\\Runner\\TestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestHook.php',
'PHPUnit\\Runner\\TestListenerAdapter' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php',
'PHPUnit\\Runner\\TestResultCache' => $vendorDir . '/phpunit/phpunit/src/Util/TestResultCache.php',
'PHPUnit\\Runner\\TestResultCacheInterface' => $vendorDir . '/phpunit/phpunit/src/Util/TestResultCacheInterface.php',
'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php',
'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php',
'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php',
'PHPUnit\\TextUI\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', 'PHPUnit\\TextUI\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php',
'PHPUnit\\TextUI\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', 'PHPUnit\\TextUI\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php',
@@ -366,7 +377,7 @@ return array(
'PHPUnit\\Util\\Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php', 'PHPUnit\\Util\\Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php',
'PHPUnit\\Util\\ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', 'PHPUnit\\Util\\ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php',
'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php',
'PHPUnit\\Util\\Fileloader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.php', 'PHPUnit\\Util\\FileLoader' => $vendorDir . '/phpunit/phpunit/src/Util/FileLoader.php',
'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php',
'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php',
'PHPUnit\\Util\\Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', 'PHPUnit\\Util\\Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php',
@@ -381,18 +392,19 @@ return array(
'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', 'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php',
'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php', 'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php',
'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php',
'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php',
'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php',
'PHPUnit\\Util\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', 'PHPUnit\\Util\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php',
'PHPUnit\\Util\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', 'PHPUnit\\Util\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php',
'PHPUnit\\Util\\TestDox\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TestResult.php',
'PHPUnit\\Util\\TestDox\\TextResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php',
'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php',
'PHPUnit\\Util\\TextTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', 'PHPUnit\\Util\\TextTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/TextTestListRenderer.php',
'PHPUnit\\Util\\Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', 'PHPUnit\\Util\\Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php',
'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml.php', 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml.php',
'PHPUnit\\Util\\XmlTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', 'PHPUnit\\Util\\XmlTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php',
'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/MockObject.php', 'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php',
'PHP_Evaluator' => $vendorDir . '/dompdf/dompdf/include/php_evaluator.cls.php', 'PHP_Evaluator' => $vendorDir . '/dompdf/dompdf/include/php_evaluator.cls.php',
'PHP_Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php',
'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
@@ -402,9 +414,7 @@ return array(
'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ASYNC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_AWAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
@@ -428,7 +438,6 @@ return array(
'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_COMPILER_HALT_OFFSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
@@ -463,9 +472,7 @@ return array(
'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ENUM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EQUALS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
@@ -483,7 +490,6 @@ return array(
'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_IN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
@@ -500,10 +506,6 @@ return array(
'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_JOIN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LAMBDA_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LAMBDA_CP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LAMBDA_OP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
@@ -521,11 +523,9 @@ return array(
'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_NULLSAFE_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ONUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
@@ -548,7 +548,6 @@ return array(
'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SHAPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
@@ -559,7 +558,6 @@ return array(
'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SUPER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php',
'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php',
@@ -568,34 +566,20 @@ return array(
'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TYPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TYPELIST_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TYPELIST_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_WHERE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_ATTRIBUTE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_CATEGORY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_CATEGORY_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_CHILDREN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_REQUIRED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_TAG_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_TAG_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_TEXT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
'Page_Cache' => $vendorDir . '/dompdf/dompdf/include/page_cache.cls.php', 'Page_Cache' => $vendorDir . '/dompdf/dompdf/include/page_cache.cls.php',
'Page_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/page_frame_decorator.cls.php', 'Page_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/page_frame_decorator.cls.php',
'Page_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/page_frame_reflower.cls.php', 'Page_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/page_frame_reflower.cls.php',
'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php',
'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php',
'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php',
@@ -645,20 +629,21 @@ return array(
'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php',
'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php',
'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php',
'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/AbstractVersionConstraint.php', 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php',
'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/AndVersionConstraintGroup.php', 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php',
'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/AnyVersionConstraint.php', 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php',
'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/ExactVersionConstraint.php', 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php',
'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/Exception.php', 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php',
'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/GreaterThanOrEqualToVersionConstraint.php', 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php',
'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/InvalidVersionException.php', 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php',
'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/OrVersionConstraintGroup.php', 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php',
'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php',
'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php',
'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/SpecificMajorAndMinorVersionConstraint.php', 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php',
'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/SpecificMajorVersionConstraint.php', 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php',
'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/UnsupportedVersionConstraintException.php', 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php',
'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php',
'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/VersionConstraint.php', 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php',
'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php',
'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php',
'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php',
@@ -667,7 +652,6 @@ return array(
'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php',
'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php',
'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php',
'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/HHVM.php',
'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php',
'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php',
'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php',
@@ -722,6 +706,7 @@ return array(
'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php',
'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php',
'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php',
'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php',
'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php',
'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php',
'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php',
@@ -732,6 +717,7 @@ return array(
'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php',
'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php',
'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php',
'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php',
'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php',
'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php',
'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php',
@@ -739,6 +725,9 @@ return array(
'SebastianBergmann\\Environment\\OperatingSystem' => $vendorDir . '/sebastian/environment/src/OperatingSystem.php', 'SebastianBergmann\\Environment\\OperatingSystem' => $vendorDir . '/sebastian/environment/src/OperatingSystem.php',
'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php',
'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php',
'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php',
'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php',
'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php',
'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php',
'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php',
'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php',
@@ -755,8 +744,10 @@ return array(
'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php',
'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php',
'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php', 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php',
'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/Exception.php',
'SebastianBergmann\\Timer\\RuntimeException' => $vendorDir . '/phpunit/php-timer/src/RuntimeException.php',
'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php',
'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php',
'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
'Style' => $vendorDir . '/dompdf/dompdf/include/style.cls.php', 'Style' => $vendorDir . '/dompdf/dompdf/include/style.cls.php',
'Stylesheet' => $vendorDir . '/dompdf/dompdf/include/stylesheet.cls.php', 'Stylesheet' => $vendorDir . '/dompdf/dompdf/include/stylesheet.cls.php',
'TCPDF_Adapter' => $vendorDir . '/dompdf/dompdf/include/tcpdf_adapter.cls.php', 'TCPDF_Adapter' => $vendorDir . '/dompdf/dompdf/include/tcpdf_adapter.cls.php',
@@ -773,7 +764,6 @@ return array(
'Table_Row_Group_Renderer' => $vendorDir . '/dompdf/dompdf/include/table_row_group_renderer.cls.php', 'Table_Row_Group_Renderer' => $vendorDir . '/dompdf/dompdf/include/table_row_group_renderer.cls.php',
'Table_Row_Positioner' => $vendorDir . '/dompdf/dompdf/include/table_row_positioner.cls.php', 'Table_Row_Positioner' => $vendorDir . '/dompdf/dompdf/include/table_row_positioner.cls.php',
'TestCase' => $baseDir . '/tests/TestCase.php', 'TestCase' => $baseDir . '/tests/TestCase.php',
'Tests\\DuskTestCase' => $baseDir . '/tests/DuskTestCase.php',
'Text_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/text_frame_decorator.cls.php', 'Text_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/text_frame_decorator.cls.php',
'Text_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/text_frame_reflower.cls.php', 'Text_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/text_frame_reflower.cls.php',
'Text_Renderer' => $vendorDir . '/dompdf/dompdf/include/text_renderer.cls.php', 'Text_Renderer' => $vendorDir . '/dompdf/dompdf/include/text_renderer.cls.php',
@@ -786,6 +776,5 @@ return array(
'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php',
'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php',
'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php',
'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
'Version1079table' => $baseDir . '/database/migrations/2016_06_28_141613_version1079table.php', 'Version1079table' => $baseDir . '/database/migrations/2016_06_28_141613_version1079table.php',
); );

View File

@@ -8,11 +8,10 @@ $baseDir = dirname($vendorDir);
return array( return array(
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
'5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
'023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
'b067bc7112e384b61c701452d53a14a8' => $vendorDir . '/mtdowling/jmespath.php/src/JmesPath.php', 'b067bc7112e384b61c701452d53a14a8' => $vendorDir . '/mtdowling/jmespath.php/src/JmesPath.php',
'8a9dc1de0ca7e01f3e08231539562f61' => $vendorDir . '/aws/aws-sdk-php/src/functions.php', '8a9dc1de0ca7e01f3e08231539562f61' => $vendorDir . '/aws/aws-sdk-php/src/functions.php',

View File

@@ -30,7 +30,7 @@ return array(
'Thomaswelton\\LaravelGravatar\\' => array($vendorDir . '/thomaswelton/laravel-gravatar/src'), 'Thomaswelton\\LaravelGravatar\\' => array($vendorDir . '/thomaswelton/laravel-gravatar/src'),
'Tests\\' => array($baseDir . '/tests'), 'Tests\\' => array($baseDir . '/tests'),
'Symfony\\Polyfill\\Util\\' => array($vendorDir . '/symfony/polyfill-util'), 'Symfony\\Polyfill\\Util\\' => array($vendorDir . '/symfony/polyfill-util'),
'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'), 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
'Symfony\\Polyfill\\Php56\\' => array($vendorDir . '/symfony/polyfill-php56'), 'Symfony\\Polyfill\\Php56\\' => array($vendorDir . '/symfony/polyfill-php56'),
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
@@ -89,11 +89,11 @@ return array(
'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
'DebugBar\\' => array($vendorDir . '/maximebf/debugbar/src/DebugBar'), 'DebugBar\\' => array($vendorDir . '/maximebf/debugbar/src/DebugBar'),
'DaveJamesMiller\\Breadcrumbs\\' => array($vendorDir . '/davejamesmiller/laravel-breadcrumbs/src'), 'DaveJamesMiller\\Breadcrumbs\\' => array($vendorDir . '/davejamesmiller/laravel-breadcrumbs/src'),
'Cron\\' => array($vendorDir . '/mtdowling/cron-expression/src/Cron'), 'Cron\\' => array($vendorDir . '/dragonmantank/cron-expression/src/Cron'),
'Collective\\Html\\' => array($vendorDir . '/laravelcollective/html/src'), 'Collective\\Html\\' => array($vendorDir . '/laravelcollective/html/src'),
'Chumper\\Zipper\\' => array($vendorDir . '/chumper/zipper/src/Chumper/Zipper'), 'Chumper\\Zipper\\' => array($vendorDir . '/chumper/zipper/src/Chumper/Zipper'),
'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'),
'Barryvdh\\Debugbar\\' => array($vendorDir . '/barryvdh/laravel-debugbar/src'), 'Barryvdh\\Debugbar\\' => array($vendorDir . '/barryvdh/laravel-debugbar/src'),
'Aws\\' => array($vendorDir . '/aws/aws-sdk-php/src'), 'Aws\\' => array($vendorDir . '/aws/aws-sdk-php/src'),
'App\\' => array($baseDir . '/app'), 'App\\' => array($baseDir . '/app'),
'' => array($vendorDir . '/nesbot/carbon/src'),
); );

View File

@@ -9,11 +9,10 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
public static $files = array ( public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
'023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
'b067bc7112e384b61c701452d53a14a8' => __DIR__ . '/..' . '/mtdowling/jmespath.php/src/JmesPath.php', 'b067bc7112e384b61c701452d53a14a8' => __DIR__ . '/..' . '/mtdowling/jmespath.php/src/JmesPath.php',
'8a9dc1de0ca7e01f3e08231539562f61' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/functions.php', '8a9dc1de0ca7e01f3e08231539562f61' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/functions.php',
@@ -79,7 +78,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'S' => 'S' =>
array ( array (
'Symfony\\Polyfill\\Util\\' => 22, 'Symfony\\Polyfill\\Util\\' => 22,
'Symfony\\Polyfill\\Php70\\' => 23, 'Symfony\\Polyfill\\Php72\\' => 23,
'Symfony\\Polyfill\\Php56\\' => 23, 'Symfony\\Polyfill\\Php56\\' => 23,
'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Mbstring\\' => 26,
'Symfony\\Polyfill\\Ctype\\' => 23, 'Symfony\\Polyfill\\Ctype\\' => 23,
@@ -177,6 +176,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'Cron\\' => 5, 'Cron\\' => 5,
'Collective\\Html\\' => 16, 'Collective\\Html\\' => 16,
'Chumper\\Zipper\\' => 15, 'Chumper\\Zipper\\' => 15,
'Carbon\\' => 7,
), ),
'B' => 'B' =>
array ( array (
@@ -288,9 +288,9 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
array ( array (
0 => __DIR__ . '/..' . '/symfony/polyfill-util', 0 => __DIR__ . '/..' . '/symfony/polyfill-util',
), ),
'Symfony\\Polyfill\\Php70\\' => 'Symfony\\Polyfill\\Php72\\' =>
array ( array (
0 => __DIR__ . '/..' . '/symfony/polyfill-php70', 0 => __DIR__ . '/..' . '/symfony/polyfill-php72',
), ),
'Symfony\\Polyfill\\Php56\\' => 'Symfony\\Polyfill\\Php56\\' =>
array ( array (
@@ -526,7 +526,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
), ),
'Cron\\' => 'Cron\\' =>
array ( array (
0 => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron', 0 => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron',
), ),
'Collective\\Html\\' => 'Collective\\Html\\' =>
array ( array (
@@ -536,6 +536,10 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
array ( array (
0 => __DIR__ . '/..' . '/chumper/zipper/src/Chumper/Zipper', 0 => __DIR__ . '/..' . '/chumper/zipper/src/Chumper/Zipper',
), ),
'Carbon\\' =>
array (
0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon',
),
'Barryvdh\\Debugbar\\' => 'Barryvdh\\Debugbar\\' =>
array ( array (
0 => __DIR__ . '/..' . '/barryvdh/laravel-debugbar/src', 0 => __DIR__ . '/..' . '/barryvdh/laravel-debugbar/src',
@@ -550,10 +554,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
), ),
); );
public static $fallbackDirsPsr4 = array (
0 => __DIR__ . '/..' . '/nesbot/carbon/src',
);
public static $prefixesPsr0 = array ( public static $prefixesPsr0 = array (
't' => 't' =>
array ( array (
@@ -687,8 +687,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'AddForeignKeysToUsersTable' => __DIR__ . '/../..' . '/database/migrations/2016_02_16_140454_add_foreign_keys_to_users_table.php', 'AddForeignKeysToUsersTable' => __DIR__ . '/../..' . '/database/migrations/2016_02_16_140454_add_foreign_keys_to_users_table.php',
'Adobe_Font_Metrics' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Adobe_Font_Metrics.php', 'Adobe_Font_Metrics' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Adobe_Font_Metrics.php',
'AlterTicketSourceTable' => __DIR__ . '/../..' . '/database/migrations/2016_08_16_104539_alter_ticket_source_table.php', 'AlterTicketSourceTable' => __DIR__ . '/../..' . '/database/migrations/2016_08_16_104539_alter_ticket_source_table.php',
'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
'Attribute_Translator' => __DIR__ . '/..' . '/dompdf/dompdf/include/attribute_translator.cls.php', 'Attribute_Translator' => __DIR__ . '/..' . '/dompdf/dompdf/include/attribute_translator.cls.php',
'Block_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/block_frame_decorator.cls.php', 'Block_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/block_frame_decorator.cls.php',
'Block_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/block_frame_reflower.cls.php', 'Block_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/block_frame_reflower.cls.php',
@@ -781,12 +779,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'DOMPDF_Exception' => __DIR__ . '/..' . '/dompdf/dompdf/include/dompdf_exception.cls.php', 'DOMPDF_Exception' => __DIR__ . '/..' . '/dompdf/dompdf/include/dompdf_exception.cls.php',
'DOMPDF_Image_Exception' => __DIR__ . '/..' . '/dompdf/dompdf/include/dompdf_image_exception.cls.php', 'DOMPDF_Image_Exception' => __DIR__ . '/..' . '/dompdf/dompdf/include/dompdf_image_exception.cls.php',
'DatabaseSeeder' => __DIR__ . '/../..' . '/database/seeds/DatabaseSeeder.php', 'DatabaseSeeder' => __DIR__ . '/../..' . '/database/seeds/DatabaseSeeder.php',
'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
'Encoding_Map' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Encoding_Map.php', 'Encoding_Map' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Encoding_Map.php',
'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php',
'File_Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php',
'File_Iterator_Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php',
'File_Iterator_Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php',
'Fixed_Positioner' => __DIR__ . '/..' . '/dompdf/dompdf/include/fixed_positioner.cls.php', 'Fixed_Positioner' => __DIR__ . '/..' . '/dompdf/dompdf/include/fixed_positioner.cls.php',
'Font' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Font.php', 'Font' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Font.php',
'Font_Binary_Stream' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Font_Binary_Stream.php', 'Font_Binary_Stream' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Font_Binary_Stream.php',
@@ -881,7 +874,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php',
'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php',
'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/AssertionFailedError.php',
'PHPUnit\\Framework\\BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/BaseTestListener.php',
'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CodeCoverageException.php',
'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php',
'PHPUnit\\Framework\\Constraint\\ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', 'PHPUnit\\Framework\\Constraint\\ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
@@ -944,49 +936,50 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestError.php',
'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php',
'PHPUnit\\Framework\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php', 'PHPUnit\\Framework\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php',
'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Exception/BadMethodCallException.php', 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php',
'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/Identity.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php',
'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/InvocationMocker.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php',
'PHPUnit\\Framework\\MockObject\\Builder\\Match' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/Match.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php',
'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/MethodNameMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php',
'PHPUnit\\Framework\\MockObject\\Builder\\NamespaceMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/NamespaceMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\NamespaceMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/NamespaceMatch.php',
'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/ParametersMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php',
'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/Stub.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php',
'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Exception/Exception.php', 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php',
'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Generator.php', 'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator.php',
'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Invocation/Invocation.php', 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation/Invocation.php',
'PHPUnit\\Framework\\MockObject\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/InvocationMocker.php', 'PHPUnit\\Framework\\MockObject\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/InvocationMocker.php',
'PHPUnit\\Framework\\MockObject\\Invocation\\ObjectInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Invocation/ObjectInvocation.php', 'PHPUnit\\Framework\\MockObject\\Invocation\\ObjectInvocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation/ObjectInvocation.php',
'PHPUnit\\Framework\\MockObject\\Invocation\\StaticInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Invocation/StaticInvocation.php', 'PHPUnit\\Framework\\MockObject\\Invocation\\StaticInvocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation/StaticInvocation.php',
'PHPUnit\\Framework\\MockObject\\Invokable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Invokable.php', 'PHPUnit\\Framework\\MockObject\\Invokable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invokable.php',
'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher.php', 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/AnyInvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/AnyInvokedCount.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/AnyParameters.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/AnyParameters.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/ConsecutiveParameters.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/ConsecutiveParameters.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/Invocation.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\DeferredError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/DeferredError.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtIndex.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/Invocation.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtLeastCount.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtIndex.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtLeastOnce.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtMostCount.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtMostCount.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedRecorder.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedCount.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/MethodName.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedRecorder.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/Parameters.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/MethodName.php',
'PHPUnit\\Framework\\MockObject\\Matcher\\StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/StatelessInvocation.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/Parameters.php',
'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/MockBuilder.php', 'PHPUnit\\Framework\\MockObject\\Matcher\\StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/StatelessInvocation.php',
'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/ForwardCompatibility/MockObject.php', 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php',
'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Exception/RuntimeException.php', 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ForwardCompatibility/MockObject.php',
'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub.php', 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ConsecutiveCalls.php', 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub.php',
'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/Exception.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php',
'PHPUnit\\Framework\\MockObject\\Stub\\MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/MatcherCollection.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnArgument.php', 'PHPUnit\\Framework\\MockObject\\Stub\\MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/MatcherCollection.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnCallback.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnReference.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnSelf.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnStub.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php',
'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnValueMap.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php',
'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Verifiable.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php',
'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php',
'PHPUnit\\Framework\\OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/OutputError.php', 'PHPUnit\\Framework\\OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/OutputError.php',
'PHPUnit\\Framework\\RiskyTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTest.php', 'PHPUnit\\Framework\\RiskyTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTest.php',
'PHPUnit\\Framework\\RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTestError.php', 'PHPUnit\\Framework\\RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTestError.php',
@@ -1007,16 +1000,34 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php',
'PHPUnit\\Framework\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Warning.php', 'PHPUnit\\Framework\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Warning.php',
'PHPUnit\\Framework\\WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php', 'PHPUnit\\Framework\\WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php',
'PHPUnit\\Runner\\AfterIncompleteTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php',
'PHPUnit\\Runner\\AfterLastTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php',
'PHPUnit\\Runner\\AfterRiskyTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php',
'PHPUnit\\Runner\\AfterSkippedTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php',
'PHPUnit\\Runner\\AfterSuccessfulTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php',
'PHPUnit\\Runner\\AfterTestErrorHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php',
'PHPUnit\\Runner\\AfterTestFailureHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php',
'PHPUnit\\Runner\\AfterTestWarningHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php',
'PHPUnit\\Runner\\BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', 'PHPUnit\\Runner\\BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php',
'PHPUnit\\Runner\\BeforeFirstTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php',
'PHPUnit\\Runner\\BeforeTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php',
'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php',
'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php',
'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php',
'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php',
'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php',
'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php',
'PHPUnit\\Runner\\Hook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/Hook.php',
'PHPUnit\\Runner\\NullTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/NullTestResultCache.php',
'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php',
'PHPUnit\\Runner\\ResultCacheExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php',
'PHPUnit\\Runner\\StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', 'PHPUnit\\Runner\\StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php',
'PHPUnit\\Runner\\TestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestHook.php',
'PHPUnit\\Runner\\TestListenerAdapter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php',
'PHPUnit\\Runner\\TestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestResultCache.php',
'PHPUnit\\Runner\\TestResultCacheInterface' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestResultCacheInterface.php',
'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php',
'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php',
'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php',
'PHPUnit\\TextUI\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', 'PHPUnit\\TextUI\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php',
'PHPUnit\\TextUI\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', 'PHPUnit\\TextUI\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php',
@@ -1025,7 +1036,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHPUnit\\Util\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php', 'PHPUnit\\Util\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php',
'PHPUnit\\Util\\ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', 'PHPUnit\\Util\\ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php',
'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php',
'PHPUnit\\Util\\Fileloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Fileloader.php', 'PHPUnit\\Util\\FileLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/FileLoader.php',
'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php',
'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php',
'PHPUnit\\Util\\Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php', 'PHPUnit\\Util\\Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php',
@@ -1040,18 +1051,19 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', 'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php',
'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php', 'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php',
'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php',
'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php',
'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php',
'PHPUnit\\Util\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', 'PHPUnit\\Util\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php',
'PHPUnit\\Util\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', 'PHPUnit\\Util\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php',
'PHPUnit\\Util\\TestDox\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TestResult.php',
'PHPUnit\\Util\\TestDox\\TextResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php',
'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php',
'PHPUnit\\Util\\TextTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', 'PHPUnit\\Util\\TextTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TextTestListRenderer.php',
'PHPUnit\\Util\\Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', 'PHPUnit\\Util\\Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php',
'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml.php', 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml.php',
'PHPUnit\\Util\\XmlTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', 'PHPUnit\\Util\\XmlTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php',
'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/MockObject.php', 'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php',
'PHP_Evaluator' => __DIR__ . '/..' . '/dompdf/dompdf/include/php_evaluator.cls.php', 'PHP_Evaluator' => __DIR__ . '/..' . '/dompdf/dompdf/include/php_evaluator.cls.php',
'PHP_Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php',
'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
@@ -1061,9 +1073,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ASYNC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_AWAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
@@ -1087,7 +1097,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_COMPILER_HALT_OFFSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
@@ -1122,9 +1131,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ENUM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EQUALS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
@@ -1142,7 +1149,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_IN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
@@ -1159,10 +1165,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_JOIN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LAMBDA_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LAMBDA_CP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LAMBDA_OP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
@@ -1180,11 +1182,9 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_NULLSAFE_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_ONUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
@@ -1207,7 +1207,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SHAPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
@@ -1218,7 +1217,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SUPER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php', 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php',
'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php',
@@ -1227,34 +1225,20 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TYPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TYPELIST_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_TYPELIST_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_WHERE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_ATTRIBUTE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_CATEGORY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_CATEGORY_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_CHILDREN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_REQUIRED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_TAG_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_TAG_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XHP_TEXT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
'Page_Cache' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_cache.cls.php', 'Page_Cache' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_cache.cls.php',
'Page_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_frame_decorator.cls.php', 'Page_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_frame_decorator.cls.php',
'Page_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_frame_reflower.cls.php', 'Page_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_frame_reflower.cls.php',
'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php',
'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php',
'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php',
@@ -1304,20 +1288,21 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php',
'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php',
'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php',
'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/AbstractVersionConstraint.php', 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php',
'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/AndVersionConstraintGroup.php', 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php',
'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/AnyVersionConstraint.php', 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php',
'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/ExactVersionConstraint.php', 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php',
'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/Exception.php', 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php',
'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/GreaterThanOrEqualToVersionConstraint.php', 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php',
'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/InvalidVersionException.php', 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php',
'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/OrVersionConstraintGroup.php', 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php',
'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php',
'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php',
'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/SpecificMajorAndMinorVersionConstraint.php', 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php',
'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/SpecificMajorVersionConstraint.php', 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php',
'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/UnsupportedVersionConstraintException.php', 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php',
'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php',
'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraint.php', 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php',
'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php',
'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php',
'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php',
@@ -1326,7 +1311,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php',
'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php',
'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php',
'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/HHVM.php',
'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php',
'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php',
'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php',
@@ -1381,6 +1365,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php',
'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php',
'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php',
'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php',
'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php',
'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php',
'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php',
@@ -1391,6 +1376,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php',
'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php',
'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php',
'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php',
'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php',
'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php',
'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php',
@@ -1398,6 +1384,9 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'SebastianBergmann\\Environment\\OperatingSystem' => __DIR__ . '/..' . '/sebastian/environment/src/OperatingSystem.php', 'SebastianBergmann\\Environment\\OperatingSystem' => __DIR__ . '/..' . '/sebastian/environment/src/OperatingSystem.php',
'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php',
'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php',
'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php',
'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php',
'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php',
'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php', 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php',
'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php',
'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php',
@@ -1414,8 +1403,10 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php',
'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php',
'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php', 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php',
'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/Exception.php',
'SebastianBergmann\\Timer\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-timer/src/RuntimeException.php',
'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php',
'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php',
'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
'Style' => __DIR__ . '/..' . '/dompdf/dompdf/include/style.cls.php', 'Style' => __DIR__ . '/..' . '/dompdf/dompdf/include/style.cls.php',
'Stylesheet' => __DIR__ . '/..' . '/dompdf/dompdf/include/stylesheet.cls.php', 'Stylesheet' => __DIR__ . '/..' . '/dompdf/dompdf/include/stylesheet.cls.php',
'TCPDF_Adapter' => __DIR__ . '/..' . '/dompdf/dompdf/include/tcpdf_adapter.cls.php', 'TCPDF_Adapter' => __DIR__ . '/..' . '/dompdf/dompdf/include/tcpdf_adapter.cls.php',
@@ -1432,7 +1423,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'Table_Row_Group_Renderer' => __DIR__ . '/..' . '/dompdf/dompdf/include/table_row_group_renderer.cls.php', 'Table_Row_Group_Renderer' => __DIR__ . '/..' . '/dompdf/dompdf/include/table_row_group_renderer.cls.php',
'Table_Row_Positioner' => __DIR__ . '/..' . '/dompdf/dompdf/include/table_row_positioner.cls.php', 'Table_Row_Positioner' => __DIR__ . '/..' . '/dompdf/dompdf/include/table_row_positioner.cls.php',
'TestCase' => __DIR__ . '/../..' . '/tests/TestCase.php', 'TestCase' => __DIR__ . '/../..' . '/tests/TestCase.php',
'Tests\\DuskTestCase' => __DIR__ . '/../..' . '/tests/DuskTestCase.php',
'Text_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_frame_decorator.cls.php', 'Text_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_frame_decorator.cls.php',
'Text_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_frame_reflower.cls.php', 'Text_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_frame_reflower.cls.php',
'Text_Renderer' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_renderer.cls.php', 'Text_Renderer' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_renderer.cls.php',
@@ -1445,7 +1435,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php',
'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php',
'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php',
'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
'Version1079table' => __DIR__ . '/../..' . '/database/migrations/2016_06_28_141613_version1079table.php', 'Version1079table' => __DIR__ . '/../..' . '/database/migrations/2016_06_28_141613_version1079table.php',
); );
@@ -1454,7 +1443,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d
return \Closure::bind(function () use ($loader) { return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixLengthsPsr4; $loader->prefixLengthsPsr4 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixDirsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixDirsPsr4;
$loader->fallbackDirsPsr4 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$fallbackDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixesPsr0; $loader->prefixesPsr0 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixesPsr0;
$loader->classMap = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$classMap; $loader->classMap = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$classMap;

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,35 @@
# Change Log # Change Log
## [2.2.0] - 2018-06-05
### Added
- Added support for steps larger than field ranges (#6)
## Changed
- N/A
### Fixed
- Fixed validation for numbers with leading 0s (#12)
## [2.1.0] - 2018-04-06
### Added
- N/A
### Changed
- Upgraded to PHPUnit 6 (#2)
### Fixed
- Refactored timezones to deal with some inconsistent behavior (#3)
- Allow ranges and lists in same expression (#5)
- Fixed regression where literals were not converted to their numerical counterpart (#)
## [2.0.0] - 2017-10-12
### Added
- N/A
### Changed
- Dropped support for PHP 5.x
- Dropped support for the YEAR field, as it was not part of the cron standard
### Fixed
- Reworked validation for all the field types
- Stepping should now work for 1-indexed fields like Month (#153)
## [1.2.0] - 2017-01-22 ## [1.2.0] - 2017-01-22
### Added ### Added
- Added IDE, CodeSniffer, and StyleCI.IO support - Added IDE, CodeSniffer, and StyleCI.IO support

View File

@@ -1,4 +1,4 @@
Copyright (c) 2011 Michael Dowling <mtdowling@gmail.com> and contributors Copyright (c) 2011 Michael Dowling <mtdowling@gmail.com>, 2016 Chris Tankersley <chris@ctankersley.com>, and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,7 +1,7 @@
PHP Cron Expression Parser PHP Cron Expression Parser
========================== ==========================
[![Latest Stable Version](https://poser.pugx.org/mtdowling/cron-expression/v/stable.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Total Downloads](https://poser.pugx.org/mtdowling/cron-expression/downloads.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Build Status](https://secure.travis-ci.org/mtdowling/cron-expression.png)](http://travis-ci.org/mtdowling/cron-expression) [![Latest Stable Version](https://poser.pugx.org/dragonmantank/cron-expression/v/stable.png)](https://packagist.org/packages/dragonmantank/cron-expression) [![Total Downloads](https://poser.pugx.org/dragonmantank/cron-expression/downloads.png)](https://packagist.org/packages/dragonmantank/cron-expression) [![Build Status](https://secure.travis-ci.org/dragonmantank/cron-expression.png)](http://travis-ci.org/dragonmantank/cron-expression)
The PHP cron expression parser can parse a CRON expression, determine if it is The PHP cron expression parser can parse a CRON expression, determine if it is
due to run, calculate the next run date of the expression, and calculate the previous due to run, calculate the next run date of the expression, and calculate the previous
@@ -13,13 +13,15 @@ lists (e.g. 1,2,3), W to find the nearest weekday for a given day of the month,
find the last day of the month, L to find the last given weekday of a month, and hash find the last day of the month, L to find the last given weekday of a month, and hash
(#) to find the nth weekday of a given month. (#) to find the nth weekday of a given month.
More information about this fork can be found in the blog post [here](http://ctankersley.com/2017/10/12/cron-expression-update/). tl;dr - v2.0.0 is a major breaking change, and @dragonmantank can better take care of the project in a separate fork.
Installing Installing
========== ==========
Add the dependency to your project: Add the dependency to your project:
```bash ```bash
composer require mtdowling/cron-expression composer require dragonmantank/cron-expression
``` ```
Usage Usage
@@ -36,7 +38,7 @@ echo $cron->getNextRunDate()->format('Y-m-d H:i:s');
echo $cron->getPreviousRunDate()->format('Y-m-d H:i:s'); echo $cron->getPreviousRunDate()->format('Y-m-d H:i:s');
// Works with complex expressions // Works with complex expressions
$cron = Cron\CronExpression::factory('3-59/15 2,6-12 */15 1 2-5'); $cron = Cron\CronExpression::factory('3-59/15 6-12 */15 1 2-5');
echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); echo $cron->getNextRunDate()->format('Y-m-d H:i:s');
// Calculate a run date two iterations into the future // Calculate a run date two iterations into the future
@@ -53,10 +55,10 @@ CRON Expressions
A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows: A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows:
* * * * * * * * * * *
- - - - - - - - - - -
| | | | | | | | | | |
| | | | | + year [optional] | | | | |
| | | | +----- day of week (0 - 7) (Sunday=0 or 7) | | | | +----- day of week (0 - 7) (Sunday=0 or 7)
| | | +---------- month (1 - 12) | | | +---------- month (1 - 12)
| | +--------------- day of month (1 - 31) | | +--------------- day of month (1 - 31)
@@ -66,6 +68,6 @@ A CRON expression is a string representing the schedule for a particular command
Requirements Requirements
============ ============
- PHP 5.3+ - PHP 7.0+
- PHPUnit is required to run the unit tests - PHPUnit is required to run the unit tests
- Composer is required to run the unit tests - Composer is required to run the unit tests

View File

@@ -0,0 +1,35 @@
{
"name": "dragonmantank/cron-expression",
"type": "library",
"description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
"keywords": ["cron", "schedule"],
"license": "MIT",
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Chris Tankersley",
"email": "chris@ctankersley.com",
"homepage": "https://github.com/dragonmantank"
}
],
"require": {
"php": ">=7.0.0"
},
"require-dev": {
"phpunit/phpunit": "~6.4"
},
"autoload": {
"psr-4": {
"Cron\\": "src/Cron/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/Cron/"
}
}
}

View File

@@ -0,0 +1,278 @@
<?php
namespace Cron;
/**
* Abstract CRON expression field
*/
abstract class AbstractField implements FieldInterface
{
/**
* Full range of values that are allowed for this field type
* @var array
*/
protected $fullRange = [];
/**
* Literal values we need to convert to integers
* @var array
*/
protected $literals = [];
/**
* Start value of the full range
* @var integer
*/
protected $rangeStart;
/**
* End value of the full range
* @var integer
*/
protected $rangeEnd;
public function __construct()
{
$this->fullRange = range($this->rangeStart, $this->rangeEnd);
}
/**
* Check to see if a field is satisfied by a value
*
* @param string $dateValue Date value to check
* @param string $value Value to test
*
* @return bool
*/
public function isSatisfied($dateValue, $value)
{
if ($this->isIncrementsOfRanges($value)) {
return $this->isInIncrementsOfRanges($dateValue, $value);
} elseif ($this->isRange($value)) {
return $this->isInRange($dateValue, $value);
}
return $value == '*' || $dateValue == $value;
}
/**
* Check if a value is a range
*
* @param string $value Value to test
*
* @return bool
*/
public function isRange($value)
{
return strpos($value, '-') !== false;
}
/**
* Check if a value is an increments of ranges
*
* @param string $value Value to test
*
* @return bool
*/
public function isIncrementsOfRanges($value)
{
return strpos($value, '/') !== false;
}
/**
* Test if a value is within a range
*
* @param string $dateValue Set date value
* @param string $value Value to test
*
* @return bool
*/
public function isInRange($dateValue, $value)
{
$parts = array_map(function($value) {
$value = trim($value);
$value = $this->convertLiterals($value);
return $value;
},
explode('-', $value, 2)
);
return $dateValue >= $parts[0] && $dateValue <= $parts[1];
}
/**
* Test if a value is within an increments of ranges (offset[-to]/step size)
*
* @param string $dateValue Set date value
* @param string $value Value to test
*
* @return bool
*/
public function isInIncrementsOfRanges($dateValue, $value)
{
$chunks = array_map('trim', explode('/', $value, 2));
$range = $chunks[0];
$step = isset($chunks[1]) ? $chunks[1] : 0;
// No step or 0 steps aren't cool
if (is_null($step) || '0' === $step || 0 === $step) {
return false;
}
// Expand the * to a full range
if ('*' == $range) {
$range = $this->rangeStart . '-' . $this->rangeEnd;
}
// Generate the requested small range
$rangeChunks = explode('-', $range, 2);
$rangeStart = $rangeChunks[0];
$rangeEnd = isset($rangeChunks[1]) ? $rangeChunks[1] : $rangeStart;
if ($rangeStart < $this->rangeStart || $rangeStart > $this->rangeEnd || $rangeStart > $rangeEnd) {
throw new \OutOfRangeException('Invalid range start requested');
}
if ($rangeEnd < $this->rangeStart || $rangeEnd > $this->rangeEnd || $rangeEnd < $rangeStart) {
throw new \OutOfRangeException('Invalid range end requested');
}
// Steps larger than the range need to wrap around and be handled slightly differently than smaller steps
if ($step >= $this->rangeEnd) {
$thisRange = [$this->fullRange[$step % count($this->fullRange)]];
} else {
$thisRange = range($rangeStart, $rangeEnd, $step);
}
return in_array($dateValue, $thisRange);
}
/**
* Returns a range of values for the given cron expression
*
* @param string $expression The expression to evaluate
* @param int $max Maximum offset for range
*
* @return array
*/
public function getRangeForExpression($expression, $max)
{
$values = array();
$expression = $this->convertLiterals($expression);
if (strpos($expression, ',') !== false) {
$ranges = explode(',', $expression);
$values = [];
foreach ($ranges as $range) {
$expanded = $this->getRangeForExpression($range, $this->rangeEnd);
$values = array_merge($values, $expanded);
}
return $values;
}
if ($this->isRange($expression) || $this->isIncrementsOfRanges($expression)) {
if (!$this->isIncrementsOfRanges($expression)) {
list ($offset, $to) = explode('-', $expression);
$offset = $this->convertLiterals($offset);
$to = $this->convertLiterals($to);
$stepSize = 1;
}
else {
$range = array_map('trim', explode('/', $expression, 2));
$stepSize = isset($range[1]) ? $range[1] : 0;
$range = $range[0];
$range = explode('-', $range, 2);
$offset = $range[0];
$to = isset($range[1]) ? $range[1] : $max;
}
$offset = $offset == '*' ? $this->rangeStart : $offset;
if ($stepSize >= $this->rangeEnd) {
$values = [$this->fullRange[$stepSize % count($this->fullRange)]];
} else {
for ($i = $offset; $i <= $to; $i += $stepSize) {
$values[] = (int)$i;
}
}
sort($values);
}
else {
$values = array($expression);
}
return $values;
}
protected function convertLiterals($value)
{
if (count($this->literals)) {
$key = array_search($value, $this->literals);
if ($key !== false) {
return $key;
}
}
return $value;
}
/**
* Checks to see if a value is valid for the field
*
* @param string $value
* @return bool
*/
public function validate($value)
{
$value = $this->convertLiterals($value);
// All fields allow * as a valid value
if ('*' === $value) {
return true;
}
if (strpos($value, '/') !== false) {
list($range, $step) = explode('/', $value);
return $this->validate($range) && filter_var($step, FILTER_VALIDATE_INT);
}
// Validate each chunk of a list individually
if (strpos($value, ',') !== false) {
foreach (explode(',', $value) as $listItem) {
if (!$this->validate($listItem)) {
return false;
}
}
return true;
}
if (strpos($value, '-') !== false) {
if (substr_count($value, '-') > 1) {
return false;
}
$chunks = explode('-', $value);
$chunks[0] = $this->convertLiterals($chunks[0]);
$chunks[1] = $this->convertLiterals($chunks[1]);
if ('*' == $chunks[0] || '*' == $chunks[1]) {
return false;
}
return $this->validate($chunks[0]) && $this->validate($chunks[1]);
}
if (!is_numeric($value)) {
return false;
}
if (is_float($value) || strpos($value, '.') !== false) {
return false;
}
// We should have a numeric by now, so coerce this into an integer
$value = (int) $value;
return in_array($value, $this->fullRange, true);
}
}

View File

@@ -171,7 +171,7 @@ class CronExpression
public function setMaxIterationCount($maxIterationCount) public function setMaxIterationCount($maxIterationCount)
{ {
$this->maxIterationCount = $maxIterationCount; $this->maxIterationCount = $maxIterationCount;
return $this; return $this;
} }
@@ -187,13 +187,14 @@ class CronExpression
* matches and so on. * matches and so on.
* @param bool $allowCurrentDate Set to TRUE to return the current date if * @param bool $allowCurrentDate Set to TRUE to return the current date if
* it matches the cron expression. * it matches the cron expression.
* @param null|string $timeZone TimeZone to use instead of the system default
* *
* @return \DateTime * @return \DateTime
* @throws \RuntimeException on too many iterations * @throws \RuntimeException on too many iterations
*/ */
public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false, $timeZone = null)
{ {
return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate); return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate, $timeZone);
} }
/** /**
@@ -203,14 +204,15 @@ class CronExpression
* @param int $nth Number of matches to skip before returning * @param int $nth Number of matches to skip before returning
* @param bool $allowCurrentDate Set to TRUE to return the * @param bool $allowCurrentDate Set to TRUE to return the
* current date if it matches the cron expression * current date if it matches the cron expression
* @param null|string $timeZone TimeZone to use instead of the system default
* *
* @return \DateTime * @return \DateTime
* @throws \RuntimeException on too many iterations * @throws \RuntimeException on too many iterations
* @see \Cron\CronExpression::getNextRunDate * @see \Cron\CronExpression::getNextRunDate
*/ */
public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false, $timeZone = null)
{ {
return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate); return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate, $timeZone);
} }
/** /**
@@ -221,15 +223,16 @@ class CronExpression
* @param bool $invert Set to TRUE to retrieve previous dates * @param bool $invert Set to TRUE to retrieve previous dates
* @param bool $allowCurrentDate Set to TRUE to return the * @param bool $allowCurrentDate Set to TRUE to return the
* current date if it matches the cron expression * current date if it matches the cron expression
* @param null|string $timeZone TimeZone to use instead of the system default
* *
* @return array Returns an array of run dates * @return array Returns an array of run dates
*/ */
public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false) public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false, $timeZone = null)
{ {
$matches = array(); $matches = array();
for ($i = 0; $i < max(0, $total); $i++) { for ($i = 0; $i < max(0, $total); $i++) {
try { try {
$matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate); $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate, $timeZone);
} catch (RuntimeException $e) { } catch (RuntimeException $e) {
break; break;
} }
@@ -274,34 +277,30 @@ class CronExpression
* seconds are irrelevant, and should be called once per minute. * seconds are irrelevant, and should be called once per minute.
* *
* @param string|\DateTime $currentTime Relative calculation date * @param string|\DateTime $currentTime Relative calculation date
* @param null|string $timeZone TimeZone to use instead of the system default
* *
* @return bool Returns TRUE if the cron is due to run or FALSE if not * @return bool Returns TRUE if the cron is due to run or FALSE if not
*/ */
public function isDue($currentTime = 'now') public function isDue($currentTime = 'now', $timeZone = null)
{ {
$timeZone = $this->determineTimeZone($currentTime, $timeZone);
if ('now' === $currentTime) { if ('now' === $currentTime) {
$currentDate = date('Y-m-d H:i'); $currentTime = new DateTime();
$currentTime = strtotime($currentDate);
} elseif ($currentTime instanceof DateTime) { } elseif ($currentTime instanceof DateTime) {
$currentDate = clone $currentTime; //
// Ensure time in 'current' timezone is used
$currentDate->setTimezone(new DateTimeZone(date_default_timezone_get()));
$currentDate = $currentDate->format('Y-m-d H:i');
$currentTime = strtotime($currentDate);
} elseif ($currentTime instanceof DateTimeImmutable) { } elseif ($currentTime instanceof DateTimeImmutable) {
$currentDate = DateTime::createFromFormat('U', $currentTime->format('U')); $currentTime = DateTime::createFromFormat('U', $currentTime->format('U'));
$currentDate->setTimezone(new DateTimeZone(date_default_timezone_get()));
$currentDate = $currentDate->format('Y-m-d H:i');
$currentTime = strtotime($currentDate);
} else { } else {
$currentTime = new DateTime($currentTime); $currentTime = new DateTime($currentTime);
$currentTime->setTime($currentTime->format('H'), $currentTime->format('i'), 0);
$currentDate = $currentTime->format('Y-m-d H:i');
$currentTime = $currentTime->getTimeStamp();
} }
$currentTime->setTimeZone(new DateTimeZone($timeZone));
// drop the seconds to 0
$currentTime = DateTime::createFromFormat('Y-m-d H:i', $currentTime->format('Y-m-d H:i'));
try { try {
return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime; return $this->getNextRunDate($currentTime, 0, true)->getTimestamp() === $currentTime->getTimestamp();
} catch (Exception $e) { } catch (Exception $e) {
return false; return false;
} }
@@ -315,22 +314,24 @@ class CronExpression
* @param bool $invert Set to TRUE to go backwards in time * @param bool $invert Set to TRUE to go backwards in time
* @param bool $allowCurrentDate Set to TRUE to return the * @param bool $allowCurrentDate Set to TRUE to return the
* current date if it matches the cron expression * current date if it matches the cron expression
* @param string|null $timeZone TimeZone to use instead of the system default
* *
* @return \DateTime * @return \DateTime
* @throws \RuntimeException on too many iterations * @throws \RuntimeException on too many iterations
*/ */
protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false) protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false, $timeZone = null)
{ {
$timeZone = $this->determineTimeZone($currentTime, $timeZone);
if ($currentTime instanceof DateTime) { if ($currentTime instanceof DateTime) {
$currentDate = clone $currentTime; $currentDate = clone $currentTime;
} elseif ($currentTime instanceof DateTimeImmutable) { } elseif ($currentTime instanceof DateTimeImmutable) {
$currentDate = DateTime::createFromFormat('U', $currentTime->format('U')); $currentDate = DateTime::createFromFormat('U', $currentTime->format('U'));
$currentDate->setTimezone($currentTime->getTimezone());
} else { } else {
$currentDate = new DateTime($currentTime ?: 'now'); $currentDate = new DateTime($currentTime ?: 'now');
$currentDate->setTimezone(new DateTimeZone(date_default_timezone_get()));
} }
$currentDate->setTimeZone(new DateTimeZone($timeZone));
$currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0); $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0);
$nextRun = clone $currentDate; $nextRun = clone $currentDate;
$nth = (int) $nth; $nth = (int) $nth;
@@ -386,4 +387,25 @@ class CronExpression
throw new RuntimeException('Impossible CRON expression'); throw new RuntimeException('Impossible CRON expression');
// @codeCoverageIgnoreEnd // @codeCoverageIgnoreEnd
} }
/**
* Workout what timeZone should be used.
*
* @param string|\DateTime $currentTime Relative calculation date
* @param string|null $timeZone TimeZone to use instead of the system default
*
* @return string
*/
protected function determineTimeZone($currentTime, $timeZone)
{
if (! is_null($timeZone)) {
return $timeZone;
}
if ($currentTime instanceOf Datetime) {
return $currentTime->getTimeZone()->getName();
}
return date_default_timezone_get();
}
} }

View File

@@ -24,6 +24,9 @@ use DateTime;
*/ */
class DayOfMonthField extends AbstractField class DayOfMonthField extends AbstractField
{ {
protected $rangeStart = 1;
protected $rangeEnd = 31;
/** /**
* Get the nearest day of the week for a given day in a month * Get the nearest day of the week for a given day in a month
* *
@@ -99,75 +102,30 @@ class DayOfMonthField extends AbstractField
} }
/** /**
* Validates that the value is valid for the Day of the Month field * @inheritDoc
* Days of the month can contain values of 1-31, *, L, or ? by default. This can be augmented with lists via a ',',
* ranges via a '-', or with a '[0-9]W' to specify the closest weekday.
*
* @param string $value
* @return bool
*/ */
public function validate($value) public function validate($value)
{ {
// Allow wildcards and a single L $basicChecks = parent::validate($value);
if ($value === '?' || $value === '*' || $value === 'L') {
return true; // Validate that a list don't have W or L
if (strpos($value, ',') !== false && (strpos($value, 'W') !== false || strpos($value, 'L') !== false)) {
return false;
} }
// If you only contain numbers and are within 1-31 if (!$basicChecks) {
if ((bool) preg_match('/^\d{1,2}$/', $value) && ($value >= 1 && $value <= 31)) {
return true;
}
// If you have a -, we will deal with each of your chunks if ($value === 'L') {
if ((bool) preg_match('/-/', $value)) { return true;
// We cannot have a range within a list or vice versa
if ((bool) preg_match('/,/', $value)) {
return false;
} }
$chunks = explode('-', $value); if (preg_match('/^(.*)W$/', $value, $matches)) {
foreach ($chunks as $chunk) { return $this->validate($matches[1]);
if (!$this->validate($chunk)) {
return false;
}
} }
return true; return false;
} }
// If you have a comma, we will deal with each value return $basicChecks;
if ((bool) preg_match('/,/', $value)) {
// We cannot have a range within a list or vice versa
if ((bool) preg_match('/-/', $value)) {
return false;
}
$chunks = explode(',', $value);
foreach ($chunks as $chunk) {
if (!$this->validate($chunk)) {
return false;
}
}
return true;
}
// If you contain a /, we'll deal with it
if ((bool) preg_match('/\//', $value)) {
$chunks = explode('/', $value);
foreach ($chunks as $chunk) {
if (!$this->validate($chunk)) {
return false;
}
}
return true;
}
// If you end in W, make sure that it has a numeric in front of it
if ((bool) preg_match('/^\d{1,2}W$/', $value)) {
return true;
}
return false;
} }
} }

View File

@@ -21,6 +21,19 @@ use InvalidArgumentException;
*/ */
class DayOfWeekField extends AbstractField class DayOfWeekField extends AbstractField
{ {
protected $rangeStart = 0;
protected $rangeEnd = 7;
protected $nthRange;
protected $literals = [1 => 'MON', 2 => 'TUE', 3 => 'WED', 4 => 'THU', 5 => 'FRI', 6 => 'SAT', 7 => 'SUN'];
public function __construct()
{
$this->nthRange = range(1, 5);
parent::__construct();
}
public function isSatisfiedBy(DateTime $date, $value) public function isSatisfiedBy(DateTime $date, $value)
{ {
if ($value == '?') { if ($value == '?') {
@@ -53,18 +66,28 @@ class DayOfWeekField extends AbstractField
if (strpos($value, '#')) { if (strpos($value, '#')) {
list($weekday, $nth) = explode('#', $value); list($weekday, $nth) = explode('#', $value);
if (!is_numeric($nth)) {
throw new InvalidArgumentException("Hashed weekdays must be numeric, {$nth} given");
} else {
$nth = (int) $nth;
}
// 0 and 7 are both Sunday, however 7 matches date('N') format ISO-8601 // 0 and 7 are both Sunday, however 7 matches date('N') format ISO-8601
if ($weekday === '0') { if ($weekday === '0') {
$weekday = 7; $weekday = 7;
} }
$weekday = $this->convertLiterals($weekday);
// Validate the hash fields // Validate the hash fields
if ($weekday < 0 || $weekday > 7) { if ($weekday < 0 || $weekday > 7) {
throw new InvalidArgumentException("Weekday must be a value between 0 and 7. {$weekday} given"); throw new InvalidArgumentException("Weekday must be a value between 0 and 7. {$weekday} given");
} }
if ($nth > 5) {
throw new InvalidArgumentException('There are never more than 5 of a given weekday in a month'); if (!in_array($nth, $this->nthRange)) {
throw new InvalidArgumentException("There are never more than 5 or less than 1 of a given weekday in a month, {$nth} given");
} }
// The current weekday must match the targeted weekday to proceed // The current weekday must match the targeted weekday to proceed
if ($date->format('N') != $weekday) { if ($date->format('N') != $weekday) {
return false; return false;
@@ -117,25 +140,31 @@ class DayOfWeekField extends AbstractField
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function validate($value) public function validate($value)
{ {
$value = $this->convertLiterals($value); $basicChecks = parent::validate($value);
foreach (explode(',', $value) as $expr) { if (!$basicChecks) {
if (!preg_match('/^(\*|[0-7](L?|#[1-5]))([\/\,\-][0-7]+)*$/', $expr)) { // Handle the # value
return false; if (strpos($value, '#') !== false) {
$chunks = explode('#', $value);
$chunks[0] = $this->convertLiterals($chunks[0]);
if (parent::validate($chunks[0]) && is_numeric($chunks[1]) && in_array($chunks[1], $this->nthRange)) {
return true;
}
} }
if (preg_match('/^(.*)L$/', $value, $matches)) {
return $this->validate($matches[1]);
}
return false;
} }
return true; return $basicChecks;
}
private function convertLiterals($string)
{
return str_ireplace(
array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'),
range(0, 6),
$string
);
} }
} }

View File

@@ -42,9 +42,6 @@ class FieldFactory
case 4: case 4:
$this->fields[$position] = new DayOfWeekField(); $this->fields[$position] = new DayOfWeekField();
break; break;
case 5:
$this->fields[$position] = new YearField();
break;
default: default:
throw new InvalidArgumentException( throw new InvalidArgumentException(
$position . ' is not a valid position' $position . ' is not a valid position'

View File

@@ -10,6 +10,9 @@ use DateTimeZone;
*/ */
class HoursField extends AbstractField class HoursField extends AbstractField
{ {
protected $rangeStart = 0;
protected $rangeEnd = 23;
public function isSatisfiedBy(DateTime $date, $value) public function isSatisfiedBy(DateTime $date, $value)
{ {
return $this->isSatisfied($date->format('H'), $value); return $this->isSatisfied($date->format('H'), $value);
@@ -63,9 +66,4 @@ class HoursField extends AbstractField
return $this; return $this;
} }
public function validate($value)
{
return (bool) preg_match('/^[\*,\/\-0-9]+$/', $value);
}
} }

View File

@@ -10,6 +10,9 @@ use DateTime;
*/ */
class MinutesField extends AbstractField class MinutesField extends AbstractField
{ {
protected $rangeStart = 0;
protected $rangeEnd = 59;
public function isSatisfiedBy(DateTime $date, $value) public function isSatisfiedBy(DateTime $date, $value)
{ {
return $this->isSatisfied($date->format('i'), $value); return $this->isSatisfied($date->format('i'), $value);
@@ -54,9 +57,4 @@ class MinutesField extends AbstractField
return $this; return $this;
} }
public function validate($value)
{
return (bool) preg_match('/^[\*,\/\-0-9]+$/', $value);
}
} }

View File

@@ -9,17 +9,14 @@ use DateTime;
*/ */
class MonthField extends AbstractField class MonthField extends AbstractField
{ {
protected $rangeStart = 1;
protected $rangeEnd = 12;
protected $literals = [1 => 'JAN', 2 => 'FEB', 3 => 'MAR', 4 => 'APR', 5 => 'MAY', 6 => 'JUN', 7 => 'JUL',
8 => 'AUG', 9 => 'SEP', 10 => 'OCT', 11 => 'NOV', 12 => 'DEC'];
public function isSatisfiedBy(DateTime $date, $value) public function isSatisfiedBy(DateTime $date, $value)
{ {
// Convert text month values to integers $value = $this->convertLiterals($value);
$value = str_ireplace(
array(
'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'
),
range(1, 12),
$value
);
return $this->isSatisfied($date->format('m'), $value); return $this->isSatisfied($date->format('m'), $value);
} }
@@ -37,8 +34,5 @@ class MonthField extends AbstractField
return $this; return $this;
} }
public function validate($value)
{
return (bool) preg_match('/^[\*,\/\-0-9A-Z]+$/', $value);
}
} }

View File

@@ -0,0 +1,139 @@
<?php
namespace Cron\Tests;
use Cron\DayOfWeekField;
use Cron\HoursField;
use Cron\MinutesField;
use Cron\MonthField;
use PHPUnit\Framework\TestCase;
/**
* @author Michael Dowling <mtdowling@gmail.com>
*/
class AbstractFieldTest extends TestCase
{
/**
* @covers \Cron\AbstractField::isRange
*/
public function testTestsIfRange()
{
$f = new DayOfWeekField();
$this->assertTrue($f->isRange('1-2'));
$this->assertFalse($f->isRange('2'));
}
/**
* @covers \Cron\AbstractField::isIncrementsOfRanges
*/
public function testTestsIfIncrementsOfRanges()
{
$f = new DayOfWeekField();
$this->assertFalse($f->isIncrementsOfRanges('1-2'));
$this->assertTrue($f->isIncrementsOfRanges('1/2'));
$this->assertTrue($f->isIncrementsOfRanges('*/2'));
$this->assertTrue($f->isIncrementsOfRanges('3-12/2'));
}
/**
* @covers \Cron\AbstractField::isInRange
*/
public function testTestsIfInRange()
{
$f = new DayOfWeekField();
$this->assertTrue($f->isInRange('1', '1-2'));
$this->assertTrue($f->isInRange('2', '1-2'));
$this->assertTrue($f->isInRange('5', '4-12'));
$this->assertFalse($f->isInRange('3', '4-12'));
$this->assertFalse($f->isInRange('13', '4-12'));
}
/**
* @covers \Cron\AbstractField::isInIncrementsOfRanges
*/
public function testTestsIfInIncrementsOfRangesOnZeroStartRange()
{
$f = new MinutesField();
$this->assertTrue($f->isInIncrementsOfRanges('3', '3-59/2'));
$this->assertTrue($f->isInIncrementsOfRanges('13', '3-59/2'));
$this->assertTrue($f->isInIncrementsOfRanges('15', '3-59/2'));
$this->assertTrue($f->isInIncrementsOfRanges('14', '*/2'));
$this->assertFalse($f->isInIncrementsOfRanges('2', '3-59/13'));
$this->assertFalse($f->isInIncrementsOfRanges('14', '*/13'));
$this->assertFalse($f->isInIncrementsOfRanges('14', '3-59/2'));
$this->assertFalse($f->isInIncrementsOfRanges('3', '2-59'));
$this->assertFalse($f->isInIncrementsOfRanges('3', '2'));
$this->assertFalse($f->isInIncrementsOfRanges('3', '*'));
$this->assertFalse($f->isInIncrementsOfRanges('0', '*/0'));
$this->assertFalse($f->isInIncrementsOfRanges('1', '*/0'));
$this->assertTrue($f->isInIncrementsOfRanges('4', '4/1'));
$this->assertFalse($f->isInIncrementsOfRanges('14', '4/1'));
$this->assertFalse($f->isInIncrementsOfRanges('34', '4/1'));
}
/**
* @covers \Cron\AbstractField::isInIncrementsOfRanges
*/
public function testTestsIfInIncrementsOfRangesOnOneStartRange()
{
$f = new MonthField();
$this->assertTrue($f->isInIncrementsOfRanges('3', '3-12/2'));
$this->assertFalse($f->isInIncrementsOfRanges('13', '3-12/2'));
$this->assertFalse($f->isInIncrementsOfRanges('15', '3-12/2'));
$this->assertTrue($f->isInIncrementsOfRanges('3', '*/2'));
$this->assertFalse($f->isInIncrementsOfRanges('3', '*/3'));
$this->assertTrue($f->isInIncrementsOfRanges('7', '*/3'));
$this->assertFalse($f->isInIncrementsOfRanges('14', '3-12/2'));
$this->assertFalse($f->isInIncrementsOfRanges('3', '2-12'));
$this->assertFalse($f->isInIncrementsOfRanges('3', '2'));
$this->assertFalse($f->isInIncrementsOfRanges('3', '*'));
$this->assertFalse($f->isInIncrementsOfRanges('0', '*/0'));
$this->assertFalse($f->isInIncrementsOfRanges('1', '*/0'));
$this->assertTrue($f->isInIncrementsOfRanges('4', '4/1'));
$this->assertFalse($f->isInIncrementsOfRanges('14', '4/1'));
$this->assertFalse($f->isInIncrementsOfRanges('34', '4/1'));
}
/**
* @covers \Cron\AbstractField::isSatisfied
*/
public function testTestsIfSatisfied()
{
$f = new DayOfWeekField();
$this->assertTrue($f->isSatisfied('12', '3-13'));
$this->assertFalse($f->isSatisfied('15', '3-7/2'));
$this->assertTrue($f->isSatisfied('12', '*'));
$this->assertTrue($f->isSatisfied('12', '12'));
$this->assertFalse($f->isSatisfied('12', '3-11'));
$this->assertFalse($f->isSatisfied('12', '3-7/2'));
$this->assertFalse($f->isSatisfied('12', '11'));
}
/**
* Allows ranges and lists to coexist in the same expression
*
* @see https://github.com/dragonmantank/cron-expression/issues/5
*/
public function testAllowRangesAndLists()
{
$expression = '5-7,11-13';
$f = new HoursField();
$this->assertTrue($f->validate($expression));
}
/**
* Makes sure that various types of ranges expand out properly
*
* @see https://github.com/dragonmantank/cron-expression/issues/5
*/
public function testGetRangeForExpressionExpandsCorrectly()
{
$f = new HoursField();
$this->assertSame([5, 6, 7, 11, 12, 13], $f->getRangeForExpression('5-7,11-13', 23));
$this->assertSame(['5', '6', '7', '11', '12', '13'], $f->getRangeForExpression('5,6,7,11,12,13', 23));
$this->assertSame([0, 6, 12, 18], $f->getRangeForExpression('*/6', 23));
$this->assertSame([5, 11], $f->getRangeForExpression('5-13/6', 23));
}
}

View File

@@ -3,65 +3,71 @@
namespace Cron\Tests; namespace Cron\Tests;
use Cron\CronExpression; use Cron\CronExpression;
use Cron\MonthField;
use DateTime; use DateTime;
use DateTimeZone; use DateTimeZone;
use InvalidArgumentException; use InvalidArgumentException;
use PHPUnit_Framework_TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @author Michael Dowling <mtdowling@gmail.com> * @author Michael Dowling <mtdowling@gmail.com>
*/ */
class CronExpressionTest extends PHPUnit_Framework_TestCase class CronExpressionTest extends TestCase
{ {
/** /**
* @covers Cron\CronExpression::factory * @covers \Cron\CronExpression::factory
*/ */
public function testFactoryRecognizesTemplates() public function testFactoryRecognizesTemplates()
{ {
$this->assertEquals('0 0 1 1 *', CronExpression::factory('@annually')->getExpression()); $this->assertSame('0 0 1 1 *', CronExpression::factory('@annually')->getExpression());
$this->assertEquals('0 0 1 1 *', CronExpression::factory('@yearly')->getExpression()); $this->assertSame('0 0 1 1 *', CronExpression::factory('@yearly')->getExpression());
$this->assertEquals('0 0 * * 0', CronExpression::factory('@weekly')->getExpression()); $this->assertSame('0 0 * * 0', CronExpression::factory('@weekly')->getExpression());
} }
/** /**
* @covers Cron\CronExpression::__construct * @covers \Cron\CronExpression::__construct
* @covers Cron\CronExpression::getExpression * @covers \Cron\CronExpression::getExpression
* @covers Cron\CronExpression::__toString * @covers \Cron\CronExpression::__toString
*/ */
public function testParsesCronSchedule() public function testParsesCronSchedule()
{ {
// '2010-09-10 12:00:00' // '2010-09-10 12:00:00'
$cron = CronExpression::factory('1 2-4 * 4,5,6 */3'); $cron = CronExpression::factory('1 2-4 * 4,5,6 */3');
$this->assertEquals('1', $cron->getExpression(CronExpression::MINUTE)); $this->assertSame('1', $cron->getExpression(CronExpression::MINUTE));
$this->assertEquals('2-4', $cron->getExpression(CronExpression::HOUR)); $this->assertSame('2-4', $cron->getExpression(CronExpression::HOUR));
$this->assertEquals('*', $cron->getExpression(CronExpression::DAY)); $this->assertSame('*', $cron->getExpression(CronExpression::DAY));
$this->assertEquals('4,5,6', $cron->getExpression(CronExpression::MONTH)); $this->assertSame('4,5,6', $cron->getExpression(CronExpression::MONTH));
$this->assertEquals('*/3', $cron->getExpression(CronExpression::WEEKDAY)); $this->assertSame('*/3', $cron->getExpression(CronExpression::WEEKDAY));
$this->assertEquals('1 2-4 * 4,5,6 */3', $cron->getExpression()); $this->assertSame('1 2-4 * 4,5,6 */3', $cron->getExpression());
$this->assertEquals('1 2-4 * 4,5,6 */3', (string) $cron); $this->assertSame('1 2-4 * 4,5,6 */3', (string) $cron);
$this->assertNull($cron->getExpression('foo')); $this->assertNull($cron->getExpression('foo'));
try {
$cron = CronExpression::factory('A 1 2 3 4');
$this->fail('Validation exception not thrown');
} catch (InvalidArgumentException $e) {
}
} }
/** /**
* @covers Cron\CronExpression::__construct * @covers \Cron\CronExpression::__construct
* @covers Cron\CronExpression::getExpression * @covers \Cron\CronExpression::getExpression
* @covers \Cron\CronExpression::__toString
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage Invalid CRON field value A at position 0
*/
public function testParsesCronScheduleThrowsAnException()
{
CronExpression::factory('A 1 2 3 4');
}
/**
* @covers \Cron\CronExpression::__construct
* @covers \Cron\CronExpression::getExpression
* @dataProvider scheduleWithDifferentSeparatorsProvider * @dataProvider scheduleWithDifferentSeparatorsProvider
*/ */
public function testParsesCronScheduleWithAnySpaceCharsAsSeparators($schedule, array $expected) public function testParsesCronScheduleWithAnySpaceCharsAsSeparators($schedule, array $expected)
{ {
$cron = CronExpression::factory($schedule); $cron = CronExpression::factory($schedule);
$this->assertEquals($expected[0], $cron->getExpression(CronExpression::MINUTE)); $this->assertSame($expected[0], $cron->getExpression(CronExpression::MINUTE));
$this->assertEquals($expected[1], $cron->getExpression(CronExpression::HOUR)); $this->assertSame($expected[1], $cron->getExpression(CronExpression::HOUR));
$this->assertEquals($expected[2], $cron->getExpression(CronExpression::DAY)); $this->assertSame($expected[2], $cron->getExpression(CronExpression::DAY));
$this->assertEquals($expected[3], $cron->getExpression(CronExpression::MONTH)); $this->assertSame($expected[3], $cron->getExpression(CronExpression::MONTH));
$this->assertEquals($expected[4], $cron->getExpression(CronExpression::WEEKDAY)); $this->assertSame($expected[4], $cron->getExpression(CronExpression::WEEKDAY));
$this->assertEquals($expected[5], $cron->getExpression(CronExpression::YEAR));
} }
/** /**
@@ -72,17 +78,17 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
public static function scheduleWithDifferentSeparatorsProvider() public static function scheduleWithDifferentSeparatorsProvider()
{ {
return array( return array(
array("*\t*\t*\t*\t*\t*", array('*', '*', '*', '*', '*', '*')), array("*\t*\t*\t*\t*\t", array('*', '*', '*', '*', '*', '*')),
array("* * * * * *", array('*', '*', '*', '*', '*', '*')), array("* * * * * ", array('*', '*', '*', '*', '*', '*')),
array("* \t * \t * \t * \t * \t *", array('*', '*', '*', '*', '*', '*')), array("* \t * \t * \t * \t * \t", array('*', '*', '*', '*', '*', '*')),
array("*\t \t*\t \t*\t \t*\t \t*\t \t*", array('*', '*', '*', '*', '*', '*')), array("*\t \t*\t \t*\t \t*\t \t*\t \t", array('*', '*', '*', '*', '*', '*')),
); );
} }
/** /**
* @covers Cron\CronExpression::__construct * @covers \Cron\CronExpression::__construct
* @covers Cron\CronExpression::setExpression * @covers \Cron\CronExpression::setExpression
* @covers Cron\CronExpression::setPart * @covers \Cron\CronExpression::setPart
* @expectedException InvalidArgumentException * @expectedException InvalidArgumentException
*/ */
public function testInvalidCronsWillFail() public function testInvalidCronsWillFail()
@@ -92,7 +98,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\CronExpression::setPart * @covers \Cron\CronExpression::setPart
* @expectedException InvalidArgumentException * @expectedException InvalidArgumentException
*/ */
public function testInvalidPartsWillFail() public function testInvalidPartsWillFail()
@@ -116,8 +122,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
// Handles CSV values // Handles CSV values
array('* 20,22 * * *', '2015-08-10 21:50:00', '2015-08-10 22:00:00', false), array('* 20,22 * * *', '2015-08-10 21:50:00', '2015-08-10 22:00:00', false),
// CSV values can be complex // CSV values can be complex
array('* 5,21-22 * * *', '2015-08-10 21:50:00', '2015-08-10 21:50:00', true), array('7-9 * */9 * *', '2015-08-10 22:02:33', '2015-08-10 22:07:00', false),
array('7-9 * */9 * *', '2015-08-10 22:02:33', '2015-08-18 00:07:00', false),
// 15th minute, of the second hour, every 15 days, in January, every Friday // 15th minute, of the second hour, every 15 days, in January, every Friday
array('1 * * * 7', '2015-08-10 21:47:27', '2015-08-16 00:01:00', false), array('1 * * * 7', '2015-08-10 21:47:27', '2015-08-16 00:01:00', false),
// Test with exact times // Test with exact times
@@ -138,7 +143,6 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
array('0 0 * * 3-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false), array('0 0 * * 3-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false),
// Test lists of values and ranges (Abhoryo) // Test lists of values and ranges (Abhoryo)
array('0 0 * * 2-7', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false), array('0 0 * * 2-7', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false),
array('0 0 * * 0,2-6', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false),
array('0 0 * * 2-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false), array('0 0 * * 2-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false),
array('0 0 * * 4-7', strtotime('2011-07-19 00:00:00'), '2011-07-21 00:00:00', false), array('0 0 * * 4-7', strtotime('2011-07-19 00:00:00'), '2011-07-21 00:00:00', false),
// Test increments of ranges // Test increments of ranges
@@ -146,12 +150,10 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
array('4-59/2 * * * *', strtotime('2011-06-20 12:04:00'), '2011-06-20 12:04:00', true), array('4-59/2 * * * *', strtotime('2011-06-20 12:04:00'), '2011-06-20 12:04:00', true),
array('4-59/2 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:06:00', true), array('4-59/2 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:06:00', true),
array('4-59/3 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:07:00', false), array('4-59/3 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:07:00', false),
//array('0 0 * * 0,2-6', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false),
// Test Day of the Week and the Day of the Month (issue #1) // Test Day of the Week and the Day of the Month (issue #1)
array('0 0 1 1 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), array('0 0 1 1 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false),
array('0 0 1 JAN 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), array('0 0 1 JAN 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false),
array('0 0 1 * 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), array('0 0 1 * 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false),
array('0 0 L * *', strtotime('2011-07-15 00:00:00'), '2011-07-31 00:00:00', false),
// Test the W day of the week modifier for day of the month field // Test the W day of the week modifier for day of the month field
array('0 0 2W * *', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), array('0 0 2W * *', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true),
array('0 0 1W * *', strtotime('2011-05-01 00:00:00'), '2011-05-02 00:00:00', false), array('0 0 1W * *', strtotime('2011-05-01 00:00:00'), '2011-05-02 00:00:00', false),
@@ -161,32 +163,35 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
array('0 0 28W * *', strtotime('2011-07-01 00:00:00'), '2011-07-28 00:00:00', false), array('0 0 28W * *', strtotime('2011-07-01 00:00:00'), '2011-07-28 00:00:00', false),
array('0 0 30W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), array('0 0 30W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false),
array('0 0 31W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), array('0 0 31W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false),
// Test the year field
array('* * * * * 2012', strtotime('2011-05-01 00:00:00'), '2012-01-01 00:00:00', false),
// Test the last weekday of a month // Test the last weekday of a month
array('* * * * 5L', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), array('* * * * 5L', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false),
array('* * * * 6L', strtotime('2011-07-01 00:00:00'), '2011-07-30 00:00:00', false), array('* * * * 6L', strtotime('2011-07-01 00:00:00'), '2011-07-30 00:00:00', false),
array('* * * * 7L', strtotime('2011-07-01 00:00:00'), '2011-07-31 00:00:00', false), array('* * * * 7L', strtotime('2011-07-01 00:00:00'), '2011-07-31 00:00:00', false),
array('* * * * 1L', strtotime('2011-07-24 00:00:00'), '2011-07-25 00:00:00', false), array('* * * * 1L', strtotime('2011-07-24 00:00:00'), '2011-07-25 00:00:00', false),
array('* * * * TUEL', strtotime('2011-07-24 00:00:00'), '2011-07-26 00:00:00', false),
array('* * * 1 5L', strtotime('2011-12-25 00:00:00'), '2012-01-27 00:00:00', false), array('* * * 1 5L', strtotime('2011-12-25 00:00:00'), '2012-01-27 00:00:00', false),
// Test the hash symbol for the nth weekday of a given month // Test the hash symbol for the nth weekday of a given month
array('* * * * 5#2', strtotime('2011-07-01 00:00:00'), '2011-07-08 00:00:00', false), array('* * * * 5#2', strtotime('2011-07-01 00:00:00'), '2011-07-08 00:00:00', false),
array('* * * * 5#1', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), array('* * * * 5#1', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true),
array('* * * * 3#4', strtotime('2011-07-01 00:00:00'), '2011-07-27 00:00:00', false), array('* * * * 3#4', strtotime('2011-07-01 00:00:00'), '2011-07-27 00:00:00', false),
// Issue #7, documented example failed
['3-59/15 6-12 */15 1 2-5', strtotime('2017-01-08 00:00:00'), '2017-01-31 06:03:00', false],
// https://github.com/laravel/framework/commit/07d160ac3cc9764d5b429734ffce4fa311385403
['* * * * MON-FRI', strtotime('2017-01-08 00:00:00'), strtotime('2017-01-09 00:00:00'), false],
['* * * * TUE', strtotime('2017-01-08 00:00:00'), strtotime('2017-01-10 00:00:00'), false],
); );
} }
/** /**
* @covers Cron\CronExpression::isDue * @covers \Cron\CronExpression::isDue
* @covers Cron\CronExpression::getNextRunDate * @covers \Cron\CronExpression::getNextRunDate
* @covers Cron\DayOfMonthField * @covers \Cron\DayOfMonthField
* @covers Cron\DayOfWeekField * @covers \Cron\DayOfWeekField
* @covers Cron\MinutesField * @covers \Cron\MinutesField
* @covers Cron\HoursField * @covers \Cron\HoursField
* @covers Cron\MonthField * @covers \Cron\MonthField
* @covers Cron\YearField * @covers \Cron\CronExpression::getRunDate
* @covers Cron\CronExpression::getRunDate
* @dataProvider scheduleProvider * @dataProvider scheduleProvider
*/ */
public function testDeterminesIfCronIsDue($schedule, $relativeTime, $nextRun, $isDue) public function testDeterminesIfCronIsDue($schedule, $relativeTime, $nextRun, $isDue)
@@ -200,13 +205,21 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
} elseif (is_int($relativeTime)) { } elseif (is_int($relativeTime)) {
$relativeTime = date('Y-m-d H:i:s', $relativeTime); $relativeTime = date('Y-m-d H:i:s', $relativeTime);
} }
$this->assertEquals($isDue, $cron->isDue($relativeTime));
if (is_string($nextRun)) {
$nextRunDate = new DateTime($nextRun);
} elseif (is_int($nextRun)) {
$nextRunDate = new DateTime();
$nextRunDate->setTimestamp($nextRun);
}
$this->assertSame($isDue, $cron->isDue($relativeTime));
$next = $cron->getNextRunDate($relativeTime, 0, true); $next = $cron->getNextRunDate($relativeTime, 0, true);
$this->assertEquals(new DateTime($nextRun), $next);
$this->assertEquals($nextRunDate, $next);
} }
/** /**
* @covers Cron\CronExpression::isDue * @covers \Cron\CronExpression::isDue
*/ */
public function testIsDueHandlesDifferentDates() public function testIsDueHandlesDifferentDates()
{ {
@@ -218,34 +231,104 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\CronExpression::isDue * @covers \Cron\CronExpression::isDue
*/ */
public function testIsDueHandlesDifferentTimezones() public function testIsDueHandlesDifferentDefaultTimezones()
{ {
$originalTimezone = date_default_timezone_get();
$cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00 $cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00
$date = '2014-01-01 15:00'; //Wednesday $date = '2014-01-01 15:00'; //Wednesday
$utc = new DateTimeZone('UTC');
$amsterdam = new DateTimeZone('Europe/Amsterdam');
$tokyo = new DateTimeZone('Asia/Tokyo');
date_default_timezone_set('UTC'); date_default_timezone_set('UTC');
$this->assertTrue($cron->isDue(new DateTime($date, $utc))); $this->assertTrue($cron->isDue(new DateTime($date), 'UTC'));
$this->assertFalse($cron->isDue(new DateTime($date, $amsterdam))); $this->assertFalse($cron->isDue(new DateTime($date), 'Europe/Amsterdam'));
$this->assertFalse($cron->isDue(new DateTime($date, $tokyo))); $this->assertFalse($cron->isDue(new DateTime($date), 'Asia/Tokyo'));
date_default_timezone_set('Europe/Amsterdam'); date_default_timezone_set('Europe/Amsterdam');
$this->assertFalse($cron->isDue(new DateTime($date, $utc))); $this->assertFalse($cron->isDue(new DateTime($date), 'UTC'));
$this->assertTrue($cron->isDue(new DateTime($date, $amsterdam))); $this->assertTrue($cron->isDue(new DateTime($date), 'Europe/Amsterdam'));
$this->assertFalse($cron->isDue(new DateTime($date, $tokyo))); $this->assertFalse($cron->isDue(new DateTime($date), 'Asia/Tokyo'));
date_default_timezone_set('Asia/Tokyo'); date_default_timezone_set('Asia/Tokyo');
$this->assertFalse($cron->isDue(new DateTime($date, $utc))); $this->assertFalse($cron->isDue(new DateTime($date), 'UTC'));
$this->assertFalse($cron->isDue(new DateTime($date, $amsterdam))); $this->assertFalse($cron->isDue(new DateTime($date), 'Europe/Amsterdam'));
$this->assertTrue($cron->isDue(new DateTime($date, $tokyo))); $this->assertTrue($cron->isDue(new DateTime($date), 'Asia/Tokyo'));
date_default_timezone_set($originalTimezone);
} }
/** /**
* @covers Cron\CronExpression::getPreviousRunDate * @covers \Cron\CronExpression::isDue
*/
public function testIsDueHandlesDifferentSuppliedTimezones()
{
$cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00
$date = '2014-01-01 15:00'; //Wednesday
$this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'UTC'));
$this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'Europe/Amsterdam'));
$this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'Asia/Tokyo'));
$this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'UTC'));
$this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'Europe/Amsterdam'));
$this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'Asia/Tokyo'));
$this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'UTC'));
$this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'Europe/Amsterdam'));
$this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'Asia/Tokyo'));
}
/**
* @covers Cron\CronExpression::isDue
*/
public function testIsDueHandlesDifferentTimezonesAsArgument()
{
$cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00
$date = '2014-01-01 15:00'; //Wednesday
$utc = new \DateTimeZone('UTC');
$amsterdam = new \DateTimeZone('Europe/Amsterdam');
$tokyo = new \DateTimeZone('Asia/Tokyo');
$this->assertTrue($cron->isDue(new DateTime($date, $utc), 'UTC'));
$this->assertFalse($cron->isDue(new DateTime($date, $amsterdam), 'UTC'));
$this->assertFalse($cron->isDue(new DateTime($date, $tokyo), 'UTC'));
$this->assertFalse($cron->isDue(new DateTime($date, $utc), 'Europe/Amsterdam'));
$this->assertTrue($cron->isDue(new DateTime($date, $amsterdam), 'Europe/Amsterdam'));
$this->assertFalse($cron->isDue(new DateTime($date, $tokyo), 'Europe/Amsterdam'));
$this->assertFalse($cron->isDue(new DateTime($date, $utc), 'Asia/Tokyo'));
$this->assertFalse($cron->isDue(new DateTime($date, $amsterdam), 'Asia/Tokyo'));
$this->assertTrue($cron->isDue(new DateTime($date, $tokyo), 'Asia/Tokyo'));
}
/**
* @covers Cron\CronExpression::isDue
*/
public function testRecognisesTimezonesAsPartOfDateTime()
{
$cron = CronExpression::factory("0 7 * * *");
$tzCron = "America/New_York";
$tzServer = new \DateTimeZone("Europe/London");
$dtCurrent = \DateTime::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer);
$dtPrev = $cron->getPreviousRunDate($dtCurrent, 0, true, $tzCron);
$this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e"));
$dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer);
$dtPrev = $cron->getPreviousRunDate($dtCurrent, 0, true, $tzCron);
$this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e"));
$dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer);
$dtPrev = $cron->getPreviousRunDate($dtCurrent->format("c"), 0, true, $tzCron);
$this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e"));
$dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer);
$dtPrev = $cron->getPreviousRunDate($dtCurrent->format("\@U"), 0, true, $tzCron);
$this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e"));
}
/**
* @covers \Cron\CronExpression::getPreviousRunDate
*/ */
public function testCanGetPreviousRunDates() public function testCanGetPreviousRunDates()
{ {
@@ -266,7 +349,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\CronExpression::getMultipleRunDates * @covers \Cron\CronExpression::getMultipleRunDates
*/ */
public function testProvidesMultipleRunDates() public function testProvidesMultipleRunDates()
{ {
@@ -280,28 +363,28 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\CronExpression::getMultipleRunDates * @covers \Cron\CronExpression::getMultipleRunDates
* @covers Cron\CronExpression::setMaxIterationCount * @covers \Cron\CronExpression::setMaxIterationCount
*/ */
public function testProvidesMultipleRunDatesForTheFarFuture() { public function testProvidesMultipleRunDatesForTheFarFuture() {
// Fails with the default 1000 iteration limit // Fails with the default 1000 iteration limit
$cron = CronExpression::factory('0 0 12 1 * */2'); $cron = CronExpression::factory('0 0 12 1 *');
$cron->setMaxIterationCount(2000); $cron->setMaxIterationCount(2000);
$this->assertEquals(array( $this->assertEquals(array(
new DateTime('2016-01-12 00:00:00'), new DateTime('2016-01-12 00:00:00'),
new DateTime('2017-01-12 00:00:00'),
new DateTime('2018-01-12 00:00:00'), new DateTime('2018-01-12 00:00:00'),
new DateTime('2019-01-12 00:00:00'),
new DateTime('2020-01-12 00:00:00'), new DateTime('2020-01-12 00:00:00'),
new DateTime('2021-01-12 00:00:00'),
new DateTime('2022-01-12 00:00:00'), new DateTime('2022-01-12 00:00:00'),
new DateTime('2023-01-12 00:00:00'),
new DateTime('2024-01-12 00:00:00'), new DateTime('2024-01-12 00:00:00'),
new DateTime('2026-01-12 00:00:00'),
new DateTime('2028-01-12 00:00:00'),
new DateTime('2030-01-12 00:00:00'),
new DateTime('2032-01-12 00:00:00'),
), $cron->getMultipleRunDates(9, '2015-04-28 00:00:00', false, true)); ), $cron->getMultipleRunDates(9, '2015-04-28 00:00:00', false, true));
} }
/** /**
* @covers Cron\CronExpression * @covers \Cron\CronExpression
*/ */
public function testCanIterateOverNextRuns() public function testCanIterateOverNextRuns()
{ {
@@ -325,7 +408,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\CronExpression::getRunDate * @covers \Cron\CronExpression::getRunDate
*/ */
public function testSkipsCurrentDateByDefault() public function testSkipsCurrentDateByDefault()
{ {
@@ -333,33 +416,33 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
$current = new DateTime('now'); $current = new DateTime('now');
$next = $cron->getNextRunDate($current); $next = $cron->getNextRunDate($current);
$nextPrev = $cron->getPreviousRunDate($next); $nextPrev = $cron->getPreviousRunDate($next);
$this->assertEquals($current->format('Y-m-d H:i:00'), $nextPrev->format('Y-m-d H:i:s')); $this->assertSame($current->format('Y-m-d H:i:00'), $nextPrev->format('Y-m-d H:i:s'));
} }
/** /**
* @covers Cron\CronExpression::getRunDate * @covers \Cron\CronExpression::getRunDate
* @ticket 7 * @ticket 7
*/ */
public function testStripsForSeconds() public function testStripsForSeconds()
{ {
$cron = CronExpression::factory('* * * * *'); $cron = CronExpression::factory('* * * * *');
$current = new DateTime('2011-09-27 10:10:54'); $current = new DateTime('2011-09-27 10:10:54');
$this->assertEquals('2011-09-27 10:11:00', $cron->getNextRunDate($current)->format('Y-m-d H:i:s')); $this->assertSame('2011-09-27 10:11:00', $cron->getNextRunDate($current)->format('Y-m-d H:i:s'));
} }
/** /**
* @covers Cron\CronExpression::getRunDate * @covers \Cron\CronExpression::getRunDate
*/ */
public function testFixesPhpBugInDateIntervalMonth() public function testFixesPhpBugInDateIntervalMonth()
{ {
$cron = CronExpression::factory('0 0 27 JAN *'); $cron = CronExpression::factory('0 0 27 JAN *');
$this->assertEquals('2011-01-27 00:00:00', $cron->getPreviousRunDate('2011-08-22 00:00:00')->format('Y-m-d H:i:s')); $this->assertSame('2011-01-27 00:00:00', $cron->getPreviousRunDate('2011-08-22 00:00:00')->format('Y-m-d H:i:s'));
} }
public function testIssue29() public function testIssue29()
{ {
$cron = CronExpression::factory('@weekly'); $cron = CronExpression::factory('@weekly');
$this->assertEquals( $this->assertSame(
'2013-03-10 00:00:00', '2013-03-10 00:00:00',
$cron->getPreviousRunDate('2013-03-17 00:00:00')->format('Y-m-d H:i:s') $cron->getPreviousRunDate('2013-03-17 00:00:00')->format('Y-m-d H:i:s')
); );
@@ -386,7 +469,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\CronExpression::getRunDate * @covers \Cron\CronExpression::getRunDate
*/ */
public function testKeepOriginalTime() public function testKeepOriginalTime()
{ {
@@ -394,15 +477,15 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
$strNow = $now->format(DateTime::ISO8601); $strNow = $now->format(DateTime::ISO8601);
$cron = CronExpression::factory('0 0 * * *'); $cron = CronExpression::factory('0 0 * * *');
$cron->getPreviousRunDate($now); $cron->getPreviousRunDate($now);
$this->assertEquals($strNow, $now->format(DateTime::ISO8601)); $this->assertSame($strNow, $now->format(DateTime::ISO8601));
} }
/** /**
* @covers Cron\CronExpression::__construct * @covers \Cron\CronExpression::__construct
* @covers Cron\CronExpression::factory * @covers \Cron\CronExpression::factory
* @covers Cron\CronExpression::isValidExpression * @covers \Cron\CronExpression::isValidExpression
* @covers Cron\CronExpression::setExpression * @covers \Cron\CronExpression::setExpression
* @covers Cron\CronExpression::setPart * @covers \Cron\CronExpression::setPart
*/ */
public function testValidationWorks() public function testValidationWorks()
{ {
@@ -410,5 +493,68 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase
$this->assertFalse(CronExpression::isValidExpression('* * * 1')); $this->assertFalse(CronExpression::isValidExpression('* * * 1'));
// Valid // Valid
$this->assertTrue(CronExpression::isValidExpression('* * * * 1')); $this->assertTrue(CronExpression::isValidExpression('* * * * 1'));
// Issue #156, 13 is an invalid month
$this->assertFalse(CronExpression::isValidExpression("* * * 13 * "));
// Issue #155, 90 is an invalid second
$this->assertFalse(CronExpression::isValidExpression('90 * * * *'));
// Issue #154, 24 is an invalid hour
$this->assertFalse(CronExpression::isValidExpression("0 24 1 12 0"));
// Issue #125, this is just all sorts of wrong
$this->assertFalse(CronExpression::isValidExpression('990 14 * * mon-fri0345345'));
// see https://github.com/dragonmantank/cron-expression/issues/5
$this->assertTrue(CronExpression::isValidExpression('2,17,35,47 5-7,11-13 * * *'));
}
/**
* Makes sure that 00 is considered a valid value for 0-based fields
* cronie allows numbers with a leading 0, so adding support for this as well
*
* @see https://github.com/dragonmantank/cron-expression/issues/12
*/
public function testDoubleZeroIsValid()
{
$this->assertTrue(CronExpression::isValidExpression('00 * * * *'));
$this->assertTrue(CronExpression::isValidExpression('01 * * * *'));
$this->assertTrue(CronExpression::isValidExpression('* 00 * * *'));
$this->assertTrue(CronExpression::isValidExpression('* 01 * * *'));
$e = CronExpression::factory('00 * * * *');
$this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00')));
$e = CronExpression::factory('01 * * * *');
$this->assertTrue($e->isDue(new DateTime('2014-04-07 00:01:00')));
$e = CronExpression::factory('* 00 * * *');
$this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00')));
$e = CronExpression::factory('* 01 * * *');
$this->assertTrue($e->isDue(new DateTime('2014-04-07 01:00:00')));
}
/**
* Ranges with large steps should "wrap around" to the appropriate value
* cronie allows for steps that are larger than the range of a field, with it wrapping around like a ring buffer. We
* should do the same.
*
* @see https://github.com/dragonmantank/cron-expression/issues/6
*/
public function testRangesWrapAroundWithLargeSteps()
{
$f = new MonthField();
$this->assertTrue($f->validate('*/123'));
$this->assertSame([4], $f->getRangeForExpression('*/123', 12));
$e = CronExpression::factory('* * * */123 *');
$this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00')));
$nextRunDate = $e->getNextRunDate(new DateTime('2014-04-07 00:00:00'));
$this->assertSame('2014-04-07 00:01:00', $nextRunDate->format('Y-m-d H:i:s'));
$nextRunDate = $e->getNextRunDate(new DateTime('2014-05-07 00:00:00'));
$this->assertSame('2015-04-01 00:00:00', $nextRunDate->format('Y-m-d H:i:s'));
} }
} }

View File

@@ -4,27 +4,30 @@ namespace Cron\Tests;
use Cron\DayOfMonthField; use Cron\DayOfMonthField;
use DateTime; use DateTime;
use PHPUnit_Framework_TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @author Michael Dowling <mtdowling@gmail.com> * @author Michael Dowling <mtdowling@gmail.com>
*/ */
class DayOfMonthFieldTest extends PHPUnit_Framework_TestCase class DayOfMonthFieldTest extends TestCase
{ {
/** /**
* @covers Cron\DayOfMonthField::validate * @covers \Cron\DayOfMonthField::validate
*/ */
public function testValidatesField() public function testValidatesField()
{ {
$f = new DayOfMonthField(); $f = new DayOfMonthField();
$this->assertTrue($f->validate('1')); $this->assertTrue($f->validate('1'));
$this->assertTrue($f->validate('*')); $this->assertTrue($f->validate('*'));
$this->assertTrue($f->validate('5W,L')); $this->assertTrue($f->validate('L'));
$this->assertTrue($f->validate('5W'));
$this->assertTrue($f->validate('01'));
$this->assertFalse($f->validate('5W,L'));
$this->assertFalse($f->validate('1.')); $this->assertFalse($f->validate('1.'));
} }
/** /**
* @covers Cron\DayOfMonthField::isSatisfiedBy * @covers \Cron\DayOfMonthField::isSatisfiedBy
*/ */
public function testChecksIfSatisfied() public function testChecksIfSatisfied()
{ {
@@ -33,18 +36,18 @@ class DayOfMonthFieldTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\DayOfMonthField::increment * @covers \Cron\DayOfMonthField::increment
*/ */
public function testIncrementsDate() public function testIncrementsDate()
{ {
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f = new DayOfMonthField(); $f = new DayOfMonthField();
$f->increment($d); $f->increment($d);
$this->assertEquals('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s'));
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f->increment($d, true); $f->increment($d, true);
$this->assertEquals('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s'));
} }
/** /**

View File

@@ -4,28 +4,30 @@ namespace Cron\Tests;
use Cron\DayOfWeekField; use Cron\DayOfWeekField;
use DateTime; use DateTime;
use PHPUnit_Framework_TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @author Michael Dowling <mtdowling@gmail.com> * @author Michael Dowling <mtdowling@gmail.com>
*/ */
class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase class DayOfWeekFieldTest extends TestCase
{ {
/** /**
* @covers Cron\DayOfWeekField::validate * @covers \Cron\DayOfWeekField::validate
*/ */
public function testValidatesField() public function testValidatesField()
{ {
$f = new DayOfWeekField(); $f = new DayOfWeekField();
$this->assertTrue($f->validate('1')); $this->assertTrue($f->validate('1'));
$this->assertTrue($f->validate('01'));
$this->assertTrue($f->validate('00'));
$this->assertTrue($f->validate('*')); $this->assertTrue($f->validate('*'));
$this->assertTrue($f->validate('*/3,1,1-12')); $this->assertFalse($f->validate('*/3,1,1-12'));
$this->assertTrue($f->validate('SUN-2')); $this->assertTrue($f->validate('SUN-2'));
$this->assertFalse($f->validate('1.')); $this->assertFalse($f->validate('1.'));
} }
/** /**
* @covers Cron\DayOfWeekField::isSatisfiedBy * @covers \Cron\DayOfWeekField::isSatisfiedBy
*/ */
public function testChecksIfSatisfied() public function testChecksIfSatisfied()
{ {
@@ -34,22 +36,22 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\DayOfWeekField::increment * @covers \Cron\DayOfWeekField::increment
*/ */
public function testIncrementsDate() public function testIncrementsDate()
{ {
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f = new DayOfWeekField(); $f = new DayOfWeekField();
$f->increment($d); $f->increment($d);
$this->assertEquals('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s'));
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f->increment($d, true); $f->increment($d, true);
$this->assertEquals('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s'));
} }
/** /**
* @covers Cron\DayOfWeekField::isSatisfiedBy * @covers \Cron\DayOfWeekField::isSatisfiedBy
* @expectedException InvalidArgumentException * @expectedException InvalidArgumentException
* @expectedExceptionMessage Weekday must be a value between 0 and 7. 12 given * @expectedExceptionMessage Weekday must be a value between 0 and 7. 12 given
*/ */
@@ -60,9 +62,9 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\DayOfWeekField::isSatisfiedBy * @covers \Cron\DayOfWeekField::isSatisfiedBy
* @expectedException InvalidArgumentException * @expectedException InvalidArgumentException
* @expectedExceptionMessage There are never more than 5 of a given weekday in a month * @expectedExceptionMessage There are never more than 5 or less than 1 of a given weekday in a month
*/ */
public function testValidatesHashValueNth() public function testValidatesHashValueNth()
{ {
@@ -71,7 +73,7 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\DayOfWeekField::validate * @covers \Cron\DayOfWeekField::validate
*/ */
public function testValidateWeekendHash() public function testValidateWeekendHash()
{ {
@@ -87,7 +89,7 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase
} }
/** /**
* @covers Cron\DayOfWeekField::isSatisfiedBy * @covers \Cron\DayOfWeekField::isSatisfiedBy
*/ */
public function testHandlesZeroAndSevenDayOfTheWeekValues() public function testHandlesZeroAndSevenDayOfTheWeekValues()
{ {
@@ -114,4 +116,14 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase
$this->assertFalse($f->validate('*-')); $this->assertFalse($f->validate('*-'));
$this->assertFalse($f->validate(',-')); $this->assertFalse($f->validate(',-'));
} }
/**
* @see https://github.com/laravel/framework/commit/07d160ac3cc9764d5b429734ffce4fa311385403
*/
public function testLiteralsExpandProperly()
{
$f = new DayOfWeekField();
$this->assertTrue($f->validate('MON-FRI'));
$this->assertSame([1,2,3,4,5], $f->getRangeForExpression('MON-FRI', 7));
}
} }

View File

@@ -3,15 +3,15 @@
namespace Cron\Tests; namespace Cron\Tests;
use Cron\FieldFactory; use Cron\FieldFactory;
use PHPUnit_Framework_TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @author Michael Dowling <mtdowling@gmail.com> * @author Michael Dowling <mtdowling@gmail.com>
*/ */
class FieldFactoryTest extends PHPUnit_Framework_TestCase class FieldFactoryTest extends TestCase
{ {
/** /**
* @covers Cron\FieldFactory::getField * @covers \Cron\FieldFactory::getField
*/ */
public function testRetrievesFieldInstances() public function testRetrievesFieldInstances()
{ {
@@ -21,18 +21,17 @@ class FieldFactoryTest extends PHPUnit_Framework_TestCase
2 => 'Cron\DayOfMonthField', 2 => 'Cron\DayOfMonthField',
3 => 'Cron\MonthField', 3 => 'Cron\MonthField',
4 => 'Cron\DayOfWeekField', 4 => 'Cron\DayOfWeekField',
5 => 'Cron\YearField'
); );
$f = new FieldFactory(); $f = new FieldFactory();
foreach ($mappings as $position => $class) { foreach ($mappings as $position => $class) {
$this->assertEquals($class, get_class($f->getField($position))); $this->assertSame($class, get_class($f->getField($position)));
} }
} }
/** /**
* @covers Cron\FieldFactory::getField * @covers \Cron\FieldFactory::getField
* @expectedException InvalidArgumentException * @expectedException InvalidArgumentException
*/ */
public function testValidatesFieldPosition() public function testValidatesFieldPosition()

View File

@@ -4,41 +4,43 @@ namespace Cron\Tests;
use Cron\HoursField; use Cron\HoursField;
use DateTime; use DateTime;
use PHPUnit_Framework_TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @author Michael Dowling <mtdowling@gmail.com> * @author Michael Dowling <mtdowling@gmail.com>
*/ */
class HoursFieldTest extends PHPUnit_Framework_TestCase class HoursFieldTest extends TestCase
{ {
/** /**
* @covers Cron\HoursField::validate * @covers \Cron\HoursField::validate
*/ */
public function testValidatesField() public function testValidatesField()
{ {
$f = new HoursField(); $f = new HoursField();
$this->assertTrue($f->validate('1')); $this->assertTrue($f->validate('1'));
$this->assertTrue($f->validate('00'));
$this->assertTrue($f->validate('01'));
$this->assertTrue($f->validate('*')); $this->assertTrue($f->validate('*'));
$this->assertTrue($f->validate('*/3,1,1-12')); $this->assertFalse($f->validate('*/3,1,1-12'));
} }
/** /**
* @covers Cron\HoursField::increment * @covers \Cron\HoursField::increment
*/ */
public function testIncrementsDate() public function testIncrementsDate()
{ {
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f = new HoursField(); $f = new HoursField();
$f->increment($d); $f->increment($d);
$this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s'));
$d->setTime(11, 15, 0); $d->setTime(11, 15, 0);
$f->increment($d, true); $f->increment($d, true);
$this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s'));
} }
/** /**
* @covers Cron\HoursField::increment * @covers \Cron\HoursField::increment
*/ */
public function testIncrementsDateWithThirtyMinuteOffsetTimezone() public function testIncrementsDateWithThirtyMinuteOffsetTimezone()
{ {
@@ -47,16 +49,16 @@ class HoursFieldTest extends PHPUnit_Framework_TestCase
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f = new HoursField(); $f = new HoursField();
$f->increment($d); $f->increment($d);
$this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s'));
$d->setTime(11, 15, 0); $d->setTime(11, 15, 0);
$f->increment($d, true); $f->increment($d, true);
$this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s'));
date_default_timezone_set($tz); date_default_timezone_set($tz);
} }
/** /**
* @covers Cron\HoursField::increment * @covers \Cron\HoursField::increment
*/ */
public function testIncrementDateWithFifteenMinuteOffsetTimezone() public function testIncrementDateWithFifteenMinuteOffsetTimezone()
{ {
@@ -65,11 +67,11 @@ class HoursFieldTest extends PHPUnit_Framework_TestCase
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f = new HoursField(); $f = new HoursField();
$f->increment($d); $f->increment($d);
$this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s'));
$d->setTime(11, 15, 0); $d->setTime(11, 15, 0);
$f->increment($d, true); $f->increment($d, true);
$this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s'));
date_default_timezone_set($tz); date_default_timezone_set($tz);
} }
} }

View File

@@ -0,0 +1,51 @@
<?php
namespace Cron\Tests;
use Cron\MinutesField;
use DateTime;
use PHPUnit\Framework\TestCase;
/**
* @author Michael Dowling <mtdowling@gmail.com>
*/
class MinutesFieldTest extends TestCase
{
/**
* @covers \Cron\MinutesField::validate
*/
public function testValidatesField()
{
$f = new MinutesField();
$this->assertTrue($f->validate('1'));
$this->assertTrue($f->validate('*'));
$this->assertFalse($f->validate('*/3,1,1-12'));
}
/**
* @covers \Cron\MinutesField::increment
*/
public function testIncrementsDate()
{
$d = new DateTime('2011-03-15 11:15:00');
$f = new MinutesField();
$f->increment($d);
$this->assertSame('2011-03-15 11:16:00', $d->format('Y-m-d H:i:s'));
$f->increment($d, true);
$this->assertSame('2011-03-15 11:15:00', $d->format('Y-m-d H:i:s'));
}
/**
* Various bad syntaxes that are reported to work, but shouldn't.
*
* @author Chris Tankersley
* @since 2017-08-18
*/
public function testBadSyntaxesShouldNotValidate()
{
$f = new MinutesField();
$this->assertFalse($f->validate('*-1'));
$this->assertFalse($f->validate('1-2-3'));
$this->assertFalse($f->validate('-1'));
}
}

View File

@@ -4,42 +4,42 @@ namespace Cron\Tests;
use Cron\MonthField; use Cron\MonthField;
use DateTime; use DateTime;
use PHPUnit_Framework_TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @author Michael Dowling <mtdowling@gmail.com> * @author Michael Dowling <mtdowling@gmail.com>
*/ */
class MonthFieldTest extends PHPUnit_Framework_TestCase class MonthFieldTest extends TestCase
{ {
/** /**
* @covers Cron\MonthField::validate * @covers \Cron\MonthField::validate
*/ */
public function testValidatesField() public function testValidatesField()
{ {
$f = new MonthField(); $f = new MonthField();
$this->assertTrue($f->validate('12')); $this->assertTrue($f->validate('12'));
$this->assertTrue($f->validate('*')); $this->assertTrue($f->validate('*'));
$this->assertTrue($f->validate('*/10,2,1-12')); $this->assertFalse($f->validate('*/10,2,1-12'));
$this->assertFalse($f->validate('1.fix-regexp')); $this->assertFalse($f->validate('1.fix-regexp'));
} }
/** /**
* @covers Cron\MonthField::increment * @covers \Cron\MonthField::increment
*/ */
public function testIncrementsDate() public function testIncrementsDate()
{ {
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f = new MonthField(); $f = new MonthField();
$f->increment($d); $f->increment($d);
$this->assertEquals('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s'));
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f->increment($d, true); $f->increment($d, true);
$this->assertEquals('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s'));
} }
/** /**
* @covers Cron\MonthField::increment * @covers \Cron\MonthField::increment
*/ */
public function testIncrementsDateWithThirtyMinuteTimezone() public function testIncrementsDateWithThirtyMinuteTimezone()
{ {
@@ -48,34 +48,34 @@ class MonthFieldTest extends PHPUnit_Framework_TestCase
$d = new DateTime('2011-03-31 11:59:59'); $d = new DateTime('2011-03-31 11:59:59');
$f = new MonthField(); $f = new MonthField();
$f->increment($d); $f->increment($d);
$this->assertEquals('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s'));
$d = new DateTime('2011-03-15 11:15:00'); $d = new DateTime('2011-03-15 11:15:00');
$f->increment($d, true); $f->increment($d, true);
$this->assertEquals('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s'));
date_default_timezone_set($tz); date_default_timezone_set($tz);
} }
/** /**
* @covers Cron\MonthField::increment * @covers \Cron\MonthField::increment
*/ */
public function testIncrementsYearAsNeeded() public function testIncrementsYearAsNeeded()
{ {
$f = new MonthField(); $f = new MonthField();
$d = new DateTime('2011-12-15 00:00:00'); $d = new DateTime('2011-12-15 00:00:00');
$f->increment($d); $f->increment($d);
$this->assertEquals('2012-01-01 00:00:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2012-01-01 00:00:00', $d->format('Y-m-d H:i:s'));
} }
/** /**
* @covers Cron\MonthField::increment * @covers \Cron\MonthField::increment
*/ */
public function testDecrementsYearAsNeeded() public function testDecrementsYearAsNeeded()
{ {
$f = new MonthField(); $f = new MonthField();
$d = new DateTime('2011-01-15 00:00:00'); $d = new DateTime('2011-01-15 00:00:00');
$f->increment($d, true); $f->increment($d, true);
$this->assertEquals('2010-12-31 23:59:00', $d->format('Y-m-d H:i:s')); $this->assertSame('2010-12-31 23:59:00', $d->format('Y-m-d H:i:s'));
} }
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -10,17 +10,17 @@
} }
], ],
"require": { "require": {
"php": ">=5.6.4", "php": ">=7.1.0",
"facebook/webdriver": "~1.0", "facebook/webdriver": "~1.3",
"nesbot/carbon": "~1.20", "nesbot/carbon": "~1.20",
"illuminate/console": "~5.5", "illuminate/console": "~5.6",
"illuminate/support": "~5.5", "illuminate/support": "~5.6",
"symfony/console": "~3.2", "symfony/console": "~4.0",
"symfony/process": "~3.2" "symfony/process": "~4.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^5.7", "mockery/mockery": "~1.0",
"mockery/mockery": "^0.9.6" "phpunit/phpunit": "~7.0"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@@ -29,7 +29,7 @@
}, },
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "2.0-dev" "dev-master": "4.0-dev"
}, },
"laravel": { "laravel": {
"providers": [ "providers": [

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false" <phpunit backupGlobals="false"
backupStaticAttributes="false" backupStaticAttributes="false"
beStrictAboutTestsThatDoNotTestAnything="false"
bootstrap="vendor/autoload.php" bootstrap="vendor/autoload.php"
colors="true" colors="true"
convertErrorsToExceptions="true" convertErrorsToExceptions="true"

View File

@@ -7,6 +7,7 @@ use BadMethodCallException;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Support\Traits\Macroable; use Illuminate\Support\Traits\Macroable;
use Facebook\WebDriver\WebDriverDimension; use Facebook\WebDriver\WebDriverDimension;
use Facebook\WebDriver\Remote\WebDriverBrowserType;
class Browser class Browser
{ {
@@ -42,6 +43,16 @@ class Browser
*/ */
public static $storeConsoleLogAt; public static $storeConsoleLogAt;
/**
* The browsers that support retrieving logs.
*
* @var array
*/
public static $supportsRemoteLogs = [
WebDriverBrowserType::CHROME,
WebDriverBrowserType::PHANTOMJS,
];
/** /**
* Get the callback which resolves the default user to authenticate. * Get the callback which resolves the default user to authenticate.
* *
@@ -49,6 +60,13 @@ class Browser
*/ */
public static $userResolver; public static $userResolver;
/**
* The default wait time in seconds.
*
* @var int
*/
public static $waitSeconds = 5;
/** /**
* The RemoteWebDriver instance. * The RemoteWebDriver instance.
* *
@@ -70,6 +88,13 @@ class Browser
*/ */
public $page; public $page;
/**
* The component object currently being viewed.
*
* @var mixed
*/
public $component;
/** /**
* Create a browser instance. * Create a browser instance.
* *
@@ -87,7 +112,7 @@ class Browser
/** /**
* Browse to the given URL. * Browse to the given URL.
* *
* @param string $url * @param string|Page $url
* @return $this * @return $this
*/ */
public function visit($url) public function visit($url)
@@ -229,13 +254,15 @@ class Browser
*/ */
public function storeConsoleLog($name) public function storeConsoleLog($name)
{ {
$console = $this->driver->manage()->getLog('browser'); if (in_array($this->driver->getCapabilities()->getBrowserName(), static::$supportsRemoteLogs)) {
$console = $this->driver->manage()->getLog('browser');
if (! empty($console)) { if (!empty($console)) {
file_put_contents( file_put_contents(
sprintf('%s/%s.log', rtrim(static::$storeConsoleLogAt, '/'), $name) sprintf('%s/%s.log', rtrim(static::$storeConsoleLogAt, '/'), $name)
, json_encode($console, JSON_PRETTY_PRINT) , json_encode($console, JSON_PRETTY_PRINT)
); );
}
} }
return $this; return $this;
@@ -270,11 +297,33 @@ class Browser
$browser->on($this->page); $browser->on($this->page);
} }
if ($selector instanceof Component) {
$browser->onComponent($selector, $this->resolver);
}
call_user_func($callback, $browser); call_user_func($callback, $browser);
return $this; return $this;
} }
public function onComponent($component, $parentResolver)
{
$this->component = $component;
// Here we will set the component elements on the resolver instance, which will allow
// the developer to access short-cuts for CSS selectors on the component which can
// allow for more expressive navigation and interaction with all the components.
$this->resolver->pageElements(
$component->elements() + $parentResolver->elements
);
$component->assert($this);
$this->resolver->prefix = $this->resolver->format(
$component->selector()
);
}
/** /**
* Ensure that jQuery is available on the page. * Ensure that jQuery is available on the page.
* *
@@ -373,6 +422,14 @@ class Browser
return $this->macroCall($method, $parameters); return $this->macroCall($method, $parameters);
} }
if ($this->component && method_exists($this->component, $method)) {
array_unshift($parameters, $this);
$this->component->{$method}(...$parameters);
return $this;
}
if ($this->page && method_exists($this->page, $method)) { if ($this->page && method_exists($this->page, $method)) {
array_unshift($parameters, $this); array_unshift($parameters, $this);

View File

@@ -0,0 +1,102 @@
<?php
namespace Laravel\Dusk\Chrome;
use RuntimeException;
use Illuminate\Support\Str;
use Symfony\Component\Process\Process;
class ChromeProcess
{
/**
* The path to the Chromedriver.
*
* @var String
*/
protected $driver;
/**
* Create a new ChromeProcess instance.
*
* @param string $driver
* @return void
*/
public function __construct($driver = null)
{
$this->driver = $driver;
if (! is_null($driver) && realpath($driver) === false) {
throw new RuntimeException("Invalid path to Chromedriver [{$driver}].");
}
}
/**
* Build the process to run Chromedriver.
*
* @return \Symfony\Component\Process\Process
*/
public function toProcess()
{
if ($this->driver) {
return $this->process();
}
if ($this->onWindows()) {
$this->driver = realpath(__DIR__.'/../../bin/chromedriver-win.exe');
return $this->process();
}
$this->driver = $this->onMac()
? realpath(__DIR__.'/../../bin/chromedriver-mac')
: realpath(__DIR__.'/../../bin/chromedriver-linux');
return $this->process();
}
/**
* Build the Chromedriver with Symfony Process.
*
* @return \Symfony\Component\Process\Process
*/
protected function process()
{
return (new Process(
[realpath($this->driver)], null, $this->chromeEnvironment()
));
}
/**
* Get the Chromedriver environment variables.
*
* @return array
*/
protected function chromeEnvironment()
{
if ($this->onMac() || $this->onWindows()) {
return [];
}
return ['DISPLAY' => ':0'];
}
/**
* Determine if Dusk is running on Windows or Windows Subsystem for Linux.
*
* @return bool
*/
protected function onWindows()
{
return PHP_OS === 'WINNT' || Str::contains(php_uname(), 'Microsoft');
}
/**
* Determine if Dusk is running on Mac.
*
* @return bool
*/
protected function onMac()
{
return PHP_OS === 'Darwin';
}
}

View File

@@ -1,10 +1,6 @@
<?php <?php
namespace Laravel\Dusk; namespace Laravel\Dusk\Chrome;
use RuntimeException;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\ProcessBuilder;
trait SupportsChrome trait SupportsChrome
{ {
@@ -55,23 +51,13 @@ trait SupportsChrome
/** /**
* Build the process to run the Chromedriver. * Build the process to run the Chromedriver.
* *
* @throws \RuntimeException if the driver file path doesn't exist.
* *
* @return \Symfony\Component\Process\Process * @return \Symfony\Component\Process\Process
* @throws \RuntimeException if the driver file path doesn't exist.
*/ */
protected static function buildChromeProcess() protected static function buildChromeProcess()
{ {
$driver = static::$chromeDriver return (new ChromeProcess(static::$chromeDriver))->toProcess();
?: realpath(__DIR__.'/../bin/chromedriver-'.static::driverSuffix());
if (realpath($driver) === false) {
throw new RuntimeException("Invalid path to Chromedriver [{$driver}].");
}
return (new ProcessBuilder())
->setPrefix(realpath($driver))
->getProcess()
->setEnv(static::chromeEnvironment());
} }
/** /**
@@ -84,35 +70,4 @@ trait SupportsChrome
{ {
static::$chromeDriver = $path; static::$chromeDriver = $path;
} }
/**
* Get the Chromedriver environment variables.
*
* @return array
*/
protected static function chromeEnvironment()
{
if (PHP_OS === 'Darwin' || PHP_OS === 'WINNT') {
return [];
}
return ['DISPLAY' => ':0'];
}
/**
* Get the suffix for the Chromedriver binary.
*
* @return string
*/
protected static function driverSuffix()
{
switch (PHP_OS) {
case 'Darwin':
return 'mac';
case 'WINNT':
return 'win.exe';
default:
return 'linux';
}
}
} }

44
vendor/laravel/dusk/src/Component.php vendored Normal file
View File

@@ -0,0 +1,44 @@
<?php
namespace Laravel\Dusk;
abstract class Component
{
/**
* Get the root selector associated with this component.
*
* @return string
*/
abstract public function selector();
/**
* Assert that the current page contains this component.
*
* @param \Laravel\Dusk\Browser $browser
* @return void
*/
public function assert(Browser $browser)
{
//
}
/**
* Get the element shortcuts for the page.
*
* @return array
*/
public function elements()
{
return [];
}
/**
* Allow this class to be used in place of a selector string.
*
* @return string
*/
public function __toString()
{
return '';
}
}

View File

@@ -86,7 +86,7 @@ trait InteractsWithAuthentication
/** /**
* Assert that the user is authenticated as the given user. * Assert that the user is authenticated as the given user.
* *
* @param $user * @param mixed $user
* @param string|null $guard * @param string|null $guard
* @return $this * @return $this
*/ */

View File

@@ -14,7 +14,7 @@ trait InteractsWithElements
* Get all of the elements matching the given selector. * Get all of the elements matching the given selector.
* *
* @param string $selector * @param string $selector
* @return array * @return \Facebook\WebDriver\Remote\RemoteWebElement[]
*/ */
public function elements($selector) public function elements($selector)
{ {
@@ -32,45 +32,18 @@ trait InteractsWithElements
return $this->resolver->find($selector); return $this->resolver->find($selector);
} }
/**
* Click the element at the given selector.
*
* @param string $selector
* @return $this
*/
public function click($selector)
{
$this->resolver->findOrFail($selector)->click();
return $this;
}
/**
* Right click the element at the given selector.
*
* @param string $selector
* @return $this
*/
public function rightClick($selector)
{
(new WebDriverActions($this->driver))->contextClick(
$this->resolver->findOrFail($selector)
)->perform();
return $this;
}
/** /**
* Click the link with the given text. * Click the link with the given text.
* *
* @param string $link * @param string $link
* @param string $element
* @return $this * @return $this
*/ */
public function clickLink($link) public function clickLink($link, $element = "a")
{ {
$this->ensurejQueryIsAvailable(); $this->ensurejQueryIsAvailable();
$selector = addslashes(trim($this->resolver->format("a:contains({$link})"))); $selector = addslashes(trim($this->resolver->format("{$element}:contains({$link})")));
$this->driver->executeScript("jQuery.find(\"{$selector}\")[0].click();"); $this->driver->executeScript("jQuery.find(\"{$selector}\")[0].click();");
@@ -213,9 +186,7 @@ trait InteractsWithElements
if (is_null($value)) { if (is_null($value)) {
$options[array_rand($options)]->click(); $options[array_rand($options)]->click();
} } else {
else {
foreach ($options as $option) { foreach ($options as $option) {
if ((string) $option->getAttribute('value') === (string) $value) { if ((string) $option->getAttribute('value') === (string) $value) {
$option->click(); $option->click();
@@ -418,6 +389,19 @@ trait InteractsWithElements
return $this; return $this;
} }
/**
* Type the given value in an open JavaScript prompt dialog.
*
* @param string $value
* @return $this
*/
public function typeInDialog($value)
{
$this->driver->switchTo()->alert()->sendKeys($value);
return $this;
}
/** /**
* Dismiss a JavaScript dialog. * Dismiss a JavaScript dialog.
* *

View File

@@ -2,8 +2,26 @@
namespace Laravel\Dusk\Concerns; namespace Laravel\Dusk\Concerns;
use Facebook\WebDriver\Interactions\WebDriverActions;
trait InteractsWithMouse trait InteractsWithMouse
{ {
/**
* Move the mouse by offset X and Y.
*
* @param int $xOffset
* @param int $yOffset
* @return $this
*/
public function moveMouse($xOffset, $yOffset)
{
(new WebDriverActions($this->driver))->moveByOffset(
$xOffset, $yOffset
)->perform();
return $this;
}
/** /**
* Move the mouse over the given selector. * Move the mouse over the given selector.
* *
@@ -18,4 +36,76 @@ trait InteractsWithMouse
return $this; return $this;
} }
/**
* Click the element at the given selector.
*
* @param string|null $selector
* @return $this
*/
public function click($selector = null)
{
if (is_null($selector)) {
(new WebDriverActions($this->driver))->click()->perform();
} else {
$this->resolver->findOrFail($selector)->click();
}
return $this;
}
/**
* Perform a mouse click and hold the mouse button down.
*
* @return $this
*/
public function clickAndHold()
{
(new WebDriverActions($this->driver))->clickAndHold()->perform();
return $this;
}
/**
* Perform a double click at the current mouse position.
*
* @return $this
*/
public function doubleClick()
{
(new WebDriverActions($this->driver))->doubleClick()->perform();
return $this;
}
/**
* Right click the element at the given selector.
*
* @param string|null $selector
* @return $this
*/
public function rightClick($selector = null)
{
if (is_null($selector)) {
(new WebDriverActions($this->driver))->contextClick()->perform();
} else {
(new WebDriverActions($this->driver))->contextClick(
$this->resolver->findOrFail($selector)
)->perform();
}
return $this;
}
/**
* Release the currenctly clicked mouse button.
*
* @return $this
*/
public function releaseMouse()
{
(new WebDriverActions($this->driver))->release()->perform();
return $this;
}
} }

View File

@@ -4,6 +4,7 @@ namespace Laravel\Dusk\Concerns;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use PHPUnit\Framework\Assert as PHPUnit; use PHPUnit\Framework\Assert as PHPUnit;
use Facebook\WebDriver\Remote\RemoteWebElement;
use Facebook\WebDriver\Exception\NoSuchElementException; use Facebook\WebDriver\Exception\NoSuchElementException;
trait MakesAssertions trait MakesAssertions
@@ -16,7 +17,10 @@ trait MakesAssertions
*/ */
public function assertTitle($title) public function assertTitle($title)
{ {
PHPUnit::assertEquals($title, $this->driver->getTitle()); PHPUnit::assertEquals(
$title, $this->driver->getTitle(),
"Expected title [{$title}] does not equal actual title [{$this->driver->getTitle()}]."
);
return $this; return $this;
} }
@@ -30,7 +34,36 @@ trait MakesAssertions
public function assertTitleContains($title) public function assertTitleContains($title)
{ {
PHPUnit::assertTrue( PHPUnit::assertTrue(
Str::contains($this->driver->getTitle(), $title) Str::contains($this->driver->getTitle(), $title),
"Did not see expected value [{$title}] within title [{$this->driver->getTitle()}]."
);
return $this;
}
/**
* Assert that the current URL matches the given URL.
*
* @param string $url
* @return $this
*/
public function assertUrlIs($url)
{
$pattern = str_replace('\*', '.*', preg_quote($url, '/'));
$segments = parse_url($this->driver->getCurrentURL());
$currentUrl = sprintf(
'%s://%s%s%s',
$segments['scheme'],
$segments['host'],
array_get($segments, 'port', '') ? ':'.$segments['port'] : '',
array_get($segments, 'path', '')
);
PHPUnit::assertRegExp(
'/^'.$pattern.'$/u', $currentUrl,
"Actual URL [{$this->driver->getCurrentURL()}] does not equal expected URL [{$url}]."
); );
return $this; return $this;
@@ -48,9 +81,12 @@ trait MakesAssertions
$pattern = str_replace('\*', '.*', $pattern); $pattern = str_replace('\*', '.*', $pattern);
PHPUnit::assertRegExp('/^'.$pattern.'/u', parse_url( $actualPath = parse_url($this->driver->getCurrentURL())['path'];
$this->driver->getCurrentURL()
)['path']); PHPUnit::assertRegExp(
'/^'.$pattern.'$/u', $actualPath,
"Actual path [{$actualPath}] does not equal expected path [{$path}]."
);
return $this; return $this;
} }
@@ -63,9 +99,12 @@ trait MakesAssertions
*/ */
public function assertPathBeginsWith($path) public function assertPathBeginsWith($path)
{ {
PHPUnit::assertStringStartsWith($path, parse_url( $actualPath = parse_url($this->driver->getCurrentURL())['path'];
$this->driver->getCurrentURL()
)['path']); PHPUnit::assertStringStartsWith(
$path, $actualPath,
"Actual path [{$actualPath}] does not begin with expected path [{$path}]."
);
return $this; return $this;
} }
@@ -78,9 +117,68 @@ trait MakesAssertions
*/ */
public function assertPathIsNot($path) public function assertPathIsNot($path)
{ {
PHPUnit::assertNotEquals($path, parse_url( $actualPath = parse_url($this->driver->getCurrentURL())['path'];
$this->driver->getCurrentURL()
)['path']); PHPUnit::assertNotEquals(
$path, $actualPath,
"Path [{$path}] should not equal the actual value."
);
return $this;
}
/**
* Assert that the current URL fragment matches the given pattern.
*
* @param string $fragment
* @return $this
*/
public function assertFragmentIs($fragment)
{
$pattern = preg_quote($fragment, '/');
$actualFragment = (string) parse_url($this->driver->executeScript('return window.location.href;'), PHP_URL_FRAGMENT);
PHPUnit::assertRegExp(
'/^'.str_replace('\*', '.*', $pattern).'$/u', $actualFragment,
"Actual fragment [{$actualFragment}] does not equal expected fragment [{$fragment}]."
);
return $this;
}
/**
* Assert that the current URL fragment begins with given fragment.
*
* @param string $fragment
* @return $this
*/
public function assertFragmentBeginsWith($fragment)
{
$actualFragment = (string) parse_url($this->driver->executeScript('return window.location.href;'), PHP_URL_FRAGMENT);
PHPUnit::assertStringStartsWith(
$fragment, $actualFragment,
"Actual fragment [$actualFragment] does not begin with expected fragment [$fragment]."
);
return $this;
}
/**
* Assert that the current URL fragment does not match the given fragment.
*
* @param string $fragment
* @return $this
*/
public function assertFragmentIsNot($fragment)
{
$actualFragment = (string) parse_url($this->driver->executeScript('return window.location.href;'), PHP_URL_FRAGMENT);
PHPUnit::assertNotEquals(
$fragment, $actualFragment,
"Fragment [{$fragment}] should not equal the actual value."
);
return $this; return $this;
} }
@@ -149,7 +247,7 @@ trait MakesAssertions
* Assert that the given query string parameter is present. * Assert that the given query string parameter is present.
* *
* @param string $name * @param string $name
* @return $this * @return array
*/ */
protected function assertHasQueryStringParameter($name) protected function assertHasQueryStringParameter($name)
{ {
@@ -186,6 +284,22 @@ trait MakesAssertions
return $this; return $this;
} }
/**
* Assert that the given cookie is not present.
*
* @param string $name
* @return $this
*/
public function assertCookieMissing($name)
{
PHPUnit::assertTrue(
is_null($this->cookie($name)),
"Found unexpected cookie [{$name}]."
);
return $this;
}
/** /**
* Assert that an encrypted cookie has a given value. * Assert that an encrypted cookie has a given value.
* *
@@ -347,7 +461,7 @@ trait MakesAssertions
if ($this->resolver->prefix) { if ($this->resolver->prefix) {
$message = "Saw unexpected link [{$link}] within [{$this->resolver->prefix}]."; $message = "Saw unexpected link [{$link}] within [{$this->resolver->prefix}].";
} else { } else {
$message = "Saw unexpected expected link [{$link}]."; $message = "Saw unexpected link [{$link}].";
} }
PHPUnit::assertFalse( PHPUnit::assertFalse(
@@ -387,7 +501,10 @@ JS;
*/ */
public function assertInputValue($field, $value) public function assertInputValue($field, $value)
{ {
PHPUnit::assertEquals($value, $this->inputValue($field)); PHPUnit::assertEquals(
$value, $this->inputValue($field),
"Expected value [{$value}] for the [{$field}] input does not equal the actual value [{$this->inputValue($field)}]."
);
return $this; return $this;
} }
@@ -401,7 +518,10 @@ JS;
*/ */
public function assertInputValueIsNot($field, $value) public function assertInputValueIsNot($field, $value)
{ {
PHPUnit::assertNotEquals($value, $this->inputValue($field)); PHPUnit::assertNotEquals(
$value, $this->inputValue($field),
"Value [{$value}] for the [{$field}] input should not equal the actual value."
);
return $this; return $this;
} }
@@ -466,7 +586,7 @@ JS;
* @param string $value * @param string $value
* @return $this * @return $this
*/ */
function assertRadioSelected($field, $value) public function assertRadioSelected($field, $value)
{ {
$element = $this->resolver->resolveForRadioSelection($field, $value); $element = $this->resolver->resolveForRadioSelection($field, $value);
@@ -540,9 +660,14 @@ JS;
*/ */
public function assertSelectHasOptions($field, array $values) public function assertSelectHasOptions($field, array $values)
{ {
$options = $this->resolver->resolveSelectOptions($field, $values);
$options = collect($options)->unique(function (RemoteWebElement $option) {
return $option->getAttribute('value');
})->all();
PHPUnit::assertCount( PHPUnit::assertCount(
count($values), count($values), $options,
$this->resolver->resolveSelectOptions($field, $values),
"Expected options [".implode(',', $values)."] for selection field [{$field}] to be available." "Expected options [".implode(',', $values)."] for selection field [{$field}] to be available."
); );
@@ -638,6 +763,24 @@ JS;
return $this; return $this;
} }
/**
* Assert that the element with the given selector is present in the DOM.
*
* @param string $selector
* @return $this
*/
public function assertPresent($selector)
{
$fullSelector = $this->resolver->format($selector);
PHPUnit::assertTrue(
! is_null($this->resolver->find($selector)),
"Element [{$fullSelector}] is not present."
);
return $this;
}
/** /**
* Assert that the element with the given selector is not on the page. * Assert that the element with the given selector is not on the page.
* *
@@ -667,10 +810,160 @@ JS;
*/ */
public function assertDialogOpened($message) public function assertDialogOpened($message)
{ {
$actualMessage = $this->driver->switchTo()->alert()->getText();
PHPUnit::assertEquals( PHPUnit::assertEquals(
$message, $this->driver->switchTo()->alert()->getText() $message, $actualMessage,
"Expected dialog message [{$message}] does not equal actual message [{$actualMessage}]."
); );
return $this; return $this;
} }
/**
* Assert that the given field is enabled.
*
* @param string $field
* @return $this
*/
public function assertEnabled($field) {
$element = $this->resolver->resolveForField($field);
PHPUnit::assertTrue(
$element->isEnabled(),
"Expected element [{$field}] to be enabled, but it wasn't."
);
return $this;
}
/**
* Assert that the given field is disabled.
*
* @param string $field
* @return $this
*/
public function assertDisabled($field) {
$element = $this->resolver->resolveForField($field);
PHPUnit::assertFalse(
$element->isEnabled(),
"Expected element [{$field}] to be disabled, but it wasn't."
);
return $this;
}
/**
* Assert that the given field is focused.
*
* @param string $field
* @return $this
*/
public function assertFocused($field) {
$element = $this->resolver->resolveForField($field);
PHPUnit::assertTrue(
$this->driver->switchTo()->activeElement()->equals($element),
"Expected element [{$field}] to be focused, but it wasn't."
);
return $this;
}
/**
* Assert that the given field is not focused.
*
* @param string $field
* @return $this
*/
public function assertNotFocused($field) {
$element = $this->resolver->resolveForField($field);
PHPUnit::assertFalse(
$this->driver->switchTo()->activeElement()->equals($element),
"Expected element [{$field}] not to be focused, but it was."
);
return $this;
}
/**
* Assert that the Vue component's attribute at the given key has the given value.
*
* @param string $key
* @param string $value
* @param string|null $componentSelector
* @return $this
*/
public function assertVue($key, $value, $componentSelector = null)
{
PHPUnit::assertEquals($value, $this->vueAttribute($componentSelector, $key));
return $this;
}
/**
* Assert that the Vue component's attribute at the given key
* does not have the given value.
*
* @param string $key
* @param string $value
* @param string|null $componentSelector
* @return $this
*/
public function assertVueIsNot($key, $value, $componentSelector = null)
{
PHPUnit::assertNotEquals($value, $this->vueAttribute($componentSelector, $key));
return $this;
}
/**
* Assert that the Vue component's attribute at the given key
* is an array that contains the given value.
*
* @param string $key
* @param string $value
* @param string|null $componentSelector
* @return $this
*/
public function assertVueContains($key, $value, $componentSelector = null)
{
PHPUnit::assertContains($value, $this->vueAttribute($componentSelector, $key));
return $this;
}
/**
* Assert that the Vue component's attribute at the given key
* is an array that does not contain the given value.
*
* @param string $key
* @param string $value
* @param string|null $componentSelector
* @return $this
*/
public function assertVueDoesNotContain($key, $value, $componentSelector = null)
{
PHPUnit::assertNotContains($value, $this->vueAttribute($componentSelector, $key));
return $this;
}
/**
* Retrieve the value of the Vue component's attribute at the given key.
*
* @param string $componentSelector
* @param string $key
* @return mixed
*/
public function vueAttribute($componentSelector, $key)
{
$fullSelector = $this->resolver->format($componentSelector);
return $this->driver->executeScript(
"return document.querySelector('" . $fullSelector . "').__vue__." . $key
);
}
} }

View File

@@ -0,0 +1,199 @@
<?php
namespace Laravel\Dusk\Concerns;
use Closure;
use Exception;
use Throwable;
use ReflectionFunction;
use Laravel\Dusk\Browser;
use Illuminate\Support\Collection;
trait ProvidesBrowser
{
/**
* All of the active browser instances.
*
* @var array
*/
protected static $browsers = [];
/**
* The callbacks that should be run on class tear down.
*
* @var array
*/
protected static $afterClassCallbacks = [];
/**
* Tear down the Dusk test case class.
*
* @afterClass
* @return void
*/
public static function tearDownDuskClass()
{
static::closeAll();
foreach (static::$afterClassCallbacks as $callback) {
$callback();
}
}
/**
* Register an "after class" tear down callback.
*
* @param \Closure $callback
* @return void
*/
public static function afterClass(Closure $callback)
{
static::$afterClassCallbacks[] = $callback;
}
/**
* Create a new browser instance.
*
* @param \Closure $callback
* @return \Laravel\Dusk\Browser|void
* @throws \Exception
* @throws \Throwable
*/
public function browse(Closure $callback)
{
$browsers = $this->createBrowsersFor($callback);
try {
$callback(...$browsers->all());
} catch (Exception $e) {
$this->captureFailuresFor($browsers);
throw $e;
} catch (Throwable $e) {
$this->captureFailuresFor($browsers);
throw $e;
} finally {
$this->storeConsoleLogsFor($browsers);
static::$browsers = $this->closeAllButPrimary($browsers);
}
}
/**
* Create the browser instances needed for the given callback.
*
* @param \Closure $callback
* @return array
*/
protected function createBrowsersFor(Closure $callback)
{
if (count(static::$browsers) === 0) {
static::$browsers = collect([$this->newBrowser($this->createWebDriver())]);
}
$additional = $this->browsersNeededFor($callback) - 1;
for ($i = 0; $i < $additional; $i++) {
static::$browsers->push($this->newBrowser($this->createWebDriver()));
}
return static::$browsers;
}
/**
* Create a new Browser instance.
*
* @param \Facebook\WebDriver\Remote\RemoteWebDriver $driver
* @return \Laravel\Dusk\Browser
*/
protected function newBrowser($driver)
{
return new Browser($driver);
}
/**
* Get the number of browsers needed for a given callback.
*
* @param \Closure $callback
* @return int
*/
protected function browsersNeededFor(Closure $callback)
{
return (new ReflectionFunction($callback))->getNumberOfParameters();
}
/**
* Capture failure screenshots for each browser.
*
* @param \Illuminate\Support\Collection $browsers
* @return void
*/
protected function captureFailuresFor($browsers)
{
$browsers->each(function ($browser, $key) {
$name = str_replace('\\', '_', get_class($this)).'_'.$this->getName(false);
$browser->screenshot('failure-'.$name.'-'.$key);
});
}
/**
* Store the console output for the given browsers.
*
* @param \Illuminate\Support\Collection $browsers
* @return void
*/
protected function storeConsoleLogsFor($browsers)
{
$browsers->each(function ($browser, $key) {
$name = str_replace('\\', '_', get_class($this)).'_'.$this->getName(false);
$browser->storeConsoleLog($name.'-'.$key);
});
}
/**
* Close all of the browsers except the primary (first) one.
*
* @param \Illuminate\Support\Collection $browsers
* @return \Illuminate\Support\Collection
*/
protected function closeAllButPrimary($browsers)
{
$browsers->slice(1)->each->quit();
return $browsers->take(1);
}
/**
* Close all of the active browsers.
*
* @return void
*/
public static function closeAll()
{
Collection::make(static::$browsers)->each->quit();
static::$browsers = collect();
}
/**
* Create the remote web driver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
protected function createWebDriver()
{
return retry(5, function () {
return $this->driver();
}, 50);
}
/**
* Create the RemoteWebDriver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
abstract protected function driver();
}

View File

@@ -8,6 +8,7 @@ use Carbon\Carbon;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Facebook\WebDriver\Exception\TimeOutException; use Facebook\WebDriver\Exception\TimeOutException;
use Facebook\WebDriver\Exception\NoSuchElementException; use Facebook\WebDriver\Exception\NoSuchElementException;
use Facebook\WebDriver\WebDriverExpectedCondition;
trait WaitsForElements trait WaitsForElements
{ {
@@ -19,7 +20,7 @@ trait WaitsForElements
* @param int $seconds * @param int $seconds
* @return $this * @return $this
*/ */
public function whenAvailable($selector, Closure $callback, $seconds = 5) public function whenAvailable($selector, Closure $callback, $seconds = null)
{ {
return $this->waitFor($selector, $seconds)->with($selector, $callback); return $this->waitFor($selector, $seconds)->with($selector, $callback);
} }
@@ -31,11 +32,11 @@ trait WaitsForElements
* @param int $seconds * @param int $seconds
* @return $this * @return $this
*/ */
public function waitFor($selector, $seconds = 5) public function waitFor($selector, $seconds = null)
{ {
return $this->waitUsing($seconds, 100, function () use ($selector) { return $this->waitUsing($seconds, 100, function () use ($selector) {
return $this->resolver->findOrFail($selector)->isDisplayed(); return $this->resolver->findOrFail($selector)->isDisplayed();
}, "Waited {$seconds} seconds for selector [{$selector}]."); }, "Waited %s seconds for selector [{$selector}].");
} }
/** /**
@@ -45,7 +46,7 @@ trait WaitsForElements
* @param int $seconds * @param int $seconds
* @return $this * @return $this
*/ */
public function waitUntilMissing($selector, $seconds = 5) public function waitUntilMissing($selector, $seconds = null)
{ {
return $this->waitUsing($seconds, 100, function () use ($selector) { return $this->waitUsing($seconds, 100, function () use ($selector) {
try { try {
@@ -55,7 +56,7 @@ trait WaitsForElements
} }
return $missing; return $missing;
}, "Waited {$seconds} seconds for removal of selector [{$selector}]."); }, "Waited %s seconds for removal of selector [{$selector}].");
} }
/** /**
@@ -65,11 +66,11 @@ trait WaitsForElements
* @param int $seconds * @param int $seconds
* @return $this * @return $this
*/ */
public function waitForText($text, $seconds = 5) public function waitForText($text, $seconds = null)
{ {
return $this->waitUsing($seconds, 100, function () use ($text) { return $this->waitUsing($seconds, 100, function () use ($text) {
return Str::contains($this->resolver->findOrFail('')->getText(), $text); return Str::contains($this->resolver->findOrFail('')->getText(), $text);
}, "Waited {$seconds} seconds for text [{$text}]."); }, "Waited %s seconds for text [{$text}].");
} }
/** /**
@@ -79,7 +80,7 @@ trait WaitsForElements
* @param int $seconds * @param int $seconds
* @return $this * @return $this
*/ */
public function waitForLink($link, $seconds = 5) public function waitForLink($link, $seconds = null)
{ {
return $this->waitUsing($seconds, 100, function () use ($link) { return $this->waitUsing($seconds, 100, function () use ($link) {
return $this->seeLink($link); return $this->seeLink($link);
@@ -93,11 +94,24 @@ trait WaitsForElements
* @param int $seconds * @param int $seconds
* @return $this * @return $this
*/ */
public function waitForLocation($path, $seconds = 5) public function waitForLocation($path, $seconds = null)
{ {
return $this->waitUntil("window.location.pathname == '{$path}'", $seconds); return $this->waitUntil("window.location.pathname == '{$path}'", $seconds);
} }
/**
* Wait for the given location using a named route.
*
* @param string $route
* @param array $parameters
* @param int $seconds
* @return $this
*/
public function waitForRoute($route, $parameters = [], $seconds = null)
{
return $this->waitForLocation(route($route, $parameters), $seconds);
}
/** /**
* Wait until the given script returns true. * Wait until the given script returns true.
* *
@@ -105,7 +119,7 @@ trait WaitsForElements
* @param int $seconds * @param int $seconds
* @return $this * @return $this
*/ */
public function waitUntil($script, $seconds = 5) public function waitUntil($script, $seconds = null)
{ {
if (! Str::startsWith($script, 'return ')) { if (! Str::startsWith($script, 'return ')) {
$script = 'return '.$script; $script = 'return '.$script;
@@ -120,6 +134,23 @@ trait WaitsForElements
}); });
} }
/**
* Wait for a JavaScript dialog to open.
*
* @param int $seconds
* @return $this
*/
public function waitForDialog($seconds = null)
{
$seconds = is_null($seconds) ? static::$waitSeconds : $seconds;
$this->driver->wait($seconds, 100)->until(
WebDriverExpectedCondition::alertIsPresent(), "Waited {$seconds} seconds for dialog."
);
return $this;
}
/** /**
* Wait for the current page to reload. * Wait for the current page to reload.
* *
@@ -127,7 +158,7 @@ trait WaitsForElements
* @param int $seconds * @param int $seconds
* @return $this * @return $this
*/ */
public function waitForReload($callback = null, $seconds = 5) public function waitForReload($callback = null, $seconds = null)
{ {
$token = str_random(); $token = str_random();
@@ -139,7 +170,7 @@ trait WaitsForElements
return $this->waitUsing($seconds, 100, function () use ($token) { return $this->waitUsing($seconds, 100, function () use ($token) {
return $this->driver->executeScript("return typeof window['{$token}'] === 'undefined';"); return $this->driver->executeScript("return typeof window['{$token}'] === 'undefined';");
}); }, 'Waited %s seconds for page reload.');
} }
/** /**
@@ -154,6 +185,8 @@ trait WaitsForElements
*/ */
public function waitUsing($seconds, $interval, Closure $callback, $message = null) public function waitUsing($seconds, $interval, Closure $callback, $message = null)
{ {
$seconds = is_null($seconds) ? static::$waitSeconds : $seconds;
$this->pause($interval); $this->pause($interval);
$started = Carbon::now(); $started = Carbon::now();
@@ -168,7 +201,10 @@ trait WaitsForElements
} }
if ($started->lt(Carbon::now()->subSeconds($seconds))) { if ($started->lt(Carbon::now()->subSeconds($seconds))) {
throw new TimeOutException($message ?: "Waited {$seconds} seconds for callback."); throw new TimeOutException($message
? sprintf($message, $seconds)
: "Waited {$seconds} seconds for callback."
);
} }
$this->pause($interval); $this->pause($interval);

View File

@@ -0,0 +1,73 @@
<?php
namespace Laravel\Dusk\Console;
use Illuminate\Console\GeneratorCommand;
class ComponentCommand extends GeneratorCommand
{
/**
* The console command name.
*
* @var string
*/
protected $signature = 'dusk:component {name : The name of the class}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new Dusk component class';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Component';
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
return __DIR__.'/stubs/component.stub';
}
/**
* Get the destination class path.
*
* @param string $name
* @return string
*/
protected function getPath($name)
{
$name = str_replace_first($this->rootNamespace(), '', $name);
return $this->laravel->basePath().'/tests'.str_replace('\\', '/', $name).'.php';
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Browser\Components';
}
/**
* Get the root namespace for the class.
*
* @return string
*/
protected function rootNamespace()
{
return 'Tests';
}
}

View File

@@ -3,9 +3,10 @@
namespace Laravel\Dusk\Console; namespace Laravel\Dusk\Console;
use Dotenv\Dotenv; use Dotenv\Dotenv;
use Illuminate\Support\Str;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\Finder;
use Symfony\Component\Process\ProcessBuilder; use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\RuntimeException; use Symfony\Component\Process\Exception\RuntimeException;
class DuskCommand extends Command class DuskCommand extends Command
@@ -15,7 +16,7 @@ class DuskCommand extends Command
* *
* @var string * @var string
*/ */
protected $signature = 'dusk'; protected $signature = 'dusk {--without-tty : Disable output to TTY}';
/** /**
* The console command description. * The console command description.
@@ -54,17 +55,15 @@ class DuskCommand extends Command
$this->purgeConsoleLogs(); $this->purgeConsoleLogs();
$options = array_slice($_SERVER['argv'], 2); $options = array_slice($_SERVER['argv'], $this->option('without-tty') ? 3 : 2);
return $this->withDuskEnvironment(function () use ($options) { return $this->withDuskEnvironment(function () use ($options) {
$process = (new ProcessBuilder()) $process = (new Process(array_merge(
->setTimeout(null) $this->binary(), $this->phpunitArguments($options)
->setPrefix($this->binary()) )))->setTimeout(null);
->setArguments($this->phpunitArguments($options))
->getProcess();
try { try {
$process->setTty(true); $process->setTty(! $this->option('without-tty'));
} catch (RuntimeException $e) { } catch (RuntimeException $e) {
$this->output->writeln('Warning: '.$e->getMessage()); $this->output->writeln('Warning: '.$e->getMessage());
} }
@@ -88,10 +87,15 @@ class DuskCommand extends Command
/** /**
* Get the array of arguments for running PHPUnit. * Get the array of arguments for running PHPUnit.
* *
* @param array $options
* @return array * @return array
*/ */
protected function phpunitArguments($options) protected function phpunitArguments($options)
{ {
$options = array_values(array_filter($options, function ($option) {
return ! Str::startsWith($option, '--env=');
}));
return array_merge(['-c', base_path('phpunit.dusk.xml')], $options); return array_merge(['-c', base_path('phpunit.dusk.xml')], $options);
} }

View File

@@ -41,6 +41,10 @@ class InstallCommand extends Command
mkdir(base_path('tests/Browser/Pages'), 0755, true); mkdir(base_path('tests/Browser/Pages'), 0755, true);
} }
if (! is_dir(base_path('tests/Browser/Components'))) {
mkdir(base_path('tests/Browser/Components'), 0755, true);
}
if (! is_dir(base_path('tests/Browser/screenshots'))) { if (! is_dir(base_path('tests/Browser/screenshots'))) {
$this->createScreenshotsDirectory(); $this->createScreenshotsDirectory();
} }
@@ -49,14 +53,14 @@ class InstallCommand extends Command
$this->createConsoleDirectory(); $this->createConsoleDirectory();
} }
$subs = [ $stubs = [
'ExampleTest.stub' => base_path('tests/Browser/ExampleTest.php'), 'ExampleTest.stub' => base_path('tests/Browser/ExampleTest.php'),
'HomePage.stub' => base_path('tests/Browser/Pages/HomePage.php'), 'HomePage.stub' => base_path('tests/Browser/Pages/HomePage.php'),
'DuskTestCase.stub' => base_path('tests/DuskTestCase.php'), 'DuskTestCase.stub' => base_path('tests/DuskTestCase.php'),
'Page.stub' => base_path('tests/Browser/Pages/Page.php'), 'Page.stub' => base_path('tests/Browser/Pages/Page.php'),
]; ];
foreach ($subs as $stub => $file) { foreach ($stubs as $stub => $file) {
if (! is_file($file)) { if (! is_file($file)) {
copy(__DIR__.'/../../stubs/'.$stub, $file); copy(__DIR__.'/../../stubs/'.$stub, $file);
} }

View File

@@ -0,0 +1,42 @@
<?php
namespace DummyNamespace;
use Laravel\Dusk\Browser;
use Laravel\Dusk\Component as BaseComponent;
class DummyClass extends BaseComponent
{
/**
* Get the root selector for the component.
*
* @return string
*/
public function selector()
{
return '#selector';
}
/**
* Assert that the browser page contains the component.
*
* @param Browser $browser
* @return void
*/
public function assert(Browser $browser)
{
$browser->assertVisible($this->selector());
}
/**
* Get the element shortcuts for the component.
*
* @return array
*/
public function elements()
{
return [
'@element' => '#selector',
];
}
}

View File

@@ -3,9 +3,8 @@
namespace DummyNamespace; namespace DummyNamespace;
use Laravel\Dusk\Browser; use Laravel\Dusk\Browser;
use Laravel\Dusk\Page as BasePage;
class DummyClass extends BasePage class DummyClass extends Page
{ {
/** /**
* Get the URL for the page. * Get the URL for the page.

View File

@@ -49,6 +49,7 @@ class DuskServiceProvider extends ServiceProvider
Console\DuskCommand::class, Console\DuskCommand::class,
Console\MakeCommand::class, Console\MakeCommand::class,
Console\PageCommand::class, Console\PageCommand::class,
Console\ComponentCommand::class,
]); ]);
} }
} }

View File

@@ -111,7 +111,7 @@ class ElementResolver
* *
* @param string $field * @param string $field
* @param array $values * @param array $values
* @return array * @return \Facebook\WebDriver\Remote\RemoteWebElement[]
*/ */
public function resolveSelectOptions($field, array $values) public function resolveSelectOptions($field, array $values)
{ {
@@ -122,7 +122,7 @@ class ElementResolver
return []; return [];
} }
return array_filter($options, function($option) use ($values) { return array_filter($options, function ($option) use ($values) {
return in_array($option->getAttribute('value'), $values); return in_array($option->getAttribute('value'), $values);
}); });
} }
@@ -192,6 +192,24 @@ class ElementResolver
]); ]);
} }
/**
* Resolve the element for a given "field".
*
* @param string $field
* @return \Facebook\WebDriver\Remote\RemoteWebElement
*/
public function resolveForField($field)
{
if (! is_null($element = $this->findById($field))) {
return $element;
}
return $this->firstOrFail([
$field, "input[name='{$field}']", "textarea[name='{$field}']",
"select[name='{$field}']", "button[name='{$field}']"
]);
}
/** /**
* Resolve the element for a given button. * Resolve the element for a given button.
* *
@@ -337,7 +355,7 @@ class ElementResolver
* Find the elements by the given selector or return an empty array. * Find the elements by the given selector or return an empty array.
* *
* @param string $selector * @param string $selector
* @return array * @return \Facebook\WebDriver\Remote\RemoteWebElement[]
*/ */
public function all($selector) public function all($selector)
{ {
@@ -360,7 +378,7 @@ class ElementResolver
*/ */
public function format($selector) public function format($selector)
{ {
$sortedElements = collect($this->elements)->sortByDesc(function($element, $key){ $sortedElements = collect($this->elements)->sortByDesc(function ($element, $key) {
return strlen($key); return strlen($key);
})->toArray(); })->toArray();

View File

@@ -31,19 +31,16 @@ class UserController
* *
* @param string $userId * @param string $userId
* @param string $guard * @param string $guard
* @return Response
*/ */
public function login($userId, $guard = null) public function login($userId, $guard = null)
{ {
$model = $this->modelForGuard( $guard = $guard ?: config('auth.defaults.guard');
$guard = $guard ?: config('auth.defaults.guard')
);
if (str_contains($userId, '@')) { $provider = Auth::guard($guard)->getProvider();
$user = (new $model)->where('email', $userId)->first();
} else { $user = str_contains($userId, '@')
$user = (new $model)->find($userId); ? $provider->retrieveByCredentials(['email' => $userId])
} : $provider->retrieveById($userId);
Auth::guard($guard)->login($user); Auth::guard($guard)->login($user);
} }
@@ -52,7 +49,6 @@ class UserController
* Log the user out of the application. * Log the user out of the application.
* *
* @param string $guard * @param string $guard
* @return Response
*/ */
public function logout($guard = null) public function logout($guard = null)
{ {

View File

@@ -2,32 +2,16 @@
namespace Laravel\Dusk; namespace Laravel\Dusk;
use Closure;
use Exception; use Exception;
use Throwable; use Laravel\Dusk\Chrome\SupportsChrome;
use ReflectionFunction;
use Illuminate\Support\Collection;
use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\DesiredCapabilities;
use Illuminate\Foundation\Testing\TestCase as FoundationTestCase; use Illuminate\Foundation\Testing\TestCase as FoundationTestCase;
abstract class TestCase extends FoundationTestCase abstract class TestCase extends FoundationTestCase
{ {
use SupportsChrome; use Concerns\ProvidesBrowser,
SupportsChrome;
/**
* All of the active browser instances.
*
* @var array
*/
protected static $browsers = [];
/**
* The callbacks that should be run on class tear down.
*
* @var array
*/
protected static $afterClassCallbacks = [];
/** /**
* Register the base URL with Dusk. * Register the base URL with Dusk.
@@ -49,167 +33,6 @@ abstract class TestCase extends FoundationTestCase
}; };
} }
/**
* Tear down the Dusk test case class.
*
* @afterClass
* @return void
*/
public static function tearDownDuskClass()
{
static::closeAll();
foreach (static::$afterClassCallbacks as $callback) {
$callback();
}
}
/**
* Register an "after class" tear down callback.
*
* @param \Closure $callback
* @return void
*/
public static function afterClass(Closure $callback)
{
static::$afterClassCallbacks[] = $callback;
}
/**
* Create a new browser instance.
*
* @param \Closure $callback
* @return \Laravel\Dusk\Browser|void
* @throws \Exception
* @throws \Throwable
*/
public function browse(Closure $callback)
{
$browsers = $this->createBrowsersFor($callback);
try {
$callback(...$browsers->all());
} catch (Exception $e) {
$this->captureFailuresFor($browsers);
throw $e;
} catch (Throwable $e) {
$this->captureFailuresFor($browsers);
throw $e;
} finally {
$this->storeConsoleLogsFor($browsers);
static::$browsers = $this->closeAllButPrimary($browsers);
}
}
/**
* Create the browser instances needed for the given callback.
*
* @param \Closure $callback
* @return array
*/
protected function createBrowsersFor(Closure $callback)
{
if (count(static::$browsers) === 0) {
static::$browsers = collect([$this->newBrowser($this->createWebDriver())]);
}
$additional = $this->browsersNeededFor($callback) - 1;
for ($i = 0; $i < $additional; $i++) {
static::$browsers->push($this->newBrowser($this->createWebDriver()));
}
return static::$browsers;
}
/**
* Create a new Browser instance.
*
* @param \Facebook\WebDriver\Remote\RemoteWebDriver $driver
* @return \Laravel\Dusk\Browser
*/
protected function newBrowser($driver)
{
return new Browser($driver);
}
/**
* Get the number of browsers needed for a given callback.
*
* @param \Closure $callback
* @return int
*/
protected function browsersNeededFor(Closure $callback)
{
return (new ReflectionFunction($callback))->getNumberOfParameters();
}
/**
* Capture failure screenshots for each browser.
*
* @param \Illuminate\Support\Collection $browsers
* @return void
*/
protected function captureFailuresFor($browsers)
{
$browsers->each(function ($browser, $key) {
$browser->screenshot('failure-'.$this->getName().'-'.$key);
});
}
/**
* Store the console output for the given browsers.
*
* @param \Illuminate\Support\Collection $browsers
* @return void
*/
protected function storeConsoleLogsFor($browsers)
{
$browsers->each(function ($browser, $key) {
$browser->storeConsoleLog($this->getName().'-'.$key);
});
}
/**
* Close all of the browsers except the primary (first) one.
*
* @param \Illuminate\Support\Collection $browsers
* @return \Illuminate\Support\Collection
*/
protected function closeAllButPrimary($browsers)
{
$browsers->slice(1)->each->quit();
return $browsers->take(1);
}
/**
* Close all of the active browsers.
*
* @return void
*/
public static function closeAll()
{
Collection::make(static::$browsers)->each->quit();
static::$browsers = collect();
}
/**
* Create the remote web driver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
protected function createWebDriver()
{
return retry(5, function () {
return $this->driver();
}, 50);
}
/** /**
* Create the RemoteWebDriver instance. * Create the RemoteWebDriver instance.
* *
@@ -225,7 +48,7 @@ abstract class TestCase extends FoundationTestCase
/** /**
* Determine the application's base URL. * Determine the application's base URL.
* *
* @var string * @return string
*/ */
protected function baseUrl() protected function baseUrl()
{ {
@@ -233,9 +56,9 @@ abstract class TestCase extends FoundationTestCase
} }
/** /**
* Get a callback that returns the default user to authenticate. * Return the default user to authenticate.
* *
* @return \Closure * @return \App\User|int|null
* @throws \Exception * @throws \Exception
*/ */
protected function user() protected function user()

View File

@@ -15,28 +15,28 @@
} }
], ],
"require": { "require": {
"php": ">=7.0", "php": "^7.1.3",
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-openssl": "*", "ext-openssl": "*",
"doctrine/inflector": "~1.1", "doctrine/inflector": "~1.1",
"dragonmantank/cron-expression": "~2.0",
"erusev/parsedown": "~1.7", "erusev/parsedown": "~1.7",
"league/flysystem": "^1.0.8", "league/flysystem": "^1.0.8",
"monolog/monolog": "~1.12", "monolog/monolog": "~1.12",
"mtdowling/cron-expression": "~1.0", "nesbot/carbon": "1.25.*",
"nesbot/carbon": "^1.24.1",
"psr/container": "~1.0", "psr/container": "~1.0",
"psr/simple-cache": "^1.0", "psr/simple-cache": "^1.0",
"ramsey/uuid": "~3.0", "ramsey/uuid": "^3.7",
"swiftmailer/swiftmailer": "~6.0", "swiftmailer/swiftmailer": "~6.0",
"symfony/console": "~3.3", "symfony/console": "~4.0",
"symfony/debug": "~3.3", "symfony/debug": "~4.0",
"symfony/finder": "~3.3", "symfony/finder": "~4.0",
"symfony/http-foundation": "~3.3", "symfony/http-foundation": "~4.0",
"symfony/http-kernel": "~3.3", "symfony/http-kernel": "~4.0",
"symfony/process": "~3.3", "symfony/process": "~4.0",
"symfony/routing": "~3.3", "symfony/routing": "~4.0",
"symfony/var-dumper": "~3.3", "symfony/var-dumper": "~4.0",
"tijsverkoyen/css-to-inline-styles": "~2.2", "tijsverkoyen/css-to-inline-styles": "^2.2.1",
"vlucas/phpdotenv": "~2.2" "vlucas/phpdotenv": "~2.2"
}, },
"replace": { "replace": {
@@ -67,20 +67,24 @@
"illuminate/support": "self.version", "illuminate/support": "self.version",
"illuminate/translation": "self.version", "illuminate/translation": "self.version",
"illuminate/validation": "self.version", "illuminate/validation": "self.version",
"illuminate/view": "self.version", "illuminate/view": "self.version"
},
"conflict": {
"tightenco/collect": "<5.5.33" "tightenco/collect": "<5.5.33"
}, },
"require-dev": { "require-dev": {
"aws/aws-sdk-php": "~3.0", "aws/aws-sdk-php": "~3.0",
"doctrine/dbal": "~2.5", "doctrine/dbal": "~2.6",
"filp/whoops": "^2.1.4", "filp/whoops": "^2.1.4",
"league/flysystem-cached-adapter": "~1.0",
"mockery/mockery": "~1.0", "mockery/mockery": "~1.0",
"orchestra/testbench-core": "3.5.*", "moontoast/math": "^1.1",
"orchestra/testbench-core": "3.6.*",
"pda/pheanstalk": "~3.0", "pda/pheanstalk": "~3.0",
"phpunit/phpunit": "~6.0", "phpunit/phpunit": "~7.0",
"predis/predis": "^1.1.1", "predis/predis": "^1.1.1",
"symfony/css-selector": "~3.3", "symfony/css-selector": "~4.0",
"symfony/dom-crawler": "~3.3" "symfony/dom-crawler": "~4.0"
}, },
"autoload": { "autoload": {
"files": [ "files": [
@@ -101,26 +105,27 @@
}, },
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "5.5-dev" "dev-master": "5.6-dev"
} }
}, },
"suggest": { "suggest": {
"ext-pcntl": "Required to use all features of the queue worker.", "ext-pcntl": "Required to use all features of the queue worker.",
"ext-posix": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.",
"aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).",
"doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.6).",
"fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).",
"guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).",
"laravel/tinker": "Required to use the tinker console command (~1.0).", "laravel/tinker": "Required to use the tinker console command (~1.0).",
"league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).",
"league/flysystem-cached-adapter": "Required to use the Flysystem cache (~1.0).",
"league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).",
"league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0).",
"nexmo/client": "Required to use the Nexmo transport (~1.0).", "nexmo/client": "Required to use the Nexmo transport (~1.0).",
"pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).",
"predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).",
"pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).",
"symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", "symfony/css-selector": "Required to use some of the crawler integration testing tools (~4.0).",
"symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~4.0).",
"symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)."
}, },
"config": { "config": {

View File

@@ -30,7 +30,7 @@ If you're not in the mood to read, [Laracasts](https://laracasts.com) contains o
## Contributing ## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](http://laravel.com/docs/contributions). Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct ## Code of Conduct
@@ -42,4 +42,4 @@ If you discover a security vulnerability within Laravel, please send an e-mail t
## License ## License
The Laravel framework is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT). The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).

View File

@@ -122,7 +122,7 @@ class Gate implements GateContract
* *
* @param string $name * @param string $name
* @param string $class * @param string $class
* @param array $abilities * @param array|null $abilities
* @return $this * @return $this
*/ */
public function resource($name, $class, array $abilities = null) public function resource($name, $class, array $abilities = null)

View File

@@ -35,7 +35,7 @@ class Response
/** /**
* Get the string representation of the message. * Get the string representation of the message.
* *
* @return string * @return string|null
*/ */
public function __toString() public function __toString()
{ {

View File

@@ -94,7 +94,7 @@ class AuthManager implements FactoryContract
return $this->{$driverMethod}($name, $config); return $this->{$driverMethod}($name, $config);
} }
throw new InvalidArgumentException("Auth guard driver [{$name}] is not defined."); throw new InvalidArgumentException("Auth driver [{$config['driver']}] for guard [{$name}] is not defined.");
} }
/** /**

View File

@@ -2,61 +2,63 @@
@section('content') @section('content')
<div class="container"> <div class="container">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-8 col-md-offset-2"> <div class="col-md-8">
<div class="panel panel-default"> <div class="card">
<div class="panel-heading">Login</div> <div class="card-header">{{ __('Login') }}</div>
<div class="panel-body"> <div class="card-body">
<form class="form-horizontal" method="POST" action="{{ route('login') }}"> <form method="POST" action="{{ route('login') }}" aria-label="{{ __('Login') }}">
{{ csrf_field() }} @csrf
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="email" class="col-md-4 control-label">E-Mail Address</label> <label for="email" class="col-sm-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required autofocus> <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required autofocus>
@if ($errors->has('email')) @if ($errors->has('email'))
<span class="help-block"> <span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('email') }}</strong> <strong>{{ $errors->first('email') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="password" class="col-md-4 control-label">Password</label> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required> <input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" required>
@if ($errors->has('password')) @if ($errors->has('password'))
<span class="help-block"> <span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('password') }}</strong> <strong>{{ $errors->first('password') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<div class="col-md-6 col-md-offset-4"> <div class="col-md-6 offset-md-4">
<div class="checkbox"> <div class="form-check">
<label> <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
<input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}> Remember Me
<label class="form-check-label" for="remember">
{{ __('Remember Me') }}
</label> </label>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row mb-0">
<div class="col-md-8 col-md-offset-4"> <div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
Login {{ __('Login') }}
</button> </button>
<a class="btn btn-link" href="{{ route('password.request') }}"> <a class="btn btn-link" href="{{ route('password.request') }}">
Forgot Your Password? {{ __('Forgot Your Password?') }}
</a> </a>
</div> </div>
</div> </div>

View File

@@ -2,39 +2,39 @@
@section('content') @section('content')
<div class="container"> <div class="container">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-8 col-md-offset-2"> <div class="col-md-8">
<div class="panel panel-default"> <div class="card">
<div class="panel-heading">Reset Password</div> <div class="card-header">{{ __('Reset Password') }}</div>
<div class="panel-body"> <div class="card-body">
@if (session('status')) @if (session('status'))
<div class="alert alert-success"> <div class="alert alert-success" role="alert">
{{ session('status') }} {{ session('status') }}
</div> </div>
@endif @endif
<form class="form-horizontal" method="POST" action="{{ route('password.email') }}"> <form method="POST" action="{{ route('password.email') }}" aria-label="{{ __('Reset Password') }}">
{{ csrf_field() }} @csrf
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="email" class="col-md-4 control-label">E-Mail Address</label> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required> <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required>
@if ($errors->has('email')) @if ($errors->has('email'))
<span class="help-block"> <span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('email') }}</strong> <strong>{{ $errors->first('email') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row mb-0">
<div class="col-md-6 col-md-offset-4"> <div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
Send Password Reset Link {{ __('Send Password Reset Link') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -2,62 +2,57 @@
@section('content') @section('content')
<div class="container"> <div class="container">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-8 col-md-offset-2"> <div class="col-md-8">
<div class="panel panel-default"> <div class="card">
<div class="panel-heading">Reset Password</div> <div class="card-header">{{ __('Reset Password') }}</div>
<div class="panel-body"> <div class="card-body">
<form class="form-horizontal" method="POST" action="{{ route('password.request') }}"> <form method="POST" action="{{ route('password.request') }}" aria-label="{{ __('Reset Password') }}">
{{ csrf_field() }} @csrf
<input type="hidden" name="token" value="{{ $token }}"> <input type="hidden" name="token" value="{{ $token }}">
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="email" class="col-md-4 control-label">E-Mail Address</label> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ $email or old('email') }}" required autofocus> <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ $email ?? old('email') }}" required autofocus>
@if ($errors->has('email')) @if ($errors->has('email'))
<span class="help-block"> <span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('email') }}</strong> <strong>{{ $errors->first('email') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="password" class="col-md-4 control-label">Password</label> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required> <input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" required>
@if ($errors->has('password')) @if ($errors->has('password'))
<span class="help-block"> <span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('password') }}</strong> <strong>{{ $errors->first('password') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group{{ $errors->has('password_confirmation') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="password-confirm" class="col-md-4 control-label">Confirm Password</label> <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required> <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required>
@if ($errors->has('password_confirmation'))
<span class="help-block">
<strong>{{ $errors->first('password_confirmation') }}</strong>
</span>
@endif
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row mb-0">
<div class="col-md-6 col-md-offset-4"> <div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
Reset Password {{ __('Reset Password') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -2,69 +2,69 @@
@section('content') @section('content')
<div class="container"> <div class="container">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-8 col-md-offset-2"> <div class="col-md-8">
<div class="panel panel-default"> <div class="card">
<div class="panel-heading">Register</div> <div class="card-header">{{ __('Register') }}</div>
<div class="panel-body"> <div class="card-body">
<form class="form-horizontal" method="POST" action="{{ route('register') }}"> <form method="POST" action="{{ route('register') }}" aria-label="{{ __('Register') }}">
{{ csrf_field() }} @csrf
<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="name" class="col-md-4 control-label">Name</label> <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="name" type="text" class="form-control" name="name" value="{{ old('name') }}" required autofocus> <input id="name" type="text" class="form-control{{ $errors->has('name') ? ' is-invalid' : '' }}" name="name" value="{{ old('name') }}" required autofocus>
@if ($errors->has('name')) @if ($errors->has('name'))
<span class="help-block"> <span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('name') }}</strong> <strong>{{ $errors->first('name') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="email" class="col-md-4 control-label">E-Mail Address</label> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required> <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required>
@if ($errors->has('email')) @if ($errors->has('email'))
<span class="help-block"> <span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('email') }}</strong> <strong>{{ $errors->first('email') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}"> <div class="form-group row">
<label for="password" class="col-md-4 control-label">Password</label> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required> <input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" required>
@if ($errors->has('password')) @if ($errors->has('password'))
<span class="help-block"> <span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('password') }}</strong> <strong>{{ $errors->first('password') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label for="password-confirm" class="col-md-4 control-label">Confirm Password</label> <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required> <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row mb-0">
<div class="col-md-6 col-md-offset-4"> <div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
Register {{ __('Register') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -2,14 +2,14 @@
@section('content') @section('content')
<div class="container"> <div class="container">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-8 col-md-offset-2"> <div class="col-md-8">
<div class="panel panel-default"> <div class="card">
<div class="panel-heading">Dashboard</div> <div class="card-header">Dashboard</div>
<div class="panel-body"> <div class="card-body">
@if (session('status')) @if (session('status'))
<div class="alert alert-success"> <div class="alert alert-success" role="alert">
{{ session('status') }} {{ session('status') }}
</div> </div>
@endif @endif

Some files were not shown because too many files have changed in this diff Show More