diff --git a/.gitignore b/.gitignore index 4ca84238..2e460e09 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ /.idea/ /.vscode/ /vendor/ +/TestModule/ .phpunit.* -.php_cs.cache \ No newline at end of file +.php_cs.cache diff --git a/src/CodeGenerator/CodeGeneratorConfig.php b/src/CodeGenerator/CodeGeneratorConfig.php new file mode 100644 index 00000000..01f70751 --- /dev/null +++ b/src/CodeGenerator/CodeGeneratorConfig.php @@ -0,0 +1,35 @@ +getCommandTemplateContent('facade-maker.txt'); + } + + public function getFactoryMakerTemplate(): string + { + return $this->getCommandTemplateContent('factory-maker.txt'); + } + + public function getConfigMakerTemplate(): string + { + return $this->getCommandTemplateContent('config-maker.txt'); + } + + public function getDependencyProviderMakerTemplate(): string + { + return $this->getCommandTemplateContent('dependency-provider-maker.txt'); + } + + private function getCommandTemplateContent(string $filename): string + { + return file_get_contents(__DIR__ . '/Infrastructure/Template/Command/' . $filename); + } +} diff --git a/src/CodeGenerator/CodeGeneratorFacade.php b/src/CodeGenerator/CodeGeneratorFacade.php index 2b1083e0..75a8a24f 100644 --- a/src/CodeGenerator/CodeGeneratorFacade.php +++ b/src/CodeGenerator/CodeGeneratorFacade.php @@ -48,17 +48,11 @@ final class CodeGeneratorFacade extends AbstractFacade */ public function runCommand(string $commandName, array $arguments = []): void { - [$rootNamespace, $targetDirectory] = array_pad($arguments, 2, null); + $commandArguments = $this->getFactory() + ->createCommandArgumentsParser() + ->parse($arguments); - if ($rootNamespace === null) { - throw new InvalidArgumentException('Expected 1st argument to be root-namespace of the project'); - } - - if ($targetDirectory === null) { - throw new InvalidArgumentException('Expected 2nd argument to be target-directory inside the project'); - } - - $this->createMaker($commandName)->make($rootNamespace, $targetDirectory); + $this->createMaker($commandName)->make($commandArguments); } private function createMaker(string $commandName): MakerInterface diff --git a/src/CodeGenerator/CodeGeneratorFactory.php b/src/CodeGenerator/CodeGeneratorFactory.php index 887f84c5..791d7909 100644 --- a/src/CodeGenerator/CodeGeneratorFactory.php +++ b/src/CodeGenerator/CodeGeneratorFactory.php @@ -9,10 +9,14 @@ use Gacela\CodeGenerator\Domain\Command\FacadeMaker; use Gacela\CodeGenerator\Domain\Command\FactoryMaker; use Gacela\CodeGenerator\Domain\Command\ModuleMaker; +use Gacela\CodeGenerator\Domain\Io\CommandArgumentsParser; use Gacela\CodeGenerator\Domain\Io\MakerIoInterface; use Gacela\CodeGenerator\Infrastructure\Io\SystemMakerIo; use Gacela\Framework\AbstractFactory; +/** + * @method CodeGeneratorConfig getConfig() + */ final class CodeGeneratorFactory extends AbstractFactory { public function createModuleMaker(): ModuleMaker @@ -31,28 +35,32 @@ public function createModuleMaker(): ModuleMaker public function createFacadeMaker(): FacadeMaker { return new FacadeMaker( - $this->createGeneratorIo() + $this->createGeneratorIo(), + $this->getConfig()->getFacadeMakerTemplate() ); } public function createFactoryMaker(): FactoryMaker { return new FactoryMaker( - $this->createGeneratorIo() + $this->createGeneratorIo(), + $this->getConfig()->getFactoryMakerTemplate() ); } public function createConfigMaker(): ConfigMaker { return new ConfigMaker( - $this->createGeneratorIo() + $this->createGeneratorIo(), + $this->getConfig()->getConfigMakerTemplate() ); } public function createDependencyProviderMaker(): DependencyProviderMaker { return new DependencyProviderMaker( - $this->createGeneratorIo() + $this->createGeneratorIo(), + $this->getConfig()->getDependencyProviderMakerTemplate() ); } @@ -60,4 +68,9 @@ private function createGeneratorIo(): MakerIoInterface { return new SystemMakerIo(); } + + public function createCommandArgumentsParser(): CommandArgumentsParser + { + return new CommandArgumentsParser(); + } } diff --git a/src/CodeGenerator/Domain/Command/AbstractMaker.php b/src/CodeGenerator/Domain/Command/AbstractMaker.php index c876d5d0..52d4719b 100644 --- a/src/CodeGenerator/Domain/Command/AbstractMaker.php +++ b/src/CodeGenerator/Domain/Command/AbstractMaker.php @@ -5,30 +5,39 @@ namespace Gacela\CodeGenerator\Domain\Command; use Gacela\CodeGenerator\Domain\Io\MakerIoInterface; +use Gacela\CodeGenerator\Domain\ReadModel\CommandArguments; abstract class AbstractMaker implements MakerInterface { private MakerIoInterface $io; + private string $template; - public function __construct(MakerIoInterface $io) + public function __construct(MakerIoInterface $io, string $template) { + $this->template = $template; $this->io = $io; } - public function make(string $rootNamespace, string $targetDirectory): void + public function make(CommandArguments $commandArguments): void { - $pieces = explode('/', $targetDirectory); + $pieces = explode('/', $commandArguments->targetDirectory()); $moduleName = end($pieces); - $this->io->createDirectory($targetDirectory); + $this->io->createDirectory($commandArguments->targetDirectory()); - $path = sprintf('%s/%s.php', $targetDirectory, $this->className()); - $this->io->filePutContents($path, $this->generateFileContent("$rootNamespace\\$moduleName")); + $path = sprintf('%s/%s.php', $commandArguments->targetDirectory(), $this->className()); + $this->io->filePutContents($path, $this->generateFileContent("{$commandArguments->rootNamespace()}\\$moduleName")); $this->io->writeln("> Path '$path' created successfully"); } - abstract protected function generateFileContent(string $namespace): string; - abstract protected function className(): string; + + private function generateFileContent(string $namespace): string + { + $search = ['$NAMESPACE$', '$CLASS_NAME$']; + $replace = [$namespace, $this->className()]; + + return str_replace($search, $replace, $this->template); + } } diff --git a/src/CodeGenerator/Domain/Command/ConfigMaker.php b/src/CodeGenerator/Domain/Command/ConfigMaker.php index a1f6bd9d..ec5828e9 100644 --- a/src/CodeGenerator/Domain/Command/ConfigMaker.php +++ b/src/CodeGenerator/Domain/Command/ConfigMaker.php @@ -6,24 +6,6 @@ final class ConfigMaker extends AbstractMaker { - protected function generateFileContent(string $namespace): string - { - return <<className()} extends AbstractConfig -{ -} - -TEXT; - } - protected function className(): string { return 'Config'; diff --git a/src/CodeGenerator/Domain/Command/DependencyProviderMaker.php b/src/CodeGenerator/Domain/Command/DependencyProviderMaker.php index b7f84a7f..2f974331 100644 --- a/src/CodeGenerator/Domain/Command/DependencyProviderMaker.php +++ b/src/CodeGenerator/Domain/Command/DependencyProviderMaker.php @@ -6,28 +6,6 @@ final class DependencyProviderMaker extends AbstractMaker { - protected function generateFileContent(string $namespace): string - { - return <<className()} extends AbstractDependencyProvider -{ - public function provideModuleDependencies(Container \$container): void - { - } -} - -TEXT; - } - protected function className(): string { return 'DependencyProvider'; diff --git a/src/CodeGenerator/Domain/Command/FacadeMaker.php b/src/CodeGenerator/Domain/Command/FacadeMaker.php index dbdbfc0c..81d6a025 100644 --- a/src/CodeGenerator/Domain/Command/FacadeMaker.php +++ b/src/CodeGenerator/Domain/Command/FacadeMaker.php @@ -6,27 +6,6 @@ final class FacadeMaker extends AbstractMaker { - protected function generateFileContent(string $namespace): string - { - return <<className()} extends AbstractFacade -{ -} - -TEXT; - } - protected function className(): string { return 'Facade'; diff --git a/src/CodeGenerator/Domain/Command/FactoryMaker.php b/src/CodeGenerator/Domain/Command/FactoryMaker.php index 0e6b3ca0..7cb04e3b 100644 --- a/src/CodeGenerator/Domain/Command/FactoryMaker.php +++ b/src/CodeGenerator/Domain/Command/FactoryMaker.php @@ -6,27 +6,6 @@ final class FactoryMaker extends AbstractMaker { - protected function generateFileContent(string $namespace): string - { - return <<className()} extends AbstractFactory -{ -} - -TEXT; - } - protected function className(): string { return 'Factory'; diff --git a/src/CodeGenerator/Domain/Command/MakerInterface.php b/src/CodeGenerator/Domain/Command/MakerInterface.php index 4459210d..a2f05f0b 100644 --- a/src/CodeGenerator/Domain/Command/MakerInterface.php +++ b/src/CodeGenerator/Domain/Command/MakerInterface.php @@ -4,7 +4,9 @@ namespace Gacela\CodeGenerator\Domain\Command; +use Gacela\CodeGenerator\Domain\ReadModel\CommandArguments; + interface MakerInterface { - public function make(string $rootNamespace, string $targetDirectory): void; + public function make(CommandArguments $commandArguments): void; } diff --git a/src/CodeGenerator/Domain/Command/ModuleMaker.php b/src/CodeGenerator/Domain/Command/ModuleMaker.php index beb553c8..62387a6a 100644 --- a/src/CodeGenerator/Domain/Command/ModuleMaker.php +++ b/src/CodeGenerator/Domain/Command/ModuleMaker.php @@ -5,6 +5,7 @@ namespace Gacela\CodeGenerator\Domain\Command; use Gacela\CodeGenerator\Domain\Io\MakerIoInterface; +use Gacela\CodeGenerator\Domain\ReadModel\CommandArguments; final class ModuleMaker implements MakerInterface { @@ -22,13 +23,13 @@ public function __construct(MakerIoInterface $io, array $generators) $this->generators = $generators; } - public function make(string $rootNamespace, string $targetDirectory): void + public function make(CommandArguments $commandArguments): void { foreach ($this->generators as $generator) { - $generator->make($rootNamespace, $targetDirectory); + $generator->make($commandArguments); } - $pieces = explode('/', $targetDirectory); + $pieces = explode('/', $commandArguments->targetDirectory()); $moduleName = end($pieces); $this->io->writeln("Module $moduleName created successfully"); } diff --git a/src/CodeGenerator/Domain/Io/CommandArgumentsParser.php b/src/CodeGenerator/Domain/Io/CommandArgumentsParser.php new file mode 100644 index 00000000..a519d786 --- /dev/null +++ b/src/CodeGenerator/Domain/Io/CommandArgumentsParser.php @@ -0,0 +1,29 @@ +rootNamespace = $rootNamespace; + $this->targetDirectory = $targetDirectory; + } + + public function rootNamespace(): string + { + return $this->rootNamespace; + } + + public function targetDirectory(): string + { + return $this->targetDirectory; + } +} diff --git a/src/CodeGenerator/Infrastructure/Template/Command/config-maker.txt b/src/CodeGenerator/Infrastructure/Template/Command/config-maker.txt new file mode 100644 index 00000000..0b5adbb2 --- /dev/null +++ b/src/CodeGenerator/Infrastructure/Template/Command/config-maker.txt @@ -0,0 +1,11 @@ +