Completed
Pull Request — master (#6)
by
unknown
26:00 queued 59s
created

Installer::reDumpAutoloader()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1
Metric Value
dl 0
loc 11
ccs 2
cts 2
cp 1
rs 9.4285
cc 1
eloc 8
nc 1
nop 1
crap 1
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
        $io->write('<info>Generating version class...</info>');
81
82 1
        $composer = $composerEvent->getComposer();
83
84 1
        self::writeVersionClassToFile(self::getVendorDir($composer), self::generateVersionsClass($composer));
85
86 1
        self::reDumpAutoloader($composer);
87
88 1
        $io->write('<info>...done generating version class</info>');
89 1
    }
90
91 1
    private static function generateVersionsClass(Composer $composer) : string
92
    {
93 1
        return sprintf(
94 1
            self::$generatedClassTemplate,
95 1
            var_export(iterator_to_array(self::getVersions($composer->getLocker(), $composer->getPackage())), true)
96
        );
97
    }
98
99
    /**
100
     * @param string $path
101
     * @param string $versionClassSource
102
     */
103
    private static function writeVersionClassToFile(string $path, string $versionClassSource)
104 1
    {
105
        file_put_contents($path . '/src/PackageVersions/Versions.php', $versionClassSource, 0664);
106 1
    }
107 1
108
    private static function getVendorDir(Composer $composer) : string
109
    {
110
        $vendorDir = $composer->getConfig()->get('vendor-dir');
111
        if ($vendorDir == 'unit-test') {
112
            return dirname(dirname(__DIR__));
113
        }
114 1
115
        return $vendorDir . '/ocramius/package-versions';
116 1
    }
117 1
118 1
    /**
119 1
     * @param Composer $composer
120 1
     *
121 1
     * @return void
122 1
     */
123
    private static function reDumpAutoloader(Composer $composer)
124 1
    {
125
        $composer->getAutoloadGenerator()->dump(
126
            $composer->getConfig(),
127
            $composer->getRepositoryManager()->getLocalRepository(),
128
            $composer->getPackage(),
129
            $composer->getInstallationManager(),
130
            'composer',
131
            true // CBA to provide this manually, for now
132 1
        );
133
    }
134 1
135
    /**
136 1
     * @param Locker               $locker
137 1
     * @param RootPackageInterface $rootPackage
138 1
     *
139
     * @return \Generator|\string[]
140
     */
141 1
    private static function getVersions(Locker $locker, RootPackageInterface $rootPackage) : \Generator
142 1
    {
143
        $lockData = $locker->getLockData();
144
145
        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...
146
            yield $package['name']
147
                => $package['version'] . '@' . $package['source']['reference'];
148
        }
149
150
        yield $rootPackage->getName() => $rootPackage->getVersion() . '@' . $rootPackage->getSourceReference();
151
    }
152
}
153