Passed
Pull Request — master (#105)
by Craig
12:22
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 7
use function json_decode;
10
11 7
final class LocateComposerPackageDirectDependenciesSourceFiles
12
{
13 7
    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 6
        $configVendorDir = $composerJson['config']['vendor-dir'] ?? 'vendor';
19 7
        $vendorDirs = [];
20 7
        foreach ($composerJson['require'] ?? [] as $vendorName => $vendorRequiredVersion) {
21
            $vendorDirs[$vendorName] = $packageDir . '/' . $configVendorDir . '/' . $vendorName;
22
        };
23
24 7
        if (empty($vendorDirs)) {
25 6
            return;
26 4
        }
27
28
        $installedPackages = $this->getInstalledPackages($packageDir . '/' . $configVendorDir);
29 5
30
        foreach ($vendorDirs as $vendorName => $vendorDir) {
31 7
            if (!array_key_exists($vendorName, $installedPackages)) {
32
                continue;
33
            }
34
35
            yield from (new LocateComposerPackageSourceFiles())->__invoke($installedPackages[$vendorName], $vendorDir);
36
        }
37
    }
38
39
40
    /**
41
     * Lookup each vendor package's composer.json info from installed.json
42
     *
43
     * @param string $vendorDir
44
     *
45
     * @return array Keys are the package name and value is the composer.json as an array
46
     */
47
    private function getInstalledPackages(string $vendorDir): array
48
    {
49
        $installedData = (new JsonLoader($vendorDir . '/composer/installed.json'))->getData();
50
51
        $installedPackages = [];
52
53
        $packages = $installedData['packages'] ?? $installedData;
54
        foreach ($packages as $vendorJson) {
55
            $vendorName = $vendorJson['name'];
56
            $installedPackages[$vendorName] = $vendorJson;
57
        }
58
59
        return $installedPackages;
60
    }
61
}
62