x Sorry, these patches are not available anymore due to data migration. Please run a fresh inspection.
Completed
Pull Request — master (#6)
by
unknown
01:45
created

Installer::dumpVersionsClass()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2.024
Metric Value
dl 0
loc 21
ccs 9
cts 11
cp 0.8182
rs 9.3142
cc 2
eloc 10
nc 2
nop 1
crap 2.024
1
<?php
2
3
namespace PackageVersions;
4
5
use Composer\Composer;
6
use Composer\EventDispatcher\EventSubscriberInterface;
7
use Composer\IO\IOInterface;
8
use Composer\Package\Locker;
9
use Composer\Package\RootPackageInterface;
10
use Composer\Plugin\PluginInterface;
11
use Composer\Script\Event;
12
use Composer\Script\ScriptEvents;
13
14
final class Installer implements PluginInterface, EventSubscriberInterface
15
{
16
    private static $generatedClassTemplate = <<<'PHP'
17
<?php
18
19
namespace PackageVersions;
20
21
/**
22
 * This class is generated by ocramius/package-versions, specifically by
23
 * @see \PackageVersions\Installer
24
 *
25
 * This file is overwritten at every run of `composer install` or `composer update`.
26
 */
27
final class Versions
28
{
29
    const VERSIONS = %s;
30
31
    private function __construct()
32
    {
33
    }
34
35
    /**
36
     * @throws \OutOfBoundsException if a version cannot be located
37
     */
38
    public static function getVersion(string $packageName) : string
39
    {
40
        if (! isset(self::VERSIONS[$packageName])) {
41
            throw new \OutOfBoundsException(
42
                'Required package "' . $packageName . '" is not installed: cannot detect its version'
43
            );
44
        }
45
46
        return self::VERSIONS[$packageName];
47
    }
48
}
49
50
PHP;
51
52
    /**
53
     * {@inheritDoc}
54
     */
55 1
    public function activate(Composer $composer, IOInterface $io)
56
    {
57 1
        $composer->getEventDispatcher()->addSubscriber($this);
58 1
    }
59
60
    /**
61
     * {@inheritDoc}
62
     */
63 1
    public static function getSubscribedEvents()
64
    {
65
        return [
66 1
            ScriptEvents::POST_INSTALL_CMD => 'dumpVersionsClass',
67 1
            ScriptEvents::POST_UPDATE_CMD  => 'dumpVersionsClass',
68
        ];
69
    }
70
71
    /**
72
     * @param Event $composerEvent
73
     *
74
     * @return void
75
     */
76 1
    public static function dumpVersionsClass(Event $composerEvent)
77
    {
78 1
        $io = $composerEvent->getIO();
79
80 1
        if (substr(__DIR__, 0, 7) === 'phar://') {
81
            // You can't write to phar, exit early to prevent errors.
82
            // This happens if you require the same package twice!
83
            $io->write('<info>Skip generating version class</info>');
84
            return;
85
        }
86
87 1
        $io->write('<info>Generating version class...</info>');
88
89 1
        $composer = $composerEvent->getComposer();
90
91 1
        self::writeVersionClassToFile(self::generateVersionsClass($composer));
92
93 1
        self::reDumpAutoloader($composer);
94
95 1
        $io->write('<info>...done generating version class</info>');
96 1
    }
97
98 1
    private static function generateVersionsClass(Composer $composer) : string
99
    {
100 1
        return sprintf(
101 1
            self::$generatedClassTemplate,
102 1
            var_export(iterator_to_array(self::getVersions($composer->getLocker(), $composer->getPackage())), true)
103
        );
104
    }
105
106
    /**
107
     * @param string $versionClassSource
108
     *
109
     * @return void
110
     */
111 1
    private static function writeVersionClassToFile(string $versionClassSource)
112
    {
113 1
        file_put_contents(__DIR__ . '/Versions.php', $versionClassSource, 0664);
114 1
    }
115
116
    /**
117
     * @param Composer $composer
118
     *
119
     * @return void
120
     */
121 1
    private static function reDumpAutoloader(Composer $composer)
122
    {
123 1
        $composer->getAutoloadGenerator()->dump(
124 1
            $composer->getConfig(),
125 1
            $composer->getRepositoryManager()->getLocalRepository(),
126 1
            $composer->getPackage(),
127 1
            $composer->getInstallationManager(),
128 1
            'composer',
129 1
            true // CBA to provide this manually, for now
130
        );
131 1
    }
132
133
    /**
134
     * @param Locker               $locker
135
     * @param RootPackageInterface $rootPackage
136
     *
137
     * @return \Generator|\string[]
138
     */
139 1
    private static function getVersions(Locker $locker, RootPackageInterface $rootPackage) : \Generator
140
    {
141 1
        $lockData = $locker->getLockData();
142
143 1
        foreach (array_merge($lockData['packages'], $lockData['packages-dev'])  as $package) {
0 ignored issues
show
Coding Style introduced by
Expected 1 space before "as"; 2 found
Loading history...
144 1
            yield $package['name']
145 1
                => $package['version'] . '@' . $package['source']['reference'];
146
        }
147
148 1
        yield $rootPackage->getName() => $rootPackage->getVersion() . '@' . $rootPackage->getSourceReference();
149 1
    }
150
}
151