Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 5c34db4

Browse filesBrowse files
committed
resolve form type's FQCN in suggestions
1 parent 57599d8 commit 5c34db4
Copy full SHA for 5c34db4

File tree

Expand file treeCollapse file tree

5 files changed

+193
-19
lines changed
Filter options
Expand file treeCollapse file tree

5 files changed

+193
-19
lines changed

‎src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php
+3-2Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,13 @@ public function complete(CompletionInput $input, CompletionSuggestions $suggesti
138138
{
139139
if ($input->mustSuggestArgumentValuesFor('name')) {
140140
$suggestions->suggestValues(array_keys($this->router->getRouteCollection()->all()));
141+
142+
return;
141143
}
142144

143145
if ($input->mustSuggestOptionValuesFor('format')) {
144146
$helper = new DescriptorHelper();
145-
// @todo wait for getFormats() method to be implemented
146-
//$suggestions->suggestValues($helper->getFormats());
147+
$suggestions->suggestValues($helper->getFormats());
147148
}
148149
}
149150
}

‎src/Symfony/Bundle/FrameworkBundle/Tests/Functional/RouterDebugCommandTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Tests/Functional/RouterDebugCommandTest.php
+28Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Bundle\FrameworkBundle\Tests\Functional;
1313

1414
use Symfony\Bundle\FrameworkBundle\Console\Application;
15+
use Symfony\Component\Console\Tester\CommandCompletionTester;
1516
use Symfony\Component\Console\Tester\CommandTester;
1617

