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 a5f7b5be..9f5cbc55 100644 --- a/src/Helper/Cli/Bootstrap.php +++ b/src/Bridge/Standalone/Bootstrap.php @@ -2,12 +2,13 @@ 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\Bridge\Symfony\DependencyInjection\DbToolsConfiguration; use MakinaCorpus\DbToolsBundle\Command\Anonymization\AnonymizeCommand; use MakinaCorpus\DbToolsBundle\Command\Anonymization\AnonymizerListCommand; use MakinaCorpus\DbToolsBundle\Command\Anonymization\CleanCommand; @@ -17,12 +18,10 @@ use MakinaCorpus\DbToolsBundle\Command\RestoreCommand; use MakinaCorpus\DbToolsBundle\Command\StatsCommand; 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 +109,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 +120,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 +138,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 +322,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 +405,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/Database/StandaloneDatabaseSessionRegistry.php b/src/Bridge/Standalone/StandaloneDatabaseSessionRegistry.php similarity index 92% rename from src/Database/StandaloneDatabaseSessionRegistry.php rename to src/Bridge/Standalone/StandaloneDatabaseSessionRegistry.php index 1c4a7ae2..0d319ed0 100644 --- a/src/Database/StandaloneDatabaseSessionRegistry.php +++ b/src/Bridge/Standalone/StandaloneDatabaseSessionRegistry.php @@ -2,8 +2,9 @@ declare(strict_types=1); -namespace MakinaCorpus\DbToolsBundle\Database; +namespace MakinaCorpus\DbToolsBundle\Bridge\Standalone; +use MakinaCorpus\DbToolsBundle\Database\DatabaseSessionRegistry; use MakinaCorpus\DbToolsBundle\Error\ConfigurationException; use MakinaCorpus\QueryBuilder\BridgeFactory; use MakinaCorpus\QueryBuilder\DatabaseSession; diff --git a/src/Bridge/Symfony/DbToolsBundle.php b/src/Bridge/Symfony/DbToolsBundle.php index 7c879e6c..aa5d3f72 100644 --- a/src/Bridge/Symfony/DbToolsBundle.php +++ b/src/Bridge/Symfony/DbToolsBundle.php @@ -4,10 +4,10 @@ namespace MakinaCorpus\DbToolsBundle\Bridge\Symfony; +use MakinaCorpus\DbToolsBundle\Bridge\Symfony\DependencyInjection\DbToolsExtension; use MakinaCorpus\DbToolsBundle\Bridge\Symfony\DependencyInjection\Compiler\DbToolsPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; -use MakinaCorpus\DbToolsBundle\Bridge\Symfony\DependencyInjection\DbToolsExtension; class DbToolsBundle extends Bundle { 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/src/Database/DoctrineDatabaseSessionRegistry.php b/src/Bridge/Symfony/DoctrineDatabaseSessionRegistry.php similarity index 95% rename from src/Database/DoctrineDatabaseSessionRegistry.php rename to src/Bridge/Symfony/DoctrineDatabaseSessionRegistry.php index 2f377dc4..906aceb6 100644 --- a/src/Database/DoctrineDatabaseSessionRegistry.php +++ b/src/Bridge/Symfony/DoctrineDatabaseSessionRegistry.php @@ -2,14 +2,15 @@ declare(strict_types=1); -namespace MakinaCorpus\DbToolsBundle\Database; +namespace MakinaCorpus\DbToolsBundle\Bridge\Symfony; use Doctrine\DBAL\Connection; use Doctrine\Persistence\ManagerRegistry; +use MakinaCorpus\DbToolsBundle\Database\DatabaseSessionRegistry; use MakinaCorpus\DbToolsBundle\Error\NotImplementedException; -use MakinaCorpus\QueryBuilder\Bridge\Doctrine\DoctrineQueryBuilder; use MakinaCorpus\QueryBuilder\DatabaseSession; use MakinaCorpus\QueryBuilder\Dsn; +use MakinaCorpus\QueryBuilder\Bridge\Doctrine\DoctrineQueryBuilder; /** * doctrine/dbal based implementation. diff --git a/src/Bridge/Symfony/Resources/config/services.yaml b/src/Bridge/Symfony/Resources/config/services.yaml index 931eff45..e06e165b 100644 --- a/src/Bridge/Symfony/Resources/config/services.yaml +++ b/src/Bridge/Symfony/Resources/config/services.yaml @@ -59,7 +59,7 @@ services: # Database registry. db_tools.database_session.registry: - class: MakinaCorpus\DbToolsBundle\Database\DoctrineDatabaseSessionRegistry + class: MakinaCorpus\DbToolsBundle\Bridge\Symfony\DoctrineDatabaseSessionRegistry arguments: ['@doctrine'] # Utilities diff --git a/src/Test/FunctionalTestCase.php b/src/Test/FunctionalTestCase.php index 4b621048..1b241a26 100644 --- a/src/Test/FunctionalTestCase.php +++ b/src/Test/FunctionalTestCase.php @@ -17,8 +17,8 @@ use MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer\AnonymizerRegistry; use MakinaCorpus\DbToolsBundle\Anonymization\Config\AnonymizationConfig; use MakinaCorpus\DbToolsBundle\Anonymization\Config\AnonymizerConfig; +use MakinaCorpus\DbToolsBundle\Bridge\Symfony\DoctrineDatabaseSessionRegistry; use MakinaCorpus\DbToolsBundle\Database\DatabaseSessionRegistry; -use MakinaCorpus\DbToolsBundle\Database\DoctrineDatabaseSessionRegistry; use MakinaCorpus\QueryBuilder\Bridge\Doctrine\DoctrineQueryBuilder; use MakinaCorpus\QueryBuilder\DatabaseSession; use MakinaCorpus\QueryBuilder\Error\Server\DatabaseObjectDoesNotExistError; 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(