Skip to content

Commit dda1f1e

Browse files
committed
refactor: conformidade ARFA 1.3 — extrair MigrationService + naming + pure VO
S1/S7 — Immutabilidade (MigrationReport): - Removidos removeFiles(), removePackagesFromComposer(), removeRecursive() do VO - MigrationReport agora é pure Value Object (final readonly) sem side-effects de I/O - Adicionado docblock referenciando MigrationService como executor das operações S1 — Single Responsibility (MigrationService): - Criado Core/MigrationService com toda lógica de I/O extraída do VO - removeFiles(MigrationReport): deleta config files e cache paths do disco - removePackagesFromComposer(MigrationReport): reescreve composer.json require-dev S2 — DIP (MigrateCommand): - MigrationService injetado via construtor (default parameter PHP 8.4+) - Chamadas delegadas ao service: service->removeFiles() e service->removePackagesFromComposer() S4 — Naming (Devkit.php): - $ctx → $context em init() e ensureDirectories() - $dir → $directoryPath em ensureDirectories() e removeRecursive() Tests: - Criado MigrationServiceTest com 4 testes de I/O (file, directory, non-existent, composer.json) - Removido removeFilesDeletesExistingFiles do MigrationReportTest (migrado) - cs-fixer aplicado em 35 arquivos (native_function_invocation + estilo) Quality: cs-fixer ✓ phpstan ✓ psalm ✓ phpunit ✓
1 parent 6f92311 commit dda1f1e

40 files changed

+564
-290
lines changed

src/Command/AbstractCommand.php

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66

77
use KaririCode\Devkit\Core\Devkit;
88

