Skip to content

Commit 3996f54

Browse files
committed
Merge pull request #1 from jenkoian/proper-plugin
Automatically register as plugin
2 parents 6ac4587 + e7d4557 commit 3996f54

File tree

4 files changed

+71
-52
lines changed

4 files changed

+71
-52
lines changed

README.md

-10
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,6 @@ as is. Therefore, once this library has done it's thing you should definitely re
2626
composer require jenko/sunscreen --dev
2727
```
2828

29-
Then add this to your `composer.json`:
30-
31-
```json
32-
"scripts": {
33-
"post-package-install": [
34-
"Jenko\\Sunscreen\\Sunscreen::postPackageInstall"
35-
]
36-
}
37-
```
38-
3929
## How it works
4030

4131
The script will kick in after a package is installed via composer. It will check that package's composer file and look for

composer.json

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "jenko/sunscreen",
33
"description": "Protecting your web app from the harmful rays of external dependencies.",
4-
"type": "library",
4+
"type": "composer-plugin",
55
"license": "MIT",
66
"authors": [
77
{
@@ -11,17 +11,13 @@
1111
],
1212
"minimum-stability": "stable",
1313
"require": {
14-
"php": ">=5.6,<8.0-DEV"
14+
"php": ">=5.6,<8.0-DEV",
15+
"composer-plugin-api": "^1.0"
1516
},
1617
"require-dev": {
17-
"composer/composer": "~1.1",
1818
"phpunit/phpunit": "~5.3",
19-
"etsy/phpunit-extensions": "0.7.*"
20-
},
21-
"scripts": {
22-
"post-package-install": [
23-
"Jenko\\Sunscreen\\Sunscreen::postPackageInstall"
24-
]
19+
"etsy/phpunit-extensions": "0.7.*",
20+
"composer/composer": "^1.1"
2521
},
2622
"autoload": {
2723
"psr-4": {"Jenko\\Sunscreen\\": "src"}
@@ -30,6 +26,7 @@
3026
"psr-4": {"Jenko\\Sunscreen\\Tests\\": "tests"}
3127
},
3228
"extra": {
29+
"class": "Jenko\\Sunscreen\\Sunscreen",
3330
"sunscreen": {
3431
"interfaces": [
3532
"Jenko\\Sunscreen\\SunscreenInterface"

src/Sunscreen.php

+64-32
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,89 @@
22

33
namespace Jenko\Sunscreen;
44

5+
use Composer\Composer;
6+
use Composer\EventDispatcher\EventSubscriberInterface;
57
use Composer\Installer\PackageEvent;
8+
use Composer\Installer\PackageEvents;
9+
use Composer\IO\IOInterface;
10+
use Composer\Plugin\PluginInterface;
611
use Jenko\Sunscreen\Guesser\AbstractClassGuesser;
712
use Jenko\Sunscreen\Guesser\InterfaceGuesser;
813
use Jenko\Sunscreen\Processor\AdapterProcessor;
914
use Jenko\Sunscreen\Processor\ClassProcessor;
1015
use Jenko\Sunscreen\Processor\InterfaceProcessor;
1116

12-
class Sunscreen implements SunscreenInterface
17+
class Sunscreen implements PluginInterface, EventSubscriberInterface, SunscreenInterface
1318
{
1419
/**
1520
* @var string
1621
*/
1722
const PRECONFIGURED_DIR = 'preconfigured';
1823

24+
/**
25+
* @var Composer
26+
*/
27+
protected $composer;
28+
29+
/**
30+
* @var IOInterface
31+
*/
32+
protected $io;
33+
34+
/**
35+
* @param Composer $composer
36+
* @param IOInterface $io
37+
*/
38+
public function activate(Composer $composer, IOInterface $io)
39+
{
40+
$this->composer = $composer;
41+
$this->io = $io;
42+
}
43+
44+
/**
45+
* @return array
46+
*/
47+
public static function getSubscribedEvents()
48+
{
49+
return [
50+
PackageEvents::POST_PACKAGE_INSTALL => 'onPostPackageInstall'
51+
];
52+
}
53+
1954
/**
2055
* @param PackageEvent $event
2156
*
2257
* @return mixed|void
2358
*/
24-
public static function postPackageInstall(PackageEvent $event)
59+
public function onPostPackageInstall(PackageEvent $event)
2560
{
26-
$mainPackage = $event->getComposer()->getPackage();
61+
$mainPackage = $this->composer->getPackage();
2762
$installedPackage = $event->getOperation()->getPackage();
2863
$extra = $installedPackage->getExtra();
29-
$io = $event->getIO();
3064

3165
if ($installedPackage->isDev()) {
32-
if ($io->isVeryVerbose()) {
33-
$io->write('Sunscreen: Ignoring dev dependency.' . "\n");
66+
if ($this->io->isVeryVerbose()) {
67+
$this->io->write('Sunscreen: Ignoring dev dependency.' . "\n");
3468
}
3569
return;
3670
}
3771

38-
$vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');
72+
$vendorDir = $this->composer->getConfig()->get('vendor-dir');
3973
$baseDir = $vendorDir . Util::DS . '..';
4074

4175
$mainNamespace = Util::extractNamespaceFromPackage($mainPackage);
4276
$src = Util::extractSourceDirectoryFromPackage($mainPackage);
4377
if (empty($mainNamespace)) {
44-
$io->writeError('Sunscreen: Main Namespace not found.' . "\n");
78+
$this->io->writeError('Sunscreen: Main Namespace not found.' . "\n");
4579
return;
4680
}
4781

4882
if (isset($extra['sunscreen'])) {
49-
$interfaces = self::configuredInterfaces($extra['sunscreen']);
50-
$classes = self::configuredClasses($extra['sunscreen']);
51-
} elseif ($preconfiguredExtra = self::findPreconfiguredExtra($installedPackage->getName())) {
52-
$interfaces = self::configuredInterfaces($preconfiguredExtra['sunscreen']);
53-
$classes = self::configuredClasses($preconfiguredExtra['sunscreen']);
83+
$interfaces = $this->configuredInterfaces($extra['sunscreen']);
84+
$classes = $this->configuredClasses($extra['sunscreen']);
85+
} elseif ($preconfiguredExtra = $this->findPreconfiguredExtra($installedPackage->getName())) {
86+
$interfaces = $this->configuredInterfaces($preconfiguredExtra['sunscreen']);
87+
$classes = $this->configuredClasses($preconfiguredExtra['sunscreen']);
5488
} else {
5589
$interfaceGuesser = new InterfaceGuesser($vendorDir);
5690
$interfaces = $interfaceGuesser->guess($installedPackage);
@@ -59,26 +93,26 @@ public static function postPackageInstall(PackageEvent $event)
5993
}
6094

6195
if (empty($interfaces) && empty($classes)) {
62-
if ($io->isVerbose()) {
63-
$io->write('Sunscreen: No interfaces or classes could be found.' . "\n");
96+
if ($this->io->isVerbose()) {
97+
$this->io->write('Sunscreen: No interfaces or classes could be found.' . "\n");
6498
}
6599
return;
66100
}
67101

68102
if (!empty($interfaces)) {
69-
self::processInterfaces($interfaces, $mainNamespace, $baseDir, $src, $io);
103+
$this->processInterfaces($interfaces, $mainNamespace, $baseDir, $src);
70104
}
71105

72106
if (!empty($classes)) {
73-
self::processClasses($classes, $mainNamespace, $baseDir, $src, $io);
107+
$this->processClasses($classes, $mainNamespace, $baseDir, $src);
74108
}
75109
}
76110

77111
/**
78112
* @param $sunscreenConfig
79113
* @return array ['FQN']
80114
*/
81-
private static function configuredInterfaces($sunscreenConfig)
115+
private function configuredInterfaces($sunscreenConfig)
82116
{
83117
if (isset($sunscreenConfig['interfaces'])) {
84118
return $sunscreenConfig['interfaces'];
@@ -91,7 +125,7 @@ private static function configuredInterfaces($sunscreenConfig)
91125
* @param $sunscreenConfig
92126
* @return array ['FQN']
93127
*/
94-
private static function configuredClasses($sunscreenConfig)
128+
private function configuredClasses($sunscreenConfig)
95129
{
96130
if (isset($sunscreenConfig['classes'])) {
97131
return $sunscreenConfig['classes'];
@@ -105,23 +139,22 @@ private static function configuredClasses($sunscreenConfig)
105139
* @param string $mainNamespace
106140
* @param string $baseDir
107141
* @param string $src
108-
* @param IO $io
109142
*/
110-
private static function processInterfaces(array $interfaces, $mainNamespace, $baseDir, $src, $io)
143+
private function processInterfaces(array $interfaces, $mainNamespace, $baseDir, $src)
111144
{
112145
foreach ($interfaces as $interface) {
113146
$interfaceProcessor = new InterfaceProcessor($interface, $mainNamespace, $baseDir . Util::DS . $src);
114147
$interfaceProcessor->process();
115148

116-
if ($io->isVeryVerbose()) {
117-
$io->write('Sunscreen: Interface created.' . "\n");
149+
if ($this->io->isVeryVerbose()) {
150+
$this->io->write('Sunscreen: Interface created.' . "\n");
118151
}
119152

120153
$adapterProcessor = new AdapterProcessor($interface, $mainNamespace, $baseDir . Util::DS . $src);
121154
$adapterProcessor->process();
122155

123-
if ($io->isVeryVerbose()) {
124-
$io->write('Sunscreen: Adapter created.' . "\n");
156+
if ($this->io->isVeryVerbose()) {
157+
$this->io->write('Sunscreen: Adapter created.' . "\n");
125158
}
126159
}
127160
}
@@ -131,23 +164,22 @@ private static function processInterfaces(array $interfaces, $mainNamespace, $ba
131164
* @param string $mainNamespace
132165
* @param string $baseDir
133166
* @param string $src
134-
* @param IO $io
135167
*/
136-
private static function processClasses(array $classes, $mainNamespace, $baseDir, $src, $io)
168+
private function processClasses(array $classes, $mainNamespace, $baseDir, $src)
137169
{
138170
foreach ($classes as $class) {
139171
$classProcessor = new ClassProcessor($class, $mainNamespace, $baseDir . Util::DS . $src);
140172
$classProcessor->process();
141173

142-
if ($io->isVeryVerbose()) {
143-
$io->write('Sunscreen: Class created.' . "\n");
174+
if ($this->io->isVeryVerbose()) {
175+
$this->io->write('Sunscreen: Class created.' . "\n");
144176
}
145177

146178
$adapterProcessor = new AdapterProcessor($class, $mainNamespace, $baseDir . Util::DS . $src);
147179
$adapterProcessor->process();
148180

149-
if ($io->isVeryVerbose()) {
150-
$io->write('Sunscreen: Adapter created.' . "\n");
181+
if ($this->io->isVeryVerbose()) {
182+
$this->io->write('Sunscreen: Adapter created.' . "\n");
151183
}
152184
}
153185
}
@@ -156,7 +188,7 @@ private static function processClasses(array $classes, $mainNamespace, $baseDir,
156188
* @param string $packageName
157189
* @return null
158190
*/
159-
private static function findPreconfiguredExtra($packageName)
191+
private function findPreconfiguredExtra($packageName)
160192
{
161193
list($dirName, $filename) = explode('/', $packageName);
162194
$filePath = __DIR__ . Util::DS . '..' . Util::DS . self::PRECONFIGURED_DIR . Util::DS . $dirName . Util::DS . $filename . '.json';

src/SunscreenInterface.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ interface SunscreenInterface
1010
* @param PackageEvent $event
1111
* @return mixed
1212
*/
13-
public static function postPackageInstall(PackageEvent $event);
13+
public function onPostPackageInstall(PackageEvent $event);
1414
}

0 commit comments

Comments
 (0)