Test Failed
Pull Request — master (#105)
by Craig
13:50 queued 11:14
created

getInstalledPackages()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 7
dl 0
loc 13
ccs 0
cts 0
cp 0
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 6
1
<?php
2
3
namespace ComposerRequireChecker\FileLocator;
4
5
use ComposerRequireChecker\JsonLoader;
6
use Generator;
7
use function array_key_exists;
8
use function file_get_contents;
9
use function json_decode;
10 7
11
final class LocateComposerPackageDirectDependenciesSourceFiles
12 7
{
13
    public function __invoke(string $composerJsonPath): Generator
14 7
    {
15 7
        $packageDir = dirname($composerJsonPath);
16 7
17 7
        $composerJson = json_decode(file_get_contents($composerJsonPath), true);
18 7
        $configVendorDir = $composerJson['config']['vendor-dir'] ?? 'vendor';
19 6
        $vendorDirs = [];
20 7
        foreach ($composerJson['require'] ?? [] as $vendorName => $vendorRequiredVersion) {
21 7
            $vendorDirs[$vendorName] = $packageDir . '/' . $configVendorDir . '/' . $vendorName;
22
        };
23
24
        $installedPackages = $this->getInstalledPackages($packageDir . '/' . $configVendorDir);
25 7
26 6
        foreach ($vendorDirs as $vendorName => $vendorDir) {
27 4
            if (!array_key_exists($vendorName, $installedPackages)) {
28
                continue;
29
            }
30 5
31
            yield from (new LocateComposerPackageSourceFiles())->__invoke($installedPackages[$vendorName], $vendorDir);
32 5
        }
33
    }
34 7
35
36
    /**
37
     * Lookup each vendor package's composer.json info from installed.json
38
     *
39
     * @param string $vendorDir
40
     *
41
     * @return array Keys are the package name and value is the composer.json as an array
42
     */
43
    private function getInstalledPackages(string $vendorDir): array
44
    {
45
        $installedData = (new JsonLoader($vendorDir . '/composer/installed.json'))->getData();
46
47
        $installedPackages = [];
48
49
        $packages = $installedData['packages'] ?? $installedData;
50
        foreach ($packages as $vendorJson) {
51
            $vendorName = $vendorJson['name'];
52
            $installedPackages[$vendorName] = $vendorJson;
53
        }
54
55
        return $installedPackages;
56
    }
57
}
58