Failed Conditions
Pull Request — master (#153)
by Matthias
05:03
created

__invoke()   A

Complexity

Conditions 5
Paths 7

Size

Total Lines 22
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 5.0073

Importance

Changes 2
Bugs 1 Features 0
Metric Value
eloc 14
c 2
b 1
f 0
dl 0
loc 22
ccs 14
cts 15
cp 0.9333
rs 9.4888
cc 5
nc 7
nop 1
crap 5.0073
1
<?php
2
3
namespace ComposerRequireChecker\FileLocator;
4
5
use ComposerRequireChecker\Exception\DependenciesNotInstalledException;
6
use ComposerRequireChecker\Exception\NotReadableException;
7
use ComposerRequireChecker\JsonLoader;
8
use Generator;
9
use function array_key_exists;
10
use function file_get_contents;
11
use function json_decode;
12
13
final class LocateComposerPackageDirectDependenciesSourceFiles
14
{
15 9
    public function __invoke(string $composerJsonPath): Generator
16
    {
17 9
        $packageDir = dirname($composerJsonPath);
18 9
        $composerJsonContent = file_get_contents($composerJsonPath);
19 9
        if ($composerJsonContent === false) {
20
            throw new \InvalidArgumentException('could not load file [' . $composerJsonPath . ']');
21
        }
22 9
        $composerJson = json_decode($composerJsonContent, true);
23 9
        $configVendorDir = $composerJson['config']['vendor-dir'] ?? 'vendor';
24 9
        $vendorDirs = [];
25 9
        foreach ($composerJson['require'] ?? [] as $vendorName => $vendorRequiredVersion) {
26 8
            $vendorDirs[$vendorName] = $packageDir . '/' . $configVendorDir . '/' . $vendorName;
27
        };
28
29 9
        $installedPackages = $this->getInstalledPackages($packageDir . '/' . $configVendorDir);
30
31 9
        foreach ($vendorDirs as $vendorName => $vendorDir) {
32 8
            if (!array_key_exists($vendorName, $installedPackages)) {
33 4
                continue;
34
            }
35
36 7
            yield from (new LocateComposerPackageSourceFiles())->__invoke($installedPackages[$vendorName], $vendorDir);
37
        }
38 9
    }
39
40
41
    /**
42
     * Lookup each vendor package's composer.json info from installed.json
43
     *
44
     * @param string $vendorDir
45
     *
46
     * @return array Keys are the package name and value is the composer.json as an array
47
     * @throws DependenciesNotInstalledException When composer install/update has not been run
48
     */
49 9
    private function getInstalledPackages(string $vendorDir): array
50
    {
51
        try {
52 9
            $installedData = (new JsonLoader($vendorDir . '/composer/installed.json'))->getData();
53
        } catch (NotReadableException $e) {
54
            $message = 'The composer dependencies have not been installed, run composer install/update first';
55
            throw new DependenciesNotInstalledException($message);
56
        }
57
58 9
        $installedPackages = [];
59
60 9
        $packages = $installedData['packages'] ?? $installedData;
61 9
        foreach ($packages as $vendorJson) {
62 7
            $vendorName = $vendorJson['name'];
63 7
            $installedPackages[$vendorName] = $vendorJson;
64
        }
65
66 9
        return $installedPackages;
67
    }
68
}
69