Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c3f09e6

Browse files
author
Rokas Mikalkėnas
committed
[Dotenv] Variable filter added to debug command
1 parent d096349 commit c3f09e6

File tree

3 files changed

+133
-10
lines changed

3 files changed

+133
-10
lines changed

src/Symfony/Component/Dotenv/CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
6.2
5+
---
6+
7+
* Add new `name` argument to `debug:dotenv` command to be able to filter certain variable
8+
49
5.4
510
---
611

src/Symfony/Component/Dotenv/Command/DebugCommand.php

+44-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\Console\Attribute\AsCommand;
1515
use Symfony\Component\Console\Command\Command;
16+
use Symfony\Component\Console\Input\InputArgument;
1617
use Symfony\Component\Console\Input\InputInterface;
1718
use Symfony\Component\Console\Output\OutputInterface;
1819
use Symfony\Component\Console\Style\SymfonyStyle;
@@ -47,6 +48,22 @@ public function __construct(string $kernelEnvironment, string $projectDirectory)
4748
parent::__construct();
4849
}
4950

51+
protected function configure(): void
52+
{
53+
$this
54+
->setDefinition([
55+
new InputArgument('name', InputArgument::OPTIONAL, 'The name of variable to filter for debug.', null, $this->getAvailableVars(...)),
56+
])
57+
->setHelp(<<<'EOT'
58+
<info>php %command.full_name% </info>
59+
60+
To get specific variable, specify its name:
61+
62+
<info>php %command.full_name% FOO_BAR</info>
63+
EOT
64+
);
65+
}
66+
5067
protected function execute(InputInterface $input, OutputInterface $output): int
5168
{
5269
$io = new SymfonyStyle($input, $output);
@@ -78,25 +95,36 @@ protected function execute(InputInterface $input, OutputInterface $output): int
7895
: sprintf('<fg=red>⨯</> %s', $envFile);
7996
}, $envFiles));
8097

98+
$nameFilter = $input->getArgument('name');
99+
$variables = $this->getVariables($availableFiles, $nameFilter);
100+
81101
$io->section('Variables');
82-
$io->table(
83-
array_merge(['Variable', 'Value'], $availableFiles),
84-
$this->getVariables($availableFiles)
85-
);
86102

87-
$io->comment('Note real values might be different between web and CLI.');
103+
if ($variables || null === $nameFilter) {
104+
$io->table(
105+
array_merge(['Variable', 'Value'], $availableFiles),
106+
$this->getVariables($availableFiles, $nameFilter)
107+
);
108+
109+
$io->comment('Note real values might be different between web and CLI.');
110+
} else {
111+
$io->warning(sprintf('No variables match given name "%s".', $nameFilter));
112+
}
88113

89114
return 0;
90115
}
91116

92-
private function getVariables(array $envFiles): array
117+
private function getVariables(array $envFiles, ?string $nameFilter): array
93118
{
94-
$vars = explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? '');
95-
sort($vars);
119+
$vars = $this->getAvailableVars();
96120

