Test Failed
Pull Request — master (#105)
by Craig
12:01
created

LocateComposerPackageDirectDependenciesSourceFiles   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 45
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

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