From fa41a2c51fd76eecaeb41312a916ee5657c529fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Bugy=C3=ADk?= Date: Fri, 24 Apr 2020 13:32:39 +0200 Subject: [PATCH] Add possibility to define namespace of Symfony Console Command --- src/Bridges/NetteDI/MigrationsExtension.php | 7 ++++--- .../DependencyInjection/Configuration.php | 4 ++++ .../NextrasMigrationsExtension.php | 2 +- src/Bridges/SymfonyConsole/BaseCommand.php | 11 +++++++++++ .../SymfonyConsole/ContinueCommand.php | 6 +----- src/Bridges/SymfonyConsole/CreateCommand.php | 5 +---- src/Bridges/SymfonyConsole/ResetCommand.php | 5 +---- src/Configurations/Configuration.php | 16 ++++++++++++++-- src/Configurations/DefaultConfiguration.php | 15 ++++++++++++++- src/IConfiguration.php | 4 ++++ .../MigrationsExtension.commandNamespace.neon | 14 ++++++++++++++ .../nette-di/MigrationsExtension.phpt | 19 +++++++++++++++++++ .../symfony-bundle/SymfonyBundleTest.phpt | 4 ++-- .../symfony-bundle/SymfonyBundleTest.yaml | 1 + 14 files changed, 91 insertions(+), 22 deletions(-) create mode 100644 tests/cases/integration/nette-di/MigrationsExtension.commandNamespace.neon diff --git a/src/Bridges/NetteDI/MigrationsExtension.php b/src/Bridges/NetteDI/MigrationsExtension.php index 08c8eff..6ab8d4c 100644 --- a/src/Bridges/NetteDI/MigrationsExtension.php +++ b/src/Bridges/NetteDI/MigrationsExtension.php @@ -33,6 +33,7 @@ class MigrationsExtension extends Nette\DI\CompilerExtension 'diffGenerator' => TRUE, // false|doctrine 'withDummyData' => FALSE, 'ignoredQueriesFile' => NULL, + 'commandNamespace' => Nextras\Migrations\Bridges\SymfonyConsole\BaseCommand::DEFAULT_NAMESPACE, ]; /** @var array */ @@ -78,11 +79,11 @@ public function loadConfiguration() } Validators::assertField($config, 'groups', 'array'); - $groups = $this->createGroupDefinitions($config['groups']); + $this->createGroupDefinitions($config['groups']); // extensionHandlers Validators::assertField($config, 'phpParams', 'array'); - $extensionHandlers = $this->createExtensionHandlerDefinitions($driver, $config['phpParams']); + $this->createExtensionHandlerDefinitions($driver, $config['phpParams']); // configuration $configuration = $this->createConfigurationDefinition(); @@ -142,7 +143,7 @@ public function beforeCompile() } $builder->getDefinition($this->prefix('configuration')) - ->setArguments([$groups, $extensionHandlers]); + ->setArguments([$groups, $extensionHandlers, $config['commandNamespace']]); } diff --git a/src/Bridges/SymfonyBundle/DependencyInjection/Configuration.php b/src/Bridges/SymfonyBundle/DependencyInjection/Configuration.php index 5214807..5d2dfc0 100644 --- a/src/Bridges/SymfonyBundle/DependencyInjection/Configuration.php +++ b/src/Bridges/SymfonyBundle/DependencyInjection/Configuration.php @@ -9,6 +9,7 @@ namespace Nextras\Migrations\Bridges\SymfonyBundle\DependencyInjection; +use Nextras\Migrations\Bridges\SymfonyConsole\BaseCommand; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; @@ -27,6 +28,9 @@ public function getConfigTreeBuilder() } $rootNode->children() + ->scalarNode('command_namespace') + ->defaultValue(BaseCommand::DEFAULT_NAMESPACE) + ->end() ->scalarNode('dir') ->defaultValue('%kernel.project_dir%/migrations') ->cannotBeEmpty() diff --git a/src/Bridges/SymfonyBundle/DependencyInjection/NextrasMigrationsExtension.php b/src/Bridges/SymfonyBundle/DependencyInjection/NextrasMigrationsExtension.php index 24775b1..d00fce3 100644 --- a/src/Bridges/SymfonyBundle/DependencyInjection/NextrasMigrationsExtension.php +++ b/src/Bridges/SymfonyBundle/DependencyInjection/NextrasMigrationsExtension.php @@ -73,7 +73,7 @@ public function load(array $configs, ContainerBuilder $container) } $configurationDefinition = new Definition('Nextras\Migrations\Configurations\DefaultConfiguration'); - $configurationDefinition->setArguments([$config['dir'], $driverDefinition, $config['with_dummy_data'], $config['php_params']]); + $configurationDefinition->setArguments([$config['dir'], $driverDefinition, $config['with_dummy_data'], $config['php_params'], $config['command_namespace']]); $configurationDefinition->addMethodCall('setStructureDiffGenerator', [$structureDiffGeneratorDefinition]); $continueCommandDefinition = new Definition('Nextras\Migrations\Bridges\SymfonyConsole\ContinueCommand'); diff --git a/src/Bridges/SymfonyConsole/BaseCommand.php b/src/Bridges/SymfonyConsole/BaseCommand.php index fe31d6c..c1cc9b6 100644 --- a/src/Bridges/SymfonyConsole/BaseCommand.php +++ b/src/Bridges/SymfonyConsole/BaseCommand.php @@ -18,6 +18,8 @@ abstract class BaseCommand extends Command { + const DEFAULT_NAMESPACE = 'migrations'; + /** @var IDriver */ protected $driver; @@ -51,4 +53,13 @@ protected function runMigrations($mode, $config) return 0; } + /** + * @param string $name + * @return BaseCommand + */ + public function setName($name) + { + return parent::setName($this->config->getCommandNamespace() . ":$name"); + } + } diff --git a/src/Bridges/SymfonyConsole/ContinueCommand.php b/src/Bridges/SymfonyConsole/ContinueCommand.php index ad8597e..f684b42 100644 --- a/src/Bridges/SymfonyConsole/ContinueCommand.php +++ b/src/Bridges/SymfonyConsole/ContinueCommand.php @@ -16,13 +16,9 @@ class ContinueCommand extends BaseCommand { - /** @var string */ - protected static $defaultName = 'migrations:continue'; - - protected function configure() { - $this->setName(self::$defaultName); + $this->setName('continue'); $this->setDescription('Updates database schema by running all new migrations'); $this->setHelp("If table 'migrations' does not exist in current database, it is created automatically."); } diff --git a/src/Bridges/SymfonyConsole/CreateCommand.php b/src/Bridges/SymfonyConsole/CreateCommand.php index 9467452..7a62c10 100644 --- a/src/Bridges/SymfonyConsole/CreateCommand.php +++ b/src/Bridges/SymfonyConsole/CreateCommand.php @@ -25,9 +25,6 @@ class CreateCommand extends BaseCommand const CONTENT_SOURCE_STDIN = 'stdin'; const CONTENT_SOURCE_EMPTY = 'empty'; - /** @var string */ - protected static $defaultName = 'migrations:create'; - /** @var string */ protected $defaultContentSource = self::CONTENT_SOURCE_DIFF; @@ -47,7 +44,7 @@ public function setDefaultContentSource($defaultContentSource) */ protected function configure() { - $this->setName(self::$defaultName); + $this->setName('create'); $this->setDescription('Creates new migration file with proper name (e.g. 2015-03-14-130836-label.sql)'); $this->setHelp('Prints path of the created file to standard output.'); diff --git a/src/Bridges/SymfonyConsole/ResetCommand.php b/src/Bridges/SymfonyConsole/ResetCommand.php index 59c3d2a..ae2f434 100644 --- a/src/Bridges/SymfonyConsole/ResetCommand.php +++ b/src/Bridges/SymfonyConsole/ResetCommand.php @@ -16,12 +16,9 @@ class ResetCommand extends BaseCommand { - /** @var string */ - protected static $defaultName = 'migrations:reset'; - protected function configure() { - $this->setName(self::$defaultName); + $this->setName('reset'); $this->setDescription('Drops current database and recreates it from scratch'); $this->setHelp("Drops current database and runs all migrations"); } diff --git a/src/Configurations/Configuration.php b/src/Configurations/Configuration.php index b963644..eec8616 100644 --- a/src/Configurations/Configuration.php +++ b/src/Configurations/Configuration.php @@ -9,7 +9,6 @@ namespace Nextras\Migrations\Configurations; -use Nette\Utils\Validators; use Nextras\Migrations\Entities\Group; use Nextras\Migrations\IConfiguration; use Nextras\Migrations\IExtensionHandler; @@ -26,15 +25,20 @@ class Configuration implements IConfiguration /** @var IExtensionHandler[] (extension => IExtensionHandler) */ private $extensionHandlers; + /** @var string */ + private $commandNamespace; + /** * @param Group[] $groups * @param IExtensionHandler[] $extensionHandlers (extension => IExtensionHandler) + * @param string $commandNamespace */ - public function __construct(array $groups, array $extensionHandlers) + public function __construct(array $groups, array $extensionHandlers, $commandNamespace) { $this->groups = $groups; $this->extensionHandlers = $extensionHandlers; + $this->commandNamespace = $commandNamespace; } @@ -54,4 +58,12 @@ public function getExtensionHandlers() { return $this->extensionHandlers; } + + /** + * @return string + */ + public function getCommandNamespace() + { + return $this->commandNamespace; + } } diff --git a/src/Configurations/DefaultConfiguration.php b/src/Configurations/DefaultConfiguration.php index c38819b..6f60ad2 100644 --- a/src/Configurations/DefaultConfiguration.php +++ b/src/Configurations/DefaultConfiguration.php @@ -9,6 +9,7 @@ namespace Nextras\Migrations\Configurations; +use Nextras\Migrations\Bridges\SymfonyConsole\BaseCommand; use Nextras\Migrations\Entities\Group; use Nextras\Migrations\Extensions\PhpHandler; use Nextras\Migrations\Extensions\SqlHandler; @@ -48,19 +49,24 @@ class DefaultConfiguration implements IConfiguration /** @var IDiffGenerator|NULL */ protected $dummyDataDiffGenerator; + /** @var string */ + protected $commandNamespace; + /** * @param string $dir * @param IDriver $driver * @param bool $withDummyData * @param array $phpParams + * @param string $commandNamespace */ - public function __construct($dir, IDriver $driver, $withDummyData = TRUE, array $phpParams = []) + public function __construct($dir, IDriver $driver, $withDummyData = TRUE, array $phpParams = [], $commandNamespace = BaseCommand::DEFAULT_NAMESPACE) { $this->dir = $dir; $this->driver = $driver; $this->withDummyData = $withDummyData; $this->phpParams = $phpParams; + $this->commandNamespace = $commandNamespace; } @@ -132,4 +138,11 @@ public function setDummyDataDiffGenerator(IDiffGenerator $generator = NULL) $this->dummyDataDiffGenerator = $generator; } + /** + * @return string + */ + public function getCommandNamespace() + { + return $this->commandNamespace; + } } diff --git a/src/IConfiguration.php b/src/IConfiguration.php index cd7fac3..6df8807 100644 --- a/src/IConfiguration.php +++ b/src/IConfiguration.php @@ -28,4 +28,8 @@ public function getGroups(); */ public function getExtensionHandlers(); + /** + * @return string + */ + public function getCommandNamespace(); } diff --git a/tests/cases/integration/nette-di/MigrationsExtension.commandNamespace.neon b/tests/cases/integration/nette-di/MigrationsExtension.commandNamespace.neon new file mode 100644 index 0000000..e0fb34d --- /dev/null +++ b/tests/cases/integration/nette-di/MigrationsExtension.commandNamespace.neon @@ -0,0 +1,14 @@ +extensions: + migrationsA: Nextras\Migrations\Bridges\NetteDI\MigrationsExtension + migrationsB: Nextras\Migrations\Bridges\NetteDI\MigrationsExtension + +migrationsA: + dir: migrationsA + driver: mysql + dbal: Nextras\Migrations\Bridges\Dibi\DibiAdapter(Dibi\Connection(%dibiConfig%)) + +migrationsB: + dir: migrationsB + driver: mysql + dbal: Nextras\Migrations\Bridges\Dibi\DibiAdapter(Dibi\Connection(%dibiConfig%)) + commandNamespace: fooCommandNamespace diff --git a/tests/cases/integration/nette-di/MigrationsExtension.phpt b/tests/cases/integration/nette-di/MigrationsExtension.phpt index 2128f89..eb98f38 100644 --- a/tests/cases/integration/nette-di/MigrationsExtension.phpt +++ b/tests/cases/integration/nette-di/MigrationsExtension.phpt @@ -7,6 +7,7 @@ namespace NextrasTests\Migrations; use Nette; +use Nextras\Migrations\Bridges\SymfonyConsole\BaseCommand; use Tester\Assert; use Tester\Environment; use Tester\TestCase; @@ -100,6 +101,24 @@ class MigrationsExtensionTest extends TestCase } + public function testCommandNamespace() + { + $container = $this->createContainer('commandNamespace'); + + $commands = $container->findByType('Symfony\Component\Console\Command\Command'); + foreach ($commands as $name) { + /** @var BaseCommand $command */ + $command = $container->getService($name); + + if (Nette\Utils\Strings::contains($name, 'migrationsA.')) { + Assert::contains('migrations:', $command->getName(), 'Default command namespace failed.'); + } else { + Assert::contains('fooCommandNamespace:', $command->getName()); + } + } + } + + /** * @param string $config * @return Nette\DI\Container diff --git a/tests/cases/integration/symfony-bundle/SymfonyBundleTest.phpt b/tests/cases/integration/symfony-bundle/SymfonyBundleTest.phpt index 8781cf7..5d2a1a5 100644 --- a/tests/cases/integration/symfony-bundle/SymfonyBundleTest.phpt +++ b/tests/cases/integration/symfony-bundle/SymfonyBundleTest.phpt @@ -51,7 +51,7 @@ class SymfonyBundleTest extends TestCase { $application = new Application($this->symfonyKernel); - $command = $application->find('migrations:reset'); + $command = $application->find('fooCommandNamespace:reset'); $commandTester = new CommandTester($command); Assert::same(0, $commandTester->execute([])); } @@ -61,7 +61,7 @@ class SymfonyBundleTest extends TestCase { $application = new Application($this->symfonyKernel); - $command = $application->find('migrations:continue'); + $command = $application->find('fooCommandNamespace:continue'); $commandTester = new CommandTester($command); Assert::same(0, $commandTester->execute([])); } diff --git a/tests/cases/integration/symfony-bundle/SymfonyBundleTest.yaml b/tests/cases/integration/symfony-bundle/SymfonyBundleTest.yaml index 59982b5..0deb8e0 100644 --- a/tests/cases/integration/symfony-bundle/SymfonyBundleTest.yaml +++ b/tests/cases/integration/symfony-bundle/SymfonyBundleTest.yaml @@ -17,3 +17,4 @@ doctrine: nextras_migrations: driver: '%nextras_migrations_driver%' dir: '%nextras_migrations_dir%' + command_namespace: fooCommandNamespace