Skip to content
Snippets Groups Projects
Commit 543af983 authored by Ted Bowman's avatar Ted Bowman Committed by Adam G-H
Browse files

Issue #3273693 by tedbow: Allow determining required packages in PreRequire and PostRequire events

parent 17e1cc77
No related branches found
No related tags found
1 merge request!256Issue #3273693: Allow determining required packages in PreRequire and PostRequire events
...@@ -6,4 +6,7 @@ namespace Drupal\package_manager\Event; ...@@ -6,4 +6,7 @@ namespace Drupal\package_manager\Event;
* Event fired after packages are updated to the staging area. * Event fired after packages are updated to the staging area.
*/ */
class PostRequireEvent extends StageEvent { class PostRequireEvent extends StageEvent {
use RequireEventTrait;
} }
...@@ -6,4 +6,7 @@ namespace Drupal\package_manager\Event; ...@@ -6,4 +6,7 @@ namespace Drupal\package_manager\Event;
* Event fired before packages are updated to the staging area. * Event fired before packages are updated to the staging area.
*/ */
class PreRequireEvent extends PreOperationStageEvent { class PreRequireEvent extends PreOperationStageEvent {
use RequireEventTrait;
} }
<?php
namespace Drupal\package_manager\Event;
use Drupal\package_manager\Stage;
/**
* Common methods for pre- and post-require events.
*
* @internal
* This is an internal part of Automatic Updates and should only be used by
* \Drupal\package_manager\Event\PreRequireEvent and
* \Drupal\package_manager\Event\PostRequireEvent.
*/
trait RequireEventTrait {
/**
* The runtime packages, in the form 'vendor/name:constraint'.
*
* @var string[]
*/
private $runtimePackages;
/**
* The dev packages to be required, in the form 'vendor/name:constraint'.
*
* @var string[]
*/
private $devPackages;
/**
* Constructs the object.
*
* @param \Drupal\package_manager\Stage $stage
* The stage.
* @param string[] $runtime_packages
* The runtime (i.e., non-dev) packages to be required, in the form
* 'vendor/name:constrant'.
* @param string[] $dev_packages
* The dev packages to be required, in the form 'vendor/name:constrant'.
*/
public function __construct(Stage $stage, array $runtime_packages, array $dev_packages = []) {
$this->runtimePackages = $runtime_packages;
$this->devPackages = $dev_packages;
parent::__construct($stage);
}
/**
* Gets the runtime (i.e., non-dev) packages.
*
* @return string[]
* An array of packages where the values are version constraints and keys
* are package names in the form 'vendor/name'.
*/
public function getRuntimePackages(): array {
return $this->getKeyedPackages($this->runtimePackages);
}
/**
* Gets the dev packages.
*
* @return string[]
* An array of packages where the values are version constraints and keys
* are package names in the form 'vendor/name'.
*/
public function getDevPackages(): array {
return $this->getKeyedPackages($this->devPackages);
}
/**
* Gets packages as a keyed array.
*
* @param string[] $packages
* The packages, in the form 'vendor/name:version'.
*
* @return string[]
* An array of packages where the values are version constraints and keys
* are package names in the form 'vendor/name'.
*/
private function getKeyedPackages(array $packages): array {
$keyed_packages = [];
foreach ($packages as $package) {
[$name, $constraint] = explode(':', $package);
$keyed_packages[$name] = $constraint;
}
return $keyed_packages;
}
}
...@@ -301,7 +301,7 @@ class Stage { ...@@ -301,7 +301,7 @@ class Stage {
public function require(array $runtime, array $dev = []): void { public function require(array $runtime, array $dev = []): void {
$this->checkOwnership(); $this->checkOwnership();
$this->dispatch(new PreRequireEvent($this)); $this->dispatch(new PreRequireEvent($this, $runtime, $dev));
$dir = $this->getStageDirectory(); $dir = $this->getStageDirectory();
// Change the runtime and dev requirements as needed, but don't update // Change the runtime and dev requirements as needed, but don't update
...@@ -321,7 +321,7 @@ class Stage { ...@@ -321,7 +321,7 @@ class Stage {
$this->stager->stage($command, $dir); $this->stager->stage($command, $dir);
} }
$this->dispatch(new PostRequireEvent($this)); $this->dispatch(new PostRequireEvent($this, $runtime, $dev));
} }
/** /**
......
...@@ -160,4 +160,25 @@ class StageEventsTest extends PackageManagerKernelTestBase implements EventSubsc ...@@ -160,4 +160,25 @@ class StageEventsTest extends PackageManagerKernelTestBase implements EventSubsc
} }
} }
/**
* Tests that pre- and post-require events have access to the package lists.
*/
public function testPackageListsAvailableToRequireEvents(): void {
$listener = function (object $event): void {
$expected_runtime = ['drupal/core' => '9.8.2'];
$expected_dev = ['drupal/core-dev' => '9.8.2'];
/** @var \Drupal\package_manager\Event\PreRequireEvent|\Drupal\package_manager\Event\PostRequireEvent $event */
$this->assertSame($expected_runtime, $event->getRuntimePackages());
$this->assertSame($expected_dev, $event->getDevPackages());
};
/** @var \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher */
$event_dispatcher = $this->container->get('event_dispatcher');
$event_dispatcher->addListener(PreRequireEvent::class, $listener);
$event_dispatcher->addListener(PostRequireEvent::class, $listener);
$this->stage->create();
$this->stage->require(['drupal/core:9.8.2'], ['drupal/core-dev:9.8.2']);
}
} }
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