From: Nicolas Hart Date: Fri, 28 Jul 2017 22:30:22 +0000 (+0200) Subject: Better rendering for all core commands X-Git-Tag: 2.3.0~31^2~29^2 X-Git-Url: https://git.immae.eu/?a=commitdiff_plain;h=e1b33efb3dd7c9ebb4dcfb23a2ca5efbda0a05f6;p=github%2Fwallabag%2Fwallabag.git Better rendering for all core commands --- diff --git a/src/Wallabag/CoreBundle/Command/CleanDuplicatesCommand.php b/src/Wallabag/CoreBundle/Command/CleanDuplicatesCommand.php index b4aa4e47..1caaa391 100644 --- a/src/Wallabag/CoreBundle/Command/CleanDuplicatesCommand.php +++ b/src/Wallabag/CoreBundle/Command/CleanDuplicatesCommand.php @@ -7,13 +7,14 @@ use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; use Wallabag\CoreBundle\Entity\Entry; use Wallabag\UserBundle\Entity\User; class CleanDuplicatesCommand extends ContainerAwareCommand { - /** @var OutputInterface */ - protected $output; + /** @var SymfonyStyle */ + protected $io; protected $duplicates = 0; @@ -32,7 +33,7 @@ class CleanDuplicatesCommand extends ContainerAwareCommand protected function execute(InputInterface $input, OutputInterface $output) { - $this->output = $output; + $this->io = new SymfonyStyle($input, $output); $username = $input->getArgument('username'); @@ -41,20 +42,22 @@ class CleanDuplicatesCommand extends ContainerAwareCommand $user = $this->getUser($username); $this->cleanDuplicates($user); } catch (NoResultException $e) { - $output->writeln(sprintf('User "%s" not found.', $username)); + $this->io->error(sprintf('User "%s" not found.', $username)); return 1; } + + $this->io->success('Finished cleaning.'); } else { $users = $this->getContainer()->get('wallabag_user.user_repository')->findAll(); - $output->writeln(sprintf('Cleaning through %d user accounts', count($users))); + $this->io->text(sprintf('Cleaning through %d user accounts', count($users))); foreach ($users as $user) { - $output->writeln(sprintf('Processing user %s', $user->getUsername())); + $this->io->text(sprintf('Processing user %s', $user->getUsername())); $this->cleanDuplicates($user); } - $output->writeln(sprintf('Finished cleaning. %d duplicates found in total', $this->duplicates)); + $this->io->success(sprintf('Finished cleaning. %d duplicates found in total', $this->duplicates)); } return 0; @@ -88,7 +91,7 @@ class CleanDuplicatesCommand extends ContainerAwareCommand $this->duplicates += $duplicatesCount; - $this->output->writeln(sprintf('Cleaned %d duplicates for user %s', $duplicatesCount, $user->getUserName())); + $this->io->text(sprintf('Cleaned %d duplicates for user %s', $duplicatesCount, $user->getUserName())); } private function similarUrl($url) diff --git a/src/Wallabag/CoreBundle/Command/ExportCommand.php b/src/Wallabag/CoreBundle/Command/ExportCommand.php index 291926e4..b07087c8 100644 --- a/src/Wallabag/CoreBundle/Command/ExportCommand.php +++ b/src/Wallabag/CoreBundle/Command/ExportCommand.php @@ -7,6 +7,7 @@ use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; class ExportCommand extends ContainerAwareCommand { @@ -31,10 +32,12 @@ class ExportCommand extends ContainerAwareCommand protected function execute(InputInterface $input, OutputInterface $output) { + $io = new SymfonyStyle($input, $output); + try { $user = $this->getContainer()->get('wallabag_user.user_repository')->findOneByUserName($input->getArgument('username')); } catch (NoResultException $e) { - $output->writeln(sprintf('User "%s" not found.', $input->getArgument('username'))); + $io->error(sprintf('User "%s" not found.', $input->getArgument('username'))); return 1; } @@ -44,7 +47,7 @@ class ExportCommand extends ContainerAwareCommand ->getQuery() ->getResult(); - $output->write(sprintf('Exporting %d entrie(s) for user « %s »... ', count($entries), $user->getUserName())); + $io->text(sprintf('Exporting %d entrie(s) for user %s...', count($entries), $user->getUserName())); $filePath = $input->getArgument('filepath'); @@ -60,12 +63,12 @@ class ExportCommand extends ContainerAwareCommand ->exportJsonData(); file_put_contents($filePath, $data); } catch (\InvalidArgumentException $e) { - $output->writeln(sprintf('Error: "%s"', $e->getMessage())); + $io->error(sprintf('Error: "%s"', $e->getMessage())); return 1; } - $output->writeln('Done.'); + $io->success('Done.'); return 0; } diff --git a/src/Wallabag/CoreBundle/Command/InstallCommand.php b/src/Wallabag/CoreBundle/Command/InstallCommand.php index c7809053..877dbfa2 100644 --- a/src/Wallabag/CoreBundle/Command/InstallCommand.php +++ b/src/Wallabag/CoreBundle/Command/InstallCommand.php @@ -6,14 +6,13 @@ use Craue\ConfigBundle\Entity\Setting; use FOS\UserBundle\Event\UserEvent; use FOS\UserBundle\FOSUserEvents; use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; -use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\BufferedOutput; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ConfirmationQuestion; use Symfony\Component\Console\Question\Question; +use Symfony\Component\Console\Style\SymfonyStyle; class InstallCommand extends ContainerAwareCommand { @@ -23,9 +22,9 @@ class InstallCommand extends ContainerAwareCommand protected $defaultInput; /** - * @var OutputInterface + * @var SymfonyStyle */ - protected $defaultOutput; + protected $io; /** * @var array @@ -52,10 +51,10 @@ class InstallCommand extends ContainerAwareCommand protected function execute(InputInterface $input, OutputInterface $output) { $this->defaultInput = $input; - $this->defaultOutput = $output; - $output->writeln('Installing wallabag...'); - $output->writeln(''); + $this->io = new SymfonyStyle($input, $output); + + $this->io->title('Wallabag installer'); $this ->checkRequirements() @@ -65,13 +64,14 @@ class InstallCommand extends ContainerAwareCommand ->runMigrations() ; - $output->writeln('wallabag has been successfully installed.'); - $output->writeln('Just execute `php bin/console server:run --env=prod` for using wallabag: http://localhost:8000'); + $this->io->success('Wallabag has been successfully installed.'); + $this->io->note('Just execute `php bin/console server:run --env=prod` for using wallabag: http://localhost:8000'); } protected function checkRequirements() { - $this->defaultOutput->writeln('Step 1 of 5. Checking system requirements.'); + $this->io->section('Step 1 of 5: Checking system requirements.'); + $doctrineManager = $this->getContainer()->get('doctrine')->getManager(); $rows = []; @@ -156,30 +156,24 @@ class InstallCommand extends ContainerAwareCommand $rows[] = [$label, $status, $help]; } - $table = new Table($this->defaultOutput); - $table - ->setHeaders(['Checked', 'Status', 'Recommendation']) - ->setRows($rows) - ->render(); + $this->io->table(['Checked', 'Status', 'Recommendation'], $rows); if (!$fulfilled) { throw new \RuntimeException('Some system requirements are not fulfilled. Please check output messages and fix them.'); } - $this->defaultOutput->writeln('Success! Your system can run wallabag properly.'); - - $this->defaultOutput->writeln(''); + $this->io->success('Success! Your system can run wallabag properly.'); return $this; } protected function setupDatabase() { - $this->defaultOutput->writeln('Step 2 of 5. Setting up database.'); + $this->io->section('Step 2 of 5: Setting up database.'); // user want to reset everything? Don't care about what is already here if (true === $this->defaultInput->getOption('reset')) { - $this->defaultOutput->writeln('Dropping database, creating database and schema, clearing the cache'); + $this->io->text('Dropping database, creating database and schema, clearing the cache'); $this ->runCommand('doctrine:database:drop', ['--force' => true]) @@ -188,13 +182,13 @@ class InstallCommand extends ContainerAwareCommand ->runCommand('cache:clear') ; - $this->defaultOutput->writeln(''); + $this->io->newLine(); return $this; } if (!$this->isDatabasePresent()) { - $this->defaultOutput->writeln('Creating database and schema, clearing the cache'); + $this->io->text('Creating database and schema, clearing the cache'); $this ->runCommand('doctrine:database:create') @@ -202,16 +196,13 @@ class InstallCommand extends ContainerAwareCommand ->runCommand('cache:clear') ; - $this->defaultOutput->writeln(''); + $this->io->newLine(); return $this; } - $questionHelper = $this->getHelper('question'); - $question = new ConfirmationQuestion('It appears that your database already exists. Would you like to reset it? (y/N)', false); - - if ($questionHelper->ask($this->defaultInput, $this->defaultOutput, $question)) { - $this->defaultOutput->writeln('Dropping database, creating database and schema'); + if ($this->io->confirm('It appears that your database already exists. Would you like to reset it?', false)) { + $this->io->text('Dropping database, creating database and schema...'); $this ->runCommand('doctrine:database:drop', ['--force' => true]) @@ -219,9 +210,8 @@ class InstallCommand extends ContainerAwareCommand ->runCommand('doctrine:schema:create') ; } elseif ($this->isSchemaPresent()) { - $question = new ConfirmationQuestion('Seems like your database contains schema. Do you want to reset it? (y/N)', false); - if ($questionHelper->ask($this->defaultInput, $this->defaultOutput, $question)) { - $this->defaultOutput->writeln('Dropping schema and creating schema'); + if ($this->io->confirm('Seems like your database contains schema. Do you want to reset it?', false)) { + $this->io->text('Dropping schema and creating schema...'); $this ->runCommand('doctrine:schema:drop', ['--force' => true]) @@ -229,29 +219,27 @@ class InstallCommand extends ContainerAwareCommand ; } } else { - $this->defaultOutput->writeln('Creating schema'); + $this->io->text('Creating schema...'); $this ->runCommand('doctrine:schema:create') ; } - $this->defaultOutput->writeln('Clearing the cache'); + $this->io->text('Clearing the cache...'); $this->runCommand('cache:clear'); - $this->defaultOutput->writeln(''); + $this->io->newLine(); + $this->io->text('Database successfully setup.'); return $this; } protected function setupAdmin() { - $this->defaultOutput->writeln('Step 3 of 5. Administration setup.'); - - $questionHelper = $this->getHelperSet()->get('question'); - $question = new ConfirmationQuestion('Would you like to create a new admin user (recommended) ? (Y/n)', true); + $this->io->section('Step 3 of 5: Administration setup.'); - if (!$questionHelper->ask($this->defaultInput, $this->defaultOutput, $question)) { + if (!$this->io->confirm('Would you like to create a new admin user (recommended)?', true)) { return $this; } @@ -260,14 +248,13 @@ class InstallCommand extends ContainerAwareCommand $userManager = $this->getContainer()->get('fos_user.user_manager'); $user = $userManager->createUser(); - $question = new Question('Username (default: wallabag) :', 'wallabag'); - $user->setUsername($questionHelper->ask($this->defaultInput, $this->defaultOutput, $question)); + $user->setUsername($this->io->ask('Username', 'wallabag')); - $question = new Question('Password (default: wallabag) :', 'wallabag'); - $user->setPlainPassword($questionHelper->ask($this->defaultInput, $this->defaultOutput, $question)); + $question = new Question('Password', 'wallabag'); + $question->setHidden(true); + $user->setPlainPassword($this->io->askQuestion($question)); - $question = new Question('Email:', ''); - $user->setEmail($questionHelper->ask($this->defaultInput, $this->defaultOutput, $question)); + $user->setEmail($this->io->ask('Email', '')); $user->setEnabled(true); $user->addRole('ROLE_SUPER_ADMIN'); @@ -278,14 +265,14 @@ class InstallCommand extends ContainerAwareCommand $event = new UserEvent($user); $this->getContainer()->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event); - $this->defaultOutput->writeln(''); + $this->io->text('Administration successfully setup.'); return $this; } protected function setupConfig() { - $this->defaultOutput->writeln('Step 4 of 5. Config setup.'); + $this->io->section('Step 4 of 5: Config setup.'); $em = $this->getContainer()->get('doctrine.orm.entity_manager'); // cleanup before insert new stuff @@ -301,18 +288,20 @@ class InstallCommand extends ContainerAwareCommand $em->flush(); - $this->defaultOutput->writeln(''); + $this->io->text('Config successfully setup.'); return $this; } protected function runMigrations() { - $this->defaultOutput->writeln('Step 5 of 5. Run migrations.'); + $this->io->section('Step 5 of 5: Run migrations.'); $this ->runCommand('doctrine:migrations:migrate', ['--no-interaction' => true]); + $this->io->text('Migrations successfully executed.'); + return $this; } diff --git a/src/Wallabag/CoreBundle/Command/ShowUserCommand.php b/src/Wallabag/CoreBundle/Command/ShowUserCommand.php index 090309d9..2dca32c4 100644 --- a/src/Wallabag/CoreBundle/Command/ShowUserCommand.php +++ b/src/Wallabag/CoreBundle/Command/ShowUserCommand.php @@ -52,11 +52,11 @@ class ShowUserCommand extends ContainerAwareCommand private function showUser(User $user) { $this->io->listing([ - sprintf('Username : %s', $user->getUsername()), - sprintf('Email : %s', $user->getEmail()), - sprintf('Display name : %s', $user->getName()), - sprintf('Creation date : %s', $user->getCreatedAt()->format('Y-m-d H:i:s')), - sprintf('Last login : %s', $user->getLastLogin() !== null ? $user->getLastLogin()->format('Y-m-d H:i:s') : 'never'), + sprintf('Username: %s', $user->getUsername()), + sprintf('Email: %s', $user->getEmail()), + sprintf('Display name: %s', $user->getName()), + sprintf('Creation date: %s', $user->getCreatedAt()->format('Y-m-d H:i:s')), + sprintf('Last login: %s', $user->getLastLogin() !== null ? $user->getLastLogin()->format('Y-m-d H:i:s') : 'never'), sprintf('2FA activated: %s', $user->isTwoFactorAuthentication() ? 'yes' : 'no'), ]); } diff --git a/src/Wallabag/CoreBundle/Command/TagAllCommand.php b/src/Wallabag/CoreBundle/Command/TagAllCommand.php index 9843674e..4afac2d4 100644 --- a/src/Wallabag/CoreBundle/Command/TagAllCommand.php +++ b/src/Wallabag/CoreBundle/Command/TagAllCommand.php @@ -7,6 +7,7 @@ use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; class TagAllCommand extends ContainerAwareCommand { @@ -25,21 +26,22 @@ class TagAllCommand extends ContainerAwareCommand protected function execute(InputInterface $input, OutputInterface $output) { + $io = new SymfonyStyle($input, $output); + try { $user = $this->getUser($input->getArgument('username')); } catch (NoResultException $e) { - $output->writeln(sprintf('User "%s" not found.', $input->getArgument('username'))); + $io->error(sprintf('User "%s" not found.', $input->getArgument('username'))); return 1; } $tagger = $this->getContainer()->get('wallabag_core.rule_based_tagger'); - $output->write(sprintf('Tagging entries for user « %s »... ', $user->getUserName())); + $io->text(sprintf('Tagging entries for user %s...', $user->getUserName())); $entries = $tagger->tagAllForUser($user); - $output->writeln('Done.'); - $output->write(sprintf('Persist entries ... ', $user->getUserName())); + $io->text('Persist entries... '); $em = $this->getDoctrine()->getManager(); foreach ($entries as $entry) { @@ -47,7 +49,9 @@ class TagAllCommand extends ContainerAwareCommand } $em->flush(); - $output->writeln('Done.'); + $io->success('Done.'); + + return 0; } /** diff --git a/tests/Wallabag/CoreBundle/Command/ExportCommandTest.php b/tests/Wallabag/CoreBundle/Command/ExportCommandTest.php index 25de2730..210b2ab6 100644 --- a/tests/Wallabag/CoreBundle/Command/ExportCommandTest.php +++ b/tests/Wallabag/CoreBundle/Command/ExportCommandTest.php @@ -55,7 +55,8 @@ class ExportCommandTest extends WallabagCoreTestCase 'username' => 'admin', ]); - $this->assertContains('Exporting 5 entrie(s) for user « admin »... Done', $tester->getDisplay()); + $this->assertContains('Exporting 5 entrie(s) for user admin...', $tester->getDisplay()); + $this->assertContains('Done', $tester->getDisplay()); $this->assertFileExists('admin-export.json'); } diff --git a/tests/Wallabag/CoreBundle/Command/ShowUserCommandTest.php b/tests/Wallabag/CoreBundle/Command/ShowUserCommandTest.php index c0a4acfa..9b34f2a0 100644 --- a/tests/Wallabag/CoreBundle/Command/ShowUserCommandTest.php +++ b/tests/Wallabag/CoreBundle/Command/ShowUserCommandTest.php @@ -56,9 +56,9 @@ class ShowUserCommandTest extends WallabagCoreTestCase 'username' => 'admin', ]); - $this->assertContains('Username : admin', $tester->getDisplay()); - $this->assertContains('Email : bigboss@wallabag.org', $tester->getDisplay()); - $this->assertContains('Display name : Big boss', $tester->getDisplay()); + $this->assertContains('Username: admin', $tester->getDisplay()); + $this->assertContains('Email: bigboss@wallabag.org', $tester->getDisplay()); + $this->assertContains('Display name: Big boss', $tester->getDisplay()); $this->assertContains('2FA activated: no', $tester->getDisplay()); } @@ -88,6 +88,6 @@ class ShowUserCommandTest extends WallabagCoreTestCase 'username' => 'admin', ]); - $this->assertContains('Display name : Bug boss', $tester->getDisplay()); + $this->assertContains('Display name: Bug boss', $tester->getDisplay()); } } diff --git a/tests/Wallabag/CoreBundle/Command/TagAllCommandTest.php b/tests/Wallabag/CoreBundle/Command/TagAllCommandTest.php index 96d0e91f..b1e56a10 100644 --- a/tests/Wallabag/CoreBundle/Command/TagAllCommandTest.php +++ b/tests/Wallabag/CoreBundle/Command/TagAllCommandTest.php @@ -55,6 +55,7 @@ class TagAllCommandTest extends WallabagCoreTestCase 'username' => 'admin', ]); - $this->assertContains('Tagging entries for user « admin »... Done', $tester->getDisplay()); + $this->assertContains('Tagging entries for user admin...', $tester->getDisplay()); + $this->assertContains('Done', $tester->getDisplay()); } }