Skip to content
Extraits de code Groupes Projets
Valider 6a037f8e rédigé par JamesRezo's avatar JamesRezo :tada:
Parcourir les fichiers

feat(mode-dev): preferred-install facilities

parent ba8a6345
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
<?php
namespace Spip\Composer\Config;
use Composer\Composer;
use Spip\Composer\SpipPaths;
class PreferredInstall
{
public function __construct(private Composer $composer)
{
}
/**
* Provides the directories where to check source preferred-install
*
* @return List
*/
public function getFromConfig(): array
{
$toCheck = array_keys(array_filter(
$this->composer->getConfig()->get('preferred-install'), function ($install) {
return $install === 'source';
}
));
// packages to change by mode-dev
$rootPackage = $this->composer->getPackage();
$extra = $rootPackage->getExtra();
$extensions = $extra['spip']['extensions'] ?? []; // -> SpipPaths::EXTENSIONS/
$template = $extra['spip']['template'] ?? ''; // -> SpipPaths::TEMPLATE/
$vendorDir = $this->composer->getConfig()->get('vendor-dir'); // -> vendor/
$rootDir = realpath($vendorDir . '/..');
// -> plugins/ ?
$requires = $rootPackage->getRequires();
$toChange = array_reduce($requires, function ($list, $link) use ($toCheck, $extensions, $template, $vendorDir, $rootDir) {
$packageName = $link->getTarget();
foreach ($toCheck as $packageFamily) {
if (str_starts_with($packageName, rtrim($packageFamily, '*'))) {
if (in_array($packageName, $extensions)) {
$dir = $rootDir . '/' . SpipPaths::EXTENSIONS . '/' . $packageName;
} elseif ($packageName === $template) {
$dir = $rootDir . '/' . SpipPaths::TEMPLATE;
} else {
$dir = $vendorDir . '/' . $packageName;
}
$list[] = $dir;
}
}
return $list;
}, []);
return $toChange;
}
}
......@@ -3,48 +3,23 @@
namespace Spip\Composer;
use Composer\Script\Event;
use Spip\Composer\Config\PreferredInstall;
use Spip\Composer\Git\RemoteUrls;
/**
* Script for post-install-cmd and post-update-cmd.
* @deprecated 0.6.0 use `composer spip:set-ssh-url` instead
*/
class ModeDev
{
public static function activate(Event $event)
{
$io = $event->getIO();
$changer = new RemoteUrls($io);
$rootPackage = $event->getComposer()->getPackage();
$extra = $rootPackage->getExtra();
$extensions = $extra['spip']['extensions'] ?? []; // -> plugins-dist/
$template = $extra['spip']['template'] ?? ''; // -> squelettes-dist/
$vendorDir = $event->getComposer()->getConfig()->get('vendor-dir'); // -> vendor/
$rootDir = realpath($vendorDir.'/..');
// -> plugins/ ?
// packages to check for mode-dev
$config = $rootPackage->getConfig();
$preferredInstall = $config['preferred-install'] ?? [];
$toCheck = array_keys(array_filter($preferredInstall, function ($install) {
return $install === 'source';
}));
// packages to change by mode-dev
$requires = $rootPackage->getRequires();
$toChange = array_reduce($requires, function($list, $link) use ($toCheck, $extensions, $template, $vendorDir, $rootDir) {
$packageName = $link->getTarget();
foreach($toCheck as $packageFamily) {
if (str_starts_with($packageName, rtrim($packageFamily, '*'))) {
if (in_array($packageName, $extensions)) {
$dir = $rootDir.'/plugins-dist/' . $packageName;
} elseif ($packageName === $template) {
$dir = $rootDir.'/squelettes-dist';
} else {
$dir = $vendorDir . '/' . $packageName;
}
$list[] = $dir;
}
}
return $list;
}, []);
$preferredInstall = new PreferredInstall($event->getComposer());
$toChange = $preferredInstall->getFromConfig();
foreach ($toChange as $path) {
$url = '';
......
<?php
namespace Spip\Test\Composer\Config;
use Composer\Composer;
use Composer\Config;
use Composer\Package\Link;
use Composer\Package\RootPackage;
use Composer\Semver\Constraint\Constraint;
use PHPUnit\Framework\TestCase;
use Spip\Composer\Config\PreferredInstall;
/**
* @covers Spip\Composer\Config\PreferredInstall
*/
class PreferredInstallTest extends TestCase
{
private PreferredInstall $preferredInstall;
private Config $config;
private RootPackage $package;
protected function setUp(): void
{
$this->config = new Config();
$this->package = new RootPackage('spip/spip', '1.0', '1.0.0.0');
$this->package->setExtra([
'spip' => [
'template' => 'spip/default-template',
'extensions' => [
'spip/mandatory',
],
],
]);
$composer = new Composer();
$composer->setConfig($this->config);
$composer->setPackage($this->package);
$this->preferredInstall = new PreferredInstall($composer);
}
public static function dataGetFromConfig()
{
return [
'1' => [
'expected' => [
dirname(__DIR__, 2) . '/plugins-dist/spip/mandatory',
dirname(__DIR__, 2) . '/squelettes-dist',
'vendor/spip/package'
],
'preferred' => ['spip/*' => 'source'],
'requires' => [
'mandatory' => new Link('mandatory', 'spip/mandatory', new Constraint('=', '*')),
'template' => new Link('template', 'spip/default-template', new Constraint('=', '*')),
'package' => new Link('package', 'spip/package', new Constraint('=', '*')),
'other-package' => new Link('other-package', 'other/package', new Constraint('=', '*')),
],
],
];
}
/**
* @dataProvider dataGetFromConfig
*/
public function testGetFromConfig($expected, $preferred, $requires)
{
$this->package->setRequires($requires);
$this->config->merge(['config' => ['preferred-install' => $preferred]]);
$this->assertSame($expected, $this->preferredInstall->getFromConfig());
}
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter