Mercurial > hg > isophonics-drupal-site
diff vendor/symfony/phpunit-bridge/DeprecationErrorHandler.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 7a779792577d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/symfony/phpunit-bridge/DeprecationErrorHandler.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,207 @@ +<?php + +/* + * 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\Bridge\PhpUnit; + +/** + * Catch deprecation notices and print a summary report at the end of the test suite. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +class DeprecationErrorHandler +{ + const MODE_WEAK = 'weak'; + const MODE_DISABLED = 'disabled'; + + private static $isRegistered = false; + + /** + * Registers and configures the deprecation handler. + * + * The following reporting modes are supported: + * - use "weak" to hide the deprecation report but keep a global count; + * - use "/some-regexp/" to stop the test suite whenever a deprecation + * message matches the given regular expression; + * - use a number to define the upper bound of allowed deprecations, + * making the test suite fail whenever more notices are trigerred. + * + * @param int|string|false $mode The reporting mode, defaults to not allowing any deprecations + */ + public static function register($mode = 0) + { + if (self::$isRegistered) { + return; + } + + $getMode = function () use ($mode) { + static $memoizedMode = false; + + if (false !== $memoizedMode) { + return $memoizedMode; + } + if (false === $mode) { + $mode = getenv('SYMFONY_DEPRECATIONS_HELPER'); + } + if (DeprecationErrorHandler::MODE_WEAK !== $mode && (!isset($mode[0]) || '/' !== $mode[0])) { + $mode = preg_match('/^[1-9][0-9]*$/', $mode) ? (int) $mode : 0; + } + + return $memoizedMode = $mode; + }; + + $deprecations = array( + 'unsilencedCount' => 0, + 'remainingCount' => 0, + 'legacyCount' => 0, + 'otherCount' => 0, + 'unsilenced' => array(), + 'remaining' => array(), + 'legacy' => array(), + 'other' => array(), + ); + $deprecationHandler = function ($type, $msg, $file, $line, $context) use (&$deprecations, $getMode) { + $mode = $getMode(); + if ((E_USER_DEPRECATED !== $type && E_DEPRECATED !== $type) || DeprecationErrorHandler::MODE_DISABLED === $mode) { + return \PHPUnit_Util_ErrorHandler::handleError($type, $msg, $file, $line, $context); + } + + $trace = debug_backtrace(true); + $group = 'other'; + + $i = count($trace); + while (1 < $i && (!isset($trace[--$i]['class']) || ('ReflectionMethod' === $trace[$i]['class'] || 0 === strpos($trace[$i]['class'], 'PHPUnit_')))) { + // No-op + } + + if (isset($trace[$i]['object']) || isset($trace[$i]['class'])) { + $class = isset($trace[$i]['object']) ? get_class($trace[$i]['object']) : $trace[$i]['class']; + $method = $trace[$i]['function']; + + if (0 !== error_reporting()) { + $group = 'unsilenced'; + } elseif (0 === strpos($method, 'testLegacy') + || 0 === strpos($method, 'provideLegacy') + || 0 === strpos($method, 'getLegacy') + || strpos($class, '\Legacy') + || in_array('legacy', \PHPUnit_Util_Test::getGroups($class, $method), true) + ) { + $group = 'legacy'; + } else { + $group = 'remaining'; + } + + if (isset($mode[0]) && '/' === $mode[0] && preg_match($mode, $msg)) { + $e = new \Exception($msg); + $r = new \ReflectionProperty($e, 'trace'); + $r->setAccessible(true); + $r->setValue($e, array_slice($trace, 1, $i)); + + echo "\n".ucfirst($group).' deprecation triggered by '.$class.'::'.$method.':'; + echo "\n".$msg; + echo "\nStack trace:"; + echo "\n".str_replace(' '.getcwd().DIRECTORY_SEPARATOR, ' ', $e->getTraceAsString()); + echo "\n"; + + exit(1); + } + if ('legacy' !== $group && DeprecationErrorHandler::MODE_WEAK !== $mode) { + $ref = &$deprecations[$group][$msg]['count']; + ++$ref; + $ref = &$deprecations[$group][$msg][$class.'::'.$method]; + ++$ref; + } + } elseif (DeprecationErrorHandler::MODE_WEAK !== $mode) { + $ref = &$deprecations[$group][$msg]['count']; + ++$ref; + } + ++$deprecations[$group.'Count']; + }; + $oldErrorHandler = set_error_handler($deprecationHandler); + + if (null !== $oldErrorHandler) { + restore_error_handler(); + if (array('PHPUnit_Util_ErrorHandler', 'handleError') === $oldErrorHandler) { + restore_error_handler(); + self::register($mode); + } + } else { + self::$isRegistered = true; + if (self::hasColorSupport()) { + $colorize = function ($str, $red) { + $color = $red ? '41;37' : '43;30'; + + return "\x1B[{$color}m{$str}\x1B[0m"; + }; + } else { + $colorize = function ($str) { return $str; }; + } + register_shutdown_function(function () use ($getMode, &$deprecations, $deprecationHandler, $colorize) { + $mode = $getMode(); + if (isset($mode[0]) && '/' === $mode[0]) { + return; + } + $currErrorHandler = set_error_handler('var_dump'); + restore_error_handler(); + + if (DeprecationErrorHandler::MODE_WEAK === $mode) { + $colorize = function ($str) { return $str; }; + } + if ($currErrorHandler !== $deprecationHandler) { + echo "\n", $colorize('THE ERROR HANDLER HAS CHANGED!', true), "\n"; + } + + $cmp = function ($a, $b) { + return $b['count'] - $a['count']; + }; + + foreach (array('unsilenced', 'remaining', 'legacy', 'other') as $group) { + if ($deprecations[$group.'Count']) { + echo "\n", $colorize(sprintf('%s deprecation notices (%d)', ucfirst($group), $deprecations[$group.'Count']), 'legacy' !== $group), "\n"; + + uasort($deprecations[$group], $cmp); + + foreach ($deprecations[$group] as $msg => $notices) { + echo "\n", rtrim($msg, '.'), ': ', $notices['count'], "x\n"; + + arsort($notices); + + foreach ($notices as $method => $count) { + if ('count' !== $method) { + echo ' ', $count, 'x in ', preg_replace('/(.*)\\\\(.*?::.*?)$/', '$2 from $1', $method), "\n"; + } + } + } + } + } + if (!empty($notices)) { + echo "\n"; + } + + if (DeprecationErrorHandler::MODE_WEAK !== $mode && $mode < $deprecations['unsilencedCount'] + $deprecations['remainingCount'] + $deprecations['otherCount']) { + exit(1); + } + }); + } + } + + private static function hasColorSupport() + { + if ('\\' === DIRECTORY_SEPARATOR) { + return + '10.0.10586' === PHP_WINDOWS_VERSION_MAJOR.'.'.PHP_WINDOWS_VERSION_MINOR.'.'.PHP_WINDOWS_VERSION_BUILD + || false !== getenv('ANSICON') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM'); + } + + return defined('STDOUT') && function_exists('posix_isatty') && @posix_isatty(STDOUT); + } +}