Completed
Push — master ( c3fcf1...80946a )
by Pol
13:17 queued 11:29
created

Dependencies::buildRegex()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 8
c 0
b 0
f 0
nc 2
nop 1
dl 0
loc 14
ccs 9
cts 9
cp 1
crap 2
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace drupol\ComposerPackages\Exporter;
6
7
use Composer\Package\Loader\ArrayLoader;
8
use Composer\Package\PackageInterface;
9
10
class Dependencies extends Exporter
11
{
12 2
    public function exportToArray(): array
13
    {
14 2
        $data = $this->getEvent()->getComposer()->getLocker()->getLockData();
15
16 2
        $packagesData = \array_merge(
17 2
            $data['packages'],
18 2
            $data['packages-dev']
19
        );
20
21 2
        $packageDeps = [];
22
23 2
        foreach ($packagesData as $package) {
24 2
            $package = (new ArrayLoader())->load($package);
25 2
            $packageName = $package->getName();
26 2
            $packageDeps += [$packageName => []];
27 2
            $this->getDependenciesOf($packageDeps[$package->getName()], $package);
28
29 2
            $packageDeps[$packageName] = \array_values($packageDeps[$packageName]);
30
        }
31
32 2
        $regex = $this->buildRegex($packageDeps);
33
34 2
        return \compact('packageDeps', 'regex');
35
    }
36
37 2
    protected function getDependenciesOf(array &$carry, PackageInterface $package): void
38
    {
39 2
        foreach (\array_keys($package->getRequires()) as $key) {
40 2
            if ('php' === $key) {
41 1
                continue;
42
            }
43
44 2
            if (0 === \mb_strpos((string) $key, 'ext-')) {
45 1
                continue;
46
            }
47
48 2
            $carry += [$key => $key];
49
        }
50 2
    }
51
52 2
    private function buildRegex($packages): array
53
    {
54 2
        $groups = [];
55
56 2
        foreach ($packages as $package => $dependencies) {
57 2
            [$prefix, $bundle] = \explode('/', $package);
58 2
            $groups[\sprintf('(?i:%s)(?|', $prefix)][] = \sprintf(
59 2
                '/?(?i:%s) (*MARK:%s)|',
60 2
                \str_replace('-', '-?', $bundle),
61 2
                $package
62
            );
63
        }
64
65 2
        return $groups;
66
    }
67
}
68