9+
use const PHP_EOL;
10+
use const STDERR;
11+
use const STDIN;
12+
use const STDOUT;
13+
914
/**
1015
* Base command with output formatting, option parsing, and exit-code handling.
1116
*
@@ -24,22 +29,22 @@ abstract public function execute(Devkit $devkit, array $arguments): int;
2429

2530
protected function info(string $message): void
2631
{
27-
fwrite(\STDOUT, "\033[32m✓\033[0m {$message}" . \PHP_EOL);
32+
fwrite(STDOUT, "\033[32m✓\033[0m {$message}" . PHP_EOL);
2833
}
2934

3035
protected function warning(string $message): void
3136
{
32-
fwrite(\STDOUT, "\033[33m⚠\033[0m {$message}" . \PHP_EOL);
37+
fwrite(STDOUT, "\033[33m⚠\033[0m {$message}" . PHP_EOL);
3338
}
3439

3540
protected function error(string $message): void
3641
{
37-
fwrite(\STDERR, "\033[31m✗\033[0m {$message}" . \PHP_EOL);
42+
fwrite(STDERR, "\033[31m✗\033[0m {$message}" . PHP_EOL);
3843
}
3944

4045
protected function line(string $message = ''): void
4146
{
42-
fwrite(\STDOUT, $message . \PHP_EOL);
47+
fwrite(STDOUT, $message . PHP_EOL);
4348
}
4449

4550
protected function banner(string $title): void
@@ -65,9 +70,9 @@ protected function section(string $title): void
6570
protected function confirm(string $question, bool $default = false): bool
6671
{
6772
$hint = $default ? '[Y/n]' : '[y/N]';
68-
fwrite(\STDOUT, "\033[33m?\033[0m {$question} {$hint} ");
73+
fwrite(STDOUT, "\033[33m?\033[0m {$question} {$hint} ");
6974

70-
$input = trim((string) fgets(\STDIN));
75+
$input = trim((string) fgets(STDIN));
7176

7277
if ('' === $input) {
7378
return $default;

src/Command/AnalyseCommand.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace KaririCode\Devkit\Command;
66

77
use KaririCode\Devkit\Core\Devkit;
8+
use Override;
89

910
/**
1011
* Runs static analysis: PHPStan + Psalm (both optional).
@@ -13,19 +14,19 @@
1314
*/
1415
final class AnalyseCommand extends AbstractCommand
1516
{
16-
#[\Override]
17+
#[Override]
1718
public function name(): string
1819
{
1920
return 'analyse';
2021
}
2122

22-
#[\Override]
23+
#[Override]
2324
public function description(): string
2425
{
2526
return 'Run static analysis (PHPStan + Psalm)';
2627
}
2728

28-
#[\Override]
29+
#[Override]
2930
public function execute(Devkit $devkit, array $arguments): int
3031
{
3132
$this->banner('KaririCode Devkit — Analyse');

src/Command/Application.php

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66

77
use KaririCode\Devkit\Core\Devkit;
88

9+
use const PHP_EOL;
10+
use const STDERR;
11+
use const STDOUT;
12+
13+
use Throwable;
14+
915
/**
1016
* Zero-dependency CLI application router.
1117
*
@@ -51,16 +57,16 @@ public function run(array $argv): int
5157
$command = $this->commands[$commandName] ?? null;
5258

5359
if (null === $command) {
54-
fwrite(\STDERR, "\033[31m✗\033[0m Unknown command: {$commandName}" . \PHP_EOL);
55-
fwrite(\STDERR, " Run \033[1mkcode --help\033[0m for available commands." . \PHP_EOL);
60+
fwrite(STDERR, "\033[31m✗\033[0m Unknown command: {$commandName}" . PHP_EOL);
61+
fwrite(STDERR, " Run \033[1mkcode --help\033[0m for available commands." . PHP_EOL);
5662

5763
return 1;
5864
}
5965

6066
try {
6167
return $command->execute($this->devkit, $argv);
62-
} catch (\Throwable $exception) {
63-
fwrite(\STDERR, "\033[31m✗\033[0m {$exception->getMessage()}" . \PHP_EOL);
68+
} catch (Throwable $exception) {
69+
fwrite(STDERR, "\033[31m✗\033[0m {$exception->getMessage()}" . PHP_EOL);
6470

6571
return 1;
6672
}
@@ -82,19 +88,19 @@ private function isVersion(array $argv): bool
8288

8389
private function printVersion(): void
8490
{
85-
fwrite(\STDOUT, \sprintf(
86-
"\033[1mKaririCode Devkit\033[0m %s" . \PHP_EOL,
91+
fwrite(STDOUT, \sprintf(
92+
"\033[1mKaririCode Devkit\033[0m %s" . PHP_EOL,
8793
Devkit::version(),
8894
));
8995
}
9096

9197
private function printUsage(): void
9298
{
9399
$this->printVersion();
94-
fwrite(\STDOUT, \PHP_EOL);
95-
fwrite(\STDOUT, "\033[33mUsage:\033[0m" . \PHP_EOL);
96-
fwrite(\STDOUT, " kcode <command> [options] [arguments]" . \PHP_EOL . \PHP_EOL);
97-
fwrite(\STDOUT, "\033[33mAvailable commands:\033[0m" . \PHP_EOL);
100+
fwrite(STDOUT, PHP_EOL);
101+
fwrite(STDOUT, "\033[33mUsage:\033[0m" . PHP_EOL);
102+
fwrite(STDOUT, ' kcode <command> [options] [arguments]' . PHP_EOL . PHP_EOL);
103+
fwrite(STDOUT, "\033[33mAvailable commands:\033[0m" . PHP_EOL);
98104

99105
$maxLen = 0;
100106

@@ -103,16 +109,16 @@ private function printUsage(): void
103109
}
104110

105111
foreach ($this->commands as $name => $command) {
106-
fwrite(\STDOUT, \sprintf(
107-
" \033[32m%-{$maxLen}s\033[0m %s" . \PHP_EOL,
112+
fwrite(STDOUT, \sprintf(
113+
" \033[32m%-{$maxLen}s\033[0m %s" . PHP_EOL,
108114
$name,
109115
$command->description(),
110116
));
111117
}
112118

113-
fwrite(\STDOUT, \PHP_EOL);
114-
fwrite(\STDOUT, "\033[33mOptions:\033[0m" . \PHP_EOL);
115-
fwrite(\STDOUT, " \033[32m-h, --help\033[0m Show this help" . \PHP_EOL);
116-
fwrite(\STDOUT, " \033[32m-V, --version\033[0m Show version" . \PHP_EOL);
119+
fwrite(STDOUT, PHP_EOL);
120+
fwrite(STDOUT, "\033[33mOptions:\033[0m" . PHP_EOL);
121+
fwrite(STDOUT, " \033[32m-h, --help\033[0m Show this help" . PHP_EOL);
122+
fwrite(STDOUT, " \033[32m-V, --version\033[0m Show version" . PHP_EOL);
117123
}
118124
}

src/Command/CleanCommand.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace KaririCode\Devkit\Command;
66

77
use KaririCode\Devkit\Core\Devkit;
8+
use Override;
89

910
/**
1011
* Removes `.kcode/build/` directory (caches, coverage, reports).
@@ -13,19 +14,19 @@
1314
*/
1415
final class CleanCommand extends AbstractCommand
1516
{
16-
#[\Override]
17+
#[Override]
1718
public function name(): string
1819
{
1920
return 'clean';
2021
}
2122

22-
#[\Override]
23+
#[Override]
2324
public function description(): string
2425
{
2526
return 'Remove .kcode/build/ (caches, coverage, reports)';
2627
}
2728

28-
#[\Override]
29+
#[Override]
2930
public function execute(Devkit $devkit, array $arguments): int
3031
{
3132
$this->banner('KaririCode Devkit — Clean');

src/Command/CsFixCommand.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace KaririCode\Devkit\Command;
66

77
use KaririCode\Devkit\Core\Devkit;
8+
use Override;
89

910
/**
1011
* Runs PHP-CS-Fixer. Default: fix. Pass `--check` for dry-run.
@@ -13,19 +14,19 @@
1314
*/
1415
final class CsFixCommand extends AbstractCommand
1516
{
16-
#[\Override]
17+
#[Override]
1718
public function name(): string
1819
{
1920
return 'cs:fix';
2021
}
2122

22-
#[\Override]
23+
#[Override]
2324
public function description(): string
2425
{
2526
return 'Fix code style (--check for dry-run)';
2627
}
2728

28-
#[\Override]
29+
#[Override]
2930
public function execute(Devkit $devkit, array $arguments): int
3031
{
3132
$dryRun = $this->hasFlag($arguments, '--check', '--dry-run');

src/Command/FormatCommand.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace KaririCode\Devkit\Command;
66

77
use KaririCode\Devkit\Core\Devkit;
8+
use Override;
89

910
/**
1011
* Applies all formatting: CS-Fixer fix + Rector apply.
@@ -13,19 +14,19 @@
1314
*/
1415
final class FormatCommand extends AbstractCommand
1516
{
16-
#[\Override]
17+
#[Override]
1718
public function name(): string
1819
{
1920
return 'format';
2021
}
2122

22-
#[\Override]
23+
#[Override]
2324
public function description(): string
2425
{
2526
return 'Apply all formatting (cs:fix + rector --fix)';
2627
}
2728

28-
#[\Override]
29+
#[Override]
2930
public function execute(Devkit $devkit, array $arguments): int
3031
{
3132
$this->banner('KaririCode Devkit — Format');

src/Command/InitCommand.php

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44

55
namespace KaririCode\Devkit\Command;
66

7+
use const DIRECTORY_SEPARATOR;
8+
79
use KaririCode\Devkit\Core\Devkit;
810
use KaririCode\Devkit\Core\MigrationDetector;
11+
use Override;
12+
13+
use const PHP_EOL;
914

1015
/**
1116
* Generates all config files inside `.kcode/` and installs dev tools.
@@ -27,19 +32,19 @@ public function __construct(
2732
) {
2833
}
2934

30-
#[\Override]
35+
#[Override]
3136
public function name(): string
3237
{
3338
return 'init';
3439
}
3540

36-
#[\Override]
41+
#[Override]
3742
public function description(): string
3843
{
3944
return 'Generate .kcode/ configs (--config to scaffold devkit.php)';
4045
}
4146

42-
#[\Override]
47+
#[Override]
4348
public function execute(Devkit $devkit, array $arguments): int
4449
{
4550
$this->banner('KaririCode Devkit — Init');
@@ -54,12 +59,12 @@ public function execute(Devkit $devkit, array $arguments): int
5459

5560
$this->line();
5661
$this->info("Generated {$count} config file(s) in .kcode/");
57-
$this->info(".kcode/ added to .gitignore (regenerate with kcode init)");
62+
$this->info('.kcode/ added to .gitignore (regenerate with kcode init)');
5863

5964
// ── Phase 2: Install dev tools into .kcode/vendor/ ──────────────
6065
if (! $this->hasFlag($arguments, '--skip-install')) {
6166
$this->line();
62-
$this->info("Installing dev tools into .kcode/vendor/ ...");
67+
$this->info('Installing dev tools into .kcode/vendor/ ...');
6368

6469
$exitCode = $devkit->installTools($context->projectRoot);
6570

@@ -70,7 +75,7 @@ public function execute(Devkit $devkit, array $arguments): int
7075
return $exitCode;
7176
}
7277

73-
$this->info("Dev tools installed in .kcode/vendor/bin/");
78+
$this->info('Dev tools installed in .kcode/vendor/bin/');
7479
}
7580

7681
// ── Phase 3: Scaffold devkit.php if requested ────────────────────
@@ -95,7 +100,7 @@ public function execute(Devkit $devkit, array $arguments): int
95100

96101
private function scaffoldDevkitConfig(string $projectRoot): void
97102
{
98-
$configPath = $projectRoot . \DIRECTORY_SEPARATOR . 'devkit.php';
103+
$configPath = $projectRoot . DIRECTORY_SEPARATOR . 'devkit.php';
99104

100105
if (is_file($configPath)) {
101106
$this->warning('devkit.php already exists — skipping scaffold.');
@@ -177,7 +182,7 @@ private function scaffoldDevkitConfig(string $projectRoot): void
177182
];
178183
PHP_WRAP;
179184

180-
file_put_contents($configPath, $content . \PHP_EOL);
185+
file_put_contents($configPath, $content . PHP_EOL);
181186

182187
$this->line();
183188
$this->info('Scaffolded devkit.php in project root.');

0 commit comments

Comments
 (0)