97121
$output = [];
98122
$fileValues = [];
99123
foreach ($vars as $var) {
124+
if (null !== $nameFilter && 0 !== stripos($var, $nameFilter)) {
125+
continue;
126+
}
127+
100128
$realValue = $_SERVER[$var];
101129
$varDetails = [$var, $realValue];
102130
foreach ($envFiles as $envFile) {
@@ -113,6 +141,14 @@ private function getVariables(array $envFiles): array
113141
return $output;
114142
}
115143

144+
private function getAvailableVars(): array
145+
{
146+
$vars = explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? '');
147+
sort($vars);
148+
149+
return $vars;
150+
}
151+
116152
private function getEnvFiles(): array
117153
{
118154
$files = [

src/Symfony/Component/Dotenv/Tests/Command/DebugCommandTest.php

+84-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\Console\Helper\FormatterHelper;
1616
use Symfony\Component\Console\Helper\HelperSet;
17+
use Symfony\Component\Console\Tester\CommandCompletionTester;
1718
use Symfony\Component\Console\Tester\CommandTester;
1819
use Symfony\Component\Dotenv\Command\DebugCommand;
1920
use Symfony\Component\Dotenv\Dotenv;
@@ -138,15 +139,96 @@ public function testWarningOnPhpEnvFile()
138139
$this->assertStringContainsString('[WARNING] Due to existing dump file (.env.local.php)', $output);
139140
}
140141

141-
private function executeCommand(string $projectDirectory, string $env): string
142+
public function testScenario1InDevEnvWithNameFilter()
143+
{
144+
$output = $this->executeCommand(__DIR__.'/Fixtures/Scenario1', 'dev', ['name' => 'FoO']);
145+
146+
// Scanned Files
147+
$this->assertStringContainsString('⨯ .env.local.php', $output);
148+
$this->assertStringContainsString('⨯ .env.dev.local', $output);
149+
$this->assertStringContainsString('⨯ .env.dev', $output);
150+
$this->assertStringContainsString('✓ .env.local', $output);
151+
$this->assertStringContainsString('✓ .env'.\PHP_EOL, $output);
152+
153+
// Skipped Files
154+
$this->assertStringNotContainsString('.env.prod', $output);
155+
$this->assertStringNotContainsString('.env.test', $output);
156+
$this->assertStringNotContainsString('.env.dist', $output);
157+
158+
// Variables
159+
$this->assertStringContainsString('Variable Value .env.local .env', $output);
160+
$this->assertStringContainsString('FOO baz baz bar', $output);
161+
$this->assertStringNotContainsString('TEST123 true n/a true', $output);
162+
}
163+
164+
public function testScenario1InProdEnvWithMissingNameFilter()
165+
{
166+
$output = $this->executeCommand(__DIR__.'/Fixtures/Scenario1', 'prod', ['name' => 'unknown']);
167+
168+
// Scanned Files
169+
$this->assertStringContainsString('⨯ .env.local.php', $output);
170+
$this->assertStringContainsString('✓ .env.prod.local', $output);
171+
$this->assertStringContainsString('⨯ .env.prod', $output);
172+
$this->assertStringContainsString('✓ .env.local', $output);
173+
$this->assertStringContainsString('✓ .env'.\PHP_EOL, $output);
174+
175+
// Skipped Files
176+
$this->assertStringNotContainsString('.env.dev', $output);
177+
$this->assertStringNotContainsString('.env.test', $output);
178+
$this->assertStringNotContainsString('.env.dist', $output);
179+
180+
// Variables
181+
$this->assertStringContainsString('[WARNING] No variables match given name "unknown".', $output);
182+
$this->assertStringNotContainsString('Variable Value .env.prod.local .env.local .env', $output);
183+
$this->assertStringNotContainsString('FOO baz n/a baz bar', $output);
184+
$this->assertStringNotContainsString('HELLO world world n/a n/a', $output);
185+
$this->assertStringNotContainsString('TEST123 true n/a n/a true', $output);
186+
}
187+
188+
public function testScenario2InProdEnvWithNameFilterPrefix()
189+
{
190+
$output = $this->executeCommand(__DIR__.'/Fixtures/Scenario2', 'prod', ['name' => 'tes']);
191+
192+
// Scanned Files
193+
$this->assertStringContainsString('✓ .env.local.php', $output);
194+
$this->assertStringContainsString('⨯ .env.prod.local', $output);
195+
$this->assertStringContainsString('✓ .env.prod', $output);
196+
$this->assertStringContainsString('⨯ .env.local', $output);
197+
$this->assertStringContainsString('✓ .env.dist', $output);
198+
199+
// Skipped Files
200+
$this->assertStringNotContainsString('.env'.\PHP_EOL, $output);
201+
$this->assertStringNotContainsString('.env.dev', $output);
202+
$this->assertStringNotContainsString('.env.test', $output);
203+
204+
// Variables
205+
$this->assertStringContainsString('Variable Value .env.local.php .env.prod .env.dist', $output);
206+
$this->assertStringNotContainsString('FOO BaR BaR BaR n/a', $output);
207+
$this->assertStringContainsString('TEST 1234 1234 1234 0000', $output);
208+
}
209+
210+
public function testCompletion()
211+
{
212+
$env = 'prod';
213+
$projectDirectory = __DIR__.'/Fixtures/Scenario2';
214+
215+
$_SERVER['TEST_ENV_KEY'] = $env;
216+
(new Dotenv('TEST_ENV_KEY'))->bootEnv($projectDirectory.'/.env');
217+
218+
$command = new DebugCommand($env, $projectDirectory);
219+
$tester = new CommandCompletionTester($command);
220+
$this->assertSame(['FOO', 'HELLO', 'TEST', 'TEST123'], $tester->complete(['']));
221+
}
222+
223+
private function executeCommand(string $projectDirectory, string $env, array $input = []): string
142224
{
143225
$_SERVER['TEST_ENV_KEY'] = $env;
144226
(new Dotenv('TEST_ENV_KEY'))->bootEnv($projectDirectory.'/.env');
145227

146228
$command = new DebugCommand($env, $projectDirectory);
147229
$command->setHelperSet(new HelperSet([new FormatterHelper()]));
148230
$tester = new CommandTester($command);
149-
$tester->execute([]);
231+
$tester->execute($input);
150232

151233
return $tester->getDisplay();
152234
}

0 commit comments

Comments
 (0)