Skip to content

Commit

Permalink
Change design simple view from gacela list:modules
Browse files Browse the repository at this point in the history
  • Loading branch information
JesusValera committed Jun 26, 2023
1 parent 742e6c3 commit 9b3b883
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 31 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

### Unreleased

- Added command `gacela list:modules [--simple|-s]`
- Added command `gacela list:modules [--detailed|-d]`
- Fixed Windows support

### 1.4.0
Expand Down
6 changes: 6 additions & 0 deletions src/Console/Domain/AllAppModules/AppModule.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
final class AppModule
{
public function __construct(
private string $fullModuleName,
private string $moduleName,
private string $facadeClass,
private ?string $factoryClass = null,
Expand All @@ -15,6 +16,11 @@ public function __construct(
) {
}

public function fullModuleName(): string
{
return $this->fullModuleName;
}

public function moduleName(): string
{
return $this->moduleName;
Expand Down
20 changes: 17 additions & 3 deletions src/Console/Domain/AllAppModules/AppModuleCreator.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
use Gacela\Framework\ClassResolver\Factory\FactoryResolver;
use ReflectionClass;

use function strlen;

final class AppModuleCreator
{
public function __construct(
Expand All @@ -27,6 +29,7 @@ public function __construct(
public function fromClass(string $facadeClass): AppModule
{
return new AppModule(
$this->fullModuleName($facadeClass),
$this->moduleName($facadeClass),
$facadeClass,
$this->findFactory($facadeClass),
Expand All @@ -35,15 +38,26 @@ public function fromClass(string $facadeClass): AppModule
);
}

/**
* @param class-string $facadeClass
*/
private function fullModuleName(string $facadeClass): string
{
$moduleNameIndex = strrpos($facadeClass, '\\') ?: strlen($facadeClass);

return substr($facadeClass, 0, $moduleNameIndex);
}

/**
* @param class-string $facadeClass
*/
private function moduleName(string $facadeClass): string
{
$parts = explode('\\', $facadeClass);
array_pop($parts);
$fullModuleName = $this->fullModuleName($facadeClass);

$moduleName = strrchr($fullModuleName, '\\') ?: $fullModuleName;

return (string)end($parts);
return ltrim($moduleName, '\\');
}

/**
Expand Down
53 changes: 31 additions & 22 deletions src/Console/Infrastructure/Command/ListModulesCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Gacela\Console\Domain\AllAppModules\AppModule;
use Gacela\Framework\DocBlockResolverAwareTrait;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
Expand All @@ -25,55 +26,62 @@ protected function configure(): void
$this->setName('list:modules')
->setDescription('Render all modules found')
->addArgument('filter', InputArgument::OPTIONAL, 'Any filter to simplify the output')
->addOption('simple', 's', InputOption::VALUE_NONE, 'Display just the module names');
->addOption('detailed', 'd', InputOption::VALUE_NONE, 'Display all the modules in detail');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$filter = (string)$input->getArgument('filter');

$listOfModules = $this->generateListOfModules(
(bool)$input->getOption('simple'),
$this->generateListOfModules(
$output,
(bool)$input->getOption('detailed'),
$this->getFacade()->findAllAppModules($filter),
);

$output->write($listOfModules);

return self::SUCCESS;
}

/**
* @param list<AppModule> $modules
*/
private function generateListOfModules(bool $isSimple, array $modules): string
private function generateListOfModules(OutputInterface $output, bool $isDetailed, array $modules): void
{
return ($isSimple)
? $this->generateSimpleView($modules)
: $this->generateDetailedView($modules);
if ($isDetailed) {
$this->generateDetailedView($output, $modules);
return;
}

$this->generateSimpleView($output, $modules);
}

/**
* @param list<AppModule> $modules
*/
private function generateSimpleView(array $modules): string
private function generateSimpleView(OutputInterface $output, array $modules): void
{
$result = '';

foreach ($modules as $i => $module) {
$n = $i + 1;
$result .= <<<TXT
{$n}.- <fg=green>{$module->moduleName()}</>
TXT;
$rows = [];

foreach ($modules as $module) {
$rows[] = [
$module->fullModuleName(),
'✔️', // facade is always true
$module->factoryClass() ? '✔️' : '✖️',
$module->configClass() ? '✔️' : '✖️',
$module->dependencyProviderClass() ? '✔️' : '✖️',
];
}

return $result;
$table = new Table($output);
$table->setStyle('box');
$table->setHeaders(['Module namespace', 'Facade', 'Factory', 'Config', 'Dep. Provider']);
$table->setRows($rows);
$table->render();
}

/**
* @param list<AppModule> $modules
*/
private function generateDetailedView(array $modules): string
private function generateDetailedView(OutputInterface $output, array $modules): void
{
$result = '';
foreach ($modules as $i => $module) {
Expand All @@ -93,6 +101,7 @@ private function generateDetailedView(array $modules): string
TXT;
}
return $result;

$output->write($result);
}
}
14 changes: 9 additions & 5 deletions tests/Feature/Console/ListModules/ListModulesCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,24 @@ protected function setUp(): void

public function test_list_modules_simple(): void
{
$this->command->execute(['--simple' => null]);
$this->command->execute([]);

$expected = <<<TXT
1.- TestModule3
2.- TestModule1
3.- TestModule2
┌────────────────────────────────────────────────────────────┬────────┬─────────┬────────┬───────────────┐
│ Module namespace │ Facade │ Factory │ Config │ Dep. Provider │
├────────────────────────────────────────────────────────────┼────────┼─────────┼────────┼───────────────┤
│ GacelaTest\Feature\Console\ListModules\LevelUp\TestModule3 │ ✔️ │ ✔️ │ ✔️ │ ✖️ │
│ GacelaTest\Feature\Console\ListModules\TestModule1 │ ✔️ │ ✔️ │ ✖️ │ ✔️ │
│ GacelaTest\Feature\Console\ListModules\TestModule2 │ ✔️ │ ✖️ │ ✖️ │ ✖️ │
└────────────────────────────────────────────────────────────┴────────┴─────────┴────────┴───────────────┘
TXT;
self::assertSame($expected, $this->command->getDisplay());
}

public function test_list_modules(): void
{
$this->command->execute([]);
$this->command->execute(['--detailed' => null]);

$expected = <<<TXT
============================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
use GacelaTest\Integration\Console\AllAppModules\Domain\Module2\Module2Facade;
use PHPUnit\Framework\TestCase;

use function array_slice;

final class AllAppModulesFinderTest extends TestCase
{
private ConsoleFacade $consoleFacade;
Expand All @@ -30,13 +32,15 @@ public function test_find_all_app_modules(): void

$expected = [
new AppModule(
join('\\', array_slice(explode('\\', Module1Facade::class), 0, -1)),
'Module1',
Module1Facade::class,
Module1Factory::class,
Module1Config::class,
Module1DependencyProvider::class,
),
new AppModule(
join('\\', array_slice(explode('\\', Module2Facade::class), 0, -1)),
'Module2',
Module2Facade::class,
),
Expand All @@ -51,6 +55,7 @@ public function test_find_some_app_modules(): void

$expected = [
new AppModule(
join('\\', array_slice(explode('\\', Module1Facade::class), 0, -1)),
'Module1',
Module1Facade::class,
Module1Factory::class,
Expand Down

0 comments on commit 9b3b883

Please sign in to comment.