Skip to content

Commit

Permalink
Restore the ability to list the scripts in the 'run-script' command w…
Browse files Browse the repository at this point in the history
…ithout providing a script (composer#10710)
  • Loading branch information
mbabker authored and emahorvat52 committed Jan 18, 2023
1 parent 706d48a commit 723e2d3
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 1 deletion.
5 changes: 5 additions & 0 deletions phpstan/baseline.neon
Expand Up @@ -7618,6 +7618,11 @@ parameters:
count: 1
path: ../tests/Composer/Test/CacheTest.php

-
message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#"
count: 1
path: ../tests/Composer/Test/Command/RunScriptCommandTest.php

-
message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#"
count: 1
Expand Down
6 changes: 5 additions & 1 deletion src/Composer/Command/RunScriptCommand.php
Expand Up @@ -54,7 +54,7 @@ protected function configure(): void
->setAliases(array('run'))
->setDescription('Runs the scripts defined in composer.json.')
->setDefinition(array(
new InputArgument('script', InputArgument::REQUIRED, 'Script name to run.'),
new InputArgument('script', InputArgument::OPTIONAL, 'Script name to run.'),
new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''),
new InputOption('timeout', null, InputOption::VALUE_REQUIRED, 'Sets script timeout in seconds, or 0 for never.'),
new InputOption('dev', null, InputOption::VALUE_NONE, 'Sets the dev mode.'),
Expand All @@ -80,6 +80,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int
}

$script = $input->getArgument('script');
if ($script === null) {
throw new \RuntimeException('Missing required argument "script"');
}

if (!in_array($script, $this->scriptEvents)) {
if (defined('Composer\Script\ScriptEvents::'.str_replace('-', '_', strtoupper($script)))) {
throw new \InvalidArgumentException(sprintf('Script "%s" cannot be run with this command', $script));
Expand Down
51 changes: 51 additions & 0 deletions tests/Composer/Test/Command/RunScriptCommandTest.php
Expand Up @@ -12,13 +12,35 @@

namespace Composer\Test\Command;

use Composer\Command\RunScriptCommand;
use Composer\Composer;
use Composer\Config;
use Composer\Console\Application;
use Composer\Script\Event as ScriptEvent;
use Composer\Test\TestCase;
use Composer\Util\Filesystem;
use Symfony\Component\Console\Tester\ApplicationTester;

class RunScriptCommandTest extends TestCase
{
/**
* @var string
*/
private $home;

public function setUp(): void
{
$this->home = $this->getUniqueTmpDirectory();
}

protected function tearDown(): void
{
parent::tearDown();

$fs = new Filesystem();
$fs->removeDirectory($this->home);
}

/**
* @dataProvider getDevOptions
* @param bool $dev
Expand Down Expand Up @@ -88,6 +110,35 @@ public function testDetectAndPassDevModeToEventAndToDispatching(bool $dev, bool
$command->run($input, $output);
}

public function testCanListScripts(): void
{
$manifest = [
'scripts' => [
'test' => '@php test',
'fix-cs' => 'php-cs-fixer fix',
],
'scripts-descriptions' => [
'fix-cs' => 'Run the codestyle fixer',
],
];

file_put_contents($this->home.'/composer.json', json_encode($manifest));

$application = new Application();
$application->setAutoExit(false);
$application->add(new RunScriptCommand());

$tester = new ApplicationTester($application);
$tester->run(['command' => 'run-script', '--list' => true, '-d' => $this->home]);

$tester->assertCommandIsSuccessful();

$output = $tester->getDisplay();

$this->assertStringContainsString('Runs the test script as defined in composer.json.', $output, 'The default description for the test script should be printed');
$this->assertStringContainsString('Run the codestyle fixer', $output, 'The custom description for the fix-cs script should be printed');
}

/** @return bool[][] **/
public function getDevOptions(): array
{
Expand Down

0 comments on commit 723e2d3

Please sign in to comment.