-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
[RFC][Console] Added console style guide helpers (v2) #14057
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
34 commits
Select commit
Hold shift + click to select a range
0c653a0
added console style guide helpers
kbond b2bd430
added FormatterInterface and default formatters
kbond c71222f
added warning result bar
kbond e20283f
added OutputDecorator
kbond 797a485
added comments
kbond c1c49c8
adjusted some formats
kbond bdb3704
added newline helper
kbond 7110316
FormatterInterface::format returns string only
kbond 4b30f14
fix cs
kbond a358431
fix string padding
kbond 99ebf0e
refactored and simplified
kbond 4d3e078
rename subtitle to section, fix docblocks
kbond 72708d7
refactored
kbond a59fe02
added table helper
kbond bafefd6
added question helpers
kbond d767d28
added style guide table style
kbond 273c187
added StandardQuestionHelper
kbond b0d2e6a
added table style to Table defaults
kbond 9d82d6a
added `askHidden` helper
kbond 525be2b
fix cs
kbond 16ad7b9
refactored, removed FormatterInterface
kbond de14472
match current style guide
kbond d4d6f52
added vertical padding for blocks
kbond a33d8a7
various fixes
kbond 18dbdb3
revert changes to FormatterHelper
kbond ae6d7a7
ensure formatter helper exists in QuestionHelper::writeError()
kbond 5c774cc
simplify style tag
kbond c36189a
rename StyleInterface::ln() to StyleInterface:newLine()
kbond 85cc04c
add StyleInterface::progress()
kbond e0efaa8
fix bug
kbond 91941f8
add OutputStyle::progressStart, progressAdvance, progressFinish
kbond 8143e77
remove StyleInterface::multipleChoice()
kbond f0cb90a
set custom progressbar characters only in non-windows environments
kbond bbdb37c
use DIRECTORY_SEPARATOR to detect Windows
kbond File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
106 changes: 106 additions & 0 deletions
106
src/Symfony/Component/Console/Helper/SymfonyQuestionHelper.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <fabien@symfony.com> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
namespace Symfony\Component\Console\Helper; | ||
|
||
use Symfony\Component\Console\Input\InputInterface; | ||
use Symfony\Component\Console\Output\OutputInterface; | ||
use Symfony\Component\Console\Question\ChoiceQuestion; | ||
use Symfony\Component\Console\Question\ConfirmationQuestion; | ||
use Symfony\Component\Console\Question\Question; | ||
use Symfony\Component\Console\Style\SymfonyStyle; | ||
|
||
/** | ||
* Symfony Style Guide compliant question helper. | ||
* | ||
* @author Kevin Bond <kevinbond@gmail.com> | ||
*/ | ||
class SymfonyQuestionHelper extends QuestionHelper | ||
{ | ||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function ask(InputInterface $input, OutputInterface $output, Question $question) | ||
{ | ||
$validator = $question->getValidator(); | ||
$question->setValidator(function ($value) use ($validator) { | ||
if (null !== $validator && is_callable($validator)) { | ||
$value = $validator($value); | ||
} | ||
|
||
// make required | ||
if (!is_array($value) && !is_bool($value) && 0 === strlen($value)) { | ||
throw new \Exception('A value is required.'); | ||
} | ||
|
||
return $value; | ||
}); | ||
|
||
return parent::ask($input, $output, $question); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
protected function writePrompt(OutputInterface $output, Question $question) | ||
{ | ||
$text = $question->getQuestion(); | ||
$default = $question->getDefault(); | ||
|
||
switch (true) { | ||
case null === $default: | ||
$text = sprintf(' <info>%s</info>:', $text); | ||
|
||
break; | ||
|
||
case $question instanceof ConfirmationQuestion: | ||
$text = sprintf(' <info>%s (yes/no)</info> [<comment>%s</comment>]:', $text, $default ? 'yes' : 'no'); | ||
|
||
break; | ||
|
||
case $question instanceof ChoiceQuestion: | ||
$choices = $question->getChoices(); | ||
$text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, $choices[$default]); | ||
|
||
break; | ||
|
||
default: | ||
$text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, $default); | ||
} | ||
|
||
$output->writeln($text); | ||
|
||
if ($question instanceof ChoiceQuestion) { | ||
$width = max(array_map('strlen', array_keys($question->getChoices()))); | ||
|
||
foreach ($question->getChoices() as $key => $value) { | ||
$output->writeln(sprintf(" [<comment>%-${width}s</comment>] %s", $key, $value)); | ||
} | ||
} | ||
|
||
$output->write(' > '); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
protected function writeError(OutputInterface $output, \Exception $error) | ||
{ | ||
if ($output instanceof SymfonyStyle) { | ||
$output->newLine(); | ||
$output->error($error->getMessage()); | ||
|
||
return; | ||
} | ||
|
||
parent::writeError($output, $error); | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <fabien@symfony.com> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
namespace Symfony\Component\Console\Style; | ||
|
||
use Symfony\Component\Console\Formatter\OutputFormatterInterface; | ||
use Symfony\Component\Console\Helper\ProgressBar; | ||
use Symfony\Component\Console\Output\OutputInterface; | ||
|
||
/** | ||
* Decorates output to add console style guide helpers | ||
* | ||
* @author Kevin Bond <kevinbond@gmail.com> | ||
*/ | ||
abstract class OutputStyle implements OutputInterface, StyleInterface | ||
{ | ||
private $output; | ||
|
||
/** | ||
* @param OutputInterface $output | ||
*/ | ||
public function __construct(OutputInterface $output) | ||
{ | ||
$this->output = $output; | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function newLine($count = 1) | ||
{ | ||
$this->output->write(str_repeat(PHP_EOL, $count)); | ||
} | ||
|
||
/** | ||
* @param int $max | ||
* | ||
* @return ProgressBar | ||
*/ | ||
public function createProgressBar($max = 0) | ||
{ | ||
return new ProgressBar($this->output, $max); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) | ||
{ | ||
$this->output->write($messages, $newline, $type); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function writeln($messages, $type = self::OUTPUT_NORMAL) | ||
{ | ||
$this->output->writeln($messages, $type); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function setVerbosity($level) | ||
{ | ||
$this->output->setVerbosity($level); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function getVerbosity() | ||
{ | ||
return $this->output->getVerbosity(); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function setDecorated($decorated) | ||
{ | ||
$this->output->setDecorated($decorated); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function isDecorated() | ||
{ | ||
return $this->output->isDecorated(); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function setFormatter(OutputFormatterInterface $formatter) | ||
{ | ||
$this->output->setFormatter($formatter); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function getFormatter() | ||
{ | ||
return $this->output->getFormatter(); | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Again, this public method isn't in the interface but it could be useful for users to create a custom ProgressBar. Let me know if you want me to change.