diff --git a/app.php b/app.php index 874f0f4..957e7a7 100644 --- a/app.php +++ b/app.php @@ -2,13 +2,16 @@ use Opdavies\DrupalModuleGenerator\Command\GenerateDrupal7Command; use Symfony\Component\Console\Application; +use Symfony\Component\Finder\Finder; require_once __DIR__.'/vendor/autoload.php'; $app = new Application(); +$finder = new Finder(); + $app->addCommands([ - new GenerateDrupal7Command(), + new GenerateDrupal7Command($finder), ]); $app->run(); diff --git a/composer.json b/composer.json index 5674991..13f8bd9 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,9 @@ "type": "project", "require": { "symfony/console": "^5.0", - "symfony/dependency-injection": "^5.0" + "symfony/dependency-injection": "^5.0", + "symfony/filesystem": "^5.0", + "symfony/finder": "^5.0" }, "require-dev": { "php": "5.6 || ^7.0", diff --git a/composer.lock b/composer.lock index f04f49c..f866f4a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "21bd996a5a5331085c6854ddc3f384f2", + "content-hash": "eec04f9d7e938466a1a1782750a35b63", "packages": [ { "name": "psr/container", @@ -204,6 +204,163 @@ "homepage": "https://symfony.com", "time": "2020-01-31T09:49:43+00:00" }, + { + "name": "symfony/filesystem", + "version": "v5.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3afadc0f57cd74f86379d073e694b0f2cda2a88c", + "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2020-01-21T08:40:24+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", + "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", + "shasum": "" + }, + "require": { + "php": "^7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2020-01-04T14:08:26+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2019-11-27T13:56:44+00:00" + }, { "name": "symfony/polyfill-mbstring", "version": "v1.13.1", @@ -1817,64 +1974,6 @@ "homepage": "https://github.com/sebastianbergmann/version", "time": "2020-01-21T06:36:37+00:00" }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.13.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "time": "2019-11-27T13:56:44+00:00" - }, { "name": "symfony/var-dumper", "version": "v5.0.4", diff --git a/fixtures/drupal7_module/drupal7_module.info b/fixtures/drupal7_module/drupal7_module.info new file mode 100644 index 0000000..96ec5b6 --- /dev/null +++ b/fixtures/drupal7_module/drupal7_module.info @@ -0,0 +1,3 @@ +name = {{ name }} +description = The description for {{ name }}. +core = 7.x diff --git a/src/Command/GenerateDrupal7Command.php b/src/Command/GenerateDrupal7Command.php index c7d86b4..1bd6a6e 100644 --- a/src/Command/GenerateDrupal7Command.php +++ b/src/Command/GenerateDrupal7Command.php @@ -7,11 +7,31 @@ use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Finder\Finder; +use Symfony\Component\Finder\SplFileInfo; class GenerateDrupal7Command extends Command { + /** @var Filesystem */ + private $filesystem; + + /** @var Finder */ + private $finder; + + /** @var SymfonyStyle $io */ + private $io; + private $moduleName; + public function __construct(Finder $finder, string $name = null) + { + parent::__construct($name); + + $this->finder = $finder; + } + /** * {@inheritdoc} */ @@ -32,11 +52,14 @@ class GenerateDrupal7Command extends Command */ protected function execute(InputInterface $input, OutputInterface $output) { + $this->io = new SymfonyStyle($input, $output); + $this->moduleName = $input->getArgument('module-name'); - $this->ensureDirectoryDoesNotExist(); - - mkdir($this->moduleName); + $this + ->ensureDirectoryDoesNotExist() + ->createModuleDirectory() + ->createFiles(); return 0; } @@ -49,5 +72,40 @@ class GenerateDrupal7Command extends Command if (is_dir($this->moduleName)) { throw CannotCreateModuleException::directoryAlreadyExists(); } + + return $this; + } + + private function createModuleDirectory() + { + mkdir($this->moduleName); + + return $this; + } + + private function createFiles() + { + $createdFiles = []; + + /** @var SplFileInfo $file */ + foreach ($this->finder->in('fixtures/drupal7_module')->name('/.info/') as $file) { + $contents = $this->updateFileContents($file->getContents()); + + file_put_contents( + "{$this->moduleName}/{$this->moduleName}.{$file->getExtension()}", + $contents + ); + + $createdFiles[] = "{$this->moduleName}.{$file->getExtension()}"; + } + + $this->io->definitionList($createdFiles); + } + + private function updateFileContents($contents) + { + $contents = str_replace('{{ name }}', $this->moduleName, $contents); + + return $contents; } } diff --git a/tests/Command/GenerateDrupal7ModuleCommandTest.php b/tests/Command/GenerateDrupal7ModuleCommandTest.php index 1540b8e..a67f2a4 100644 --- a/tests/Command/GenerateDrupal7ModuleCommandTest.php +++ b/tests/Command/GenerateDrupal7ModuleCommandTest.php @@ -6,12 +6,14 @@ use Opdavies\DrupalModuleGenerator\Command\GenerateDrupal7Command; use Opdavies\DrupalModuleGenerator\Exception\CannotCreateModuleException; use Symfony\Component\Console\Tester\CommandTester; use PHPUnit\Framework\TestCase; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Finder\Finder; class GenerateDrupal7ModuleCommandTest extends TestCase { protected function tearDown(): void { - rmdir('test_module'); + (new Filesystem())->remove('test_module'); } /** @test */ @@ -20,7 +22,10 @@ class GenerateDrupal7ModuleCommandTest extends TestCase $this->expectExceptionObject(CannotCreateModuleException::directoryAlreadyExists()); - $commandTester = new CommandTester(new GenerateDrupal7Command()); + $finder = new Finder(); + $command = new GenerateDrupal7Command($finder); + + $commandTester = new CommandTester($command); $commandTester->execute([ 'module-name' => 'test_module' ]); @@ -29,17 +34,33 @@ class GenerateDrupal7ModuleCommandTest extends TestCase /** @test */ public function it_creates_a_new_module_directory() { - $commandTester = new CommandTester(new GenerateDrupal7Command()); + $finder = new Finder(); + $command = new GenerateDrupal7Command($finder); + + $commandTester = new CommandTester($command); $commandTester->execute([ 'module-name' => 'test_module', ]); $this->assertTrue(is_dir('test_module')); } + + /** @test */ + public function it_generates_an_info_file() + { + $finder = new Finder(); + $command = new GenerateDrupal7Command($finder); + + $commandTester = new CommandTester($command); + $commandTester->execute([ + 'module-name' => 'test_module', ]); - $this->assertTrue(is_dir('my-new-drupal-module')); + $this->assertTrue(is_file('test_module/test_module.info')); - rmdir('my-new-drupal-module'); + $contents = file_get_contents('test_module/test_module.info'); + + $this->assertStringContainsString('name = test_module', $contents); + $this->assertStringContainsString('description = The description for test_module.', $contents); } }