From e71b5dc9694fda506279c964ee850b1989a33b94 Mon Sep 17 00:00:00 2001 From: Pierre Rineau Date: Mon, 27 May 2024 10:41:03 +0200 Subject: [PATCH] issue #155 - move standalone console tool into Bridge/Standalone subfolder --- bin/db-tools.php | 2 +- docs/content/configuration.md | 2 +- .../Cli => Bridge/Standalone}/Bootstrap.php | 28 +++++++++---------- .../Cli => Bridge/Standalone}/Context.php | 2 +- .../Standalone}/StandaloneConfiguration.php | 2 +- .../DbToolsConfiguration.php | 17 +++++++++++ .../DependencyInjection/DbToolsExtension.php | 1 + .../DbToolsConfigurationTest.php | 6 ++-- 8 files changed, 39 insertions(+), 21 deletions(-) rename src/{Helper/Cli => Bridge/Standalone}/Bootstrap.php (95%) rename src/{Helper/Cli => Bridge/Standalone}/Context.php (95%) rename src/{Helper/Cli => Bridge/Standalone}/StandaloneConfiguration.php (97%) diff --git a/bin/db-tools.php b/bin/db-tools.php index ae253975..7c46cbcd 100644 --- a/bin/db-tools.php +++ b/bin/db-tools.php @@ -4,7 +4,7 @@ namespace MakinaCorpus\DbToolsBundle; -use MakinaCorpus\DbToolsBundle\Helper\Cli\Bootstrap; +use MakinaCorpus\DbToolsBundle\Bridge\Standalone\Bootstrap; (static function (): void { $autoloadFiles = [ diff --git a/docs/content/configuration.md b/docs/content/configuration.md index 7edff49c..0967c7df 100644 --- a/docs/content/configuration.md +++ b/docs/content/configuration.md @@ -8,7 +8,7 @@ A complete example of this file can be found in the bundle sources in: `vendor/m ::: For detailed information about configuration options, please see the -[configuration reference](../configuration/reference). +[configuration reference](configuration/reference). ## Backup configuration diff --git a/src/Helper/Cli/Bootstrap.php b/src/Bridge/Standalone/Bootstrap.php similarity index 95% rename from src/Helper/Cli/Bootstrap.php rename to src/Bridge/Standalone/Bootstrap.php index db5978fe..7b4d8611 100644 --- a/src/Helper/Cli/Bootstrap.php +++ b/src/Bridge/Standalone/Bootstrap.php @@ -2,27 +2,27 @@ declare(strict_types=1); -namespace MakinaCorpus\DbToolsBundle\Helper\Cli; +namespace MakinaCorpus\DbToolsBundle\Bridge\Standalone; use Composer\InstalledVersions; use MakinaCorpus\DbToolsBundle\Anonymization\AnonymizatorFactory; use MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer\AnonymizerRegistry; use MakinaCorpus\DbToolsBundle\Backupper\BackupperFactory; -use MakinaCorpus\DbToolsBundle\Command\Anonymization\AnonymizeCommand; -use MakinaCorpus\DbToolsBundle\Command\Anonymization\AnonymizerListCommand; -use MakinaCorpus\DbToolsBundle\Command\Anonymization\CleanCommand; -use MakinaCorpus\DbToolsBundle\Command\Anonymization\ConfigDumpCommand; +use MakinaCorpus\DbToolsBundle\Bridge\Symfony\DependencyInjection\DbToolsConfiguration; use MakinaCorpus\DbToolsBundle\Command\BackupCommand; use MakinaCorpus\DbToolsBundle\Command\CheckCommand; use MakinaCorpus\DbToolsBundle\Command\RestoreCommand; use MakinaCorpus\DbToolsBundle\Command\StatsCommand; +use MakinaCorpus\DbToolsBundle\Command\Anonymization\AnonymizeCommand; +use MakinaCorpus\DbToolsBundle\Command\Anonymization\AnonymizerListCommand; +use MakinaCorpus\DbToolsBundle\Command\Anonymization\CleanCommand; +use MakinaCorpus\DbToolsBundle\Command\Anonymization\ConfigDumpCommand; use MakinaCorpus\DbToolsBundle\Database\DatabaseSessionRegistry; use MakinaCorpus\DbToolsBundle\Database\StandaloneDatabaseSessionRegistry; use MakinaCorpus\DbToolsBundle\Error\ConfigurationException; use MakinaCorpus\DbToolsBundle\Restorer\RestorerFactory; use MakinaCorpus\DbToolsBundle\Stats\StatsProviderFactory; use MakinaCorpus\DbToolsBundle\Storage\Storage; -use MakinaCorpus\QueryBuilder\Error\ConfigurationError; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Symfony\Component\Config\Definition\Processor; @@ -110,7 +110,7 @@ public static function createApplication(): Application ], 'anonymization:run' => [ fn (Context $context) => new AnonymizeCommand( - defaultConnectionName: $context->databaseSessionRegistry->getDefaultConnectionName(), + connectionName: $context->databaseSessionRegistry->getDefaultConnectionName(), restorerFactory: $context->restorerFactory, backupperFactory: $context->backupperFactory, anonymizatorFactory: $context->anonymizatorFactory, @@ -121,7 +121,7 @@ public static function createApplication(): Application ], 'database:backup' => [ fn (Context $context) => new BackupCommand( - defaultConnectionName: $context->databaseSessionRegistry->getDefaultConnectionName(), + connectionName: $context->databaseSessionRegistry->getDefaultConnectionName(), backupperFactory: $context->backupperFactory, storage: $context->storage, ), @@ -139,7 +139,7 @@ public static function createApplication(): Application ], 'database:restore' => [ fn (Context $context) => new RestoreCommand( - defaultConnectionName: $context->databaseSessionRegistry->getDefaultConnectionName(), + connectionName: $context->databaseSessionRegistry->getDefaultConnectionName(), restorerFactory: $context->restorerFactory, storage: $context->storage, ), @@ -323,6 +323,7 @@ private static function configParse(array $config, array $files, LoggerInterface $processor = new Processor(); $config = $processor->processConfiguration($configuration, $configs); + $config = DbToolsConfiguration::appendPostConfig($config); return $config; } @@ -405,11 +406,10 @@ private static function createAnonymizeRegistry(array $config): AnonymizerRegist */ private static function createDatabaseSessionRegistry(array $config): DatabaseSessionRegistry { - if (empty($config['connections'])) { - throw new ConfigurationError("No database connection found, this means that either you forgot it into your configuration file, or no configuration files were found. Please run using the -vvv switch for more information."); - } - - return new StandaloneDatabaseSessionRegistry($config['connections'], $config['default_connection']); + // Do not crash on initialization, it will crash later when a connection + // will be request instead: this allows commands that don't act on + // database (such as anonymizer list) to work even if not configured. + return new StandaloneDatabaseSessionRegistry($config['connections'] ?? [], $config['default_connection']); } /** diff --git a/src/Helper/Cli/Context.php b/src/Bridge/Standalone/Context.php similarity index 95% rename from src/Helper/Cli/Context.php rename to src/Bridge/Standalone/Context.php index c0276060..b02b177d 100644 --- a/src/Helper/Cli/Context.php +++ b/src/Bridge/Standalone/Context.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace MakinaCorpus\DbToolsBundle\Helper\Cli; +namespace MakinaCorpus\DbToolsBundle\Bridge\Standalone; use MakinaCorpus\DbToolsBundle\Anonymization\AnonymizatorFactory; use MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer\AnonymizerRegistry; diff --git a/src/Helper/Cli/StandaloneConfiguration.php b/src/Bridge/Standalone/StandaloneConfiguration.php similarity index 97% rename from src/Helper/Cli/StandaloneConfiguration.php rename to src/Bridge/Standalone/StandaloneConfiguration.php index 4d048612..b71cef09 100644 --- a/src/Helper/Cli/StandaloneConfiguration.php +++ b/src/Bridge/Standalone/StandaloneConfiguration.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace MakinaCorpus\DbToolsBundle\Helper\Cli; +namespace MakinaCorpus\DbToolsBundle\Bridge\Standalone; use MakinaCorpus\DbToolsBundle\Bridge\Symfony\DependencyInjection\DbToolsConfiguration; use Symfony\Component\Config\Definition\Builder\TreeBuilder; diff --git a/src/Bridge/Symfony/DependencyInjection/DbToolsConfiguration.php b/src/Bridge/Symfony/DependencyInjection/DbToolsConfiguration.php index e47d0e3e..56f1698f 100644 --- a/src/Bridge/Symfony/DependencyInjection/DbToolsConfiguration.php +++ b/src/Bridge/Symfony/DependencyInjection/DbToolsConfiguration.php @@ -17,6 +17,23 @@ protected function getDefaultStoragePath(): ?string return '%kernel.project_dir%/var/db_tools'; } + /** + * Append values in configuration we cannot set a default. + * + * For example, 'anonymizer_paths', if set by the user, will loose the + * default anonymizer paths, and we need them to be set in all cases. + * + * So we act after configuration has been processed and restore missing + * values from here. This also allows the standalone configuration doing + * it outside of Symfony extension context. + */ + public static function appendPostConfig(array $config): array + { + $config['anonymizer_paths'][] = \realpath(\dirname(__DIR__, 3)) . '/Anonymization/Anonymizer'; + + return $config; + } + #[\Override] public function getConfigTreeBuilder(): TreeBuilder { diff --git a/src/Bridge/Symfony/DependencyInjection/DbToolsExtension.php b/src/Bridge/Symfony/DependencyInjection/DbToolsExtension.php index 9e631064..c70f75fc 100644 --- a/src/Bridge/Symfony/DependencyInjection/DbToolsExtension.php +++ b/src/Bridge/Symfony/DependencyInjection/DbToolsExtension.php @@ -21,6 +21,7 @@ public function load(array $configs, ContainerBuilder $container): void { $configuration = $this->getConfiguration($configs, $container); $config = $this->processConfiguration($configuration, $configs); + $config = DbToolsConfiguration::appendPostConfig($config); $loader = new YamlFileLoader($container, new FileLocator(\dirname(__DIR__).'/Resources/config')); $loader->load('services.yaml'); diff --git a/tests/Unit/Bridge/Symfony/DependencyInjection/DbToolsConfigurationTest.php b/tests/Unit/Bridge/Symfony/DependencyInjection/DbToolsConfigurationTest.php index f17abdbc..7b6b0800 100644 --- a/tests/Unit/Bridge/Symfony/DependencyInjection/DbToolsConfigurationTest.php +++ b/tests/Unit/Bridge/Symfony/DependencyInjection/DbToolsConfigurationTest.php @@ -25,7 +25,7 @@ private function processYamlConfiguration(array|string $dataOrFilename): array public function testConfigurationMinimal(): array { $result = $this->processYamlConfiguration( - __DIR__ . '/../../Resources/config/packages/db_tools_min.yaml' + \dirname(__DIR__, 4) . '/Resources/config/packages/db_tools_min.yaml' ); self::assertSame( @@ -63,7 +63,7 @@ public function testConfigurationMinimal(): array public function testConfigurationAlternative1(): array { $result = $this->processYamlConfiguration( - __DIR__ . '/../../Resources/config/packages/db_tools_alt1.yaml' + \dirname(__DIR__, 4) . '/Resources/config/packages/db_tools_alt1.yaml' ); self::assertSame( @@ -115,7 +115,7 @@ public function testConfigurationAlternative1(): array public function testConfigurationAlternative2(): array { $result = $this->processYamlConfiguration( - __DIR__ . '/../../Resources/config/packages/db_tools_alt2.yaml' + \dirname(__DIR__, 4) . '/Resources/config/packages/db_tools_alt2.yaml' ); self::assertSame(