Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ After installing you able to add extra.scripts-dev directive in your `composer.j
"post-install-cmd": [
"npm install --dev"
],
"post-update-cmd": "php ./someCoolCommand.php"
"post-update-cmd": "php ./someCoolCommand.php",
"test": "phpunit"
},
}
...
Expand Down
48 changes: 48 additions & 0 deletions src/DevScriptProxyCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace ScriptsDev;


use Composer\Command\BaseCommand;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class DevScriptProxyCommand extends BaseCommand
{
protected function configure()
{
$this
->setName('{name}')
->setDescription('Run the {name} defined in composer.json.')
->setDefinition(array(
new InputArgument('script', InputArgument::OPTIONAL, ''),
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.'),
new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables the dev mode.'),
new InputOption('list', 'l', InputOption::VALUE_NONE, 'List scripts.'),
));
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$args = array(
'command' => 'run-script',
'script' => $this->getName(),
'args' => $input->getArgument('args'),
'--timeout' => $input->getOption('timeout') ?: '0',
'--dev' => $input->getOption('dev'),
'--no-dev' => $input->getOption('no-dev'),
'--list' => $input->getOption('list'),
);

$command = $this->getApplication()->find('run-script');

$arrayInput = new ArrayInput($args);
$command->run($arrayInput, $output);
}
}
60 changes: 60 additions & 0 deletions src/DevScriptsCommandProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

namespace ScriptsDev;

use Composer\Composer;
use Composer\IO\IOInterface;
use Composer\Plugin\Capability\CommandProvider;

class DevScriptsCommandProvider implements CommandProvider
{
/**
* @var Composer
*/
private $composer;
/**
* @var IOInterface
*/
private $io;

public function __construct(array $args)
{
if (!$args['composer'] instanceof Composer) {
throw new \RuntimeException('Expected a "composer" key');
}
if (!$args['io'] instanceof IOInterface) {
throw new \RuntimeException('Expected an "io" key');
}
$this->composer = $args['composer'];
$this->io = $args['io'];
}

public function getCommands()
{
$package = $this->composer->getPackage();
$extractor = new PackageScriptsExtractor($this->io);
$devScripts = $extractor->extract($package);
$commands = array();
foreach ($devScripts as $name => $cmd) {
$commands[] = $this->buildCommand($name);
}
return $commands;
}

/**
* @param $name
* @return DevScriptProxyCommand
*/
private function buildCommand($name)
{
$command = new DevScriptProxyCommand($name);
$command->setName($this->replaceName($command->getName(), $name));
$command->setDescription($this->replaceName($command->getDescription(), $name));
return $command;
}

private function replaceName($string, $replacement)
{
return str_replace('{name}', $replacement, $string);
}
}
65 changes: 65 additions & 0 deletions src/PackageScriptsExtractor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

namespace ScriptsDev;


use Composer\IO\IOInterface;
use Composer\Package\AliasPackage;
use Composer\Package\CompletePackage;
use Composer\Package\Package;

class PackageScriptsExtractor
{
/**
* @var IOInterface
*/
private $io;

protected static $warningPrinted = false;

public function __construct(IOInterface $io)
{
$this->io = $io;
}

/**
* @param Package $package
* @return array
*/
public function extract(Package $package)
{
// If we have extra.branch-alias, package will be an instanceof RootAliasPackage instead of RootPackage
if ($package instanceof AliasPackage) {
$package = $package->getAliasOf();
}

if ($package instanceof CompletePackage && in_array('--no-dev', $_SERVER['argv'], true)) {
return array();
}

$devScripts = array();
$config = json_decode(file_get_contents(getcwd() . '/composer.json'), true);
if (isset($config['scripts-dev']) && is_array($config['scripts-dev'])) {
if (!static::$warningPrinted) {
$this->io->writeError(
"<warning>You're using deprecated way to define development-only scripts.
Please, move commands under `scripts-dev` directive into `extra` field.
See https://github.com/neronmoon/scriptsdev/blob/master/README.md for more details.</warning>"
);
static::$warningPrinted = true;
}
$devScripts = array_merge_recursive($devScripts, $config['scripts-dev']);
}

$extra = $package->getExtra();
if (isset($extra['scripts-dev']) && is_array($extra['scripts-dev'])) {
$devScripts = array_merge_recursive($devScripts, $extra['scripts-dev']);
}

foreach ($devScripts as $event => &$listeners) {
$listeners = (array)$listeners;
}

return $devScripts;
}
}
42 changes: 11 additions & 31 deletions src/Plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,24 @@

use Composer\Composer;
use Composer\IO\IOInterface;
use Composer\Package\AliasPackage;
use Composer\Package\CompletePackage;
use Composer\Plugin\Capable;
use Composer\Plugin\PluginInterface;

class Plugin implements PluginInterface
class Plugin implements PluginInterface, Capable
{
public function getCapabilities()
{
return array(
'Composer\Plugin\Capability\CommandProvider' => 'ScriptsDev\DevScriptsCommandProvider',
);
}

public function activate(Composer $composer, IOInterface $io)
{
$package = $composer->getPackage();

// If we have extra.branch-alias, package will be an instanceof RootAliasPackage instead of RootPackage
if ($package instanceof AliasPackage) {
$package = $package->getAliasOf();
}

if ($package instanceof CompletePackage && in_array('--no-dev', $_SERVER['argv'], true)) {
return;
}

$devScripts = array();
$config = json_decode(file_get_contents(getcwd().'/composer.json'), true);
if (isset($config['scripts-dev']) && is_array($config['scripts-dev'])) {
$io->writeError(
"You're using deprecated way to define development-only scripts.
Please, move commands under `scripts-dev` directive into `extra` field.
See README.md for more details."
);
$devScripts = array_merge_recursive($devScripts, $config['scripts-dev']);
}

$extra = $package->getExtra();
if (isset($extra['scripts-dev']) && is_array($extra['scripts-dev'])) {
$devScripts = array_merge_recursive($devScripts, $extra['scripts-dev']);
}

foreach ($devScripts as $event => &$listeners) {
$listeners = (array) $listeners;
}
$extractor = new PackageScriptsExtractor($io);
$devScripts = $extractor->extract($package);

$package->setScripts(array_merge_recursive($package->getScripts(), $devScripts));
}
Expand Down
28 changes: 28 additions & 0 deletions tests/extra-with-custom-script-run-script-dev.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "neronmoon/scriptsdev-test",
"description": "Scripts-dev behaviour for Composer",
"keywords": ["dev", "scripts", "composer", "commands", "commands execution"],
"homepage": "https://github.com/neronmoon/scriptsdev",
"type": "project",
"license": "MIT",
"authors": [
{
"name": "Vitaliy Krasnoperov",
"email": "alistar.neron@gmail.com"
}
],
"repositories": [
{
"type": "path",
"url": "<PLUGIN_PATH>"
}
],
"require": {
"neronmoon/scriptsdev": "*@dev"
},
"extra": {
"scripts-dev": {
"test": "echo SCRIPTSDEV RULEZ"
}
}
}
26 changes: 26 additions & 0 deletions tests/legacy-with-run-scripts-dev.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"name": "neronmoon/scriptsdev-test",
"description": "Scripts-dev behaviour for Composer",
"keywords": ["dev", "scripts", "composer", "commands", "commands execution"],
"homepage": "https://github.com/neronmoon/scriptsdev",
"type": "project",
"license": "MIT",
"authors": [
{
"name": "Vitaliy Krasnoperov",
"email": "alistar.neron@gmail.com"
}
],
"repositories": [
{
"type": "path",
"url": "<PLUGIN_PATH>"
}
],
"require": {
"neronmoon/scriptsdev": "*@dev"
},
"scripts-dev": {
"test": "echo SCRIPTSDEV RULEZ"
}
}
2 changes: 1 addition & 1 deletion tests/legacy.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@
"scripts-dev": {
"post-update-cmd": "echo SCRIPTSDEV RULEZ"
}
}
}
Loading