Failed Conditions
Pull Request — master (#162)
by
unknown
05:20
created

GuessFromComposerAutoloader::__construct()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 4

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 6
c 1
b 0
f 0
dl 0
loc 13
ccs 7
cts 7
cp 1
rs 10
cc 4
nc 3
nop 1
crap 4
1
<?php
2
3
namespace ComposerRequireChecker\DependencyGuesser;
4
5
use Composer\Autoload\ClassLoader;
6
use ComposerRequireChecker\Cli\Options;
7
use ComposerRequireChecker\JsonLoader;
8
9
class GuessFromComposerAutoloader implements GuesserInterface
10
{
11
    private const COMPOSER_PATH_PREFIX = 'composer' . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR;
12
13
    /**
14
     * @var ClassLoader|null
15
     */
16
    private $autoloader;
17
18
    /**
19
     * @var string
20
     */
21
    private $pathRegex;
22
23 4
    public function __construct(?Options $options)
24
    {
25 4
        if ($options === null || !$options->getAutoloaderPath()) {
26 1
            return;
27
        }
28
29
        // Note: the loader is automatically registered
30
        // @todo figure out how to unregister the loader to avoid conflicts
31 4
        $this->autoloader = require $options->getAutoloaderPath();
32
33 4
        $vendorRoot = dirname($options->getAutoloaderPath());
34 4
        $SEP = \DIRECTORY_SEPARATOR === '/' ? '/' : '[' . preg_quote(\DIRECTORY_SEPARATOR, '@') . '/]';
35 4
        $this->pathRegex = '@^' . preg_quote($vendorRoot, '@') . "${SEP}(?:composer${SEP}\.\.${SEP})?([^${SEP}]+${SEP}[^${SEP}]+)${SEP}@";
36 4
    }
37
38 2
    public function __invoke(string $symbolName): \Generator
39
    {
40 2
        if (!$this->autoloader) {
41
            return;
42
        }
43
44 2
        $path = $this->autoloader->findFile(\ltrim($symbolName, '\\'));
45 2
        if ($path === false) {
46 1
            return;
47
        }
48
49 1
        if (preg_match($this->pathRegex, $path, $captures)) {
50 1
            yield $captures[1];
51
        }
52
    }
53
}
54