From 81a4f74b5b78beadaea6443973951fbe6827720a Mon Sep 17 00:00:00 2001 From: Ken Love Date: Wed, 12 Jun 2019 16:54:09 -0400 Subject: [PATCH 1/3] Composer\Script\Event should have access to originating event details --- .../EventDispatcher/EventDispatcher.php | 4 ++- src/Composer/Script/Event.php | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Composer/EventDispatcher/EventDispatcher.php b/src/Composer/EventDispatcher/EventDispatcher.php index ee02381e5..d5bdb4c97 100644 --- a/src/Composer/EventDispatcher/EventDispatcher.php +++ b/src/Composer/EventDispatcher/EventDispatcher.php @@ -196,7 +196,9 @@ class EventDispatcher } try { - $return = $this->dispatch($scriptName, new Script\Event($scriptName, $event->getComposer(), $event->getIO(), $event->isDevMode(), $args, $flags)); + $scriptEvent = new Script\Event($scriptName, $event->getComposer(), $event->getIO(), $event->isDevMode(), $args, $flags); + $scriptEvent->setOriginatingEvent($event); + $return = $this->dispatch($scriptName, $scriptEvent); } catch (ScriptExecutionException $e) { $this->io->writeError(sprintf('Script %s was called via %s', $callable, $event->getName()), true, IOInterface::QUIET); throw $e; diff --git a/src/Composer/Script/Event.php b/src/Composer/Script/Event.php index 138f43c1a..bbad249b2 100644 --- a/src/Composer/Script/Event.php +++ b/src/Composer/Script/Event.php @@ -39,6 +39,11 @@ class Event extends BaseEvent */ private $devMode; + /** + * @var BaseEvent + */ + private $originatingEvent; + /** * Constructor. * @@ -55,6 +60,7 @@ class Event extends BaseEvent $this->composer = $composer; $this->io = $io; $this->devMode = $devMode; + $this->originatingEvent = null; } /** @@ -86,4 +92,27 @@ class Event extends BaseEvent { return $this->devMode; } + + /** + * Set the originating event. + * + * @return \Composer\EventDispatcher\Event|null + */ + public function getOriginatingEvent() + { + return $this->originatingEvent; + } + + /** + * Get the originating event. + * + * @param \Composer\EventDispatcher\Event $event + * @return $this + */ + public function setOriginatingEvent(BaseEvent $event) + { + $this->originatingEvent = $event; + + return $this; + } } From b51cfce8e6983671b9b732ce88ae603f298378d1 Mon Sep 17 00:00:00 2001 From: Ken Love Date: Thu, 13 Jun 2019 14:51:27 -0400 Subject: [PATCH 2/3] return the upper-most event in chain --- src/Composer/Script/Event.php | 29 +++++++--- tests/Composer/Test/Script/EventTest.php | 73 ++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 tests/Composer/Test/Script/EventTest.php diff --git a/src/Composer/Script/Event.php b/src/Composer/Script/Event.php index bbad249b2..21aeb83ed 100644 --- a/src/Composer/Script/Event.php +++ b/src/Composer/Script/Event.php @@ -103,16 +103,31 @@ class Event extends BaseEvent return $this->originatingEvent; } - /** - * Get the originating event. - * - * @param \Composer\EventDispatcher\Event $event - * @return $this - */ + /** + * Set the originating event. + * + * @param \Composer\EventDispatcher\Event $event + * @return $this + */ public function setOriginatingEvent(BaseEvent $event) { - $this->originatingEvent = $event; + $this->originatingEvent = $this->calculateOriginatingEvent($event); return $this; } + + /** + * Returns the upper-most event in chain. + * + * @param \Composer\EventDispatcher\Event $event + * @return \Composer\EventDispatcher\Event + */ + private function calculateOriginatingEvent(BaseEvent $event) + { + if ($event instanceof Event && $event->getOriginatingEvent()) { + return $this->calculateOriginatingEvent($event->getOriginatingEvent()); + } + + return $event; + } } diff --git a/tests/Composer/Test/Script/EventTest.php b/tests/Composer/Test/Script/EventTest.php new file mode 100644 index 000000000..2b8818500 --- /dev/null +++ b/tests/Composer/Test/Script/EventTest.php @@ -0,0 +1,73 @@ +getMockBuilder('Composer\IO\IOInterface')->getMock(); + $composer = $this->createComposerInstance(); + + $originatingEvent = new \Composer\EventDispatcher\Event('originatingEvent'); + + $scriptEvent = new Event('test', $composer, $io, true); + + $this->assertNull( + $scriptEvent->getOriginatingEvent(), + 'originatingEvent is initialized as null' + ); + + $scriptEvent->setOriginatingEvent($originatingEvent); + + $this->assertSame( + $originatingEvent, + $scriptEvent->getOriginatingEvent(), + 'getOriginatingEvent() SHOULD return test event' + ); + + } + + public function testEventCalculatesNestedOriginatingEvent() { + $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); + $composer = $this->createComposerInstance(); + + + $originatingEvent = new \Composer\EventDispatcher\Event('upperOriginatingEvent'); + $intermediateEvent = new Event('intermediate', $composer, $io, true); + $intermediateEvent->setOriginatingEvent($originatingEvent); + + $scriptEvent = new Event('test', $composer, $io, true); + $scriptEvent->setOriginatingEvent($intermediateEvent); + + $this->assertNotSame( + $intermediateEvent, + $scriptEvent->getOriginatingEvent(), + 'getOriginatingEvent() SHOULD NOT return intermediate events' + ); + + $this->assertSame( + $originatingEvent, + $scriptEvent->getOriginatingEvent(), + 'getOriginatingEvent() SHOULD return upper-most event' + ); + + } + + private function createComposerInstance() + { + $composer = new Composer; + $config = new Config; + $composer->setConfig($config); + $package = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock(); + $composer->setPackage($package); + + return $composer; + } +} \ No newline at end of file From 369e8a22474a9a85da43c6b627c89c1fa0b6fd0e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 29 Jul 2019 16:43:24 +0200 Subject: [PATCH 3/3] Fix indenting --- src/Composer/Script/Event.php | 20 ++-- tests/Composer/Test/Script/EventTest.php | 133 ++++++++++++----------- 2 files changed, 80 insertions(+), 73 deletions(-) diff --git a/src/Composer/Script/Event.php b/src/Composer/Script/Event.php index 21aeb83ed..5fab172bf 100644 --- a/src/Composer/Script/Event.php +++ b/src/Composer/Script/Event.php @@ -39,9 +39,9 @@ class Event extends BaseEvent */ private $devMode; - /** - * @var BaseEvent - */ + /** + * @var BaseEvent + */ private $originatingEvent; /** @@ -100,7 +100,7 @@ class Event extends BaseEvent */ public function getOriginatingEvent() { - return $this->originatingEvent; + return $this->originatingEvent; } /** @@ -111,9 +111,9 @@ class Event extends BaseEvent */ public function setOriginatingEvent(BaseEvent $event) { - $this->originatingEvent = $this->calculateOriginatingEvent($event); + $this->originatingEvent = $this->calculateOriginatingEvent($event); - return $this; + return $this; } /** @@ -124,10 +124,10 @@ class Event extends BaseEvent */ private function calculateOriginatingEvent(BaseEvent $event) { - if ($event instanceof Event && $event->getOriginatingEvent()) { - return $this->calculateOriginatingEvent($event->getOriginatingEvent()); - } + if ($event instanceof Event && $event->getOriginatingEvent()) { + return $this->calculateOriginatingEvent($event->getOriginatingEvent()); + } - return $event; + return $event; } } diff --git a/tests/Composer/Test/Script/EventTest.php b/tests/Composer/Test/Script/EventTest.php index 2b8818500..b7c8cd9ff 100644 --- a/tests/Composer/Test/Script/EventTest.php +++ b/tests/Composer/Test/Script/EventTest.php @@ -1,73 +1,80 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ namespace Composer\Test\Script; - use Composer\Composer; use Composer\Config; use Composer\Script\Event; use Composer\Test\TestCase; -class EventTest extends TestCase { - - public function testEventSetsOriginatingEvent() { - $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); - $composer = $this->createComposerInstance(); - - $originatingEvent = new \Composer\EventDispatcher\Event('originatingEvent'); - - $scriptEvent = new Event('test', $composer, $io, true); - - $this->assertNull( - $scriptEvent->getOriginatingEvent(), - 'originatingEvent is initialized as null' - ); - - $scriptEvent->setOriginatingEvent($originatingEvent); - - $this->assertSame( - $originatingEvent, - $scriptEvent->getOriginatingEvent(), - 'getOriginatingEvent() SHOULD return test event' - ); - - } - - public function testEventCalculatesNestedOriginatingEvent() { - $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); - $composer = $this->createComposerInstance(); - - - $originatingEvent = new \Composer\EventDispatcher\Event('upperOriginatingEvent'); - $intermediateEvent = new Event('intermediate', $composer, $io, true); - $intermediateEvent->setOriginatingEvent($originatingEvent); - - $scriptEvent = new Event('test', $composer, $io, true); - $scriptEvent->setOriginatingEvent($intermediateEvent); - - $this->assertNotSame( - $intermediateEvent, - $scriptEvent->getOriginatingEvent(), - 'getOriginatingEvent() SHOULD NOT return intermediate events' - ); - - $this->assertSame( - $originatingEvent, - $scriptEvent->getOriginatingEvent(), - 'getOriginatingEvent() SHOULD return upper-most event' - ); - - } - - private function createComposerInstance() - { - $composer = new Composer; - $config = new Config; - $composer->setConfig($config); - $package = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock(); - $composer->setPackage($package); - - return $composer; - } -} \ No newline at end of file +class EventTest extends TestCase +{ + public function testEventSetsOriginatingEvent() + { + $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); + $composer = $this->createComposerInstance(); + + $originatingEvent = new \Composer\EventDispatcher\Event('originatingEvent'); + + $scriptEvent = new Event('test', $composer, $io, true); + + $this->assertNull( + $scriptEvent->getOriginatingEvent(), + 'originatingEvent is initialized as null' + ); + + $scriptEvent->setOriginatingEvent($originatingEvent); + + $this->assertSame( + $originatingEvent, + $scriptEvent->getOriginatingEvent(), + 'getOriginatingEvent() SHOULD return test event' + ); + } + + public function testEventCalculatesNestedOriginatingEvent() + { + $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); + $composer = $this->createComposerInstance(); + + $originatingEvent = new \Composer\EventDispatcher\Event('upperOriginatingEvent'); + $intermediateEvent = new Event('intermediate', $composer, $io, true); + $intermediateEvent->setOriginatingEvent($originatingEvent); + + $scriptEvent = new Event('test', $composer, $io, true); + $scriptEvent->setOriginatingEvent($intermediateEvent); + + $this->assertNotSame( + $intermediateEvent, + $scriptEvent->getOriginatingEvent(), + 'getOriginatingEvent() SHOULD NOT return intermediate events' + ); + + $this->assertSame( + $originatingEvent, + $scriptEvent->getOriginatingEvent(), + 'getOriginatingEvent() SHOULD return upper-most event' + ); + } + + private function createComposerInstance() + { + $composer = new Composer; + $config = new Config; + $composer->setConfig($config); + $package = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock(); + $composer->setPackage($package); + + return $composer; + } +}