Failed Conditions
Pull Request — master (#163)
by Guillaume
07:51
created

LocateComposerPackageDirectDependenciesSourceFiles   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Test Coverage

Coverage 88%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
eloc 23
c 1
b 0
f 0
dl 0
loc 53
ccs 22
cts 25
cp 0.88
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getInstalledPackages() 0 18 3
A __invoke() 0 21 4
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 Webmozart\Assert\Assert;
10
use function array_key_exists;
11
use function file_get_contents;
12
use function json_decode;
13
14
final class LocateComposerPackageDirectDependenciesSourceFiles
15
{
16 13
    public function __invoke(string $composerJsonPath, string $requireKey): Generator
17
    {
18 13
        Assert::oneOf($requireKey, ['require', 'require-dev']);
19
20 13
        $packageDir = dirname($composerJsonPath);
21
22 13
        $composerJson = json_decode(file_get_contents($composerJsonPath), true);
23 13
        $configVendorDir = $composerJson['config']['vendor-dir'] ?? 'vendor';
24 13
        $vendorDirs = [];
25 13
        foreach ($composerJson[$requireKey] ?? [] as $vendorName => $vendorRequiredVersion) {
26 12
            $vendorDirs[$vendorName] = $packageDir . '/' . $configVendorDir . '/' . $vendorName;
27
        }
28
29 13
        $installedPackages = $this->getInstalledPackages($packageDir . '/' . $configVendorDir);
30
31 13
        foreach ($vendorDirs as $vendorName => $vendorDir) {
32 12
            if (!array_key_exists($vendorName, $installedPackages)) {
33 6
                continue;
34
            }
35
36 11
            yield from (new LocateComposerPackageSourceFiles())->__invoke($installedPackages[$vendorName], $vendorDir, 'autoload');
37
        }
38 13
    }
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 13
    private function getInstalledPackages(string $vendorDir): array
50
    {
51
        try {
52 13
            $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 13
        $installedPackages = [];
59
60 13
        $packages = $installedData['packages'] ?? $installedData;
61 13
        foreach ($packages as $vendorJson) {
62 11
            $vendorName = $vendorJson['name'];
63 11
            $installedPackages[$vendorName] = $vendorJson;
64
        }
65
66 13
        return $installedPackages;
67
    }
68
}
69