Skip to content

Commit 408d458

Browse files
committed
Add DCG command generator
1 parent 092fe2b commit 408d458

File tree

13 files changed

+149
-124
lines changed

13 files changed

+149
-124
lines changed

src/Command/Console/DcgCommand.php

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,12 @@
99
use DrupalCodeGenerator\GeneratorType;
1010
use DrupalCodeGenerator\Utils;
1111
use DrupalCodeGenerator\Validator\RegExp;
12+
use DrupalCodeGenerator\Validator\Required;
1213

13-
/**
14-
* Generates DCG command.
15-
*
16-
* @todo Clean-up.
17-
*/
1814
#[Generator(
1915
name: 'console:dcg-command',
2016
description: 'Generates DCG command',
2117
aliases: ['dcg-command'],
22-
// @todo Enable the generator once it is updated.
23-
hidden: TRUE,
2418
templatePath: Application::TEMPLATE_PATH . '/Console/_dcg-command',
2519
type: GeneratorType::MODULE_COMPONENT,
2620
label: 'DCG command',
@@ -33,31 +27,30 @@ final class DcgCommand extends BaseGenerator {
3327
protected function generate(array &$vars, Assets $assets): void {
3428
$ir = $this->createInterviewer($vars);
3529

36-
$command_name_validator = new RegExp('/^[a-z][a-z0-9-_:]*[a-z0-9]$/', 'The value is not correct command name.');
37-
$vars['command_name'] = $ir->ask('Command name', 'custom:example', $command_name_validator);
30+
$vars['machine_name'] = $ir->askMachineName();
31+
$vars['name'] = $ir->askName();
32+
$generator_name_validator = new RegExp('/^[a-z][a-z0-9-_:]*[a-z0-9]$/', 'The value is not correct generator name.');
33+
$vars['generator']['name'] = $ir->ask('Generator name', '{machine_name}:example', $generator_name_validator);
34+
$vars['generator']['description'] = $ir->ask('Generator description', validator: new Required());
3835

39-
$vars['description'] = $ir->ask('Command description');
40-
41-
$sub_names = \explode(':', $vars['command_name']);
36+
$sub_names = \explode(':', $vars['generator']['name']);
4237
$short_name = \array_pop($sub_names);
4338

44-
$alias_validator = new RegExp('/^[a-z0-9][a-z0-9_]+$/', 'The value is not correct alias name.');
45-
$vars['alias'] = $ir->ask('Command alias', $short_name, $alias_validator);
46-
47-
$vars['class'] = Utils::camelize($short_name);
48-
$vars['namespace'] = 'DrupalCodeGenerator';
39+
$vars['class'] = $ir->askClass(default: Utils::camelize($short_name));
4940
$vars['template_name'] = $short_name;
5041

51-
$vars['path'] = '';
52-
$file_path = '';
53-
if ($sub_names) {
54-
$vars['namespace'] .= '\\' . \implode('\\', $sub_names);
55-
$file_path = \implode(\DIRECTORY_SEPARATOR, $sub_names);
56-
$vars['path'] = '/' . $file_path;
42+
// Make service name using the following guides.
43+
// `foo:example` -> `foo.example` (not `foo:foo_example`)
44+
// `foo` -> `foo.foo` (not `foo`)
45+
$service_name = Utils::removePrefix($vars['generator']['name'], $vars['machine_name'] . ':');
46+
if (!$service_name) {
47+
$service_name = $vars['generator']['name'];
5748
}
49+
$vars['service_name'] = $vars['machine_name'] . '.' . \str_replace([':', '-'], '_', $service_name);
5850

59-
$assets->addFile($file_path . '/{class}.php', 'command.twig');
60-
$assets->addFile($file_path . '/{template_name}.twig', 'template.twig');
51+
$assets->addServicesFile('drush.services.yml')->template('drush.services.twig');
52+
$assets->addFile('src/Generator/{class}.php', 'generator.twig');
53+
$assets->addFile('templates/generator/{template_name}.twig', 'template.twig');
6154
}
6255

6356
}

templates/Console/_dcg-command/command.twig

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
services:
2+
{{ service_name }}:
3+
class: Drupal\{{ machine_name }}\Generator\{{ class }}
4+
tags:
5+
- { name: drush.generator.v3 }
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Drupal\{{ machine_name }}\Generator;
4+
5+
use DrupalCodeGenerator\Asset\AssetCollection as Assets;
6+
use DrupalCodeGenerator\Attribute\Generator;
7+
use DrupalCodeGenerator\Command\BaseGenerator;
8+
use DrupalCodeGenerator\GeneratorType;
9+
10+
#[Generator(
11+
name: '{{ generator.name }}',
12+
description: '{{ generator.description }}',
13+
templatePath: __DIR__ . '/../../templates/generator',
14+
type: GeneratorType::MODULE_COMPONENT,
15+
)]
16+
final class {{ class }} extends BaseGenerator {
17+
18+
/**
19+
* {@inheritdoc}
20+
*/
21+
protected function generate(array &$vars, Assets $assets): void {
22+
$ir = $this->createInterviewer($vars);
23+
24+
$vars['machine_name'] = $ir->askMachineName();
25+
$vars['name'] = $ir->askName();
26+
$vars['class'] = $ir->askClass(default: '{machine_name|camelize}');
27+
28+
$assets->addFile('src/{class}.php', '{{ template_name }}.twig');
29+
}
30+
31+
}
Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
{% verbatim %}<?php
1+
{% verbatim %}<?php declare(strict_types = 1);
22
33
namespace Drupal\{{ machine_name }};
44
55
/**
6-
* Some custom service of the {{ name }} module.
6+
* @todo Add a description for this class.
77
*/
8-
class {{ class }} {
8+
final class {{ class }} {
99
1010
/**
11-
* Method description.
11+
* @todo Add a description for this method.
1212
*/
13-
public function meow() {
14-
echo 'Meow!';
13+
public function example(): void {
14+
1515
}
1616
17-
}{% endverbatim %}
17+
}
18+
{% endverbatim %}

tests/functional/Generator/Console/DcgCommandTest.php

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@ final class DcgCommandTest extends GeneratorTestBase {
1212

1313
protected string $fixtureDir = __DIR__ . '/_dcg_command';
1414

15+
/**
16+
* Test callback.
17+
*/
1518
public function testGenerator(): void {
1619

17-
$this->markTestSkipped();
18-
1920
$input = [
20-
'custom:example',
21-
'Some description',
21+
'example',
22+
'Example',
23+
'example:foo-bar',
24+
'Example generator.',
25+
'FooBarGenerator',
26+
'example',
2227
'example',
2328
];
2429
$this->execute(DcgCommand::class, $input);
@@ -28,25 +33,35 @@ public function testGenerator(): void {
2833
Welcome to dcg-command generator!
2934
–––––––––––––––––––––––––––––––––––
3035
31-
Command name [custom:example]:
36+
Module machine name:
37+
38+
39+
Module name [Example]:
40+
41+
42+
Generator name [example:example]:
3243
3344
34-
Command description:
45+
Generator description:
3546
3647
37-
Command alias [example]:
48+
Class [FooBar]:
3849
3950
4051
The following directories and files have been created or updated:
4152
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
42-
• custom/Example.php
43-
• custom/example.twig
53+
• drush.services.yml
54+
• example.info.yml
55+
• src/Generator/FooBarGenerator.php
56+
• templates/generator/foo-bar.twig
4457

4558
TXT;
4659
$this->assertDisplay($expected_display);
4760

48-
$this->assertGeneratedFile('custom/Example.php');
49-
$this->assertGeneratedFile('custom/example.twig');
61+
$this->assertGeneratedFile('drush.services.yml');
62+
$this->assertGeneratedFile('example.info.yml');
63+
$this->assertGeneratedFile('src/Generator/FooBarGenerator.php');
64+
$this->assertGeneratedFile('templates/generator/foo-bar.twig');
5065
}
5166

5267
}

tests/functional/Generator/Console/_dcg_command/custom/Example.php

Lines changed: 0 additions & 31 deletions
This file was deleted.

tests/functional/Generator/Console/_dcg_command/custom/example.twig

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
services:
2+
example.foo_bar:
3+
class: Drupal\example\Generator\FooBarGenerator
4+
tags:
5+
- { name: drush.generator.v3 }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: 'Example'
2+
type: module
3+
description: '@todo Add description.'
4+
package: '@todo Add package'
5+
core_version_requirement: ^10

0 commit comments

Comments
 (0)