Вход Регистрация
Файл: vendor/phpunit/phpunit/src/Util/ExcludeList.php
Строк: 254
<?php declare(strict_types=1);
/*
 * This file is part of PHPUnit.
 *
 * (c) Sebastian Bergmann <sebastian@phpunit.de>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace PHPUnitUtil;

use const 
DIRECTORY_SEPARATOR;
use function 
class_exists;
use function 
defined;
use function 
dirname;
use function 
is_dir;
use function 
realpath;
use function 
sprintf;
use function 
strpos;
use function 
sys_get_temp_dir;
use 
ComposerAutoloadClassLoader;
use 
DeepCopyDeepCopy;
use 
DoctrineInstantiatorInstantiator;
use 
PharIoManifestManifest;
use 
PharIoVersionVersion as PharIoVersion;
use 
phpDocumentorReflectionDocBlock;
use 
phpDocumentorReflectionProject;
use 
phpDocumentorReflectionType;
use 
PhpParserParser;
use 
PHPUnitFrameworkTestCase;
use 
ProphecyProphet;
use 
ReflectionClass;
use 
SebastianBergmannCliParserParser as CliParser;
use 
SebastianBergmannCodeCoverageCodeCoverage;
use 
SebastianBergmannCodeUnitCodeUnit;
use 
SebastianBergmannCodeUnitReverseLookupWizard;
use 
SebastianBergmannComparatorComparator;
use 
SebastianBergmannComplexityCalculator;
use 
SebastianBergmannDiffDiff;
use 
SebastianBergmannEnvironmentRuntime;
use 
SebastianBergmannExporterExporter;
use 
SebastianBergmannFileIteratorFacade as FileIteratorFacade;
use 
SebastianBergmannGlobalStateSnapshot;
use 
SebastianBergmannInvokerInvoker;
use 
SebastianBergmannLinesOfCodeCounter;
use 
SebastianBergmannObjectEnumeratorEnumerator;
use 
SebastianBergmannRecursionContextContext;
use 
SebastianBergmannResourceOperationsResourceOperations;
use 
SebastianBergmannTemplateTemplate;
use 
SebastianBergmannTimerTimer;
use 
SebastianBergmannTypeTypeName;
use 
SebastianBergmannVersion;
use 
TheSeerTokenizerTokenizer;
use 
WebmozartAssertAssert;

/**
 * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
 */
final class ExcludeList
{
    
/**
     * @var array<string,int>
     */
    
private const EXCLUDED_CLASS_NAMES = [
        
// composer
        
ClassLoader::class => 1,

        
// doctrine/instantiator
        
Instantiator::class => 1,

        
// myclabs/deepcopy
        
DeepCopy::class => 1,

        
// nikic/php-parser
        
Parser::class => 1,

        
// phar-io/manifest
        
Manifest::class => 1,

        
// phar-io/version
        
PharIoVersion::class => 1,

        
// phpdocumentor/reflection-common
        
Project::class => 1,

        
// phpdocumentor/reflection-docblock
        
DocBlock::class => 1,

        
// phpdocumentor/type-resolver
        
Type::class => 1,

        
// phpspec/prophecy
        
Prophet::class => 1,

        
// phpunit/phpunit
        
TestCase::class => 2,

        
// phpunit/php-code-coverage
        
CodeCoverage::class => 1,

        
// phpunit/php-file-iterator
        
FileIteratorFacade::class => 1,

        
// phpunit/php-invoker
        
Invoker::class => 1,

        
// phpunit/php-text-template
        
Template::class => 1,

        
// phpunit/php-timer
        
Timer::class => 1,

        
// sebastian/cli-parser
        
CliParser::class => 1,

        
// sebastian/code-unit
        
CodeUnit::class => 1,

        
// sebastian/code-unit-reverse-lookup
        
Wizard::class => 1,

        
// sebastian/comparator
        
Comparator::class => 1,

        
// sebastian/complexity
        
Calculator::class => 1,

        
// sebastian/diff
        
Diff::class => 1,

        
// sebastian/environment
        
Runtime::class => 1,

        
// sebastian/exporter
        
Exporter::class => 1,

        
// sebastian/global-state
        
Snapshot::class => 1,

        
// sebastian/lines-of-code
        
Counter::class => 1,

        
// sebastian/object-enumerator
        
Enumerator::class => 1,

        
// sebastian/recursion-context
        
Context::class => 1,

        
// sebastian/resource-operations
        
ResourceOperations::class => 1,

        
// sebastian/type
        
TypeName::class => 1,

        
// sebastian/version
        
Version::class => 1,

        
// theseer/tokenizer
        
Tokenizer::class => 1,

        
// webmozart/assert
        
Assert::class => 1,
    ];

    
/**
     * @var string[]
     */
    
private static $directories = [];

    
/**
     * @var bool
     */
    
private static $initialized false;

    public static function 
addDirectory(string $directory): void
    
{
        if (!
is_dir($directory)) {
            throw new 
Exception(
                
sprintf(
                    
'"%s" is not a directory',
                    
$directory
                
)
            );
        }

        
self::$directories[] = realpath($directory);
    }

    
/**
     * @throws Exception
     *
     * @return string[]
     */
    
public function getExcludedDirectories(): array
    {
        
$this->initialize();

        return 
self::$directories;
    }

    
/**
     * @throws Exception
     */
    
public function isExcluded(string $file): bool
    
{
        if (
defined('PHPUNIT_TESTSUITE')) {
            return 
false;
        }

        
$this->initialize();

        foreach (
self::$directories as $directory) {
            if (
strpos($file$directory) === 0) {
                return 
true;
            }
        }

        return 
false;
    }

    
/**
     * @throws Exception
     */
    
private function initialize(): void
    
{
        if (
self::$initialized) {
            return;
        }

        foreach (
self::EXCLUDED_CLASS_NAMES as $className => $parent) {
            if (!
class_exists($className)) {
                continue;
            }

            
$directory = (new ReflectionClass($className))->getFileName();

            for (
$i 0$i $parent$i++) {
                
$directory dirname($directory);
            }

            
self::$directories[] = $directory;
        }

        
// Hide process isolation workaround on Windows.
        
if (DIRECTORY_SEPARATOR === '\') {
            // tempnam() prefix is limited to first 3 chars.
            // @see https://php.net/manual/en/function.tempnam.php
            self::$directories[] = sys_get_temp_dir() . '
\PHP';
        }

        self::$initialized = true;
    }
}
Онлайн: 1
Реклама