Passed
Pull Request — master (#105)
by Craig
07:48
created

LocateComposerPackageDirectDependenciesSourceFiles   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 49
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 7
eloc 20
dl 0
loc 49
ccs 23
cts 23
cp 1
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getInstalledPackages() 0 13 2
A __invoke() 0 23 5
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
11
final class LocateComposerPackageDirectDependenciesSourceFiles
12
{
13 9
    public function __invoke(string $composerJsonPath): Generator
14
    {
15 9
        $packageDir = dirname($composerJsonPath);
16
17 9
        $composerJson = json_decode(file_get_contents($composerJsonPath), true);
18 9
        $configVendorDir = $composerJson['config']['vendor-dir'] ?? 'vendor';
19 9
        $vendorDirs = [];
20 9
        foreach ($composerJson['require'] ?? [] as $vendorName => $vendorRequiredVersion) {
21 8
            $vendorDirs[$vendorName] = $packageDir . '/' . $configVendorDir . '/' . $vendorName;
22
        };
23
24 9
        if (empty($vendorDirs)) {
25 1
            return;
26
        }
27
28 8
        $installedPackages = $this->getInstalledPackages($packageDir . '/' . $configVendorDir);
29
30 8
        foreach ($vendorDirs as $vendorName => $vendorDir) {
31 8
            if (!array_key_exists($vendorName, $installedPackages)) {
32 4
                continue;
33
            }
34
35 7
            yield from (new LocateComposerPackageSourceFiles())->__invoke($installedPackages[$vendorName], $vendorDir);
36
        }
37 8
    }
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 8
    private function getInstalledPackages(string $vendorDir): array
48
    {
49 8
        $installedData = (new JsonLoader($vendorDir . '/composer/installed.json'))->getData();
50
51 8
        $installedPackages = [];
52
53 8
        $packages = $installedData['packages'] ?? $installedData;
54 8
        foreach ($packages as $vendorJson) {
55 7
            $vendorName = $vendorJson['name'];
56 7
            $installedPackages[$vendorName] = $vendorJson;
57
        }
58
59 8
        return $installedPackages;
60
    }
61
}
62