1718
/**
@@ -69,6 +70,33 @@ public function testSearchWithThrow()
6970
$tester->execute(['name' => 'gerard'], ['interactive' => true]);
7071
}
7172

73+
/**
74+
* @dataProvider provideCompletionSuggestions
75+
*/
76+
public function testComplete(array $input, array $expectedSuggestions)
77+
{
78+
$tester = new CommandCompletionTester($this->application->get('debug:router'));
79+
$this->assertSame($expectedSuggestions, $tester->complete($input));
80+
}
81+
82+
public function provideCompletionSuggestions()
83+
{
84+
yield 'option --format' => [
85+
['--format', ''],
86+
['txt', 'xml', 'json', 'md'],
87+
];
88+
89+
yield 'route_name' => [
90+
[''],
91+
[
92+
'routerdebug_session_welcome',
93+
'routerdebug_session_welcome_name',
94+
'routerdebug_session_logout',
95+
'routerdebug_test',
96+
],
97+
];
98+
}
99+
72100
private function createCommandTester(): CommandTester
73101
{
74102
$command = $this->application->get('debug:router');

‎src/Symfony/Component/Form/Command/DebugCommand.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Command/DebugCommand.php
+50-17Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -161,19 +161,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
161161

162162
private function getFqcnTypeClass(InputInterface $input, SymfonyStyle $io, string $shortClassName): string
163163
{
164-
$classes = [];
165-
sort($this->namespaces);
166-
foreach ($this->namespaces as $namespace) {
167-
if (class_exists($fqcn = $namespace.'\\'.$shortClassName)) {
168-
$classes[] = $fqcn;
169-
} elseif (class_exists($fqcn = $namespace.'\\'.ucfirst($shortClassName))) {
170-
$classes[] = $fqcn;
171-
} elseif (class_exists($fqcn = $namespace.'\\'.ucfirst($shortClassName).'Type')) {
172-
$classes[] = $fqcn;
173-
} elseif (str_ends_with($shortClassName, 'type') && class_exists($fqcn = $namespace.'\\'.ucfirst(substr($shortClassName, 0, -4).'Type'))) {
174-
$classes[] = $fqcn;
175-
}
176-
}
164+
$classes = $this->getFqcnTypeClasses($shortClassName);
177165

178166
if (0 === $count = \count($classes)) {
179167
$message = sprintf("Could not find type \"%s\" into the following namespaces:\n %s", $shortClassName, implode("\n ", $this->namespaces));
@@ -200,6 +188,25 @@ private function getFqcnTypeClass(InputInterface $input, SymfonyStyle $io, strin
200188
return $io->choice(sprintf("The type \"%s\" is ambiguous.\n\nSelect one of the following form types to display its information:", $shortClassName), $classes, $classes[0]);
201189
}
202190

191+
private function getFqcnTypeClasses(string $shortClassName): array
192+
{
193+
$classes = [];
194+
sort($this->namespaces);
195+
foreach ($this->namespaces as $namespace) {
196+
if (class_exists($fqcn = $namespace.'\\'.$shortClassName)) {
197+
$classes[] = $fqcn;
198+
} elseif (class_exists($fqcn = $namespace.'\\'.ucfirst($shortClassName))) {
199+
$classes[] = $fqcn;
200+
} elseif (class_exists($fqcn = $namespace.'\\'.ucfirst($shortClassName).'Type')) {
201+
$classes[] = $fqcn;
202+
} elseif (str_ends_with($shortClassName, 'type') && class_exists($fqcn = $namespace.'\\'.ucfirst(substr($shortClassName, 0, -4).'Type'))) {
203+
$classes[] = $fqcn;
204+
}
205+
}
206+
207+
return $classes;
208+
}
209+
203210
private function getCoreTypes(): array
204211
{
205212
$coreExtension = new CoreExtension();
@@ -248,12 +255,38 @@ private function findAlternatives(string $name, array $collection): array
248255
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
249256
{
250257
if ($input->mustSuggestArgumentValuesFor('class')) {
251-
$suggestions->suggestValues(array_keys($this->types));
258+
$suggestions->suggestValues(array_merge($this->getCoreTypes(), $this->types));
259+
260+
return;
252261
}
253262

254-
if ($input->mustSuggestOptionValuesFor('option') && null !== $class = $input->getArgument('class')) {
255-
$resolvedType = $this->formRegistry->getType($class);
256-
$suggestions->suggestValues($resolvedType->getOptionsResolver()->getDefinedOptions());
263+
if ($input->mustSuggestArgumentValuesFor('option') && null !== $class = $input->getArgument('class')) {
264+
$this->completeOptions($class, $suggestions);
265+
266+
return;
257267
}
268+
269+
if ($input->mustSuggestOptionValuesFor('format')) {
270+
$helper = new DescriptorHelper();
271+
$suggestions->suggestValues($helper->getFormats());
272+
}
273+
}
274+
275+
private function completeOptions(string $class, CompletionSuggestions $suggestions): void
276+
{
277+
if (!class_exists($class) || !is_subclass_of($class, FormTypeInterface::class)) {
278+
$classes = $this->getFqcnTypeClasses($class);
279+
280+
if (1 === count($classes)) {
281+
$class = $classes[0];
282+
}
283+
}
284+
285+
if (!$this->formRegistry->hasType($class)) {
286+
return;
287+
}
288+
289+
$resolvedType = $this->formRegistry->getType($class);
290+
$suggestions->suggestValues($resolvedType->getOptionsResolver()->getDefinedOptions());
258291
}
259292
}

‎src/Symfony/Component/Form/Tests/Command/DebugCommandTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Tests/Command/DebugCommandTest.php
+90Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\Console\Application;
1616
use Symfony\Component\Console\Exception\InvalidArgumentException;
17+
use Symfony\Component\Console\Tester\CommandCompletionTester;
1718
use Symfony\Component\Console\Tester\CommandTester;
1819
use Symfony\Component\Form\AbstractType;
1920
use Symfony\Component\Form\Command\DebugCommand;
21+
use Symfony\Component\Form\Extension\Core\CoreExtension;
22+
use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
2023
use Symfony\Component\Form\Extension\Core\Type\TextType;
2124
use Symfony\Component\Form\FormRegistry;
25+
use Symfony\Component\Form\FormTypeInterface;
2226
use Symfony\Component\Form\ResolvedFormTypeFactory;
2327
use Symfony\Component\OptionsResolver\Options;
2428
use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -186,6 +190,92 @@ class:%s
186190
, $tester->getDisplay(true));
187191
}
188192

193+
/**
194+
* @dataProvider provideCompletionSuggestions
195+
*/
196+
public function testComplete(array $input, array $expectedSuggestions)
197+
{
198+
$formRegistry = new FormRegistry([], new ResolvedFormTypeFactory());
199+
$command = new DebugCommand($formRegistry);
200+
$application = new Application();
201+
$application->add($command);
202+
$tester = new CommandCompletionTester($application->get('debug:form'));
203+
$this->assertSame($expectedSuggestions, $tester->complete($input));
204+
}
205+
206+
public function provideCompletionSuggestions(): iterable
207+
{
208+
yield 'option --format' => [
209+
['--format', ''],
210+
['txt', 'json'],
211+
];
212+
213+
yield 'form_type' => [
214+
[''],
215+
$this->getCoreTypes(),
216+
];
217+
218+
yield 'option for short name' => [
219+
['Symfony\\Component\\Form\\Extension\\Core\Type\\ButtonType', ''],
220+
[
221+
'block_name',
222+
'block_prefix',
223+
'disabled',
224+
'label',
225+
'label_format',
226+
'row_attr',
227+
'label_html',
228+
'label_translation_parameters',
229+
'attr_translation_parameters',
230+
'attr',
231+
'translation_domain',
232+
'auto_initialize',
233+
'priority',
234+
],
235+
];
236+
237+
yield 'option for FQCN' => [
238+
['ButtonType', ''],
239+
[
240+
'block_name',
241+
'block_prefix',
242+
'disabled',
243+
'label',
244+
'label_format',
245+
'row_attr',
246+
'label_html',
247+
'label_translation_parameters',
248+
'attr_translation_parameters',
249+
'attr',
250+
'translation_domain',
251+
'auto_initialize',
252+
'priority',
253+
],
254+
];
255+
256+
yield 'option for ambiguous form type' => [
257+
['Type', ''],
258+
[],
259+
];
260+
261+
yield 'option for invalid form type' => [
262+
['NotExistingFormType', ''],
263+
[],
264+
];
265+
}
266+
267+
private function getCoreTypes(): array
268+
{
269+
$coreExtension = new CoreExtension();
270+
$loadTypesRefMethod = (new \ReflectionObject($coreExtension))->getMethod('loadTypes');
271+
$loadTypesRefMethod->setAccessible(true);
272+
$coreTypes = $loadTypesRefMethod->invoke($coreExtension);
273+
$coreTypes = array_map(function (FormTypeInterface $type) { return \get_class($type); }, $coreTypes);
274+
sort($coreTypes);
275+
276+
return $coreTypes;
277+
}
278+
189279
private function createCommandTester(array $namespaces = ['Symfony\Component\Form\Extension\Core\Type'], array $types = [])
190280
{
191281
$formRegistry = new FormRegistry([], new ResolvedFormTypeFactory());

‎src/Symfony/Component/Messenger/Tests/Command/DebugCommandTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Tests/Command/DebugCommandTest.php
+22Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
namespace Symfony\Component\Messenger\Tests\Command;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Console\Application;
1516
use Symfony\Component\Console\Exception\RuntimeException;
17+
use Symfony\Component\Console\Tester\CommandCompletionTester;
1618
use Symfony\Component\Console\Tester\CommandTester;
1719
use Symfony\Component\Messenger\Command\DebugCommand;
1820
use Symfony\Component\Messenger\Tests\Fixtures\DummyCommand;
@@ -166,4 +168,24 @@ public function testExceptionOnUnknownBusArgument()
166168
$tester = new CommandTester($command);
167169
$tester->execute(['bus' => 'unknown_bus'], ['decorated' => false]);
168170
}
171+
172+
/**
173+
* @dataProvider provideCompletionSuggestions
174+
*/
175+
public function testComplete(array $input, array $expectedSuggestions)
176+
{
177+
$command = new DebugCommand(['command_bus' => [], 'query_bus' => []]);
178+
$application = new Application();
179+
$application->add($command);
180+
$tester = new CommandCompletionTester($application->get('debug:messenger'));
181+
$this->assertSame($expectedSuggestions, $tester->complete($input));
182+
}
183+
184+
public function provideCompletionSuggestions(): iterable
185+
{
186+
yield 'bus' => [
187+
[''],
188+
['command_bus', 'query_bus'],
189+
];
190+
}
169191
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.