Skip to content
Snippets Groups Projects
Commit 62fe82b3 authored by Adam G-H's avatar Adam G-H
Browse files

Issue #3245766 by phenaproxima, tedbow: Fire events throughout Package Manager's stage life cycle

parent 97986f68
No related branches found
No related tags found
1 merge request!91Issue #3245766: Fire events throughout Package Manager's stage life cycle
Showing
with 206 additions and 2 deletions
...@@ -94,3 +94,4 @@ services: ...@@ -94,3 +94,4 @@ services:
- '@package_manager.stager' - '@package_manager.stager'
- '@package_manager.committer' - '@package_manager.committer'
- '@package_manager.cleaner' - '@package_manager.cleaner'
- '@event_dispatcher'
<?php
namespace Drupal\package_manager\Event;
/**
* Event fired after staged changes are synced to the active directory.
*/
class PostApplyEvent extends StageEvent {
}
<?php
namespace Drupal\package_manager\Event;
/**
* Event fired after a staging area has been created.
*/
class PostCreateEvent extends StageEvent {
}
<?php
namespace Drupal\package_manager\Event;
/**
* Event fired after the staging area is destroyed.
*/
class PostDestroyEvent extends StageEvent {
}
<?php
namespace Drupal\package_manager\Event;
/**
* Event fired after packages are added to the staging area.
*/
class PostRequireEvent extends StageEvent {
}
<?php
namespace Drupal\package_manager\Event;
/**
* Event fired before staged changes are synced to the active directory.
*/
class PreApplyEvent extends StageEvent {
}
<?php
namespace Drupal\package_manager\Event;
/**
* Event fired before a staging area is created.
*/
class PreCreateEvent extends StageEvent {
}
<?php
namespace Drupal\package_manager\Event;
/**
* Event fired before the staging area is destroyed.
*/
class PreDestroyEvent extends StageEvent {
}
<?php
namespace Drupal\package_manager\Event;
/**
* Event fired before packages are added to the staging area.
*/
class PreRequireEvent extends StageEvent {
}
<?php
namespace Drupal\package_manager\Event;
use Symfony\Contracts\EventDispatcher\Event;
/**
* Base class for all events related to the life cycle of the staging area.
*/
abstract class StageEvent extends Event {
}
...@@ -2,10 +2,19 @@ ...@@ -2,10 +2,19 @@
namespace Drupal\package_manager; namespace Drupal\package_manager;
use Drupal\package_manager\Event\PostApplyEvent;
use Drupal\package_manager\Event\PostCreateEvent;
use Drupal\package_manager\Event\PostDestroyEvent;
use Drupal\package_manager\Event\PostRequireEvent;
use Drupal\package_manager\Event\PreApplyEvent;
use Drupal\package_manager\Event\PreCreateEvent;
use Drupal\package_manager\Event\PreDestroyEvent;
use Drupal\package_manager\Event\PreRequireEvent;
use PhpTuf\ComposerStager\Domain\BeginnerInterface; use PhpTuf\ComposerStager\Domain\BeginnerInterface;
use PhpTuf\ComposerStager\Domain\CleanerInterface; use PhpTuf\ComposerStager\Domain\CleanerInterface;
use PhpTuf\ComposerStager\Domain\CommitterInterface; use PhpTuf\ComposerStager\Domain\CommitterInterface;
use PhpTuf\ComposerStager\Domain\StagerInterface; use PhpTuf\ComposerStager\Domain\StagerInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
/** /**
* Creates and manages a staging area in which to install or update code. * Creates and manages a staging area in which to install or update code.
...@@ -52,6 +61,13 @@ class Stage { ...@@ -52,6 +61,13 @@ class Stage {
*/ */
protected $cleaner; protected $cleaner;
/**
* The event dispatcher service.
*
* @var \Symfony\Contracts\EventDispatcher\EventDispatcherInterface
*/
protected $eventDispatcher;
/** /**
* Constructs a new Stage object. * Constructs a new Stage object.
* *
...@@ -65,13 +81,16 @@ class Stage { ...@@ -65,13 +81,16 @@ class Stage {
* The committer service from Composer Stager. * The committer service from Composer Stager.
* @param \PhpTuf\ComposerStager\Domain\CleanerInterface $cleaner * @param \PhpTuf\ComposerStager\Domain\CleanerInterface $cleaner
* The cleaner service from Composer Stager. * The cleaner service from Composer Stager.
* @param \Symfony\Contracts\EventDispatcher\EventDispatcherInterface $event_dispatcher
* The event dispatcher service.
*/ */
public function __construct(PathLocator $path_locator, BeginnerInterface $beginner, StagerInterface $stager, CommitterInterface $committer, CleanerInterface $cleaner) { public function __construct(PathLocator $path_locator, BeginnerInterface $beginner, StagerInterface $stager, CommitterInterface $committer, CleanerInterface $cleaner, EventDispatcherInterface $event_dispatcher) {
$this->pathLocator = $path_locator; $this->pathLocator = $path_locator;
$this->beginner = $beginner; $this->beginner = $beginner;
$this->stager = $stager; $this->stager = $stager;
$this->committer = $committer; $this->committer = $committer;
$this->cleaner = $cleaner; $this->cleaner = $cleaner;
$this->eventDispatcher = $event_dispatcher;
} }
/** /**
...@@ -85,7 +104,10 @@ class Stage { ...@@ -85,7 +104,10 @@ class Stage {
public function create(?array $exclusions = []): void { public function create(?array $exclusions = []): void {
$active_dir = $this->pathLocator->getActiveDirectory(); $active_dir = $this->pathLocator->getActiveDirectory();
$stage_dir = $this->pathLocator->getStageDirectory(); $stage_dir = $this->pathLocator->getStageDirectory();
$this->eventDispatcher->dispatch(new PreCreateEvent());
$this->beginner->begin($active_dir, $stage_dir, $exclusions); $this->beginner->begin($active_dir, $stage_dir, $exclusions);
$this->eventDispatcher->dispatch(new PostCreateEvent());
} }
/** /**
...@@ -97,7 +119,10 @@ class Stage { ...@@ -97,7 +119,10 @@ class Stage {
public function require(array $constraints): void { public function require(array $constraints): void {
$command = array_merge(['require'], $constraints); $command = array_merge(['require'], $constraints);
$command[] = '--update-with-all-dependencies'; $command[] = '--update-with-all-dependencies';
$this->eventDispatcher->dispatch(new PreRequireEvent());
$this->stager->stage($command, $this->pathLocator->getStageDirectory()); $this->stager->stage($command, $this->pathLocator->getStageDirectory());
$this->eventDispatcher->dispatch(new PostRequireEvent());
} }
/** /**
...@@ -111,17 +136,22 @@ class Stage { ...@@ -111,17 +136,22 @@ class Stage {
public function apply(?array $exclusions = []): void { public function apply(?array $exclusions = []): void {
$active_dir = $this->pathLocator->getActiveDirectory(); $active_dir = $this->pathLocator->getActiveDirectory();
$stage_dir = $this->pathLocator->getStageDirectory(); $stage_dir = $this->pathLocator->getStageDirectory();
$this->eventDispatcher->dispatch(new PreApplyEvent());
$this->committer->commit($stage_dir, $active_dir, $exclusions); $this->committer->commit($stage_dir, $active_dir, $exclusions);
$this->eventDispatcher->dispatch(new PostApplyEvent());
} }
/** /**
* Deletes the staging area. * Deletes the staging area.
*/ */
public function destroy(): void { public function destroy(): void {
$this->eventDispatcher->dispatch(new PreDestroyEvent());
$stage_dir = $this->pathLocator->getStageDirectory(); $stage_dir = $this->pathLocator->getStageDirectory();
if (is_dir($stage_dir)) { if (is_dir($stage_dir)) {
$this->cleaner->clean($stage_dir); $this->cleaner->clean($stage_dir);
} }
$this->eventDispatcher->dispatch(new PostDestroyEvent());
} }
} }
<?php
namespace Drupal\Tests\package_manager\Kernel;
use Drupal\KernelTests\KernelTestBase;
use Drupal\package_manager\Event\PostApplyEvent;
use Drupal\package_manager\Event\PostCreateEvent;
use Drupal\package_manager\Event\PostDestroyEvent;
use Drupal\package_manager\Event\PostRequireEvent;
use Drupal\package_manager\Event\PreApplyEvent;
use Drupal\package_manager\Event\PreCreateEvent;
use Drupal\package_manager\Event\PreDestroyEvent;
use Drupal\package_manager\Event\PreRequireEvent;
use Drupal\package_manager\Event\StageEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Tests that the staging area fires events during its lifecycle.
*
* @group package_manager
*/
class StageEventsTest extends KernelTestBase implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
protected static $modules = [
'package_manager',
'package_manager_bypass',
];
/**
* The events that were fired, in the order they were fired.
*
* @var string[]
*/
private $events = [];
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
PreCreateEvent::class => 'handleEvent',
PostCreateEvent::class => 'handleEvent',
PreRequireEvent::class => 'handleEvent',
PostRequireEvent::class => 'handleEvent',
PreApplyEvent::class => 'handleEvent',
PostApplyEvent::class => 'handleEvent',
PreDestroyEvent::class => 'handleEvent',
PostDestroyEvent::class => 'handleEvent',
];
}
/**
* Handles a staging area life cycle event.
*
* @param \Drupal\package_manager\Event\StageEvent $event
* The event object.
*/
public function handleEvent(StageEvent $event): void {
array_push($this->events, get_class($event));
}
/**
* Tests that the staging area fires life cycle events in a specific order.
*/
public function testEvents(): void {
$this->container->get('event_dispatcher')->addSubscriber($this);
$stage = $this->container->get('package_manager.stage');
$stage->create();
$stage->require(['ext-json:*']);
$stage->apply();
$stage->destroy();
$this->assertSame($this->events, [
PreCreateEvent::class,
PostCreateEvent::class,
PreRequireEvent::class,
PostRequireEvent::class,
PreApplyEvent::class,
PostApplyEvent::class,
PreDestroyEvent::class,
PostDestroyEvent::class,
]);
}
}
...@@ -75,7 +75,8 @@ class FileSystemOperationsTest extends AutomaticUpdatesFunctionalTestBase { ...@@ -75,7 +75,8 @@ class FileSystemOperationsTest extends AutomaticUpdatesFunctionalTestBase {
$this->container->get('package_manager.beginner'), $this->container->get('package_manager.beginner'),
$this->container->get('package_manager.stager'), $this->container->get('package_manager.stager'),
$this->container->get('package_manager.committer'), $this->container->get('package_manager.committer'),
$cleaner $cleaner,
$this->container->get('event_dispatcher')
); );
$this->updater = new Updater( $this->updater = new Updater(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment